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
This commit is contained in:
2026-09-03 15:46:52 -07:00
parent 3c2e4a7e85
commit f4987093f6
57 changed files with 14878 additions and 2788 deletions
File diff suppressed because one or more lines are too long
+24
View File
@@ -0,0 +1,24 @@
enableScripts: true
generateDefaultNix: false
individualNixPackaging: true
nodeLinker: node-modules
supportedArchitectures:
os:
- current
- linux
cpu:
- current
- x64
- arm64
libc:
- current
- glibc
plugins:
- checksum: 271de9a785321a37c564b8e2a6b5cd689850b20572d5fee8ec0a6b8e7a5d4cfb59e533524af2b4a537e00da12828abd062eaec6978556e3dd9149a020db2591b
path: .yarn/plugins/yarn-plugin-nixify.cjs
spec: "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js"
+62 -6
View File
@@ -1,8 +1,64 @@
# Quixos Protocol
# Quixos protocol and capability compiler
Shared protobuf definitions for Camino, quixos-orch, package descriptors, and
future package runtime RPC.
This package owns the shared protobuf APIs for Camino, `quixos-orch`, package
runtimes, package descriptors, and generic runtime values. It also owns the v1
capability authoring language and semantic compiler.
This package owns the canonical proto source. Current services still generate
local TypeScript bindings from these protos; the generated bindings here are
available for later consolidation.
## Capability language
The grammar is `grammar/QuixosCapability.g4`. The parser lowers source into the
parser-independent records in `src/capability-model`; validation then produces
an immutable checked workspace JSON document. Runtime semantics do not depend
on parse-tree shapes or declaration order.
```sh
nix develop
quixos-capability-compile ../quixos-instance/workspaces/todo.capabilities.qx
```
The compiler validates exact identities, interface operation coverage,
attachment ownership, native state/edge providers, package receiver and
dependency-port requirements, constructors, and the exact runtime closure.
Generics, interface composition, declarative forwarding, automatic
relationship materialization, and first-class bundles are intentionally absent
from v1.
## Repository locks
Every workspace, interface, and package repository carries a `quixos.lock`.
It pins the exact Quixos toolchain revision plus exact Git sources for imported
interfaces and packages. The v1 Git source is deliberately only a repository
URL and full commit ID; the publisher-owned reachability tag and Nix fetch
details are derived from those values.
```sh
quixos-lock-check quixos.lock
qx resource publish
```
The second command runs from a jj checkout. It validates the lock, snapshots
the current working-copy commit, and pushes the immutable tag
`refs/tags/quixos-reachability/<commit>` without advancing an authoring
bookmark.
## Package descriptors
Executable package metadata remains protobuf text format:
```sh
quixos-descriptor-check path/to/descriptor.quixos-package.txtpb
```
Descriptors identify exact package revisions and exported runtime symbols.
The checked workspace binds interface operations to those exports and supplies
their exact dependency ports.
## Tests
```sh
nix develop -c yarn test
```
The suite covers parsing/diagnostics, source-order independence, ordinary call
operations, semantic validation, exact closure/tree-shaking, private and shared
attachments, package port injection, and constructors.
+43 -13
View File
@@ -10,26 +10,40 @@
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
quixos-protocol = pkgs.stdenvNoCC.mkDerivation {
pname = "quixos-protocol";
version = "0.1.0";
src = ./.;
npmDeps = pkgs.importNpmLock { npmRoot = ./.; };
npmConfigHook = pkgs.importNpmLock.npmConfigHook;
nativeBuildInputs = [
pkgs.importNpmLock.npmConfigHook
pkgs.nodejs_24
nodejs = pkgs.nodejs_24;
quixos-protocol = (pkgs.callPackage ./yarn-project.nix { inherit nodejs; }) {
src = pkgs.lib.cleanSource ./.;
overrideAttrs = old: {
nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [
pkgs.esbuild
pkgs.protobuf
];
buildPhase = ''
runHook preBuild
export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:$PWD/proto''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}"
npm run build
patchShebangs node_modules/.bin node_modules/@bufbuild/protoc-gen-es/bin
yarn build
esbuild dist/src/descriptor-check.js \
--bundle --platform=node --target=node24 --format=esm \
--outfile=quixos-descriptor-check.mjs
esbuild dist/src/capability-language/cli.js \
--bundle --platform=node --target=node24 --format=esm \
--outfile=quixos-capability-compile.mjs
esbuild dist/src/resource-lock/cli.js \
--bundle --platform=node --target=node24 --format=esm \
--outfile=quixos-lock-check.mjs
runHook postBuild
'';
doCheck = true;
checkPhase = ''
runHook preCheck
yarn test
runHook postCheck
'';
installPhase = ''
runHook preInstall
mkdir -p "$out"
cp --reflink=auto --recursive grammar "$out/grammar"
cp --reflink=auto --recursive proto "$out/proto"
cp --reflink=auto --recursive dist "$out/dist"
cp package.json "$out/package.json"
@@ -38,19 +52,35 @@
#!/bin/sh
export PATH="${pkgs.protobuf}/bin:\$PATH"
export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:$out/proto\''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}"
exec ${pkgs.nodejs_24}/bin/node "$out/dist/src/descriptor-check.js" "\$@"
exec ${pkgs.nodejs_24}/bin/node "$out/libexec/quixos-protocol/quixos-descriptor-check.mjs" "\$@"
EOF
chmod +x "$out/bin/quixos-descriptor-check"
cat > "$out/bin/quixos-capability-compile" <<EOF
#!/bin/sh
exec ${pkgs.nodejs_24}/bin/node "$out/libexec/quixos-protocol/quixos-capability-compile.mjs" "\$@"
EOF
chmod +x "$out/bin/quixos-capability-compile"
cat > "$out/bin/quixos-lock-check" <<EOF
#!/bin/sh
exec ${pkgs.nodejs_24}/bin/node "$out/libexec/quixos-protocol/quixos-lock-check.mjs" "\$@"
EOF
chmod +x "$out/bin/quixos-lock-check"
mkdir -p "$out/libexec/quixos-protocol"
install -m644 quixos-descriptor-check.mjs "$out/libexec/quixos-protocol/quixos-descriptor-check.mjs"
install -m644 quixos-capability-compile.mjs "$out/libexec/quixos-protocol/quixos-capability-compile.mjs"
install -m644 quixos-lock-check.mjs "$out/libexec/quixos-protocol/quixos-lock-check.mjs"
runHook postInstall
'';
};
};
in {
packages.default = quixos-protocol;
checks.default = quixos-protocol;
devShells.default = pkgs.mkShell {
packages = [
pkgs.nodejs_24
nodejs
pkgs.protobuf
pkgs.typescript
quixos-protocol.yarn-freestanding
quixos-protocol
];
shellHook = ''
+403
View File
@@ -0,0 +1,403 @@
grammar QuixosCapability;
document
: workspaceDecl EOF
;
workspaceDecl
: WORKSPACE identifier ID stringLiteral REVISION stringLiteral COMMIT stringLiteral
LBRACE workspaceItem* RBRACE
;
workspaceItem
: atomDecl
| interfaceDecl
| packageDecl
| sharedAttachmentDecl
| conformanceDecl
| constructorBindingDecl
;
atomDecl
: ATOM identifier ID stringLiteral (DOC stringLiteral)? SEMI
;
interfaceDecl
: INTERFACE identifier ID stringLiteral REVISION stringLiteral sourceBlock
LBRACE interfaceMember* RBRACE
;
sourceBlock
: SOURCE LBRACE
REPOSITORY stringLiteral SEMI
COMMIT stringLiteral SEMI
RBRACE
;
interfaceMember
: valueMember
| relationshipMember
| operationMember
;
operationMember
: OPERATION identifier ID stringLiteral COLON valueType ARROW valueType
LBRACE CALL ID stringLiteral SEMI RBRACE
;
valueMember
: VALUE identifier ID stringLiteral COLON valueType
LBRACE valueMemberOperation* RBRACE
;
valueMemberOperation
: GET ID stringLiteral SEMI
| SET ID stringLiteral SEMI
| WATCH START ID stringLiteral STOP ID stringLiteral SEMI
;
relationshipMember
: RELATION identifier ID stringLiteral COLON cardinality targetConstraint ORDERED?
LBRACE relationshipOperation* RBRACE
;
relationshipOperation
: RESOLVE ID stringLiteral SEMI
| CONNECT ID stringLiteral SEMI
| DISCONNECT ID stringLiteral SEMI
| WATCH START ID stringLiteral STOP ID stringLiteral SEMI
;
targetConstraint
: ATOM identifier
| INTERFACE identifier
;
packageDecl
: PACKAGE identifier ID stringLiteral REVISION stringLiteral sourceBlock
LBRACE packageExport* RBRACE
;
packageExport
: packageOperationExport
| packageFunctionExport
| packageConstructorExport
;
packageOperationExport
: OPERATION identifier ID stringLiteral COLON valueType ARROW valueType
MODE operationMode eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI
;
packageFunctionExport
: FUNCTION identifier ID stringLiteral COLON valueType ARROW valueType
dependencyBlock? SEMI
;
packageConstructorExport
: CONSTRUCTOR identifier ID stringLiteral CONSTRUCTS identifier COLON valueType
dependencyBlock? SEMI
;
eventClause
: EMITS valueType
;
operationMode
: CALL
| WATCH_START
| WATCH_STOP
| SUBSCRIBE
| UNSUBSCRIBE
;
receiverRequirement
: ANY
| ATOM identifier
| INTERFACES LBRACK identifierList? RBRACK
;
identifierList
: identifier (COMMA identifier)*
;
dependencyBlock
: REQUIRES LBRACE dependencyPort* RBRACE
;
dependencyPort
: STATE identifier ID stringLiteral COLON valueType primitiveList SEMI
| EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI
| INTERFACE identifier ID stringLiteral COLON identifier SEMI
| CONSTRUCTOR identifier ID stringLiteral COLON identifier SEMI
;
primitiveList
: LBRACK primitive (COMMA primitive)* RBRACK
;
primitive
: READ
| WRITE
| RESOLVE
| CONNECT
| DISCONNECT
| WATCH_START
| WATCH_STOP
;
sharedAttachmentDecl
: SHARED attachmentDecl
;
attachmentDecl
: stateDecl
| edgeDecl
;
stateDecl
: STATE identifier ID stringLiteral ON identifier COLON valueType
POLICY storagePolicy (DEFAULT jsonLiteral)? SEMI
;
storagePolicy
: OPTIMISTIC_REGISTER
| CRDT LPAREN valueType RPAREN
;
edgeDecl
: EDGE identifier ID stringLiteral LBRACE edgeEndpoint edgeEndpoint RBRACE
;
edgeEndpoint
: targetConstraint PROJECTION identifier ID stringLiteral cardinality ORDERED? SEMI
;
conformanceDecl
: CONFORM identifier AS identifier LBRACE conformanceItem* RBRACE
;
conformanceItem
: PRIVATE attachmentDecl
| operationBindingDecl
;
operationBindingDecl
: BIND memberOperationRef TO operationProvider SEMI
;
memberOperationRef
: identifier DOT operationName
;
operationName
: identifier
| CALL
| GET
| SET
| RESOLVE
| CONNECT
| DISCONNECT
| WATCH_START
| WATCH_STOP
| SUBSCRIBE
| UNSUBSCRIBE
;
operationProvider
: STATE identifier DOT statePrimitive
| EDGE identifier DOT identifier DOT edgePrimitive
| PACKAGE identifier DOT identifier dependencyBindingBlock?
;
statePrimitive
: READ
| WRITE
| WATCH_START
| WATCH_STOP
;
edgePrimitive
: RESOLVE
| CONNECT
| DISCONNECT
| WATCH_START
| WATCH_STOP
;
dependencyBindingBlock
: WITH LBRACE dependencyBinding* RBRACE
;
dependencyBinding
: identifier TO STATE identifier SEMI
| identifier TO EDGE identifier DOT identifier SEMI
| identifier TO INTERFACE identifier SEMI
| identifier TO CONSTRUCTOR identifier SEMI
;
constructorBindingDecl
: CONSTRUCTOR identifier TO identifier DOT identifier dependencyBindingBlock? SEMI
;
valueType
: scalarType
| UNIT
| WATCH_HANDLE
| MESSAGE stringLiteral
| ATOM_REF LT identifier GT
| INTERFACE_REF LT identifier GT
| OPTIONAL LT valueType GT
| LIST LT valueType GT
;
scalarType
: BOOL
| BYTES
| DOUBLE
| INT32
| INT64
| STRING
| UINT32
| UINT64
;
cardinality
: OPTIONAL_ONE
| EXACTLY_ONE
| MANY
| MANY_UNIQUE
;
jsonLiteral
: stringLiteral
| INTEGER
| JSON_NUMBER
| TRUE
| FALSE
| NULL
| jsonObject
| jsonArray
;
jsonObject
: LBRACE (jsonMember (COMMA jsonMember)*)? RBRACE
;
jsonMember
: stringLiteral COLON jsonLiteral
;
jsonArray
: LBRACK (jsonLiteral (COMMA jsonLiteral)*)? RBRACK
;
identifier
: IDENTIFIER
| SOURCE
;
stringLiteral
: STRING_LITERAL
;
WORKSPACE: 'workspace';
ATOM: 'atom';
INTERFACE: 'interface';
INTERFACES: 'interfaces';
PACKAGE: 'package';
VALUE: 'value';
RELATION: 'relation';
OPERATION: 'operation';
FUNCTION: 'function';
CONSTRUCTOR: 'constructor';
CONSTRUCTS: 'constructs';
CONFORM: 'conform';
AS: 'as';
BIND: 'bind';
TO: 'to';
PRIVATE: 'private';
SHARED: 'shared';
STATE: 'state';
EDGE: 'edge';
PROJECTION: 'projection';
WITH: 'with';
ON: 'on';
POLICY: 'policy';
DEFAULT: 'default';
SOURCE: 'source';
REPOSITORY: 'repository';
COMMIT: 'commit';
REVISION: 'revision';
ID: 'id';
DOC: 'doc';
MODE: 'mode';
EMITS: 'emits';
RECEIVER: 'receiver';
REQUIRES: 'requires';
ANY: 'any';
GET: 'get';
SET: 'set';
WATCH: 'watch';
START: 'start';
STOP: 'stop';
READ: 'read';
WRITE: 'write';
RESOLVE: 'resolve';
CONNECT: 'connect';
DISCONNECT: 'disconnect';
CALL: 'call';
WATCH_START: 'watch-start';
WATCH_STOP: 'watch-stop';
SUBSCRIBE: 'subscribe';
UNSUBSCRIBE: 'unsubscribe';
OPTIMISTIC_REGISTER: 'optimistic-register';
CRDT: 'crdt';
OPTIONAL_ONE: 'optional-one';
EXACTLY_ONE: 'exactly-one';
MANY_UNIQUE: 'many-unique';
MANY: 'many';
ORDERED: 'ordered';
UNIT: 'unit';
WATCH_HANDLE: 'watch-handle';
MESSAGE: 'message';
ATOM_REF: 'atom-ref';
INTERFACE_REF: 'interface-ref';
OPTIONAL: 'optional';
LIST: 'list';
BOOL: 'bool';
BYTES: 'bytes';
DOUBLE: 'double';
INT32: 'int32';
INT64: 'int64';
STRING: 'string';
UINT32: 'uint32';
UINT64: 'uint64';
TRUE: 'true';
FALSE: 'false';
NULL: 'null';
ARROW: '->';
COLON: ':';
SEMI: ';';
COMMA: ',';
DOT: '.';
LBRACE: '{';
RBRACE: '}';
LBRACK: '[';
RBRACK: ']';
LPAREN: '(';
RPAREN: ')';
LT: '<';
GT: '>';
INTEGER: '-'? [0-9]+;
JSON_NUMBER: '-'? ('0' | [1-9] [0-9]*) ('.' [0-9]+)? ([eE] [+-]? [0-9]+)?;
IDENTIFIER: [A-Za-z_] [A-Za-z0-9_]*;
STRING_LITERAL: '"' (ESC | ~["\\\r\n])* '"';
fragment ESC: '\\' (["\\/bfnrt] | 'u' HEX HEX HEX HEX);
fragment HEX: [0-9a-fA-F];
LINE_COMMENT: '//' ~[\r\n]* -> skip;
BLOCK_COMMENT: '/*' .*? '*/' -> skip;
WS: [ \t\r\n]+ -> skip;
+55
View File
@@ -0,0 +1,55 @@
grammar QuixosLock;
document
: QUIXOS_LOCK VERSION INTEGER LBRACE quixosEntry resourceEntry* RBRACE EOF
;
quixosEntry
: QUIXOS SOURCE sourceBlock
;
resourceEntry
: resourceKind identifier SOURCE sourceBlock
;
resourceKind
: INTERFACE
| PACKAGE
;
sourceBlock
: LBRACE
REPOSITORY stringLiteral SEMI
COMMIT stringLiteral SEMI
RBRACE
;
identifier
: IDENTIFIER
;
stringLiteral
: STRING_LITERAL
;
QUIXOS_LOCK: 'quixos-lock';
VERSION: 'version';
QUIXOS: 'quixos';
SOURCE: 'source';
INTERFACE: 'interface';
PACKAGE: 'package';
REPOSITORY: 'repository';
COMMIT: 'commit';
LBRACE: '{';
RBRACE: '}';
SEMI: ';';
INTEGER: [0-9]+;
IDENTIFIER: [A-Za-z_] [A-Za-z0-9_]*;
STRING_LITERAL: '"' (ESC | ~["\\\r\n])* '"';
fragment ESC: '\\' (["\\/bfnrt] | 'u' HEX HEX HEX HEX);
fragment HEX: [0-9a-fA-F];
LINE_COMMENT: '//' ~[\r\n]* -> skip;
BLOCK_COMMENT: '/*' .*? '*/' -> skip;
WS: [ \t\r\n]+ -> skip;
-142
View File
@@ -1,142 +0,0 @@
{
"name": "@quixos/quixos-protocol",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@quixos/quixos-protocol",
"version": "0.1.0",
"dependencies": {
"@bufbuild/protobuf": "^2.12.1",
"@bufbuild/protoc-gen-es": "^2.12.1"
},
"bin": {
"quixos-descriptor-check": "dist/src/descriptor-check.js"
},
"devDependencies": {
"@types/node": "^24",
"typescript": "^5.9.3"
}
},
"node_modules/@bufbuild/protobuf": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.12.1.tgz",
"integrity": "sha512-BvAMfS6LrgZiryOAZ4pBYucu4wG/Ei/9o9DZ9akbREnMLbPJiom2i8b9C8IsKErQoiKqVhrerzt3kOT/RrzLHg==",
"license": "(Apache-2.0 AND BSD-3-Clause)"
},
"node_modules/@bufbuild/protoc-gen-es": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-2.12.1.tgz",
"integrity": "sha512-SWa7XvRYRouMo+vBQmpNFZ+ZEqQ8AC0LpL4QWAo1gvstLhFh/Y7Nf/a+MK7ZxDq5LZSThwfk974L1sFxO3OaGw==",
"license": "Apache-2.0",
"dependencies": {
"@bufbuild/protobuf": "2.12.1",
"@bufbuild/protoplugin": "2.12.1"
},
"bin": {
"protoc-gen-es": "bin/protoc-gen-es"
},
"engines": {
"node": ">=20"
},
"peerDependencies": {
"@bufbuild/protobuf": "2.12.1"
},
"peerDependenciesMeta": {
"@bufbuild/protobuf": {
"optional": true
}
}
},
"node_modules/@bufbuild/protoplugin": {
"version": "2.12.1",
"resolved": "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-2.12.1.tgz",
"integrity": "sha512-PY58KxQVAD1BnnKtStOctsMoegEVGfBnY5AOqVQOIu711nA13oYtTqJM8df5lUQg2J1DR3XxUXptE+fWX5oLdA==",
"license": "Apache-2.0",
"dependencies": {
"@bufbuild/protobuf": "2.12.1",
"@typescript/vfs": "^1.6.2",
"typescript": "5.4.5"
}
},
"node_modules/@bufbuild/protoplugin/node_modules/typescript": {
"version": "5.4.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
"integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/@types/node": {
"version": "24.13.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
"integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.18.0"
}
},
"node_modules/@typescript/vfs": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.4.tgz",
"integrity": "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==",
"license": "MIT",
"dependencies": {
"debug": "^4.4.3"
},
"peerDependencies": {
"typescript": "*"
}
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.9.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
"integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
"dev": true,
"license": "MIT"
}
}
}
+17 -6
View File
@@ -2,24 +2,35 @@
"name": "@quixos/quixos-protocol",
"version": "0.1.0",
"private": true,
"packageManager": "yarn@4.18.0",
"type": "module",
"bin": {
"quixos-descriptor-check": "dist/src/descriptor-check.js"
"quixos-capability-compile": "dist/src/capability-language/cli.js",
"quixos-descriptor-check": "dist/src/descriptor-check.js",
"quixos-lock-check": "dist/src/resource-lock/cli.js"
},
"exports": {
"./capability-model": "./dist/src/capability-model/index.js",
"./capability-language": "./dist/src/capability-language/index.js",
"./resource-lock": "./dist/src/resource-lock/index.js",
"./gen/*": "./dist/src/gen/*"
},
"scripts": {
"build": "npm run generate && tsc -p tsconfig.build.json",
"generate": "rm -rf src/gen && mkdir -p src/gen && protoc --plugin=protoc-gen-es=./node_modules/.bin/protoc-gen-es --es_out=src/gen --es_opt=target=ts,import_extension=js --proto_path=proto --proto_path=$QUIXOS_PROTO_PATH proto/quixos/refs.proto proto/quixos/package.proto proto/quixos/orch.proto proto/quixos/runtime.proto proto/camino/schema.proto proto/camino/api.proto proto/camino/options.proto",
"typecheck": "npm run generate && tsc --noEmit"
"build": "yarn generate && tsc -p tsconfig.build.json",
"generate": "yarn generate:proto && yarn generate:parser",
"generate:proto": "rm -rf src/gen && mkdir -p src/gen && protoc --experimental_allow_proto3_optional --plugin=protoc-gen-es=./node_modules/.bin/protoc-gen-es --es_out=src/gen --es_opt=target=ts,import_extension=js --proto_path=proto --proto_path=$QUIXOS_PROTO_PATH proto/quixos/refs.proto proto/quixos/package.proto proto/quixos/orch.proto proto/quixos/runtime.proto proto/camino/schema.proto proto/camino/api.proto",
"generate:parser": "rm -rf src/capability-language/generated src/resource-lock/generated && mkdir -p src/capability-language/generated src/resource-lock/generated && antlr-ng -D language=TypeScript --generate-visitor --generate-listener false --output-directory src/capability-language/generated grammar/QuixosCapability.g4 && antlr-ng -D language=TypeScript --generate-visitor --generate-listener false --output-directory src/resource-lock/generated grammar/QuixosLock.g4",
"test": "yarn generate && tsc -p tsconfig.test.json && node --test dist/test/*.test.js",
"typecheck": "yarn generate && tsc --noEmit"
},
"dependencies": {
"@bufbuild/protobuf": "^2.12.1",
"@bufbuild/protoc-gen-es": "^2.12.1"
"@bufbuild/protoc-gen-es": "^2.12.1",
"antlr4ng": "^3.0.16"
},
"devDependencies": {
"@types/node": "^24",
"typescript": "^5.9.3"
"antlr-ng": "^1.0.10",
"typescript": "^7.0.2"
}
}
+66 -141
View File
@@ -3,75 +3,45 @@ syntax = "proto3";
package camino;
import "camino/schema.proto";
import "quixos/refs.proto";
service CaminoService {
rpc RegisterSchema(RegisterSchemaRequest) returns (RegisterSchemaResponse);
rpc ListClasses(ListClassesRequest) returns (ListClassesResponse);
rpc InstallPersistencePlan(InstallPersistencePlanRequest) returns (InstallPersistencePlanResponse);
rpc GetPersistencePlan(GetPersistencePlanRequest) returns (GetPersistencePlanResponse);
rpc CreateObject(CreateObjectRequest) returns (CreateObjectResponse);
rpc GetObject(GetObjectRequest) returns (GetObjectResponse);
rpc ListObjects(ListObjectsRequest) returns (ListObjectsResponse);
rpc SetField(SetFieldRequest) returns (SetFieldResponse);
rpc AddEdge(AddEdgeRequest) returns (AddEdgeResponse);
rpc ListEdges(ListEdgesRequest) returns (ListEdgesResponse);
rpc ReadState(ReadStateRequest) returns (ReadStateResponse);
rpc WriteState(WriteStateRequest) returns (WriteStateResponse);
rpc ConnectEdge(ConnectEdgeRequest) returns (ConnectEdgeResponse);
rpc ResolveEdge(ResolveEdgeRequest) returns (ResolveEdgeResponse);
rpc RemoveEdge(RemoveEdgeRequest) returns (RemoveEdgeResponse);
rpc DisconnectEdge(DisconnectEdgeRequest) returns (DisconnectEdgeResponse);
rpc ListOps(ListOpsRequest) returns (ListOpsResponse);
rpc WatchObject(WatchObjectRequest) returns (stream WatchObjectEvent);
}
message RegisterSchemaRequest {
string source_file = 1;
}
message RegisterSchemaResponse {
repeated string class_ids = 1;
repeated ClassSchema classes = 2;
}
message ListClassesRequest {}
message RegisteredClass {
string id = 1;
ClassSchema schema = 2;
}
message ListClassesResponse {
repeated RegisteredClass classes = 1;
}
message NullValue {}
message ObjectValue {
map<string, Value> fields = 1;
}
message ListValue {
repeated Value values = 1;
}
message RefValue {
string object_id = 1;
}
message ObjectValue { map<string, Value> fields = 1; }
message ListValue { repeated Value values = 1; }
message RefValue { string object_id = 1; }
message CrdtValue {
string type = 1;
string encoding = 2;
bytes payload = 3;
}
message FieldValueSource {
message StateValueSource {
string object_id = 1;
string field_name = 2;
string field_type = 3;
string field_storage = 4;
string conflict_strategy = 5;
uint64 revision = 6;
string slot_id = 2;
string value_type_json = 3;
string storage_policy_json = 4;
uint64 revision = 5;
// CRDT-backed state is still read as its materialized Value. The snapshot
// travels with the writable source identity so a client can retain and
// advance a local replica without exposing the document to package code.
CrdtValue crdt_snapshot = 6;
}
message ValueSource {
FieldValueSource field = 1;
}
message ValueSource { StateValueSource state = 1; }
message Value {
oneof kind {
@@ -89,96 +59,62 @@ message Value {
ValueSource source = 11;
}
message InstallPersistencePlanRequest { PersistencePlan plan = 1; }
message InstallPersistencePlanResponse { PersistencePlan plan = 1; }
message GetPersistencePlanRequest {}
message GetPersistencePlanResponse { PersistencePlan plan = 1; }
message CreateObjectRequest {
string class_id = 1;
map<string, Value> fields = 2;
string atom_id = 1;
map<string, Value> initial_state = 2;
}
message CreateObjectResponse { CaminoObject object = 1; }
message GetObjectRequest { string object_id = 1; }
message GetObjectResponse { CaminoObject object = 1; }
message ListObjectsRequest { string atom_id = 1; }
message ListObjectsResponse { repeated CaminoObject objects = 1; }
message CreateObjectResponse {
CaminoObject object = 1;
}
message GetObjectRequest {
message ReadStateRequest {
string object_id = 1;
string slot_id = 2;
}
message GetObjectResponse {
CaminoObject object = 1;
}
message ListObjectsRequest {
string class_id = 1;
}
message ListObjectsResponse {
repeated CaminoObject objects = 1;
}
message SetFieldRequest {
message ReadStateResponse { Value value = 1; }
message WriteStateRequest {
string object_id = 1;
string field_name = 2;
string slot_id = 2;
Value value = 3;
string client_mutation_id = 4;
}
message SetFieldResponse {
CaminoObject object = 1;
message WriteStateResponse {
Value value = 1;
CaminoObject object = 2;
}
message AddEdgeRequest {
string from_object_id = 1;
string source_field = 2;
string to_object_id = 3;
map<string, Value> fields = 4;
optional int32 source_ordinal = 5;
message ConnectEdgeRequest {
string edge_type_id = 1;
string projection_id = 2;
string object_id = 3;
string target_object_id = 4;
optional int32 ordinal = 5;
optional int32 target_ordinal = 6;
}
message AddEdgeResponse {
CaminoEdge edge = 1;
}
message ListEdgesRequest {
string object_id = 1;
}
message ListEdgesResponse {
repeated CaminoEdge edges = 1;
}
message ConnectEdgeResponse { CaminoEdge edge = 1; }
message ResolveEdgeRequest {
string object_id = 1;
string projection = 2;
}
message ResolveEdgeResponse {
repeated CaminoEdge edges = 1;
CaminoObject materialized_object = 2;
bool created = 3;
}
message RemoveEdgeRequest {
string edge_id = 1;
}
message RemoveEdgeResponse {
string edge_id = 1;
}
message ListOpsRequest {
string object_id = 1;
}
message ListOpsResponse {
repeated CaminoOp ops = 1;
string edge_type_id = 2;
string projection_id = 3;
}
message ResolveEdgeResponse { repeated CaminoEdge edges = 1; }
message DisconnectEdgeRequest { string edge_id = 1; }
message DisconnectEdgeResponse { string edge_id = 1; }
message ListOpsRequest { string object_id = 1; }
message ListOpsResponse { repeated CaminoOp ops = 1; }
message WatchObjectRequest {
string object_id = 1;
string after_op_id = 2;
bool include_snapshot = 3;
}
message WatchObjectEvent {
string object_id = 1;
CaminoObject snapshot = 2;
@@ -187,34 +123,24 @@ message WatchObjectEvent {
message CaminoObject {
string id = 1;
string class_id = 2;
uint32 schema_version = 3;
string atom_id = 2;
string workspace_revision_id = 3;
string created_at = 4;
string updated_at = 5;
map<string, Value> fields = 6;
map<string, uint64> field_revisions = 7;
map<string, string> field_conflicts = 8;
map<string, Value> state = 6;
map<string, uint64> state_revisions = 7;
}
message CaminoEdge {
string id = 1;
string edge_type_id = 2;
string from_object_id = 3;
string to_object_id = 4;
// Legacy canonical source-side projection fields. Prefer endpoint fields.
string source_field = 5;
string cardinality = 6;
string inverse = 7;
map<string, Value> fields = 8;
optional int32 from_ordinal = 9;
string created_at = 10;
string updated_at = 11;
string from_projection = 12;
string to_projection = 13;
string from_cardinality = 14;
string to_cardinality = 15;
optional int32 to_ordinal = 16;
string directionality = 17;
string first_object_id = 3;
string second_object_id = 4;
string first_projection_id = 5;
string second_projection_id = 6;
optional int32 first_ordinal = 7;
optional int32 second_ordinal = 8;
string created_at = 9;
}
message CaminoOp {
@@ -223,7 +149,6 @@ message CaminoOp {
string op_kind = 3;
Value payload = 4;
string actor = 5;
quixos.FunctionRef function_ref = 6;
string created_at = 7;
string client_mutation_id = 8;
string created_at = 6;
string client_mutation_id = 7;
}
-94
View File
@@ -1,94 +0,0 @@
syntax = "proto3";
package camino;
import "google/protobuf/descriptor.proto";
import "camino/schema.proto";
import "quixos/refs.proto";
extend google.protobuf.FileOptions {
string schema_namespace = 51000;
string schema_version = 51001;
}
extend google.protobuf.MessageOptions {
ClassOptions class = 51010;
repeated MethodOptions method = 51011;
repeated MigrationOptions migration = 51012;
InterfaceOptions interface = 51013;
repeated ImplementsOptions implements = 51014;
ConstructorOptions constructor = 51015;
}
extend google.protobuf.FieldOptions {
ConflictStrategy conflict = 51020;
EdgeOptions edge = 51021;
FieldStorage field_storage = 51022;
FieldOps field_ops = 51023;
InterfaceFieldContract interface_field = 51024;
bool display_label = 51025;
}
extend google.protobuf.MethodOptions {
quixos.FunctionRef impl = 51030;
}
message ClassOptions {
uint32 version = 1;
SymbolRef id = 2;
}
message InterfaceOptions {
uint32 version = 1;
SymbolRef id = 2;
repeated string type_parameter = 3;
}
message ImplementsOptions {
SymbolRef interface = 1;
repeated TypeBinding type_binding = 2;
}
message ConstructorOptions {
quixos.FunctionRef function = 1;
}
message EdgeOptions {
SymbolRef id = 1;
// Shorthand for other_endpoint.class.
SymbolRef target = 2;
// Shorthand for this_endpoint.cardinality.
Cardinality cardinality = 3;
// Shorthand for other_endpoint.projection.
string inverse = 4;
EdgeEndpointOptions this_endpoint = 5;
EdgeEndpointOptions other_endpoint = 6;
repeated SymbolRef tag = 7;
repeated SymbolRef implements = 8;
bool undirected = 9;
}
message EdgeEndpointOptions {
SymbolRef class = 1;
SymbolRef interface = 2;
string projection = 3;
Cardinality cardinality = 4;
bool indexed = 5;
EdgeMaterializationOptions materialize = 6;
}
message EdgeMaterializationOptions {
SymbolRef class = 1;
string connect_projection = 2;
}
message MethodOptions {
string name = 1;
quixos.FunctionRef function = 2;
}
message MigrationOptions {
uint32 from_version = 1;
uint32 to_version = 2;
quixos.FunctionRef function = 3;
}
+37 -190
View File
@@ -2,215 +2,62 @@ syntax = "proto3";
package camino;
import "quixos/refs.proto";
message SymbolRef {
string namespace = 1;
string name = 2;
string version = 3;
string hash = 4;
}
enum ConflictStrategy {
CONFLICT_STRATEGY_UNSPECIFIED = 0;
REPLACE = 1;
PRESERVE_CONFLICTS = 2;
CRDT = 3;
}
enum Cardinality {
CARDINALITY_UNSPECIFIED = 0;
OPTIONAL_ONE = 1;
EXACTLY_ONE = 2;
MANY = 3;
MANY_UNIQUE = 4;
MANY_ORDERED = 5;
MANY_UNIQUE_ORDERED = 6;
}
enum DocRefStrength {
DOC_REF_STRENGTH_UNSPECIFIED = 0;
SOFT_REF = 1;
PROJECTED_EDGE = 2;
message AtomDefinition {
string atom_id = 1;
string display_name = 2;
}
enum FieldStorageKind {
FIELD_STORAGE_KIND_UNSPECIFIED = 0;
STORED = 1;
DERIVED = 2;
LAZY = 3;
EXTERNAL = 4;
STATIC_FINAL = 5;
message AtomConformance {
string atom_id = 1;
string interface_revision_id = 2;
}
message Ref {
string object_id = 1;
message StateAttachment {
string slot_id = 1;
string attached_atom_id = 2;
string display_name = 3;
string value_type_json = 4;
string storage_policy_json = 5;
string default_value_json = 6;
}
message CustomField {}
message WatchStartResult {
string watch_id = 1;
message EndpointConstraint {
oneof kind {
string atom_id = 1;
string interface_revision_id = 2;
}
}
message WatchStopRequest {
string watch_id = 1;
}
message WatchStopResult {}
message CrdtText {
bytes payload = 1;
}
message CrdtRichText {
bytes payload = 1;
}
message CrdtJson {
bytes payload = 1;
}
message ClassSchema {
SymbolRef id = 1;
uint32 version = 2;
repeated FieldSchema fields = 3;
repeated EdgeSchema edges = 4;
repeated MethodSchema methods = 5;
repeated MigrationSpec migrations = 6;
string source_file = 7;
string proto_message = 8;
repeated OperationServiceSchema operation_services = 9;
repeated InterfaceImplementationSchema implements = 10;
ConstructorSpec constructor = 11;
}
message FieldSchema {
string name = 1;
uint32 tag = 2;
TypeRef type = 3;
ConflictStrategy conflict = 4;
bool repeated = 5;
bool optional = 6;
FieldStorage storage = 7;
FieldOps ops = 8;
InterfaceFieldContract interface_contract = 9;
bool is_display_label = 10;
}
message FieldStorage {
FieldStorageKind kind = 1;
quixos.FunctionRef resolver = 2;
bool cache = 3;
}
message TypeRef {
string proto_type = 1;
SymbolRef symbol = 2;
}
message TypeBinding {
string name = 1;
TypeRef type = 2;
}
message InterfaceFieldContract {
bool required = 1;
bool readable = 2;
bool writable = 3;
bool watchable = 4;
string type_param = 5;
TypeRef type = 6;
string ref_target_type_param = 7;
Cardinality edge_cardinality = 8;
}
message InterfaceImplementationSchema {
SymbolRef interface = 1;
repeated TypeBinding type_bindings = 2;
}
message InterfaceSchema {
SymbolRef id = 1;
uint32 version = 2;
repeated FieldSchema fields = 3;
string source_file = 4;
string proto_message = 5;
repeated string type_parameters = 6;
}
enum FieldImplementation {
FIELD_IMPLEMENTATION_UNSPECIFIED = 0;
SERVICE = 1;
}
message FieldOps {
FieldImplementation implementation = 1;
string service = 2;
}
message EdgeSchema {
SymbolRef id = 1;
// Legacy/source-side projection fields. Prefer from_endpoint/to_endpoint.
string source_field = 2;
SymbolRef from_class = 3;
SymbolRef to_class = 4;
Cardinality cardinality = 5;
string inverse = 6;
repeated FieldSchema fields = 7;
EdgeEndpointSchema from_endpoint = 8;
EdgeEndpointSchema to_endpoint = 9;
SymbolRef declaring_class = 10;
repeated SymbolRef tags = 11;
repeated SymbolRef implements = 12;
bool undirected = 13;
}
message EdgeEndpointSchema {
SymbolRef class = 1;
SymbolRef interface = 2;
string projection = 3;
message EdgeEndpoint {
string projection_id = 1;
string display_name = 2;
EndpointConstraint constraint = 3;
Cardinality cardinality = 4;
bool indexed = 5;
EdgeMaterialization materialize = 6;
bool ordered = 5;
}
message EdgeMaterialization {
SymbolRef class = 1;
string connect_projection = 2;
message EdgeAttachment {
string edge_type_id = 1;
string display_name = 2;
EdgeEndpoint first = 3;
EdgeEndpoint second = 4;
}
message MethodSchema {
string name = 1;
quixos.FunctionRef function = 2;
}
message MigrationSpec {
uint32 from_version = 1;
uint32 to_version = 2;
quixos.FunctionRef function = 3;
}
message ConstructorSpec {
quixos.FunctionRef function = 1;
}
message OperationSchema {
string name = 1;
TypeRef input_type = 2;
TypeRef output_type = 3;
quixos.FunctionRef function = 4;
}
message OperationServiceSchema {
string name = 1;
string full_name = 2;
repeated OperationSchema operations = 3;
}
message DocRefDeclaration {
string local_name = 1;
SymbolRef type = 2;
SymbolRef target_class = 3;
DocRefStrength strength = 4;
// Camino consumes this persistence-only projection of a checked workspace.
// Interfaces, operation bindings, packages, and constructors stay in orch.
message PersistencePlan {
string workspace_id = 1;
string workspace_revision_id = 2;
repeated AtomDefinition atoms = 3;
repeated AtomConformance conformances = 4;
repeated StateAttachment states = 5;
repeated EdgeAttachment edges = 6;
}
+39 -47
View File
@@ -8,21 +8,28 @@ import "quixos/refs.proto";
import "quixos/runtime.proto";
service OrchestratorRuntime {
rpc InvokeFunction(InvokeFunctionRequest) returns (InvokeFunctionResponse);
rpc WatchFunction(WatchFunctionRequest) returns (stream WatchFunctionEvent);
rpc InvokeCapability(InvokeCapabilityRequest) returns (InvokeCapabilityResponse);
rpc WatchCapability(WatchCapabilityRequest) returns (stream WatchCapabilityEvent);
rpc ConstructObject(ConstructObjectRequest) returns (ConstructObjectResponse);
rpc GetWorkspace(GetWorkspaceRequest) returns (GetWorkspaceResponse);
rpc ListPackageDescriptors(ListPackageDescriptorsRequest) returns (ListPackageDescriptorsResponse);
rpc ListPackageRuntimes(ListPackageRuntimesRequest) returns (ListPackageRuntimesResponse);
rpc ListActivations(ListActivationsRequest) returns (ListActivationsResponse);
rpc CloseActivation(CloseActivationRequest) returns (CloseActivationResponse);
}
message InvokeFunctionRequest {
quixos.FunctionRef function = 1;
message ConstructObjectRequest {
string atom_id = 1;
map<string, camino.Value> input = 2;
}
message ConstructObjectResponse { camino.CaminoObject object = 1; }
message InvokeCapabilityRequest {
quixos.CapabilityRef capability = 1;
string object_id = 2;
map<string, camino.Value> input = 3;
}
message InvokeFunctionResponse {
message InvokeCapabilityResponse {
string invocation_id = 1;
Activation activation = 2;
bool ok = 3;
@@ -30,13 +37,12 @@ message InvokeFunctionResponse {
string error = 5;
}
message WatchFunctionRequest {
quixos.FunctionRef function = 1;
message WatchCapabilityRequest {
quixos.CapabilityRef capability = 1;
string object_id = 2;
map<string, camino.Value> input = 3;
}
message WatchFunctionEvent {
message WatchCapabilityEvent {
string invocation_id = 1;
Activation activation = 2;
string watch_id = 3;
@@ -46,36 +52,24 @@ message WatchFunctionEvent {
bool initial = 7;
}
message GetWorkspaceRequest {}
message GetWorkspaceResponse {
string workspace_id = 1;
string workspace_revision_id = 2;
string source_root_commit = 3;
}
message ListActivationsRequest {}
message ListPackageDescriptorsRequest {}
message ListPackageDescriptorsResponse {
repeated quixos.PackageDescriptor descriptors = 1;
}
message ListPackageDescriptorsResponse { repeated quixos.PackageDescriptor descriptors = 1; }
message ListPackageRuntimesRequest {}
message ListPackageRuntimesResponse {
repeated PackageRuntimeStatus runtimes = 1;
}
message ListActivationsResponse {
repeated Activation activations = 1;
}
message CloseActivationRequest {
string activation_id = 1;
string reason = 2;
}
message CloseActivationResponse {
Activation activation = 1;
}
message ListPackageRuntimesResponse { repeated PackageRuntimeStatus runtimes = 1; }
message ListActivationsResponse { repeated Activation activations = 1; }
message CloseActivationRequest { string activation_id = 1; string reason = 2; }
message CloseActivationResponse { Activation activation = 1; }
message Activation {
string activation_id = 1;
quixos.FunctionRef function = 2;
quixos.PackageExportRef export = 2;
string object_id = 3;
string state = 4;
uint32 demand = 5;
@@ -88,17 +82,15 @@ message Activation {
message PackageRuntimeStatus {
string runtime_key = 1;
string package_namespace = 2;
string package_name = 3;
uint32 descriptor_version = 4;
string source_repo = 5;
string server_installable = 6;
string source_path = 7;
string server_path = 8;
uint32 pid = 9;
string state = 10;
string started_at = 11;
string last_handshake_at = 12;
string runtime_protocol_version = 13;
uint32 advertised_function_count = 14;
string package_revision_id = 2;
string source_repository = 3;
string source_commit = 4;
string build_target = 5;
string server_path = 6;
uint32 pid = 7;
string state = 8;
string started_at = 9;
string last_handshake_at = 10;
string runtime_protocol_version = 11;
uint32 advertised_export_count = 12;
}
+7 -63
View File
@@ -2,70 +2,14 @@ syntax = "proto3";
package quixos;
import "camino/schema.proto";
import "quixos/refs.proto";
message PackageRef {
string package_namespace = 1;
string package_name = 2;
uint32 descriptor_version = 3;
string version_ref = 4;
}
message PackageDescriptor {
string package_namespace = 1;
string package_name = 2;
uint32 descriptor_version = 3;
uint32 interface_compatible_back_to = 4;
uint32 runner_compatible_back_to = 5;
string source_repo = 6;
string source_ref = 7;
string resolved_source_ref = 8;
string server_installable = 9;
string runtime_protocol_version = 10;
repeated ClassExport class_exports = 11;
repeated FunctionExport function_exports = 12;
repeated ComponentExport component_exports = 13;
repeated SidecarExport sidecar_exports = 14;
repeated PackageDependency dependencies = 15;
string package_id = 1;
string package_revision_id = 2;
string runtime_protocol_version = 3;
repeated RuntimeExport exports = 4;
}
enum FunctionCapabilityKind {
FUNCTION_CAPABILITY_KIND_UNSPECIFIED = 0;
METHOD = 1;
FIELD_RESOLVER = 2;
MIGRATION = 3;
CONSTRUCTOR = 4;
}
message ClassExport {
camino.SymbolRef class_id = 1;
string source_file = 2;
}
message FunctionExport {
FunctionRef function = 1;
string input_type = 2;
string output_type = 3;
uint32 interface_version = 4;
uint32 interface_compatible_back_to = 5;
FunctionCapabilityKind capability_kind = 6;
}
message ComponentExport {
string symbol = 1;
string props_type = 2;
repeated camino.SymbolRef supported_classes = 3;
}
message SidecarExport {
string symbol = 1;
string side_effect_mode = 2;
}
message PackageDependency {
PackageRef package = 1;
uint32 interface_compatible_back_to = 2;
bool refactor_required = 3;
string compatibility_note = 4;
message RuntimeExport {
string export_id = 1;
string runtime_symbol = 2;
}
+23 -6
View File
@@ -2,10 +2,27 @@ syntax = "proto3";
package quixos;
message FunctionRef {
string package_namespace = 1;
string package_name = 2;
string symbol = 3;
string version_ref = 4;
string operation = 5;
message CapabilityRef {
string interface_revision_id = 1;
string operation_id = 2;
}
message PackageExportRef {
string package_revision_id = 1;
string export_id = 2;
}
message InjectedDependency {
string port_id = 1;
oneof binding {
string state_slot_id = 2;
EdgeDependency edge = 3;
string receiver_interface_revision_id = 4;
string constructor_atom_id = 5;
}
}
message EdgeDependency {
string edge_type_id = 1;
string projection_id = 2;
}
+10 -13
View File
@@ -11,24 +11,20 @@ service PackageRuntime {
rpc Watch(WatchRequest) returns (stream WatchEvent);
}
message HandshakeRequest {
string orch_protocol_version = 1;
}
message HandshakeRequest { string orch_protocol_version = 1; }
message HandshakeResponse {
string package_namespace = 1;
string package_name = 2;
string runtime_protocol_version = 3;
repeated quixos.FunctionRef functions = 4;
string package_revision_id = 1;
string runtime_protocol_version = 2;
repeated string export_ids = 3;
}
message InvokeRequest {
string invocation_id = 1;
quixos.FunctionRef function = 2;
quixos.PackageExportRef export = 2;
string object_id = 3;
map<string, camino.Value> input = 4;
repeated quixos.InjectedDependency dependencies = 5;
}
message InvokeResponse {
bool ok = 1;
camino.Value result = 2;
@@ -37,16 +33,17 @@ message InvokeResponse {
message WatchRequest {
string invocation_id = 1;
quixos.FunctionRef function = 2;
quixos.PackageExportRef export = 2;
string object_id = 3;
map<string, camino.Value> input = 4;
repeated quixos.InjectedDependency dependencies = 5;
}
message DerivedDependency {
string kind = 1;
string object_id = 2;
string field_name = 3;
string source_field = 4;
string attachment_id = 3;
string projection_id = 4;
}
message WatchEvent {
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/env node
import { readFile } from "node:fs/promises";
import process from "node:process";
import { compileCapabilitySource } from "./parser.js";
import { capabilityId } from "../capability-model/types.js";
import { compileWorkspaceRevision } from "../capability-model/validation.js";
const usage = `usage: quixos-capability-compile [--check]
[--workspace-id ID] [--workspace-revision-id ID]
[--source-root-commit GIT_REV] <workspace.qx | ->
Parses, lowers, and validates a Quixos capability workspace. By default the
checked semantic workspace revision is written as JSON. --check emits no JSON.
The identity overrides instantiate a checked built-in/template assembly for one
real workspace; both must be supplied together.`;
const parseArgs = (args: string[]) => {
let checkOnly = false;
let workspaceId: string | undefined;
let workspaceRevisionId: string | undefined;
let sourceRootCommit: string | undefined;
const positional: string[] = [];
for (let index = 0; index < args.length; index += 1) {
const argument = args[index]!;
if (argument === "--check") checkOnly = true;
else if (argument === "--workspace-id") workspaceId = args[++index];
else if (argument === "--workspace-revision-id") workspaceRevisionId = args[++index];
else if (argument === "--source-root-commit") sourceRootCommit = args[++index];
else if (argument === "-") positional.push(argument);
else if (argument.startsWith("-")) throw new Error(usage);
else positional.push(argument);
}
if (positional.length !== 1 || Boolean(workspaceId) !== Boolean(workspaceRevisionId)) {
throw new Error(usage);
}
return { checkOnly, workspaceId, workspaceRevisionId, sourceRootCommit, fileName: positional[0]! };
};
const main = async () => {
const args = process.argv.slice(2);
if (args.includes("--help") || args.includes("-h")) {
process.stdout.write(`${usage}\n`);
return;
}
const {
checkOnly,
workspaceId,
workspaceRevisionId,
sourceRootCommit,
fileName,
} = parseArgs(args);
const source =
fileName === "-"
? await new Promise<string>((resolve, reject) => {
const chunks: Buffer[] = [];
process.stdin.on("data", (chunk: Buffer) => chunks.push(chunk));
process.stdin.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
process.stdin.on("error", reject);
})
: await readFile(fileName, "utf8");
const result = compileCapabilitySource(source, fileName);
if (!result.ok) {
for (const diagnostic of result.diagnostics) {
const location = diagnostic.line
? `${diagnostic.fileName}:${diagnostic.line}:${diagnostic.column + 1}`
: `${diagnostic.fileName}${diagnostic.path ? `:${diagnostic.path}` : ""}`;
process.stderr.write(
`${location}: ${diagnostic.phase} ${diagnostic.code}: ${diagnostic.message}\n`,
);
}
process.exitCode = 1;
return;
}
const workspace = workspaceId && workspaceRevisionId
? {
...result.workspace,
workspaceId: capabilityId.workspace(workspaceId),
id: capabilityId.workspaceRevision(workspaceRevisionId),
...(sourceRootCommit ? { sourceRootCommit } : {}),
}
: { ...result.workspace, ...(sourceRootCommit ? { sourceRootCommit } : {}) };
const instantiated = compileWorkspaceRevision(workspace);
if (!instantiated.ok) {
throw new Error(instantiated.issues.map((issue) => `${issue.path}: ${issue.message}`).join("\n"));
}
if (!checkOnly) {
process.stdout.write(`${JSON.stringify(workspace, null, 2)}\n`);
}
};
main().catch((error: unknown) => {
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
process.exitCode = 1;
});
File diff suppressed because one or more lines are too long
@@ -0,0 +1,183 @@
WORKSPACE=1
ATOM=2
INTERFACE=3
INTERFACES=4
PACKAGE=5
VALUE=6
RELATION=7
OPERATION=8
FUNCTION=9
CONSTRUCTOR=10
CONSTRUCTS=11
CONFORM=12
AS=13
BIND=14
TO=15
PRIVATE=16
SHARED=17
STATE=18
EDGE=19
PROJECTION=20
WITH=21
ON=22
POLICY=23
DEFAULT=24
SOURCE=25
REPOSITORY=26
COMMIT=27
REVISION=28
ID=29
DOC=30
MODE=31
EMITS=32
RECEIVER=33
REQUIRES=34
ANY=35
GET=36
SET=37
WATCH=38
START=39
STOP=40
READ=41
WRITE=42
RESOLVE=43
CONNECT=44
DISCONNECT=45
CALL=46
WATCH_START=47
WATCH_STOP=48
SUBSCRIBE=49
UNSUBSCRIBE=50
OPTIMISTIC_REGISTER=51
CRDT=52
OPTIONAL_ONE=53
EXACTLY_ONE=54
MANY_UNIQUE=55
MANY=56
ORDERED=57
UNIT=58
WATCH_HANDLE=59
MESSAGE=60
ATOM_REF=61
INTERFACE_REF=62
OPTIONAL=63
LIST=64
BOOL=65
BYTES=66
DOUBLE=67
INT32=68
INT64=69
STRING=70
UINT32=71
UINT64=72
TRUE=73
FALSE=74
NULL=75
ARROW=76
COLON=77
SEMI=78
COMMA=79
DOT=80
LBRACE=81
RBRACE=82
LBRACK=83
RBRACK=84
LPAREN=85
RPAREN=86
LT=87
GT=88
INTEGER=89
JSON_NUMBER=90
IDENTIFIER=91
STRING_LITERAL=92
LINE_COMMENT=93
BLOCK_COMMENT=94
WS=95
'workspace'=1
'atom'=2
'interface'=3
'interfaces'=4
'package'=5
'value'=6
'relation'=7
'operation'=8
'function'=9
'constructor'=10
'constructs'=11
'conform'=12
'as'=13
'bind'=14
'to'=15
'private'=16
'shared'=17
'state'=18
'edge'=19
'projection'=20
'with'=21
'on'=22
'policy'=23
'default'=24
'source'=25
'repository'=26
'commit'=27
'revision'=28
'id'=29
'doc'=30
'mode'=31
'emits'=32
'receiver'=33
'requires'=34
'any'=35
'get'=36
'set'=37
'watch'=38
'start'=39
'stop'=40
'read'=41
'write'=42
'resolve'=43
'connect'=44
'disconnect'=45
'call'=46
'watch-start'=47
'watch-stop'=48
'subscribe'=49
'unsubscribe'=50
'optimistic-register'=51
'crdt'=52
'optional-one'=53
'exactly-one'=54
'many-unique'=55
'many'=56
'ordered'=57
'unit'=58
'watch-handle'=59
'message'=60
'atom-ref'=61
'interface-ref'=62
'optional'=63
'list'=64
'bool'=65
'bytes'=66
'double'=67
'int32'=68
'int64'=69
'string'=70
'uint32'=71
'uint64'=72
'true'=73
'false'=74
'null'=75
'->'=76
':'=77
';'=78
','=79
'.'=80
'{'=81
'}'=82
'['=83
']'=84
'('=85
')'=86
'<'=87
'>'=88
File diff suppressed because one or more lines are too long
@@ -0,0 +1,183 @@
WORKSPACE=1
ATOM=2
INTERFACE=3
INTERFACES=4
PACKAGE=5
VALUE=6
RELATION=7
OPERATION=8
FUNCTION=9
CONSTRUCTOR=10
CONSTRUCTS=11
CONFORM=12
AS=13
BIND=14
TO=15
PRIVATE=16
SHARED=17
STATE=18
EDGE=19
PROJECTION=20
WITH=21
ON=22
POLICY=23
DEFAULT=24
SOURCE=25
REPOSITORY=26
COMMIT=27
REVISION=28
ID=29
DOC=30
MODE=31
EMITS=32
RECEIVER=33
REQUIRES=34
ANY=35
GET=36
SET=37
WATCH=38
START=39
STOP=40
READ=41
WRITE=42
RESOLVE=43
CONNECT=44
DISCONNECT=45
CALL=46
WATCH_START=47
WATCH_STOP=48
SUBSCRIBE=49
UNSUBSCRIBE=50
OPTIMISTIC_REGISTER=51
CRDT=52
OPTIONAL_ONE=53
EXACTLY_ONE=54
MANY_UNIQUE=55
MANY=56
ORDERED=57
UNIT=58
WATCH_HANDLE=59
MESSAGE=60
ATOM_REF=61
INTERFACE_REF=62
OPTIONAL=63
LIST=64
BOOL=65
BYTES=66
DOUBLE=67
INT32=68
INT64=69
STRING=70
UINT32=71
UINT64=72
TRUE=73
FALSE=74
NULL=75
ARROW=76
COLON=77
SEMI=78
COMMA=79
DOT=80
LBRACE=81
RBRACE=82
LBRACK=83
RBRACK=84
LPAREN=85
RPAREN=86
LT=87
GT=88
INTEGER=89
JSON_NUMBER=90
IDENTIFIER=91
STRING_LITERAL=92
LINE_COMMENT=93
BLOCK_COMMENT=94
WS=95
'workspace'=1
'atom'=2
'interface'=3
'interfaces'=4
'package'=5
'value'=6
'relation'=7
'operation'=8
'function'=9
'constructor'=10
'constructs'=11
'conform'=12
'as'=13
'bind'=14
'to'=15
'private'=16
'shared'=17
'state'=18
'edge'=19
'projection'=20
'with'=21
'on'=22
'policy'=23
'default'=24
'source'=25
'repository'=26
'commit'=27
'revision'=28
'id'=29
'doc'=30
'mode'=31
'emits'=32
'receiver'=33
'requires'=34
'any'=35
'get'=36
'set'=37
'watch'=38
'start'=39
'stop'=40
'read'=41
'write'=42
'resolve'=43
'connect'=44
'disconnect'=45
'call'=46
'watch-start'=47
'watch-stop'=48
'subscribe'=49
'unsubscribe'=50
'optimistic-register'=51
'crdt'=52
'optional-one'=53
'exactly-one'=54
'many-unique'=55
'many'=56
'ordered'=57
'unit'=58
'watch-handle'=59
'message'=60
'atom-ref'=61
'interface-ref'=62
'optional'=63
'list'=64
'bool'=65
'bytes'=66
'double'=67
'int32'=68
'int64'=69
'string'=70
'uint32'=71
'uint64'=72
'true'=73
'false'=74
'null'=75
'->'=76
':'=77
';'=78
','=79
'.'=80
'{'=81
'}'=82
'['=83
']'=84
'('=85
')'=86
'<'=87
'>'=88
@@ -0,0 +1,523 @@
import * as antlr from "antlr4ng";
import { Token } from "antlr4ng";
export class QuixosCapabilityLexer extends antlr.Lexer {
public static readonly WORKSPACE = 1;
public static readonly ATOM = 2;
public static readonly INTERFACE = 3;
public static readonly INTERFACES = 4;
public static readonly PACKAGE = 5;
public static readonly VALUE = 6;
public static readonly RELATION = 7;
public static readonly OPERATION = 8;
public static readonly FUNCTION = 9;
public static readonly CONSTRUCTOR = 10;
public static readonly CONSTRUCTS = 11;
public static readonly CONFORM = 12;
public static readonly AS = 13;
public static readonly BIND = 14;
public static readonly TO = 15;
public static readonly PRIVATE = 16;
public static readonly SHARED = 17;
public static readonly STATE = 18;
public static readonly EDGE = 19;
public static readonly PROJECTION = 20;
public static readonly WITH = 21;
public static readonly ON = 22;
public static readonly POLICY = 23;
public static readonly DEFAULT = 24;
public static readonly SOURCE = 25;
public static readonly REPOSITORY = 26;
public static readonly COMMIT = 27;
public static readonly REVISION = 28;
public static readonly ID = 29;
public static readonly DOC = 30;
public static readonly MODE = 31;
public static readonly EMITS = 32;
public static readonly RECEIVER = 33;
public static readonly REQUIRES = 34;
public static readonly ANY = 35;
public static readonly GET = 36;
public static readonly SET = 37;
public static readonly WATCH = 38;
public static readonly START = 39;
public static readonly STOP = 40;
public static readonly READ = 41;
public static readonly WRITE = 42;
public static readonly RESOLVE = 43;
public static readonly CONNECT = 44;
public static readonly DISCONNECT = 45;
public static readonly CALL = 46;
public static readonly WATCH_START = 47;
public static readonly WATCH_STOP = 48;
public static readonly SUBSCRIBE = 49;
public static readonly UNSUBSCRIBE = 50;
public static readonly OPTIMISTIC_REGISTER = 51;
public static readonly CRDT = 52;
public static readonly OPTIONAL_ONE = 53;
public static readonly EXACTLY_ONE = 54;
public static readonly MANY_UNIQUE = 55;
public static readonly MANY = 56;
public static readonly ORDERED = 57;
public static readonly UNIT = 58;
public static readonly WATCH_HANDLE = 59;
public static readonly MESSAGE = 60;
public static readonly ATOM_REF = 61;
public static readonly INTERFACE_REF = 62;
public static readonly OPTIONAL = 63;
public static readonly LIST = 64;
public static readonly BOOL = 65;
public static readonly BYTES = 66;
public static readonly DOUBLE = 67;
public static readonly INT32 = 68;
public static readonly INT64 = 69;
public static readonly STRING = 70;
public static readonly UINT32 = 71;
public static readonly UINT64 = 72;
public static readonly TRUE = 73;
public static readonly FALSE = 74;
public static readonly NULL = 75;
public static readonly ARROW = 76;
public static readonly COLON = 77;
public static readonly SEMI = 78;
public static readonly COMMA = 79;
public static readonly DOT = 80;
public static readonly LBRACE = 81;
public static readonly RBRACE = 82;
public static readonly LBRACK = 83;
public static readonly RBRACK = 84;
public static readonly LPAREN = 85;
public static readonly RPAREN = 86;
public static readonly LT = 87;
public static readonly GT = 88;
public static readonly INTEGER = 89;
public static readonly JSON_NUMBER = 90;
public static readonly IDENTIFIER = 91;
public static readonly STRING_LITERAL = 92;
public static readonly LINE_COMMENT = 93;
public static readonly BLOCK_COMMENT = 94;
public static readonly WS = 95;
public static readonly channelNames = [
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
];
public static readonly literalNames = [
null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'",
"'value'", "'relation'", "'operation'", "'function'", "'constructor'",
"'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'",
"'shared'", "'state'", "'edge'", "'projection'", "'with'", "'on'",
"'policy'", "'default'", "'source'", "'repository'", "'commit'",
"'revision'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'",
"'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'",
"'read'", "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'",
"'watch-start'", "'watch-stop'", "'subscribe'", "'unsubscribe'",
"'optimistic-register'", "'crdt'", "'optional-one'", "'exactly-one'",
"'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'",
"'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'",
"'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'",
"'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'",
"';'", "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'",
"'>'"
];
public static readonly symbolicNames = [
null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE",
"VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS",
"CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE",
"PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY",
"COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER",
"REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ",
"WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START",
"WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER",
"CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED",
"UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF",
"OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64",
"STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW",
"COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK",
"LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER",
"STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS"
];
public static readonly modeNames = [
"DEFAULT_MODE",
];
public static readonly ruleNames = [
"WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE",
"RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS",
"CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE",
"PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY",
"COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER",
"REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ",
"WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START",
"WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER",
"CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED",
"UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF",
"OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64",
"STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW",
"COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK",
"LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER",
"STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT",
"WS",
];
public constructor(input: antlr.CharStream) {
super(input);
this.interpreter = new antlr.LexerATNSimulator(this, QuixosCapabilityLexer._ATN, QuixosCapabilityLexer.decisionsToDFA, new antlr.PredictionContextCache());
}
public get grammarFileName(): string { return "QuixosCapability.g4"; }
public get literalNames(): (string | null)[] { return QuixosCapabilityLexer.literalNames; }
public get symbolicNames(): (string | null)[] { return QuixosCapabilityLexer.symbolicNames; }
public get ruleNames(): string[] { return QuixosCapabilityLexer.ruleNames; }
public get serializedATN(): number[] { return QuixosCapabilityLexer._serializedATN; }
public get channelNames(): string[] { return QuixosCapabilityLexer.channelNames; }
public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; }
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,
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,
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,
26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,
32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,
39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,
45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,
52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,
58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,
65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
1,88,4,88,799,8,88,11,88,12,88,800,1,89,3,89,804,8,89,1,89,1,89,
1,89,5,89,809,8,89,10,89,12,89,812,9,89,3,89,814,8,89,1,89,1,89,
4,89,818,8,89,11,89,12,89,819,3,89,822,8,89,1,89,1,89,3,89,826,8,
89,1,89,4,89,829,8,89,11,89,12,89,830,3,89,833,8,89,1,90,1,90,5,
90,837,8,90,10,90,12,90,840,9,90,1,91,1,91,1,91,5,91,845,8,91,10,
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,
92,3,92,860,8,92,1,93,1,93,1,94,1,94,1,94,1,94,5,94,868,8,94,10,
94,12,94,871,9,94,1,94,1,94,1,95,1,95,1,95,1,95,5,95,879,8,95,10,
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,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,
15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,
37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,
59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,
81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,
51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60,
121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139,
70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79,
159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177,
89,179,90,181,91,183,92,185,0,187,0,189,93,191,94,193,95,1,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,90,
95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,
92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,
3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,909,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,
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,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,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,
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,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,
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,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,
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,
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,
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,
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,
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,
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,31,315,1,0,0,0,33,323,1,0,0,0,35,330,1,0,0,0,37,336,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,
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,57,409,1,0,0,0,59,412,1,0,0,0,61,416,1,0,0,0,63,421,1,0,0,0,
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,75,457,1,0,0,0,77,463,1,0,0,0,79,469,1,0,0,0,81,474,1,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,
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,101,562,1,0,0,0,103,582,1,0,0,0,105,587,1,0,0,0,107,600,
1,0,0,0,109,612,1,0,0,0,111,624,1,0,0,0,113,629,1,0,0,0,115,637,
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,125,686,1,0,0,0,127,695,1,0,0,0,129,700,1,0,0,0,131,705,
1,0,0,0,133,711,1,0,0,0,135,718,1,0,0,0,137,724,1,0,0,0,139,730,
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,149,762,1,0,0,0,151,767,1,0,0,0,153,770,1,0,0,0,155,772,
1,0,0,0,157,774,1,0,0,0,159,776,1,0,0,0,161,778,1,0,0,0,163,780,
1,0,0,0,165,782,1,0,0,0,167,784,1,0,0,0,169,786,1,0,0,0,171,788,
1,0,0,0,173,790,1,0,0,0,175,792,1,0,0,0,177,795,1,0,0,0,179,803,
1,0,0,0,181,834,1,0,0,0,183,841,1,0,0,0,185,851,1,0,0,0,187,861,
1,0,0,0,189,863,1,0,0,0,191,874,1,0,0,0,193,889,1,0,0,0,195,196,
5,119,0,0,196,197,5,111,0,0,197,198,5,114,0,0,198,199,5,107,0,0,
199,200,5,115,0,0,200,201,5,112,0,0,201,202,5,97,0,0,202,203,5,99,
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,207,208,5,111,0,0,208,209,5,109,0,0,209,4,1,0,0,0,210,211,5,
105,0,0,211,212,5,110,0,0,212,213,5,116,0,0,213,214,5,101,0,0,214,
215,5,114,0,0,215,216,5,102,0,0,216,217,5,97,0,0,217,218,5,99,0,
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,222,223,5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226,
5,102,0,0,226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229,
230,5,115,0,0,230,8,1,0,0,0,231,232,5,112,0,0,232,233,5,97,0,0,233,
234,5,99,0,0,234,235,5,107,0,0,235,236,5,97,0,0,236,237,5,103,0,
0,237,238,5,101,0,0,238,10,1,0,0,0,239,240,5,118,0,0,240,241,5,97,
0,0,241,242,5,108,0,0,242,243,5,117,0,0,243,244,5,101,0,0,244,12,
1,0,0,0,245,246,5,114,0,0,246,247,5,101,0,0,247,248,5,108,0,0,248,
249,5,97,0,0,249,250,5,116,0,0,250,251,5,105,0,0,251,252,5,111,0,
0,252,253,5,110,0,0,253,14,1,0,0,0,254,255,5,111,0,0,255,256,5,112,
0,0,256,257,5,101,0,0,257,258,5,114,0,0,258,259,5,97,0,0,259,260,
5,116,0,0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0,
263,16,1,0,0,0,264,265,5,102,0,0,265,266,5,117,0,0,266,267,5,110,
0,0,267,268,5,99,0,0,268,269,5,116,0,0,269,270,5,105,0,0,270,271,
5,111,0,0,271,272,5,110,0,0,272,18,1,0,0,0,273,274,5,99,0,0,274,
275,5,111,0,0,275,276,5,110,0,0,276,277,5,115,0,0,277,278,5,116,
0,0,278,279,5,114,0,0,279,280,5,117,0,0,280,281,5,99,0,0,281,282,
5,116,0,0,282,283,5,111,0,0,283,284,5,114,0,0,284,20,1,0,0,0,285,
286,5,99,0,0,286,287,5,111,0,0,287,288,5,110,0,0,288,289,5,115,0,
0,289,290,5,116,0,0,290,291,5,114,0,0,291,292,5,117,0,0,292,293,
5,99,0,0,293,294,5,116,0,0,294,295,5,115,0,0,295,22,1,0,0,0,296,
297,5,99,0,0,297,298,5,111,0,0,298,299,5,110,0,0,299,300,5,102,0,
0,300,301,5,111,0,0,301,302,5,114,0,0,302,303,5,109,0,0,303,24,1,
0,0,0,304,305,5,97,0,0,305,306,5,115,0,0,306,26,1,0,0,0,307,308,
5,98,0,0,308,309,5,105,0,0,309,310,5,110,0,0,310,311,5,100,0,0,311,
28,1,0,0,0,312,313,5,116,0,0,313,314,5,111,0,0,314,30,1,0,0,0,315,
316,5,112,0,0,316,317,5,114,0,0,317,318,5,105,0,0,318,319,5,118,
0,0,319,320,5,97,0,0,320,321,5,116,0,0,321,322,5,101,0,0,322,32,
1,0,0,0,323,324,5,115,0,0,324,325,5,104,0,0,325,326,5,97,0,0,326,
327,5,114,0,0,327,328,5,101,0,0,328,329,5,100,0,0,329,34,1,0,0,0,
330,331,5,115,0,0,331,332,5,116,0,0,332,333,5,97,0,0,333,334,5,116,
0,0,334,335,5,101,0,0,335,36,1,0,0,0,336,337,5,101,0,0,337,338,5,
100,0,0,338,339,5,103,0,0,339,340,5,101,0,0,340,38,1,0,0,0,341,342,
5,112,0,0,342,343,5,114,0,0,343,344,5,111,0,0,344,345,5,106,0,0,
345,346,5,101,0,0,346,347,5,99,0,0,347,348,5,116,0,0,348,349,5,105,
0,0,349,350,5,111,0,0,350,351,5,110,0,0,351,40,1,0,0,0,352,353,5,
119,0,0,353,354,5,105,0,0,354,355,5,116,0,0,355,356,5,104,0,0,356,
42,1,0,0,0,357,358,5,111,0,0,358,359,5,110,0,0,359,44,1,0,0,0,360,
361,5,112,0,0,361,362,5,111,0,0,362,363,5,108,0,0,363,364,5,105,
0,0,364,365,5,99,0,0,365,366,5,121,0,0,366,46,1,0,0,0,367,368,5,
100,0,0,368,369,5,101,0,0,369,370,5,102,0,0,370,371,5,97,0,0,371,
372,5,117,0,0,372,373,5,108,0,0,373,374,5,116,0,0,374,48,1,0,0,0,
375,376,5,115,0,0,376,377,5,111,0,0,377,378,5,117,0,0,378,379,5,
114,0,0,379,380,5,99,0,0,380,381,5,101,0,0,381,50,1,0,0,0,382,383,
5,114,0,0,383,384,5,101,0,0,384,385,5,112,0,0,385,386,5,111,0,0,
386,387,5,115,0,0,387,388,5,105,0,0,388,389,5,116,0,0,389,390,5,
111,0,0,390,391,5,114,0,0,391,392,5,121,0,0,392,52,1,0,0,0,393,394,
5,99,0,0,394,395,5,111,0,0,395,396,5,109,0,0,396,397,5,109,0,0,397,
398,5,105,0,0,398,399,5,116,0,0,399,54,1,0,0,0,400,401,5,114,0,0,
401,402,5,101,0,0,402,403,5,118,0,0,403,404,5,105,0,0,404,405,5,
115,0,0,405,406,5,105,0,0,406,407,5,111,0,0,407,408,5,110,0,0,408,
56,1,0,0,0,409,410,5,105,0,0,410,411,5,100,0,0,411,58,1,0,0,0,412,
413,5,100,0,0,413,414,5,111,0,0,414,415,5,99,0,0,415,60,1,0,0,0,
416,417,5,109,0,0,417,418,5,111,0,0,418,419,5,100,0,0,419,420,5,
101,0,0,420,62,1,0,0,0,421,422,5,101,0,0,422,423,5,109,0,0,423,424,
5,105,0,0,424,425,5,116,0,0,425,426,5,115,0,0,426,64,1,0,0,0,427,
428,5,114,0,0,428,429,5,101,0,0,429,430,5,99,0,0,430,431,5,101,0,
0,431,432,5,105,0,0,432,433,5,118,0,0,433,434,5,101,0,0,434,435,
5,114,0,0,435,66,1,0,0,0,436,437,5,114,0,0,437,438,5,101,0,0,438,
439,5,113,0,0,439,440,5,117,0,0,440,441,5,105,0,0,441,442,5,114,
0,0,442,443,5,101,0,0,443,444,5,115,0,0,444,68,1,0,0,0,445,446,5,
97,0,0,446,447,5,110,0,0,447,448,5,121,0,0,448,70,1,0,0,0,449,450,
5,103,0,0,450,451,5,101,0,0,451,452,5,116,0,0,452,72,1,0,0,0,453,
454,5,115,0,0,454,455,5,101,0,0,455,456,5,116,0,0,456,74,1,0,0,0,
457,458,5,119,0,0,458,459,5,97,0,0,459,460,5,116,0,0,460,461,5,99,
0,0,461,462,5,104,0,0,462,76,1,0,0,0,463,464,5,115,0,0,464,465,5,
116,0,0,465,466,5,97,0,0,466,467,5,114,0,0,467,468,5,116,0,0,468,
78,1,0,0,0,469,470,5,115,0,0,470,471,5,116,0,0,471,472,5,111,0,0,
472,473,5,112,0,0,473,80,1,0,0,0,474,475,5,114,0,0,475,476,5,101,
0,0,476,477,5,97,0,0,477,478,5,100,0,0,478,82,1,0,0,0,479,480,5,
119,0,0,480,481,5,114,0,0,481,482,5,105,0,0,482,483,5,116,0,0,483,
484,5,101,0,0,484,84,1,0,0,0,485,486,5,114,0,0,486,487,5,101,0,0,
487,488,5,115,0,0,488,489,5,111,0,0,489,490,5,108,0,0,490,491,5,
118,0,0,491,492,5,101,0,0,492,86,1,0,0,0,493,494,5,99,0,0,494,495,
5,111,0,0,495,496,5,110,0,0,496,497,5,110,0,0,497,498,5,101,0,0,
498,499,5,99,0,0,499,500,5,116,0,0,500,88,1,0,0,0,501,502,5,100,
0,0,502,503,5,105,0,0,503,504,5,115,0,0,504,505,5,99,0,0,505,506,
5,111,0,0,506,507,5,110,0,0,507,508,5,110,0,0,508,509,5,101,0,0,
509,510,5,99,0,0,510,511,5,116,0,0,511,90,1,0,0,0,512,513,5,99,0,
0,513,514,5,97,0,0,514,515,5,108,0,0,515,516,5,108,0,0,516,92,1,
0,0,0,517,518,5,119,0,0,518,519,5,97,0,0,519,520,5,116,0,0,520,521,
5,99,0,0,521,522,5,104,0,0,522,523,5,45,0,0,523,524,5,115,0,0,524,
525,5,116,0,0,525,526,5,97,0,0,526,527,5,114,0,0,527,528,5,116,0,
0,528,94,1,0,0,0,529,530,5,119,0,0,530,531,5,97,0,0,531,532,5,116,
0,0,532,533,5,99,0,0,533,534,5,104,0,0,534,535,5,45,0,0,535,536,
5,115,0,0,536,537,5,116,0,0,537,538,5,111,0,0,538,539,5,112,0,0,
539,96,1,0,0,0,540,541,5,115,0,0,541,542,5,117,0,0,542,543,5,98,
0,0,543,544,5,115,0,0,544,545,5,99,0,0,545,546,5,114,0,0,546,547,
5,105,0,0,547,548,5,98,0,0,548,549,5,101,0,0,549,98,1,0,0,0,550,
551,5,117,0,0,551,552,5,110,0,0,552,553,5,115,0,0,553,554,5,117,
0,0,554,555,5,98,0,0,555,556,5,115,0,0,556,557,5,99,0,0,557,558,
5,114,0,0,558,559,5,105,0,0,559,560,5,98,0,0,560,561,5,101,0,0,561,
100,1,0,0,0,562,563,5,111,0,0,563,564,5,112,0,0,564,565,5,116,0,
0,565,566,5,105,0,0,566,567,5,109,0,0,567,568,5,105,0,0,568,569,
5,115,0,0,569,570,5,116,0,0,570,571,5,105,0,0,571,572,5,99,0,0,572,
573,5,45,0,0,573,574,5,114,0,0,574,575,5,101,0,0,575,576,5,103,0,
0,576,577,5,105,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580,
5,101,0,0,580,581,5,114,0,0,581,102,1,0,0,0,582,583,5,99,0,0,583,
584,5,114,0,0,584,585,5,100,0,0,585,586,5,116,0,0,586,104,1,0,0,
0,587,588,5,111,0,0,588,589,5,112,0,0,589,590,5,116,0,0,590,591,
5,105,0,0,591,592,5,111,0,0,592,593,5,110,0,0,593,594,5,97,0,0,594,
595,5,108,0,0,595,596,5,45,0,0,596,597,5,111,0,0,597,598,5,110,0,
0,598,599,5,101,0,0,599,106,1,0,0,0,600,601,5,101,0,0,601,602,5,
120,0,0,602,603,5,97,0,0,603,604,5,99,0,0,604,605,5,116,0,0,605,
606,5,108,0,0,606,607,5,121,0,0,607,608,5,45,0,0,608,609,5,111,0,
0,609,610,5,110,0,0,610,611,5,101,0,0,611,108,1,0,0,0,612,613,5,
109,0,0,613,614,5,97,0,0,614,615,5,110,0,0,615,616,5,121,0,0,616,
617,5,45,0,0,617,618,5,117,0,0,618,619,5,110,0,0,619,620,5,105,0,
0,620,621,5,113,0,0,621,622,5,117,0,0,622,623,5,101,0,0,623,110,
1,0,0,0,624,625,5,109,0,0,625,626,5,97,0,0,626,627,5,110,0,0,627,
628,5,121,0,0,628,112,1,0,0,0,629,630,5,111,0,0,630,631,5,114,0,
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,635,636,5,100,0,0,636,114,1,0,0,0,637,638,5,117,0,0,638,
639,5,110,0,0,639,640,5,105,0,0,640,641,5,116,0,0,641,116,1,0,0,
0,642,643,5,119,0,0,643,644,5,97,0,0,644,645,5,116,0,0,645,646,5,
99,0,0,646,647,5,104,0,0,647,648,5,45,0,0,648,649,5,104,0,0,649,
650,5,97,0,0,650,651,5,110,0,0,651,652,5,100,0,0,652,653,5,108,0,
0,653,654,5,101,0,0,654,118,1,0,0,0,655,656,5,109,0,0,656,657,5,
101,0,0,657,658,5,115,0,0,658,659,5,115,0,0,659,660,5,97,0,0,660,
661,5,103,0,0,661,662,5,101,0,0,662,120,1,0,0,0,663,664,5,97,0,0,
664,665,5,116,0,0,665,666,5,111,0,0,666,667,5,109,0,0,667,668,5,
45,0,0,668,669,5,114,0,0,669,670,5,101,0,0,670,671,5,102,0,0,671,
122,1,0,0,0,672,673,5,105,0,0,673,674,5,110,0,0,674,675,5,116,0,
0,675,676,5,101,0,0,676,677,5,114,0,0,677,678,5,102,0,0,678,679,
5,97,0,0,679,680,5,99,0,0,680,681,5,101,0,0,681,682,5,45,0,0,682,
683,5,114,0,0,683,684,5,101,0,0,684,685,5,102,0,0,685,124,1,0,0,
0,686,687,5,111,0,0,687,688,5,112,0,0,688,689,5,116,0,0,689,690,
5,105,0,0,690,691,5,111,0,0,691,692,5,110,0,0,692,693,5,97,0,0,693,
694,5,108,0,0,694,126,1,0,0,0,695,696,5,108,0,0,696,697,5,105,0,
0,697,698,5,115,0,0,698,699,5,116,0,0,699,128,1,0,0,0,700,701,5,
98,0,0,701,702,5,111,0,0,702,703,5,111,0,0,703,704,5,108,0,0,704,
130,1,0,0,0,705,706,5,98,0,0,706,707,5,121,0,0,707,708,5,116,0,0,
708,709,5,101,0,0,709,710,5,115,0,0,710,132,1,0,0,0,711,712,5,100,
0,0,712,713,5,111,0,0,713,714,5,117,0,0,714,715,5,98,0,0,715,716,
5,108,0,0,716,717,5,101,0,0,717,134,1,0,0,0,718,719,5,105,0,0,719,
720,5,110,0,0,720,721,5,116,0,0,721,722,5,51,0,0,722,723,5,50,0,
0,723,136,1,0,0,0,724,725,5,105,0,0,725,726,5,110,0,0,726,727,5,
116,0,0,727,728,5,54,0,0,728,729,5,52,0,0,729,138,1,0,0,0,730,731,
5,115,0,0,731,732,5,116,0,0,732,733,5,114,0,0,733,734,5,105,0,0,
734,735,5,110,0,0,735,736,5,103,0,0,736,140,1,0,0,0,737,738,5,117,
0,0,738,739,5,105,0,0,739,740,5,110,0,0,740,741,5,116,0,0,741,742,
5,51,0,0,742,743,5,50,0,0,743,142,1,0,0,0,744,745,5,117,0,0,745,
746,5,105,0,0,746,747,5,110,0,0,747,748,5,116,0,0,748,749,5,54,0,
0,749,750,5,52,0,0,750,144,1,0,0,0,751,752,5,116,0,0,752,753,5,114,
0,0,753,754,5,117,0,0,754,755,5,101,0,0,755,146,1,0,0,0,756,757,
5,102,0,0,757,758,5,97,0,0,758,759,5,108,0,0,759,760,5,115,0,0,760,
761,5,101,0,0,761,148,1,0,0,0,762,763,5,110,0,0,763,764,5,117,0,
0,764,765,5,108,0,0,765,766,5,108,0,0,766,150,1,0,0,0,767,768,5,
45,0,0,768,769,5,62,0,0,769,152,1,0,0,0,770,771,5,58,0,0,771,154,
1,0,0,0,772,773,5,59,0,0,773,156,1,0,0,0,774,775,5,44,0,0,775,158,
1,0,0,0,776,777,5,46,0,0,777,160,1,0,0,0,778,779,5,123,0,0,779,162,
1,0,0,0,780,781,5,125,0,0,781,164,1,0,0,0,782,783,5,91,0,0,783,166,
1,0,0,0,784,785,5,93,0,0,785,168,1,0,0,0,786,787,5,40,0,0,787,170,
1,0,0,0,788,789,5,41,0,0,789,172,1,0,0,0,790,791,5,60,0,0,791,174,
1,0,0,0,792,793,5,62,0,0,793,176,1,0,0,0,794,796,5,45,0,0,795,794,
1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,799,7,0,0,0,798,797,
1,0,0,0,799,800,1,0,0,0,800,798,1,0,0,0,800,801,1,0,0,0,801,178,
1,0,0,0,802,804,5,45,0,0,803,802,1,0,0,0,803,804,1,0,0,0,804,813,
1,0,0,0,805,814,5,48,0,0,806,810,7,1,0,0,807,809,7,0,0,0,808,807,
1,0,0,0,809,812,1,0,0,0,810,808,1,0,0,0,810,811,1,0,0,0,811,814,
1,0,0,0,812,810,1,0,0,0,813,805,1,0,0,0,813,806,1,0,0,0,814,821,
1,0,0,0,815,817,5,46,0,0,816,818,7,0,0,0,817,816,1,0,0,0,818,819,
1,0,0,0,819,817,1,0,0,0,819,820,1,0,0,0,820,822,1,0,0,0,821,815,
1,0,0,0,821,822,1,0,0,0,822,832,1,0,0,0,823,825,7,2,0,0,824,826,
7,3,0,0,825,824,1,0,0,0,825,826,1,0,0,0,826,828,1,0,0,0,827,829,
7,0,0,0,828,827,1,0,0,0,829,830,1,0,0,0,830,828,1,0,0,0,830,831,
1,0,0,0,831,833,1,0,0,0,832,823,1,0,0,0,832,833,1,0,0,0,833,180,
1,0,0,0,834,838,7,4,0,0,835,837,7,5,0,0,836,835,1,0,0,0,837,840,
1,0,0,0,838,836,1,0,0,0,838,839,1,0,0,0,839,182,1,0,0,0,840,838,
1,0,0,0,841,846,5,34,0,0,842,845,3,185,92,0,843,845,8,6,0,0,844,
842,1,0,0,0,844,843,1,0,0,0,845,848,1,0,0,0,846,844,1,0,0,0,846,
847,1,0,0,0,847,849,1,0,0,0,848,846,1,0,0,0,849,850,5,34,0,0,850,
184,1,0,0,0,851,859,5,92,0,0,852,860,7,7,0,0,853,854,5,117,0,0,854,
855,3,187,93,0,855,856,3,187,93,0,856,857,3,187,93,0,857,858,3,187,
93,0,858,860,1,0,0,0,859,852,1,0,0,0,859,853,1,0,0,0,860,186,1,0,
0,0,861,862,7,8,0,0,862,188,1,0,0,0,863,864,5,47,0,0,864,865,5,47,
0,0,865,869,1,0,0,0,866,868,8,9,0,0,867,866,1,0,0,0,868,871,1,0,
0,0,869,867,1,0,0,0,869,870,1,0,0,0,870,872,1,0,0,0,871,869,1,0,
0,0,872,873,6,94,0,0,873,190,1,0,0,0,874,875,5,47,0,0,875,876,5,
42,0,0,876,880,1,0,0,0,877,879,9,0,0,0,878,877,1,0,0,0,879,882,1,
0,0,0,880,881,1,0,0,0,880,878,1,0,0,0,881,883,1,0,0,0,882,880,1,
0,0,0,883,884,5,42,0,0,884,885,5,47,0,0,885,886,1,0,0,0,886,887,
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,891,889,1,0,0,0,891,892,1,0,0,0,892,893,1,0,0,0,893,894,
6,96,0,0,894,194,1,0,0,0,18,0,795,800,803,810,813,819,821,825,830,
832,838,844,846,859,869,880,891,1,6,0,0
];
private static __ATN: antlr.ATN;
public static get _ATN(): antlr.ATN {
if (!QuixosCapabilityLexer.__ATN) {
QuixosCapabilityLexer.__ATN = new antlr.ATNDeserializer().deserialize(QuixosCapabilityLexer._serializedATN);
}
return QuixosCapabilityLexer.__ATN;
}
private static readonly vocabulary = new antlr.Vocabulary(QuixosCapabilityLexer.literalNames, QuixosCapabilityLexer.symbolicNames, []);
public override get vocabulary(): antlr.Vocabulary {
return QuixosCapabilityLexer.vocabulary;
}
private static readonly decisionsToDFA = QuixosCapabilityLexer._ATN.decisionToState.map( (ds: antlr.DecisionState, index: number) => new antlr.DFA(ds, index) );
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,380 @@
import { AbstractParseTreeVisitor } from "antlr4ng";
import { DocumentContext } from "./QuixosCapabilityParser.js";
import { WorkspaceDeclContext } from "./QuixosCapabilityParser.js";
import { WorkspaceItemContext } from "./QuixosCapabilityParser.js";
import { AtomDeclContext } from "./QuixosCapabilityParser.js";
import { InterfaceDeclContext } from "./QuixosCapabilityParser.js";
import { SourceBlockContext } from "./QuixosCapabilityParser.js";
import { InterfaceMemberContext } from "./QuixosCapabilityParser.js";
import { OperationMemberContext } from "./QuixosCapabilityParser.js";
import { ValueMemberContext } from "./QuixosCapabilityParser.js";
import { ValueMemberOperationContext } from "./QuixosCapabilityParser.js";
import { RelationshipMemberContext } from "./QuixosCapabilityParser.js";
import { RelationshipOperationContext } from "./QuixosCapabilityParser.js";
import { TargetConstraintContext } from "./QuixosCapabilityParser.js";
import { PackageDeclContext } from "./QuixosCapabilityParser.js";
import { PackageExportContext } from "./QuixosCapabilityParser.js";
import { PackageOperationExportContext } from "./QuixosCapabilityParser.js";
import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js";
import { PackageConstructorExportContext } from "./QuixosCapabilityParser.js";
import { EventClauseContext } from "./QuixosCapabilityParser.js";
import { OperationModeContext } from "./QuixosCapabilityParser.js";
import { ReceiverRequirementContext } from "./QuixosCapabilityParser.js";
import { IdentifierListContext } from "./QuixosCapabilityParser.js";
import { DependencyBlockContext } from "./QuixosCapabilityParser.js";
import { DependencyPortContext } from "./QuixosCapabilityParser.js";
import { PrimitiveListContext } from "./QuixosCapabilityParser.js";
import { PrimitiveContext } from "./QuixosCapabilityParser.js";
import { SharedAttachmentDeclContext } from "./QuixosCapabilityParser.js";
import { AttachmentDeclContext } from "./QuixosCapabilityParser.js";
import { StateDeclContext } from "./QuixosCapabilityParser.js";
import { StoragePolicyContext } from "./QuixosCapabilityParser.js";
import { EdgeDeclContext } from "./QuixosCapabilityParser.js";
import { EdgeEndpointContext } from "./QuixosCapabilityParser.js";
import { ConformanceDeclContext } from "./QuixosCapabilityParser.js";
import { ConformanceItemContext } from "./QuixosCapabilityParser.js";
import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js";
import { MemberOperationRefContext } from "./QuixosCapabilityParser.js";
import { OperationNameContext } from "./QuixosCapabilityParser.js";
import { OperationProviderContext } from "./QuixosCapabilityParser.js";
import { StatePrimitiveContext } from "./QuixosCapabilityParser.js";
import { EdgePrimitiveContext } from "./QuixosCapabilityParser.js";
import { DependencyBindingBlockContext } from "./QuixosCapabilityParser.js";
import { DependencyBindingContext } from "./QuixosCapabilityParser.js";
import { ConstructorBindingDeclContext } from "./QuixosCapabilityParser.js";
import { ValueTypeContext } from "./QuixosCapabilityParser.js";
import { ScalarTypeContext } from "./QuixosCapabilityParser.js";
import { CardinalityContext } from "./QuixosCapabilityParser.js";
import { JsonLiteralContext } from "./QuixosCapabilityParser.js";
import { JsonObjectContext } from "./QuixosCapabilityParser.js";
import { JsonMemberContext } from "./QuixosCapabilityParser.js";
import { JsonArrayContext } from "./QuixosCapabilityParser.js";
import { IdentifierContext } from "./QuixosCapabilityParser.js";
import { StringLiteralContext } from "./QuixosCapabilityParser.js";
/**
* This interface defines a complete generic visitor for a parse tree produced
* by `QuixosCapabilityParser`.
*
* @param <Result> The return type of the visit operation. Use `void` for
* operations with no return type.
*/
export class QuixosCapabilityVisitor<Result> extends AbstractParseTreeVisitor<Result> {
/**
* Visit a parse tree produced by `QuixosCapabilityParser.document`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDocument?: (ctx: DocumentContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.workspaceDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitWorkspaceDecl?: (ctx: WorkspaceDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.workspaceItem`.
* @param ctx the parse tree
* @return the visitor result
*/
visitWorkspaceItem?: (ctx: WorkspaceItemContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.atomDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitAtomDecl?: (ctx: AtomDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.interfaceDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitInterfaceDecl?: (ctx: InterfaceDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.sourceBlock`.
* @param ctx the parse tree
* @return the visitor result
*/
visitSourceBlock?: (ctx: SourceBlockContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.interfaceMember`.
* @param ctx the parse tree
* @return the visitor result
*/
visitInterfaceMember?: (ctx: InterfaceMemberContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.operationMember`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOperationMember?: (ctx: OperationMemberContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.valueMember`.
* @param ctx the parse tree
* @return the visitor result
*/
visitValueMember?: (ctx: ValueMemberContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.valueMemberOperation`.
* @param ctx the parse tree
* @return the visitor result
*/
visitValueMemberOperation?: (ctx: ValueMemberOperationContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.relationshipMember`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRelationshipMember?: (ctx: RelationshipMemberContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.relationshipOperation`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRelationshipOperation?: (ctx: RelationshipOperationContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.targetConstraint`.
* @param ctx the parse tree
* @return the visitor result
*/
visitTargetConstraint?: (ctx: TargetConstraintContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPackageDecl?: (ctx: PackageDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageExport`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPackageExport?: (ctx: PackageExportContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageOperationExport`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPackageOperationExport?: (ctx: PackageOperationExportContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageFunctionExport`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPackageFunctionExport?: (ctx: PackageFunctionExportContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.packageConstructorExport`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPackageConstructorExport?: (ctx: PackageConstructorExportContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.eventClause`.
* @param ctx the parse tree
* @return the visitor result
*/
visitEventClause?: (ctx: EventClauseContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.operationMode`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOperationMode?: (ctx: OperationModeContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.receiverRequirement`.
* @param ctx the parse tree
* @return the visitor result
*/
visitReceiverRequirement?: (ctx: ReceiverRequirementContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.identifierList`.
* @param ctx the parse tree
* @return the visitor result
*/
visitIdentifierList?: (ctx: IdentifierListContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.dependencyBlock`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDependencyBlock?: (ctx: DependencyBlockContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.dependencyPort`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDependencyPort?: (ctx: DependencyPortContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.primitiveList`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPrimitiveList?: (ctx: PrimitiveListContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.primitive`.
* @param ctx the parse tree
* @return the visitor result
*/
visitPrimitive?: (ctx: PrimitiveContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.sharedAttachmentDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitSharedAttachmentDecl?: (ctx: SharedAttachmentDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.attachmentDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitAttachmentDecl?: (ctx: AttachmentDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.stateDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitStateDecl?: (ctx: StateDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.storagePolicy`.
* @param ctx the parse tree
* @return the visitor result
*/
visitStoragePolicy?: (ctx: StoragePolicyContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.edgeDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitEdgeDecl?: (ctx: EdgeDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.edgeEndpoint`.
* @param ctx the parse tree
* @return the visitor result
*/
visitEdgeEndpoint?: (ctx: EdgeEndpointContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.conformanceDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitConformanceDecl?: (ctx: ConformanceDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.conformanceItem`.
* @param ctx the parse tree
* @return the visitor result
*/
visitConformanceItem?: (ctx: ConformanceItemContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.operationBindingDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOperationBindingDecl?: (ctx: OperationBindingDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.memberOperationRef`.
* @param ctx the parse tree
* @return the visitor result
*/
visitMemberOperationRef?: (ctx: MemberOperationRefContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.operationName`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOperationName?: (ctx: OperationNameContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.operationProvider`.
* @param ctx the parse tree
* @return the visitor result
*/
visitOperationProvider?: (ctx: OperationProviderContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.statePrimitive`.
* @param ctx the parse tree
* @return the visitor result
*/
visitStatePrimitive?: (ctx: StatePrimitiveContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.edgePrimitive`.
* @param ctx the parse tree
* @return the visitor result
*/
visitEdgePrimitive?: (ctx: EdgePrimitiveContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.dependencyBindingBlock`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDependencyBindingBlock?: (ctx: DependencyBindingBlockContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.dependencyBinding`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDependencyBinding?: (ctx: DependencyBindingContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.constructorBindingDecl`.
* @param ctx the parse tree
* @return the visitor result
*/
visitConstructorBindingDecl?: (ctx: ConstructorBindingDeclContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.valueType`.
* @param ctx the parse tree
* @return the visitor result
*/
visitValueType?: (ctx: ValueTypeContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.scalarType`.
* @param ctx the parse tree
* @return the visitor result
*/
visitScalarType?: (ctx: ScalarTypeContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.cardinality`.
* @param ctx the parse tree
* @return the visitor result
*/
visitCardinality?: (ctx: CardinalityContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.jsonLiteral`.
* @param ctx the parse tree
* @return the visitor result
*/
visitJsonLiteral?: (ctx: JsonLiteralContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.jsonObject`.
* @param ctx the parse tree
* @return the visitor result
*/
visitJsonObject?: (ctx: JsonObjectContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.jsonMember`.
* @param ctx the parse tree
* @return the visitor result
*/
visitJsonMember?: (ctx: JsonMemberContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.jsonArray`.
* @param ctx the parse tree
* @return the visitor result
*/
visitJsonArray?: (ctx: JsonArrayContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.identifier`.
* @param ctx the parse tree
* @return the visitor result
*/
visitIdentifier?: (ctx: IdentifierContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.stringLiteral`.
* @param ctx the parse tree
* @return the visitor result
*/
visitStringLiteral?: (ctx: StringLiteralContext) => Result;
}
+1
View File
@@ -0,0 +1 @@
export * from "./parser.js";
File diff suppressed because it is too large Load Diff
+2
View File
@@ -0,0 +1,2 @@
export * from "./types.js";
export * from "./validation.js";
+373
View File
@@ -0,0 +1,373 @@
declare const opaqueIdBrand: unique symbol;
type OpaqueId<Kind extends string> = string & {
readonly [opaqueIdBrand]: Kind;
};
export type WorkspaceId = OpaqueId<"WorkspaceId">;
export type WorkspaceRevisionId = OpaqueId<"WorkspaceRevisionId">;
export type AtomId = OpaqueId<"AtomId">;
export type InterfaceId = OpaqueId<"InterfaceId">;
export type InterfaceRevisionId = OpaqueId<"InterfaceRevisionId">;
export type MemberId = OpaqueId<"MemberId">;
export type OperationId = OpaqueId<"OperationId">;
export type SlotId = OpaqueId<"SlotId">;
export type EdgeTypeId = OpaqueId<"EdgeTypeId">;
export type EdgeProjectionId = OpaqueId<"EdgeProjectionId">;
export type PackageId = OpaqueId<"PackageId">;
export type PackageRevisionId = OpaqueId<"PackageRevisionId">;
export type PackageExportId = OpaqueId<"PackageExportId">;
export type DependencyPortId = OpaqueId<"DependencyPortId">;
export type ObjectId = OpaqueId<"ObjectId">;
const opaque = <Kind extends string>(value: string) => value as OpaqueId<Kind>;
/**
* Textual IDs remain opaque to the semantic model. Authoring tools may mint
* UUID-backed values later without changing the checked IR.
*/
export const capabilityId = {
workspace: (value: string) => opaque<"WorkspaceId">(value),
workspaceRevision: (value: string) =>
opaque<"WorkspaceRevisionId">(value),
atom: (value: string) => opaque<"AtomId">(value),
interface: (value: string) => opaque<"InterfaceId">(value),
interfaceRevision: (value: string) =>
opaque<"InterfaceRevisionId">(value),
member: (value: string) => opaque<"MemberId">(value),
operation: (value: string) => opaque<"OperationId">(value),
slot: (value: string) => opaque<"SlotId">(value),
edgeType: (value: string) => opaque<"EdgeTypeId">(value),
edgeProjection: (value: string) => opaque<"EdgeProjectionId">(value),
package: (value: string) => opaque<"PackageId">(value),
packageRevision: (value: string) => opaque<"PackageRevisionId">(value),
packageExport: (value: string) => opaque<"PackageExportId">(value),
dependencyPort: (value: string) => opaque<"DependencyPortId">(value),
object: (value: string) => opaque<"ObjectId">(value),
} as const;
export interface SourceRevision {
repository: string;
commit: string;
}
export type ScalarValueTypeName =
| "bool"
| "bytes"
| "double"
| "int32"
| "int64"
| "string"
| "uint32"
| "uint64";
export type ObjectExpectation =
| { kind: "atom"; atomId: AtomId }
| {
kind: "interface";
interfaceRevisionId: InterfaceRevisionId;
};
export type ValueType =
| { kind: "builtin"; name: "unit" | "watch-handle" }
| { kind: "scalar"; name: ScalarValueTypeName }
| { kind: "message"; descriptorId: string }
| { kind: "object-ref"; expectation: ObjectExpectation }
| { kind: "optional"; value: ValueType }
| { kind: "list"; value: ValueType };
export const valueType = {
unit: { kind: "builtin", name: "unit" } as const,
watchHandle: { kind: "builtin", name: "watch-handle" } as const,
bool: { kind: "scalar", name: "bool" } as const,
bytes: { kind: "scalar", name: "bytes" } as const,
double: { kind: "scalar", name: "double" } as const,
int32: { kind: "scalar", name: "int32" } as const,
int64: { kind: "scalar", name: "int64" } as const,
string: { kind: "scalar", name: "string" } as const,
uint32: { kind: "scalar", name: "uint32" } as const,
uint64: { kind: "scalar", name: "uint64" } as const,
message: (descriptorId: string): ValueType => ({
kind: "message",
descriptorId,
}),
atomRef: (atomId: AtomId): ValueType => ({
kind: "object-ref",
expectation: { kind: "atom", atomId },
}),
interfaceRef: (interfaceRevisionId: InterfaceRevisionId): ValueType => ({
kind: "object-ref",
expectation: { kind: "interface", interfaceRevisionId },
}),
optional: (value: ValueType): ValueType => ({ kind: "optional", value }),
list: (value: ValueType): ValueType => ({ kind: "list", value }),
} as const;
export interface AtomDefinition {
id: AtomId;
displayName: string;
documentation?: string;
}
export type InterfaceOperationMode =
| "call"
| "watch-start"
| "watch-stop"
| "subscribe"
| "unsubscribe";
export interface InterfaceOperation {
id: OperationId;
displayName: string;
inputType: ValueType;
outputType: ValueType;
mode: InterfaceOperationMode;
/** Required for watch-start/subscribe and absent for other modes. */
eventType?: ValueType;
}
interface InterfaceMemberBase {
id: MemberId;
displayName: string;
operations: InterfaceOperation[];
}
export interface ValueInterfaceMember extends InterfaceMemberBase {
kind: "value";
valueType: ValueType;
}
export type EdgeCardinality =
| "optional-one"
| "exactly-one"
| "many"
| "many-unique";
export type EdgeEndpointConstraint =
| { kind: "atom"; atomId: AtomId }
| {
kind: "interface";
interfaceRevisionId: InterfaceRevisionId;
};
export interface RelationshipInterfaceMember extends InterfaceMemberBase {
kind: "relationship";
target: EdgeEndpointConstraint;
cardinality: EdgeCardinality;
ordered: boolean;
}
/** A named callable capability that is not value or relationship sugar. */
export interface OperationInterfaceMember extends InterfaceMemberBase {
kind: "operation";
inputType: ValueType;
outputType: ValueType;
}
export type InterfaceMember =
| ValueInterfaceMember
| RelationshipInterfaceMember
| OperationInterfaceMember;
export interface InterfaceRevision {
interfaceId: InterfaceId;
revisionId: InterfaceRevisionId;
displayName: string;
source: SourceRevision;
members: InterfaceMember[];
}
export type StoragePolicy =
| { kind: "optimistic-register" }
| { kind: "crdt-document"; updateType: ValueType };
export interface StateSlotDefinition {
kind: "state";
id: SlotId;
attachedTo: AtomId;
displayName: string;
valueType: ValueType;
storagePolicy: StoragePolicy;
defaultValue?: unknown;
}
export interface EdgeEndpoint {
projectionId: EdgeProjectionId;
displayName: string;
constraint: EdgeEndpointConstraint;
cardinality: EdgeCardinality;
ordered: boolean;
}
export interface EdgeDefinition {
kind: "edge";
id: EdgeTypeId;
displayName: string;
endpoints: [EdgeEndpoint, EdgeEndpoint];
}
export type PersistentAttachment = StateSlotDefinition | EdgeDefinition;
export type StatePrimitive =
| "read"
| "write"
| "watch-start"
| "watch-stop";
export type EdgePrimitive =
| "resolve"
| "connect"
| "disconnect"
| "watch-start"
| "watch-stop";
export type PackageReceiverRequirement =
| { kind: "any-object" }
| { kind: "exact-atom"; atomId: AtomId }
| {
kind: "all-interfaces";
interfaceRevisionIds: InterfaceRevisionId[];
};
export type DependencyPortRequirement =
| {
kind: "state";
valueType: ValueType;
primitives: StatePrimitive[];
}
| {
kind: "edge";
target: EdgeEndpointConstraint;
cardinality: EdgeCardinality;
primitives: EdgePrimitive[];
}
| {
kind: "receiver-interface";
interfaceRevisionId: InterfaceRevisionId;
}
| { kind: "constructor"; atomId: AtomId };
export interface DependencyPort {
id: DependencyPortId;
displayName: string;
requirement: DependencyPortRequirement;
}
interface PackageExportBase {
id: PackageExportId;
displayName: string;
inputType: ValueType;
outputType: ValueType;
dependencyPorts: DependencyPort[];
}
export interface PackageOperationExport extends PackageExportBase {
kind: "operation";
mode: InterfaceOperationMode;
eventType?: ValueType;
receiverRequirement: PackageReceiverRequirement;
}
export interface PackageFunctionExport extends PackageExportBase {
kind: "function";
}
export interface PackageConstructorExport extends PackageExportBase {
kind: "constructor";
constructsAtom: AtomId;
}
export type PackageExport =
| PackageOperationExport
| PackageFunctionExport
| PackageConstructorExport;
export interface PackageRevision {
packageId: PackageId;
revisionId: PackageRevisionId;
displayName: string;
source: SourceRevision;
exports: PackageExport[];
}
export type DependencyBinding =
| { kind: "state"; slotId: SlotId }
| {
kind: "edge";
edgeTypeId: EdgeTypeId;
projectionId: EdgeProjectionId;
}
| {
kind: "receiver-interface";
interfaceRevisionId: InterfaceRevisionId;
}
| { kind: "constructor"; atomId: AtomId };
export interface BoundDependency {
portId: DependencyPortId;
binding: DependencyBinding;
}
export type Binding =
| {
kind: "state";
slotId: SlotId;
primitive: StatePrimitive;
}
| {
kind: "edge";
edgeTypeId: EdgeTypeId;
projectionId: EdgeProjectionId;
primitive: EdgePrimitive;
}
| {
kind: "package";
packageRevisionId: PackageRevisionId;
exportId: PackageExportId;
dependencies: BoundDependency[];
};
export interface OperationBinding {
operationId: OperationId;
binding: Binding;
}
export interface Conformance {
atomId: AtomId;
interfaceRevisionId: InterfaceRevisionId;
privateAttachments: PersistentAttachment[];
operationBindings: OperationBinding[];
}
export interface AtomConstructorBinding {
atomId: AtomId;
packageRevisionId: PackageRevisionId;
exportId: PackageExportId;
dependencies: BoundDependency[];
}
export interface WorkspaceRevision {
id: WorkspaceRevisionId;
workspaceId: WorkspaceId;
parentRevisionIds: WorkspaceRevisionId[];
sourceRootCommit: string;
atoms: AtomDefinition[];
sharedAttachments: PersistentAttachment[];
interfaceImports: InterfaceRevision[];
packageImports: PackageRevision[];
conformances: Conformance[];
constructors: AtomConstructorBinding[];
}
export type AttachmentOwner =
| { kind: "workspace" }
| {
kind: "conformance";
atomId: AtomId;
interfaceRevisionId: InterfaceRevisionId;
};
export interface OwnedAttachment {
attachment: PersistentAttachment;
owner: AttachmentOwner;
}
File diff suppressed because it is too large Load Diff
+15 -93
View File
@@ -3,23 +3,7 @@ import fs from "node:fs";
import path from "node:path";
import { fromBinary, toJsonString } from "@bufbuild/protobuf";
import type { PackageDescriptor } from "./gen/quixos/package_pb.js";
import {
FunctionCapabilityKind,
PackageDescriptorSchema,
} from "./gen/quixos/package_pb.js";
const functionKey = (value: {
packageNamespace: string;
packageName: string;
symbol: string;
versionRef: string;
}) =>
[
value.packageNamespace,
value.packageName,
value.symbol,
value.versionRef,
].join(":");
import { PackageDescriptorSchema } from "./gen/quixos/package_pb.js";
const protoPaths = () => {
const candidates = [
@@ -76,87 +60,25 @@ export const validatePackageDescriptor = (
descriptor: PackageDescriptor,
): string[] => {
const errors: string[] = [];
if (!descriptor.packageNamespace) {
errors.push("packageNamespace is required");
if (!descriptor.packageId) {
errors.push("packageId is required");
}
if (!descriptor.packageName) {
errors.push("packageName is required");
if (!descriptor.packageRevisionId) {
errors.push("packageRevisionId is required");
}
if (descriptor.descriptorVersion === 0) {
errors.push("descriptorVersion must be greater than zero");
if (!descriptor.runtimeProtocolVersion) {
errors.push("runtimeProtocolVersion is required");
}
if (
descriptor.interfaceCompatibleBackTo !== 0 &&
descriptor.interfaceCompatibleBackTo > descriptor.descriptorVersion
) {
errors.push("interfaceCompatibleBackTo must not exceed descriptorVersion");
}
if (
descriptor.runnerCompatibleBackTo !== 0 &&
descriptor.runnerCompatibleBackTo > descriptor.descriptorVersion
) {
errors.push("runnerCompatibleBackTo must not exceed descriptorVersion");
}
const seenFunctions = new Set<string>();
for (const [index, entry] of descriptor.functionExports.entries()) {
const fn = entry.function;
if (!fn) {
errors.push(`functionExports[${index}].function is required`);
continue;
const seenExports = new Set<string>();
for (const [index, entry] of descriptor.exports.entries()) {
if (!entry.exportId) errors.push(`exports[${index}].exportId is required`);
if (!entry.runtimeSymbol) {
errors.push(`exports[${index}].runtimeSymbol is required`);
}
if (!fn.packageNamespace) {
fn.packageNamespace = descriptor.packageNamespace;
}
if (!fn.packageName) {
fn.packageName = descriptor.packageName;
}
if (
fn.packageNamespace !== descriptor.packageNamespace ||
fn.packageName !== descriptor.packageName
) {
errors.push(
`functionExports[${index}] must export from this package (${descriptor.packageNamespace}/${descriptor.packageName})`,
);
}
if (!fn.symbol) {
errors.push(`functionExports[${index}].function.symbol is required`);
}
if (entry.interfaceVersion === 0) {
errors.push(`functionExports[${index}].interfaceVersion is required`);
}
if (entry.capabilityKind === FunctionCapabilityKind.FUNCTION_CAPABILITY_KIND_UNSPECIFIED) {
errors.push(`functionExports[${index}].capabilityKind is required`);
}
if (
entry.interfaceCompatibleBackTo !== 0 &&
entry.interfaceCompatibleBackTo > entry.interfaceVersion
) {
errors.push(
`functionExports[${index}].interfaceCompatibleBackTo must not exceed interfaceVersion`,
);
}
const key = functionKey(fn);
if (seenFunctions.has(key)) {
errors.push(`duplicate function export: ${key}`);
}
seenFunctions.add(key);
}
for (const [index, entry] of descriptor.dependencies.entries()) {
if (!entry.package) {
errors.push(`dependencies[${index}].package is required`);
continue;
}
if (!entry.package.packageNamespace) {
errors.push(`dependencies[${index}].package.packageNamespace is required`);
}
if (!entry.package.packageName) {
errors.push(`dependencies[${index}].package.packageName is required`);
}
if (entry.package.descriptorVersion === 0) {
errors.push(`dependencies[${index}].package.descriptorVersion is required`);
if (seenExports.has(entry.exportId)) {
errors.push(`duplicate export: ${entry.exportId}`);
}
seenExports.add(entry.exportId);
}
return errors;
+274 -346
View File
File diff suppressed because one or more lines are too long
-374
View File
@@ -1,374 +0,0 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated from file camino/options.proto (package camino, syntax proto3)
/* eslint-disable */
import type { GenExtension, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { extDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
import type { FieldOptions, FileOptions, MessageOptions, MethodOptions as MethodOptions$1 } from "@bufbuild/protobuf/wkt";
import { file_google_protobuf_descriptor } from "@bufbuild/protobuf/wkt";
import type { Cardinality, ConflictStrategy, FieldOps, FieldStorage, InterfaceFieldContract, SymbolRef, TypeBinding } from "./schema_pb.js";
import { file_camino_schema } from "./schema_pb.js";
import type { FunctionRef } from "../quixos/refs_pb.js";
import { file_quixos_refs } from "../quixos/refs_pb.js";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file camino/options.proto.
*/
export const file_camino_options: GenFile = /*@__PURE__*/
fileDesc("ChRjYW1pbm8vb3B0aW9ucy5wcm90bxIGY2FtaW5vIj4KDENsYXNzT3B0aW9ucxIPCgd2ZXJzaW9uGAEgASgNEh0KAmlkGAIgASgLMhEuY2FtaW5vLlN5bWJvbFJlZiJaChBJbnRlcmZhY2VPcHRpb25zEg8KB3ZlcnNpb24YASABKA0SHQoCaWQYAiABKAsyES5jYW1pbm8uU3ltYm9sUmVmEhYKDnR5cGVfcGFyYW1ldGVyGAMgAygJImQKEUltcGxlbWVudHNPcHRpb25zEiQKCWludGVyZmFjZRgBIAEoCzIRLmNhbWluby5TeW1ib2xSZWYSKQoMdHlwZV9iaW5kaW5nGAIgAygLMhMuY2FtaW5vLlR5cGVCaW5kaW5nIjsKEkNvbnN0cnVjdG9yT3B0aW9ucxIlCghmdW5jdGlvbhgBIAEoCzITLnF1aXhvcy5GdW5jdGlvblJlZiLOAgoLRWRnZU9wdGlvbnMSHQoCaWQYASABKAsyES5jYW1pbm8uU3ltYm9sUmVmEiEKBnRhcmdldBgCIAEoCzIRLmNhbWluby5TeW1ib2xSZWYSKAoLY2FyZGluYWxpdHkYAyABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHaW52ZXJzZRgEIAEoCRIyCg10aGlzX2VuZHBvaW50GAUgASgLMhsuY2FtaW5vLkVkZ2VFbmRwb2ludE9wdGlvbnMSMwoOb3RoZXJfZW5kcG9pbnQYBiABKAsyGy5jYW1pbm8uRWRnZUVuZHBvaW50T3B0aW9ucxIeCgN0YWcYByADKAsyES5jYW1pbm8uU3ltYm9sUmVmEiUKCmltcGxlbWVudHMYCCADKAsyES5jYW1pbm8uU3ltYm9sUmVmEhIKCnVuZGlyZWN0ZWQYCSABKAgi5QEKE0VkZ2VFbmRwb2ludE9wdGlvbnMSIAoFY2xhc3MYASABKAsyES5jYW1pbm8uU3ltYm9sUmVmEiQKCWludGVyZmFjZRgCIAEoCzIRLmNhbWluby5TeW1ib2xSZWYSEgoKcHJvamVjdGlvbhgDIAEoCRIoCgtjYXJkaW5hbGl0eRgEIAEoDjITLmNhbWluby5DYXJkaW5hbGl0eRIPCgdpbmRleGVkGAUgASgIEjcKC21hdGVyaWFsaXplGAYgASgLMiIuY2FtaW5vLkVkZ2VNYXRlcmlhbGl6YXRpb25PcHRpb25zIloKGkVkZ2VNYXRlcmlhbGl6YXRpb25PcHRpb25zEiAKBWNsYXNzGAEgASgLMhEuY2FtaW5vLlN5bWJvbFJlZhIaChJjb25uZWN0X3Byb2plY3Rpb24YAiABKAkiRAoNTWV0aG9kT3B0aW9ucxIMCgRuYW1lGAEgASgJEiUKCGZ1bmN0aW9uGAIgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmImMKEE1pZ3JhdGlvbk9wdGlvbnMSFAoMZnJvbV92ZXJzaW9uGAEgASgNEhIKCnRvX3ZlcnNpb24YAiABKA0SJQoIZnVuY3Rpb24YAyABKAsyEy5xdWl4b3MuRnVuY3Rpb25SZWY6SQoQc2NoZW1hX25hbWVzcGFjZRIcLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucxi4jgMgASgJUg9zY2hlbWFOYW1lc3BhY2U6RQoOc2NoZW1hX3ZlcnNpb24SHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMYuY4DIAEoCVINc2NoZW1hVmVyc2lvbjpNCgVjbGFzcxIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjCjgMgASgLMhQuY2FtaW5vLkNsYXNzT3B0aW9uc1IFY2xhc3M6UAoGbWV0aG9kEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGMOOAyADKAsyFS5jYW1pbm8uTWV0aG9kT3B0aW9uc1IGbWV0aG9kOlkKCW1pZ3JhdGlvbhIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjEjgMgAygLMhguY2FtaW5vLk1pZ3JhdGlvbk9wdGlvbnNSCW1pZ3JhdGlvbjpZCglpbnRlcmZhY2USHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYxY4DIAEoCzIYLmNhbWluby5JbnRlcmZhY2VPcHRpb25zUglpbnRlcmZhY2U6XAoKaW1wbGVtZW50cxIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxjGjgMgAygLMhkuY2FtaW5vLkltcGxlbWVudHNPcHRpb25zUgppbXBsZW1lbnRzOl8KC2NvbnN0cnVjdG9yEh8uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zGMeOAyABKAsyGi5jYW1pbm8uQ29uc3RydWN0b3JPcHRpb25zUgtjb25zdHJ1Y3RvcjpVCghjb25mbGljdBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMYzI4DIAEoDjIYLmNhbWluby5Db25mbGljdFN0cmF0ZWd5Ughjb25mbGljdDpICgRlZGdlEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjNjgMgASgLMhMuY2FtaW5vLkVkZ2VPcHRpb25zUgRlZGdlOloKDWZpZWxkX3N0b3JhZ2USHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGM6OAyABKAsyFC5jYW1pbm8uRmllbGRTdG9yYWdlUgxmaWVsZFN0b3JhZ2U6TgoJZmllbGRfb3BzEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxjPjgMgASgLMhAuY2FtaW5vLkZpZWxkT3BzUghmaWVsZE9wczpoCg9pbnRlcmZhY2VfZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGNCOAyABKAsyHi5jYW1pbm8uSW50ZXJmYWNlRmllbGRDb250cmFjdFIOaW50ZXJmYWNlRmllbGQ6RAoNZGlzcGxheV9sYWJlbBIdLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMY0Y4DIAEoCFIMZGlzcGxheUxhYmVsOkkKBGltcGwSHi5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucxjWjgMgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmUgRpbXBsYgZwcm90bzM", [file_google_protobuf_descriptor, file_camino_schema, file_quixos_refs]);
/**
* @generated from message camino.ClassOptions
*/
export type ClassOptions = Message<"camino.ClassOptions"> & {
/**
* @generated from field: uint32 version = 1;
*/
version: number;
/**
* @generated from field: camino.SymbolRef id = 2;
*/
id?: SymbolRef | undefined;
};
/**
* Describes the message camino.ClassOptions.
* Use `create(ClassOptionsSchema)` to create a new message.
*/
export const ClassOptionsSchema: GenMessage<ClassOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 0);
/**
* @generated from message camino.InterfaceOptions
*/
export type InterfaceOptions = Message<"camino.InterfaceOptions"> & {
/**
* @generated from field: uint32 version = 1;
*/
version: number;
/**
* @generated from field: camino.SymbolRef id = 2;
*/
id?: SymbolRef | undefined;
/**
* @generated from field: repeated string type_parameter = 3;
*/
typeParameter: string[];
};
/**
* Describes the message camino.InterfaceOptions.
* Use `create(InterfaceOptionsSchema)` to create a new message.
*/
export const InterfaceOptionsSchema: GenMessage<InterfaceOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 1);
/**
* @generated from message camino.ImplementsOptions
*/
export type ImplementsOptions = Message<"camino.ImplementsOptions"> & {
/**
* @generated from field: camino.SymbolRef interface = 1;
*/
interface?: SymbolRef | undefined;
/**
* @generated from field: repeated camino.TypeBinding type_binding = 2;
*/
typeBinding: TypeBinding[];
};
/**
* Describes the message camino.ImplementsOptions.
* Use `create(ImplementsOptionsSchema)` to create a new message.
*/
export const ImplementsOptionsSchema: GenMessage<ImplementsOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 2);
/**
* @generated from message camino.ConstructorOptions
*/
export type ConstructorOptions = Message<"camino.ConstructorOptions"> & {
/**
* @generated from field: quixos.FunctionRef function = 1;
*/
function?: FunctionRef | undefined;
};
/**
* Describes the message camino.ConstructorOptions.
* Use `create(ConstructorOptionsSchema)` to create a new message.
*/
export const ConstructorOptionsSchema: GenMessage<ConstructorOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 3);
/**
* @generated from message camino.EdgeOptions
*/
export type EdgeOptions = Message<"camino.EdgeOptions"> & {
/**
* @generated from field: camino.SymbolRef id = 1;
*/
id?: SymbolRef | undefined;
/**
* Shorthand for other_endpoint.class.
*
* @generated from field: camino.SymbolRef target = 2;
*/
target?: SymbolRef | undefined;
/**
* Shorthand for this_endpoint.cardinality.
*
* @generated from field: camino.Cardinality cardinality = 3;
*/
cardinality: Cardinality;
/**
* Shorthand for other_endpoint.projection.
*
* @generated from field: string inverse = 4;
*/
inverse: string;
/**
* @generated from field: camino.EdgeEndpointOptions this_endpoint = 5;
*/
thisEndpoint?: EdgeEndpointOptions | undefined;
/**
* @generated from field: camino.EdgeEndpointOptions other_endpoint = 6;
*/
otherEndpoint?: EdgeEndpointOptions | undefined;
/**
* @generated from field: repeated camino.SymbolRef tag = 7;
*/
tag: SymbolRef[];
/**
* @generated from field: repeated camino.SymbolRef implements = 8;
*/
implements: SymbolRef[];
/**
* @generated from field: bool undirected = 9;
*/
undirected: boolean;
};
/**
* Describes the message camino.EdgeOptions.
* Use `create(EdgeOptionsSchema)` to create a new message.
*/
export const EdgeOptionsSchema: GenMessage<EdgeOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 4);
/**
* @generated from message camino.EdgeEndpointOptions
*/
export type EdgeEndpointOptions = Message<"camino.EdgeEndpointOptions"> & {
/**
* @generated from field: camino.SymbolRef class = 1;
*/
class?: SymbolRef | undefined;
/**
* @generated from field: camino.SymbolRef interface = 2;
*/
interface?: SymbolRef | undefined;
/**
* @generated from field: string projection = 3;
*/
projection: string;
/**
* @generated from field: camino.Cardinality cardinality = 4;
*/
cardinality: Cardinality;
/**
* @generated from field: bool indexed = 5;
*/
indexed: boolean;
/**
* @generated from field: camino.EdgeMaterializationOptions materialize = 6;
*/
materialize?: EdgeMaterializationOptions | undefined;
};
/**
* Describes the message camino.EdgeEndpointOptions.
* Use `create(EdgeEndpointOptionsSchema)` to create a new message.
*/
export const EdgeEndpointOptionsSchema: GenMessage<EdgeEndpointOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 5);
/**
* @generated from message camino.EdgeMaterializationOptions
*/
export type EdgeMaterializationOptions = Message<"camino.EdgeMaterializationOptions"> & {
/**
* @generated from field: camino.SymbolRef class = 1;
*/
class?: SymbolRef | undefined;
/**
* @generated from field: string connect_projection = 2;
*/
connectProjection: string;
};
/**
* Describes the message camino.EdgeMaterializationOptions.
* Use `create(EdgeMaterializationOptionsSchema)` to create a new message.
*/
export const EdgeMaterializationOptionsSchema: GenMessage<EdgeMaterializationOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 6);
/**
* @generated from message camino.MethodOptions
*/
export type MethodOptions = Message<"camino.MethodOptions"> & {
/**
* @generated from field: string name = 1;
*/
name: string;
/**
* @generated from field: quixos.FunctionRef function = 2;
*/
function?: FunctionRef | undefined;
};
/**
* Describes the message camino.MethodOptions.
* Use `create(MethodOptionsSchema)` to create a new message.
*/
export const MethodOptionsSchema: GenMessage<MethodOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 7);
/**
* @generated from message camino.MigrationOptions
*/
export type MigrationOptions = Message<"camino.MigrationOptions"> & {
/**
* @generated from field: uint32 from_version = 1;
*/
fromVersion: number;
/**
* @generated from field: uint32 to_version = 2;
*/
toVersion: number;
/**
* @generated from field: quixos.FunctionRef function = 3;
*/
function?: FunctionRef | undefined;
};
/**
* Describes the message camino.MigrationOptions.
* Use `create(MigrationOptionsSchema)` to create a new message.
*/
export const MigrationOptionsSchema: GenMessage<MigrationOptions> = /*@__PURE__*/
messageDesc(file_camino_options, 8);
/**
* @generated from extension: string schema_namespace = 51000;
*/
export const schema_namespace: GenExtension<FileOptions, string> = /*@__PURE__*/
extDesc(file_camino_options, 0);
/**
* @generated from extension: string schema_version = 51001;
*/
export const schema_version: GenExtension<FileOptions, string> = /*@__PURE__*/
extDesc(file_camino_options, 1);
/**
* @generated from extension: camino.ClassOptions class = 51010;
*/
export const class$: GenExtension<MessageOptions, ClassOptions> = /*@__PURE__*/
extDesc(file_camino_options, 2);
/**
* @generated from extension: repeated camino.MethodOptions method = 51011;
*/
export const method: GenExtension<MessageOptions, MethodOptions[]> = /*@__PURE__*/
extDesc(file_camino_options, 3);
/**
* @generated from extension: repeated camino.MigrationOptions migration = 51012;
*/
export const migration: GenExtension<MessageOptions, MigrationOptions[]> = /*@__PURE__*/
extDesc(file_camino_options, 4);
/**
* @generated from extension: camino.InterfaceOptions interface = 51013;
*/
export const interface$: GenExtension<MessageOptions, InterfaceOptions> = /*@__PURE__*/
extDesc(file_camino_options, 5);
/**
* @generated from extension: repeated camino.ImplementsOptions implements = 51014;
*/
export const implements$: GenExtension<MessageOptions, ImplementsOptions[]> = /*@__PURE__*/
extDesc(file_camino_options, 6);
/**
* @generated from extension: camino.ConstructorOptions constructor = 51015;
*/
export const constructor: GenExtension<MessageOptions, ConstructorOptions> = /*@__PURE__*/
extDesc(file_camino_options, 7);
/**
* @generated from extension: camino.ConflictStrategy conflict = 51020;
*/
export const conflict: GenExtension<FieldOptions, ConflictStrategy> = /*@__PURE__*/
extDesc(file_camino_options, 8);
/**
* @generated from extension: camino.EdgeOptions edge = 51021;
*/
export const edge: GenExtension<FieldOptions, EdgeOptions> = /*@__PURE__*/
extDesc(file_camino_options, 9);
/**
* @generated from extension: camino.FieldStorage field_storage = 51022;
*/
export const field_storage: GenExtension<FieldOptions, FieldStorage> = /*@__PURE__*/
extDesc(file_camino_options, 10);
/**
* @generated from extension: camino.FieldOps field_ops = 51023;
*/
export const field_ops: GenExtension<FieldOptions, FieldOps> = /*@__PURE__*/
extDesc(file_camino_options, 11);
/**
* @generated from extension: camino.InterfaceFieldContract interface_field = 51024;
*/
export const interface_field: GenExtension<FieldOptions, InterfaceFieldContract> = /*@__PURE__*/
extDesc(file_camino_options, 12);
/**
* @generated from extension: bool display_label = 51025;
*/
export const display_label: GenExtension<FieldOptions, boolean> = /*@__PURE__*/
extDesc(file_camino_options, 13);
/**
* @generated from extension: quixos.FunctionRef impl = 51030;
*/
export const impl: GenExtension<MethodOptions$1, FunctionRef> = /*@__PURE__*/
extDesc(file_camino_options, 14);
File diff suppressed because one or more lines are too long
+163 -78
View File
@@ -1,14 +1,14 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated by protoc-gen-es v2.14.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/orch.proto (package quixos.orch, syntax proto3)
/* eslint-disable */
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import type { Value } from "../camino/api_pb.js";
import type { CaminoObject, Value } from "../camino/api_pb.js";
import { file_camino_api } from "../camino/api_pb.js";
import type { PackageDescriptor } from "./package_pb.js";
import { file_quixos_package } from "./package_pb.js";
import type { FunctionRef } from "./refs_pb.js";
import type { CapabilityRef, PackageExportRef } from "./refs_pb.js";
import { file_quixos_refs } from "./refs_pb.js";
import type { DerivedDependency } from "./runtime_pb.js";
import { file_quixos_runtime } from "./runtime_pb.js";
@@ -18,16 +18,55 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/orch.proto.
*/
export const file_quixos_orch: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gizAEKFUludm9rZUZ1bmN0aW9uUmVxdWVzdBIlCghmdW5jdGlvbhgBIAEoCzITLnF1aXhvcy5GdW5jdGlvblJlZhIRCglvYmplY3RfaWQYAiABKAkSPAoFaW5wdXQYAyADKAsyLS5xdWl4b3Mub3JjaC5JbnZva2VGdW5jdGlvblJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEilgEKFkludm9rZUZ1bmN0aW9uUmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAkiygEKFFdhdGNoRnVuY3Rpb25SZXF1ZXN0EiUKCGZ1bmN0aW9uGAEgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmEhEKCW9iamVjdF9pZBgCIAEoCRI7CgVpbnB1dBgDIAMoCzIsLnF1aXhvcy5vcmNoLldhdGNoRnVuY3Rpb25SZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIuEBChJXYXRjaEZ1bmN0aW9uRXZlbnQSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIQCgh3YXRjaF9pZBgDIAEoCRIcCgV2YWx1ZRgEIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYBSADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgGIAEoCRIPCgdpbml0aWFsGAcgASgIIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIugBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSJQoIZnVuY3Rpb24YAiABKAsyEy5xdWl4b3MuRnVuY3Rpb25SZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSLjAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGQoRcGFja2FnZV9uYW1lc3BhY2UYAiABKAkSFAoMcGFja2FnZV9uYW1lGAMgASgJEhoKEmRlc2NyaXB0b3JfdmVyc2lvbhgEIAEoDRITCgtzb3VyY2VfcmVwbxgFIAEoCRIaChJzZXJ2ZXJfaW5zdGFsbGFibGUYBiABKAkSEwoLc291cmNlX3BhdGgYByABKAkSEwoLc2VydmVyX3BhdGgYCCABKAkSCwoDcGlkGAkgASgNEg0KBXN0YXRlGAogASgJEhIKCnN0YXJ0ZWRfYXQYCyABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYDCABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGA0gASgJEiEKGWFkdmVydGlzZWRfZnVuY3Rpb25fY291bnQYDiABKA0y4AQKE09yY2hlc3RyYXRvclJ1bnRpbWUSWQoOSW52b2tlRnVuY3Rpb24SIi5xdWl4b3Mub3JjaC5JbnZva2VGdW5jdGlvblJlcXVlc3QaIy5xdWl4b3Mub3JjaC5JbnZva2VGdW5jdGlvblJlc3BvbnNlElUKDVdhdGNoRnVuY3Rpb24SIS5xdWl4b3Mub3JjaC5XYXRjaEZ1bmN0aW9uUmVxdWVzdBofLnF1aXhvcy5vcmNoLldhdGNoRnVuY3Rpb25FdmVudDABEnEKFkxpc3RQYWNrYWdlRGVzY3JpcHRvcnMSKi5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdBorLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRJoChNMaXN0UGFja2FnZVJ1bnRpbWVzEicucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QaKC5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USXAoPTGlzdEFjdGl2YXRpb25zEiMucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVxdWVzdBokLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlElwKD0Nsb3NlQWN0aXZhdGlvbhIjLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlcXVlc3QaJC5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXNwb25zZWIGcHJvdG8z", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]);
fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCLUAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpgBChhJbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi4wEKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0ImcKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0ynwYKE09yY2hlc3RyYXRvclJ1bnRpbWUSXwoQSW52b2tlQ2FwYWJpbGl0eRIkLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlElsKD1dhdGNoQ2FwYWJpbGl0eRIjLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlFdmVudDABElwKD0NvbnN0cnVjdE9iamVjdBIjLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QaJC5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]);
/**
* @generated from message quixos.orch.InvokeFunctionRequest
* @generated from message quixos.orch.ConstructObjectRequest
*/
export type InvokeFunctionRequest = Message<"quixos.orch.InvokeFunctionRequest"> & {
export type ConstructObjectRequest = Message<"quixos.orch.ConstructObjectRequest"> & {
/**
* @generated from field: quixos.FunctionRef function = 1;
* @generated from field: string atom_id = 1;
*/
function?: FunctionRef | undefined;
atomId: string;
/**
* @generated from field: map<string, camino.Value> input = 2;
*/
input: { [key: string]: Value };
};
/**
* Describes the message quixos.orch.ConstructObjectRequest.
* Use `create(ConstructObjectRequestSchema)` to create a new message.
*/
export const ConstructObjectRequestSchema: GenMessage<ConstructObjectRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 0);
/**
* @generated from message quixos.orch.ConstructObjectResponse
*/
export type ConstructObjectResponse = Message<"quixos.orch.ConstructObjectResponse"> & {
/**
* @generated from field: camino.CaminoObject object = 1;
*/
object?: CaminoObject | undefined;
};
/**
* Describes the message quixos.orch.ConstructObjectResponse.
* Use `create(ConstructObjectResponseSchema)` to create a new message.
*/
export const ConstructObjectResponseSchema: GenMessage<ConstructObjectResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 1);
/**
* @generated from message quixos.orch.InvokeCapabilityRequest
*/
export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityRequest"> & {
/**
* @generated from field: quixos.CapabilityRef capability = 1;
*/
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
@@ -41,16 +80,16 @@ export type InvokeFunctionRequest = Message<"quixos.orch.InvokeFunctionRequest">
};
/**
* Describes the message quixos.orch.InvokeFunctionRequest.
* Use `create(InvokeFunctionRequestSchema)` to create a new message.
* Describes the message quixos.orch.InvokeCapabilityRequest.
* Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/
export const InvokeFunctionRequestSchema: GenMessage<InvokeFunctionRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 0);
export const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 2);
/**
* @generated from message quixos.orch.InvokeFunctionResponse
* @generated from message quixos.orch.InvokeCapabilityResponse
*/
export type InvokeFunctionResponse = Message<"quixos.orch.InvokeFunctionResponse"> & {
export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResponse"> & {
/**
* @generated from field: string invocation_id = 1;
*/
@@ -78,20 +117,20 @@ export type InvokeFunctionResponse = Message<"quixos.orch.InvokeFunctionResponse
};
/**
* Describes the message quixos.orch.InvokeFunctionResponse.
* Use `create(InvokeFunctionResponseSchema)` to create a new message.
* Describes the message quixos.orch.InvokeCapabilityResponse.
* Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/
export const InvokeFunctionResponseSchema: GenMessage<InvokeFunctionResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 1);
export const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 3);
/**
* @generated from message quixos.orch.WatchFunctionRequest
* @generated from message quixos.orch.WatchCapabilityRequest
*/
export type WatchFunctionRequest = Message<"quixos.orch.WatchFunctionRequest"> & {
export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest"> & {
/**
* @generated from field: quixos.FunctionRef function = 1;
* @generated from field: quixos.CapabilityRef capability = 1;
*/
function?: FunctionRef | undefined;
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
@@ -105,16 +144,16 @@ export type WatchFunctionRequest = Message<"quixos.orch.WatchFunctionRequest"> &
};
/**
* Describes the message quixos.orch.WatchFunctionRequest.
* Use `create(WatchFunctionRequestSchema)` to create a new message.
* Describes the message quixos.orch.WatchCapabilityRequest.
* Use `create(WatchCapabilityRequestSchema)` to create a new message.
*/
export const WatchFunctionRequestSchema: GenMessage<WatchFunctionRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 2);
export const WatchCapabilityRequestSchema: GenMessage<WatchCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 4);
/**
* @generated from message quixos.orch.WatchFunctionEvent
* @generated from message quixos.orch.WatchCapabilityEvent
*/
export type WatchFunctionEvent = Message<"quixos.orch.WatchFunctionEvent"> & {
export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & {
/**
* @generated from field: string invocation_id = 1;
*/
@@ -152,11 +191,51 @@ export type WatchFunctionEvent = Message<"quixos.orch.WatchFunctionEvent"> & {
};
/**
* Describes the message quixos.orch.WatchFunctionEvent.
* Use `create(WatchFunctionEventSchema)` to create a new message.
* Describes the message quixos.orch.WatchCapabilityEvent.
* Use `create(WatchCapabilityEventSchema)` to create a new message.
*/
export const WatchFunctionEventSchema: GenMessage<WatchFunctionEvent> = /*@__PURE__*/
messageDesc(file_quixos_orch, 3);
export const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent> = /*@__PURE__*/
messageDesc(file_quixos_orch, 5);
/**
* @generated from message quixos.orch.GetWorkspaceRequest
*/
export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & {
};
/**
* Describes the message quixos.orch.GetWorkspaceRequest.
* Use `create(GetWorkspaceRequestSchema)` to create a new message.
*/
export const GetWorkspaceRequestSchema: GenMessage<GetWorkspaceRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 6);
/**
* @generated from message quixos.orch.GetWorkspaceResponse
*/
export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> & {
/**
* @generated from field: string workspace_id = 1;
*/
workspaceId: string;
/**
* @generated from field: string workspace_revision_id = 2;
*/
workspaceRevisionId: string;
/**
* @generated from field: string source_root_commit = 3;
*/
sourceRootCommit: string;
};
/**
* Describes the message quixos.orch.GetWorkspaceResponse.
* Use `create(GetWorkspaceResponseSchema)` to create a new message.
*/
export const GetWorkspaceResponseSchema: GenMessage<GetWorkspaceResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 7);
/**
* @generated from message quixos.orch.ListActivationsRequest
@@ -169,7 +248,7 @@ export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest
* Use `create(ListActivationsRequestSchema)` to create a new message.
*/
export const ListActivationsRequestSchema: GenMessage<ListActivationsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 4);
messageDesc(file_quixos_orch, 8);
/**
* @generated from message quixos.orch.ListPackageDescriptorsRequest
@@ -182,7 +261,7 @@ export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDesc
* Use `create(ListPackageDescriptorsRequestSchema)` to create a new message.
*/
export const ListPackageDescriptorsRequestSchema: GenMessage<ListPackageDescriptorsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 5);
messageDesc(file_quixos_orch, 9);
/**
* @generated from message quixos.orch.ListPackageDescriptorsResponse
@@ -199,7 +278,7 @@ export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDes
* Use `create(ListPackageDescriptorsResponseSchema)` to create a new message.
*/
export const ListPackageDescriptorsResponseSchema: GenMessage<ListPackageDescriptorsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 6);
messageDesc(file_quixos_orch, 10);
/**
* @generated from message quixos.orch.ListPackageRuntimesRequest
@@ -212,7 +291,7 @@ export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntime
* Use `create(ListPackageRuntimesRequestSchema)` to create a new message.
*/
export const ListPackageRuntimesRequestSchema: GenMessage<ListPackageRuntimesRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 7);
messageDesc(file_quixos_orch, 11);
/**
* @generated from message quixos.orch.ListPackageRuntimesResponse
@@ -229,7 +308,7 @@ export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntim
* Use `create(ListPackageRuntimesResponseSchema)` to create a new message.
*/
export const ListPackageRuntimesResponseSchema: GenMessage<ListPackageRuntimesResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 8);
messageDesc(file_quixos_orch, 12);
/**
* @generated from message quixos.orch.ListActivationsResponse
@@ -246,7 +325,7 @@ export type ListActivationsResponse = Message<"quixos.orch.ListActivationsRespon
* Use `create(ListActivationsResponseSchema)` to create a new message.
*/
export const ListActivationsResponseSchema: GenMessage<ListActivationsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 9);
messageDesc(file_quixos_orch, 13);
/**
* @generated from message quixos.orch.CloseActivationRequest
@@ -268,7 +347,7 @@ export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest
* Use `create(CloseActivationRequestSchema)` to create a new message.
*/
export const CloseActivationRequestSchema: GenMessage<CloseActivationRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 10);
messageDesc(file_quixos_orch, 14);
/**
* @generated from message quixos.orch.CloseActivationResponse
@@ -285,7 +364,7 @@ export type CloseActivationResponse = Message<"quixos.orch.CloseActivationRespon
* Use `create(CloseActivationResponseSchema)` to create a new message.
*/
export const CloseActivationResponseSchema: GenMessage<CloseActivationResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 11);
messageDesc(file_quixos_orch, 15);
/**
* @generated from message quixos.orch.Activation
@@ -297,9 +376,9 @@ export type Activation = Message<"quixos.orch.Activation"> & {
activationId: string;
/**
* @generated from field: quixos.FunctionRef function = 2;
* @generated from field: quixos.PackageExportRef export = 2;
*/
function?: FunctionRef | undefined;
export?: PackageExportRef | undefined;
/**
* @generated from field: string object_id = 3;
@@ -347,7 +426,7 @@ export type Activation = Message<"quixos.orch.Activation"> & {
* Use `create(ActivationSchema)` to create a new message.
*/
export const ActivationSchema: GenMessage<Activation> = /*@__PURE__*/
messageDesc(file_quixos_orch, 12);
messageDesc(file_quixos_orch, 16);
/**
* @generated from message quixos.orch.PackageRuntimeStatus
@@ -359,69 +438,59 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> &
runtimeKey: string;
/**
* @generated from field: string package_namespace = 2;
* @generated from field: string package_revision_id = 2;
*/
packageNamespace: string;
packageRevisionId: string;
/**
* @generated from field: string package_name = 3;
* @generated from field: string source_repository = 3;
*/
packageName: string;
sourceRepository: string;
/**
* @generated from field: uint32 descriptor_version = 4;
* @generated from field: string source_commit = 4;
*/
descriptorVersion: number;
sourceCommit: string;
/**
* @generated from field: string source_repo = 5;
* @generated from field: string build_target = 5;
*/
sourceRepo: string;
buildTarget: string;
/**
* @generated from field: string server_installable = 6;
*/
serverInstallable: string;
/**
* @generated from field: string source_path = 7;
*/
sourcePath: string;
/**
* @generated from field: string server_path = 8;
* @generated from field: string server_path = 6;
*/
serverPath: string;
/**
* @generated from field: uint32 pid = 9;
* @generated from field: uint32 pid = 7;
*/
pid: number;
/**
* @generated from field: string state = 10;
* @generated from field: string state = 8;
*/
state: string;
/**
* @generated from field: string started_at = 11;
* @generated from field: string started_at = 9;
*/
startedAt: string;
/**
* @generated from field: string last_handshake_at = 12;
* @generated from field: string last_handshake_at = 10;
*/
lastHandshakeAt: string;
/**
* @generated from field: string runtime_protocol_version = 13;
* @generated from field: string runtime_protocol_version = 11;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: uint32 advertised_function_count = 14;
* @generated from field: uint32 advertised_export_count = 12;
*/
advertisedFunctionCount: number;
advertisedExportCount: number;
};
/**
@@ -429,27 +498,43 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> &
* Use `create(PackageRuntimeStatusSchema)` to create a new message.
*/
export const PackageRuntimeStatusSchema: GenMessage<PackageRuntimeStatus> = /*@__PURE__*/
messageDesc(file_quixos_orch, 13);
messageDesc(file_quixos_orch, 17);
/**
* @generated from service quixos.orch.OrchestratorRuntime
*/
export const OrchestratorRuntime: GenService<{
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.InvokeFunction
* @generated from rpc quixos.orch.OrchestratorRuntime.InvokeCapability
*/
invokeFunction: {
invokeCapability: {
methodKind: "unary";
input: typeof InvokeFunctionRequestSchema;
output: typeof InvokeFunctionResponseSchema;
input: typeof InvokeCapabilityRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.WatchFunction
* @generated from rpc quixos.orch.OrchestratorRuntime.WatchCapability
*/
watchFunction: {
watchCapability: {
methodKind: "server_streaming";
input: typeof WatchFunctionRequestSchema;
output: typeof WatchFunctionEventSchema;
input: typeof WatchCapabilityRequestSchema;
output: typeof WatchCapabilityEventSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ConstructObject
*/
constructObject: {
methodKind: "unary";
input: typeof ConstructObjectRequestSchema;
output: typeof ConstructObjectResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace
*/
getWorkspace: {
methodKind: "unary";
input: typeof GetWorkspaceRequestSchema;
output: typeof GetWorkspaceResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListPackageDescriptors
+33 -283
View File
@@ -1,131 +1,40 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated by protoc-gen-es v2.14.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/package.proto (package quixos, syntax proto3)
/* eslint-disable */
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
import type { SymbolRef } from "../camino/schema_pb.js";
import { file_camino_schema } from "../camino/schema_pb.js";
import type { FunctionRef } from "./refs_pb.js";
import { file_quixos_refs } from "./refs_pb.js";
import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file quixos/package.proto.
*/
export const file_quixos_package: GenFile = /*@__PURE__*/
fileDesc("ChRxdWl4b3MvcGFja2FnZS5wcm90bxIGcXVpeG9zIm4KClBhY2thZ2VSZWYSGQoRcGFja2FnZV9uYW1lc3BhY2UYASABKAkSFAoMcGFja2FnZV9uYW1lGAIgASgJEhoKEmRlc2NyaXB0b3JfdmVyc2lvbhgDIAEoDRITCgt2ZXJzaW9uX3JlZhgEIAEoCSKgBAoRUGFja2FnZURlc2NyaXB0b3ISGQoRcGFja2FnZV9uYW1lc3BhY2UYASABKAkSFAoMcGFja2FnZV9uYW1lGAIgASgJEhoKEmRlc2NyaXB0b3JfdmVyc2lvbhgDIAEoDRIkChxpbnRlcmZhY2VfY29tcGF0aWJsZV9iYWNrX3RvGAQgASgNEiEKGXJ1bm5lcl9jb21wYXRpYmxlX2JhY2tfdG8YBSABKA0SEwoLc291cmNlX3JlcG8YBiABKAkSEgoKc291cmNlX3JlZhgHIAEoCRIbChNyZXNvbHZlZF9zb3VyY2VfcmVmGAggASgJEhoKEnNlcnZlcl9pbnN0YWxsYWJsZRgJIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCiABKAkSKgoNY2xhc3NfZXhwb3J0cxgLIAMoCzITLnF1aXhvcy5DbGFzc0V4cG9ydBIwChBmdW5jdGlvbl9leHBvcnRzGAwgAygLMhYucXVpeG9zLkZ1bmN0aW9uRXhwb3J0EjIKEWNvbXBvbmVudF9leHBvcnRzGA0gAygLMhcucXVpeG9zLkNvbXBvbmVudEV4cG9ydBIuCg9zaWRlY2FyX2V4cG9ydHMYDiADKAsyFS5xdWl4b3MuU2lkZWNhckV4cG9ydBIvCgxkZXBlbmRlbmNpZXMYDyADKAsyGS5xdWl4b3MuUGFja2FnZURlcGVuZGVuY3kiRwoLQ2xhc3NFeHBvcnQSIwoIY2xhc3NfaWQYASABKAsyES5jYW1pbm8uU3ltYm9sUmVmEhMKC3NvdXJjZV9maWxlGAIgASgJItoBCg5GdW5jdGlvbkV4cG9ydBIlCghmdW5jdGlvbhgBIAEoCzITLnF1aXhvcy5GdW5jdGlvblJlZhISCgppbnB1dF90eXBlGAIgASgJEhMKC291dHB1dF90eXBlGAMgASgJEhkKEWludGVyZmFjZV92ZXJzaW9uGAQgASgNEiQKHGludGVyZmFjZV9jb21wYXRpYmxlX2JhY2tfdG8YBSABKA0SNwoPY2FwYWJpbGl0eV9raW5kGAYgASgOMh4ucXVpeG9zLkZ1bmN0aW9uQ2FwYWJpbGl0eUtpbmQiYwoPQ29tcG9uZW50RXhwb3J0Eg4KBnN5bWJvbBgBIAEoCRISCgpwcm9wc190eXBlGAIgASgJEiwKEXN1cHBvcnRlZF9jbGFzc2VzGAMgAygLMhEuY2FtaW5vLlN5bWJvbFJlZiI5Cg1TaWRlY2FyRXhwb3J0Eg4KBnN5bWJvbBgBIAEoCRIYChBzaWRlX2VmZmVjdF9tb2RlGAIgASgJIpUBChFQYWNrYWdlRGVwZW5kZW5jeRIjCgdwYWNrYWdlGAEgASgLMhIucXVpeG9zLlBhY2thZ2VSZWYSJAocaW50ZXJmYWNlX2NvbXBhdGlibGVfYmFja190bxgCIAEoDRIZChFyZWZhY3Rvcl9yZXF1aXJlZBgDIAEoCBIaChJjb21wYXRpYmlsaXR5X25vdGUYBCABKAkqggEKFkZ1bmN0aW9uQ2FwYWJpbGl0eUtpbmQSKAokRlVOQ1RJT05fQ0FQQUJJTElUWV9LSU5EX1VOU1BFQ0lGSUVEEAASCgoGTUVUSE9EEAESEgoORklFTERfUkVTT0xWRVIQAhINCglNSUdSQVRJT04QAxIPCgtDT05TVFJVQ1RPUhAEYgZwcm90bzM", [file_camino_schema, file_quixos_refs]);
/**
* @generated from message quixos.PackageRef
*/
export type PackageRef = Message<"quixos.PackageRef"> & {
/**
* @generated from field: string package_namespace = 1;
*/
packageNamespace: string;
/**
* @generated from field: string package_name = 2;
*/
packageName: string;
/**
* @generated from field: uint32 descriptor_version = 3;
*/
descriptorVersion: number;
/**
* @generated from field: string version_ref = 4;
*/
versionRef: string;
};
/**
* Describes the message quixos.PackageRef.
* Use `create(PackageRefSchema)` to create a new message.
*/
export const PackageRefSchema: GenMessage<PackageRef> = /*@__PURE__*/
messageDesc(file_quixos_package, 0);
fileDesc("ChRxdWl4b3MvcGFja2FnZS5wcm90bxIGcXVpeG9zIo4BChFQYWNrYWdlRGVzY3JpcHRvchISCgpwYWNrYWdlX2lkGAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAMgASgJEiYKB2V4cG9ydHMYBCADKAsyFS5xdWl4b3MuUnVudGltZUV4cG9ydCI6Cg1SdW50aW1lRXhwb3J0EhEKCWV4cG9ydF9pZBgBIAEoCRIWCg5ydW50aW1lX3N5bWJvbBgCIAEoCWIGcHJvdG8z");
/**
* @generated from message quixos.PackageDescriptor
*/
export type PackageDescriptor = Message<"quixos.PackageDescriptor"> & {
/**
* @generated from field: string package_namespace = 1;
* @generated from field: string package_id = 1;
*/
packageNamespace: string;
packageId: string;
/**
* @generated from field: string package_name = 2;
* @generated from field: string package_revision_id = 2;
*/
packageName: string;
packageRevisionId: string;
/**
* @generated from field: uint32 descriptor_version = 3;
*/
descriptorVersion: number;
/**
* @generated from field: uint32 interface_compatible_back_to = 4;
*/
interfaceCompatibleBackTo: number;
/**
* @generated from field: uint32 runner_compatible_back_to = 5;
*/
runnerCompatibleBackTo: number;
/**
* @generated from field: string source_repo = 6;
*/
sourceRepo: string;
/**
* @generated from field: string source_ref = 7;
*/
sourceRef: string;
/**
* @generated from field: string resolved_source_ref = 8;
*/
resolvedSourceRef: string;
/**
* @generated from field: string server_installable = 9;
*/
serverInstallable: string;
/**
* @generated from field: string runtime_protocol_version = 10;
* @generated from field: string runtime_protocol_version = 3;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: repeated quixos.ClassExport class_exports = 11;
* @generated from field: repeated quixos.RuntimeExport exports = 4;
*/
classExports: ClassExport[];
/**
* @generated from field: repeated quixos.FunctionExport function_exports = 12;
*/
functionExports: FunctionExport[];
/**
* @generated from field: repeated quixos.ComponentExport component_exports = 13;
*/
componentExports: ComponentExport[];
/**
* @generated from field: repeated quixos.SidecarExport sidecar_exports = 14;
*/
sidecarExports: SidecarExport[];
/**
* @generated from field: repeated quixos.PackageDependency dependencies = 15;
*/
dependencies: PackageDependency[];
exports: RuntimeExport[];
};
/**
@@ -133,186 +42,27 @@ export type PackageDescriptor = Message<"quixos.PackageDescriptor"> & {
* Use `create(PackageDescriptorSchema)` to create a new message.
*/
export const PackageDescriptorSchema: GenMessage<PackageDescriptor> = /*@__PURE__*/
messageDesc(file_quixos_package, 0);
/**
* @generated from message quixos.RuntimeExport
*/
export type RuntimeExport = Message<"quixos.RuntimeExport"> & {
/**
* @generated from field: string export_id = 1;
*/
exportId: string;
/**
* @generated from field: string runtime_symbol = 2;
*/
runtimeSymbol: string;
};
/**
* Describes the message quixos.RuntimeExport.
* Use `create(RuntimeExportSchema)` to create a new message.
*/
export const RuntimeExportSchema: GenMessage<RuntimeExport> = /*@__PURE__*/
messageDesc(file_quixos_package, 1);
/**
* @generated from message quixos.ClassExport
*/
export type ClassExport = Message<"quixos.ClassExport"> & {
/**
* @generated from field: camino.SymbolRef class_id = 1;
*/
classId?: SymbolRef | undefined;
/**
* @generated from field: string source_file = 2;
*/
sourceFile: string;
};
/**
* Describes the message quixos.ClassExport.
* Use `create(ClassExportSchema)` to create a new message.
*/
export const ClassExportSchema: GenMessage<ClassExport> = /*@__PURE__*/
messageDesc(file_quixos_package, 2);
/**
* @generated from message quixos.FunctionExport
*/
export type FunctionExport = Message<"quixos.FunctionExport"> & {
/**
* @generated from field: quixos.FunctionRef function = 1;
*/
function?: FunctionRef | undefined;
/**
* @generated from field: string input_type = 2;
*/
inputType: string;
/**
* @generated from field: string output_type = 3;
*/
outputType: string;
/**
* @generated from field: uint32 interface_version = 4;
*/
interfaceVersion: number;
/**
* @generated from field: uint32 interface_compatible_back_to = 5;
*/
interfaceCompatibleBackTo: number;
/**
* @generated from field: quixos.FunctionCapabilityKind capability_kind = 6;
*/
capabilityKind: FunctionCapabilityKind;
};
/**
* Describes the message quixos.FunctionExport.
* Use `create(FunctionExportSchema)` to create a new message.
*/
export const FunctionExportSchema: GenMessage<FunctionExport> = /*@__PURE__*/
messageDesc(file_quixos_package, 3);
/**
* @generated from message quixos.ComponentExport
*/
export type ComponentExport = Message<"quixos.ComponentExport"> & {
/**
* @generated from field: string symbol = 1;
*/
symbol: string;
/**
* @generated from field: string props_type = 2;
*/
propsType: string;
/**
* @generated from field: repeated camino.SymbolRef supported_classes = 3;
*/
supportedClasses: SymbolRef[];
};
/**
* Describes the message quixos.ComponentExport.
* Use `create(ComponentExportSchema)` to create a new message.
*/
export const ComponentExportSchema: GenMessage<ComponentExport> = /*@__PURE__*/
messageDesc(file_quixos_package, 4);
/**
* @generated from message quixos.SidecarExport
*/
export type SidecarExport = Message<"quixos.SidecarExport"> & {
/**
* @generated from field: string symbol = 1;
*/
symbol: string;
/**
* @generated from field: string side_effect_mode = 2;
*/
sideEffectMode: string;
};
/**
* Describes the message quixos.SidecarExport.
* Use `create(SidecarExportSchema)` to create a new message.
*/
export const SidecarExportSchema: GenMessage<SidecarExport> = /*@__PURE__*/
messageDesc(file_quixos_package, 5);
/**
* @generated from message quixos.PackageDependency
*/
export type PackageDependency = Message<"quixos.PackageDependency"> & {
/**
* @generated from field: quixos.PackageRef package = 1;
*/
package?: PackageRef | undefined;
/**
* @generated from field: uint32 interface_compatible_back_to = 2;
*/
interfaceCompatibleBackTo: number;
/**
* @generated from field: bool refactor_required = 3;
*/
refactorRequired: boolean;
/**
* @generated from field: string compatibility_note = 4;
*/
compatibilityNote: string;
};
/**
* Describes the message quixos.PackageDependency.
* Use `create(PackageDependencySchema)` to create a new message.
*/
export const PackageDependencySchema: GenMessage<PackageDependency> = /*@__PURE__*/
messageDesc(file_quixos_package, 6);
/**
* @generated from enum quixos.FunctionCapabilityKind
*/
export enum FunctionCapabilityKind {
/**
* @generated from enum value: FUNCTION_CAPABILITY_KIND_UNSPECIFIED = 0;
*/
FUNCTION_CAPABILITY_KIND_UNSPECIFIED = 0,
/**
* @generated from enum value: METHOD = 1;
*/
METHOD = 1,
/**
* @generated from enum value: FIELD_RESOLVER = 2;
*/
FIELD_RESOLVER = 2,
/**
* @generated from enum value: MIGRATION = 3;
*/
MIGRATION = 3,
/**
* @generated from enum value: CONSTRUCTOR = 4;
*/
CONSTRUCTOR = 4,
}
/**
* Describes the enum quixos.FunctionCapabilityKind.
*/
export const FunctionCapabilityKindSchema: GenEnum<FunctionCapabilityKind> = /*@__PURE__*/
enumDesc(file_quixos_package, 0);
+101 -26
View File
@@ -1,4 +1,4 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated by protoc-gen-es v2.14.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/refs.proto (package quixos, syntax proto3)
/* eslint-disable */
@@ -10,42 +10,117 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/refs.proto.
*/
export const file_quixos_refs: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInYKC0Z1bmN0aW9uUmVmEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIOCgZzeW1ib2wYAyABKAkSEwoLdmVyc2lvbl9yZWYYBCABKAkSEQoJb3BlcmF0aW9uGAUgASgJYgZwcm90bzM");
fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIroBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIAEIJCgdiaW5kaW5nIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM");
/**
* @generated from message quixos.FunctionRef
* @generated from message quixos.CapabilityRef
*/
export type FunctionRef = Message<"quixos.FunctionRef"> & {
export type CapabilityRef = Message<"quixos.CapabilityRef"> & {
/**
* @generated from field: string package_namespace = 1;
* @generated from field: string interface_revision_id = 1;
*/
packageNamespace: string;
interfaceRevisionId: string;
/**
* @generated from field: string package_name = 2;
* @generated from field: string operation_id = 2;
*/
packageName: string;
/**
* @generated from field: string symbol = 3;
*/
symbol: string;
/**
* @generated from field: string version_ref = 4;
*/
versionRef: string;
/**
* @generated from field: string operation = 5;
*/
operation: string;
operationId: string;
};
/**
* Describes the message quixos.FunctionRef.
* Use `create(FunctionRefSchema)` to create a new message.
* Describes the message quixos.CapabilityRef.
* Use `create(CapabilityRefSchema)` to create a new message.
*/
export const FunctionRefSchema: GenMessage<FunctionRef> = /*@__PURE__*/
export const CapabilityRefSchema: GenMessage<CapabilityRef> = /*@__PURE__*/
messageDesc(file_quixos_refs, 0);
/**
* @generated from message quixos.PackageExportRef
*/
export type PackageExportRef = Message<"quixos.PackageExportRef"> & {
/**
* @generated from field: string package_revision_id = 1;
*/
packageRevisionId: string;
/**
* @generated from field: string export_id = 2;
*/
exportId: string;
};
/**
* Describes the message quixos.PackageExportRef.
* Use `create(PackageExportRefSchema)` to create a new message.
*/
export const PackageExportRefSchema: GenMessage<PackageExportRef> = /*@__PURE__*/
messageDesc(file_quixos_refs, 1);
/**
* @generated from message quixos.InjectedDependency
*/
export type InjectedDependency = Message<"quixos.InjectedDependency"> & {
/**
* @generated from field: string port_id = 1;
*/
portId: string;
/**
* @generated from oneof quixos.InjectedDependency.binding
*/
binding: {
/**
* @generated from field: string state_slot_id = 2;
*/
value: string;
case: "stateSlotId";
} | {
/**
* @generated from field: quixos.EdgeDependency edge = 3;
*/
value: EdgeDependency;
case: "edge";
} | {
/**
* @generated from field: string receiver_interface_revision_id = 4;
*/
value: string;
case: "receiverInterfaceRevisionId";
} | {
/**
* @generated from field: string constructor_atom_id = 5;
*/
value: string;
case: "constructorAtomId";
} | { case: undefined; value?: undefined };
};
/**
* Describes the message quixos.InjectedDependency.
* Use `create(InjectedDependencySchema)` to create a new message.
*/
export const InjectedDependencySchema: GenMessage<InjectedDependency> = /*@__PURE__*/
messageDesc(file_quixos_refs, 2);
/**
* @generated from message quixos.EdgeDependency
*/
export type EdgeDependency = Message<"quixos.EdgeDependency"> & {
/**
* @generated from field: string edge_type_id = 1;
*/
edgeTypeId: string;
/**
* @generated from field: string projection_id = 2;
*/
projectionId: string;
};
/**
* Describes the message quixos.EdgeDependency.
* Use `create(EdgeDependencySchema)` to create a new message.
*/
export const EdgeDependencySchema: GenMessage<EdgeDependency> = /*@__PURE__*/
messageDesc(file_quixos_refs, 3);
+26 -21
View File
@@ -1,4 +1,4 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated by protoc-gen-es v2.14.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/runtime.proto (package quixos.runtime, syntax proto3)
/* eslint-disable */
@@ -6,7 +6,7 @@ import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegen
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import type { Value } from "../camino/api_pb.js";
import { file_camino_api } from "../camino/api_pb.js";
import type { FunctionRef } from "./refs_pb.js";
import type { InjectedDependency, PackageExportRef } from "./refs_pb.js";
import { file_quixos_refs } from "./refs_pb.js";
import type { Message } from "@bufbuild/protobuf";
@@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/runtime.proto.
*/
export const file_quixos_runtime: GenFile = /*@__PURE__*/
fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkijgEKEUhhbmRzaGFrZVJlc3BvbnNlEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAyABKAkSJgoJZnVuY3Rpb25zGAQgAygLMhMucXVpeG9zLkZ1bmN0aW9uUmVmItYBCg1JbnZva2VSZXF1ZXN0EhUKDWludm9jYXRpb25faWQYASABKAkSJQoIZnVuY3Rpb24YAiABKAsyEy5xdWl4b3MuRnVuY3Rpb25SZWYSEQoJb2JqZWN0X2lkGAMgASgJEjcKBWlucHV0GAQgAygLMigucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJKCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAki1AEKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEiUKCGZ1bmN0aW9uGAIgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJeChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRISCgpmaWVsZF9uYW1lGAMgASgJEhQKDHNvdXJjZV9maWVsZBgEIAEoCSKVAQoKV2F0Y2hFdmVudBIQCgh3YXRjaF9pZBgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYAyADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgEIAEoCRIPCgdpbml0aWFsGAUgASgIMvABCg5QYWNrYWdlUnVudGltZRJQCglIYW5kc2hha2USIC5xdWl4b3MucnVudGltZS5IYW5kc2hha2VSZXF1ZXN0GiEucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVzcG9uc2USRwoGSW52b2tlEh0ucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdBoeLnF1aXhvcy5ydW50aW1lLkludm9rZVJlc3BvbnNlEkMKBVdhdGNoEhwucXVpeG9zLnJ1bnRpbWUuV2F0Y2hSZXF1ZXN0GhoucXVpeG9zLnJ1bnRpbWUuV2F0Y2hFdmVudDABYgZwcm90bzM", [file_camino_api, file_quixos_refs]);
fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkiZgoRSGFuZHNoYWtlUmVzcG9uc2USGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgBIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAiABKAkSEgoKZXhwb3J0X2lkcxgDIAMoCSKLAgoNSW52b2tlUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI3CgVpbnB1dBgEIAMoCzIoLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJKCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAkiiQIKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5EjAKDGRlcGVuZGVuY2llcxgFIAMoCzIaLnF1aXhvcy5JbmplY3RlZERlcGVuZGVuY3kaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBImIKEURlcml2ZWREZXBlbmRlbmN5EgwKBGtpbmQYASABKAkSEQoJb2JqZWN0X2lkGAIgASgJEhUKDWF0dGFjaG1lbnRfaWQYAyABKAkSFQoNcHJvamVjdGlvbl9pZBgEIAEoCSKVAQoKV2F0Y2hFdmVudBIQCgh3YXRjaF9pZBgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYAyADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgEIAEoCRIPCgdpbml0aWFsGAUgASgIMvABCg5QYWNrYWdlUnVudGltZRJQCglIYW5kc2hha2USIC5xdWl4b3MucnVudGltZS5IYW5kc2hha2VSZXF1ZXN0GiEucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVzcG9uc2USRwoGSW52b2tlEh0ucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdBoeLnF1aXhvcy5ydW50aW1lLkludm9rZVJlc3BvbnNlEkMKBVdhdGNoEhwucXVpeG9zLnJ1bnRpbWUuV2F0Y2hSZXF1ZXN0GhoucXVpeG9zLnJ1bnRpbWUuV2F0Y2hFdmVudDABYgZwcm90bzM", [file_camino_api, file_quixos_refs]);
/**
* @generated from message quixos.runtime.HandshakeRequest
@@ -38,24 +38,19 @@ export const HandshakeRequestSchema: GenMessage<HandshakeRequest> = /*@__PURE__*
*/
export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & {
/**
* @generated from field: string package_namespace = 1;
* @generated from field: string package_revision_id = 1;
*/
packageNamespace: string;
packageRevisionId: string;
/**
* @generated from field: string package_name = 2;
*/
packageName: string;
/**
* @generated from field: string runtime_protocol_version = 3;
* @generated from field: string runtime_protocol_version = 2;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: repeated quixos.FunctionRef functions = 4;
* @generated from field: repeated string export_ids = 3;
*/
functions: FunctionRef[];
exportIds: string[];
};
/**
@@ -75,9 +70,9 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
invocationId: string;
/**
* @generated from field: quixos.FunctionRef function = 2;
* @generated from field: quixos.PackageExportRef export = 2;
*/
function?: FunctionRef | undefined;
export?: PackageExportRef | undefined;
/**
* @generated from field: string object_id = 3;
@@ -88,6 +83,11 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
* @generated from field: map<string, camino.Value> input = 4;
*/
input: { [key: string]: Value };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
};
/**
@@ -134,9 +134,9 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
invocationId: string;
/**
* @generated from field: quixos.FunctionRef function = 2;
* @generated from field: quixos.PackageExportRef export = 2;
*/
function?: FunctionRef | undefined;
export?: PackageExportRef | undefined;
/**
* @generated from field: string object_id = 3;
@@ -147,6 +147,11 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
* @generated from field: map<string, camino.Value> input = 4;
*/
input: { [key: string]: Value };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
};
/**
@@ -171,14 +176,14 @@ export type DerivedDependency = Message<"quixos.runtime.DerivedDependency"> & {
objectId: string;
/**
* @generated from field: string field_name = 3;
* @generated from field: string attachment_id = 3;
*/
fieldName: string;
attachmentId: string;
/**
* @generated from field: string source_field = 4;
* @generated from field: string projection_id = 4;
*/
sourceField: string;
projectionId: string;
};
/**
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env node
import { readFile } from "node:fs/promises";
import { parseQuixosLock } from "./parser.js";
const fileName = process.argv[2];
if (!fileName || process.argv.length !== 3) {
console.error("Usage: quixos-lock-check <quixos.lock>");
process.exit(2);
}
const result = parseQuixosLock(await readFile(fileName, "utf8"), fileName);
if (!result.ok) {
for (const diagnostic of result.diagnostics) {
console.error(
`${diagnostic.fileName}:${diagnostic.line}:${diagnostic.column + 1}: ${diagnostic.phase}/${diagnostic.code}: ${diagnostic.message}`,
);
}
process.exit(1);
}
console.log(JSON.stringify(result.lock, null, 2));
@@ -0,0 +1,52 @@
token literal names:
null
'quixos-lock'
'version'
'quixos'
'source'
'interface'
'package'
'repository'
'commit'
'{'
'}'
';'
null
null
null
null
null
null
token symbolic names:
null
QUIXOS_LOCK
VERSION
QUIXOS
SOURCE
INTERFACE
PACKAGE
REPOSITORY
COMMIT
LBRACE
RBRACE
SEMI
INTEGER
IDENTIFIER
STRING_LITERAL
LINE_COMMENT
BLOCK_COMMENT
WS
rule names:
document
quixosEntry
resourceEntry
resourceKind
sourceBlock
identifier
stringLiteral
atn:
[4, 1, 17, 53, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 21, 8, 0, 10, 0, 12, 0, 24, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 0, 0, 7, 0, 2, 4, 6, 8, 10, 12, 0, 1, 1, 0, 5, 6, 46, 0, 14, 1, 0, 0, 0, 2, 28, 1, 0, 0, 0, 4, 32, 1, 0, 0, 0, 6, 37, 1, 0, 0, 0, 8, 39, 1, 0, 0, 0, 10, 48, 1, 0, 0, 0, 12, 50, 1, 0, 0, 0, 14, 15, 5, 1, 0, 0, 15, 16, 5, 2, 0, 0, 16, 17, 5, 12, 0, 0, 17, 18, 5, 9, 0, 0, 18, 22, 3, 2, 1, 0, 19, 21, 3, 4, 2, 0, 20, 19, 1, 0, 0, 0, 21, 24, 1, 0, 0, 0, 22, 20, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 22, 1, 0, 0, 0, 25, 26, 5, 10, 0, 0, 26, 27, 5, 0, 0, 1, 27, 1, 1, 0, 0, 0, 28, 29, 5, 3, 0, 0, 29, 30, 5, 4, 0, 0, 30, 31, 3, 8, 4, 0, 31, 3, 1, 0, 0, 0, 32, 33, 3, 6, 3, 0, 33, 34, 3, 10, 5, 0, 34, 35, 5, 4, 0, 0, 35, 36, 3, 8, 4, 0, 36, 5, 1, 0, 0, 0, 37, 38, 7, 0, 0, 0, 38, 7, 1, 0, 0, 0, 39, 40, 5, 9, 0, 0, 40, 41, 5, 7, 0, 0, 41, 42, 3, 12, 6, 0, 42, 43, 5, 11, 0, 0, 43, 44, 5, 8, 0, 0, 44, 45, 3, 12, 6, 0, 45, 46, 5, 11, 0, 0, 46, 47, 5, 10, 0, 0, 47, 9, 1, 0, 0, 0, 48, 49, 5, 13, 0, 0, 49, 11, 1, 0, 0, 0, 50, 51, 5, 14, 0, 0, 51, 13, 1, 0, 0, 0, 1, 22]
@@ -0,0 +1,28 @@
QUIXOS_LOCK=1
VERSION=2
QUIXOS=3
SOURCE=4
INTERFACE=5
PACKAGE=6
REPOSITORY=7
COMMIT=8
LBRACE=9
RBRACE=10
SEMI=11
INTEGER=12
IDENTIFIER=13
STRING_LITERAL=14
LINE_COMMENT=15
BLOCK_COMMENT=16
WS=17
'quixos-lock'=1
'version'=2
'quixos'=3
'source'=4
'interface'=5
'package'=6
'repository'=7
'commit'=8
'{'=9
'}'=10
';'=11
File diff suppressed because one or more lines are too long
@@ -0,0 +1,28 @@
QUIXOS_LOCK=1
VERSION=2
QUIXOS=3
SOURCE=4
INTERFACE=5
PACKAGE=6
REPOSITORY=7
COMMIT=8
LBRACE=9
RBRACE=10
SEMI=11
INTEGER=12
IDENTIFIER=13
STRING_LITERAL=14
LINE_COMMENT=15
BLOCK_COMMENT=16
WS=17
'quixos-lock'=1
'version'=2
'quixos'=3
'source'=4
'interface'=5
'package'=6
'repository'=7
'commit'=8
'{'=9
'}'=10
';'=11
@@ -0,0 +1,155 @@
import * as antlr from "antlr4ng";
import { Token } from "antlr4ng";
export class QuixosLockLexer extends antlr.Lexer {
public static readonly QUIXOS_LOCK = 1;
public static readonly VERSION = 2;
public static readonly QUIXOS = 3;
public static readonly SOURCE = 4;
public static readonly INTERFACE = 5;
public static readonly PACKAGE = 6;
public static readonly REPOSITORY = 7;
public static readonly COMMIT = 8;
public static readonly LBRACE = 9;
public static readonly RBRACE = 10;
public static readonly SEMI = 11;
public static readonly INTEGER = 12;
public static readonly IDENTIFIER = 13;
public static readonly STRING_LITERAL = 14;
public static readonly LINE_COMMENT = 15;
public static readonly BLOCK_COMMENT = 16;
public static readonly WS = 17;
public static readonly channelNames = [
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
];
public static readonly literalNames = [
null, "'quixos-lock'", "'version'", "'quixos'", "'source'", "'interface'",
"'package'", "'repository'", "'commit'", "'{'", "'}'", "';'"
];
public static readonly symbolicNames = [
null, "QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE",
"PACKAGE", "REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER",
"IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT",
"WS"
];
public static readonly modeNames = [
"DEFAULT_MODE",
];
public static readonly ruleNames = [
"QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", "PACKAGE",
"REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER", "IDENTIFIER",
"STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT",
"WS",
];
public constructor(input: antlr.CharStream) {
super(input);
this.interpreter = new antlr.LexerATNSimulator(this, QuixosLockLexer._ATN, QuixosLockLexer.decisionsToDFA, new antlr.PredictionContextCache());
}
public get grammarFileName(): string { return "QuixosLock.g4"; }
public get literalNames(): (string | null)[] { return QuixosLockLexer.literalNames; }
public get symbolicNames(): (string | null)[] { return QuixosLockLexer.symbolicNames; }
public get ruleNames(): string[] { return QuixosLockLexer.ruleNames; }
public get serializedATN(): number[] { return QuixosLockLexer._serializedATN; }
public get channelNames(): string[] { return QuixosLockLexer.channelNames; }
public get modeNames(): string[] { return QuixosLockLexer.modeNames; }
public static readonly _serializedATN: number[] = [
4,0,17,181,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,
13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,1,0,1,
0,1,0,1,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,
1,1,1,1,1,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,4,1,4,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,5,1,5,1,6,1,6,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,7,1,8,1,8,1,9,1,9,1,10,1,10,1,11,4,11,117,8,11,11,
11,12,11,118,1,12,1,12,5,12,123,8,12,10,12,12,12,126,9,12,1,13,1,
13,1,13,5,13,131,8,13,10,13,12,13,134,9,13,1,13,1,13,1,14,1,14,1,
14,1,14,1,14,1,14,1,14,1,14,3,14,146,8,14,1,15,1,15,1,16,1,16,1,
16,1,16,5,16,154,8,16,10,16,12,16,157,9,16,1,16,1,16,1,17,1,17,1,
17,1,17,5,17,165,8,17,10,17,12,17,168,9,17,1,17,1,17,1,17,1,17,1,
17,1,18,4,18,176,8,18,11,18,12,18,177,1,18,1,18,1,166,0,19,1,1,3,
2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,
29,0,31,0,33,15,35,16,37,17,1,0,8,1,0,48,57,3,0,65,90,95,95,97,122,
4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,
34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,
70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,186,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,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,1,0,0,0,0,23,
1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,
1,0,0,0,1,39,1,0,0,0,3,51,1,0,0,0,5,59,1,0,0,0,7,66,1,0,0,0,9,73,
1,0,0,0,11,83,1,0,0,0,13,91,1,0,0,0,15,102,1,0,0,0,17,109,1,0,0,
0,19,111,1,0,0,0,21,113,1,0,0,0,23,116,1,0,0,0,25,120,1,0,0,0,27,
127,1,0,0,0,29,137,1,0,0,0,31,147,1,0,0,0,33,149,1,0,0,0,35,160,
1,0,0,0,37,175,1,0,0,0,39,40,5,113,0,0,40,41,5,117,0,0,41,42,5,105,
0,0,42,43,5,120,0,0,43,44,5,111,0,0,44,45,5,115,0,0,45,46,5,45,0,
0,46,47,5,108,0,0,47,48,5,111,0,0,48,49,5,99,0,0,49,50,5,107,0,0,
50,2,1,0,0,0,51,52,5,118,0,0,52,53,5,101,0,0,53,54,5,114,0,0,54,
55,5,115,0,0,55,56,5,105,0,0,56,57,5,111,0,0,57,58,5,110,0,0,58,
4,1,0,0,0,59,60,5,113,0,0,60,61,5,117,0,0,61,62,5,105,0,0,62,63,
5,120,0,0,63,64,5,111,0,0,64,65,5,115,0,0,65,6,1,0,0,0,66,67,5,115,
0,0,67,68,5,111,0,0,68,69,5,117,0,0,69,70,5,114,0,0,70,71,5,99,0,
0,71,72,5,101,0,0,72,8,1,0,0,0,73,74,5,105,0,0,74,75,5,110,0,0,75,
76,5,116,0,0,76,77,5,101,0,0,77,78,5,114,0,0,78,79,5,102,0,0,79,
80,5,97,0,0,80,81,5,99,0,0,81,82,5,101,0,0,82,10,1,0,0,0,83,84,5,
112,0,0,84,85,5,97,0,0,85,86,5,99,0,0,86,87,5,107,0,0,87,88,5,97,
0,0,88,89,5,103,0,0,89,90,5,101,0,0,90,12,1,0,0,0,91,92,5,114,0,
0,92,93,5,101,0,0,93,94,5,112,0,0,94,95,5,111,0,0,95,96,5,115,0,
0,96,97,5,105,0,0,97,98,5,116,0,0,98,99,5,111,0,0,99,100,5,114,0,
0,100,101,5,121,0,0,101,14,1,0,0,0,102,103,5,99,0,0,103,104,5,111,
0,0,104,105,5,109,0,0,105,106,5,109,0,0,106,107,5,105,0,0,107,108,
5,116,0,0,108,16,1,0,0,0,109,110,5,123,0,0,110,18,1,0,0,0,111,112,
5,125,0,0,112,20,1,0,0,0,113,114,5,59,0,0,114,22,1,0,0,0,115,117,
7,0,0,0,116,115,1,0,0,0,117,118,1,0,0,0,118,116,1,0,0,0,118,119,
1,0,0,0,119,24,1,0,0,0,120,124,7,1,0,0,121,123,7,2,0,0,122,121,1,
0,0,0,123,126,1,0,0,0,124,122,1,0,0,0,124,125,1,0,0,0,125,26,1,0,
0,0,126,124,1,0,0,0,127,132,5,34,0,0,128,131,3,29,14,0,129,131,8,
3,0,0,130,128,1,0,0,0,130,129,1,0,0,0,131,134,1,0,0,0,132,130,1,
0,0,0,132,133,1,0,0,0,133,135,1,0,0,0,134,132,1,0,0,0,135,136,5,
34,0,0,136,28,1,0,0,0,137,145,5,92,0,0,138,146,7,4,0,0,139,140,5,
117,0,0,140,141,3,31,15,0,141,142,3,31,15,0,142,143,3,31,15,0,143,
144,3,31,15,0,144,146,1,0,0,0,145,138,1,0,0,0,145,139,1,0,0,0,146,
30,1,0,0,0,147,148,7,5,0,0,148,32,1,0,0,0,149,150,5,47,0,0,150,151,
5,47,0,0,151,155,1,0,0,0,152,154,8,6,0,0,153,152,1,0,0,0,154,157,
1,0,0,0,155,153,1,0,0,0,155,156,1,0,0,0,156,158,1,0,0,0,157,155,
1,0,0,0,158,159,6,16,0,0,159,34,1,0,0,0,160,161,5,47,0,0,161,162,
5,42,0,0,162,166,1,0,0,0,163,165,9,0,0,0,164,163,1,0,0,0,165,168,
1,0,0,0,166,167,1,0,0,0,166,164,1,0,0,0,167,169,1,0,0,0,168,166,
1,0,0,0,169,170,5,42,0,0,170,171,5,47,0,0,171,172,1,0,0,0,172,173,
6,17,0,0,173,36,1,0,0,0,174,176,7,7,0,0,175,174,1,0,0,0,176,177,
1,0,0,0,177,175,1,0,0,0,177,178,1,0,0,0,178,179,1,0,0,0,179,180,
6,18,0,0,180,38,1,0,0,0,9,0,118,124,130,132,145,155,166,177,1,6,
0,0
];
private static __ATN: antlr.ATN;
public static get _ATN(): antlr.ATN {
if (!QuixosLockLexer.__ATN) {
QuixosLockLexer.__ATN = new antlr.ATNDeserializer().deserialize(QuixosLockLexer._serializedATN);
}
return QuixosLockLexer.__ATN;
}
private static readonly vocabulary = new antlr.Vocabulary(QuixosLockLexer.literalNames, QuixosLockLexer.symbolicNames, []);
public override get vocabulary(): antlr.Vocabulary {
return QuixosLockLexer.vocabulary;
}
private static readonly decisionsToDFA = QuixosLockLexer._ATN.decisionToState.map( (ds: antlr.DecisionState, index: number) => new antlr.DFA(ds, index) );
}
@@ -0,0 +1,535 @@
import * as antlr from "antlr4ng";
import { Token } from "antlr4ng";
import { QuixosLockVisitor } from "./QuixosLockVisitor.js";
// for running tests with parameters, TODO: discuss strategy for typed parameters in CI
// eslint-disable-next-line no-unused-vars
type int = number;
export class QuixosLockParser extends antlr.Parser {
public static readonly QUIXOS_LOCK = 1;
public static readonly VERSION = 2;
public static readonly QUIXOS = 3;
public static readonly SOURCE = 4;
public static readonly INTERFACE = 5;
public static readonly PACKAGE = 6;
public static readonly REPOSITORY = 7;
public static readonly COMMIT = 8;
public static readonly LBRACE = 9;
public static readonly RBRACE = 10;
public static readonly SEMI = 11;
public static readonly INTEGER = 12;
public static readonly IDENTIFIER = 13;
public static readonly STRING_LITERAL = 14;
public static readonly LINE_COMMENT = 15;
public static readonly BLOCK_COMMENT = 16;
public static readonly WS = 17;
public static readonly RULE_document = 0;
public static readonly RULE_quixosEntry = 1;
public static readonly RULE_resourceEntry = 2;
public static readonly RULE_resourceKind = 3;
public static readonly RULE_sourceBlock = 4;
public static readonly RULE_identifier = 5;
public static readonly RULE_stringLiteral = 6;
public static readonly literalNames = [
null, "'quixos-lock'", "'version'", "'quixos'", "'source'", "'interface'",
"'package'", "'repository'", "'commit'", "'{'", "'}'", "';'"
];
public static readonly symbolicNames = [
null, "QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE",
"PACKAGE", "REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER",
"IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT",
"WS"
];
public static readonly ruleNames = [
"document", "quixosEntry", "resourceEntry", "resourceKind", "sourceBlock",
"identifier", "stringLiteral",
];
public get grammarFileName(): string { return "QuixosLock.g4"; }
public get literalNames(): (string | null)[] { return QuixosLockParser.literalNames; }
public get symbolicNames(): (string | null)[] { return QuixosLockParser.symbolicNames; }
public get ruleNames(): string[] { return QuixosLockParser.ruleNames; }
public get serializedATN(): number[] { return QuixosLockParser._serializedATN; }
protected createFailedPredicateException(predicate?: string, message?: string): antlr.FailedPredicateException {
return new antlr.FailedPredicateException(this, predicate, message);
}
public constructor(input: antlr.TokenStream) {
super(input);
this.interpreter = new antlr.ParserATNSimulator(this, QuixosLockParser._ATN, QuixosLockParser.decisionsToDFA, new antlr.PredictionContextCache());
}
public document(): DocumentContext {
let localContext = new DocumentContext(this.context, this.state);
this.enterRule(localContext, 0, QuixosLockParser.RULE_document);
let _la: number;
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 14;
this.match(QuixosLockParser.QUIXOS_LOCK);
this.state = 15;
this.match(QuixosLockParser.VERSION);
this.state = 16;
this.match(QuixosLockParser.INTEGER);
this.state = 17;
this.match(QuixosLockParser.LBRACE);
this.state = 18;
this.quixosEntry();
this.state = 22;
this.errorHandler.sync(this);
_la = this.tokenStream.LA(1);
while (_la === 5 || _la === 6) {
{
{
this.state = 19;
this.resourceEntry();
}
}
this.state = 24;
this.errorHandler.sync(this);
_la = this.tokenStream.LA(1);
}
this.state = 25;
this.match(QuixosLockParser.RBRACE);
this.state = 26;
this.match(QuixosLockParser.EOF);
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public quixosEntry(): QuixosEntryContext {
let localContext = new QuixosEntryContext(this.context, this.state);
this.enterRule(localContext, 2, QuixosLockParser.RULE_quixosEntry);
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 28;
this.match(QuixosLockParser.QUIXOS);
this.state = 29;
this.match(QuixosLockParser.SOURCE);
this.state = 30;
this.sourceBlock();
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public resourceEntry(): ResourceEntryContext {
let localContext = new ResourceEntryContext(this.context, this.state);
this.enterRule(localContext, 4, QuixosLockParser.RULE_resourceEntry);
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 32;
this.resourceKind();
this.state = 33;
this.identifier();
this.state = 34;
this.match(QuixosLockParser.SOURCE);
this.state = 35;
this.sourceBlock();
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public resourceKind(): ResourceKindContext {
let localContext = new ResourceKindContext(this.context, this.state);
this.enterRule(localContext, 6, QuixosLockParser.RULE_resourceKind);
let _la: number;
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 37;
_la = this.tokenStream.LA(1);
if(!(_la === 5 || _la === 6)) {
this.errorHandler.recoverInline(this);
}
else {
this.errorHandler.reportMatch(this);
this.consume();
}
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public sourceBlock(): SourceBlockContext {
let localContext = new SourceBlockContext(this.context, this.state);
this.enterRule(localContext, 8, QuixosLockParser.RULE_sourceBlock);
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 39;
this.match(QuixosLockParser.LBRACE);
this.state = 40;
this.match(QuixosLockParser.REPOSITORY);
this.state = 41;
this.stringLiteral();
this.state = 42;
this.match(QuixosLockParser.SEMI);
this.state = 43;
this.match(QuixosLockParser.COMMIT);
this.state = 44;
this.stringLiteral();
this.state = 45;
this.match(QuixosLockParser.SEMI);
this.state = 46;
this.match(QuixosLockParser.RBRACE);
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public identifier(): IdentifierContext {
let localContext = new IdentifierContext(this.context, this.state);
this.enterRule(localContext, 10, QuixosLockParser.RULE_identifier);
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 48;
this.match(QuixosLockParser.IDENTIFIER);
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public stringLiteral(): StringLiteralContext {
let localContext = new StringLiteralContext(this.context, this.state);
this.enterRule(localContext, 12, QuixosLockParser.RULE_stringLiteral);
try {
this.enterOuterAlt(localContext, 1);
{
this.state = 50;
this.match(QuixosLockParser.STRING_LITERAL);
}
}
catch (re) {
if (re instanceof antlr.RecognitionException) {
this.errorHandler.reportError(this, re);
this.errorHandler.recover(this, re);
} else {
throw re;
}
}
finally {
this.exitRule();
}
return localContext;
}
public static readonly _serializedATN: number[] = [
4,1,17,53,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,1,0,1,0,1,0,1,0,1,0,1,0,5,0,21,8,0,10,0,12,0,24,9,0,1,0,1,0,1,
0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,4,1,4,1,4,1,4,1,
4,1,4,1,4,1,4,1,4,1,5,1,5,1,6,1,6,1,6,0,0,7,0,2,4,6,8,10,12,0,1,
1,0,5,6,46,0,14,1,0,0,0,2,28,1,0,0,0,4,32,1,0,0,0,6,37,1,0,0,0,8,
39,1,0,0,0,10,48,1,0,0,0,12,50,1,0,0,0,14,15,5,1,0,0,15,16,5,2,0,
0,16,17,5,12,0,0,17,18,5,9,0,0,18,22,3,2,1,0,19,21,3,4,2,0,20,19,
1,0,0,0,21,24,1,0,0,0,22,20,1,0,0,0,22,23,1,0,0,0,23,25,1,0,0,0,
24,22,1,0,0,0,25,26,5,10,0,0,26,27,5,0,0,1,27,1,1,0,0,0,28,29,5,
3,0,0,29,30,5,4,0,0,30,31,3,8,4,0,31,3,1,0,0,0,32,33,3,6,3,0,33,
34,3,10,5,0,34,35,5,4,0,0,35,36,3,8,4,0,36,5,1,0,0,0,37,38,7,0,0,
0,38,7,1,0,0,0,39,40,5,9,0,0,40,41,5,7,0,0,41,42,3,12,6,0,42,43,
5,11,0,0,43,44,5,8,0,0,44,45,3,12,6,0,45,46,5,11,0,0,46,47,5,10,
0,0,47,9,1,0,0,0,48,49,5,13,0,0,49,11,1,0,0,0,50,51,5,14,0,0,51,
13,1,0,0,0,1,22
];
private static __ATN: antlr.ATN;
public static get _ATN(): antlr.ATN {
if (!QuixosLockParser.__ATN) {
QuixosLockParser.__ATN = new antlr.ATNDeserializer().deserialize(QuixosLockParser._serializedATN);
}
return QuixosLockParser.__ATN;
}
private static readonly vocabulary = new antlr.Vocabulary(QuixosLockParser.literalNames, QuixosLockParser.symbolicNames, []);
public override get vocabulary(): antlr.Vocabulary {
return QuixosLockParser.vocabulary;
}
private static readonly decisionsToDFA = QuixosLockParser._ATN.decisionToState.map( (ds: antlr.DecisionState, index: number) => new antlr.DFA(ds, index) );
}
export class DocumentContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public QUIXOS_LOCK(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.QUIXOS_LOCK, 0)!;
}
public VERSION(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.VERSION, 0)!;
}
public INTEGER(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.INTEGER, 0)!;
}
public LBRACE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.LBRACE, 0)!;
}
public quixosEntry(): QuixosEntryContext {
return this.getRuleContext(0, QuixosEntryContext)!;
}
public RBRACE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.RBRACE, 0)!;
}
public EOF(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.EOF, 0)!;
}
public resourceEntry(): ResourceEntryContext[];
public resourceEntry(i: number): ResourceEntryContext | null;
public resourceEntry(i?: number): ResourceEntryContext[] | ResourceEntryContext | null {
if (i === undefined) {
return this.getRuleContexts(ResourceEntryContext);
}
return this.getRuleContext(i, ResourceEntryContext);
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_document;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitDocument) {
return visitor.visitDocument(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class QuixosEntryContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public QUIXOS(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.QUIXOS, 0)!;
}
public SOURCE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.SOURCE, 0)!;
}
public sourceBlock(): SourceBlockContext {
return this.getRuleContext(0, SourceBlockContext)!;
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_quixosEntry;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitQuixosEntry) {
return visitor.visitQuixosEntry(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class ResourceEntryContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public resourceKind(): ResourceKindContext {
return this.getRuleContext(0, ResourceKindContext)!;
}
public identifier(): IdentifierContext {
return this.getRuleContext(0, IdentifierContext)!;
}
public SOURCE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.SOURCE, 0)!;
}
public sourceBlock(): SourceBlockContext {
return this.getRuleContext(0, SourceBlockContext)!;
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_resourceEntry;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitResourceEntry) {
return visitor.visitResourceEntry(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class ResourceKindContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public INTERFACE(): antlr.TerminalNode | null {
return this.getToken(QuixosLockParser.INTERFACE, 0);
}
public PACKAGE(): antlr.TerminalNode | null {
return this.getToken(QuixosLockParser.PACKAGE, 0);
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_resourceKind;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitResourceKind) {
return visitor.visitResourceKind(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class SourceBlockContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public LBRACE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.LBRACE, 0)!;
}
public REPOSITORY(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.REPOSITORY, 0)!;
}
public stringLiteral(): StringLiteralContext[];
public stringLiteral(i: number): StringLiteralContext | null;
public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null {
if (i === undefined) {
return this.getRuleContexts(StringLiteralContext);
}
return this.getRuleContext(i, StringLiteralContext);
}
public SEMI(): antlr.TerminalNode[];
public SEMI(i: number): antlr.TerminalNode | null;
public SEMI(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] {
if (i === undefined) {
return this.getTokens(QuixosLockParser.SEMI);
} else {
return this.getToken(QuixosLockParser.SEMI, i);
}
}
public COMMIT(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.COMMIT, 0)!;
}
public RBRACE(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.RBRACE, 0)!;
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_sourceBlock;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitSourceBlock) {
return visitor.visitSourceBlock(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class IdentifierContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public IDENTIFIER(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.IDENTIFIER, 0)!;
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_identifier;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitIdentifier) {
return visitor.visitIdentifier(this);
} else {
return visitor.visitChildren(this);
}
}
}
export class StringLiteralContext extends antlr.ParserRuleContext {
public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) {
super(parent, invokingState);
}
public STRING_LITERAL(): antlr.TerminalNode {
return this.getToken(QuixosLockParser.STRING_LITERAL, 0)!;
}
public override get ruleIndex(): number {
return QuixosLockParser.RULE_stringLiteral;
}
public override accept<Result>(visitor: QuixosLockVisitor<Result>): Result | null {
if (visitor.visitStringLiteral) {
return visitor.visitStringLiteral(this);
} else {
return visitor.visitChildren(this);
}
}
}
@@ -0,0 +1,65 @@
import { AbstractParseTreeVisitor } from "antlr4ng";
import { DocumentContext } from "./QuixosLockParser.js";
import { QuixosEntryContext } from "./QuixosLockParser.js";
import { ResourceEntryContext } from "./QuixosLockParser.js";
import { ResourceKindContext } from "./QuixosLockParser.js";
import { SourceBlockContext } from "./QuixosLockParser.js";
import { IdentifierContext } from "./QuixosLockParser.js";
import { StringLiteralContext } from "./QuixosLockParser.js";
/**
* This interface defines a complete generic visitor for a parse tree produced
* by `QuixosLockParser`.
*
* @param <Result> The return type of the visit operation. Use `void` for
* operations with no return type.
*/
export class QuixosLockVisitor<Result> extends AbstractParseTreeVisitor<Result> {
/**
* Visit a parse tree produced by `QuixosLockParser.document`.
* @param ctx the parse tree
* @return the visitor result
*/
visitDocument?: (ctx: DocumentContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.quixosEntry`.
* @param ctx the parse tree
* @return the visitor result
*/
visitQuixosEntry?: (ctx: QuixosEntryContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.resourceEntry`.
* @param ctx the parse tree
* @return the visitor result
*/
visitResourceEntry?: (ctx: ResourceEntryContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.resourceKind`.
* @param ctx the parse tree
* @return the visitor result
*/
visitResourceKind?: (ctx: ResourceKindContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.sourceBlock`.
* @param ctx the parse tree
* @return the visitor result
*/
visitSourceBlock?: (ctx: SourceBlockContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.identifier`.
* @param ctx the parse tree
* @return the visitor result
*/
visitIdentifier?: (ctx: IdentifierContext) => Result;
/**
* Visit a parse tree produced by `QuixosLockParser.stringLiteral`.
* @param ctx the parse tree
* @return the visitor result
*/
visitStringLiteral?: (ctx: StringLiteralContext) => Result;
}
+2
View File
@@ -0,0 +1,2 @@
export * from "./parser.js";
export * from "./types.js";
+227
View File
@@ -0,0 +1,227 @@
import {
BaseErrorListener,
CharStream,
CommonTokenStream,
type ATNSimulator,
type RecognitionException,
type Recognizer,
type Token,
} from "antlr4ng";
import { QuixosLockLexer } from "./generated/QuixosLockLexer.js";
import {
QuixosLockParser,
type SourceBlockContext,
} from "./generated/QuixosLockParser.js";
import type {
GitSource,
LockedResource,
QuixosRepositoryLock,
} from "./types.js";
export type QuixosLockDiagnostic = {
phase: "syntax" | "validation";
code: string;
message: string;
fileName: string;
line: number;
column: number;
path?: string;
};
export type QuixosLockParseResult =
| { ok: true; lock: QuixosRepositoryLock; diagnostics: [] }
| { ok: false; diagnostics: QuixosLockDiagnostic[] };
class SyntaxErrorListener extends BaseErrorListener {
constructor(
private readonly fileName: string,
private readonly diagnostics: QuixosLockDiagnostic[],
) {
super();
}
override syntaxError<S extends Token, T extends ATNSimulator>(
_recognizer: Recognizer<T>,
_offendingSymbol: S | null,
line: number,
column: number,
message: string,
_error: RecognitionException | null,
): void {
this.diagnostics.push({
phase: "syntax",
code: "syntax-error",
message,
fileName: this.fileName,
line,
column,
});
}
}
const stringValue = (context: { getText(): string }): string =>
JSON.parse(context.getText()) as string;
const lowerSource = (context: SourceBlockContext): GitSource => ({
resolver: "git",
repository: stringValue(context.stringLiteral(0)!),
commit: stringValue(context.stringLiteral(1)!).toLowerCase(),
});
const issue = (
diagnostics: QuixosLockDiagnostic[],
fileName: string,
code: string,
message: string,
path?: string,
) => diagnostics.push({
phase: "validation",
code,
message,
fileName,
line: 1,
column: 0,
path,
});
const validateSource = (
source: GitSource,
path: string,
fileName: string,
diagnostics: QuixosLockDiagnostic[],
) => {
if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(source.commit)) {
issue(
diagnostics,
fileName,
"invalid-git-commit",
`${path}.commit must be a full 40- or 64-character Git object ID`,
`${path}.commit`,
);
}
let repository: URL;
try {
repository = new URL(source.repository);
} catch {
issue(
diagnostics,
fileName,
"invalid-git-repository",
`${path}.repository must be an absolute Git URL`,
`${path}.repository`,
);
return;
}
if (!["https:", "ssh:"].includes(repository.protocol)) {
issue(
diagnostics,
fileName,
"unsupported-git-transport",
`${path}.repository must use https:// or ssh://`,
`${path}.repository`,
);
}
if (repository.search || repository.hash) {
issue(
diagnostics,
fileName,
"decorated-git-repository",
`${path}.repository must be a base repository URL without a query or fragment`,
`${path}.repository`,
);
}
if (repository.password || (repository.protocol === "https:" && repository.username)) {
issue(
diagnostics,
fileName,
"embedded-git-credential",
`${path}.repository must not embed credentials`,
`${path}.repository`,
);
}
};
export const parseQuixosLock = (
source: string,
fileName = "<memory>",
): QuixosLockParseResult => {
const diagnostics: QuixosLockDiagnostic[] = [];
const listener = new SyntaxErrorListener(fileName, diagnostics);
const lexer = new QuixosLockLexer(CharStream.fromString(source));
lexer.removeErrorListeners();
lexer.addErrorListener(listener);
const parser = new QuixosLockParser(new CommonTokenStream(lexer));
parser.removeErrorListeners();
parser.addErrorListener(listener);
const tree = parser.document();
if (diagnostics.length > 0) return { ok: false, diagnostics };
const formatVersion = Number.parseInt(tree.INTEGER().getText(), 10);
if (formatVersion !== 1) {
issue(
diagnostics,
fileName,
"unsupported-lock-version",
`Unsupported Quixos lock format version ${formatVersion}`,
"formatVersion",
);
}
const quixos = lowerSource(tree.quixosEntry().sourceBlock());
validateSource(quixos, "quixos", fileName, diagnostics);
const resources: LockedResource[] = [];
const bindings = new Set<string>();
for (const [index, context] of tree.resourceEntry().entries()) {
const kind = context.resourceKind().INTERFACE() ? "interface" : "package";
const binding = context.identifier().getText();
const key = `${kind}\0${binding}`;
if (bindings.has(key)) {
issue(
diagnostics,
fileName,
"duplicate-resource-binding",
`Duplicate ${kind} binding ${binding}`,
`resources[${index}].binding`,
);
}
bindings.add(key);
const resource = { kind, binding, source: lowerSource(context.sourceBlock()) } as LockedResource;
validateSource(resource.source, `resources[${index}].source`, fileName, diagnostics);
resources.push(resource);
}
return diagnostics.length > 0
? { ok: false, diagnostics }
: {
ok: true,
lock: { formatVersion: 1, quixos, resources },
diagnostics: [],
};
};
const quoted = (value: string) => JSON.stringify(value);
const sourceLines = (source: GitSource, indentation: string): string[] => [
`${indentation}repository ${quoted(source.repository)};`,
`${indentation}commit ${quoted(source.commit.toLowerCase())};`,
];
export const formatQuixosLock = (lock: QuixosRepositoryLock): string => {
const lines = [
"quixos-lock version 1 {",
" quixos source {",
...sourceLines(lock.quixos, " "),
" }",
];
for (const resource of lock.resources) {
lines.push(
"",
` ${resource.kind} ${resource.binding} source {`,
...sourceLines(resource.source, " "),
" }",
);
}
lines.push("}", "");
return lines.join("\n");
};
+38
View File
@@ -0,0 +1,38 @@
export type GitSource = {
resolver: "git";
repository: string;
commit: string;
};
export type LockedResourceKind = "interface" | "package";
export type LockedResource = {
kind: LockedResourceKind;
binding: string;
source: GitSource;
};
export type QuixosRepositoryLock = {
formatVersion: 1;
quixos: GitSource;
resources: LockedResource[];
};
export type NixGitInput = {
type: "git";
url: string;
ref: string;
rev: string;
};
export const RETENTION_TAG_PREFIX = "refs/tags/quixos-reachability/";
export const retentionTagForCommit = (commit: string): string =>
`${RETENTION_TAG_PREFIX}${commit.toLowerCase()}`;
export const nixGitInput = (source: GitSource): NixGitInput => ({
type: "git",
url: source.repository,
ref: retentionTagForCommit(source.commit),
rev: source.commit.toLowerCase(),
});
+148
View File
@@ -0,0 +1,148 @@
import assert from "node:assert/strict";
import { test } from "node:test";
import { compileCapabilitySource } from "../src/capability-language/index.js";
import {
capabilityFixturePath,
capabilityFixtureSource,
fixtureId,
} from "./fixtures/capability-model.js";
test("ANTLR parses and validates a complete capability workspace", () => {
const result = compileCapabilitySource(
capabilityFixtureSource,
capabilityFixturePath,
);
assert.equal(result.ok, true);
if (!result.ok) return;
assert.equal(result.workspace.workspaceId, fixtureId.workspace);
assert.equal(result.workspace.id, fixtureId.workspaceRevision);
assert.equal(result.workspace.interfaceImports.length, 3);
assert.equal(result.workspace.conformances.length, 4);
assert.equal("id" in result.workspace.conformances[0]!, false);
});
test("conformances do not accept authored IDs", () => {
const result = compileCapabilitySource(
capabilityFixtureSource.replace(
"conform Project as Named {",
'conform Project as Named id "conformance:project:named" {',
),
"conformance-id.qx",
);
assert.equal(result.ok, false);
if (result.ok) return;
assert.ok(result.diagnostics.some((entry) => entry.phase === "syntax"));
});
test("the v1 language has no implicit relationship materialization rule", () => {
const result = compileCapabilitySource(
capabilityFixtureSource.replace(
/\n}\s*$/,
'\n materialize ProjectOwner.owner if absent with Person;\n}\n',
),
"materialize.qx",
);
assert.equal(result.ok, false);
if (result.ok) return;
assert.ok(result.diagnostics.some((entry) => entry.phase === "syntax"));
});
test("forward declarations make source order irrelevant", () => {
const source = capabilityFixtureSource
.replace(/ atom Project[^\n]*\n/, "")
.replace(/ atom Person[^\n]*\n/, "")
.replace(
/\n}\s*$/,
'\n atom Project id "atom:project";\n atom Person id "atom:person";\n}\n',
);
assert.equal(compileCapabilitySource(source, "reordered.qx").ok, true);
});
test("interfaces can declare ordinary call operations", () => {
const source = capabilityFixtureSource.replace(
" value summary id \"member:summary:summary\" : string {\n get id \"operation:summary:summary:get\";\n }",
" operation summarize id \"member:summary:summarize\" : string -> string {\n call id \"operation:summary:summarize\";\n }",
).replace(
"bind summary.get to package TodoRuntime.summaryGet",
"bind summarize.call to package TodoRuntime.summaryGet",
).replace(
"operation summaryGet id \"export:todo-runtime:summary-get\" : unit -> string",
"operation summaryGet id \"export:todo-runtime:summary-get\" : string -> string",
);
const result = compileCapabilitySource(source, "operation-member.qx");
assert.equal(result.ok, true);
if (!result.ok) return;
const member = result.workspace.interfaceImports
.find((entry) => entry.displayName === "Summary")?.members[0];
assert.equal(member?.kind, "operation");
});
test("state defaults accept recursive JSON values", () => {
const source = capabilityFixtureSource.replace(
' policy optimistic-register default "Untitled project";',
` policy optimistic-register default "Untitled project";
shared state ProjectMetadata id "slot:project:metadata" on Project : message "example.Metadata"
policy optimistic-register default {"labels":["compiler","runtime"],"score":1.5,"enabled":true,"extra":null};`,
);
const result = compileCapabilitySource(source, "json-default.qx");
assert.equal(result.ok, true);
if (!result.ok) return;
const metadata = result.workspace.sharedAttachments.find(
(entry) => entry.id === "slot:project:metadata",
);
assert.equal(metadata?.kind, "state");
if (metadata?.kind !== "state") return;
assert.deepEqual(metadata.defaultValue, {
labels: ["compiler", "runtime"],
score: 1.5,
enabled: true,
extra: null,
});
});
test("syntax errors retain source locations", () => {
const result = compileCapabilitySource(
capabilityFixtureSource.replace("atom Project", "atom Project ???"),
"broken.qx",
);
assert.equal(result.ok, false);
if (result.ok) return;
assert.ok(result.diagnostics.some((entry) =>
entry.phase === "syntax" && entry.fileName === "broken.qx" && entry.line > 0
));
});
test("unknown authoring names are lowering errors", () => {
const result = compileCapabilitySource(
capabilityFixtureSource.replace(
"to state ProjectTitle.read",
"to state NotAState.read",
),
"unknown-name.qx",
);
assert.equal(result.ok, false);
if (result.ok) return;
assert.ok(result.diagnostics.some((entry) =>
entry.phase === "lowering" &&
entry.code === "unknown-symbol" &&
entry.message.includes("NotAState")
));
});
test("well-formed but invalid programs report semantic paths", () => {
const result = compileCapabilitySource(
capabilityFixtureSource.replace(
"bind name.get to state ProjectTitle.read",
"bind name.get to state ProjectTitle.write",
),
"invalid-binding.qx",
);
assert.equal(result.ok, false);
if (result.ok) return;
const diagnostic = result.diagnostics.find(
(entry) => entry.code === "invalid-state-binding",
);
assert.ok(diagnostic);
assert.equal(diagnostic.phase, "validation");
assert.ok(diagnostic.path?.includes("operationBindings"));
});
+234
View File
@@ -0,0 +1,234 @@
import assert from "node:assert/strict";
import { test } from "node:test";
import {
compileWorkspaceRevision,
computeCapabilityClosure,
resolveOperationPlan,
validateWorkspaceRevision,
valueType,
type CapabilityValidationIssueCode,
type WorkspaceRevision,
} from "../src/capability-model/index.js";
import {
fixtureId,
makeValidCapabilityWorkspace,
} from "./fixtures/capability-model.js";
const expectIssue = (
workspace: WorkspaceRevision,
code: CapabilityValidationIssueCode,
) => {
const issues = validateWorkspaceRevision(workspace);
assert.ok(
issues.some((entry) => entry.code === code),
`Expected ${code}, got:\n${issues
.map((entry) => `${entry.code} ${entry.path}: ${entry.message}`)
.join("\n")}`,
);
assert.equal(compileWorkspaceRevision(workspace).ok, false);
};
const conformance = (
workspace: WorkspaceRevision,
identity: Pick<(typeof workspace.conformances)[number], "atomId" | "interfaceRevisionId">,
) => {
const result = workspace.conformances.find((entry) =>
entry.atomId === identity.atomId &&
entry.interfaceRevisionId === identity.interfaceRevisionId
);
assert.ok(
result,
`Missing fixture conformance ${identity.atomId} as ${identity.interfaceRevisionId}`,
);
return result;
};
test("the representative v1 workspace compiles to native and package plans", () => {
const workspace = makeValidCapabilityWorkspace();
assert.deepEqual(validateWorkspaceRevision(workspace), []);
const compiled = compileWorkspaceRevision(workspace);
assert.equal(compiled.ok, true);
if (!compiled.ok) return;
const title = resolveOperationPlan(
compiled.plan,
fixtureId.project,
fixtureId.namedV1,
fixtureId.namedGet,
);
assert.equal(title?.kind, "state");
if (title?.kind === "state") {
assert.equal(title.binding.slotId, fixtureId.projectTitle);
assert.equal(title.binding.primitive, "read");
assert.deepEqual(title.attachment.owner, { kind: "workspace" });
}
const owner = resolveOperationPlan(
compiled.plan,
fixtureId.project,
fixtureId.ownedV1,
fixtureId.ownerResolve,
);
assert.equal(owner?.kind, "edge");
if (owner?.kind === "edge") {
assert.equal(owner.binding.edgeTypeId, fixtureId.projectOwner);
assert.deepEqual(owner.attachment.owner, {
kind: "conformance",
...fixtureId.projectOwnedConformance,
});
}
const summary = resolveOperationPlan(
compiled.plan,
fixtureId.project,
fixtureId.summaryV1,
fixtureId.summaryGet,
);
assert.equal(summary?.kind, "package");
if (summary?.kind === "package") {
assert.equal(summary.packageRevision.revisionId, fixtureId.todoRuntimeV1);
assert.equal(summary.packageExport.id, fixtureId.summaryGetExport);
assert.deepEqual(
summary.dependencies.map((entry) => [entry.port.id, entry.binding.kind]),
[
[fixtureId.titlePort, "state"],
[fixtureId.namedPort, "receiver-interface"],
[fixtureId.personPort, "constructor"],
],
);
}
});
test("the closure is an exact tree-shaking boundary", () => {
const result = compileWorkspaceRevision(makeValidCapabilityWorkspace());
assert.equal(result.ok, true);
if (!result.ok) return;
const closure = computeCapabilityClosure(result.plan, [
{ atomId: fixtureId.project, interfaceRevisionId: fixtureId.summaryV1 },
]);
assert.deepEqual(closure.conformances, [
fixtureId.projectNamedConformance,
fixtureId.projectSummaryConformance,
]);
assert.deepEqual(closure.packageRevisionIds, [fixtureId.todoRuntimeV1]);
assert.deepEqual(closure.attachmentIds, [fixtureId.projectTitle]);
assert.deepEqual(closure.constructorAtomIds, [fixtureId.person]);
});
test("compiled plans are snapshots, not mutable authoring state", () => {
const workspace = makeValidCapabilityWorkspace();
const result = compileWorkspaceRevision(workspace);
assert.equal(result.ok, true);
if (!result.ok) return;
conformance(workspace, fixtureId.projectNamedConformance)
.operationBindings[0]!.binding = {
kind: "state",
slotId: fixtureId.personName,
primitive: "read",
};
const resolved = resolveOperationPlan(
result.plan,
fixtureId.project,
fixtureId.namedV1,
fixtureId.namedGet,
);
assert.equal(resolved?.kind, "state");
if (resolved?.kind === "state") {
assert.equal(resolved.binding.slotId, fixtureId.projectTitle);
}
});
test("a conformance binds every operation exactly once", () => {
const missing = makeValidCapabilityWorkspace();
conformance(missing, fixtureId.projectNamedConformance).operationBindings.pop();
expectIssue(missing, "missing-operation-binding");
const duplicate = makeValidCapabilityWorkspace();
const bindings = conformance(
duplicate,
fixtureId.projectNamedConformance,
).operationBindings;
bindings.push(structuredClone(bindings[0]!));
expectIssue(duplicate, "duplicate-operation-binding");
});
test("private attachments are visible only to their owning conformance", () => {
const workspace = makeValidCapabilityWorkspace();
const binding = conformance(
workspace,
fixtureId.projectNamedConformance,
).operationBindings[0]!.binding;
assert.equal(binding.kind, "state");
if (binding.kind !== "state") return;
binding.slotId = fixtureId.personName;
expectIssue(workspace, "private-attachment-access");
});
test("native state and edge providers must match operation shape", () => {
const stateWorkspace = makeValidCapabilityWorkspace();
const state = conformance(
stateWorkspace,
fixtureId.projectNamedConformance,
).operationBindings[0]!.binding;
assert.equal(state.kind, "state");
if (state.kind === "state") state.primitive = "write";
expectIssue(stateWorkspace, "invalid-state-binding");
const edgeWorkspace = makeValidCapabilityWorkspace();
const edge = conformance(
edgeWorkspace,
fixtureId.projectOwnedConformance,
).operationBindings[0]!.binding;
assert.equal(edge.kind, "edge");
if (edge.kind === "edge") edge.primitive = "connect";
expectIssue(edgeWorkspace, "invalid-edge-binding");
});
test("package dependencies are complete, exact, and explicitly injected", () => {
const missing = makeValidCapabilityWorkspace();
const packageBinding = conformance(
missing,
fixtureId.projectSummaryConformance,
).operationBindings[0]!.binding;
assert.equal(packageBinding.kind, "package");
if (packageBinding.kind === "package") packageBinding.dependencies.pop();
expectIssue(missing, "invalid-dependency-binding");
const wrongType = makeValidCapabilityWorkspace();
const summaryExport = wrongType.packageImports[0]!.exports.find(
(entry) => entry.id === fixtureId.summaryGetExport,
);
assert.ok(summaryExport);
summaryExport.dependencyPorts[0]!.requirement = {
kind: "state",
valueType: valueType.int32,
primitives: ["read"],
};
expectIssue(wrongType, "invalid-dependency-binding");
});
test("package receiver requirements cannot depend on themselves", () => {
const workspace = makeValidCapabilityWorkspace();
const summaryExport = workspace.packageImports[0]!.exports.find(
(entry) => entry.id === fixtureId.summaryGetExport,
);
assert.ok(summaryExport && summaryExport.kind === "operation");
summaryExport.receiverRequirement = {
kind: "all-interfaces",
interfaceRevisionIds: [fixtureId.summaryV1],
};
summaryExport.dependencyPorts = [];
const packageBinding = conformance(
workspace,
fixtureId.projectSummaryConformance,
).operationBindings[0]!.binding;
assert.equal(packageBinding.kind, "package");
if (packageBinding.kind === "package") packageBinding.dependencies = [];
expectIssue(workspace, "cyclic-conformance-requirement");
});
test("constructors are statically checked", () => {
const badConstructor = makeValidCapabilityWorkspace();
badConstructor.constructors[0]!.exportId = fixtureId.summaryGetExport;
expectIssue(badConstructor, "invalid-constructor");
});
+78
View File
@@ -0,0 +1,78 @@
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import {
capabilityId,
type WorkspaceRevision,
} from "../../src/capability-model/index.js";
import { compileCapabilitySource } from "../../src/capability-language/index.js";
export const fixtureId = {
workspace: capabilityId.workspace("workspace:todo"),
workspaceRevision: capabilityId.workspaceRevision("workspace:todo@1"),
project: capabilityId.atom("atom:project"),
person: capabilityId.atom("atom:person"),
namedV1: capabilityId.interfaceRevision("interface:named@1"),
ownedV1: capabilityId.interfaceRevision("interface:owned@1"),
summaryV1: capabilityId.interfaceRevision("interface:summary@1"),
namedGet: capabilityId.operation("operation:named:name:get"),
namedSet: capabilityId.operation("operation:named:name:set"),
ownerResolve: capabilityId.operation("operation:owned:owner:resolve"),
summaryGet: capabilityId.operation("operation:summary:summary:get"),
projectTitle: capabilityId.slot("slot:project:title"),
personName: capabilityId.slot("slot:person:name"),
projectOwner: capabilityId.edgeType("edge:project:owner"),
projectOwnerProjection: capabilityId.edgeProjection(
"projection:project-owner:owner",
),
projectNamedConformance: {
atomId: capabilityId.atom("atom:project"),
interfaceRevisionId: capabilityId.interfaceRevision("interface:named@1"),
},
personNamedConformance: {
atomId: capabilityId.atom("atom:person"),
interfaceRevisionId: capabilityId.interfaceRevision("interface:named@1"),
},
projectOwnedConformance: {
atomId: capabilityId.atom("atom:project"),
interfaceRevisionId: capabilityId.interfaceRevision("interface:owned@1"),
},
projectSummaryConformance: {
atomId: capabilityId.atom("atom:project"),
interfaceRevisionId: capabilityId.interfaceRevision("interface:summary@1"),
},
todoRuntimeV1: capabilityId.packageRevision("package:todo-runtime@1"),
summaryGetExport: capabilityId.packageExport(
"export:todo-runtime:summary-get",
),
createPersonExport: capabilityId.packageExport(
"export:todo-runtime:create-person",
),
titlePort: capabilityId.dependencyPort("port:summary:title"),
namedPort: capabilityId.dependencyPort("port:summary:named"),
personPort: capabilityId.dependencyPort("port:summary:person"),
} as const;
export const capabilityFixturePath = resolve(
process.cwd(),
"test/fixtures/todo.capabilities.qx",
);
export const capabilityFixtureSource = readFileSync(
capabilityFixturePath,
"utf8",
);
export const makeValidCapabilityWorkspace = (): WorkspaceRevision => {
const result = compileCapabilitySource(
capabilityFixtureSource,
capabilityFixturePath,
);
if (!result.ok) {
throw new Error(
result.diagnostics
.map((entry) => `${entry.phase}/${entry.code}: ${entry.message}`)
.join("\n"),
);
}
return structuredClone(result.workspace);
};
+90
View File
@@ -0,0 +1,90 @@
workspace Todo id "workspace:todo" revision "workspace:todo@1" commit "1111111111111111111111111111111111111111" {
atom Project id "atom:project" doc "A project containing work.";
atom Person id "atom:person";
interface Named id "interface:named" revision "interface:named@1" source {
repository "https://repos.quixos.org/quixos-todo/interface-named.git";
commit "2222222222222222222222222222222222222222";
} {
value name id "member:named:name" : string {
get id "operation:named:name:get";
set id "operation:named:name:set";
watch start id "operation:named:name:watch-start" stop id "operation:named:name:watch-stop";
}
}
interface Owned id "interface:owned" revision "interface:owned@1" source {
repository "https://repos.quixos.org/quixos-todo/interface-owned.git";
commit "3333333333333333333333333333333333333333";
} {
relation owner id "member:owned:owner" : exactly-one interface Named {
resolve id "operation:owned:owner:resolve";
connect id "operation:owned:owner:connect";
disconnect id "operation:owned:owner:disconnect";
watch start id "operation:owned:owner:watch-start" stop id "operation:owned:owner:watch-stop";
}
}
interface Summary id "interface:summary" revision "interface:summary@1" source {
repository "https://repos.quixos.org/quixos-todo/interface-summary.git";
commit "4444444444444444444444444444444444444444";
} {
value summary id "member:summary:summary" : string {
get id "operation:summary:summary:get";
}
}
package TodoRuntime id "package:todo-runtime" revision "package:todo-runtime@1" source {
repository "https://repos.quixos.org/quixos-todo/package-todo-runtime.git";
commit "5555555555555555555555555555555555555555";
} {
operation summaryGet id "export:todo-runtime:summary-get" : unit -> string
mode call receiver interfaces [Named] requires {
state title id "port:summary:title" : string [read];
interface named id "port:summary:named" : Named;
constructor person id "port:summary:person" : Person;
};
constructor createPerson id "export:todo-runtime:create-person" constructs Person : unit;
}
shared state ProjectTitle id "slot:project:title" on Project : string
policy optimistic-register default "Untitled project";
conform Project as Named {
bind name.get to state ProjectTitle.read;
bind name.set to state ProjectTitle.write;
bind name.watch-start to state ProjectTitle.watch-start;
bind name.watch-stop to state ProjectTitle.watch-stop;
}
conform Person as Named {
private state PersonName id "slot:person:name" on Person : string
policy optimistic-register default "Anonymous";
bind name.get to state PersonName.read;
bind name.set to state PersonName.write;
bind name.watch-start to state PersonName.watch-start;
bind name.watch-stop to state PersonName.watch-stop;
}
conform Project as Owned {
private edge ProjectOwner id "edge:project:owner" {
atom Project projection owner id "projection:project-owner:owner" exactly-one;
interface Named projection ownedProjects id "projection:project-owner:owned-projects" many;
}
bind owner.resolve to edge ProjectOwner.owner.resolve;
bind owner.connect to edge ProjectOwner.owner.connect;
bind owner.disconnect to edge ProjectOwner.owner.disconnect;
bind owner.watch-start to edge ProjectOwner.owner.watch-start;
bind owner.watch-stop to edge ProjectOwner.owner.watch-stop;
}
conform Project as Summary {
bind summary.get to package TodoRuntime.summaryGet with {
title to state ProjectTitle;
named to interface Named;
person to constructor Person;
};
}
constructor Person to TodoRuntime.createPerson;
}
+94
View File
@@ -0,0 +1,94 @@
import assert from "node:assert/strict";
import test from "node:test";
import {
formatQuixosLock,
nixGitInput,
parseQuixosLock,
retentionTagForCommit,
} from "../src/resource-lock/index.js";
const quixosCommit = "1".repeat(40);
const namedCommit = "2".repeat(40);
const packageCommit = "3".repeat(64);
const fixture = `quixos-lock version 1 {
quixos source {
repository "https://gitea.example/quixos/quixos.git";
commit "${quixosCommit}";
}
interface Named source {
repository "https://repos.example/alice/interface-named.git";
commit "${namedCommit}";
}
package TodoRuntime source {
repository "ssh://git@repos.example/alice/package-todo-runtime.git";
commit "${packageCommit}";
}
}
`;
test("parses and canonically formats a Git-only repository lock", () => {
const parsed = parseQuixosLock(fixture, "quixos.lock");
assert.equal(parsed.ok, true);
if (!parsed.ok) return;
assert.equal(parsed.lock.formatVersion, 1);
assert.equal(parsed.lock.quixos.commit, quixosCommit);
assert.deepEqual(
parsed.lock.resources.map(({ kind, binding }) => ({ kind, binding })),
[
{ kind: "interface", binding: "Named" },
{ kind: "package", binding: "TodoRuntime" },
],
);
assert.deepEqual(parseQuixosLock(formatQuixosLock(parsed.lock)), {
ok: true,
lock: parsed.lock,
diagnostics: [],
});
});
test("derives immutable retention and Nix inputs without storing extra identity", () => {
const source = {
resolver: "git" as const,
repository: "https://repos.example/alice/interface-named.git",
commit: namedCommit,
};
const ref = `refs/tags/quixos-reachability/${namedCommit}`;
assert.equal(retentionTagForCommit(namedCommit.toUpperCase()), ref);
assert.deepEqual(nixGitInput(source), {
type: "git",
url: source.repository,
ref,
rev: namedCommit,
});
});
test("rejects mutable revisions, embedded credentials, and duplicate bindings", () => {
const parsed = parseQuixosLock(`quixos-lock version 1 {
quixos source {
repository "https://user:secret@example/quixos.git";
commit "main";
}
interface Named source {
repository "file:///tmp/named";
commit "${namedCommit}";
}
interface Named source {
repository "https://repos.example/named.git?ref=main";
commit "${namedCommit}";
}
}`);
assert.equal(parsed.ok, false);
if (parsed.ok) return;
assert.deepEqual(
new Set(parsed.diagnostics.map((entry) => entry.code)),
new Set([
"invalid-git-commit",
"embedded-git-credential",
"unsupported-git-transport",
"decorated-git-repository",
"duplicate-resource-binding",
]),
);
});
+2 -1
View File
@@ -7,5 +7,6 @@
"outDir": "dist",
"rootDir": ".",
"sourceMap": true
}
},
"include": ["src/**/*.ts"]
}
+1 -1
View File
@@ -14,6 +14,6 @@
"verbatimModuleSyntax": true,
"types": ["node"]
},
"include": ["src/**/*.ts"],
"include": ["src/**/*.ts", "test/**/*.ts"],
"exclude": ["node_modules", "dist"]
}
+12
View File
@@ -0,0 +1,12 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"allowImportingTsExtensions": false,
"declaration": false,
"noEmit": false,
"outDir": "dist",
"rootDir": ".",
"sourceMap": true
},
"include": ["src/**/*.ts", "test/**/*.ts"]
}
+188
View File
@@ -0,0 +1,188 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
{ lib, stdenv, nodejs, git, cacert, fetchurl, writeShellScript, writeShellScriptBin }:
{ src, overrideAttrs ? null, ... } @ args:
let
yarnBin = fetchurl {
url = "https://repo.yarnpkg.com/4.18.0/packages/yarnpkg-cli/bin/yarn.js";
hash = "sha512-/Lhxb+fNDuzhQf/Bi5IZOp35IEwbqDGJwoiDUiP8C75kr0c7qw1emSen2utcryuwfrJ4fMkzjKBA6hJfKh8vfg==";
};
cacheFolder = ".yarn/cache";
lockfile = ./yarn.lock;
# Call overrideAttrs on a derivation if a function is provided.
optionalOverride = fn: drv:
if fn == null then drv else drv.overrideAttrs fn;
# Simple stub that provides the global yarn command.
yarn = writeShellScriptBin "yarn" ''
exec '${nodejs}/bin/node' '${yarnBin}' "$@"
'';
# Common attributes between Yarn derivations.
drvCommon = {
# Make sure the build uses the right Node.js version everywhere.
buildInputs = [ nodejs yarn ];
# All dependencies should already be cached.
yarn_enable_network = "0";
# Tell node-gyp to use the provided Node.js headers for native code builds.
npm_config_nodedir = nodejs;
};
# Comman variables that we set in a Nix build, but not in a Nix shell.
buildVars = ''
# Make Yarn produce friendlier logging for automated builds.
export CI=1
# Tell node-pre-gyp to never fetch binaries / always build from source.
export npm_config_build_from_source=true
'';
# Create derivations for fetching dependencies.
cacheDrvs = let
in lib.mapAttrs (locator: { filename, hash }: stdenv.mkDerivation {
name = lib.strings.sanitizeDerivationName locator;
buildInputs = [ yarn git cacert ];
buildCommand = ''
cd '${src}'
${buildVars}
HOME="$TMP" yarn_enable_global_cache=false yarn_cache_folder="$TMP" \
yarn nixify fetch ${lib.escapeShellArg locator}
# Because we change the cache dir, Yarn may generate a different name.
mv "$TMP/$(sed 's/-[^-]*\.[^-]*$//' <<< "$outputFilename")"-* $out
'';
outputFilename = filename;
outputHash = hash;
}) cacheEntries;
# Create a shell snippet to copy dependencies from a list of derivations.
mkCacheBuilderForDrvs = drvs:
writeShellScript "collect-yarn-cache" (lib.concatMapStrings (drv: ''
cp --reflink=auto ${drv} '${drv.outputFilename}'
'') drvs);
# Main project derivation.
project = stdenv.mkDerivation (drvCommon // {
inherit src;
name = "@quixos/quixos-protocol";
configurePhase = ''
${buildVars}
# Copy over the Yarn cache.
rm -fr '${cacheFolder}'
mkdir -p '${cacheFolder}'
pushd '${cacheFolder}' > /dev/null
source ${mkCacheBuilderForDrvs (lib.attrValues cacheDrvs)}
popd > /dev/null
# Yarn may need a writable home directory.
export yarn_global_folder="$TMP"
# Ensure global cache is disabled. Cache must be part of our output.
touch .yarnrc.yml
sed -i -e '/^enableGlobalCache/d' .yarnrc.yml
echo 'enableGlobalCache: false' >> .yarnrc.yml
# Some node-gyp calls may call out to npm, which could fail due to an
# read-only home dir.
export HOME="$TMP"
# running preConfigure after the cache is populated allows for
# preConfigure to contain substituteInPlace for dependencies as well as the
# main project. This is necessary for native bindings that maybe have
# hardcoded values.
runHook preConfigure
# Run normal Yarn install to complete dependency installation.
yarn install --immutable --immutable-cache
runHook postConfigure
'';
buildPhase = ''
runHook preBuild
runHook postBuild
'';
installPhase = ''
runHook preInstall
# Move the package contents to the output directory.
if grep -q '"workspaces"' package.json; then
# We can't use `yarn pack` in a workspace setup, because it only
# packages the outer workspace.
mkdir -p "$out/libexec"
mv $PWD "$out/libexec/$name"
else
# - If the package.json has a `files` field, only files matching those patterns are copied
# - Otherwise all files are copied.
yarn pack --out package.tgz
mkdir -p "$out/libexec/$name"
tar xzf package.tgz --directory "$out/libexec/$name" --strip-components=1
cp --reflink=auto .yarnrc* "$out/libexec/$name"
cp --reflink=auto ${lockfile} "$out/libexec/$name/yarn.lock"
cp --reflink=auto --recursive .yarn "$out/libexec/$name"
# Copy the Yarn linker output into the package.
cp --reflink=auto --recursive node_modules "$out/libexec/$name"
fi
cd "$out/libexec/$name"
# Invoke a plugin internal command to setup binaries.
mkdir -p "$out/bin"
yarn nixify install-bin $out/bin
# A package with node_modules doesn't need the cache
yarn cache clean
runHook postInstall
'';
passthru = {
inherit nodejs;
yarn-freestanding = yarn;
yarn = writeShellScriptBin "yarn" ''
exec '${yarn}/bin/yarn' --cwd '${overriddenProject}/libexec/${overriddenProject.name}' "$@"
'';
};
});
overriddenProject = optionalOverride overrideAttrs project;
cacheEntries = {
"@bufbuild/protobuf@npm:2.14.1" = { filename = "@bufbuild-protobuf-npm-2.14.1-78e9ea56a2-3f913aca03.zip"; hash = "sha512-P5E6ygPfhBnEsh2ADqVNf2yDalND5l1vaGJ57DVmxJB3KZOO8vlKXifZLo0/StzW4CcRi6Kbp2TSHhxjfN3HAg=="; };
"@bufbuild/protoc-gen-es@npm:2.14.1" = { filename = "@bufbuild-protoc-gen-es-npm-2.14.1-230b1181a2-79f9fad1d5.zip"; hash = "sha512-efn60dVmXaptZUmyh4oPY/6/rbGHuFNAg/vrI4Ydwizz6mmmYKEvD45Ps8AtJO6ALxcYRBVt5C+0sXEuOgZ1aQ=="; };
"@bufbuild/protoplugin@npm:2.14.1" = { filename = "@bufbuild-protoplugin-npm-2.14.1-ca1a20a987-6a727aa5a8.zip"; hash = "sha512-anJ6pahI4FA13tkPUOE65Sx3NXutalhHalbU/3ANyBPKxmTgzDC1IBNU5cFY6//rANyDUxbWaqLDhKLp2qXf4w=="; };
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
"@typescript/typescript-linux-arm64@npm:7.0.2" = { filename = "@typescript-typescript-linux-arm64-npm-7.0.2-9cacfc53a0-10c0.zip"; hash = "sha512-s4c7nGT/lQIw6x0IfrL0b3ECy/D0g7UoDLdiIWJoM6EGXk5N/dmXdxUdA8Cr3hV/3nO2BYKTQ6Ai8/zGhiSQ3A=="; };
"@typescript/typescript-linux-x64@npm:7.0.2" = { filename = "@typescript-typescript-linux-x64-npm-7.0.2-8dd7ff8d24-10c0.zip"; hash = "sha512-k9EUK5CZ3OOPnyslp8SAAonHJpnpPmlaulppI/NmFyCzNs3UN/TLPUkyQia3KIxgbyTzKoXI5L5fl8Uj9bJ7Cg=="; };
"@typescript/vfs@npm:1.6.4" = { filename = "@typescript-vfs-npm-1.6.4-78935c9d3e-acb9de42f2.zip"; hash = "sha512-rLneQvI/2j9149eQC6EG7zI6L0588OSpTbtFfibTU8pjuzUZPtGjL8hzPzrlkJlhKykLBr1iIWlIYb65v7YvYg=="; };
"antlr-ng@npm:1.0.10" = { filename = "antlr-ng-npm-1.0.10-840fe729e4-0893eda0fd.zip"; hash = "sha512-CJPtoP3M4dMpwYykUaxo7zdA+pOnISq5cq66bDNyLJvnL1dqN5cakOTnJSu6241VnAiH8yWPr+pZtJlsb+9P6g=="; };
"antlr4ng@npm:3.0.15" = { filename = "antlr4ng-npm-3.0.15-58a4d495ba-75421480b9.zip"; hash = "sha512-dUIUgLmWAcCuF0HkFHuF4k6egiNuw1TFH75QsthdcTeJRAW0dIk5xH5yCAC9GcChkAa49o+14Bg2xxf6vaaLXA=="; };
"antlr4ng@npm:3.0.16" = { filename = "antlr4ng-npm-3.0.16-c4e3e7474c-01b51d1d73.zip"; hash = "sha512-AbUdHXPKEvIt/Pcjuj12n0ewLDJhi8cp470iczT6FUoKQLFrDj0fJF+ldWv067uU3rKWoj1z8FLckL5qLEd9EQ=="; };
"base64-js@npm:1.5.1" = { filename = "base64-js-npm-1.5.1-b2f7275641-f23823513b.zip"; hash = "sha512-8jgjUTtjFzoAEDD65PLavig7manTJK3jrT0UjiGBNGdvHuhWjId8157BxTFY3PLSulJ6l8YGYYkoupndkwECvw=="; };
"commander@npm:13.1.0" = { filename = "commander-npm-13.1.0-bdbbfaaf9d-7b8c5544bb.zip"; hash = "sha512-e4xVRLunBPvoS3yrLgQ9+FhtXBFKTFtgf4OuUGBwiUDtC1vVg4z4zidTnN4mXBy9Wc48jGsBftPuyJQ+OkFRZA=="; };
"debug@npm:4.4.3" = { filename = "debug-npm-4.4.3-0105c6123a-d79136ec6c.zip"; hash = "sha512-15E27GyD7L79D2pVk9pqnJHsTX3cS1TIg9bnHsmsy19noaXpbQCjKBlrW1yG02XpjYo6cIVqrxa057GYXmf1pg=="; };
"fast-printf@npm:1.6.10" = { filename = "fast-printf-npm-1.6.10-c05cca9b81-630cccbef8.zip"; hash = "sha512-YwzMvvg0mm7q2plYyTkenRS1vZUn3SjZ5+nylbAGxkDdyo/CRwz/VepcbJLKUwSIu62/fCT0hSrYw02RVdqddQ=="; };
"he@npm:1.2.0" = { filename = "he-npm-1.2.0-3b73a2ff07-a27d478bef.zip"; hash = "sha512-on1Hi+/jyBkvAGzdBjmmZ5iXnfpuISXGrFgqGaXr/sYq2D6DguYDYXDYc/RuRTan55W/i5W/fCR/TMCCXMyMFw=="; };
"luxon@npm:3.5.0" = { filename = "luxon-npm-3.5.0-92bb977f7f-335789bba9.zip"; hash = "sha512-M1eJu6lQd9uDHvmYlO2t6yMCOz6yE3obVqzQ0pAIK2kc95MUPWnjC8Bp7JXwtJ82QZ9I6VHGgBTxn/4SBF40lA=="; };
"ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip"; hash = "sha512-2SS1fnMSs7Y60h/Fs9wK9eeNYaH8fPtUV+2vJjJr9ivlMHzIf/toYu8cKzOwIzzbXU8BxMlYzA1mCUi2Wih6SA=="; };
"pako@npm:0.2.9" = { filename = "pako-npm-0.2.9-c88ac0d326-79c1806ebc.zip"; hash = "sha512-ecGAbrzzJbYK5Znk1yJ8LjRte4Kdwg9c8kzvB8k0B53DphxbPIJ4ovehkMSmE+ND6hHlMC2+JS79EXEt9LawQQ=="; };
"stringtemplate4ts@npm:1.0.9" = { filename = "stringtemplate4ts-npm-1.0.9-df48ae4223-c5f46367d0.zip"; hash = "sha512-xfRjZ9A3XBp8ryC4YZCEL0rv+1Q9dosicN/TxeQsTc9JkBwCp7BowI6MREDAKiApCFlOvO2+0PXolHA9I/VMAg=="; };
"tiny-inflate@npm:1.0.3" = { filename = "tiny-inflate-npm-1.0.3-a7419a5c65-fab6875372.zip"; hash = "sha512-+raHU3JU9uxEyaLogASP5w2jVCq6KPc82j50yVyr80KjOTcvKmwDLjIjJPAazMA8omwEuiutmz64zz7pm7p/mw=="; };
"typescript@npm:5.4.5" = { filename = "typescript-npm-5.4.5-8568a42232-2954022ada.zip"; hash = "sha512-KVQCKto0D9PWqeK45TT2XVfJLV85iaJjdUp4q6VJ9+ZSmswZIZE1YKS4FsRtzn30pNKfnxGj3A1CE7t20EMlHg=="; };
"typescript@npm:7.0.2" = { filename = "typescript-npm-7.0.2-0bde2bcec5-3dcee51ec8.zip"; hash = "sha512-Pc7lHsjDMkkjJbzb999ItmZodR8SfmIq59QbbHFusZGEQkpF4U93UPUPNAIyOItp5ih4WRVfBqXOLfdvEssxzw=="; };
"typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>::version=5.4.5&hash=5adc0c" = { filename = "typescript-patch-6e159bfddb-db2ad2a16c.zip"; hash = "sha512-2yrSoWyoKfUEJ+6x2hVeekXlmO7HsIbYtOi6ROWiNfdY5gbWgcZpkiMNP8O4mVhl5f0LIqLJVIbQsyAPgwcuyQ=="; };
"typescript@patch:typescript@npm%3A7.0.2#optional!builtin<compat/typescript>::version=7.0.2&hash=3bafbf" = { filename = "typescript-patch-4859cbaf66-6b3cdc369c.zip"; hash = "sha512-azzcNpzYKdRuAHNOpkIz7oRBnCglrY/kCJFa3ed6vO1LeiQB9+7VF9VKek9dHBhpdTy5kBjfHCFZx2HZ8zSDpg=="; };
"undici-types@npm:7.18.2" = { filename = "undici-types-npm-7.18.2-3e6d69d829-85a7918911.zip"; hash = "sha512-haeRiRE6I4lZ16ZHNo5PfFVZw6QE69uPxEiBRc6UJvzYIlKoRKMCeY38Djfm+xeP9IHtA7xMr2NMV1fZ70NSHQ=="; };
"unicode-properties@npm:1.4.1" = { filename = "unicode-properties-npm-1.4.1-122054452f-1d140b7945.zip"; hash = "sha512-HRQLeUVmT7DvU96VUXCCHgd7lJ7vN3xuSQWQLwfjOQOScb+ioAXk9MYHSwgNNCC0hsUtyQXhH5JJSaBNH7R//Q=="; };
"unicode-trie@npm:2.0.0" = { filename = "unicode-trie-npm-2.0.0-54e0a4dd52-2422368645.zip"; hash = "sha512-JCI2hkUknzFWQKHJ6VBgRqp3OPycXVnhXCB83W7GYQHDWwufddw6wo/nvhmq8e/ImLvqB0+h6OKV73Nq63kEuw=="; };
};
in overriddenProject
+520
View File
@@ -0,0 +1,520 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 10
cacheKey: 10c0
"@bufbuild/protobuf@npm:2.14.1, @bufbuild/protobuf@npm:^2.12.1":
version: 2.14.1
resolution: "@bufbuild/protobuf@npm:2.14.1"
checksum: 10c0/3f913aca03df8419c4b21d800ea54d7f6c836a5343e65d6f686279ec3566c4907729938ef2f94a5e27d92e8d3f4adcd6e027118ba29ba764d21e1c637cddc702
languageName: node
linkType: hard
"@bufbuild/protoc-gen-es@npm:^2.12.1":
version: 2.14.1
resolution: "@bufbuild/protoc-gen-es@npm:2.14.1"
dependencies:
"@bufbuild/protobuf": "npm:2.14.1"
"@bufbuild/protoplugin": "npm:2.14.1"
peerDependencies:
"@bufbuild/protobuf": 2.14.1
peerDependenciesMeta:
"@bufbuild/protobuf":
optional: true
bin:
protoc-gen-es: bin/protoc-gen-es
checksum: 10c0/79f9fad1d5665daa6d6549b2878a0f63febfadb187b8534083fbeb23861dc22cf3ea69a660a12f0f8e4fb3c02d24ee802f171844156de42fb4b1712e3a067569
languageName: node
linkType: hard
"@bufbuild/protoplugin@npm:2.14.1":
version: 2.14.1
resolution: "@bufbuild/protoplugin@npm:2.14.1"
dependencies:
"@bufbuild/protobuf": "npm:2.14.1"
"@typescript/vfs": "npm:^1.6.2"
typescript: "npm:5.4.5"
checksum: 10c0/6a727aa5a848e05035ded90f50e13ae52c77357bad6a58476a56d4ff700dc813cac664e0cc30b5201354e5c158ebffeb00dc835316d66aa2c384a2e9daa5dfe3
languageName: node
linkType: hard
"@quixos/quixos-protocol@workspace:.":
version: 0.0.0-use.local
resolution: "@quixos/quixos-protocol@workspace:."
dependencies:
"@bufbuild/protobuf": "npm:^2.12.1"
"@bufbuild/protoc-gen-es": "npm:^2.12.1"
"@types/node": "npm:^24"
antlr-ng: "npm:^1.0.10"
antlr4ng: "npm:^3.0.16"
typescript: "npm:^7.0.2"
bin:
quixos-capability-compile: dist/src/capability-language/cli.js
quixos-descriptor-check: dist/src/descriptor-check.js
quixos-lock-check: dist/src/resource-lock/cli.js
languageName: unknown
linkType: soft
"@types/node@npm:^24":
version: 24.13.3
resolution: "@types/node@npm:24.13.3"
dependencies:
undici-types: "npm:~7.18.0"
checksum: 10c0/a5bc08f49b9581dcdca90e02cd77197a3c799840807664942e5cd5161a553d4d2ae8064f7e3294410d748d7d098b5c1848be7fa50c06f29c4193ab16be4e59eb
languageName: node
linkType: hard
"@typescript/typescript-aix-ppc64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-aix-ppc64@npm:7.0.2"
conditions: os=aix & cpu=ppc64
languageName: node
linkType: hard
"@typescript/typescript-darwin-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-darwin-arm64@npm:7.0.2"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-darwin-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-darwin-x64@npm:7.0.2"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-freebsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-freebsd-arm64@npm:7.0.2"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-freebsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-freebsd-x64@npm:7.0.2"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-linux-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-arm64@npm:7.0.2"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-linux-arm@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-arm@npm:7.0.2"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@typescript/typescript-linux-loong64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-loong64@npm:7.0.2"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@typescript/typescript-linux-mips64el@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-mips64el@npm:7.0.2"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@typescript/typescript-linux-ppc64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-ppc64@npm:7.0.2"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@typescript/typescript-linux-riscv64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-riscv64@npm:7.0.2"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@typescript/typescript-linux-s390x@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-s390x@npm:7.0.2"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@typescript/typescript-linux-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-linux-x64@npm:7.0.2"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-netbsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-netbsd-arm64@npm:7.0.2"
conditions: os=netbsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-netbsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-netbsd-x64@npm:7.0.2"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-openbsd-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-openbsd-arm64@npm:7.0.2"
conditions: os=openbsd & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-openbsd-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-openbsd-x64@npm:7.0.2"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-sunos-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-sunos-x64@npm:7.0.2"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@typescript/typescript-win32-arm64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-win32-arm64@npm:7.0.2"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@typescript/typescript-win32-x64@npm:7.0.2":
version: 7.0.2
resolution: "@typescript/typescript-win32-x64@npm:7.0.2"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@typescript/vfs@npm:^1.6.2":
version: 1.6.4
resolution: "@typescript/vfs@npm:1.6.4"
dependencies:
debug: "npm:^4.4.3"
peerDependencies:
typescript: "*"
checksum: 10c0/acb9de42f23fda3f75e3d7900ba106ef323a2f4e7cf0e4a94dbb457e26d353ca63bb35193ed1a32fc8733f3ae59099612b290b06bd6221694861beb9bfb62f62
languageName: node
linkType: hard
"antlr-ng@npm:^1.0.10":
version: 1.0.10
resolution: "antlr-ng@npm:1.0.10"
dependencies:
antlr4ng: "npm:3.0.16"
commander: "npm:13.1.0"
stringtemplate4ts: "npm:1.0.9"
unicode-properties: "npm:1.4.1"
bin:
antlr-ng: dist/cli/runner.js
grun: dist/cli/TestRig.js
interpreter: dist/cli/Interpreter.js
testrig: dist/cli/TestRig.js
checksum: 10c0/0893eda0fdcce1d329c18ca451ac68ef3740fa93a7212ab972aeba6c33722c9be72f576a37971a90e4e7252bbadb8d559c0887f3258fafea59b4996c6fef4fea
languageName: node
linkType: hard
"antlr4ng@npm:3.0.15":
version: 3.0.15
resolution: "antlr4ng@npm:3.0.15"
checksum: 10c0/75421480b99601c0ae1741e4147b85e24e9e82236ec354c51fbe50b2d85d7137894405b4748939c47e720800bd19c0a19006b8f68fb5e01836c717fabda68b5c
languageName: node
linkType: hard
"antlr4ng@npm:3.0.16, antlr4ng@npm:^3.0.16":
version: 3.0.16
resolution: "antlr4ng@npm:3.0.16"
checksum: 10c0/01b51d1d73ca12f22dfcf723ba3d769f47b02c32618bc729e3bd227334fa154a0a40b16b0e3d1f245fa5756bf4ebbb94deb296a23d73f052dc90be6a2c477d11
languageName: node
linkType: hard
"base64-js@npm:^1.3.0":
version: 1.5.1
resolution: "base64-js@npm:1.5.1"
checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf
languageName: node
linkType: hard
"commander@npm:13.1.0":
version: 13.1.0
resolution: "commander@npm:13.1.0"
checksum: 10c0/7b8c5544bba704fbe84b7cab2e043df8586d5c114a4c5b607f83ae5060708940ed0b5bd5838cf8ce27539cde265c1cbd59ce3c8c6b017ed3eec8943e3a415164
languageName: node
linkType: hard
"debug@npm:^4.4.3":
version: 4.4.3
resolution: "debug@npm:4.4.3"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
languageName: node
linkType: hard
"fast-printf@npm:1.6.10":
version: 1.6.10
resolution: "fast-printf@npm:1.6.10"
checksum: 10c0/630cccbef8349a6eeada9958c9391e9d14b5bd9527dd28d9e7e9f295b006c640ddca8fc2470cff55ea5c6c92ca530488bbadbf7c24f4852ad8c34d9155da9d75
languageName: node
linkType: hard
"he@npm:1.2.0":
version: 1.2.0
resolution: "he@npm:1.2.0"
bin:
he: bin/he
checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17
languageName: node
linkType: hard
"luxon@npm:3.5.0":
version: 3.5.0
resolution: "luxon@npm:3.5.0"
checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494
languageName: node
linkType: hard
"ms@npm:^2.1.3":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
languageName: node
linkType: hard
"pako@npm:^0.2.5":
version: 0.2.9
resolution: "pako@npm:0.2.9"
checksum: 10c0/79c1806ebcf325b60ae599e4d7227c2e346d7b829dc20f5cf24cef07c934079dc3a61c5b3c8278a2f7a190c4a613e343ea11e5302dbe252efd11712df4b6b041
languageName: node
linkType: hard
"stringtemplate4ts@npm:1.0.9":
version: 1.0.9
resolution: "stringtemplate4ts@npm:1.0.9"
dependencies:
antlr4ng: "npm:3.0.15"
fast-printf: "npm:1.6.10"
he: "npm:1.2.0"
luxon: "npm:3.5.0"
checksum: 10c0/c5f46367d0375c1a7caf20b86190842f4aeffb543d768b2270dfd3c5e42c4dcf49901c02a7b068c08e8c4440c02a202908594ebcedbed0f5e894703d23f54c02
languageName: node
linkType: hard
"tiny-inflate@npm:^1.0.0":
version: 1.0.3
resolution: "tiny-inflate@npm:1.0.3"
checksum: 10c0/fab687537254f6ec44c9a2e880048fe70da3542aba28f73cda3e74c95cabf342a339372f2a6c032e322324f01accc03ca26c04ba2bad9b3eb8cf3ee99bba7f9b
languageName: node
linkType: hard
"typescript@npm:5.4.5":
version: 5.4.5
resolution: "typescript@npm:5.4.5"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 10c0/2954022ada340fd3d6a9e2b8e534f65d57c92d5f3989a263754a78aba549f7e6529acc1921913560a4b816c46dce7df4a4d29f9f11a3dc0d4213bb76d043251e
languageName: node
linkType: hard
"typescript@npm:^7.0.2":
version: 7.0.2
resolution: "typescript@npm:7.0.2"
dependencies:
"@typescript/typescript-aix-ppc64": "npm:7.0.2"
"@typescript/typescript-darwin-arm64": "npm:7.0.2"
"@typescript/typescript-darwin-x64": "npm:7.0.2"
"@typescript/typescript-freebsd-arm64": "npm:7.0.2"
"@typescript/typescript-freebsd-x64": "npm:7.0.2"
"@typescript/typescript-linux-arm": "npm:7.0.2"
"@typescript/typescript-linux-arm64": "npm:7.0.2"
"@typescript/typescript-linux-loong64": "npm:7.0.2"
"@typescript/typescript-linux-mips64el": "npm:7.0.2"
"@typescript/typescript-linux-ppc64": "npm:7.0.2"
"@typescript/typescript-linux-riscv64": "npm:7.0.2"
"@typescript/typescript-linux-s390x": "npm:7.0.2"
"@typescript/typescript-linux-x64": "npm:7.0.2"
"@typescript/typescript-netbsd-arm64": "npm:7.0.2"
"@typescript/typescript-netbsd-x64": "npm:7.0.2"
"@typescript/typescript-openbsd-arm64": "npm:7.0.2"
"@typescript/typescript-openbsd-x64": "npm:7.0.2"
"@typescript/typescript-sunos-x64": "npm:7.0.2"
"@typescript/typescript-win32-arm64": "npm:7.0.2"
"@typescript/typescript-win32-x64": "npm:7.0.2"
dependenciesMeta:
"@typescript/typescript-aix-ppc64":
optional: true
"@typescript/typescript-darwin-arm64":
optional: true
"@typescript/typescript-darwin-x64":
optional: true
"@typescript/typescript-freebsd-arm64":
optional: true
"@typescript/typescript-freebsd-x64":
optional: true
"@typescript/typescript-linux-arm":
optional: true
"@typescript/typescript-linux-arm64":
optional: true
"@typescript/typescript-linux-loong64":
optional: true
"@typescript/typescript-linux-mips64el":
optional: true
"@typescript/typescript-linux-ppc64":
optional: true
"@typescript/typescript-linux-riscv64":
optional: true
"@typescript/typescript-linux-s390x":
optional: true
"@typescript/typescript-linux-x64":
optional: true
"@typescript/typescript-netbsd-arm64":
optional: true
"@typescript/typescript-netbsd-x64":
optional: true
"@typescript/typescript-openbsd-arm64":
optional: true
"@typescript/typescript-openbsd-x64":
optional: true
"@typescript/typescript-sunos-x64":
optional: true
"@typescript/typescript-win32-arm64":
optional: true
"@typescript/typescript-win32-x64":
optional: true
bin:
tsc: bin/tsc
checksum: 10c0/3dcee51ec8c332492325bcdbf7df48b66668751f127e622ae7d41b6c716eb19184424a45e14f7750f50f340232388b69e6287859155f06a5ce2df76f12cb31cf
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>":
version: 5.4.5
resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin<compat/typescript>::version=5.4.5&hash=5adc0c"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 10c0/db2ad2a16ca829f50427eeb1da155e7a45e598eec7b086d8b4e8ba44e5a235f758e606d681c66992230d3fc3b8995865e5fd0b22a2c95486d0b3200f83072ec9
languageName: node
linkType: hard
"typescript@patch:typescript@npm%3A^7.0.2#optional!builtin<compat/typescript>":
version: 7.0.2
resolution: "typescript@patch:typescript@npm%3A7.0.2#optional!builtin<compat/typescript>::version=7.0.2&hash=3bafbf"
dependencies:
"@typescript/typescript-aix-ppc64": "npm:7.0.2"
"@typescript/typescript-darwin-arm64": "npm:7.0.2"
"@typescript/typescript-darwin-x64": "npm:7.0.2"
"@typescript/typescript-freebsd-arm64": "npm:7.0.2"
"@typescript/typescript-freebsd-x64": "npm:7.0.2"
"@typescript/typescript-linux-arm": "npm:7.0.2"
"@typescript/typescript-linux-arm64": "npm:7.0.2"
"@typescript/typescript-linux-loong64": "npm:7.0.2"
"@typescript/typescript-linux-mips64el": "npm:7.0.2"
"@typescript/typescript-linux-ppc64": "npm:7.0.2"
"@typescript/typescript-linux-riscv64": "npm:7.0.2"
"@typescript/typescript-linux-s390x": "npm:7.0.2"
"@typescript/typescript-linux-x64": "npm:7.0.2"
"@typescript/typescript-netbsd-arm64": "npm:7.0.2"
"@typescript/typescript-netbsd-x64": "npm:7.0.2"
"@typescript/typescript-openbsd-arm64": "npm:7.0.2"
"@typescript/typescript-openbsd-x64": "npm:7.0.2"
"@typescript/typescript-sunos-x64": "npm:7.0.2"
"@typescript/typescript-win32-arm64": "npm:7.0.2"
"@typescript/typescript-win32-x64": "npm:7.0.2"
dependenciesMeta:
"@typescript/typescript-aix-ppc64":
optional: true
"@typescript/typescript-darwin-arm64":
optional: true
"@typescript/typescript-darwin-x64":
optional: true
"@typescript/typescript-freebsd-arm64":
optional: true
"@typescript/typescript-freebsd-x64":
optional: true
"@typescript/typescript-linux-arm":
optional: true
"@typescript/typescript-linux-arm64":
optional: true
"@typescript/typescript-linux-loong64":
optional: true
"@typescript/typescript-linux-mips64el":
optional: true
"@typescript/typescript-linux-ppc64":
optional: true
"@typescript/typescript-linux-riscv64":
optional: true
"@typescript/typescript-linux-s390x":
optional: true
"@typescript/typescript-linux-x64":
optional: true
"@typescript/typescript-netbsd-arm64":
optional: true
"@typescript/typescript-netbsd-x64":
optional: true
"@typescript/typescript-openbsd-arm64":
optional: true
"@typescript/typescript-openbsd-x64":
optional: true
"@typescript/typescript-sunos-x64":
optional: true
"@typescript/typescript-win32-arm64":
optional: true
"@typescript/typescript-win32-x64":
optional: true
bin:
tsc: bin/tsc
checksum: 10c0/6b3cdc369cd829d46e00734ea64233ee84419c2825ad8fe408915adde77abced4b7a2401f7eed517d54a7a4f5d1c1869753cb99018df1c2159c761d9f33483a6
languageName: node
linkType: hard
"undici-types@npm:~7.18.0":
version: 7.18.2
resolution: "undici-types@npm:7.18.2"
checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d
languageName: node
linkType: hard
"unicode-properties@npm:1.4.1":
version: 1.4.1
resolution: "unicode-properties@npm:1.4.1"
dependencies:
base64-js: "npm:^1.3.0"
unicode-trie: "npm:^2.0.0"
checksum: 10c0/1d140b7945664fb0ef53de955170821e077b949eef377c6e4905902f07e339039271bfa2a005e4f4c6074b080d3420b486c52dc905e11f924949a04d1fb47ffd
languageName: node
linkType: hard
"unicode-trie@npm:^2.0.0":
version: 2.0.0
resolution: "unicode-trie@npm:2.0.0"
dependencies:
pako: "npm:^0.2.5"
tiny-inflate: "npm:^1.0.0"
checksum: 10c0/2422368645249f315640a1c9e9506046aa7738fc9c5d59e15c207cdd6ec66101c35b0b9f75dc3ac28fe7be19aaf1efc898bbea074fa1e8e295ef736aeb7904bb
languageName: node
linkType: hard