Add local-first execution contracts to the capability language

This commit is contained in:
Timothy J. Aveni
2026-09-19 22:09:40 -07:00
parent 757531bb63
commit 03ac7f8557
24 changed files with 3872 additions and 2760 deletions
File diff suppressed because one or more lines are too long
@@ -1,261 +1,279 @@
WORKSPACE=1
RESULT_BYTES=2
RPC_CALLS=3
DEADLINE_MS=4
QUERY=5
REFLECTION=6
SPECIALIZE=7
ROOT=8
DOCUMENT=9
FRAGMENTS=10
VIEW=11
MAX=12
ALLOW=13
POLL=14
QUERYABLE=15
RPC=16
QUERY_REASON=17
TYPE=18
OBJECT=19
STORABLE=20
IMPLEMENTS=21
REF=22
FRAGMENT=23
IMPORT=24
EXTERNAL=25
ATOM=26
INTERFACE=27
INTERFACES=28
PACKAGE=29
VALUE=30
RELATION=31
OPERATION=32
FUNCTION=33
CONSTRUCTOR=34
CONSTRUCTS=35
INPUT=36
CONFORM=37
AS=38
BIND=39
STATIC=40
TO=41
PRIVATE=42
SHARED=43
STATE=44
EDGE=45
PROJECTION=46
WITH=47
USING=48
VIA=49
MATERIALIZE=50
IF=51
ABSENT=52
ON=53
POLICY=54
DEFAULT=55
SOURCE=56
REPOSITORY=57
COMMIT=58
REVISION=59
SEMANTIC_MAJOR=60
ON_DELETE=61
RETAIN_OTHER=62
KEYED=63
PUBLIC_TRAVERSAL=64
ID=65
DOC=66
MODE=67
EMITS=68
RECEIVER=69
REQUIRES=70
ANY=71
GET=72
SET=73
WATCH=74
START=75
STOP=76
READ=77
WRITE=78
RESOLVE=79
CONNECT=80
DISCONNECT=81
CALL=82
WATCH_START=83
WATCH_STOP=84
SUBSCRIBE=85
UNSUBSCRIBE=86
OPTIMISTIC_REGISTER=87
CRDT=88
OPTIONAL_ONE=89
EXACTLY_ONE=90
MANY_UNIQUE=91
MANY=92
ORDERED=93
UNIT=94
WATCH_HANDLE=95
MESSAGE=96
ATOM_REF=97
INTERFACE_REF=98
OPTIONAL=99
LIST=100
RECORD=101
BOOL=102
BYTES=103
DOUBLE=104
INT32=105
INT64=106
STRING=107
UINT32=108
UINT64=109
TRUE=110
FALSE=111
NULL=112
ARROW=113
COLON=114
SEMI=115
COMMA=116
DOT=117
LBRACE=118
RBRACE=119
LBRACK=120
RBRACK=121
LPAREN=122
RPAREN=123
LT=124
GT=125
AMP=126
EQUAL=127
INTEGER=128
JSON_NUMBER=129
IDENTIFIER=130
STRING_LITERAL=131
LINE_COMMENT=132
BLOCK_COMMENT=133
WS=134
EXECUTION=2
SNAPSHOT=3
TRANSACTION=4
REMOTE=5
TARGETS=6
PORTABLE=7
REPLICA=8
LOCAL=9
FROM=10
RESULT_BYTES=11
RPC_CALLS=12
DEADLINE_MS=13
QUERY=14
REFLECTION=15
SPECIALIZE=16
ROOT=17
DOCUMENT=18
FRAGMENTS=19
VIEW=20
MAX=21
ALLOW=22
POLL=23
QUERYABLE=24
RPC=25
QUERY_REASON=26
TYPE=27
OBJECT=28
STORABLE=29
IMPLEMENTS=30
REF=31
FRAGMENT=32
IMPORT=33
EXTERNAL=34
ATOM=35
INTERFACE=36
INTERFACES=37
PACKAGE=38
VALUE=39
RELATION=40
OPERATION=41
FUNCTION=42
CONSTRUCTOR=43
CONSTRUCTS=44
INPUT=45
CONFORM=46
AS=47
BIND=48
STATIC=49
TO=50
PRIVATE=51
SHARED=52
STATE=53
EDGE=54
PROJECTION=55
WITH=56
USING=57
VIA=58
MATERIALIZE=59
IF=60
ABSENT=61
ON=62
POLICY=63
DEFAULT=64
SOURCE=65
REPOSITORY=66
COMMIT=67
REVISION=68
SEMANTIC_MAJOR=69
ON_DELETE=70
RETAIN_OTHER=71
KEYED=72
PUBLIC_TRAVERSAL=73
ID=74
DOC=75
MODE=76
EMITS=77
RECEIVER=78
REQUIRES=79
ANY=80
GET=81
SET=82
WATCH=83
START=84
STOP=85
READ=86
WRITE=87
RESOLVE=88
CONNECT=89
DISCONNECT=90
CALL=91
WATCH_START=92
WATCH_STOP=93
SUBSCRIBE=94
UNSUBSCRIBE=95
OPTIMISTIC_REGISTER=96
CRDT=97
OPTIONAL_ONE=98
EXACTLY_ONE=99
MANY_UNIQUE=100
MANY=101
ORDERED=102
UNIT=103
WATCH_HANDLE=104
MESSAGE=105
ATOM_REF=106
INTERFACE_REF=107
OPTIONAL=108
LIST=109
RECORD=110
BOOL=111
BYTES=112
DOUBLE=113
INT32=114
INT64=115
STRING=116
UINT32=117
UINT64=118
TRUE=119
FALSE=120
NULL=121
ARROW=122
COLON=123
SEMI=124
COMMA=125
DOT=126
LBRACE=127
RBRACE=128
LBRACK=129
RBRACK=130
LPAREN=131
RPAREN=132
LT=133
GT=134
AMP=135
EQUAL=136
INTEGER=137
JSON_NUMBER=138
IDENTIFIER=139
STRING_LITERAL=140
LINE_COMMENT=141
BLOCK_COMMENT=142
WS=143
'workspace'=1
'result-bytes'=2
'rpc-calls'=3
'deadline-ms'=4
'query'=5
'reflection'=6
'specialize'=7
'root'=8
'document'=9
'fragments'=10
'view'=11
'max'=12
'allow'=13
'poll'=14
'queryable'=15
'rpc'=16
'query-reason'=17
'type'=18
'object'=19
'storable'=20
'implements'=21
'ref'=22
'fragment'=23
'import'=24
'external'=25
'atom'=26
'interface'=27
'interfaces'=28
'package'=29
'value'=30
'relation'=31
'operation'=32
'function'=33
'constructor'=34
'constructs'=35
'input'=36
'conform'=37
'as'=38
'bind'=39
'static'=40
'to'=41
'private'=42
'shared'=43
'state'=44
'edge'=45
'projection'=46
'with'=47
'using'=48
'via'=49
'materialize'=50
'if'=51
'absent'=52
'on'=53
'policy'=54
'default'=55
'source'=56
'repository'=57
'commit'=58
'revision'=59
'semantic-major'=60
'on-delete'=61
'retain-other'=62
'keyed'=63
'public-traversal'=64
'id'=65
'doc'=66
'mode'=67
'emits'=68
'receiver'=69
'requires'=70
'any'=71
'get'=72
'set'=73
'watch'=74
'start'=75
'stop'=76
'read'=77
'write'=78
'resolve'=79
'connect'=80
'disconnect'=81
'call'=82
'watch-start'=83
'watch-stop'=84
'subscribe'=85
'unsubscribe'=86
'optimistic-register'=87
'crdt'=88
'optional-one'=89
'exactly-one'=90
'many-unique'=91
'many'=92
'ordered'=93
'unit'=94
'watch-handle'=95
'message'=96
'atom-ref'=97
'interface-ref'=98
'optional'=99
'list'=100
'record'=101
'bool'=102
'bytes'=103
'double'=104
'int32'=105
'int64'=106
'string'=107
'uint32'=108
'uint64'=109
'true'=110
'false'=111
'null'=112
'->'=113
':'=114
';'=115
','=116
'.'=117
'{'=118
'}'=119
'['=120
']'=121
'('=122
')'=123
'<'=124
'>'=125
'&'=126
'='=127
'execution'=2
'snapshot'=3
'transaction'=4
'remote'=5
'targets'=6
'portable'=7
'replica'=8
'local'=9
'from'=10
'result-bytes'=11
'rpc-calls'=12
'deadline-ms'=13
'query'=14
'reflection'=15
'specialize'=16
'root'=17
'document'=18
'fragments'=19
'view'=20
'max'=21
'allow'=22
'poll'=23
'queryable'=24
'rpc'=25
'query-reason'=26
'type'=27
'object'=28
'storable'=29
'implements'=30
'ref'=31
'fragment'=32
'import'=33
'external'=34
'atom'=35
'interface'=36
'interfaces'=37
'package'=38
'value'=39
'relation'=40
'operation'=41
'function'=42
'constructor'=43
'constructs'=44
'input'=45
'conform'=46
'as'=47
'bind'=48
'static'=49
'to'=50
'private'=51
'shared'=52
'state'=53
'edge'=54
'projection'=55
'with'=56
'using'=57
'via'=58
'materialize'=59
'if'=60
'absent'=61
'on'=62
'policy'=63
'default'=64
'source'=65
'repository'=66
'commit'=67
'revision'=68
'semantic-major'=69
'on-delete'=70
'retain-other'=71
'keyed'=72
'public-traversal'=73
'id'=74
'doc'=75
'mode'=76
'emits'=77
'receiver'=78
'requires'=79
'any'=80
'get'=81
'set'=82
'watch'=83
'start'=84
'stop'=85
'read'=86
'write'=87
'resolve'=88
'connect'=89
'disconnect'=90
'call'=91
'watch-start'=92
'watch-stop'=93
'subscribe'=94
'unsubscribe'=95
'optimistic-register'=96
'crdt'=97
'optional-one'=98
'exactly-one'=99
'many-unique'=100
'many'=101
'ordered'=102
'unit'=103
'watch-handle'=104
'message'=105
'atom-ref'=106
'interface-ref'=107
'optional'=108
'list'=109
'record'=110
'bool'=111
'bytes'=112
'double'=113
'int32'=114
'int64'=115
'string'=116
'uint32'=117
'uint64'=118
'true'=119
'false'=120
'null'=121
'->'=122
':'=123
';'=124
','=125
'.'=126
'{'=127
'}'=128
'['=129
']'=130
'('=131
')'=132
'<'=133
'>'=134
'&'=135
'='=136
File diff suppressed because one or more lines are too long
@@ -1,261 +1,279 @@
WORKSPACE=1
RESULT_BYTES=2
RPC_CALLS=3
DEADLINE_MS=4
QUERY=5
REFLECTION=6
SPECIALIZE=7
ROOT=8
DOCUMENT=9
FRAGMENTS=10
VIEW=11
MAX=12
ALLOW=13
POLL=14
QUERYABLE=15
RPC=16
QUERY_REASON=17
TYPE=18
OBJECT=19
STORABLE=20
IMPLEMENTS=21
REF=22
FRAGMENT=23
IMPORT=24
EXTERNAL=25
ATOM=26
INTERFACE=27
INTERFACES=28
PACKAGE=29
VALUE=30
RELATION=31
OPERATION=32
FUNCTION=33
CONSTRUCTOR=34
CONSTRUCTS=35
INPUT=36
CONFORM=37
AS=38
BIND=39
STATIC=40
TO=41
PRIVATE=42
SHARED=43
STATE=44
EDGE=45
PROJECTION=46
WITH=47
USING=48
VIA=49
MATERIALIZE=50
IF=51
ABSENT=52
ON=53
POLICY=54
DEFAULT=55
SOURCE=56
REPOSITORY=57
COMMIT=58
REVISION=59
SEMANTIC_MAJOR=60
ON_DELETE=61
RETAIN_OTHER=62
KEYED=63
PUBLIC_TRAVERSAL=64
ID=65
DOC=66
MODE=67
EMITS=68
RECEIVER=69
REQUIRES=70
ANY=71
GET=72
SET=73
WATCH=74
START=75
STOP=76
READ=77
WRITE=78
RESOLVE=79
CONNECT=80
DISCONNECT=81
CALL=82
WATCH_START=83
WATCH_STOP=84
SUBSCRIBE=85
UNSUBSCRIBE=86
OPTIMISTIC_REGISTER=87
CRDT=88
OPTIONAL_ONE=89
EXACTLY_ONE=90
MANY_UNIQUE=91
MANY=92
ORDERED=93
UNIT=94
WATCH_HANDLE=95
MESSAGE=96
ATOM_REF=97
INTERFACE_REF=98
OPTIONAL=99
LIST=100
RECORD=101
BOOL=102
BYTES=103
DOUBLE=104
INT32=105
INT64=106
STRING=107
UINT32=108
UINT64=109
TRUE=110
FALSE=111
NULL=112
ARROW=113
COLON=114
SEMI=115
COMMA=116
DOT=117
LBRACE=118
RBRACE=119
LBRACK=120
RBRACK=121
LPAREN=122
RPAREN=123
LT=124
GT=125
AMP=126
EQUAL=127
INTEGER=128
JSON_NUMBER=129
IDENTIFIER=130
STRING_LITERAL=131
LINE_COMMENT=132
BLOCK_COMMENT=133
WS=134
EXECUTION=2
SNAPSHOT=3
TRANSACTION=4
REMOTE=5
TARGETS=6
PORTABLE=7
REPLICA=8
LOCAL=9
FROM=10
RESULT_BYTES=11
RPC_CALLS=12
DEADLINE_MS=13
QUERY=14
REFLECTION=15
SPECIALIZE=16
ROOT=17
DOCUMENT=18
FRAGMENTS=19
VIEW=20
MAX=21
ALLOW=22
POLL=23
QUERYABLE=24
RPC=25
QUERY_REASON=26
TYPE=27
OBJECT=28
STORABLE=29
IMPLEMENTS=30
REF=31
FRAGMENT=32
IMPORT=33
EXTERNAL=34
ATOM=35
INTERFACE=36
INTERFACES=37
PACKAGE=38
VALUE=39
RELATION=40
OPERATION=41
FUNCTION=42
CONSTRUCTOR=43
CONSTRUCTS=44
INPUT=45
CONFORM=46
AS=47
BIND=48
STATIC=49
TO=50
PRIVATE=51
SHARED=52
STATE=53
EDGE=54
PROJECTION=55
WITH=56
USING=57
VIA=58
MATERIALIZE=59
IF=60
ABSENT=61
ON=62
POLICY=63
DEFAULT=64
SOURCE=65
REPOSITORY=66
COMMIT=67
REVISION=68
SEMANTIC_MAJOR=69
ON_DELETE=70
RETAIN_OTHER=71
KEYED=72
PUBLIC_TRAVERSAL=73
ID=74
DOC=75
MODE=76
EMITS=77
RECEIVER=78
REQUIRES=79
ANY=80
GET=81
SET=82
WATCH=83
START=84
STOP=85
READ=86
WRITE=87
RESOLVE=88
CONNECT=89
DISCONNECT=90
CALL=91
WATCH_START=92
WATCH_STOP=93
SUBSCRIBE=94
UNSUBSCRIBE=95
OPTIMISTIC_REGISTER=96
CRDT=97
OPTIONAL_ONE=98
EXACTLY_ONE=99
MANY_UNIQUE=100
MANY=101
ORDERED=102
UNIT=103
WATCH_HANDLE=104
MESSAGE=105
ATOM_REF=106
INTERFACE_REF=107
OPTIONAL=108
LIST=109
RECORD=110
BOOL=111
BYTES=112
DOUBLE=113
INT32=114
INT64=115
STRING=116
UINT32=117
UINT64=118
TRUE=119
FALSE=120
NULL=121
ARROW=122
COLON=123
SEMI=124
COMMA=125
DOT=126
LBRACE=127
RBRACE=128
LBRACK=129
RBRACK=130
LPAREN=131
RPAREN=132
LT=133
GT=134
AMP=135
EQUAL=136
INTEGER=137
JSON_NUMBER=138
IDENTIFIER=139
STRING_LITERAL=140
LINE_COMMENT=141
BLOCK_COMMENT=142
WS=143
'workspace'=1
'result-bytes'=2
'rpc-calls'=3
'deadline-ms'=4
'query'=5
'reflection'=6
'specialize'=7
'root'=8
'document'=9
'fragments'=10
'view'=11
'max'=12
'allow'=13
'poll'=14
'queryable'=15
'rpc'=16
'query-reason'=17
'type'=18
'object'=19
'storable'=20
'implements'=21
'ref'=22
'fragment'=23
'import'=24
'external'=25
'atom'=26
'interface'=27
'interfaces'=28
'package'=29
'value'=30
'relation'=31
'operation'=32
'function'=33
'constructor'=34
'constructs'=35
'input'=36
'conform'=37
'as'=38
'bind'=39
'static'=40
'to'=41
'private'=42
'shared'=43
'state'=44
'edge'=45
'projection'=46
'with'=47
'using'=48
'via'=49
'materialize'=50
'if'=51
'absent'=52
'on'=53
'policy'=54
'default'=55
'source'=56
'repository'=57
'commit'=58
'revision'=59
'semantic-major'=60
'on-delete'=61
'retain-other'=62
'keyed'=63
'public-traversal'=64
'id'=65
'doc'=66
'mode'=67
'emits'=68
'receiver'=69
'requires'=70
'any'=71
'get'=72
'set'=73
'watch'=74
'start'=75
'stop'=76
'read'=77
'write'=78
'resolve'=79
'connect'=80
'disconnect'=81
'call'=82
'watch-start'=83
'watch-stop'=84
'subscribe'=85
'unsubscribe'=86
'optimistic-register'=87
'crdt'=88
'optional-one'=89
'exactly-one'=90
'many-unique'=91
'many'=92
'ordered'=93
'unit'=94
'watch-handle'=95
'message'=96
'atom-ref'=97
'interface-ref'=98
'optional'=99
'list'=100
'record'=101
'bool'=102
'bytes'=103
'double'=104
'int32'=105
'int64'=106
'string'=107
'uint32'=108
'uint64'=109
'true'=110
'false'=111
'null'=112
'->'=113
':'=114
';'=115
','=116
'.'=117
'{'=118
'}'=119
'['=120
']'=121
'('=122
')'=123
'<'=124
'>'=125
'&'=126
'='=127
'execution'=2
'snapshot'=3
'transaction'=4
'remote'=5
'targets'=6
'portable'=7
'replica'=8
'local'=9
'from'=10
'result-bytes'=11
'rpc-calls'=12
'deadline-ms'=13
'query'=14
'reflection'=15
'specialize'=16
'root'=17
'document'=18
'fragments'=19
'view'=20
'max'=21
'allow'=22
'poll'=23
'queryable'=24
'rpc'=25
'query-reason'=26
'type'=27
'object'=28
'storable'=29
'implements'=30
'ref'=31
'fragment'=32
'import'=33
'external'=34
'atom'=35
'interface'=36
'interfaces'=37
'package'=38
'value'=39
'relation'=40
'operation'=41
'function'=42
'constructor'=43
'constructs'=44
'input'=45
'conform'=46
'as'=47
'bind'=48
'static'=49
'to'=50
'private'=51
'shared'=52
'state'=53
'edge'=54
'projection'=55
'with'=56
'using'=57
'via'=58
'materialize'=59
'if'=60
'absent'=61
'on'=62
'policy'=63
'default'=64
'source'=65
'repository'=66
'commit'=67
'revision'=68
'semantic-major'=69
'on-delete'=70
'retain-other'=71
'keyed'=72
'public-traversal'=73
'id'=74
'doc'=75
'mode'=76
'emits'=77
'receiver'=78
'requires'=79
'any'=80
'get'=81
'set'=82
'watch'=83
'start'=84
'stop'=85
'read'=86
'write'=87
'resolve'=88
'connect'=89
'disconnect'=90
'call'=91
'watch-start'=92
'watch-stop'=93
'subscribe'=94
'unsubscribe'=95
'optimistic-register'=96
'crdt'=97
'optional-one'=98
'exactly-one'=99
'many-unique'=100
'many'=101
'ordered'=102
'unit'=103
'watch-handle'=104
'message'=105
'atom-ref'=106
'interface-ref'=107
'optional'=108
'list'=109
'record'=110
'bool'=111
'bytes'=112
'double'=113
'int32'=114
'int64'=115
'string'=116
'uint32'=117
'uint64'=118
'true'=119
'false'=120
'null'=121
'->'=122
':'=123
';'=124
','=125
'.'=126
'{'=127
'}'=128
'['=129
']'=130
'('=131
')'=132
'<'=133
'>'=134
'&'=135
'='=136
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -34,6 +34,8 @@ import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js";
import { QueryClauseContext } from "./QuixosCapabilityParser.js";
import { PackageOperationExportContext } from "./QuixosCapabilityParser.js";
import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js";
import { ExecutionClauseContext } from "./QuixosCapabilityParser.js";
import { SelectedOperationsContext } from "./QuixosCapabilityParser.js";
import { PackageConstructorExportContext } from "./QuixosCapabilityParser.js";
import { EventClauseContext } from "./QuixosCapabilityParser.js";
import { OperationModeContext } from "./QuixosCapabilityParser.js";
@@ -274,6 +276,18 @@ export class QuixosCapabilityVisitor<Result> extends AbstractParseTreeVisitor<Re
* @return the visitor result
*/
visitPackageFunctionExport?: (ctx: PackageFunctionExportContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.executionClause`.
* @param ctx the parse tree
* @return the visitor result
*/
visitExecutionClause?: (ctx: ExecutionClauseContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.selectedOperations`.
* @param ctx the parse tree
* @return the visitor result
*/
visitSelectedOperations?: (ctx: SelectedOperationsContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageConstructorExport`.
* @param ctx the parse tree