Compare commits

..

3 Commits

Author SHA1 Message Date
Quixos Subtree Publisher fd6160ec67 Publish quixos-protocol from 3ea7dcc6a38ba0c5ddc099b966d48c5aeae732b1 2026-09-05 04:04:43 +00:00
timothy fd039f095b Introduce persisted Web Studio component capabilities 2026-09-04 21:04:43 -07:00
timothy f4987093f6 Introduce repository-backed capability workspaces
- define and validate the capability and resource-lock languages
- provision workspace source repositories through Central Gitea
- build package runtimes from pinned standalone sources
- replace legacy schema compilation with workspace persistence plans
- add stable optimistic registers and Automerge CRDT documents
- modernize TypeScript/Nix package builds and runtime activation readiness
2026-09-04 19:08:10 -07:00
18 changed files with 2460 additions and 1610 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"version": 1, "version": 1,
"sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git", "sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git",
"sourceCommit": "4af89fa7c703d9fecf36b4e97b76658a503dd5aa", "sourceCommit": "3ea7dcc6a38ba0c5ddc099b966d48c5aeae732b1",
"sourcePath": "quixos-protocol", "sourcePath": "quixos-protocol",
"exportName": "quixos-protocol", "exportName": "quixos-protocol",
"mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git" "mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git"
+12 -2
View File
@@ -180,6 +180,11 @@ conformanceDecl
conformanceItem conformanceItem
: PRIVATE attachmentDecl : PRIVATE attachmentDecl
| operationBindingDecl | operationBindingDecl
| relationshipMaterializationDecl
;
relationshipMaterializationDecl
: MATERIALIZE identifier IF ABSENT USING CONSTRUCTOR identifier VIA EDGE identifier DOT identifier SEMI
; ;
operationBindingDecl operationBindingDecl
@@ -230,8 +235,8 @@ dependencyBindingBlock
; ;
dependencyBinding dependencyBinding
: identifier TO STATE identifier SEMI : identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI
| identifier TO EDGE identifier DOT identifier SEMI | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI
| identifier TO INTERFACE identifier SEMI | identifier TO INTERFACE identifier SEMI
| identifier TO CONSTRUCTOR identifier SEMI | identifier TO CONSTRUCTOR identifier SEMI
; ;
@@ -322,6 +327,11 @@ STATE: 'state';
EDGE: 'edge'; EDGE: 'edge';
PROJECTION: 'projection'; PROJECTION: 'projection';
WITH: 'with'; WITH: 'with';
USING: 'using';
VIA: 'via';
MATERIALIZE: 'materialize';
IF: 'if';
ABSENT: 'absent';
ON: 'on'; ON: 'on';
POLICY: 'policy'; POLICY: 'policy';
DEFAULT: 'default'; DEFAULT: 'default';
+11
View File
@@ -11,6 +11,7 @@ service OrchestratorRuntime {
rpc InvokeCapability(InvokeCapabilityRequest) returns (InvokeCapabilityResponse); rpc InvokeCapability(InvokeCapabilityRequest) returns (InvokeCapabilityResponse);
rpc WatchCapability(WatchCapabilityRequest) returns (stream WatchCapabilityEvent); rpc WatchCapability(WatchCapabilityRequest) returns (stream WatchCapabilityEvent);
rpc ConstructObject(ConstructObjectRequest) returns (ConstructObjectResponse); rpc ConstructObject(ConstructObjectRequest) returns (ConstructObjectResponse);
rpc ResolveOrConstructRelatedObject(ResolveOrConstructRelatedObjectRequest) returns (ResolveOrConstructRelatedObjectResponse);
rpc GetWorkspace(GetWorkspaceRequest) returns (GetWorkspaceResponse); rpc GetWorkspace(GetWorkspaceRequest) returns (GetWorkspaceResponse);
rpc ListPackageDescriptors(ListPackageDescriptorsRequest) returns (ListPackageDescriptorsResponse); rpc ListPackageDescriptors(ListPackageDescriptorsRequest) returns (ListPackageDescriptorsResponse);
rpc ListPackageRuntimes(ListPackageRuntimesRequest) returns (ListPackageRuntimesResponse); rpc ListPackageRuntimes(ListPackageRuntimesRequest) returns (ListPackageRuntimesResponse);
@@ -24,6 +25,16 @@ message ConstructObjectRequest {
} }
message ConstructObjectResponse { camino.CaminoObject object = 1; } message ConstructObjectResponse { camino.CaminoObject object = 1; }
message ResolveOrConstructRelatedObjectRequest {
string object_id = 1;
string interface_revision_id = 2;
string member_id = 3;
}
message ResolveOrConstructRelatedObjectResponse {
camino.CaminoObject object = 1;
bool constructed = 2;
}
message InvokeCapabilityRequest { message InvokeCapabilityRequest {
quixos.CapabilityRef capability = 1; quixos.CapabilityRef capability = 1;
string object_id = 2; string object_id = 2;
+3
View File
@@ -20,6 +20,9 @@ message InjectedDependency {
string receiver_interface_revision_id = 4; string receiver_interface_revision_id = 4;
string constructor_atom_id = 5; string constructor_atom_id = 5;
} }
// Defaults to the invocation receiver. A checked dependency traversal can
// select a related object explicitly before the package runtime starts.
string object_id = 6;
} }
message EdgeDependency { message EdgeDependency {
File diff suppressed because one or more lines are too long
@@ -19,80 +19,85 @@ STATE=18
EDGE=19 EDGE=19
PROJECTION=20 PROJECTION=20
WITH=21 WITH=21
ON=22 USING=22
POLICY=23 VIA=23
DEFAULT=24 MATERIALIZE=24
SOURCE=25 IF=25
REPOSITORY=26 ABSENT=26
COMMIT=27 ON=27
REVISION=28 POLICY=28
ID=29 DEFAULT=29
DOC=30 SOURCE=30
MODE=31 REPOSITORY=31
EMITS=32 COMMIT=32
RECEIVER=33 REVISION=33
REQUIRES=34 ID=34
ANY=35 DOC=35
GET=36 MODE=36
SET=37 EMITS=37
WATCH=38 RECEIVER=38
START=39 REQUIRES=39
STOP=40 ANY=40
READ=41 GET=41
WRITE=42 SET=42
RESOLVE=43 WATCH=43
CONNECT=44 START=44
DISCONNECT=45 STOP=45
CALL=46 READ=46
WATCH_START=47 WRITE=47
WATCH_STOP=48 RESOLVE=48
SUBSCRIBE=49 CONNECT=49
UNSUBSCRIBE=50 DISCONNECT=50
OPTIMISTIC_REGISTER=51 CALL=51
CRDT=52 WATCH_START=52
OPTIONAL_ONE=53 WATCH_STOP=53
EXACTLY_ONE=54 SUBSCRIBE=54
MANY_UNIQUE=55 UNSUBSCRIBE=55
MANY=56 OPTIMISTIC_REGISTER=56
ORDERED=57 CRDT=57
UNIT=58 OPTIONAL_ONE=58
WATCH_HANDLE=59 EXACTLY_ONE=59
MESSAGE=60 MANY_UNIQUE=60
ATOM_REF=61 MANY=61
INTERFACE_REF=62 ORDERED=62
OPTIONAL=63 UNIT=63
LIST=64 WATCH_HANDLE=64
BOOL=65 MESSAGE=65
BYTES=66 ATOM_REF=66
DOUBLE=67 INTERFACE_REF=67
INT32=68 OPTIONAL=68
INT64=69 LIST=69
STRING=70 BOOL=70
UINT32=71 BYTES=71
UINT64=72 DOUBLE=72
TRUE=73 INT32=73
FALSE=74 INT64=74
NULL=75 STRING=75
ARROW=76 UINT32=76
COLON=77 UINT64=77
SEMI=78 TRUE=78
COMMA=79 FALSE=79
DOT=80 NULL=80
LBRACE=81 ARROW=81
RBRACE=82 COLON=82
LBRACK=83 SEMI=83
RBRACK=84 COMMA=84
LPAREN=85 DOT=85
RPAREN=86 LBRACE=86
LT=87 RBRACE=87
GT=88 LBRACK=88
INTEGER=89 RBRACK=89
JSON_NUMBER=90 LPAREN=90
IDENTIFIER=91 RPAREN=91
STRING_LITERAL=92 LT=92
LINE_COMMENT=93 GT=93
BLOCK_COMMENT=94 INTEGER=94
WS=95 JSON_NUMBER=95
IDENTIFIER=96
STRING_LITERAL=97
LINE_COMMENT=98
BLOCK_COMMENT=99
WS=100
'workspace'=1 'workspace'=1
'atom'=2 'atom'=2
'interface'=3 'interface'=3
@@ -114,70 +119,75 @@ WS=95
'edge'=19 'edge'=19
'projection'=20 'projection'=20
'with'=21 'with'=21
'on'=22 'using'=22
'policy'=23 'via'=23
'default'=24 'materialize'=24
'source'=25 'if'=25
'repository'=26 'absent'=26
'commit'=27 'on'=27
'revision'=28 'policy'=28
'id'=29 'default'=29
'doc'=30 'source'=30
'mode'=31 'repository'=31
'emits'=32 'commit'=32
'receiver'=33 'revision'=33
'requires'=34 'id'=34
'any'=35 'doc'=35
'get'=36 'mode'=36
'set'=37 'emits'=37
'watch'=38 'receiver'=38
'start'=39 'requires'=39
'stop'=40 'any'=40
'read'=41 'get'=41
'write'=42 'set'=42
'resolve'=43 'watch'=43
'connect'=44 'start'=44
'disconnect'=45 'stop'=45
'call'=46 'read'=46
'watch-start'=47 'write'=47
'watch-stop'=48 'resolve'=48
'subscribe'=49 'connect'=49
'unsubscribe'=50 'disconnect'=50
'optimistic-register'=51 'call'=51
'crdt'=52 'watch-start'=52
'optional-one'=53 'watch-stop'=53
'exactly-one'=54 'subscribe'=54
'many-unique'=55 'unsubscribe'=55
'many'=56 'optimistic-register'=56
'ordered'=57 'crdt'=57
'unit'=58 'optional-one'=58
'watch-handle'=59 'exactly-one'=59
'message'=60 'many-unique'=60
'atom-ref'=61 'many'=61
'interface-ref'=62 'ordered'=62
'optional'=63 'unit'=63
'list'=64 'watch-handle'=64
'bool'=65 'message'=65
'bytes'=66 'atom-ref'=66
'double'=67 'interface-ref'=67
'int32'=68 'optional'=68
'int64'=69 'list'=69
'string'=70 'bool'=70
'uint32'=71 'bytes'=71
'uint64'=72 'double'=72
'true'=73 'int32'=73
'false'=74 'int64'=74
'null'=75 'string'=75
'->'=76 'uint32'=76
':'=77 'uint64'=77
';'=78 'true'=78
','=79 'false'=79
'.'=80 'null'=80
'{'=81 '->'=81
'}'=82 ':'=82
'['=83 ';'=83
']'=84 ','=84
'('=85 '.'=85
')'=86 '{'=86
'<'=87 '}'=87
'>'=88 '['=88
']'=89
'('=90
')'=91
'<'=92
'>'=93
File diff suppressed because one or more lines are too long
@@ -19,80 +19,85 @@ STATE=18
EDGE=19 EDGE=19
PROJECTION=20 PROJECTION=20
WITH=21 WITH=21
ON=22 USING=22
POLICY=23 VIA=23
DEFAULT=24 MATERIALIZE=24
SOURCE=25 IF=25
REPOSITORY=26 ABSENT=26
COMMIT=27 ON=27
REVISION=28 POLICY=28
ID=29 DEFAULT=29
DOC=30 SOURCE=30
MODE=31 REPOSITORY=31
EMITS=32 COMMIT=32
RECEIVER=33 REVISION=33
REQUIRES=34 ID=34
ANY=35 DOC=35
GET=36 MODE=36
SET=37 EMITS=37
WATCH=38 RECEIVER=38
START=39 REQUIRES=39
STOP=40 ANY=40
READ=41 GET=41
WRITE=42 SET=42
RESOLVE=43 WATCH=43
CONNECT=44 START=44
DISCONNECT=45 STOP=45
CALL=46 READ=46
WATCH_START=47 WRITE=47
WATCH_STOP=48 RESOLVE=48
SUBSCRIBE=49 CONNECT=49
UNSUBSCRIBE=50 DISCONNECT=50
OPTIMISTIC_REGISTER=51 CALL=51
CRDT=52 WATCH_START=52
OPTIONAL_ONE=53 WATCH_STOP=53
EXACTLY_ONE=54 SUBSCRIBE=54
MANY_UNIQUE=55 UNSUBSCRIBE=55
MANY=56 OPTIMISTIC_REGISTER=56
ORDERED=57 CRDT=57
UNIT=58 OPTIONAL_ONE=58
WATCH_HANDLE=59 EXACTLY_ONE=59
MESSAGE=60 MANY_UNIQUE=60
ATOM_REF=61 MANY=61
INTERFACE_REF=62 ORDERED=62
OPTIONAL=63 UNIT=63
LIST=64 WATCH_HANDLE=64
BOOL=65 MESSAGE=65
BYTES=66 ATOM_REF=66
DOUBLE=67 INTERFACE_REF=67
INT32=68 OPTIONAL=68
INT64=69 LIST=69
STRING=70 BOOL=70
UINT32=71 BYTES=71
UINT64=72 DOUBLE=72
TRUE=73 INT32=73
FALSE=74 INT64=74
NULL=75 STRING=75
ARROW=76 UINT32=76
COLON=77 UINT64=77
SEMI=78 TRUE=78
COMMA=79 FALSE=79
DOT=80 NULL=80
LBRACE=81 ARROW=81
RBRACE=82 COLON=82
LBRACK=83 SEMI=83
RBRACK=84 COMMA=84
LPAREN=85 DOT=85
RPAREN=86 LBRACE=86
LT=87 RBRACE=87
GT=88 LBRACK=88
INTEGER=89 RBRACK=89
JSON_NUMBER=90 LPAREN=90
IDENTIFIER=91 RPAREN=91
STRING_LITERAL=92 LT=92
LINE_COMMENT=93 GT=93
BLOCK_COMMENT=94 INTEGER=94
WS=95 JSON_NUMBER=95
IDENTIFIER=96
STRING_LITERAL=97
LINE_COMMENT=98
BLOCK_COMMENT=99
WS=100
'workspace'=1 'workspace'=1
'atom'=2 'atom'=2
'interface'=3 'interface'=3
@@ -114,70 +119,75 @@ WS=95
'edge'=19 'edge'=19
'projection'=20 'projection'=20
'with'=21 'with'=21
'on'=22 'using'=22
'policy'=23 'via'=23
'default'=24 'materialize'=24
'source'=25 'if'=25
'repository'=26 'absent'=26
'commit'=27 'on'=27
'revision'=28 'policy'=28
'id'=29 'default'=29
'doc'=30 'source'=30
'mode'=31 'repository'=31
'emits'=32 'commit'=32
'receiver'=33 'revision'=33
'requires'=34 'id'=34
'any'=35 'doc'=35
'get'=36 'mode'=36
'set'=37 'emits'=37
'watch'=38 'receiver'=38
'start'=39 'requires'=39
'stop'=40 'any'=40
'read'=41 'get'=41
'write'=42 'set'=42
'resolve'=43 'watch'=43
'connect'=44 'start'=44
'disconnect'=45 'stop'=45
'call'=46 'read'=46
'watch-start'=47 'write'=47
'watch-stop'=48 'resolve'=48
'subscribe'=49 'connect'=49
'unsubscribe'=50 'disconnect'=50
'optimistic-register'=51 'call'=51
'crdt'=52 'watch-start'=52
'optional-one'=53 'watch-stop'=53
'exactly-one'=54 'subscribe'=54
'many-unique'=55 'unsubscribe'=55
'many'=56 'optimistic-register'=56
'ordered'=57 'crdt'=57
'unit'=58 'optional-one'=58
'watch-handle'=59 'exactly-one'=59
'message'=60 'many-unique'=60
'atom-ref'=61 'many'=61
'interface-ref'=62 'ordered'=62
'optional'=63 'unit'=63
'list'=64 'watch-handle'=64
'bool'=65 'message'=65
'bytes'=66 'atom-ref'=66
'double'=67 'interface-ref'=67
'int32'=68 'optional'=68
'int64'=69 'list'=69
'string'=70 'bool'=70
'uint32'=71 'bytes'=71
'uint64'=72 'double'=72
'true'=73 'int32'=73
'false'=74 'int64'=74
'null'=75 'string'=75
'->'=76 'uint32'=76
':'=77 'uint64'=77
';'=78 'true'=78
','=79 'false'=79
'.'=80 'null'=80
'{'=81 '->'=81
'}'=82 ':'=82
'['=83 ';'=83
']'=84 ','=84
'('=85 '.'=85
')'=86 '{'=86
'<'=87 '}'=87
'>'=88 '['=88
']'=89
'('=90
')'=91
'<'=92
'>'=93
@@ -25,80 +25,85 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
public static readonly EDGE = 19; public static readonly EDGE = 19;
public static readonly PROJECTION = 20; public static readonly PROJECTION = 20;
public static readonly WITH = 21; public static readonly WITH = 21;
public static readonly ON = 22; public static readonly USING = 22;
public static readonly POLICY = 23; public static readonly VIA = 23;
public static readonly DEFAULT = 24; public static readonly MATERIALIZE = 24;
public static readonly SOURCE = 25; public static readonly IF = 25;
public static readonly REPOSITORY = 26; public static readonly ABSENT = 26;
public static readonly COMMIT = 27; public static readonly ON = 27;
public static readonly REVISION = 28; public static readonly POLICY = 28;
public static readonly ID = 29; public static readonly DEFAULT = 29;
public static readonly DOC = 30; public static readonly SOURCE = 30;
public static readonly MODE = 31; public static readonly REPOSITORY = 31;
public static readonly EMITS = 32; public static readonly COMMIT = 32;
public static readonly RECEIVER = 33; public static readonly REVISION = 33;
public static readonly REQUIRES = 34; public static readonly ID = 34;
public static readonly ANY = 35; public static readonly DOC = 35;
public static readonly GET = 36; public static readonly MODE = 36;
public static readonly SET = 37; public static readonly EMITS = 37;
public static readonly WATCH = 38; public static readonly RECEIVER = 38;
public static readonly START = 39; public static readonly REQUIRES = 39;
public static readonly STOP = 40; public static readonly ANY = 40;
public static readonly READ = 41; public static readonly GET = 41;
public static readonly WRITE = 42; public static readonly SET = 42;
public static readonly RESOLVE = 43; public static readonly WATCH = 43;
public static readonly CONNECT = 44; public static readonly START = 44;
public static readonly DISCONNECT = 45; public static readonly STOP = 45;
public static readonly CALL = 46; public static readonly READ = 46;
public static readonly WATCH_START = 47; public static readonly WRITE = 47;
public static readonly WATCH_STOP = 48; public static readonly RESOLVE = 48;
public static readonly SUBSCRIBE = 49; public static readonly CONNECT = 49;
public static readonly UNSUBSCRIBE = 50; public static readonly DISCONNECT = 50;
public static readonly OPTIMISTIC_REGISTER = 51; public static readonly CALL = 51;
public static readonly CRDT = 52; public static readonly WATCH_START = 52;
public static readonly OPTIONAL_ONE = 53; public static readonly WATCH_STOP = 53;
public static readonly EXACTLY_ONE = 54; public static readonly SUBSCRIBE = 54;
public static readonly MANY_UNIQUE = 55; public static readonly UNSUBSCRIBE = 55;
public static readonly MANY = 56; public static readonly OPTIMISTIC_REGISTER = 56;
public static readonly ORDERED = 57; public static readonly CRDT = 57;
public static readonly UNIT = 58; public static readonly OPTIONAL_ONE = 58;
public static readonly WATCH_HANDLE = 59; public static readonly EXACTLY_ONE = 59;
public static readonly MESSAGE = 60; public static readonly MANY_UNIQUE = 60;
public static readonly ATOM_REF = 61; public static readonly MANY = 61;
public static readonly INTERFACE_REF = 62; public static readonly ORDERED = 62;
public static readonly OPTIONAL = 63; public static readonly UNIT = 63;
public static readonly LIST = 64; public static readonly WATCH_HANDLE = 64;
public static readonly BOOL = 65; public static readonly MESSAGE = 65;
public static readonly BYTES = 66; public static readonly ATOM_REF = 66;
public static readonly DOUBLE = 67; public static readonly INTERFACE_REF = 67;
public static readonly INT32 = 68; public static readonly OPTIONAL = 68;
public static readonly INT64 = 69; public static readonly LIST = 69;
public static readonly STRING = 70; public static readonly BOOL = 70;
public static readonly UINT32 = 71; public static readonly BYTES = 71;
public static readonly UINT64 = 72; public static readonly DOUBLE = 72;
public static readonly TRUE = 73; public static readonly INT32 = 73;
public static readonly FALSE = 74; public static readonly INT64 = 74;
public static readonly NULL = 75; public static readonly STRING = 75;
public static readonly ARROW = 76; public static readonly UINT32 = 76;
public static readonly COLON = 77; public static readonly UINT64 = 77;
public static readonly SEMI = 78; public static readonly TRUE = 78;
public static readonly COMMA = 79; public static readonly FALSE = 79;
public static readonly DOT = 80; public static readonly NULL = 80;
public static readonly LBRACE = 81; public static readonly ARROW = 81;
public static readonly RBRACE = 82; public static readonly COLON = 82;
public static readonly LBRACK = 83; public static readonly SEMI = 83;
public static readonly RBRACK = 84; public static readonly COMMA = 84;
public static readonly LPAREN = 85; public static readonly DOT = 85;
public static readonly RPAREN = 86; public static readonly LBRACE = 86;
public static readonly LT = 87; public static readonly RBRACE = 87;
public static readonly GT = 88; public static readonly LBRACK = 88;
public static readonly INTEGER = 89; public static readonly RBRACK = 89;
public static readonly JSON_NUMBER = 90; public static readonly LPAREN = 90;
public static readonly IDENTIFIER = 91; public static readonly RPAREN = 91;
public static readonly STRING_LITERAL = 92; public static readonly LT = 92;
public static readonly LINE_COMMENT = 93; public static readonly GT = 93;
public static readonly BLOCK_COMMENT = 94; public static readonly INTEGER = 94;
public static readonly WS = 95; public static readonly JSON_NUMBER = 95;
public static readonly IDENTIFIER = 96;
public static readonly STRING_LITERAL = 97;
public static readonly LINE_COMMENT = 98;
public static readonly BLOCK_COMMENT = 99;
public static readonly WS = 100;
public static readonly channelNames = [ public static readonly channelNames = [
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
@@ -108,37 +113,38 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'", null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'",
"'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'",
"'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'", "'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'",
"'shared'", "'state'", "'edge'", "'projection'", "'with'", "'on'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'",
"'policy'", "'default'", "'source'", "'repository'", "'commit'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'",
"'revision'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'default'", "'source'", "'repository'", "'commit'", "'revision'",
"'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'",
"'read'", "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'",
"'watch-start'", "'watch-stop'", "'subscribe'", "'unsubscribe'", "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'",
"'optimistic-register'", "'crdt'", "'optional-one'", "'exactly-one'", "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'",
"'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'",
"'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'",
"'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'",
"'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'",
"';'", "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'",
"'>'" "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'"
]; ];
public static readonly symbolicNames = [ public static readonly symbolicNames = [
null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE",
"VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS",
"CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE",
"PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT",
"COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION",
"REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET",
"WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT",
"WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE",
"CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE",
"UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE",
"OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES",
"STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE",
"COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE",
"LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER",
"STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT",
"WS"
]; ];
public static readonly modeNames = [ public static readonly modeNames = [
@@ -149,19 +155,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
"WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE",
"RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS",
"CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE",
"PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT",
"COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION",
"REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET",
"WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT",
"WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE",
"CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE",
"UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE",
"OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES",
"STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE",
"COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE",
"LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER",
"STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT",
"WS", "BLOCK_COMMENT", "WS",
]; ];
@@ -183,7 +189,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; }
public static readonly _serializedATN: number[] = [ public static readonly _serializedATN: number[] = [
4,0,95,895,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 4,0,100,937,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,
2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,
13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,
19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2, 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,
@@ -197,310 +203,325 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2, 71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2,
78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7, 78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7,
84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2, 84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2,
91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,1,0,1, 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1, 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,1,0,1,0,1,0,1,0,1,
2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, 0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,
3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, 2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,
5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1, 4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,
7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, 6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,
9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10, 7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,
1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, 9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,
1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15, 10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,
1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16, 12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,
1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19, 15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,
1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20, 17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,
1,20,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23, 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,21,1,
1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24, 21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,
1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26, 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,25,1,25,1,
1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27, 25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,
1,27,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30, 27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,
1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32, 29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,
1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34, 30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,
1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37, 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,
1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39, 35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,
1,39,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,42, 37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,
1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43, 38,1,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,
1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, 41,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,
1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, 44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,
1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, 46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,
1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49, 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,
1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50, 49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,
1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,
1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52, 52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,
1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, 53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,
1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54, 54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,
1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55, 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,
1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57, 56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,
1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,
1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60, 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,
1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, 60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,
1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, 62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,
1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65,1,65, 63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,
1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67, 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,
1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69, 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,
1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71, 67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,
1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73, 69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,
1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,76,1,76, 71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,
1,77,1,77,1,78,1,78,1,79,1,79,1,80,1,80,1,81,1,81,1,82,1,82,1,83, 73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,
1,83,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,3,88,796,8,88, 75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,
1,88,4,88,799,8,88,11,88,12,88,800,1,89,3,89,804,8,89,1,89,1,89, 77,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,
1,89,5,89,809,8,89,10,89,12,89,812,9,89,3,89,814,8,89,1,89,1,89, 80,1,80,1,81,1,81,1,82,1,82,1,83,1,83,1,84,1,84,1,85,1,85,1,86,1,
4,89,818,8,89,11,89,12,89,819,3,89,822,8,89,1,89,1,89,3,89,826,8, 86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,
89,1,89,4,89,829,8,89,11,89,12,89,830,3,89,833,8,89,1,90,1,90,5, 93,3,93,838,8,93,1,93,4,93,841,8,93,11,93,12,93,842,1,94,3,94,846,
90,837,8,90,10,90,12,90,840,9,90,1,91,1,91,1,91,5,91,845,8,91,10, 8,94,1,94,1,94,1,94,5,94,851,8,94,10,94,12,94,854,9,94,3,94,856,
91,12,91,848,9,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1, 8,94,1,94,1,94,4,94,860,8,94,11,94,12,94,861,3,94,864,8,94,1,94,
92,3,92,860,8,92,1,93,1,93,1,94,1,94,1,94,1,94,5,94,868,8,94,10, 1,94,3,94,868,8,94,1,94,4,94,871,8,94,11,94,12,94,872,3,94,875,8,
94,12,94,871,9,94,1,94,1,94,1,95,1,95,1,95,1,95,5,95,879,8,95,10, 94,1,95,1,95,5,95,879,8,95,10,95,12,95,882,9,95,1,96,1,96,1,96,5,
95,12,95,882,9,95,1,95,1,95,1,95,1,95,1,95,1,96,4,96,890,8,96,11, 96,887,8,96,10,96,12,96,890,9,96,1,96,1,96,1,97,1,97,1,97,1,97,1,
96,12,96,891,1,96,1,96,1,880,0,97,1,1,3,2,5,3,7,4,9,5,11,6,13,7, 97,1,97,1,97,1,97,3,97,902,8,97,1,98,1,98,1,99,1,99,1,99,1,99,5,
15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18, 99,910,8,99,10,99,12,99,913,9,99,1,99,1,99,1,100,1,100,1,100,1,100,
37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29, 5,100,921,8,100,10,100,12,100,924,9,100,1,100,1,100,1,100,1,100,
59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40, 1,100,1,101,4,101,932,8,101,11,101,12,101,933,1,101,1,101,1,922,
81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101, 0,102,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,
51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60, 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,
121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139, 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,
70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79, 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,
159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177, 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,
89,179,90,181,91,183,92,185,0,187,0,189,93,191,94,193,95,1,0,11, 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,
1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90, 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,
95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34, 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,
92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116, 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,
3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,909, 187,94,189,95,191,96,193,97,195,0,197,0,199,98,201,99,203,100,1,
0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, 0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,
1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21, 90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,
1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, 34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,
1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41, 116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,
1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51, 951,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,
1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61, 0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,
1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71, 0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,
1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81, 0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,
1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91, 0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,
1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101, 0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,
1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0, 0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,
0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1, 0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,
0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0, 0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,
129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0, 0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,
0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147, 0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,
1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0, 0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,
0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1, 119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,
0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0, 0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,
175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0, 1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,
0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,1,195,1,0,0,0,3,205, 0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,
1,0,0,0,5,210,1,0,0,0,7,220,1,0,0,0,9,231,1,0,0,0,11,239,1,0,0,0, 0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,
13,245,1,0,0,0,15,254,1,0,0,0,17,264,1,0,0,0,19,273,1,0,0,0,21,285, 165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,
1,0,0,0,23,296,1,0,0,0,25,304,1,0,0,0,27,307,1,0,0,0,29,312,1,0, 0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,
0,0,31,315,1,0,0,0,33,323,1,0,0,0,35,330,1,0,0,0,37,336,1,0,0,0, 1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,
39,341,1,0,0,0,41,352,1,0,0,0,43,357,1,0,0,0,45,360,1,0,0,0,47,367, 0,193,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,1,205,1,
1,0,0,0,49,375,1,0,0,0,51,382,1,0,0,0,53,393,1,0,0,0,55,400,1,0, 0,0,0,3,215,1,0,0,0,5,220,1,0,0,0,7,230,1,0,0,0,9,241,1,0,0,0,11,
0,0,57,409,1,0,0,0,59,412,1,0,0,0,61,416,1,0,0,0,63,421,1,0,0,0, 249,1,0,0,0,13,255,1,0,0,0,15,264,1,0,0,0,17,274,1,0,0,0,19,283,
65,427,1,0,0,0,67,436,1,0,0,0,69,445,1,0,0,0,71,449,1,0,0,0,73,453, 1,0,0,0,21,295,1,0,0,0,23,306,1,0,0,0,25,314,1,0,0,0,27,317,1,0,
1,0,0,0,75,457,1,0,0,0,77,463,1,0,0,0,79,469,1,0,0,0,81,474,1,0, 0,0,29,322,1,0,0,0,31,325,1,0,0,0,33,333,1,0,0,0,35,340,1,0,0,0,
0,0,83,479,1,0,0,0,85,485,1,0,0,0,87,493,1,0,0,0,89,501,1,0,0,0, 37,346,1,0,0,0,39,351,1,0,0,0,41,362,1,0,0,0,43,367,1,0,0,0,45,373,
91,512,1,0,0,0,93,517,1,0,0,0,95,529,1,0,0,0,97,540,1,0,0,0,99,550, 1,0,0,0,47,377,1,0,0,0,49,389,1,0,0,0,51,392,1,0,0,0,53,399,1,0,
1,0,0,0,101,562,1,0,0,0,103,582,1,0,0,0,105,587,1,0,0,0,107,600, 0,0,55,402,1,0,0,0,57,409,1,0,0,0,59,417,1,0,0,0,61,424,1,0,0,0,
1,0,0,0,109,612,1,0,0,0,111,624,1,0,0,0,113,629,1,0,0,0,115,637, 63,435,1,0,0,0,65,442,1,0,0,0,67,451,1,0,0,0,69,454,1,0,0,0,71,458,
1,0,0,0,117,642,1,0,0,0,119,655,1,0,0,0,121,663,1,0,0,0,123,672, 1,0,0,0,73,463,1,0,0,0,75,469,1,0,0,0,77,478,1,0,0,0,79,487,1,0,
1,0,0,0,125,686,1,0,0,0,127,695,1,0,0,0,129,700,1,0,0,0,131,705, 0,0,81,491,1,0,0,0,83,495,1,0,0,0,85,499,1,0,0,0,87,505,1,0,0,0,
1,0,0,0,133,711,1,0,0,0,135,718,1,0,0,0,137,724,1,0,0,0,139,730, 89,511,1,0,0,0,91,516,1,0,0,0,93,521,1,0,0,0,95,527,1,0,0,0,97,535,
1,0,0,0,141,737,1,0,0,0,143,744,1,0,0,0,145,751,1,0,0,0,147,756, 1,0,0,0,99,543,1,0,0,0,101,554,1,0,0,0,103,559,1,0,0,0,105,571,1,
1,0,0,0,149,762,1,0,0,0,151,767,1,0,0,0,153,770,1,0,0,0,155,772, 0,0,0,107,582,1,0,0,0,109,592,1,0,0,0,111,604,1,0,0,0,113,624,1,
1,0,0,0,157,774,1,0,0,0,159,776,1,0,0,0,161,778,1,0,0,0,163,780, 0,0,0,115,629,1,0,0,0,117,642,1,0,0,0,119,654,1,0,0,0,121,666,1,
1,0,0,0,165,782,1,0,0,0,167,784,1,0,0,0,169,786,1,0,0,0,171,788, 0,0,0,123,671,1,0,0,0,125,679,1,0,0,0,127,684,1,0,0,0,129,697,1,
1,0,0,0,173,790,1,0,0,0,175,792,1,0,0,0,177,795,1,0,0,0,179,803, 0,0,0,131,705,1,0,0,0,133,714,1,0,0,0,135,728,1,0,0,0,137,737,1,
1,0,0,0,181,834,1,0,0,0,183,841,1,0,0,0,185,851,1,0,0,0,187,861, 0,0,0,139,742,1,0,0,0,141,747,1,0,0,0,143,753,1,0,0,0,145,760,1,
1,0,0,0,189,863,1,0,0,0,191,874,1,0,0,0,193,889,1,0,0,0,195,196, 0,0,0,147,766,1,0,0,0,149,772,1,0,0,0,151,779,1,0,0,0,153,786,1,
5,119,0,0,196,197,5,111,0,0,197,198,5,114,0,0,198,199,5,107,0,0, 0,0,0,155,793,1,0,0,0,157,798,1,0,0,0,159,804,1,0,0,0,161,809,1,
199,200,5,115,0,0,200,201,5,112,0,0,201,202,5,97,0,0,202,203,5,99, 0,0,0,163,812,1,0,0,0,165,814,1,0,0,0,167,816,1,0,0,0,169,818,1,
0,0,203,204,5,101,0,0,204,2,1,0,0,0,205,206,5,97,0,0,206,207,5,116, 0,0,0,171,820,1,0,0,0,173,822,1,0,0,0,175,824,1,0,0,0,177,826,1,
0,0,207,208,5,111,0,0,208,209,5,109,0,0,209,4,1,0,0,0,210,211,5, 0,0,0,179,828,1,0,0,0,181,830,1,0,0,0,183,832,1,0,0,0,185,834,1,
105,0,0,211,212,5,110,0,0,212,213,5,116,0,0,213,214,5,101,0,0,214, 0,0,0,187,837,1,0,0,0,189,845,1,0,0,0,191,876,1,0,0,0,193,883,1,
215,5,114,0,0,215,216,5,102,0,0,216,217,5,97,0,0,217,218,5,99,0, 0,0,0,195,893,1,0,0,0,197,903,1,0,0,0,199,905,1,0,0,0,201,916,1,
0,218,219,5,101,0,0,219,6,1,0,0,0,220,221,5,105,0,0,221,222,5,110, 0,0,0,203,931,1,0,0,0,205,206,5,119,0,0,206,207,5,111,0,0,207,208,
0,0,222,223,5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226, 5,114,0,0,208,209,5,107,0,0,209,210,5,115,0,0,210,211,5,112,0,0,
5,102,0,0,226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229, 211,212,5,97,0,0,212,213,5,99,0,0,213,214,5,101,0,0,214,2,1,0,0,
230,5,115,0,0,230,8,1,0,0,0,231,232,5,112,0,0,232,233,5,97,0,0,233, 0,215,216,5,97,0,0,216,217,5,116,0,0,217,218,5,111,0,0,218,219,5,
234,5,99,0,0,234,235,5,107,0,0,235,236,5,97,0,0,236,237,5,103,0, 109,0,0,219,4,1,0,0,0,220,221,5,105,0,0,221,222,5,110,0,0,222,223,
0,237,238,5,101,0,0,238,10,1,0,0,0,239,240,5,118,0,0,240,241,5,97, 5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226,5,102,0,0,
0,0,241,242,5,108,0,0,242,243,5,117,0,0,243,244,5,101,0,0,244,12, 226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229,6,1,0,0,
1,0,0,0,245,246,5,114,0,0,246,247,5,101,0,0,247,248,5,108,0,0,248, 0,230,231,5,105,0,0,231,232,5,110,0,0,232,233,5,116,0,0,233,234,
249,5,97,0,0,249,250,5,116,0,0,250,251,5,105,0,0,251,252,5,111,0, 5,101,0,0,234,235,5,114,0,0,235,236,5,102,0,0,236,237,5,97,0,0,237,
0,252,253,5,110,0,0,253,14,1,0,0,0,254,255,5,111,0,0,255,256,5,112, 238,5,99,0,0,238,239,5,101,0,0,239,240,5,115,0,0,240,8,1,0,0,0,241,
0,0,256,257,5,101,0,0,257,258,5,114,0,0,258,259,5,97,0,0,259,260, 242,5,112,0,0,242,243,5,97,0,0,243,244,5,99,0,0,244,245,5,107,0,
5,116,0,0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0, 0,245,246,5,97,0,0,246,247,5,103,0,0,247,248,5,101,0,0,248,10,1,
263,16,1,0,0,0,264,265,5,102,0,0,265,266,5,117,0,0,266,267,5,110, 0,0,0,249,250,5,118,0,0,250,251,5,97,0,0,251,252,5,108,0,0,252,253,
0,0,267,268,5,99,0,0,268,269,5,116,0,0,269,270,5,105,0,0,270,271, 5,117,0,0,253,254,5,101,0,0,254,12,1,0,0,0,255,256,5,114,0,0,256,
5,111,0,0,271,272,5,110,0,0,272,18,1,0,0,0,273,274,5,99,0,0,274, 257,5,101,0,0,257,258,5,108,0,0,258,259,5,97,0,0,259,260,5,116,0,
275,5,111,0,0,275,276,5,110,0,0,276,277,5,115,0,0,277,278,5,116, 0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0,263,14,1,
0,0,278,279,5,114,0,0,279,280,5,117,0,0,280,281,5,99,0,0,281,282, 0,0,0,264,265,5,111,0,0,265,266,5,112,0,0,266,267,5,101,0,0,267,
5,116,0,0,282,283,5,111,0,0,283,284,5,114,0,0,284,20,1,0,0,0,285, 268,5,114,0,0,268,269,5,97,0,0,269,270,5,116,0,0,270,271,5,105,0,
286,5,99,0,0,286,287,5,111,0,0,287,288,5,110,0,0,288,289,5,115,0, 0,271,272,5,111,0,0,272,273,5,110,0,0,273,16,1,0,0,0,274,275,5,102,
0,289,290,5,116,0,0,290,291,5,114,0,0,291,292,5,117,0,0,292,293, 0,0,275,276,5,117,0,0,276,277,5,110,0,0,277,278,5,99,0,0,278,279,
5,99,0,0,293,294,5,116,0,0,294,295,5,115,0,0,295,22,1,0,0,0,296, 5,116,0,0,279,280,5,105,0,0,280,281,5,111,0,0,281,282,5,110,0,0,
297,5,99,0,0,297,298,5,111,0,0,298,299,5,110,0,0,299,300,5,102,0, 282,18,1,0,0,0,283,284,5,99,0,0,284,285,5,111,0,0,285,286,5,110,
0,300,301,5,111,0,0,301,302,5,114,0,0,302,303,5,109,0,0,303,24,1, 0,0,286,287,5,115,0,0,287,288,5,116,0,0,288,289,5,114,0,0,289,290,
0,0,0,304,305,5,97,0,0,305,306,5,115,0,0,306,26,1,0,0,0,307,308, 5,117,0,0,290,291,5,99,0,0,291,292,5,116,0,0,292,293,5,111,0,0,293,
5,98,0,0,308,309,5,105,0,0,309,310,5,110,0,0,310,311,5,100,0,0,311, 294,5,114,0,0,294,20,1,0,0,0,295,296,5,99,0,0,296,297,5,111,0,0,
28,1,0,0,0,312,313,5,116,0,0,313,314,5,111,0,0,314,30,1,0,0,0,315, 297,298,5,110,0,0,298,299,5,115,0,0,299,300,5,116,0,0,300,301,5,
316,5,112,0,0,316,317,5,114,0,0,317,318,5,105,0,0,318,319,5,118, 114,0,0,301,302,5,117,0,0,302,303,5,99,0,0,303,304,5,116,0,0,304,
0,0,319,320,5,97,0,0,320,321,5,116,0,0,321,322,5,101,0,0,322,32, 305,5,115,0,0,305,22,1,0,0,0,306,307,5,99,0,0,307,308,5,111,0,0,
1,0,0,0,323,324,5,115,0,0,324,325,5,104,0,0,325,326,5,97,0,0,326, 308,309,5,110,0,0,309,310,5,102,0,0,310,311,5,111,0,0,311,312,5,
327,5,114,0,0,327,328,5,101,0,0,328,329,5,100,0,0,329,34,1,0,0,0, 114,0,0,312,313,5,109,0,0,313,24,1,0,0,0,314,315,5,97,0,0,315,316,
330,331,5,115,0,0,331,332,5,116,0,0,332,333,5,97,0,0,333,334,5,116, 5,115,0,0,316,26,1,0,0,0,317,318,5,98,0,0,318,319,5,105,0,0,319,
0,0,334,335,5,101,0,0,335,36,1,0,0,0,336,337,5,101,0,0,337,338,5, 320,5,110,0,0,320,321,5,100,0,0,321,28,1,0,0,0,322,323,5,116,0,0,
100,0,0,338,339,5,103,0,0,339,340,5,101,0,0,340,38,1,0,0,0,341,342, 323,324,5,111,0,0,324,30,1,0,0,0,325,326,5,112,0,0,326,327,5,114,
5,112,0,0,342,343,5,114,0,0,343,344,5,111,0,0,344,345,5,106,0,0, 0,0,327,328,5,105,0,0,328,329,5,118,0,0,329,330,5,97,0,0,330,331,
345,346,5,101,0,0,346,347,5,99,0,0,347,348,5,116,0,0,348,349,5,105, 5,116,0,0,331,332,5,101,0,0,332,32,1,0,0,0,333,334,5,115,0,0,334,
0,0,349,350,5,111,0,0,350,351,5,110,0,0,351,40,1,0,0,0,352,353,5, 335,5,104,0,0,335,336,5,97,0,0,336,337,5,114,0,0,337,338,5,101,0,
119,0,0,353,354,5,105,0,0,354,355,5,116,0,0,355,356,5,104,0,0,356, 0,338,339,5,100,0,0,339,34,1,0,0,0,340,341,5,115,0,0,341,342,5,116,
42,1,0,0,0,357,358,5,111,0,0,358,359,5,110,0,0,359,44,1,0,0,0,360, 0,0,342,343,5,97,0,0,343,344,5,116,0,0,344,345,5,101,0,0,345,36,
361,5,112,0,0,361,362,5,111,0,0,362,363,5,108,0,0,363,364,5,105, 1,0,0,0,346,347,5,101,0,0,347,348,5,100,0,0,348,349,5,103,0,0,349,
0,0,364,365,5,99,0,0,365,366,5,121,0,0,366,46,1,0,0,0,367,368,5, 350,5,101,0,0,350,38,1,0,0,0,351,352,5,112,0,0,352,353,5,114,0,0,
100,0,0,368,369,5,101,0,0,369,370,5,102,0,0,370,371,5,97,0,0,371, 353,354,5,111,0,0,354,355,5,106,0,0,355,356,5,101,0,0,356,357,5,
372,5,117,0,0,372,373,5,108,0,0,373,374,5,116,0,0,374,48,1,0,0,0, 99,0,0,357,358,5,116,0,0,358,359,5,105,0,0,359,360,5,111,0,0,360,
375,376,5,115,0,0,376,377,5,111,0,0,377,378,5,117,0,0,378,379,5, 361,5,110,0,0,361,40,1,0,0,0,362,363,5,119,0,0,363,364,5,105,0,0,
114,0,0,379,380,5,99,0,0,380,381,5,101,0,0,381,50,1,0,0,0,382,383, 364,365,5,116,0,0,365,366,5,104,0,0,366,42,1,0,0,0,367,368,5,117,
5,114,0,0,383,384,5,101,0,0,384,385,5,112,0,0,385,386,5,111,0,0, 0,0,368,369,5,115,0,0,369,370,5,105,0,0,370,371,5,110,0,0,371,372,
386,387,5,115,0,0,387,388,5,105,0,0,388,389,5,116,0,0,389,390,5, 5,103,0,0,372,44,1,0,0,0,373,374,5,118,0,0,374,375,5,105,0,0,375,
111,0,0,390,391,5,114,0,0,391,392,5,121,0,0,392,52,1,0,0,0,393,394, 376,5,97,0,0,376,46,1,0,0,0,377,378,5,109,0,0,378,379,5,97,0,0,379,
5,99,0,0,394,395,5,111,0,0,395,396,5,109,0,0,396,397,5,109,0,0,397, 380,5,116,0,0,380,381,5,101,0,0,381,382,5,114,0,0,382,383,5,105,
398,5,105,0,0,398,399,5,116,0,0,399,54,1,0,0,0,400,401,5,114,0,0, 0,0,383,384,5,97,0,0,384,385,5,108,0,0,385,386,5,105,0,0,386,387,
401,402,5,101,0,0,402,403,5,118,0,0,403,404,5,105,0,0,404,405,5, 5,122,0,0,387,388,5,101,0,0,388,48,1,0,0,0,389,390,5,105,0,0,390,
115,0,0,405,406,5,105,0,0,406,407,5,111,0,0,407,408,5,110,0,0,408, 391,5,102,0,0,391,50,1,0,0,0,392,393,5,97,0,0,393,394,5,98,0,0,394,
56,1,0,0,0,409,410,5,105,0,0,410,411,5,100,0,0,411,58,1,0,0,0,412, 395,5,115,0,0,395,396,5,101,0,0,396,397,5,110,0,0,397,398,5,116,
413,5,100,0,0,413,414,5,111,0,0,414,415,5,99,0,0,415,60,1,0,0,0, 0,0,398,52,1,0,0,0,399,400,5,111,0,0,400,401,5,110,0,0,401,54,1,
416,417,5,109,0,0,417,418,5,111,0,0,418,419,5,100,0,0,419,420,5, 0,0,0,402,403,5,112,0,0,403,404,5,111,0,0,404,405,5,108,0,0,405,
101,0,0,420,62,1,0,0,0,421,422,5,101,0,0,422,423,5,109,0,0,423,424, 406,5,105,0,0,406,407,5,99,0,0,407,408,5,121,0,0,408,56,1,0,0,0,
5,105,0,0,424,425,5,116,0,0,425,426,5,115,0,0,426,64,1,0,0,0,427, 409,410,5,100,0,0,410,411,5,101,0,0,411,412,5,102,0,0,412,413,5,
428,5,114,0,0,428,429,5,101,0,0,429,430,5,99,0,0,430,431,5,101,0, 97,0,0,413,414,5,117,0,0,414,415,5,108,0,0,415,416,5,116,0,0,416,
0,431,432,5,105,0,0,432,433,5,118,0,0,433,434,5,101,0,0,434,435, 58,1,0,0,0,417,418,5,115,0,0,418,419,5,111,0,0,419,420,5,117,0,0,
5,114,0,0,435,66,1,0,0,0,436,437,5,114,0,0,437,438,5,101,0,0,438, 420,421,5,114,0,0,421,422,5,99,0,0,422,423,5,101,0,0,423,60,1,0,
439,5,113,0,0,439,440,5,117,0,0,440,441,5,105,0,0,441,442,5,114, 0,0,424,425,5,114,0,0,425,426,5,101,0,0,426,427,5,112,0,0,427,428,
0,0,442,443,5,101,0,0,443,444,5,115,0,0,444,68,1,0,0,0,445,446,5, 5,111,0,0,428,429,5,115,0,0,429,430,5,105,0,0,430,431,5,116,0,0,
97,0,0,446,447,5,110,0,0,447,448,5,121,0,0,448,70,1,0,0,0,449,450, 431,432,5,111,0,0,432,433,5,114,0,0,433,434,5,121,0,0,434,62,1,0,
5,103,0,0,450,451,5,101,0,0,451,452,5,116,0,0,452,72,1,0,0,0,453, 0,0,435,436,5,99,0,0,436,437,5,111,0,0,437,438,5,109,0,0,438,439,
454,5,115,0,0,454,455,5,101,0,0,455,456,5,116,0,0,456,74,1,0,0,0, 5,109,0,0,439,440,5,105,0,0,440,441,5,116,0,0,441,64,1,0,0,0,442,
457,458,5,119,0,0,458,459,5,97,0,0,459,460,5,116,0,0,460,461,5,99, 443,5,114,0,0,443,444,5,101,0,0,444,445,5,118,0,0,445,446,5,105,
0,0,461,462,5,104,0,0,462,76,1,0,0,0,463,464,5,115,0,0,464,465,5, 0,0,446,447,5,115,0,0,447,448,5,105,0,0,448,449,5,111,0,0,449,450,
116,0,0,465,466,5,97,0,0,466,467,5,114,0,0,467,468,5,116,0,0,468, 5,110,0,0,450,66,1,0,0,0,451,452,5,105,0,0,452,453,5,100,0,0,453,
78,1,0,0,0,469,470,5,115,0,0,470,471,5,116,0,0,471,472,5,111,0,0, 68,1,0,0,0,454,455,5,100,0,0,455,456,5,111,0,0,456,457,5,99,0,0,
472,473,5,112,0,0,473,80,1,0,0,0,474,475,5,114,0,0,475,476,5,101, 457,70,1,0,0,0,458,459,5,109,0,0,459,460,5,111,0,0,460,461,5,100,
0,0,476,477,5,97,0,0,477,478,5,100,0,0,478,82,1,0,0,0,479,480,5, 0,0,461,462,5,101,0,0,462,72,1,0,0,0,463,464,5,101,0,0,464,465,5,
119,0,0,480,481,5,114,0,0,481,482,5,105,0,0,482,483,5,116,0,0,483, 109,0,0,465,466,5,105,0,0,466,467,5,116,0,0,467,468,5,115,0,0,468,
484,5,101,0,0,484,84,1,0,0,0,485,486,5,114,0,0,486,487,5,101,0,0, 74,1,0,0,0,469,470,5,114,0,0,470,471,5,101,0,0,471,472,5,99,0,0,
487,488,5,115,0,0,488,489,5,111,0,0,489,490,5,108,0,0,490,491,5, 472,473,5,101,0,0,473,474,5,105,0,0,474,475,5,118,0,0,475,476,5,
118,0,0,491,492,5,101,0,0,492,86,1,0,0,0,493,494,5,99,0,0,494,495, 101,0,0,476,477,5,114,0,0,477,76,1,0,0,0,478,479,5,114,0,0,479,480,
5,111,0,0,495,496,5,110,0,0,496,497,5,110,0,0,497,498,5,101,0,0, 5,101,0,0,480,481,5,113,0,0,481,482,5,117,0,0,482,483,5,105,0,0,
498,499,5,99,0,0,499,500,5,116,0,0,500,88,1,0,0,0,501,502,5,100, 483,484,5,114,0,0,484,485,5,101,0,0,485,486,5,115,0,0,486,78,1,0,
0,0,502,503,5,105,0,0,503,504,5,115,0,0,504,505,5,99,0,0,505,506, 0,0,487,488,5,97,0,0,488,489,5,110,0,0,489,490,5,121,0,0,490,80,
5,111,0,0,506,507,5,110,0,0,507,508,5,110,0,0,508,509,5,101,0,0, 1,0,0,0,491,492,5,103,0,0,492,493,5,101,0,0,493,494,5,116,0,0,494,
509,510,5,99,0,0,510,511,5,116,0,0,511,90,1,0,0,0,512,513,5,99,0, 82,1,0,0,0,495,496,5,115,0,0,496,497,5,101,0,0,497,498,5,116,0,0,
0,513,514,5,97,0,0,514,515,5,108,0,0,515,516,5,108,0,0,516,92,1, 498,84,1,0,0,0,499,500,5,119,0,0,500,501,5,97,0,0,501,502,5,116,
0,0,0,517,518,5,119,0,0,518,519,5,97,0,0,519,520,5,116,0,0,520,521, 0,0,502,503,5,99,0,0,503,504,5,104,0,0,504,86,1,0,0,0,505,506,5,
5,99,0,0,521,522,5,104,0,0,522,523,5,45,0,0,523,524,5,115,0,0,524, 115,0,0,506,507,5,116,0,0,507,508,5,97,0,0,508,509,5,114,0,0,509,
525,5,116,0,0,525,526,5,97,0,0,526,527,5,114,0,0,527,528,5,116,0, 510,5,116,0,0,510,88,1,0,0,0,511,512,5,115,0,0,512,513,5,116,0,0,
0,528,94,1,0,0,0,529,530,5,119,0,0,530,531,5,97,0,0,531,532,5,116, 513,514,5,111,0,0,514,515,5,112,0,0,515,90,1,0,0,0,516,517,5,114,
0,0,532,533,5,99,0,0,533,534,5,104,0,0,534,535,5,45,0,0,535,536, 0,0,517,518,5,101,0,0,518,519,5,97,0,0,519,520,5,100,0,0,520,92,
5,115,0,0,536,537,5,116,0,0,537,538,5,111,0,0,538,539,5,112,0,0, 1,0,0,0,521,522,5,119,0,0,522,523,5,114,0,0,523,524,5,105,0,0,524,
539,96,1,0,0,0,540,541,5,115,0,0,541,542,5,117,0,0,542,543,5,98, 525,5,116,0,0,525,526,5,101,0,0,526,94,1,0,0,0,527,528,5,114,0,0,
0,0,543,544,5,115,0,0,544,545,5,99,0,0,545,546,5,114,0,0,546,547, 528,529,5,101,0,0,529,530,5,115,0,0,530,531,5,111,0,0,531,532,5,
5,105,0,0,547,548,5,98,0,0,548,549,5,101,0,0,549,98,1,0,0,0,550, 108,0,0,532,533,5,118,0,0,533,534,5,101,0,0,534,96,1,0,0,0,535,536,
551,5,117,0,0,551,552,5,110,0,0,552,553,5,115,0,0,553,554,5,117, 5,99,0,0,536,537,5,111,0,0,537,538,5,110,0,0,538,539,5,110,0,0,539,
0,0,554,555,5,98,0,0,555,556,5,115,0,0,556,557,5,99,0,0,557,558, 540,5,101,0,0,540,541,5,99,0,0,541,542,5,116,0,0,542,98,1,0,0,0,
5,114,0,0,558,559,5,105,0,0,559,560,5,98,0,0,560,561,5,101,0,0,561, 543,544,5,100,0,0,544,545,5,105,0,0,545,546,5,115,0,0,546,547,5,
100,1,0,0,0,562,563,5,111,0,0,563,564,5,112,0,0,564,565,5,116,0, 99,0,0,547,548,5,111,0,0,548,549,5,110,0,0,549,550,5,110,0,0,550,
0,565,566,5,105,0,0,566,567,5,109,0,0,567,568,5,105,0,0,568,569, 551,5,101,0,0,551,552,5,99,0,0,552,553,5,116,0,0,553,100,1,0,0,0,
5,115,0,0,569,570,5,116,0,0,570,571,5,105,0,0,571,572,5,99,0,0,572, 554,555,5,99,0,0,555,556,5,97,0,0,556,557,5,108,0,0,557,558,5,108,
573,5,45,0,0,573,574,5,114,0,0,574,575,5,101,0,0,575,576,5,103,0, 0,0,558,102,1,0,0,0,559,560,5,119,0,0,560,561,5,97,0,0,561,562,5,
0,576,577,5,105,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580, 116,0,0,562,563,5,99,0,0,563,564,5,104,0,0,564,565,5,45,0,0,565,
5,101,0,0,580,581,5,114,0,0,581,102,1,0,0,0,582,583,5,99,0,0,583, 566,5,115,0,0,566,567,5,116,0,0,567,568,5,97,0,0,568,569,5,114,0,
584,5,114,0,0,584,585,5,100,0,0,585,586,5,116,0,0,586,104,1,0,0, 0,569,570,5,116,0,0,570,104,1,0,0,0,571,572,5,119,0,0,572,573,5,
0,587,588,5,111,0,0,588,589,5,112,0,0,589,590,5,116,0,0,590,591, 97,0,0,573,574,5,116,0,0,574,575,5,99,0,0,575,576,5,104,0,0,576,
5,105,0,0,591,592,5,111,0,0,592,593,5,110,0,0,593,594,5,97,0,0,594, 577,5,45,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580,5,111,0,
595,5,108,0,0,595,596,5,45,0,0,596,597,5,111,0,0,597,598,5,110,0, 0,580,581,5,112,0,0,581,106,1,0,0,0,582,583,5,115,0,0,583,584,5,
0,598,599,5,101,0,0,599,106,1,0,0,0,600,601,5,101,0,0,601,602,5, 117,0,0,584,585,5,98,0,0,585,586,5,115,0,0,586,587,5,99,0,0,587,
120,0,0,602,603,5,97,0,0,603,604,5,99,0,0,604,605,5,116,0,0,605, 588,5,114,0,0,588,589,5,105,0,0,589,590,5,98,0,0,590,591,5,101,0,
606,5,108,0,0,606,607,5,121,0,0,607,608,5,45,0,0,608,609,5,111,0, 0,591,108,1,0,0,0,592,593,5,117,0,0,593,594,5,110,0,0,594,595,5,
0,609,610,5,110,0,0,610,611,5,101,0,0,611,108,1,0,0,0,612,613,5, 115,0,0,595,596,5,117,0,0,596,597,5,98,0,0,597,598,5,115,0,0,598,
109,0,0,613,614,5,97,0,0,614,615,5,110,0,0,615,616,5,121,0,0,616, 599,5,99,0,0,599,600,5,114,0,0,600,601,5,105,0,0,601,602,5,98,0,
617,5,45,0,0,617,618,5,117,0,0,618,619,5,110,0,0,619,620,5,105,0, 0,602,603,5,101,0,0,603,110,1,0,0,0,604,605,5,111,0,0,605,606,5,
0,620,621,5,113,0,0,621,622,5,117,0,0,622,623,5,101,0,0,623,110, 112,0,0,606,607,5,116,0,0,607,608,5,105,0,0,608,609,5,109,0,0,609,
1,0,0,0,624,625,5,109,0,0,625,626,5,97,0,0,626,627,5,110,0,0,627, 610,5,105,0,0,610,611,5,115,0,0,611,612,5,116,0,0,612,613,5,105,
628,5,121,0,0,628,112,1,0,0,0,629,630,5,111,0,0,630,631,5,114,0, 0,0,613,614,5,99,0,0,614,615,5,45,0,0,615,616,5,114,0,0,616,617,
0,631,632,5,100,0,0,632,633,5,101,0,0,633,634,5,114,0,0,634,635, 5,101,0,0,617,618,5,103,0,0,618,619,5,105,0,0,619,620,5,115,0,0,
5,101,0,0,635,636,5,100,0,0,636,114,1,0,0,0,637,638,5,117,0,0,638, 620,621,5,116,0,0,621,622,5,101,0,0,622,623,5,114,0,0,623,112,1,
639,5,110,0,0,639,640,5,105,0,0,640,641,5,116,0,0,641,116,1,0,0, 0,0,0,624,625,5,99,0,0,625,626,5,114,0,0,626,627,5,100,0,0,627,628,
0,642,643,5,119,0,0,643,644,5,97,0,0,644,645,5,116,0,0,645,646,5, 5,116,0,0,628,114,1,0,0,0,629,630,5,111,0,0,630,631,5,112,0,0,631,
99,0,0,646,647,5,104,0,0,647,648,5,45,0,0,648,649,5,104,0,0,649, 632,5,116,0,0,632,633,5,105,0,0,633,634,5,111,0,0,634,635,5,110,
650,5,97,0,0,650,651,5,110,0,0,651,652,5,100,0,0,652,653,5,108,0, 0,0,635,636,5,97,0,0,636,637,5,108,0,0,637,638,5,45,0,0,638,639,
0,653,654,5,101,0,0,654,118,1,0,0,0,655,656,5,109,0,0,656,657,5, 5,111,0,0,639,640,5,110,0,0,640,641,5,101,0,0,641,116,1,0,0,0,642,
101,0,0,657,658,5,115,0,0,658,659,5,115,0,0,659,660,5,97,0,0,660, 643,5,101,0,0,643,644,5,120,0,0,644,645,5,97,0,0,645,646,5,99,0,
661,5,103,0,0,661,662,5,101,0,0,662,120,1,0,0,0,663,664,5,97,0,0, 0,646,647,5,116,0,0,647,648,5,108,0,0,648,649,5,121,0,0,649,650,
664,665,5,116,0,0,665,666,5,111,0,0,666,667,5,109,0,0,667,668,5, 5,45,0,0,650,651,5,111,0,0,651,652,5,110,0,0,652,653,5,101,0,0,653,
45,0,0,668,669,5,114,0,0,669,670,5,101,0,0,670,671,5,102,0,0,671, 118,1,0,0,0,654,655,5,109,0,0,655,656,5,97,0,0,656,657,5,110,0,0,
122,1,0,0,0,672,673,5,105,0,0,673,674,5,110,0,0,674,675,5,116,0, 657,658,5,121,0,0,658,659,5,45,0,0,659,660,5,117,0,0,660,661,5,110,
0,675,676,5,101,0,0,676,677,5,114,0,0,677,678,5,102,0,0,678,679, 0,0,661,662,5,105,0,0,662,663,5,113,0,0,663,664,5,117,0,0,664,665,
5,97,0,0,679,680,5,99,0,0,680,681,5,101,0,0,681,682,5,45,0,0,682, 5,101,0,0,665,120,1,0,0,0,666,667,5,109,0,0,667,668,5,97,0,0,668,
683,5,114,0,0,683,684,5,101,0,0,684,685,5,102,0,0,685,124,1,0,0, 669,5,110,0,0,669,670,5,121,0,0,670,122,1,0,0,0,671,672,5,111,0,
0,686,687,5,111,0,0,687,688,5,112,0,0,688,689,5,116,0,0,689,690, 0,672,673,5,114,0,0,673,674,5,100,0,0,674,675,5,101,0,0,675,676,
5,105,0,0,690,691,5,111,0,0,691,692,5,110,0,0,692,693,5,97,0,0,693, 5,114,0,0,676,677,5,101,0,0,677,678,5,100,0,0,678,124,1,0,0,0,679,
694,5,108,0,0,694,126,1,0,0,0,695,696,5,108,0,0,696,697,5,105,0, 680,5,117,0,0,680,681,5,110,0,0,681,682,5,105,0,0,682,683,5,116,
0,697,698,5,115,0,0,698,699,5,116,0,0,699,128,1,0,0,0,700,701,5, 0,0,683,126,1,0,0,0,684,685,5,119,0,0,685,686,5,97,0,0,686,687,5,
98,0,0,701,702,5,111,0,0,702,703,5,111,0,0,703,704,5,108,0,0,704, 116,0,0,687,688,5,99,0,0,688,689,5,104,0,0,689,690,5,45,0,0,690,
130,1,0,0,0,705,706,5,98,0,0,706,707,5,121,0,0,707,708,5,116,0,0, 691,5,104,0,0,691,692,5,97,0,0,692,693,5,110,0,0,693,694,5,100,0,
708,709,5,101,0,0,709,710,5,115,0,0,710,132,1,0,0,0,711,712,5,100, 0,694,695,5,108,0,0,695,696,5,101,0,0,696,128,1,0,0,0,697,698,5,
0,0,712,713,5,111,0,0,713,714,5,117,0,0,714,715,5,98,0,0,715,716, 109,0,0,698,699,5,101,0,0,699,700,5,115,0,0,700,701,5,115,0,0,701,
5,108,0,0,716,717,5,101,0,0,717,134,1,0,0,0,718,719,5,105,0,0,719, 702,5,97,0,0,702,703,5,103,0,0,703,704,5,101,0,0,704,130,1,0,0,0,
720,5,110,0,0,720,721,5,116,0,0,721,722,5,51,0,0,722,723,5,50,0, 705,706,5,97,0,0,706,707,5,116,0,0,707,708,5,111,0,0,708,709,5,109,
0,723,136,1,0,0,0,724,725,5,105,0,0,725,726,5,110,0,0,726,727,5, 0,0,709,710,5,45,0,0,710,711,5,114,0,0,711,712,5,101,0,0,712,713,
116,0,0,727,728,5,54,0,0,728,729,5,52,0,0,729,138,1,0,0,0,730,731, 5,102,0,0,713,132,1,0,0,0,714,715,5,105,0,0,715,716,5,110,0,0,716,
5,115,0,0,731,732,5,116,0,0,732,733,5,114,0,0,733,734,5,105,0,0, 717,5,116,0,0,717,718,5,101,0,0,718,719,5,114,0,0,719,720,5,102,
734,735,5,110,0,0,735,736,5,103,0,0,736,140,1,0,0,0,737,738,5,117, 0,0,720,721,5,97,0,0,721,722,5,99,0,0,722,723,5,101,0,0,723,724,
0,0,738,739,5,105,0,0,739,740,5,110,0,0,740,741,5,116,0,0,741,742, 5,45,0,0,724,725,5,114,0,0,725,726,5,101,0,0,726,727,5,102,0,0,727,
5,51,0,0,742,743,5,50,0,0,743,142,1,0,0,0,744,745,5,117,0,0,745, 134,1,0,0,0,728,729,5,111,0,0,729,730,5,112,0,0,730,731,5,116,0,
746,5,105,0,0,746,747,5,110,0,0,747,748,5,116,0,0,748,749,5,54,0, 0,731,732,5,105,0,0,732,733,5,111,0,0,733,734,5,110,0,0,734,735,
0,749,750,5,52,0,0,750,144,1,0,0,0,751,752,5,116,0,0,752,753,5,114, 5,97,0,0,735,736,5,108,0,0,736,136,1,0,0,0,737,738,5,108,0,0,738,
0,0,753,754,5,117,0,0,754,755,5,101,0,0,755,146,1,0,0,0,756,757, 739,5,105,0,0,739,740,5,115,0,0,740,741,5,116,0,0,741,138,1,0,0,
5,102,0,0,757,758,5,97,0,0,758,759,5,108,0,0,759,760,5,115,0,0,760, 0,742,743,5,98,0,0,743,744,5,111,0,0,744,745,5,111,0,0,745,746,5,
761,5,101,0,0,761,148,1,0,0,0,762,763,5,110,0,0,763,764,5,117,0, 108,0,0,746,140,1,0,0,0,747,748,5,98,0,0,748,749,5,121,0,0,749,750,
0,764,765,5,108,0,0,765,766,5,108,0,0,766,150,1,0,0,0,767,768,5, 5,116,0,0,750,751,5,101,0,0,751,752,5,115,0,0,752,142,1,0,0,0,753,
45,0,0,768,769,5,62,0,0,769,152,1,0,0,0,770,771,5,58,0,0,771,154, 754,5,100,0,0,754,755,5,111,0,0,755,756,5,117,0,0,756,757,5,98,0,
1,0,0,0,772,773,5,59,0,0,773,156,1,0,0,0,774,775,5,44,0,0,775,158, 0,757,758,5,108,0,0,758,759,5,101,0,0,759,144,1,0,0,0,760,761,5,
1,0,0,0,776,777,5,46,0,0,777,160,1,0,0,0,778,779,5,123,0,0,779,162, 105,0,0,761,762,5,110,0,0,762,763,5,116,0,0,763,764,5,51,0,0,764,
1,0,0,0,780,781,5,125,0,0,781,164,1,0,0,0,782,783,5,91,0,0,783,166, 765,5,50,0,0,765,146,1,0,0,0,766,767,5,105,0,0,767,768,5,110,0,0,
1,0,0,0,784,785,5,93,0,0,785,168,1,0,0,0,786,787,5,40,0,0,787,170, 768,769,5,116,0,0,769,770,5,54,0,0,770,771,5,52,0,0,771,148,1,0,
1,0,0,0,788,789,5,41,0,0,789,172,1,0,0,0,790,791,5,60,0,0,791,174, 0,0,772,773,5,115,0,0,773,774,5,116,0,0,774,775,5,114,0,0,775,776,
1,0,0,0,792,793,5,62,0,0,793,176,1,0,0,0,794,796,5,45,0,0,795,794, 5,105,0,0,776,777,5,110,0,0,777,778,5,103,0,0,778,150,1,0,0,0,779,
1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,799,7,0,0,0,798,797, 780,5,117,0,0,780,781,5,105,0,0,781,782,5,110,0,0,782,783,5,116,
1,0,0,0,799,800,1,0,0,0,800,798,1,0,0,0,800,801,1,0,0,0,801,178, 0,0,783,784,5,51,0,0,784,785,5,50,0,0,785,152,1,0,0,0,786,787,5,
1,0,0,0,802,804,5,45,0,0,803,802,1,0,0,0,803,804,1,0,0,0,804,813, 117,0,0,787,788,5,105,0,0,788,789,5,110,0,0,789,790,5,116,0,0,790,
1,0,0,0,805,814,5,48,0,0,806,810,7,1,0,0,807,809,7,0,0,0,808,807, 791,5,54,0,0,791,792,5,52,0,0,792,154,1,0,0,0,793,794,5,116,0,0,
1,0,0,0,809,812,1,0,0,0,810,808,1,0,0,0,810,811,1,0,0,0,811,814, 794,795,5,114,0,0,795,796,5,117,0,0,796,797,5,101,0,0,797,156,1,
1,0,0,0,812,810,1,0,0,0,813,805,1,0,0,0,813,806,1,0,0,0,814,821, 0,0,0,798,799,5,102,0,0,799,800,5,97,0,0,800,801,5,108,0,0,801,802,
1,0,0,0,815,817,5,46,0,0,816,818,7,0,0,0,817,816,1,0,0,0,818,819, 5,115,0,0,802,803,5,101,0,0,803,158,1,0,0,0,804,805,5,110,0,0,805,
1,0,0,0,819,817,1,0,0,0,819,820,1,0,0,0,820,822,1,0,0,0,821,815, 806,5,117,0,0,806,807,5,108,0,0,807,808,5,108,0,0,808,160,1,0,0,
1,0,0,0,821,822,1,0,0,0,822,832,1,0,0,0,823,825,7,2,0,0,824,826, 0,809,810,5,45,0,0,810,811,5,62,0,0,811,162,1,0,0,0,812,813,5,58,
7,3,0,0,825,824,1,0,0,0,825,826,1,0,0,0,826,828,1,0,0,0,827,829, 0,0,813,164,1,0,0,0,814,815,5,59,0,0,815,166,1,0,0,0,816,817,5,44,
7,0,0,0,828,827,1,0,0,0,829,830,1,0,0,0,830,828,1,0,0,0,830,831, 0,0,817,168,1,0,0,0,818,819,5,46,0,0,819,170,1,0,0,0,820,821,5,123,
1,0,0,0,831,833,1,0,0,0,832,823,1,0,0,0,832,833,1,0,0,0,833,180, 0,0,821,172,1,0,0,0,822,823,5,125,0,0,823,174,1,0,0,0,824,825,5,
1,0,0,0,834,838,7,4,0,0,835,837,7,5,0,0,836,835,1,0,0,0,837,840, 91,0,0,825,176,1,0,0,0,826,827,5,93,0,0,827,178,1,0,0,0,828,829,
1,0,0,0,838,836,1,0,0,0,838,839,1,0,0,0,839,182,1,0,0,0,840,838, 5,40,0,0,829,180,1,0,0,0,830,831,5,41,0,0,831,182,1,0,0,0,832,833,
1,0,0,0,841,846,5,34,0,0,842,845,3,185,92,0,843,845,8,6,0,0,844, 5,60,0,0,833,184,1,0,0,0,834,835,5,62,0,0,835,186,1,0,0,0,836,838,
842,1,0,0,0,844,843,1,0,0,0,845,848,1,0,0,0,846,844,1,0,0,0,846, 5,45,0,0,837,836,1,0,0,0,837,838,1,0,0,0,838,840,1,0,0,0,839,841,
847,1,0,0,0,847,849,1,0,0,0,848,846,1,0,0,0,849,850,5,34,0,0,850, 7,0,0,0,840,839,1,0,0,0,841,842,1,0,0,0,842,840,1,0,0,0,842,843,
184,1,0,0,0,851,859,5,92,0,0,852,860,7,7,0,0,853,854,5,117,0,0,854, 1,0,0,0,843,188,1,0,0,0,844,846,5,45,0,0,845,844,1,0,0,0,845,846,
855,3,187,93,0,855,856,3,187,93,0,856,857,3,187,93,0,857,858,3,187, 1,0,0,0,846,855,1,0,0,0,847,856,5,48,0,0,848,852,7,1,0,0,849,851,
93,0,858,860,1,0,0,0,859,852,1,0,0,0,859,853,1,0,0,0,860,186,1,0, 7,0,0,0,850,849,1,0,0,0,851,854,1,0,0,0,852,850,1,0,0,0,852,853,
0,0,861,862,7,8,0,0,862,188,1,0,0,0,863,864,5,47,0,0,864,865,5,47, 1,0,0,0,853,856,1,0,0,0,854,852,1,0,0,0,855,847,1,0,0,0,855,848,
0,0,865,869,1,0,0,0,866,868,8,9,0,0,867,866,1,0,0,0,868,871,1,0, 1,0,0,0,856,863,1,0,0,0,857,859,5,46,0,0,858,860,7,0,0,0,859,858,
0,0,869,867,1,0,0,0,869,870,1,0,0,0,870,872,1,0,0,0,871,869,1,0, 1,0,0,0,860,861,1,0,0,0,861,859,1,0,0,0,861,862,1,0,0,0,862,864,
0,0,872,873,6,94,0,0,873,190,1,0,0,0,874,875,5,47,0,0,875,876,5, 1,0,0,0,863,857,1,0,0,0,863,864,1,0,0,0,864,874,1,0,0,0,865,867,
42,0,0,876,880,1,0,0,0,877,879,9,0,0,0,878,877,1,0,0,0,879,882,1, 7,2,0,0,866,868,7,3,0,0,867,866,1,0,0,0,867,868,1,0,0,0,868,870,
0,0,0,880,881,1,0,0,0,880,878,1,0,0,0,881,883,1,0,0,0,882,880,1, 1,0,0,0,869,871,7,0,0,0,870,869,1,0,0,0,871,872,1,0,0,0,872,870,
0,0,0,883,884,5,42,0,0,884,885,5,47,0,0,885,886,1,0,0,0,886,887, 1,0,0,0,872,873,1,0,0,0,873,875,1,0,0,0,874,865,1,0,0,0,874,875,
6,95,0,0,887,192,1,0,0,0,888,890,7,10,0,0,889,888,1,0,0,0,890,891, 1,0,0,0,875,190,1,0,0,0,876,880,7,4,0,0,877,879,7,5,0,0,878,877,
1,0,0,0,891,889,1,0,0,0,891,892,1,0,0,0,892,893,1,0,0,0,893,894, 1,0,0,0,879,882,1,0,0,0,880,878,1,0,0,0,880,881,1,0,0,0,881,192,
6,96,0,0,894,194,1,0,0,0,18,0,795,800,803,810,813,819,821,825,830, 1,0,0,0,882,880,1,0,0,0,883,888,5,34,0,0,884,887,3,195,97,0,885,
832,838,844,846,859,869,880,891,1,6,0,0 887,8,6,0,0,886,884,1,0,0,0,886,885,1,0,0,0,887,890,1,0,0,0,888,
886,1,0,0,0,888,889,1,0,0,0,889,891,1,0,0,0,890,888,1,0,0,0,891,
892,5,34,0,0,892,194,1,0,0,0,893,901,5,92,0,0,894,902,7,7,0,0,895,
896,5,117,0,0,896,897,3,197,98,0,897,898,3,197,98,0,898,899,3,197,
98,0,899,900,3,197,98,0,900,902,1,0,0,0,901,894,1,0,0,0,901,895,
1,0,0,0,902,196,1,0,0,0,903,904,7,8,0,0,904,198,1,0,0,0,905,906,
5,47,0,0,906,907,5,47,0,0,907,911,1,0,0,0,908,910,8,9,0,0,909,908,
1,0,0,0,910,913,1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,914,
1,0,0,0,913,911,1,0,0,0,914,915,6,99,0,0,915,200,1,0,0,0,916,917,
5,47,0,0,917,918,5,42,0,0,918,922,1,0,0,0,919,921,9,0,0,0,920,919,
1,0,0,0,921,924,1,0,0,0,922,923,1,0,0,0,922,920,1,0,0,0,923,925,
1,0,0,0,924,922,1,0,0,0,925,926,5,42,0,0,926,927,5,47,0,0,927,928,
1,0,0,0,928,929,6,100,0,0,929,202,1,0,0,0,930,932,7,10,0,0,931,930,
1,0,0,0,932,933,1,0,0,0,933,931,1,0,0,0,933,934,1,0,0,0,934,935,
1,0,0,0,935,936,6,101,0,0,936,204,1,0,0,0,18,0,837,842,845,852,855,
861,863,867,872,874,880,886,888,901,911,922,933,1,6,0,0
]; ];
private static __ATN: antlr.ATN; private static __ATN: antlr.ATN;
File diff suppressed because it is too large Load Diff
@@ -36,6 +36,7 @@ import { EdgeDeclContext } from "./QuixosCapabilityParser.js";
import { EdgeEndpointContext } from "./QuixosCapabilityParser.js"; import { EdgeEndpointContext } from "./QuixosCapabilityParser.js";
import { ConformanceDeclContext } from "./QuixosCapabilityParser.js"; import { ConformanceDeclContext } from "./QuixosCapabilityParser.js";
import { ConformanceItemContext } from "./QuixosCapabilityParser.js"; import { ConformanceItemContext } from "./QuixosCapabilityParser.js";
import { RelationshipMaterializationDeclContext } from "./QuixosCapabilityParser.js";
import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js"; import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js";
import { MemberOperationRefContext } from "./QuixosCapabilityParser.js"; import { MemberOperationRefContext } from "./QuixosCapabilityParser.js";
import { OperationNameContext } from "./QuixosCapabilityParser.js"; import { OperationNameContext } from "./QuixosCapabilityParser.js";
@@ -268,6 +269,12 @@ export class QuixosCapabilityVisitor<Result> extends AbstractParseTreeVisitor<Re
* @return the visitor result * @return the visitor result
*/ */
visitConformanceItem?: (ctx: ConformanceItemContext) => Result; visitConformanceItem?: (ctx: ConformanceItemContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.relationshipMaterializationDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRelationshipMaterializationDecl?: (ctx: RelationshipMaterializationDeclContext) => Result;
/** /**
* Visit a parse tree produced by `QuixosCapabilityParser.operationBindingDecl`. * Visit a parse tree produced by `QuixosCapabilityParser.operationBindingDecl`.
* @param ctx the parse tree * @param ctx the parse tree
+97 -2
View File
@@ -22,6 +22,7 @@ import {
type EdgeEndpoint, type EdgeEndpoint,
type EdgeEndpointConstraint, type EdgeEndpointConstraint,
type EdgePrimitive, type EdgePrimitive,
type EdgeTraversal,
type InterfaceMember, type InterfaceMember,
type InterfaceOperation, type InterfaceOperation,
type InterfaceOperationMode, type InterfaceOperationMode,
@@ -56,6 +57,7 @@ import { QuixosCapabilityParser,
type ValueMemberContext, type ValueMemberContext,
type ValueTypeContext, type ValueTypeContext,
type RelationshipMemberContext, type RelationshipMemberContext,
type RelationshipMaterializationDeclContext,
type WorkspaceDeclContext, type WorkspaceDeclContext,
} from "./generated/QuixosCapabilityParser.js"; } from "./generated/QuixosCapabilityParser.js";
@@ -91,6 +93,7 @@ interface InterfaceSymbol {
members: Map< members: Map<
string, string,
{ {
memberId: InterfaceMember["id"];
operations: Map<string, InterfaceOperation["id"]>; operations: Map<string, InterfaceOperation["id"]>;
} }
>; >;
@@ -556,6 +559,7 @@ const lowerInterface = (
symbol.members, symbol.members,
member.displayName, member.displayName,
{ {
memberId: member.id,
operations: new Map( operations: new Map(
member.operations.map((operation) => [operation.displayName, operation.id]), member.operations.map((operation) => [operation.displayName, operation.id]),
), ),
@@ -1003,6 +1007,34 @@ const lowerBoundDependencies = (
if (!portId) { if (!portId) {
return []; return [];
} }
const traversal = (
edgeName: string,
projectionName: string,
): EdgeTraversal | undefined => {
const attachment = requireSymbol(
state,
state.attachments,
edgeName,
entry,
"attachment",
);
if (!attachment || attachment.attachment.kind !== "edge") {
if (attachment) {
loweringIssue(state, entry, "wrong-attachment-kind", `${edgeName} is state, not an edge`);
}
return undefined;
}
const projectionId = requireSymbol(
state,
attachment.projections,
projectionName,
entry,
`projection on ${edgeName}`,
);
return projectionId
? { edgeTypeId: attachment.attachment.id, projectionId }
: undefined;
};
if (entry.STATE()) { if (entry.STATE()) {
const attachmentName = identifier(entry.identifier(1)); const attachmentName = identifier(entry.identifier(1));
const attachment = requireSymbol( const attachment = requireSymbol(
@@ -1023,9 +1055,16 @@ const lowerBoundDependencies = (
} }
return []; return [];
} }
return [{ portId, binding: { kind: "state", slotId: attachment.attachment.id } }]; const via = entry.VIA()
? traversal(identifier(entry.identifier(2)), identifier(entry.identifier(3)))
: undefined;
if (entry.VIA() && !via) return [];
return [{
portId,
binding: { kind: "state", slotId: attachment.attachment.id, ...(via ? { via } : {}) },
}];
} }
if (entry.EDGE()) { if (entry.EDGE(0)) {
const attachmentName = identifier(entry.identifier(1)); const attachmentName = identifier(entry.identifier(1));
const projectionName = identifier(entry.identifier(2)); const projectionName = identifier(entry.identifier(2));
const attachment = requireSymbol( const attachment = requireSymbol(
@@ -1053,6 +1092,10 @@ const lowerBoundDependencies = (
entry, entry,
`projection on ${attachmentName}`, `projection on ${attachmentName}`,
); );
const via = entry.VIA()
? traversal(identifier(entry.identifier(3)), identifier(entry.identifier(4)))
: undefined;
if (entry.VIA() && !via) return [];
return projectionId return projectionId
? [ ? [
{ {
@@ -1061,6 +1104,7 @@ const lowerBoundDependencies = (
kind: "edge", kind: "edge",
edgeTypeId: attachment.attachment.id, edgeTypeId: attachment.attachment.id,
projectionId, projectionId,
...(via ? { via } : {}),
}, },
}, },
] ]
@@ -1095,6 +1139,50 @@ const lowerBoundDependencies = (
}); });
}; };
const lowerRelationshipMaterialization = (
state: LoweringState,
interfaceName: string,
context: RelationshipMaterializationDeclContext,
): WorkspaceRevision["conformances"][number]["relationshipMaterializations"][number] | undefined => {
const memberName = identifier(context.identifier(0));
const member = requireSymbol(
state,
state.interfaces.get(interfaceName)?.members ?? new Map(),
memberName,
context,
`member on ${interfaceName}`,
);
const constructorAtom = requireSymbol(
state,
state.atoms,
identifier(context.identifier(1)),
context,
"constructor atom",
);
const edgeName = identifier(context.identifier(2));
const edge = requireSymbol(state, state.attachments, edgeName, context, "attachment");
if (edge && edge.attachment.kind !== "edge") {
loweringIssue(state, context, "wrong-attachment-kind", `${edgeName} is state, not an edge`);
}
const projectionId = edge?.attachment.kind === "edge"
? requireSymbol(
state,
edge.projections,
identifier(context.identifier(3)),
context,
`projection on ${edgeName}`,
)
: undefined;
return member && constructorAtom && edge?.attachment.kind === "edge" && projectionId
? {
memberId: member.memberId,
constructorAtomId: constructorAtom,
edgeTypeId: edge.attachment.id,
constructedProjectionId: projectionId,
}
: undefined;
};
const lowerConformance = ( const lowerConformance = (
state: LoweringState, state: LoweringState,
context: ConformanceDeclContext, context: ConformanceDeclContext,
@@ -1246,11 +1334,18 @@ const lowerConformance = (
] ]
: []; : [];
}); });
const relationshipMaterializations = context.conformanceItem().flatMap((item) => {
const materialization = item.relationshipMaterializationDecl();
if (!materialization) return [];
const lowered = lowerRelationshipMaterialization(state, interfaceName, materialization);
return lowered ? [lowered] : [];
});
return { return {
atomId, atomId,
interfaceRevisionId: interfaceSymbol.revisionId, interfaceRevisionId: interfaceSymbol.revisionId,
privateAttachments, privateAttachments,
operationBindings, operationBindings,
relationshipMaterializations,
}; };
}; };
+21 -1
View File
@@ -291,11 +291,12 @@ export interface PackageRevision {
} }
export type DependencyBinding = export type DependencyBinding =
| { kind: "state"; slotId: SlotId } | { kind: "state"; slotId: SlotId; via?: EdgeTraversal }
| { | {
kind: "edge"; kind: "edge";
edgeTypeId: EdgeTypeId; edgeTypeId: EdgeTypeId;
projectionId: EdgeProjectionId; projectionId: EdgeProjectionId;
via?: EdgeTraversal;
} }
| { | {
kind: "receiver-interface"; kind: "receiver-interface";
@@ -308,6 +309,24 @@ export interface BoundDependency {
binding: DependencyBinding; binding: DependencyBinding;
} }
/** Selects the object at the other end of an exactly-one relationship. */
export interface EdgeTraversal {
edgeTypeId: EdgeTypeId;
projectionId: EdgeProjectionId;
}
/**
* Provisional get-or-create recipe for a relationship implementation. The
* host projection is supplied by the relationship's resolve binding; this
* projection originates at the object constructed for the relationship.
*/
export interface RelationshipMaterialization {
memberId: MemberId;
constructorAtomId: AtomId;
edgeTypeId: EdgeTypeId;
constructedProjectionId: EdgeProjectionId;
}
export type Binding = export type Binding =
| { | {
kind: "state"; kind: "state";
@@ -337,6 +356,7 @@ export interface Conformance {
interfaceRevisionId: InterfaceRevisionId; interfaceRevisionId: InterfaceRevisionId;
privateAttachments: PersistentAttachment[]; privateAttachments: PersistentAttachment[];
operationBindings: OperationBinding[]; operationBindings: OperationBinding[];
relationshipMaterializations: RelationshipMaterialization[];
} }
export interface AtomConstructorBinding { export interface AtomConstructorBinding {
+290 -8
View File
@@ -51,6 +51,7 @@ export type CapabilityValidationIssueCode =
| "duplicate-dependency-port" | "duplicate-dependency-port"
| "duplicate-conformance" | "duplicate-conformance"
| "duplicate-operation-binding" | "duplicate-operation-binding"
| "duplicate-relationship-materialization"
| "duplicate-constructor" | "duplicate-constructor"
| "unresolved-reference" | "unresolved-reference"
| "invalid-attachment" | "invalid-attachment"
@@ -64,7 +65,8 @@ export type CapabilityValidationIssueCode =
| "cyclic-conformance-requirement" | "cyclic-conformance-requirement"
| "missing-operation-binding" | "missing-operation-binding"
| "unknown-operation-binding" | "unknown-operation-binding"
| "invalid-constructor"; | "invalid-constructor"
| "invalid-relationship-materialization";
export interface CapabilityValidationIssue { export interface CapabilityValidationIssue {
code: CapabilityValidationIssueCode; code: CapabilityValidationIssueCode;
@@ -460,6 +462,16 @@ const atomSatisfiesConstraint = (
? constraint.atomId === atomId ? constraint.atomId === atomId
: conformances.has(conformanceKey(atomId, constraint.interfaceRevisionId)); : conformances.has(conformanceKey(atomId, constraint.interfaceRevisionId));
const constraintSatisfiesConstraint = (
actual: EdgeEndpointConstraint,
required: EdgeEndpointConstraint,
conformances: ReadonlyMap<string, Conformance>,
) => constraintsEqual(actual, required) || (
actual.kind === "atom" &&
required.kind === "interface" &&
atomSatisfiesConstraint(actual.atomId, required, conformances)
);
const canAccessAttachment = ( const canAccessAttachment = (
owner: AttachmentOwner, owner: AttachmentOwner,
conformance: Pick<Conformance, "atomId" | "interfaceRevisionId"> | undefined, conformance: Pick<Conformance, "atomId" | "interfaceRevisionId"> | undefined,
@@ -958,6 +970,52 @@ const validateAttachmentAccess = (
return true; return true;
}; };
const validateTraversal = (
issues: CapabilityValidationIssue[],
indexes: ValidationIndexes,
atomId: AtomId,
traversal: { edgeTypeId: EdgeTypeId; projectionId: EdgeProjectionId },
path: string,
) => {
const attachment = findAttachment(indexes, "edge", traversal.edgeTypeId);
if (!attachment || attachment.attachment.kind !== "edge") {
issue(
issues,
"invalid-dependency-binding",
`${path}.edgeTypeId`,
`Unknown traversal edge ${traversal.edgeTypeId}`,
);
return undefined;
}
const projection = edgeProjection(attachment.attachment, traversal.projectionId);
if (!projection) {
issue(
issues,
"invalid-dependency-binding",
`${path}.projectionId`,
`Traversal projection ${traversal.projectionId} is not on edge ${traversal.edgeTypeId}`,
);
return undefined;
}
if (!atomSatisfiesConstraint(atomId, projection.endpoint.constraint, indexes.conformances)) {
issue(
issues,
"invalid-dependency-binding",
`${path}.projectionId`,
`Traversal projection ${traversal.projectionId} cannot originate at receiver atom ${atomId}`,
);
}
if (projection.endpoint.cardinality !== "exactly-one") {
issue(
issues,
"invalid-dependency-binding",
`${path}.projectionId`,
"Dependency traversal must select exactly one object",
);
}
return projection;
};
const validateBoundDependencies = ( const validateBoundDependencies = (
issues: CapabilityValidationIssue[], issues: CapabilityValidationIssue[],
params: { params: {
@@ -1020,12 +1078,31 @@ const validateBoundDependencies = (
break; break;
} }
validateAttachmentAccess(issues, attachment, params.conformance, `${path}.binding.slotId`); validateAttachmentAccess(issues, attachment, params.conformance, `${path}.binding.slotId`);
if (attachment.attachment.attachedTo !== params.atomId) { const traversal = stateBinding.via
? validateTraversal(
issues,
params.indexes,
params.atomId,
stateBinding.via,
`${path}.binding.via`,
)
: undefined;
if (
stateBinding.via
? traversal && !atomSatisfiesConstraint(
attachment.attachment.attachedTo,
traversal.target.constraint,
params.indexes.conformances,
)
: attachment.attachment.attachedTo !== params.atomId
) {
issue( issue(
issues, issues,
"invalid-dependency-binding", "invalid-dependency-binding",
`${path}.binding.slotId`, `${path}.binding.slotId`,
`State ${stateBinding.slotId} is not attached to receiver atom ${params.atomId}`, stateBinding.via
? `State ${stateBinding.slotId} is not attached to the traversal target`
: `State ${stateBinding.slotId} is not attached to receiver atom ${params.atomId}`,
); );
} }
if (!valueTypesEqual(requirement.valueType, attachment.attachment.valueType)) { if (!valueTypesEqual(requirement.valueType, attachment.attachment.valueType)) {
@@ -1061,16 +1138,46 @@ const validateBoundDependencies = (
); );
break; break;
} }
if (!atomSatisfiesConstraint(params.atomId, projection.endpoint.constraint, params.indexes.conformances)) { const traversal = edgeBinding.via
? validateTraversal(
issues,
params.indexes,
params.atomId,
edgeBinding.via,
`${path}.binding.via`,
)
: undefined;
const originMatches = edgeBinding.via
? traversal && (
projection.endpoint.constraint.kind === "atom"
? atomSatisfiesConstraint(
projection.endpoint.constraint.atomId,
traversal.target.constraint,
params.indexes.conformances,
)
: constraintsEqual(projection.endpoint.constraint, traversal.target.constraint)
)
: atomSatisfiesConstraint(
params.atomId,
projection.endpoint.constraint,
params.indexes.conformances,
);
if (!originMatches) {
issue( issue(
issues, issues,
"invalid-dependency-binding", "invalid-dependency-binding",
`${path}.binding.projectionId`, `${path}.binding.projectionId`,
`Projection ${edgeBinding.projectionId} cannot originate at receiver atom ${params.atomId}`, edgeBinding.via
? `Projection ${edgeBinding.projectionId} cannot originate at the traversal target`
: `Projection ${edgeBinding.projectionId} cannot originate at receiver atom ${params.atomId}`,
); );
} }
if ( if (
!constraintsEqual(requirement.target, projection.target.constraint) || !constraintSatisfiesConstraint(
projection.target.constraint,
requirement.target,
params.indexes.conformances,
) ||
requirement.cardinality !== projection.endpoint.cardinality requirement.cardinality !== projection.endpoint.cardinality
) { ) {
issue( issue(
@@ -1290,8 +1397,21 @@ const validateConformances = (
} }
validateAttachmentAccess(issues, attachment, conformance, `${bindingPath}.binding.edgeTypeId`); validateAttachmentAccess(issues, attachment, conformance, `${bindingPath}.binding.edgeTypeId`);
const projection = edgeProjection(attachment.attachment, binding.projectionId); const projection = edgeProjection(attachment.attachment, binding.projectionId);
const relationshipMember = operationEntry.member.kind === "relationship"
? operationEntry.member
: undefined;
const operationEdge = relationshipMember
? {
...attachment.attachment,
endpoints: attachment.attachment.endpoints.map((endpoint, index) =>
index === (projection?.endpointIndex === 0 ? 1 : 0)
? { ...endpoint, constraint: relationshipMember.target }
: endpoint,
) as [EdgeEndpoint, EdgeEndpoint],
}
: attachment.attachment;
const expected = edgePrimitiveSignature( const expected = edgePrimitiveSignature(
attachment.attachment, operationEdge,
binding.projectionId, binding.projectionId,
binding.primitive, binding.primitive,
); );
@@ -1320,7 +1440,11 @@ const validateConformances = (
"Edge primitives may only implement relationship members", "Edge primitives may only implement relationship members",
); );
} else if ( } else if (
!constraintsEqual(operationEntry.member.target, projection.target.constraint) || !constraintSatisfiesConstraint(
projection.target.constraint,
operationEntry.member.target,
indexes.conformances,
) ||
operationEntry.member.cardinality !== projection.endpoint.cardinality operationEntry.member.cardinality !== projection.endpoint.cardinality
) { ) {
issue( issue(
@@ -1398,6 +1522,148 @@ const validateConformances = (
}); });
} }
const materializedMembers = new Set<string>();
for (const [materializationIndex, materialization] of
(conformance.relationshipMaterializations ?? []).entries()) {
const materializationPath =
`${path}.relationshipMaterializations[${materializationIndex}]`;
if (materializedMembers.has(materialization.memberId)) {
issue(
issues,
"duplicate-relationship-materialization",
materializationPath,
`Relationship ${materialization.memberId} has more than one materialization recipe`,
);
continue;
}
materializedMembers.add(materialization.memberId);
const member = interfaceEntry.revision.members.find((entry) =>
entry.id === materialization.memberId);
if (!member || member.kind !== "relationship") {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.memberId`,
`Member ${materialization.memberId} is not a relationship on ${conformance.interfaceRevisionId}`,
);
continue;
}
if (member.cardinality !== "optional-one") {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.memberId`,
"A lazily constructed relationship must be optional-one before construction",
);
}
const resolveOperation = member.operations.find((entry) =>
entry.displayName === "resolve");
const resolveBinding = resolveOperation
? bindings.get(resolveOperation.id)
: undefined;
if (!resolveBinding || resolveBinding.kind !== "edge") {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.memberId`,
"A materialized relationship must bind its resolve operation to an edge",
);
continue;
}
if (resolveBinding.edgeTypeId !== materialization.edgeTypeId) {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.edgeTypeId`,
"Materialization and relationship resolution must use the same edge",
);
}
const attachment = findAttachment(indexes, "edge", materialization.edgeTypeId);
if (!attachment || attachment.attachment.kind !== "edge") {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.edgeTypeId`,
`Unknown materialization edge ${materialization.edgeTypeId}`,
);
continue;
}
validateAttachmentAccess(
issues,
attachment,
conformance,
`${materializationPath}.edgeTypeId`,
);
const hostProjection = edgeProjection(
attachment.attachment,
resolveBinding.projectionId,
);
const constructedProjection = edgeProjection(
attachment.attachment,
materialization.constructedProjectionId,
);
if (!hostProjection || !constructedProjection ||
hostProjection.endpointIndex === constructedProjection.endpointIndex) {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.constructedProjectionId`,
"Materialization must connect through the opposite projection of the resolved edge",
);
continue;
}
if (!atomSatisfiesConstraint(
materialization.constructorAtomId,
member.target,
indexes.conformances,
)) {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.constructorAtomId`,
`Constructed atom ${materialization.constructorAtomId} does not satisfy the relationship target`,
);
}
if (!atomSatisfiesConstraint(
materialization.constructorAtomId,
constructedProjection.endpoint.constraint,
indexes.conformances,
) || !atomSatisfiesConstraint(
conformance.atomId,
constructedProjection.target.constraint,
indexes.conformances,
)) {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.constructedProjectionId`,
"Constructed projection does not connect the constructed atom back to the host atom",
);
}
const constructor = indexes.constructors.get(materialization.constructorAtomId);
const constructorExport = constructor
? indexes.packages.get(constructor.packageRevisionId)?.exports.get(constructor.exportId)
: undefined;
if (!constructor || !constructorExport || constructorExport.kind !== "constructor") {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.constructorAtomId`,
`Constructed atom ${materialization.constructorAtomId} has no valid constructor`,
);
} else if (!valueTypesEqual(
constructorExport.inputType,
valueType.atomRef(conformance.atomId),
)) {
issue(
issues,
"invalid-relationship-materialization",
`${materializationPath}.constructorAtomId`,
`Component constructor must accept ${typeLabel(valueType.atomRef(conformance.atomId))}`,
);
}
}
for (const operation of interfaceEntry.operations.values()) { for (const operation of interfaceEntry.operations.values()) {
if (!bindings.has(operation.operation.id)) { if (!bindings.has(operation.operation.id)) {
issue( issue(
@@ -1714,9 +1980,15 @@ export const computeCapabilityClosure = (
switch (dependency.binding.kind) { switch (dependency.binding.kind) {
case "state": case "state":
attachments.add(dependency.binding.slotId); attachments.add(dependency.binding.slotId);
if (dependency.binding.via) {
attachments.add(dependency.binding.via.edgeTypeId);
}
break; break;
case "edge": case "edge":
attachments.add(dependency.binding.edgeTypeId); attachments.add(dependency.binding.edgeTypeId);
if (dependency.binding.via) {
attachments.add(dependency.binding.via.edgeTypeId);
}
break; break;
case "receiver-interface": case "receiver-interface":
queued.push({ queued.push({
@@ -1772,6 +2044,16 @@ export const computeCapabilityClosure = (
} }
} }
} }
for (const materialization of
conformance.source.relationshipMaterializations ?? []) {
attachments.add(materialization.edgeTypeId);
constructors.add(materialization.constructorAtomId);
const constructor = plan.constructors.get(materialization.constructorAtomId);
if (constructor) {
packages.add(constructor.packageRevisionId);
includeDependencies(materialization.constructorAtomId, constructor.dependencies);
}
}
} }
return { return {
+74 -17
View File
@@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/orch.proto. * Describes the file quixos/orch.proto.
*/ */
export const file_quixos_orch: GenFile = /*@__PURE__*/ export const file_quixos_orch: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCLUAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpgBChhJbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi4wEKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0ImcKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0ynwYKE09yY2hlc3RyYXRvclJ1bnRpbWUSXwoQSW52b2tlQ2FwYWJpbGl0eRIkLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlElsKD1dhdGNoQ2FwYWJpbGl0eRIjLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlFdmVudDABElwKD0NvbnN0cnVjdE9iamVjdBIjLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QaJC5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]); fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLUAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpgBChhJbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi4wEKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0ImcKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yrgcKE09yY2hlc3RyYXRvclJ1bnRpbWUSXwoQSW52b2tlQ2FwYWJpbGl0eRIkLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlElsKD1dhdGNoQ2FwYWJpbGl0eRIjLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlFdmVudDABElwKD0NvbnN0cnVjdE9iamVjdBIjLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QaJC5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXNwb25zZRKMAQofUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdBIzLnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXF1ZXN0GjQucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlElMKDEdldFdvcmtzcGFjZRIgLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXNwb25zZRJxChZMaXN0UGFja2FnZURlc2NyaXB0b3JzEioucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QaKy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVzcG9uc2USaAoTTGlzdFBhY2thZ2VSdW50aW1lcxInLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0GigucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1Jlc3BvbnNlElwKD0xpc3RBY3RpdmF0aW9ucxIjLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QaJC5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXNwb25zZRJcCg9DbG9zZUFjdGl2YXRpb24SIy5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXF1ZXN0GiQucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVzcG9uc2ViBnByb3RvMw", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]);
/** /**
* @generated from message quixos.orch.ConstructObjectRequest * @generated from message quixos.orch.ConstructObjectRequest
@@ -59,6 +59,55 @@ export type ConstructObjectResponse = Message<"quixos.orch.ConstructObjectRespon
export const ConstructObjectResponseSchema: GenMessage<ConstructObjectResponse> = /*@__PURE__*/ export const ConstructObjectResponseSchema: GenMessage<ConstructObjectResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 1); messageDesc(file_quixos_orch, 1);
/**
* @generated from message quixos.orch.ResolveOrConstructRelatedObjectRequest
*/
export type ResolveOrConstructRelatedObjectRequest = Message<"quixos.orch.ResolveOrConstructRelatedObjectRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
/**
* @generated from field: string interface_revision_id = 2;
*/
interfaceRevisionId: string;
/**
* @generated from field: string member_id = 3;
*/
memberId: string;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectRequest.
* Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectRequestSchema: GenMessage<ResolveOrConstructRelatedObjectRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 2);
/**
* @generated from message quixos.orch.ResolveOrConstructRelatedObjectResponse
*/
export type ResolveOrConstructRelatedObjectResponse = Message<"quixos.orch.ResolveOrConstructRelatedObjectResponse"> & {
/**
* @generated from field: camino.CaminoObject object = 1;
*/
object?: CaminoObject | undefined;
/**
* @generated from field: bool constructed = 2;
*/
constructed: boolean;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectResponse.
* Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectResponseSchema: GenMessage<ResolveOrConstructRelatedObjectResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 3);
/** /**
* @generated from message quixos.orch.InvokeCapabilityRequest * @generated from message quixos.orch.InvokeCapabilityRequest
*/ */
@@ -84,7 +133,7 @@ export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityReque
* Use `create(InvokeCapabilityRequestSchema)` to create a new message. * Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/ */
export const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest> = /*@__PURE__*/ export const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 2); messageDesc(file_quixos_orch, 4);
/** /**
* @generated from message quixos.orch.InvokeCapabilityResponse * @generated from message quixos.orch.InvokeCapabilityResponse
@@ -121,7 +170,7 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp
* Use `create(InvokeCapabilityResponseSchema)` to create a new message. * Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/ */
export const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse> = /*@__PURE__*/ export const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 3); messageDesc(file_quixos_orch, 5);
/** /**
* @generated from message quixos.orch.WatchCapabilityRequest * @generated from message quixos.orch.WatchCapabilityRequest
@@ -148,7 +197,7 @@ export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest
* Use `create(WatchCapabilityRequestSchema)` to create a new message. * Use `create(WatchCapabilityRequestSchema)` to create a new message.
*/ */
export const WatchCapabilityRequestSchema: GenMessage<WatchCapabilityRequest> = /*@__PURE__*/ export const WatchCapabilityRequestSchema: GenMessage<WatchCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 4); messageDesc(file_quixos_orch, 6);
/** /**
* @generated from message quixos.orch.WatchCapabilityEvent * @generated from message quixos.orch.WatchCapabilityEvent
@@ -195,7 +244,7 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> &
* Use `create(WatchCapabilityEventSchema)` to create a new message. * Use `create(WatchCapabilityEventSchema)` to create a new message.
*/ */
export const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent> = /*@__PURE__*/ export const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent> = /*@__PURE__*/
messageDesc(file_quixos_orch, 5); messageDesc(file_quixos_orch, 7);
/** /**
* @generated from message quixos.orch.GetWorkspaceRequest * @generated from message quixos.orch.GetWorkspaceRequest
@@ -208,7 +257,7 @@ export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & {
* Use `create(GetWorkspaceRequestSchema)` to create a new message. * Use `create(GetWorkspaceRequestSchema)` to create a new message.
*/ */
export const GetWorkspaceRequestSchema: GenMessage<GetWorkspaceRequest> = /*@__PURE__*/ export const GetWorkspaceRequestSchema: GenMessage<GetWorkspaceRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 6); messageDesc(file_quixos_orch, 8);
/** /**
* @generated from message quixos.orch.GetWorkspaceResponse * @generated from message quixos.orch.GetWorkspaceResponse
@@ -235,7 +284,7 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> &
* Use `create(GetWorkspaceResponseSchema)` to create a new message. * Use `create(GetWorkspaceResponseSchema)` to create a new message.
*/ */
export const GetWorkspaceResponseSchema: GenMessage<GetWorkspaceResponse> = /*@__PURE__*/ export const GetWorkspaceResponseSchema: GenMessage<GetWorkspaceResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 7); messageDesc(file_quixos_orch, 9);
/** /**
* @generated from message quixos.orch.ListActivationsRequest * @generated from message quixos.orch.ListActivationsRequest
@@ -248,7 +297,7 @@ export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest
* Use `create(ListActivationsRequestSchema)` to create a new message. * Use `create(ListActivationsRequestSchema)` to create a new message.
*/ */
export const ListActivationsRequestSchema: GenMessage<ListActivationsRequest> = /*@__PURE__*/ export const ListActivationsRequestSchema: GenMessage<ListActivationsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 8); messageDesc(file_quixos_orch, 10);
/** /**
* @generated from message quixos.orch.ListPackageDescriptorsRequest * @generated from message quixos.orch.ListPackageDescriptorsRequest
@@ -261,7 +310,7 @@ export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDesc
* Use `create(ListPackageDescriptorsRequestSchema)` to create a new message. * Use `create(ListPackageDescriptorsRequestSchema)` to create a new message.
*/ */
export const ListPackageDescriptorsRequestSchema: GenMessage<ListPackageDescriptorsRequest> = /*@__PURE__*/ export const ListPackageDescriptorsRequestSchema: GenMessage<ListPackageDescriptorsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 9); messageDesc(file_quixos_orch, 11);
/** /**
* @generated from message quixos.orch.ListPackageDescriptorsResponse * @generated from message quixos.orch.ListPackageDescriptorsResponse
@@ -278,7 +327,7 @@ export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDes
* Use `create(ListPackageDescriptorsResponseSchema)` to create a new message. * Use `create(ListPackageDescriptorsResponseSchema)` to create a new message.
*/ */
export const ListPackageDescriptorsResponseSchema: GenMessage<ListPackageDescriptorsResponse> = /*@__PURE__*/ export const ListPackageDescriptorsResponseSchema: GenMessage<ListPackageDescriptorsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 10); messageDesc(file_quixos_orch, 12);
/** /**
* @generated from message quixos.orch.ListPackageRuntimesRequest * @generated from message quixos.orch.ListPackageRuntimesRequest
@@ -291,7 +340,7 @@ export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntime
* Use `create(ListPackageRuntimesRequestSchema)` to create a new message. * Use `create(ListPackageRuntimesRequestSchema)` to create a new message.
*/ */
export const ListPackageRuntimesRequestSchema: GenMessage<ListPackageRuntimesRequest> = /*@__PURE__*/ export const ListPackageRuntimesRequestSchema: GenMessage<ListPackageRuntimesRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 11); messageDesc(file_quixos_orch, 13);
/** /**
* @generated from message quixos.orch.ListPackageRuntimesResponse * @generated from message quixos.orch.ListPackageRuntimesResponse
@@ -308,7 +357,7 @@ export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntim
* Use `create(ListPackageRuntimesResponseSchema)` to create a new message. * Use `create(ListPackageRuntimesResponseSchema)` to create a new message.
*/ */
export const ListPackageRuntimesResponseSchema: GenMessage<ListPackageRuntimesResponse> = /*@__PURE__*/ export const ListPackageRuntimesResponseSchema: GenMessage<ListPackageRuntimesResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 12); messageDesc(file_quixos_orch, 14);
/** /**
* @generated from message quixos.orch.ListActivationsResponse * @generated from message quixos.orch.ListActivationsResponse
@@ -325,7 +374,7 @@ export type ListActivationsResponse = Message<"quixos.orch.ListActivationsRespon
* Use `create(ListActivationsResponseSchema)` to create a new message. * Use `create(ListActivationsResponseSchema)` to create a new message.
*/ */
export const ListActivationsResponseSchema: GenMessage<ListActivationsResponse> = /*@__PURE__*/ export const ListActivationsResponseSchema: GenMessage<ListActivationsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 13); messageDesc(file_quixos_orch, 15);
/** /**
* @generated from message quixos.orch.CloseActivationRequest * @generated from message quixos.orch.CloseActivationRequest
@@ -347,7 +396,7 @@ export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest
* Use `create(CloseActivationRequestSchema)` to create a new message. * Use `create(CloseActivationRequestSchema)` to create a new message.
*/ */
export const CloseActivationRequestSchema: GenMessage<CloseActivationRequest> = /*@__PURE__*/ export const CloseActivationRequestSchema: GenMessage<CloseActivationRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 14); messageDesc(file_quixos_orch, 16);
/** /**
* @generated from message quixos.orch.CloseActivationResponse * @generated from message quixos.orch.CloseActivationResponse
@@ -364,7 +413,7 @@ export type CloseActivationResponse = Message<"quixos.orch.CloseActivationRespon
* Use `create(CloseActivationResponseSchema)` to create a new message. * Use `create(CloseActivationResponseSchema)` to create a new message.
*/ */
export const CloseActivationResponseSchema: GenMessage<CloseActivationResponse> = /*@__PURE__*/ export const CloseActivationResponseSchema: GenMessage<CloseActivationResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 15); messageDesc(file_quixos_orch, 17);
/** /**
* @generated from message quixos.orch.Activation * @generated from message quixos.orch.Activation
@@ -426,7 +475,7 @@ export type Activation = Message<"quixos.orch.Activation"> & {
* Use `create(ActivationSchema)` to create a new message. * Use `create(ActivationSchema)` to create a new message.
*/ */
export const ActivationSchema: GenMessage<Activation> = /*@__PURE__*/ export const ActivationSchema: GenMessage<Activation> = /*@__PURE__*/
messageDesc(file_quixos_orch, 16); messageDesc(file_quixos_orch, 18);
/** /**
* @generated from message quixos.orch.PackageRuntimeStatus * @generated from message quixos.orch.PackageRuntimeStatus
@@ -498,7 +547,7 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> &
* Use `create(PackageRuntimeStatusSchema)` to create a new message. * Use `create(PackageRuntimeStatusSchema)` to create a new message.
*/ */
export const PackageRuntimeStatusSchema: GenMessage<PackageRuntimeStatus> = /*@__PURE__*/ export const PackageRuntimeStatusSchema: GenMessage<PackageRuntimeStatus> = /*@__PURE__*/
messageDesc(file_quixos_orch, 17); messageDesc(file_quixos_orch, 19);
/** /**
* @generated from service quixos.orch.OrchestratorRuntime * @generated from service quixos.orch.OrchestratorRuntime
@@ -528,6 +577,14 @@ export const OrchestratorRuntime: GenService<{
input: typeof ConstructObjectRequestSchema; input: typeof ConstructObjectRequestSchema;
output: typeof ConstructObjectResponseSchema; output: typeof ConstructObjectResponseSchema;
}, },
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ResolveOrConstructRelatedObject
*/
resolveOrConstructRelatedObject: {
methodKind: "unary";
input: typeof ResolveOrConstructRelatedObjectRequestSchema;
output: typeof ResolveOrConstructRelatedObjectResponseSchema;
},
/** /**
* @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace * @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace
*/ */
+9 -1
View File
@@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/refs.proto. * Describes the file quixos/refs.proto.
*/ */
export const file_quixos_refs: GenFile = /*@__PURE__*/ export const file_quixos_refs: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIroBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIAEIJCgdiaW5kaW5nIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM"); fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIs0BChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z");
/** /**
* @generated from message quixos.CapabilityRef * @generated from message quixos.CapabilityRef
@@ -93,6 +93,14 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & {
value: string; value: string;
case: "constructorAtomId"; case: "constructorAtomId";
} | { case: undefined; value?: undefined }; } | { case: undefined; value?: undefined };
/**
* Defaults to the invocation receiver. A checked dependency traversal can
* select a related object explicitly before the package runtime starts.
*
* @generated from field: string object_id = 6;
*/
objectId: string;
}; };
/** /**
+55
View File
@@ -1,4 +1,6 @@
import assert from "node:assert/strict"; import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import { test } from "node:test"; import { test } from "node:test";
import { compileCapabilitySource } from "../src/capability-language/index.js"; import { compileCapabilitySource } from "../src/capability-language/index.js";
import { import {
@@ -146,3 +148,56 @@ test("well-formed but invalid programs report semantic paths", () => {
assert.equal(diagnostic.phase, "validation"); assert.equal(diagnostic.phase, "validation");
assert.ok(diagnostic.path?.includes("operationBindings")); assert.ok(diagnostic.path?.includes("operationBindings"));
}); });
test("Web Studio sidecars declare lazy materialization and checked cross-object ports", () => {
const source = readFileSync(
resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"),
"utf8",
);
const result = compileCapabilitySource(source, "web-studio.capabilities.qx");
assert.equal(result.ok, true);
if (!result.ok) return;
const host = result.workspace.conformances.find((entry) =>
entry.atomId === "atom:project" &&
entry.interfaceRevisionId === "interface:org.quixos.web-studio.has-react-component@1"
);
assert.deepEqual(host?.relationshipMaterializations, [{
memberId: "member:org.quixos.web-studio.has-react-component:component",
constructorAtomId: "atom:project-component",
edgeTypeId: "edge:project:component",
constructedProjectionId: "projection:component:subject",
}]);
const component = result.workspace.conformances.find((entry) =>
entry.atomId === "atom:project-component"
);
const binding = component?.operationBindings[0]?.binding;
assert.equal(binding?.kind, "package");
if (binding?.kind !== "package") return;
assert.deepEqual(binding.dependencies[1]?.binding, {
kind: "state",
slotId: "slot:project:name",
via: {
edgeTypeId: "edge:project:component",
projectionId: "projection:component:subject",
},
});
});
test("relationship materializers require a constructor from the host atom", () => {
const source = readFileSync(
resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"),
"utf8",
).replace(
"constructs ProjectComponent : atom-ref<Project>;",
"constructs ProjectComponent : unit;",
);
const result = compileCapabilitySource(source, "invalid-materializer.qx");
assert.equal(result.ok, false);
if (result.ok) return;
assert.ok(result.diagnostics.some((entry) =>
entry.code === "invalid-relationship-materialization" &&
entry.message.includes("must accept")
));
});
+53
View File
@@ -0,0 +1,53 @@
workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace:web-studio-fixture@1" commit "1111111111111111111111111111111111111111" {
atom Project id "atom:project";
atom ProjectComponent id "atom:project-component";
interface ReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" source {
repository "https://repos.quixos.org/org-quixos-web-studio/interface-react-component.git";
commit "2222222222222222222222222222222222222222";
} {
value props id "member:org.quixos.web-studio.react-component:props" : string {
get id "operation:org.quixos.web-studio.react-component:props:get";
}
}
interface HasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" source {
repository "https://repos.quixos.org/org-quixos-web-studio/interface-has-react-component.git";
commit "3333333333333333333333333333333333333333";
} {
relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface ReactComponent {
resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve";
}
}
package ComponentRuntime id "package:component-runtime" revision "package:component-runtime@1" source {
repository "https://repos.quixos.org/quixos-test/package-component-runtime.git";
commit "4444444444444444444444444444444444444444";
} {
constructor createComponent id "export:component-runtime:create-component" constructs ProjectComponent : atom-ref<Project>;
operation propsGet id "export:component-runtime:props-get" : unit -> string mode call receiver atom ProjectComponent requires {
edge subject id "port:component:subject" : exactly-one atom Project [resolve];
state projectName id "port:component:project-name" : string [read];
};
}
shared state ProjectName id "slot:project:name" on Project : string
policy optimistic-register default "Untitled project";
shared edge ProjectComponentEdge id "edge:project:component" {
atom ProjectComponent projection subject id "projection:component:subject" exactly-one;
atom Project projection component id "projection:project:component" optional-one;
}
conform Project as HasReactComponent {
bind component.resolve to edge ProjectComponentEdge.component.resolve;
materialize component if absent using constructor ProjectComponent via edge ProjectComponentEdge.subject;
}
conform ProjectComponent as ReactComponent {
bind props.get to package ComponentRuntime.propsGet with {
subject to edge ProjectComponentEdge.subject;
projectName to state ProjectName via edge ProjectComponentEdge.subject;
};
}
constructor ProjectComponent to ComponentRuntime.createComponent;
}