Compare commits

..

34 Commits

Author SHA1 Message Date
Quixos Subtree Publisher 652ac8e53e Publish camino-package-runtime from 351b7d74d316380481d8fcf212e03d6ec777a2f3 2026-09-13 23:03:03 +00:00
Timothy J. Aveni a2fe7e4f5e Document public mirrors and align standalone SDK with current protocol 2026-09-13 16:03:03 -07:00
Timothy J. Aveni 0907f97803 Retain supervised package failures and final activation diagnostics 2026-09-13 12:23:18 -07:00
Timothy J. Aveni ce6ae8f662 Implement workspace evolution, migrations, and runtime continuity
Enable evolution by default for source-backed workspaces. Add stable
conformance ownership, semantic-major review, candidate typechecking,
and durable fenced cutover with explicit migrations and forward recovery.

Independently supervise package runtimes so unchanged resource owners keep
their processes and connections across cutover. Add scoped invocation
authority, resource sessions, and typed callback rebinding.

Wire opaque object references through generated bindings and RPCs. Add
canonical relationship sets, keyed maps, and ordered lists with scoped
transactional mutations, revision checks, and inverse consistency. Support
planned cascade deletion, protection, tombstones, and lifecycle foundations.

Add journaled structural edits, package/function/migration scaffolding,
managed repository creation, and resumable bottom-up dependency pin
publication. Document lifetime boundaries, revision pinning, prototype
compatibility policy, commands, and deferred work.

Validate with 210 tests, user-systemd process/connection continuity,
generated-package TypeScript checks, and Nix host/protocol checks.
TTL handoff, physical reclamation, general multi-step migrations, and
root-systemd migration isolation acceptance remain deferred.
2026-09-10 18:29:25 -07:00
Timothy J. Aveni 549c4539d5 Generate typed QX bindings and add source editing tools 2026-09-08 15:42:20 -07:00
timothy fa9e77e75c Build workspace agent, capability graph, and versioned cutovers 2026-09-06 11:12:04 -07:00
Quixos Subtree Publisher a998690446 Publish camino-package-runtime from d24af92a8e059a5ce3a15fc8caaa9b346bfa8375 2026-09-06 00:50:46 +00:00
timothy 46c8950a75 Add the workspace coding agent, launch gate, and composable locks
- run a singleton Codex App Server adapter in each dev workspace
- gate Web Studio with a reloadable fragment-token to HttpOnly-session exchange
- add ChatGPT device login and streamed chat to Web Studio
- isolate authoring access in a declarative NixOS service account
- split Web Studio canvas, object, panel, and model concerns
- check generated Quixos protocol clients for drift
- resolve same-repository quixos.lock fragments deterministically
- preserve the collaborative canvas gesture fixes
2026-09-05 17:50:46 -07:00
timothy 2de080c09f Make package-runtime publication verify generated distribution 2026-09-04 21:28:56 -07:00
Quixos Subtree Publisher c15a8a51fa Publish camino-package-runtime from fa363fa2f4e83d0996c1229ab1ecf9e0541d5d4f 2026-09-05 04:28:56 +00:00
timothy d83f82c90f Pin runtimes to persisted component protocol 2026-09-04 21:07:14 -07:00
Quixos Subtree Publisher b7b4a63155 Publish camino-package-runtime from e77d2eb0eb5ed034fb5e20a3600412eda4e3c73d 2026-09-05 04:07:14 +00:00
timothy 04614be2c9 Introduce persisted Web Studio component capabilities 2026-09-04 21:04:43 -07:00
timothy 16b344c0ad Introduce repository-backed capability workspaces
- define and validate the capability and resource-lock languages
- provision workspace source repositories through Central Gitea
- build package runtimes from pinned standalone sources
- replace legacy schema compilation with workspace persistence plans
- add stable optimistic registers and Automerge CRDT documents
- modernize TypeScript/Nix package builds and runtime activation readiness
2026-09-04 19:08:10 -07:00
Quixos Subtree Publisher 385a5bd595 Publish camino-package-runtime from 321d5fa6c8b7619c1dc9cc4976318f246e645812 2026-09-05 01:30:55 +00:00
timothy 9771b0803e Host workspace repositories on Central Gitea 2026-09-04 18:30:55 -07:00
Quixos Subtree Publisher 2dfba87179 Publish camino-package-runtime from ce0dd80f56df35bf3db1be01236a949a704cb4c2 2026-09-04 17:41:38 +00:00
timothy ab46f4f136 Host workspace repositories on Central Gitea 2026-09-04 10:41:38 -07:00
Quixos Subtree Publisher 673575fc54 Publish camino-package-runtime from 64e5ed409717f2a7c59fe5d94ed0cf0dc7e24a2a 2026-09-04 17:23:43 +00:00
timothy dcdbd525fb Host workspace repositories on Central Gitea 2026-09-04 10:23:43 -07:00
Timothy J. Aveni 5d3bd68a63 Generate protobuf value declarations for runtime fields 2026-09-03 09:50:30 -07:00
Quixos Subtree Publisher 5c6f9b9de5 Publish camino-package-runtime from 29863fb4575e960d6f87cbeb6cc5ad69e44f0127 2026-09-03 16:50:30 +00:00
Timothy J. Aveni 69441e9465 Validate edge reference declarations directly 2026-09-03 09:47:35 -07:00
Quixos Subtree Publisher 6c3542d2ea Publish camino-package-runtime from 0afd5b03b7640bf6962d3059cd50aef76a3b56da 2026-09-03 16:47:35 +00:00
Timothy J. Aveni 833518c3ea Keep protobuf value types distinct from object refs 2026-09-03 09:44:56 -07:00
Quixos Subtree Publisher e564cfeb32 Publish camino-package-runtime from 988bb022bf279fb83d8720c239844a272c676e67 2026-09-03 16:44:56 +00:00
Timothy J. Aveni 013d4cf3c8 Send incremental CRDT changes from package runtimes 2026-09-03 09:41:08 -07:00
Quixos Subtree Publisher aec3a348b1 Publish camino-package-runtime from 9e02a6add77fb8f36c8d242c7a135069cabc783b 2026-09-03 16:41:08 +00:00
Timothy J. Aveni 8fc1060b65 Publish browser method runtime declaration 2026-07-18 12:11:20 -07:00
Quixos Subtree Publisher a83c43f9d9 Publish camino-package-runtime from 2acad11c4bcae2bbde2180327d45d5db9cffc9ed 2026-07-18 19:11:20 +00:00
Timothy J. Aveni b1d0667045 Add schema-driven project task creation 2026-07-18 12:10:00 -07:00
Quixos Subtree Publisher cad6057316 Publish camino-package-runtime from ee693da2ca152011d8bddf205cd5d44488335ea1 2026-07-18 19:10:00 +00:00
Timothy J. Aveni 9674ffa108 Publish updated Camino codegen artifacts 2026-07-18 10:35:48 -07:00
Quixos Subtree Publisher 1df06f4be7 Publish camino-package-runtime from 18c19a5b893e6196a357de9a3c52636b3ce9e33e 2026-07-18 17:35:48 +00:00
75 changed files with 6157 additions and 7545 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"version": 1, "version": 1,
"sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos.git", "sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos",
"sourceCommit": "9f6f36f9932aa1f938eb507c5ed372200dee0096", "sourceCommit": "351b7d74d316380481d8fcf212e03d6ec777a2f3",
"sourcePath": "quixos-instance/packages/camino-package-runtime", "sourcePath": "quixos-instance/packages/camino-package-runtime",
"exportName": "camino-package-runtime", "exportName": "camino-package-runtime",
"mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git" "mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-package-runtime.git"
Binary file not shown.
+15 -1
View File
@@ -1,5 +1,5 @@
approvedGitRepositories: approvedGitRepositories:
- https://gitea-external.egads.tutti.syntaxblitz.net/quixos/* - "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/*"
enableScripts: true enableScripts: true
@@ -9,6 +9,20 @@ individualNixPackaging: true
nodeLinker: node-modules nodeLinker: node-modules
supportedArchitectures:
os:
- current
- linux
cpu:
- current
- x64
- arm64
libc:
- current
- glibc
npmMinimalAgeGate: 0
plugins: plugins:
- checksum: 271de9a785321a37c564b8e2a6b5cd689850b20572d5fee8ec0a6b8e7a5d4cfb59e533524af2b4a537e00da12828abd062eaec6978556e3dd9149a020db2591b - checksum: 271de9a785321a37c564b8e2a6b5cd689850b20572d5fee8ec0a6b8e7a5d4cfb59e533524af2b4a537e00da12828abd062eaec6978556e3dd9149a020db2591b
path: .yarn/plugins/yarn-plugin-nixify.cjs path: .yarn/plugins/yarn-plugin-nixify.cjs
+79
View File
@@ -0,0 +1,79 @@
import { type Value } from "./camino/api_pb.js";
import { type RuntimeHandler, type DerivedHandler } from "./index.js";
export type { QxObjectRef } from "./references.js";
declare const watchBrand: unique symbol;
export type QxWatchHandle = string & {
readonly [watchBrand]: true;
};
export type MessageBinding<T> = {
encode(value: T): Value;
decode(value: Value): T;
};
export type BindingValue<B> = B extends MessageBinding<infer T> ? T : never;
export type QxHandler<C, O> = (context: C) => O | Promise<O>;
export type QxDerived<C, O> = {
kind: "derived";
get: QxHandler<C, O>;
};
export type QxSession<C> = {
id: string;
run<T>(work: (context: C) => Promise<T>): Promise<T>;
close(): Promise<void>;
};
export type QxContextLifecycle<C> = {
signal?: AbortSignal;
openSession?: () => Promise<QxSession<C>>;
};
export declare const qxDerived: <C, O>(get: QxHandler<C, O>) => QxDerived<C, O>;
/** Versioned binding ABI. This mirrors the language-neutral value IR. */
export type QxValueType = {
kind: "builtin";
name: "unit" | "watch-handle";
} | {
kind: "scalar";
name: string;
} | {
kind: "message";
descriptorId: string;
} | {
kind: "object-ref";
expectation: unknown;
} | {
kind: "optional" | "list";
value: QxValueType;
};
export type QxOperationSpec = {
id: string;
inputType: QxValueType;
outputType: QxValueType;
};
export type QxPortSpec = {
kind: "state";
id: string;
valueType: QxValueType;
primitives: string[];
} | {
kind: "edge";
id: string;
primitives: string[];
} | {
kind: "interface";
id: string;
operations: Record<string, QxOperationSpec>;
} | {
kind: "constructor";
id: string;
inputType: QxValueType;
};
export type QxHandlerSpec = {
inputType: QxValueType;
outputType: QxValueType;
eventType?: QxValueType;
ports: Record<string, QxPortSpec>;
};
export type QxMessages = Record<string, MessageBinding<any>>;
export declare const decodeQxValue: (type: QxValueType, value: Value | undefined, messages: QxMessages) => any;
export declare const encodeQxValue: (type: QxValueType, value: any, messages: QxMessages) => Value;
/** The sole unchecked cast connects generated contracts to the dynamic RPC runtime. */
export declare const bindQxHandler: <C, O>(spec: QxHandlerSpec, handler: QxHandler<C, O> | QxDerived<C, O>, messages: QxMessages) => RuntimeHandler | DerivedHandler;
//# sourceMappingURL=bindings.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../src/bindings.ts"],"names":[],"mappings":"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"}
+129
View File
@@ -0,0 +1,129 @@
import { create } from "@bufbuild/protobuf";
import { ValueSchema, ObjectValueSchema } from "./camino/api_pb.js";
import { derived, jsToProtoValue, liveValue, protoValueToJs } from "./index.js";
import { assertReferenceFree, referenceToWire } from "./references.js";
export const qxDerived = (get) => ({ kind: "derived", get });
// Conversion belongs at the binding boundary. It does not add orchestrator validation.
export const decodeQxValue = (type, value, messages) => {
if (type.kind === "builtin" && type.name === "unit")
return null;
if (!value)
throw new Error("Missing QX wire value");
if (type.kind === "optional")
return value.kind.case === "nullValue" ? null : decodeQxValue(type.value, value, messages);
if (type.kind === "list") {
if (value.kind.case !== "listValue")
throw new Error("Expected QX list");
return value.kind.value.values.map((entry) => decodeQxValue(type.value, entry, messages));
}
if (type.kind === "message") {
assertReferenceFree(protoValueToJs(value));
const decoded = requireMessage(messages, type.descriptorId).decode(value);
assertReferenceFree(decoded);
return decoded;
}
if (type.kind === "object-ref") {
if (value.kind.case !== "refValue")
throw new Error("Expected a declared RPC object reference");
return protoValueToJs(value);
}
if (value.kind.case === "refValue")
throw new Error("Reference supplied to a non-reference value");
if (type.kind === "scalar") {
if (type.name === "int64" || type.name === "uint64") {
if (value.kind.case !== "integerValue")
throw new Error("Expected QX integer");
return BigInt(value.kind.value);
}
if (type.name === "bytes") {
if (value.kind.case !== "bytesValue")
throw new Error("Expected QX bytes");
return value.kind.value;
}
}
return protoValueToJs(value);
};
const requireMessage = (messages, id) => {
const binding = messages[id];
if (!binding)
throw new Error(`Missing message binding ${id}`);
return binding;
};
export const encodeQxValue = (type, value, messages) => {
if (type.kind === "builtin" && type.name === "unit")
return jsToProtoValue(null);
if (type.kind === "optional")
return value === null ? jsToProtoValue(null) : encodeQxValue(type.value, value, messages);
if (type.kind === "list")
return jsToProtoValue(value.map((entry) => liveValue(encodeQxValue(type.value, entry, messages))));
if (type.kind === "object-ref") {
referenceToWire(value);
return jsToProtoValue(value);
}
assertReferenceFree(value);
if (type.kind === "message") {
const encoded = requireMessage(messages, type.descriptorId).encode(value);
assertReferenceFree(protoValueToJs(encoded));
return encoded;
}
return jsToProtoValue(value);
};
const inputValue = (context, type) => {
if (type.kind === "message")
return create(ValueSchema, { kind: { case: "objectValue",
value: create(ObjectValueSchema, { fields: context.inputProto }) } });
return context.inputProto.value;
};
const inputFields = (type, value, messages) => {
if (type.kind === "builtin" && type.name === "unit")
return {};
const encoded = encodeQxValue(type, value, messages);
if (type.kind === "message") {
if (encoded.kind.case !== "objectValue")
throw new Error("Message inputs must encode an object value");
return Object.fromEntries(Object.entries(encoded.kind.value.fields).map(([key, entry]) => [key, liveValue(entry)]));
}
return { value: liveValue(encoded) };
};
/** The sole unchecked cast connects generated contracts to the dynamic RPC runtime. */
export const bindQxHandler = (spec, handler, messages) => {
const bindContext = (raw) => {
const ports = Object.fromEntries(Object.entries(spec.ports).map(([name, port]) => {
switch (port.kind) {
case "state": {
const state = raw.state(port.id);
return [name, {
...(port.primitives.includes("read") ? { get: async () => decodeQxValue(port.valueType, (await state.live()).$quixosValue, messages) } : {}),
...(port.primitives.includes("write") ? { set: async (value) => state.set(liveValue(encodeQxValue(port.valueType, value, messages))) } : {}),
}];
}
case "edge": {
const edge = raw.edge(port.id);
return [name, { ...Object.fromEntries(port.primitives.map((primitive) => [primitive, edge[primitive]])),
...(port.primitives.includes("resolve") ? { collection: edge.collection } : {}),
...(port.primitives.includes("resolve") && port.primitives.includes("connect") && port.primitives.includes("disconnect") ? { replace: edge.replace } : {}) }];
}
case "interface": {
const target = raw.interface(port.id);
return [name, Object.fromEntries(Object.entries(port.operations).map(([name, operation]) => [name,
async (input) => decodeQxValue(operation.outputType, (await target.live(operation.id, inputFields(operation.inputType, input, messages))).$quixosValue, messages),
]))];
}
case "constructor": return [name, { construct: (input) => raw.constructor(port.id).construct(inputFields(port.inputType, input, messages)) }];
}
}));
return { objectId: raw.objectId, signal: raw.signal,
...(raw.openSession ? { openSession: async () => {
const session = await raw.openSession();
return { id: session.id, close: () => session.close(),
run: (work) => session.run((next) => work(bindContext(next))) };
} } : {}),
input: decodeQxValue(spec.inputType, inputValue(raw, spec.inputType), messages), ports };
};
const execute = async (raw) => {
const context = bindContext(raw);
const value = await (typeof handler === "function" ? handler(context) : handler.get(context));
return liveValue(encodeQxValue(spec.eventType ?? spec.outputType, value, messages));
};
return typeof handler === "function" ? execute : derived(execute);
};
+310 -271
View File
@@ -1,84 +1,10 @@
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import type { ClassSchema } from "./schema_pb.js"; import type { PersistencePlan } from "./schema_pb.js";
import type { FunctionRef } from "../quixos/refs_pb.js";
import type { Message } from "@bufbuild/protobuf"; import type { Message } from "@bufbuild/protobuf";
/** /**
* Describes the file camino/api.proto. * Describes the file camino/api.proto.
*/ */
export declare const file_camino_api: GenFile; export declare const file_camino_api: GenFile;
/**
* @generated from message camino.RegisterSchemaRequest
*/
export type RegisterSchemaRequest = Message<"camino.RegisterSchemaRequest"> & {
/**
* @generated from field: string source_file = 1;
*/
sourceFile: string;
};
/**
* Describes the message camino.RegisterSchemaRequest.
* Use `create(RegisterSchemaRequestSchema)` to create a new message.
*/
export declare const RegisterSchemaRequestSchema: GenMessage<RegisterSchemaRequest>;
/**
* @generated from message camino.RegisterSchemaResponse
*/
export type RegisterSchemaResponse = Message<"camino.RegisterSchemaResponse"> & {
/**
* @generated from field: repeated string class_ids = 1;
*/
classIds: string[];
/**
* @generated from field: repeated camino.ClassSchema classes = 2;
*/
classes: ClassSchema[];
};
/**
* Describes the message camino.RegisterSchemaResponse.
* Use `create(RegisterSchemaResponseSchema)` to create a new message.
*/
export declare const RegisterSchemaResponseSchema: GenMessage<RegisterSchemaResponse>;
/**
* @generated from message camino.ListClassesRequest
*/
export type ListClassesRequest = Message<"camino.ListClassesRequest"> & {};
/**
* Describes the message camino.ListClassesRequest.
* Use `create(ListClassesRequestSchema)` to create a new message.
*/
export declare const ListClassesRequestSchema: GenMessage<ListClassesRequest>;
/**
* @generated from message camino.RegisteredClass
*/
export type RegisteredClass = Message<"camino.RegisteredClass"> & {
/**
* @generated from field: string id = 1;
*/
id: string;
/**
* @generated from field: camino.ClassSchema schema = 2;
*/
schema?: ClassSchema | undefined;
};
/**
* Describes the message camino.RegisteredClass.
* Use `create(RegisteredClassSchema)` to create a new message.
*/
export declare const RegisteredClassSchema: GenMessage<RegisteredClass>;
/**
* @generated from message camino.ListClassesResponse
*/
export type ListClassesResponse = Message<"camino.ListClassesResponse"> & {
/**
* @generated from field: repeated camino.RegisteredClass classes = 1;
*/
classes: RegisteredClass[];
};
/**
* Describes the message camino.ListClassesResponse.
* Use `create(ListClassesResponseSchema)` to create a new message.
*/
export declare const ListClassesResponseSchema: GenMessage<ListClassesResponse>;
/** /**
* @generated from message camino.NullValue * @generated from message camino.NullValue
*/ */
@@ -155,47 +81,51 @@ export type CrdtValue = Message<"camino.CrdtValue"> & {
*/ */
export declare const CrdtValueSchema: GenMessage<CrdtValue>; export declare const CrdtValueSchema: GenMessage<CrdtValue>;
/** /**
* @generated from message camino.FieldValueSource * @generated from message camino.StateValueSource
*/ */
export type FieldValueSource = Message<"camino.FieldValueSource"> & { export type StateValueSource = Message<"camino.StateValueSource"> & {
/** /**
* @generated from field: string object_id = 1; * @generated from field: string object_id = 1;
*/ */
objectId: string; objectId: string;
/** /**
* @generated from field: string field_name = 2; * @generated from field: string slot_id = 2;
*/ */
fieldName: string; slotId: string;
/** /**
* @generated from field: string field_type = 3; * @generated from field: string value_type_json = 3;
*/ */
fieldType: string; valueTypeJson: string;
/** /**
* @generated from field: string field_storage = 4; * @generated from field: string storage_policy_json = 4;
*/ */
fieldStorage: string; storagePolicyJson: string;
/** /**
* @generated from field: string conflict_strategy = 5; * @generated from field: uint64 revision = 5;
*/
conflictStrategy: string;
/**
* @generated from field: uint64 revision = 6;
*/ */
revision: bigint; revision: bigint;
/**
* 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.
*
* @generated from field: camino.CrdtValue crdt_snapshot = 6;
*/
crdtSnapshot?: CrdtValue | undefined;
}; };
/** /**
* Describes the message camino.FieldValueSource. * Describes the message camino.StateValueSource.
* Use `create(FieldValueSourceSchema)` to create a new message. * Use `create(StateValueSourceSchema)` to create a new message.
*/ */
export declare const FieldValueSourceSchema: GenMessage<FieldValueSource>; export declare const StateValueSourceSchema: GenMessage<StateValueSource>;
/** /**
* @generated from message camino.ValueSource * @generated from message camino.ValueSource
*/ */
export type ValueSource = Message<"camino.ValueSource"> & { export type ValueSource = Message<"camino.ValueSource"> & {
/** /**
* @generated from field: camino.FieldValueSource field = 1; * @generated from field: camino.StateValueSource state = 1;
*/ */
field?: FieldValueSource | undefined; state?: StateValueSource | undefined;
}; };
/** /**
* Describes the message camino.ValueSource. * Describes the message camino.ValueSource.
@@ -283,18 +213,69 @@ export type Value = Message<"camino.Value"> & {
* Use `create(ValueSchema)` to create a new message. * Use `create(ValueSchema)` to create a new message.
*/ */
export declare const ValueSchema: GenMessage<Value>; export declare const ValueSchema: GenMessage<Value>;
/**
* @generated from message camino.InstallPersistencePlanRequest
*/
export type InstallPersistencePlanRequest = Message<"camino.InstallPersistencePlanRequest"> & {
/**
* @generated from field: camino.PersistencePlan plan = 1;
*/
plan?: PersistencePlan | undefined;
};
/**
* Describes the message camino.InstallPersistencePlanRequest.
* Use `create(InstallPersistencePlanRequestSchema)` to create a new message.
*/
export declare const InstallPersistencePlanRequestSchema: GenMessage<InstallPersistencePlanRequest>;
/**
* @generated from message camino.InstallPersistencePlanResponse
*/
export type InstallPersistencePlanResponse = Message<"camino.InstallPersistencePlanResponse"> & {
/**
* @generated from field: camino.PersistencePlan plan = 1;
*/
plan?: PersistencePlan | undefined;
};
/**
* Describes the message camino.InstallPersistencePlanResponse.
* Use `create(InstallPersistencePlanResponseSchema)` to create a new message.
*/
export declare const InstallPersistencePlanResponseSchema: GenMessage<InstallPersistencePlanResponse>;
/**
* @generated from message camino.GetPersistencePlanRequest
*/
export type GetPersistencePlanRequest = Message<"camino.GetPersistencePlanRequest"> & {};
/**
* Describes the message camino.GetPersistencePlanRequest.
* Use `create(GetPersistencePlanRequestSchema)` to create a new message.
*/
export declare const GetPersistencePlanRequestSchema: GenMessage<GetPersistencePlanRequest>;
/**
* @generated from message camino.GetPersistencePlanResponse
*/
export type GetPersistencePlanResponse = Message<"camino.GetPersistencePlanResponse"> & {
/**
* @generated from field: camino.PersistencePlan plan = 1;
*/
plan?: PersistencePlan | undefined;
};
/**
* Describes the message camino.GetPersistencePlanResponse.
* Use `create(GetPersistencePlanResponseSchema)` to create a new message.
*/
export declare const GetPersistencePlanResponseSchema: GenMessage<GetPersistencePlanResponse>;
/** /**
* @generated from message camino.CreateObjectRequest * @generated from message camino.CreateObjectRequest
*/ */
export type CreateObjectRequest = Message<"camino.CreateObjectRequest"> & { export type CreateObjectRequest = Message<"camino.CreateObjectRequest"> & {
/** /**
* @generated from field: string class_id = 1; * @generated from field: string atom_id = 1;
*/ */
classId: string; atomId: string;
/** /**
* @generated from field: map<string, camino.Value> fields = 2; * @generated from field: map<string, camino.Value> initial_state = 2;
*/ */
fields: { initialState: {
[key: string]: Value; [key: string]: Value;
}; };
}; };
@@ -350,9 +331,9 @@ export declare const GetObjectResponseSchema: GenMessage<GetObjectResponse>;
*/ */
export type ListObjectsRequest = Message<"camino.ListObjectsRequest"> & { export type ListObjectsRequest = Message<"camino.ListObjectsRequest"> & {
/** /**
* @generated from field: string class_id = 1; * @generated from field: string atom_id = 1;
*/ */
classId: string; atomId: string;
}; };
/** /**
* Describes the message camino.ListObjectsRequest. * Describes the message camino.ListObjectsRequest.
@@ -374,17 +355,49 @@ export type ListObjectsResponse = Message<"camino.ListObjectsResponse"> & {
*/ */
export declare const ListObjectsResponseSchema: GenMessage<ListObjectsResponse>; export declare const ListObjectsResponseSchema: GenMessage<ListObjectsResponse>;
/** /**
* @generated from message camino.SetFieldRequest * @generated from message camino.ReadStateRequest
*/ */
export type SetFieldRequest = Message<"camino.SetFieldRequest"> & { export type ReadStateRequest = Message<"camino.ReadStateRequest"> & {
/** /**
* @generated from field: string object_id = 1; * @generated from field: string object_id = 1;
*/ */
objectId: string; objectId: string;
/** /**
* @generated from field: string field_name = 2; * @generated from field: string slot_id = 2;
*/ */
fieldName: string; slotId: string;
};
/**
* Describes the message camino.ReadStateRequest.
* Use `create(ReadStateRequestSchema)` to create a new message.
*/
export declare const ReadStateRequestSchema: GenMessage<ReadStateRequest>;
/**
* @generated from message camino.ReadStateResponse
*/
export type ReadStateResponse = Message<"camino.ReadStateResponse"> & {
/**
* @generated from field: camino.Value value = 1;
*/
value?: Value | undefined;
};
/**
* Describes the message camino.ReadStateResponse.
* Use `create(ReadStateResponseSchema)` to create a new message.
*/
export declare const ReadStateResponseSchema: GenMessage<ReadStateResponse>;
/**
* @generated from message camino.WriteStateRequest
*/
export type WriteStateRequest = Message<"camino.WriteStateRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
/**
* @generated from field: string slot_id = 2;
*/
slotId: string;
/** /**
* @generated from field: camino.Value value = 3; * @generated from field: camino.Value value = 3;
*/ */
@@ -395,102 +408,76 @@ export type SetFieldRequest = Message<"camino.SetFieldRequest"> & {
clientMutationId: string; clientMutationId: string;
}; };
/** /**
* Describes the message camino.SetFieldRequest. * Describes the message camino.WriteStateRequest.
* Use `create(SetFieldRequestSchema)` to create a new message. * Use `create(WriteStateRequestSchema)` to create a new message.
*/ */
export declare const SetFieldRequestSchema: GenMessage<SetFieldRequest>; export declare const WriteStateRequestSchema: GenMessage<WriteStateRequest>;
/** /**
* @generated from message camino.SetFieldResponse * @generated from message camino.WriteStateResponse
*/ */
export type SetFieldResponse = Message<"camino.SetFieldResponse"> & { export type WriteStateResponse = Message<"camino.WriteStateResponse"> & {
/** /**
* @generated from field: camino.CaminoObject object = 1; * @generated from field: camino.Value value = 1;
*/
value?: Value | undefined;
/**
* @generated from field: camino.CaminoObject object = 2;
*/ */
object?: CaminoObject | undefined; object?: CaminoObject | undefined;
}; };
/** /**
* Describes the message camino.SetFieldResponse. * Describes the message camino.WriteStateResponse.
* Use `create(SetFieldResponseSchema)` to create a new message. * Use `create(WriteStateResponseSchema)` to create a new message.
*/ */
export declare const SetFieldResponseSchema: GenMessage<SetFieldResponse>; export declare const WriteStateResponseSchema: GenMessage<WriteStateResponse>;
/** /**
* @generated from message camino.AddEdgeRequest * @generated from message camino.ConnectEdgeRequest
*/ */
export type AddEdgeRequest = Message<"camino.AddEdgeRequest"> & { export type ConnectEdgeRequest = Message<"camino.ConnectEdgeRequest"> & {
/** /**
* @generated from field: string from_object_id = 1; * @generated from field: string edge_type_id = 1;
*/ */
fromObjectId: string; edgeTypeId: string;
/** /**
* @generated from field: string source_field = 2; * @generated from field: string projection_id = 2;
*/ */
sourceField: string; projectionId: string;
/** /**
* @generated from field: string to_object_id = 3; * @generated from field: string object_id = 3;
*/ */
toObjectId: string; objectId: string;
/** /**
* @generated from field: map<string, camino.Value> fields = 4; * @generated from field: string target_object_id = 4;
*/ */
fields: { targetObjectId: string;
[key: string]: Value;
};
/** /**
* @generated from field: optional int32 source_ordinal = 5; * @generated from field: optional int32 ordinal = 5;
*/ */
sourceOrdinal?: number | undefined; ordinal?: number | undefined;
/** /**
* @generated from field: optional int32 target_ordinal = 6; * @generated from field: optional int32 target_ordinal = 6;
*/ */
targetOrdinal?: number | undefined; targetOrdinal?: number | undefined;
}; };
/** /**
* Describes the message camino.AddEdgeRequest. * Describes the message camino.ConnectEdgeRequest.
* Use `create(AddEdgeRequestSchema)` to create a new message. * Use `create(ConnectEdgeRequestSchema)` to create a new message.
*/ */
export declare const AddEdgeRequestSchema: GenMessage<AddEdgeRequest>; export declare const ConnectEdgeRequestSchema: GenMessage<ConnectEdgeRequest>;
/** /**
* @generated from message camino.AddEdgeResponse * @generated from message camino.ConnectEdgeResponse
*/ */
export type AddEdgeResponse = Message<"camino.AddEdgeResponse"> & { export type ConnectEdgeResponse = Message<"camino.ConnectEdgeResponse"> & {
/** /**
* @generated from field: camino.CaminoEdge edge = 1; * @generated from field: camino.CaminoEdge edge = 1;
*/ */
edge?: CaminoEdge | undefined; edge?: CaminoEdge | undefined;
}; };
/** /**
* Describes the message camino.AddEdgeResponse. * Describes the message camino.ConnectEdgeResponse.
* Use `create(AddEdgeResponseSchema)` to create a new message. * Use `create(ConnectEdgeResponseSchema)` to create a new message.
*/ */
export declare const AddEdgeResponseSchema: GenMessage<AddEdgeResponse>; export declare const ConnectEdgeResponseSchema: GenMessage<ConnectEdgeResponse>;
/**
* @generated from message camino.ListEdgesRequest
*/
export type ListEdgesRequest = Message<"camino.ListEdgesRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
};
/**
* Describes the message camino.ListEdgesRequest.
* Use `create(ListEdgesRequestSchema)` to create a new message.
*/
export declare const ListEdgesRequestSchema: GenMessage<ListEdgesRequest>;
/**
* @generated from message camino.ListEdgesResponse
*/
export type ListEdgesResponse = Message<"camino.ListEdgesResponse"> & {
/**
* @generated from field: repeated camino.CaminoEdge edges = 1;
*/
edges: CaminoEdge[];
};
/**
* Describes the message camino.ListEdgesResponse.
* Use `create(ListEdgesResponseSchema)` to create a new message.
*/
export declare const ListEdgesResponseSchema: GenMessage<ListEdgesResponse>;
/** /**
* @generated from message camino.ResolveEdgeRequest * @generated from message camino.ResolveEdgeRequest
*/ */
@@ -500,9 +487,13 @@ export type ResolveEdgeRequest = Message<"camino.ResolveEdgeRequest"> & {
*/ */
objectId: string; objectId: string;
/** /**
* @generated from field: string projection = 2; * @generated from field: string edge_type_id = 2;
*/ */
projection: string; edgeTypeId: string;
/**
* @generated from field: string projection_id = 3;
*/
projectionId: string;
}; };
/** /**
* Describes the message camino.ResolveEdgeRequest. * Describes the message camino.ResolveEdgeRequest.
@@ -517,14 +508,6 @@ export type ResolveEdgeResponse = Message<"camino.ResolveEdgeResponse"> & {
* @generated from field: repeated camino.CaminoEdge edges = 1; * @generated from field: repeated camino.CaminoEdge edges = 1;
*/ */
edges: CaminoEdge[]; edges: CaminoEdge[];
/**
* @generated from field: camino.CaminoObject materialized_object = 2;
*/
materializedObject?: CaminoObject | undefined;
/**
* @generated from field: bool created = 3;
*/
created: boolean;
}; };
/** /**
* Describes the message camino.ResolveEdgeResponse. * Describes the message camino.ResolveEdgeResponse.
@@ -532,33 +515,105 @@ export type ResolveEdgeResponse = Message<"camino.ResolveEdgeResponse"> & {
*/ */
export declare const ResolveEdgeResponseSchema: GenMessage<ResolveEdgeResponse>; export declare const ResolveEdgeResponseSchema: GenMessage<ResolveEdgeResponse>;
/** /**
* @generated from message camino.RemoveEdgeRequest * @generated from message camino.DisconnectEdgeRequest
*/ */
export type RemoveEdgeRequest = Message<"camino.RemoveEdgeRequest"> & { export type DisconnectEdgeRequest = Message<"camino.DisconnectEdgeRequest"> & {
/** /**
* @generated from field: string edge_id = 1; * @generated from field: string edge_id = 1;
*/ */
edgeId: string; edgeId: string;
}; };
/** /**
* Describes the message camino.RemoveEdgeRequest. * Describes the message camino.DisconnectEdgeRequest.
* Use `create(RemoveEdgeRequestSchema)` to create a new message. * Use `create(DisconnectEdgeRequestSchema)` to create a new message.
*/ */
export declare const RemoveEdgeRequestSchema: GenMessage<RemoveEdgeRequest>; export declare const DisconnectEdgeRequestSchema: GenMessage<DisconnectEdgeRequest>;
/** /**
* @generated from message camino.RemoveEdgeResponse * @generated from message camino.DisconnectEdgeResponse
*/ */
export type RemoveEdgeResponse = Message<"camino.RemoveEdgeResponse"> & { export type DisconnectEdgeResponse = Message<"camino.DisconnectEdgeResponse"> & {
/** /**
* @generated from field: string edge_id = 1; * @generated from field: string edge_id = 1;
*/ */
edgeId: string; edgeId: string;
}; };
/** /**
* Describes the message camino.RemoveEdgeResponse. * Describes the message camino.DisconnectEdgeResponse.
* Use `create(RemoveEdgeResponseSchema)` to create a new message. * Use `create(DisconnectEdgeResponseSchema)` to create a new message.
*/ */
export declare const RemoveEdgeResponseSchema: GenMessage<RemoveEdgeResponse>; export declare const DisconnectEdgeResponseSchema: GenMessage<DisconnectEdgeResponse>;
/**
* @generated from message camino.CollectionEntry
*/
export type CollectionEntry = Message<"camino.CollectionEntry"> & {
/**
* Existing entry identity to preserve; empty allocates a new canonical edge.
*
* @generated from field: string edge_id = 1;
*/
edgeId: string;
/**
* @generated from field: string target_object_id = 2;
*/
targetObjectId: string;
/**
* @generated from field: camino.Value key = 3;
*/
key?: Value | undefined;
};
/**
* Describes the message camino.CollectionEntry.
* Use `create(CollectionEntrySchema)` to create a new message.
*/
export declare const CollectionEntrySchema: GenMessage<CollectionEntry>;
/**
* @generated from message camino.ReadCollectionResponse
*/
export type ReadCollectionResponse = Message<"camino.ReadCollectionResponse"> & {
/**
* @generated from field: uint64 revision = 1;
*/
revision: bigint;
/**
* @generated from field: repeated camino.CollectionEntry entries = 2;
*/
entries: CollectionEntry[];
};
/**
* Describes the message camino.ReadCollectionResponse.
* Use `create(ReadCollectionResponseSchema)` to create a new message.
*/
export declare const ReadCollectionResponseSchema: GenMessage<ReadCollectionResponse>;
/**
* @generated from message camino.ReplaceCollectionRequest
*/
export type ReplaceCollectionRequest = Message<"camino.ReplaceCollectionRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
/**
* @generated from field: string edge_type_id = 2;
*/
edgeTypeId: string;
/**
* @generated from field: string projection_id = 3;
*/
projectionId: string;
/**
* @generated from field: uint64 expected_revision = 4;
*/
expectedRevision: bigint;
/**
* @generated from field: repeated camino.CollectionEntry entries = 5;
*/
entries: CollectionEntry[];
};
/**
* Describes the message camino.ReplaceCollectionRequest.
* Use `create(ReplaceCollectionRequestSchema)` to create a new message.
*/
export declare const ReplaceCollectionRequestSchema: GenMessage<ReplaceCollectionRequest>;
/** /**
* @generated from message camino.ListOpsRequest * @generated from message camino.ListOpsRequest
*/ */
@@ -603,6 +658,12 @@ export type WatchObjectRequest = Message<"camino.WatchObjectRequest"> & {
* @generated from field: bool include_snapshot = 3; * @generated from field: bool include_snapshot = 3;
*/ */
includeSnapshot: boolean; includeSnapshot: boolean;
/**
* Managed runtimes must watch only their injected attachments.
*
* @generated from field: repeated string attachment_ids = 4;
*/
attachmentIds: string[];
}; };
/** /**
* Describes the message camino.WatchObjectRequest. * Describes the message camino.WatchObjectRequest.
@@ -640,13 +701,13 @@ export type CaminoObject = Message<"camino.CaminoObject"> & {
*/ */
id: string; id: string;
/** /**
* @generated from field: string class_id = 2; * @generated from field: string atom_id = 2;
*/ */
classId: string; atomId: string;
/** /**
* @generated from field: uint32 schema_version = 3; * @generated from field: string workspace_revision_id = 3;
*/ */
schemaVersion: number; workspaceRevisionId: string;
/** /**
* @generated from field: string created_at = 4; * @generated from field: string created_at = 4;
*/ */
@@ -656,23 +717,17 @@ export type CaminoObject = Message<"camino.CaminoObject"> & {
*/ */
updatedAt: string; updatedAt: string;
/** /**
* @generated from field: map<string, camino.Value> fields = 6; * @generated from field: map<string, camino.Value> state = 6;
*/ */
fields: { state: {
[key: string]: Value; [key: string]: Value;
}; };
/** /**
* @generated from field: map<string, uint64> field_revisions = 7; * @generated from field: map<string, uint64> state_revisions = 7;
*/ */
fieldRevisions: { stateRevisions: {
[key: string]: bigint; [key: string]: bigint;
}; };
/**
* @generated from field: map<string, string> field_conflicts = 8;
*/
fieldConflicts: {
[key: string]: string;
};
}; };
/** /**
* Describes the message camino.CaminoObject. * Describes the message camino.CaminoObject.
@@ -692,69 +747,41 @@ export type CaminoEdge = Message<"camino.CaminoEdge"> & {
*/ */
edgeTypeId: string; edgeTypeId: string;
/** /**
* @generated from field: string from_object_id = 3; * @generated from field: string first_object_id = 3;
*/ */
fromObjectId: string; firstObjectId: string;
/** /**
* @generated from field: string to_object_id = 4; * @generated from field: string second_object_id = 4;
*/ */
toObjectId: string; secondObjectId: string;
/** /**
* Legacy canonical source-side projection fields. Prefer endpoint fields. * @generated from field: string first_projection_id = 5;
*
* @generated from field: string source_field = 5;
*/ */
sourceField: string; firstProjectionId: string;
/** /**
* @generated from field: string cardinality = 6; * @generated from field: string second_projection_id = 6;
*/ */
cardinality: string; secondProjectionId: string;
/** /**
* @generated from field: string inverse = 7; * @generated from field: optional int32 first_ordinal = 7;
*/ */
inverse: string; firstOrdinal?: number | undefined;
/** /**
* @generated from field: map<string, camino.Value> fields = 8; * @generated from field: optional int32 second_ordinal = 8;
*/ */
fields: { secondOrdinal?: number | undefined;
[key: string]: Value;
};
/** /**
* @generated from field: optional int32 from_ordinal = 9; * @generated from field: string created_at = 9;
*/
fromOrdinal?: number | undefined;
/**
* @generated from field: string created_at = 10;
*/ */
createdAt: string; createdAt: string;
/** /**
* @generated from field: string updated_at = 11; * @generated from field: string first_key_json = 10;
*/ */
updatedAt: string; firstKeyJson: string;
/** /**
* @generated from field: string from_projection = 12; * @generated from field: string second_key_json = 11;
*/ */
fromProjection: string; secondKeyJson: string;
/**
* @generated from field: string to_projection = 13;
*/
toProjection: string;
/**
* @generated from field: string from_cardinality = 14;
*/
fromCardinality: string;
/**
* @generated from field: string to_cardinality = 15;
*/
toCardinality: string;
/**
* @generated from field: optional int32 to_ordinal = 16;
*/
toOrdinal?: number | undefined;
/**
* @generated from field: string directionality = 17;
*/
directionality: string;
}; };
/** /**
* Describes the message camino.CaminoEdge. * Describes the message camino.CaminoEdge.
@@ -786,15 +813,11 @@ export type CaminoOp = Message<"camino.CaminoOp"> & {
*/ */
actor: string; actor: string;
/** /**
* @generated from field: quixos.FunctionRef function_ref = 6; * @generated from field: string created_at = 6;
*/
functionRef?: FunctionRef | undefined;
/**
* @generated from field: string created_at = 7;
*/ */
createdAt: string; createdAt: string;
/** /**
* @generated from field: string client_mutation_id = 8; * @generated from field: string client_mutation_id = 7;
*/ */
clientMutationId: string; clientMutationId: string;
}; };
@@ -808,20 +831,20 @@ export declare const CaminoOpSchema: GenMessage<CaminoOp>;
*/ */
export declare const CaminoService: GenService<{ export declare const CaminoService: GenService<{
/** /**
* @generated from rpc camino.CaminoService.RegisterSchema * @generated from rpc camino.CaminoService.InstallPersistencePlan
*/ */
registerSchema: { installPersistencePlan: {
methodKind: "unary"; methodKind: "unary";
input: typeof RegisterSchemaRequestSchema; input: typeof InstallPersistencePlanRequestSchema;
output: typeof RegisterSchemaResponseSchema; output: typeof InstallPersistencePlanResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.ListClasses * @generated from rpc camino.CaminoService.GetPersistencePlan
*/ */
listClasses: { getPersistencePlan: {
methodKind: "unary"; methodKind: "unary";
input: typeof ListClassesRequestSchema; input: typeof GetPersistencePlanRequestSchema;
output: typeof ListClassesResponseSchema; output: typeof GetPersistencePlanResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.CreateObject * @generated from rpc camino.CaminoService.CreateObject
@@ -848,28 +871,28 @@ export declare const CaminoService: GenService<{
output: typeof ListObjectsResponseSchema; output: typeof ListObjectsResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.SetField * @generated from rpc camino.CaminoService.ReadState
*/ */
setField: { readState: {
methodKind: "unary"; methodKind: "unary";
input: typeof SetFieldRequestSchema; input: typeof ReadStateRequestSchema;
output: typeof SetFieldResponseSchema; output: typeof ReadStateResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.AddEdge * @generated from rpc camino.CaminoService.WriteState
*/ */
addEdge: { writeState: {
methodKind: "unary"; methodKind: "unary";
input: typeof AddEdgeRequestSchema; input: typeof WriteStateRequestSchema;
output: typeof AddEdgeResponseSchema; output: typeof WriteStateResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.ListEdges * @generated from rpc camino.CaminoService.ConnectEdge
*/ */
listEdges: { connectEdge: {
methodKind: "unary"; methodKind: "unary";
input: typeof ListEdgesRequestSchema; input: typeof ConnectEdgeRequestSchema;
output: typeof ListEdgesResponseSchema; output: typeof ConnectEdgeResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.ResolveEdge * @generated from rpc camino.CaminoService.ResolveEdge
@@ -880,12 +903,28 @@ export declare const CaminoService: GenService<{
output: typeof ResolveEdgeResponseSchema; output: typeof ResolveEdgeResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.RemoveEdge * @generated from rpc camino.CaminoService.DisconnectEdge
*/ */
removeEdge: { disconnectEdge: {
methodKind: "unary"; methodKind: "unary";
input: typeof RemoveEdgeRequestSchema; input: typeof DisconnectEdgeRequestSchema;
output: typeof RemoveEdgeResponseSchema; output: typeof DisconnectEdgeResponseSchema;
};
/**
* @generated from rpc camino.CaminoService.ReadCollection
*/
readCollection: {
methodKind: "unary";
input: typeof ResolveEdgeRequestSchema;
output: typeof ReadCollectionResponseSchema;
};
/**
* @generated from rpc camino.CaminoService.ReplaceCollection
*/
replaceCollection: {
methodKind: "unary";
input: typeof ReplaceCollectionRequestSchema;
output: typeof ReadCollectionResponseSchema;
}; };
/** /**
* @generated from rpc camino.CaminoService.ListOps * @generated from rpc camino.CaminoService.ListOps
+1 -1
View File
File diff suppressed because one or more lines are too long
+85 -76
View File
File diff suppressed because one or more lines are too long
+160 -673
View File
@@ -1,669 +1,235 @@
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import type { FunctionRef } from "../quixos/refs_pb.js";
import type { Message } from "@bufbuild/protobuf"; import type { Message } from "@bufbuild/protobuf";
/** /**
* Describes the file camino/schema.proto. * Describes the file camino/schema.proto.
*/ */
export declare const file_camino_schema: GenFile; export declare const file_camino_schema: GenFile;
/** /**
* @generated from message camino.SymbolRef * @generated from message camino.AtomDefinition
*/ */
export type SymbolRef = Message<"camino.SymbolRef"> & { export type AtomDefinition = Message<"camino.AtomDefinition"> & {
/** /**
* @generated from field: string namespace = 1; * @generated from field: string atom_id = 1;
*/ */
namespace: string; atomId: string;
/** /**
* @generated from field: string name = 2; * @generated from field: string display_name = 2;
*/ */
name: string; displayName: string;
/**
* @generated from field: string version = 3;
*/
version: string;
/**
* @generated from field: string hash = 4;
*/
hash: string;
}; };
/** /**
* Describes the message camino.SymbolRef. * Describes the message camino.AtomDefinition.
* Use `create(SymbolRefSchema)` to create a new message. * Use `create(AtomDefinitionSchema)` to create a new message.
*/ */
export declare const SymbolRefSchema: GenMessage<SymbolRef>; export declare const AtomDefinitionSchema: GenMessage<AtomDefinition>;
/** /**
* @generated from message camino.Ref * @generated from message camino.AtomConformance
*/ */
export type Ref = Message<"camino.Ref"> & { export type AtomConformance = Message<"camino.AtomConformance"> & {
/** /**
* @generated from field: string object_id = 1; * @generated from field: string atom_id = 1;
*/ */
objectId: string; atomId: string;
/**
* @generated from field: string interface_revision_id = 2;
*/
interfaceRevisionId: string;
/**
* @generated from field: string conformance_id = 3;
*/
conformanceId: string;
}; };
/** /**
* Describes the message camino.Ref. * Describes the message camino.AtomConformance.
* Use `create(RefSchema)` to create a new message. * Use `create(AtomConformanceSchema)` to create a new message.
*/ */
export declare const RefSchema: GenMessage<Ref>; export declare const AtomConformanceSchema: GenMessage<AtomConformance>;
/** /**
* @generated from message camino.CustomField * @generated from message camino.StateAttachment
*/ */
export type CustomField = Message<"camino.CustomField"> & {}; export type StateAttachment = Message<"camino.StateAttachment"> & {
/**
* Describes the message camino.CustomField.
* Use `create(CustomFieldSchema)` to create a new message.
*/
export declare const CustomFieldSchema: GenMessage<CustomField>;
/**
* @generated from message camino.WatchStartResult
*/
export type WatchStartResult = Message<"camino.WatchStartResult"> & {
/** /**
* @generated from field: string watch_id = 1; * @generated from field: string slot_id = 1;
*/ */
watchId: string; slotId: string;
/**
* @generated from field: string attached_atom_id = 2;
*/
attachedAtomId: string;
/**
* @generated from field: string display_name = 3;
*/
displayName: string;
/**
* @generated from field: string value_type_json = 4;
*/
valueTypeJson: string;
/**
* @generated from field: string storage_policy_json = 5;
*/
storagePolicyJson: string;
/**
* @generated from field: string default_value_json = 6;
*/
defaultValueJson: string;
/**
* @generated from field: string owner_conformance_id = 7;
*/
ownerConformanceId: string;
}; };
/** /**
* Describes the message camino.WatchStartResult. * Describes the message camino.StateAttachment.
* Use `create(WatchStartResultSchema)` to create a new message. * Use `create(StateAttachmentSchema)` to create a new message.
*/ */
export declare const WatchStartResultSchema: GenMessage<WatchStartResult>; export declare const StateAttachmentSchema: GenMessage<StateAttachment>;
/** /**
* @generated from message camino.WatchStopRequest * @generated from message camino.EndpointConstraint
*/ */
export type WatchStopRequest = Message<"camino.WatchStopRequest"> & { export type EndpointConstraint = Message<"camino.EndpointConstraint"> & {
/** /**
* @generated from field: string watch_id = 1; * @generated from oneof camino.EndpointConstraint.kind
*/ */
watchId: string; kind: {
/**
* @generated from field: string atom_id = 1;
*/
value: string;
case: "atomId";
} | {
/**
* @generated from field: string interface_revision_id = 2;
*/
value: string;
case: "interfaceRevisionId";
} | {
case: undefined;
value?: undefined;
};
}; };
/** /**
* Describes the message camino.WatchStopRequest. * Describes the message camino.EndpointConstraint.
* Use `create(WatchStopRequestSchema)` to create a new message. * Use `create(EndpointConstraintSchema)` to create a new message.
*/ */
export declare const WatchStopRequestSchema: GenMessage<WatchStopRequest>; export declare const EndpointConstraintSchema: GenMessage<EndpointConstraint>;
/** /**
* @generated from message camino.WatchStopResult * @generated from message camino.EdgeEndpoint
*/ */
export type WatchStopResult = Message<"camino.WatchStopResult"> & {}; export type EdgeEndpoint = Message<"camino.EdgeEndpoint"> & {
/**
* Describes the message camino.WatchStopResult.
* Use `create(WatchStopResultSchema)` to create a new message.
*/
export declare const WatchStopResultSchema: GenMessage<WatchStopResult>;
/**
* @generated from message camino.CrdtText
*/
export type CrdtText = Message<"camino.CrdtText"> & {
/** /**
* @generated from field: bytes payload = 1; * @generated from field: string projection_id = 1;
*/ */
payload: Uint8Array; projectionId: string;
};
/**
* Describes the message camino.CrdtText.
* Use `create(CrdtTextSchema)` to create a new message.
*/
export declare const CrdtTextSchema: GenMessage<CrdtText>;
/**
* @generated from message camino.CrdtRichText
*/
export type CrdtRichText = Message<"camino.CrdtRichText"> & {
/** /**
* @generated from field: bytes payload = 1; * @generated from field: string display_name = 2;
*/ */
payload: Uint8Array; displayName: string;
};
/**
* Describes the message camino.CrdtRichText.
* Use `create(CrdtRichTextSchema)` to create a new message.
*/
export declare const CrdtRichTextSchema: GenMessage<CrdtRichText>;
/**
* @generated from message camino.CrdtJson
*/
export type CrdtJson = Message<"camino.CrdtJson"> & {
/** /**
* @generated from field: bytes payload = 1; * @generated from field: camino.EndpointConstraint constraint = 3;
*/ */
payload: Uint8Array; constraint?: EndpointConstraint | undefined;
};
/**
* Describes the message camino.CrdtJson.
* Use `create(CrdtJsonSchema)` to create a new message.
*/
export declare const CrdtJsonSchema: GenMessage<CrdtJson>;
/**
* @generated from message camino.ClassSchema
*/
export type ClassSchema = Message<"camino.ClassSchema"> & {
/**
* @generated from field: camino.SymbolRef id = 1;
*/
id?: SymbolRef | undefined;
/**
* @generated from field: uint32 version = 2;
*/
version: number;
/**
* @generated from field: repeated camino.FieldSchema fields = 3;
*/
fields: FieldSchema[];
/**
* @generated from field: repeated camino.EdgeSchema edges = 4;
*/
edges: EdgeSchema[];
/**
* @generated from field: repeated camino.MethodSchema methods = 5;
*/
methods: MethodSchema[];
/**
* @generated from field: repeated camino.MigrationSpec migrations = 6;
*/
migrations: MigrationSpec[];
/**
* @generated from field: string source_file = 7;
*/
sourceFile: string;
/**
* @generated from field: string proto_message = 8;
*/
protoMessage: string;
/**
* @generated from field: repeated camino.OperationServiceSchema operation_services = 9;
*/
operationServices: OperationServiceSchema[];
/**
* @generated from field: repeated camino.InterfaceImplementationSchema implements = 10;
*/
implements: InterfaceImplementationSchema[];
/**
* @generated from field: camino.ConstructorSpec constructor = 11;
*/
constructor$?: ConstructorSpec | undefined;
};
/**
* Describes the message camino.ClassSchema.
* Use `create(ClassSchemaSchema)` to create a new message.
*/
export declare const ClassSchemaSchema: GenMessage<ClassSchema>;
/**
* @generated from message camino.FieldSchema
*/
export type FieldSchema = Message<"camino.FieldSchema"> & {
/**
* @generated from field: string name = 1;
*/
name: string;
/**
* @generated from field: uint32 tag = 2;
*/
tag: number;
/**
* @generated from field: camino.TypeRef type = 3;
*/
type?: TypeRef | undefined;
/**
* @generated from field: camino.ConflictStrategy conflict = 4;
*/
conflict: ConflictStrategy;
/**
* @generated from field: bool repeated = 5;
*/
repeated: boolean;
/**
* @generated from field: bool optional = 6;
*/
optional: boolean;
/**
* @generated from field: camino.FieldStorage storage = 7;
*/
storage?: FieldStorage | undefined;
/**
* @generated from field: camino.FieldOps ops = 8;
*/
ops?: FieldOps | undefined;
/**
* @generated from field: camino.InterfaceFieldContract interface_contract = 9;
*/
interfaceContract?: InterfaceFieldContract | undefined;
/**
* @generated from field: bool is_display_label = 10;
*/
isDisplayLabel: boolean;
};
/**
* Describes the message camino.FieldSchema.
* Use `create(FieldSchemaSchema)` to create a new message.
*/
export declare const FieldSchemaSchema: GenMessage<FieldSchema>;
/**
* @generated from message camino.FieldStorage
*/
export type FieldStorage = Message<"camino.FieldStorage"> & {
/**
* @generated from field: camino.FieldStorageKind kind = 1;
*/
kind: FieldStorageKind;
/**
* @generated from field: quixos.FunctionRef resolver = 2;
*/
resolver?: FunctionRef | undefined;
/**
* @generated from field: bool cache = 3;
*/
cache: boolean;
};
/**
* Describes the message camino.FieldStorage.
* Use `create(FieldStorageSchema)` to create a new message.
*/
export declare const FieldStorageSchema: GenMessage<FieldStorage>;
/**
* @generated from message camino.TypeRef
*/
export type TypeRef = Message<"camino.TypeRef"> & {
/**
* @generated from field: string proto_type = 1;
*/
protoType: string;
/**
* @generated from field: camino.SymbolRef symbol = 2;
*/
symbol?: SymbolRef | undefined;
};
/**
* Describes the message camino.TypeRef.
* Use `create(TypeRefSchema)` to create a new message.
*/
export declare const TypeRefSchema: GenMessage<TypeRef>;
/**
* @generated from message camino.TypeBinding
*/
export type TypeBinding = Message<"camino.TypeBinding"> & {
/**
* @generated from field: string name = 1;
*/
name: string;
/**
* @generated from field: camino.TypeRef type = 2;
*/
type?: TypeRef | undefined;
};
/**
* Describes the message camino.TypeBinding.
* Use `create(TypeBindingSchema)` to create a new message.
*/
export declare const TypeBindingSchema: GenMessage<TypeBinding>;
/**
* @generated from message camino.InterfaceFieldContract
*/
export type InterfaceFieldContract = Message<"camino.InterfaceFieldContract"> & {
/**
* @generated from field: bool required = 1;
*/
required: boolean;
/**
* @generated from field: bool readable = 2;
*/
readable: boolean;
/**
* @generated from field: bool writable = 3;
*/
writable: boolean;
/**
* @generated from field: bool watchable = 4;
*/
watchable: boolean;
/**
* @generated from field: string type_param = 5;
*/
typeParam: string;
/**
* @generated from field: camino.TypeRef type = 6;
*/
type?: TypeRef | undefined;
};
/**
* Describes the message camino.InterfaceFieldContract.
* Use `create(InterfaceFieldContractSchema)` to create a new message.
*/
export declare const InterfaceFieldContractSchema: GenMessage<InterfaceFieldContract>;
/**
* @generated from message camino.InterfaceImplementationSchema
*/
export type InterfaceImplementationSchema = Message<"camino.InterfaceImplementationSchema"> & {
/**
* @generated from field: camino.SymbolRef interface = 1;
*/
interface?: SymbolRef | undefined;
/**
* @generated from field: repeated camino.TypeBinding type_bindings = 2;
*/
typeBindings: TypeBinding[];
};
/**
* Describes the message camino.InterfaceImplementationSchema.
* Use `create(InterfaceImplementationSchemaSchema)` to create a new message.
*/
export declare const InterfaceImplementationSchemaSchema: GenMessage<InterfaceImplementationSchema>;
/**
* @generated from message camino.InterfaceSchema
*/
export type InterfaceSchema = Message<"camino.InterfaceSchema"> & {
/**
* @generated from field: camino.SymbolRef id = 1;
*/
id?: SymbolRef | undefined;
/**
* @generated from field: uint32 version = 2;
*/
version: number;
/**
* @generated from field: repeated camino.FieldSchema fields = 3;
*/
fields: FieldSchema[];
/**
* @generated from field: string source_file = 4;
*/
sourceFile: string;
/**
* @generated from field: string proto_message = 5;
*/
protoMessage: string;
};
/**
* Describes the message camino.InterfaceSchema.
* Use `create(InterfaceSchemaSchema)` to create a new message.
*/
export declare const InterfaceSchemaSchema: GenMessage<InterfaceSchema>;
/**
* @generated from message camino.FieldOps
*/
export type FieldOps = Message<"camino.FieldOps"> & {
/**
* @generated from field: camino.FieldImplementation implementation = 1;
*/
implementation: FieldImplementation;
/**
* @generated from field: string service = 2;
*/
service: string;
};
/**
* Describes the message camino.FieldOps.
* Use `create(FieldOpsSchema)` to create a new message.
*/
export declare const FieldOpsSchema: GenMessage<FieldOps>;
/**
* @generated from message camino.EdgeSchema
*/
export type EdgeSchema = Message<"camino.EdgeSchema"> & {
/**
* @generated from field: camino.SymbolRef id = 1;
*/
id?: SymbolRef | undefined;
/**
* Legacy/source-side projection fields. Prefer from_endpoint/to_endpoint.
*
* @generated from field: string source_field = 2;
*/
sourceField: string;
/**
* @generated from field: camino.SymbolRef from_class = 3;
*/
fromClass?: SymbolRef | undefined;
/**
* @generated from field: camino.SymbolRef to_class = 4;
*/
toClass?: SymbolRef | undefined;
/**
* @generated from field: camino.Cardinality cardinality = 5;
*/
cardinality: Cardinality;
/**
* @generated from field: string inverse = 6;
*/
inverse: string;
/**
* @generated from field: repeated camino.FieldSchema fields = 7;
*/
fields: FieldSchema[];
/**
* @generated from field: camino.EdgeEndpointSchema from_endpoint = 8;
*/
fromEndpoint?: EdgeEndpointSchema | undefined;
/**
* @generated from field: camino.EdgeEndpointSchema to_endpoint = 9;
*/
toEndpoint?: EdgeEndpointSchema | undefined;
/**
* @generated from field: camino.SymbolRef declaring_class = 10;
*/
declaringClass?: SymbolRef | undefined;
/**
* @generated from field: repeated camino.SymbolRef tags = 11;
*/
tags: SymbolRef[];
/**
* @generated from field: repeated camino.SymbolRef implements = 12;
*/
implements: SymbolRef[];
/**
* @generated from field: bool undirected = 13;
*/
undirected: boolean;
};
/**
* Describes the message camino.EdgeSchema.
* Use `create(EdgeSchemaSchema)` to create a new message.
*/
export declare const EdgeSchemaSchema: GenMessage<EdgeSchema>;
/**
* @generated from message camino.EdgeEndpointSchema
*/
export type EdgeEndpointSchema = Message<"camino.EdgeEndpointSchema"> & {
/**
* @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; * @generated from field: camino.Cardinality cardinality = 4;
*/ */
cardinality: Cardinality; cardinality: Cardinality;
/** /**
* @generated from field: bool indexed = 5; * @generated from field: bool ordered = 5;
*/ */
indexed: boolean; ordered: boolean;
/** /**
* @generated from field: camino.EdgeMaterialization materialize = 6; * Empty means restrict. Direction is the endpoint being deleted.
*
* @generated from field: string on_delete = 6;
*/ */
materialize?: EdgeMaterialization | undefined; onDelete: string;
/**
* @generated from field: bool retain_other = 7;
*/
retainOther: boolean;
/**
* Empty for sets/lists, otherwise string, boolean, or int64 map keys.
*
* @generated from field: string key_type = 8;
*/
keyType: string;
/**
* Explicit read-only dependency injection traversal, not mutation authority.
*
* @generated from field: bool public_traversal = 9;
*/
publicTraversal: boolean;
}; };
/** /**
* Describes the message camino.EdgeEndpointSchema. * Describes the message camino.EdgeEndpoint.
* Use `create(EdgeEndpointSchemaSchema)` to create a new message. * Use `create(EdgeEndpointSchema)` to create a new message.
*/ */
export declare const EdgeEndpointSchemaSchema: GenMessage<EdgeEndpointSchema>; export declare const EdgeEndpointSchema: GenMessage<EdgeEndpoint>;
/** /**
* @generated from message camino.EdgeMaterialization * @generated from message camino.EdgeAttachment
*/ */
export type EdgeMaterialization = Message<"camino.EdgeMaterialization"> & { export type EdgeAttachment = Message<"camino.EdgeAttachment"> & {
/** /**
* @generated from field: camino.SymbolRef class = 1; * @generated from field: string edge_type_id = 1;
*/ */
class?: SymbolRef | undefined; edgeTypeId: string;
/** /**
* @generated from field: string connect_projection = 2; * @generated from field: string display_name = 2;
*/ */
connectProjection: string; displayName: string;
/**
* @generated from field: camino.EdgeEndpoint first = 3;
*/
first?: EdgeEndpoint | undefined;
/**
* @generated from field: camino.EdgeEndpoint second = 4;
*/
second?: EdgeEndpoint | undefined;
/**
* @generated from field: string owner_conformance_id = 5;
*/
ownerConformanceId: string;
}; };
/** /**
* Describes the message camino.EdgeMaterialization. * Describes the message camino.EdgeAttachment.
* Use `create(EdgeMaterializationSchema)` to create a new message. * Use `create(EdgeAttachmentSchema)` to create a new message.
*/ */
export declare const EdgeMaterializationSchema: GenMessage<EdgeMaterialization>; export declare const EdgeAttachmentSchema: GenMessage<EdgeAttachment>;
/** /**
* @generated from message camino.MethodSchema * Camino consumes this persistence-only projection of a checked workspace.
* Interfaces, operation bindings, packages, and constructors stay in orch.
*
* @generated from message camino.PersistencePlan
*/ */
export type MethodSchema = Message<"camino.MethodSchema"> & { export type PersistencePlan = Message<"camino.PersistencePlan"> & {
/** /**
* @generated from field: string name = 1; * @generated from field: string workspace_id = 1;
*/ */
name: string; workspaceId: string;
/** /**
* @generated from field: quixos.FunctionRef function = 2; * @generated from field: string workspace_revision_id = 2;
*/ */
function?: FunctionRef | undefined; workspaceRevisionId: string;
/**
* @generated from field: repeated camino.AtomDefinition atoms = 3;
*/
atoms: AtomDefinition[];
/**
* @generated from field: repeated camino.AtomConformance conformances = 4;
*/
conformances: AtomConformance[];
/**
* @generated from field: repeated camino.StateAttachment states = 5;
*/
states: StateAttachment[];
/**
* @generated from field: repeated camino.EdgeAttachment edges = 6;
*/
edges: EdgeAttachment[];
}; };
/** /**
* Describes the message camino.MethodSchema. * Describes the message camino.PersistencePlan.
* Use `create(MethodSchemaSchema)` to create a new message. * Use `create(PersistencePlanSchema)` to create a new message.
*/ */
export declare const MethodSchemaSchema: GenMessage<MethodSchema>; export declare const PersistencePlanSchema: GenMessage<PersistencePlan>;
/**
* @generated from message camino.MigrationSpec
*/
export type MigrationSpec = Message<"camino.MigrationSpec"> & {
/**
* @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.MigrationSpec.
* Use `create(MigrationSpecSchema)` to create a new message.
*/
export declare const MigrationSpecSchema: GenMessage<MigrationSpec>;
/**
* @generated from message camino.ConstructorSpec
*/
export type ConstructorSpec = Message<"camino.ConstructorSpec"> & {
/**
* @generated from field: quixos.FunctionRef function = 1;
*/
function?: FunctionRef | undefined;
};
/**
* Describes the message camino.ConstructorSpec.
* Use `create(ConstructorSpecSchema)` to create a new message.
*/
export declare const ConstructorSpecSchema: GenMessage<ConstructorSpec>;
/**
* @generated from message camino.OperationSchema
*/
export type OperationSchema = Message<"camino.OperationSchema"> & {
/**
* @generated from field: string name = 1;
*/
name: string;
/**
* @generated from field: camino.TypeRef input_type = 2;
*/
inputType?: TypeRef | undefined;
/**
* @generated from field: camino.TypeRef output_type = 3;
*/
outputType?: TypeRef | undefined;
/**
* @generated from field: quixos.FunctionRef function = 4;
*/
function?: FunctionRef | undefined;
};
/**
* Describes the message camino.OperationSchema.
* Use `create(OperationSchemaSchema)` to create a new message.
*/
export declare const OperationSchemaSchema: GenMessage<OperationSchema>;
/**
* @generated from message camino.OperationServiceSchema
*/
export type OperationServiceSchema = Message<"camino.OperationServiceSchema"> & {
/**
* @generated from field: string name = 1;
*/
name: string;
/**
* @generated from field: string full_name = 2;
*/
fullName: string;
/**
* @generated from field: repeated camino.OperationSchema operations = 3;
*/
operations: OperationSchema[];
};
/**
* Describes the message camino.OperationServiceSchema.
* Use `create(OperationServiceSchemaSchema)` to create a new message.
*/
export declare const OperationServiceSchemaSchema: GenMessage<OperationServiceSchema>;
/**
* @generated from message camino.DocRefDeclaration
*/
export type DocRefDeclaration = Message<"camino.DocRefDeclaration"> & {
/**
* @generated from field: string local_name = 1;
*/
localName: string;
/**
* @generated from field: camino.SymbolRef type = 2;
*/
type?: SymbolRef | undefined;
/**
* @generated from field: camino.SymbolRef target_class = 3;
*/
targetClass?: SymbolRef | undefined;
/**
* @generated from field: camino.DocRefStrength strength = 4;
*/
strength: DocRefStrength;
};
/**
* Describes the message camino.DocRefDeclaration.
* Use `create(DocRefDeclarationSchema)` to create a new message.
*/
export declare const DocRefDeclarationSchema: GenMessage<DocRefDeclaration>;
/**
* @generated from enum camino.ConflictStrategy
*/
export declare enum ConflictStrategy {
/**
* @generated from enum value: CONFLICT_STRATEGY_UNSPECIFIED = 0;
*/
CONFLICT_STRATEGY_UNSPECIFIED = 0,
/**
* @generated from enum value: REPLACE = 1;
*/
REPLACE = 1,
/**
* @generated from enum value: PRESERVE_CONFLICTS = 2;
*/
PRESERVE_CONFLICTS = 2,
/**
* @generated from enum value: CRDT = 3;
*/
CRDT = 3
}
/**
* Describes the enum camino.ConflictStrategy.
*/
export declare const ConflictStrategySchema: GenEnum<ConflictStrategy>;
/** /**
* @generated from enum camino.Cardinality * @generated from enum camino.Cardinality
*/ */
@@ -687,89 +253,10 @@ export declare enum Cardinality {
/** /**
* @generated from enum value: MANY_UNIQUE = 4; * @generated from enum value: MANY_UNIQUE = 4;
*/ */
MANY_UNIQUE = 4, MANY_UNIQUE = 4
/**
* @generated from enum value: MANY_ORDERED = 5;
*/
MANY_ORDERED = 5,
/**
* @generated from enum value: MANY_UNIQUE_ORDERED = 6;
*/
MANY_UNIQUE_ORDERED = 6
} }
/** /**
* Describes the enum camino.Cardinality. * Describes the enum camino.Cardinality.
*/ */
export declare const CardinalitySchema: GenEnum<Cardinality>; export declare const CardinalitySchema: GenEnum<Cardinality>;
/**
* @generated from enum camino.DocRefStrength
*/
export declare enum DocRefStrength {
/**
* @generated from enum value: DOC_REF_STRENGTH_UNSPECIFIED = 0;
*/
DOC_REF_STRENGTH_UNSPECIFIED = 0,
/**
* @generated from enum value: SOFT_REF = 1;
*/
SOFT_REF = 1,
/**
* @generated from enum value: PROJECTED_EDGE = 2;
*/
PROJECTED_EDGE = 2
}
/**
* Describes the enum camino.DocRefStrength.
*/
export declare const DocRefStrengthSchema: GenEnum<DocRefStrength>;
/**
* @generated from enum camino.FieldStorageKind
*/
export declare enum FieldStorageKind {
/**
* @generated from enum value: FIELD_STORAGE_KIND_UNSPECIFIED = 0;
*/
FIELD_STORAGE_KIND_UNSPECIFIED = 0,
/**
* @generated from enum value: STORED = 1;
*/
STORED = 1,
/**
* @generated from enum value: DERIVED = 2;
*/
DERIVED = 2,
/**
* @generated from enum value: LAZY = 3;
*/
LAZY = 3,
/**
* @generated from enum value: EXTERNAL = 4;
*/
EXTERNAL = 4,
/**
* @generated from enum value: STATIC_FINAL = 5;
*/
STATIC_FINAL = 5
}
/**
* Describes the enum camino.FieldStorageKind.
*/
export declare const FieldStorageKindSchema: GenEnum<FieldStorageKind>;
/**
* @generated from enum camino.FieldImplementation
*/
export declare enum FieldImplementation {
/**
* @generated from enum value: FIELD_IMPLEMENTATION_UNSPECIFIED = 0;
*/
FIELD_IMPLEMENTATION_UNSPECIFIED = 0,
/**
* @generated from enum value: SERVICE = 1;
*/
SERVICE = 1
}
/**
* Describes the enum camino.FieldImplementation.
*/
export declare const FieldImplementationSchema: GenEnum<FieldImplementation>;
//# sourceMappingURL=schema_pb.d.ts.map //# sourceMappingURL=schema_pb.d.ts.map
+1 -1
View File
File diff suppressed because one or more lines are too long
+23 -232
View File
File diff suppressed because one or more lines are too long
-3
View File
@@ -1,3 +0,0 @@
#!/usr/bin/env node
export {};
//# sourceMappingURL=codegen-ts-runtime.d.ts.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"codegen-ts-runtime.d.ts","sourceRoot":"","sources":["../src/codegen-ts-runtime.ts"],"names":[],"mappings":""}
-299
View File
@@ -1,299 +0,0 @@
#!/usr/bin/env node
import fs from "node:fs";
import path from "node:path";
import { compileCaminoSchema } from "./schema-compiler.js";
const usage = () => {
console.error("Usage: camino-codegen-ts-runtime <class-schema.camino.proto> <out-dir> [implementation-import]");
process.exit(1);
};
const required = (value) => value ?? usage();
const stringLiteral = (value) => JSON.stringify(value);
const upperFirst = (value) => value.length === 0 ? value : `${value[0]?.toUpperCase()}${value.slice(1)}`;
const lowerFirst = (value) => value.length === 0 ? value : `${value[0]?.toLowerCase()}${value.slice(1)}`;
const camel = (value) => value
.split(/[^a-zA-Z0-9]+/)
.filter(Boolean)
.map((part, index) => index === 0 ? lowerFirst(part) : upperFirst(lowerFirst(part)))
.join("");
const isIdentifier = (value) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);
const classId = (schema) => `${schema.id.namespace}:${schema.id.name}:${schema.id.version}:${schema.id.hash ?? ""}`;
const symbolId = (value) => `${value.namespace}:${value.name}:${value.version}:${value.hash ?? ""}`;
const tsTypeForTypeRef = (type) => {
if (type.enumValues && type.enumValues.length > 0) {
return type.enumValues.map(stringLiteral).join(" | ");
}
switch (type.protoType.replace(/^\./, "")) {
case "string":
case "google.protobuf.StringValue":
return "string";
case "bool":
case "google.protobuf.BoolValue":
return "boolean";
case "double":
case "float":
case "google.protobuf.DoubleValue":
case "google.protobuf.FloatValue":
case "int32":
case "sint32":
case "sfixed32":
case "uint32":
case "fixed32":
case "int64":
case "sint64":
case "sfixed64":
case "uint64":
case "fixed64":
case "google.protobuf.Int32Value":
case "google.protobuf.UInt32Value":
case "google.protobuf.Int64Value":
case "google.protobuf.UInt64Value":
return "number";
case "bytes":
case "google.protobuf.BytesValue":
return "Uint8Array";
default:
return "unknown";
}
};
const tsTypeForField = (field) => tsTypeForTypeRef(field.type);
const tsValueTypeForField = (field) => field.repeated ? `${tsTypeForField(field)}[]` : tsTypeForField(field);
const tsFieldApiType = (field) => field.conflict === "crdt"
? `CrdtField<${tsValueTypeForField(field)}>`
: `Field<${tsValueTypeForField(field)}>`;
const functionExportName = (fn, fallback) => {
if (isIdentifier(fn.symbol)) {
return fn.symbol;
}
const fallbackName = camel(fallback);
if (isIdentifier(fallbackName)) {
return fallbackName;
}
throw new Error(`Cannot generate TS export name for function ${fn.symbol}`);
};
const generatedWarning = `// @generated by camino-codegen-ts-runtime. Do not edit.\n`;
const fieldTypeId = (field) => field.type.symbol ? symbolId(field.type.symbol) : field.type.protoType;
const crdtStorageTypeId = (field) => field.type.protoType ||
(field.type.symbol
? `${field.type.symbol.namespace}.${field.type.symbol.name}`
: fieldTypeId(field));
const fieldStorageId = (field) => field.ops && field.storage.kind === "stored" ? "derived" : field.storage.kind;
const interfaceTypeName = (implementation) => `${implementation.interface.name}Ref`;
const renderInterfaceRefTypes = (schema) => schema.implements
.map((implementation) => {
const typeParams = implementation.typeBindings.map((binding) => binding.name);
const generic = typeParams.length > 0 ? `<${typeParams.join(", ")}>` : "";
const bindings = typeParams.length > 0
? typeParams
.map((param) => ` readonly ${param}: ${param};`)
.join("\n")
: " readonly value: unknown;";
return `export type ${interfaceTypeName(implementation)}${generic} = ObjectRef<string> & {
readonly $caminoInterfaces: {
readonly ${stringLiteral(symbolId(implementation.interface))}: {
${bindings}
};
};
};`;
})
.join("\n\n");
const interfaceMixins = (schema) => schema.implements.map((implementation) => {
const typeArgs = implementation.typeBindings.map((binding) => tsTypeForTypeRef(binding.type));
return `${interfaceTypeName(implementation)}${typeArgs.length > 0 ? `<${typeArgs.join(", ")}>` : ""}`;
});
const operationFunctionSpecs = (schema) => schema.fields.flatMap((field) => {
const serviceName = field.ops?.service.replace(/^\./, "");
if (!serviceName) {
return [];
}
const service = schema.operationServices.find((candidate) => candidate.fullName === serviceName);
if (!service) {
throw new Error(`${schema.id.name}.${field.name} points to missing operation service ${field.ops?.service}`);
}
return service.operations.map((operation) => ({
exportName: functionExportName(operation.function, `${field.name}_${operation.name}`),
symbol: operation.function.symbol,
...(operation.function.operation
? { operation: operation.function.operation }
: {}),
packageNamespace: operation.function.packageNamespace,
packageName: operation.function.packageName,
field: {
name: field.name,
type: fieldTypeId(field),
storage: fieldStorageId(field),
conflict: field.conflict,
},
}));
});
const renderRuntime = (schema) => {
const className = schema.id.name;
const objectTypeName = `${className}Object`;
const refTypeName = `${className}Ref`;
const contextTypeName = `${className}Context`;
const implementationTypeName = `${className}Implementation`;
const serveName = `serve${className}Runtime`;
const createObjectName = `create${className}Object`;
const interfaceRefTypes = renderInterfaceRefTypes(schema);
const refType = [`ObjectRef<${stringLiteral(classId(schema))}>`, ...interfaceMixins(schema)]
.join(" & ");
const edgeFields = new Set(schema.edges.map((edge) => edge.sourceField));
const writableFields = schema.fields.filter((field) => field.storage.kind === "stored" &&
!field.ops &&
!edgeFields.has(field.name));
const functionSpecs = [
...(schema.constructorSpec
? [
{
exportName: functionExportName(schema.constructorSpec.function, "constructor"),
symbol: schema.constructorSpec.function.symbol,
...(schema.constructorSpec.function.operation
? { operation: schema.constructorSpec.function.operation }
: {}),
packageNamespace: schema.constructorSpec.function.packageNamespace,
packageName: schema.constructorSpec.function.packageName,
},
]
: []),
...schema.methods.map((method) => ({
exportName: functionExportName(method.function, method.name),
symbol: method.function.symbol,
...(method.function.operation ? { operation: method.function.operation } : {}),
packageNamespace: method.function.packageNamespace,
packageName: method.function.packageName,
})),
...schema.fields.flatMap((field) => field.storage.resolver
? [
{
exportName: functionExportName(field.storage.resolver, field.name),
symbol: field.storage.resolver.symbol,
...(field.storage.resolver.operation
? { operation: field.storage.resolver.operation }
: {}),
packageNamespace: field.storage.resolver.packageNamespace,
packageName: field.storage.resolver.packageName,
},
]
: []),
...operationFunctionSpecs(schema),
];
const firstFunction = functionSpecs[0];
if (!firstFunction) {
throw new Error(`${schema.id.name} has no runtime functions to generate`);
}
const mixedPackage = functionSpecs.find((spec) => spec.packageNamespace !== firstFunction.packageNamespace ||
spec.packageName !== firstFunction.packageName);
if (mixedPackage) {
throw new Error(`${schema.id.name} points to multiple packages; v0 TS runtime generation expects one package`);
}
return `${generatedWarning}import {
type CaminoClient,
createCrdtField,
createField,
type CrdtField,
type Field,
type FieldOperation,
type InvokeRequest,
objectRef,
type ObjectRef,
type RuntimeHandler,
serveQuixosPackageRuntime,
} from "@quixos/camino-package-runtime";
${interfaceRefTypes ? `${interfaceRefTypes}\n\n` : ""}export type ${refTypeName} = ${refType};
export type ${objectTypeName} = {
id: ${refTypeName};
${writableFields
.map((field) => ` ${camel(field.name)}: ${tsFieldApiType(field)};`)
.join("\n")}
};
export type ${contextTypeName} = {
object: ${objectTypeName};
camino: CaminoClient;
request: InvokeRequest;
};
export type ${implementationTypeName} = {
${functionSpecs
.map((spec) => spec.operation
? ` ${spec.exportName}: FieldOperation<${contextTypeName}>;`
: ` ${spec.exportName}: RuntimeHandler<${contextTypeName}>;`)
.filter((line, index, lines) => lines.indexOf(line) === index)
.join("\n")}
};
const packageNamespace = ${stringLiteral(firstFunction.packageNamespace)};
const packageName = ${stringLiteral(firstFunction.packageName)};
const runtimeProtocolVersion = ${stringLiteral("camino-orch-v0")};
const functions = [
${functionSpecs
.map((spec) => ` { exportName: ${stringLiteral(spec.exportName)}, symbol: ${stringLiteral(spec.symbol)}${spec.operation ? `, operation: ${stringLiteral(spec.operation)}` : ""}${spec.field
? `, field: { name: ${stringLiteral(spec.field.name)}, type: ${stringLiteral(spec.field.type)}, storage: ${stringLiteral(spec.field.storage)}, conflict: ${stringLiteral(spec.field.conflict)} }`
: ""} },`)
.join("\n")}
] as const;
export const ${createObjectName} = (
camino: CaminoClient,
objectId: string,
): ${objectTypeName} => {
const id = objectRef<${stringLiteral(classId(schema))}>(objectId) as ${refTypeName};
return {
id,
${writableFields
.map((fieldSchema) => fieldSchema.conflict === "crdt"
? ` ${camel(fieldSchema.name)}: createCrdtField(camino, id, ${stringLiteral(fieldSchema.name)}, ${stringLiteral(crdtStorageTypeId(fieldSchema))}),`
: ` ${camel(fieldSchema.name)}: createField(camino, id, ${stringLiteral(fieldSchema.name)}),`)
.join("\n")}
};
};
export const create${className}Context = (
camino: CaminoClient,
request: InvokeRequest,
): ${contextTypeName} => ({
object: ${createObjectName}(camino, request.objectId),
camino,
request,
});
export const ${serveName} = (implementation: ${implementationTypeName}) => {
serveQuixosPackageRuntime({
packageNamespace,
packageName,
runtimeProtocolVersion,
functions,
implementation,
createContext: create${className}Context,
});
};
`;
};
const renderServer = (schema, implementationImport) => {
const className = schema.id.name;
return `${generatedWarning}import * as implementation from ${stringLiteral(implementationImport)};
import { serve${className}Runtime } from "./${schema.id.namespace}.${className}.runtime.js";
serve${className}Runtime(implementation);
`;
};
const main = async () => {
const sourceFile = required(process.argv[2]);
const outDir = required(process.argv[3]);
const implementationImport = process.argv[4] ?? "../task.impl.js";
const compiled = await compileCaminoSchema(sourceFile);
if (compiled.classes.length !== 1) {
throw new Error(`Expected exactly one Camino class in ${sourceFile}, found ${compiled.classes.length}`);
}
const schema = compiled.classes[0];
if (!schema) {
throw new Error(`No Camino class found in ${sourceFile}`);
}
fs.mkdirSync(outDir, { recursive: true });
const baseName = `${schema.id.namespace}.${schema.id.name}`;
fs.writeFileSync(path.join(outDir, `${baseName}.runtime.ts`), renderRuntime(schema));
fs.writeFileSync(path.join(outDir, `${baseName}.server.ts`), renderServer(schema, implementationImport));
};
await main();
+97 -97
View File
@@ -1,110 +1,110 @@
import { type Client } from "@connectrpc/connect"; import http from "node:http";
import { type CaminoAutomergeDoc } from "@quixos/camino-datatypes/crdt-automerge"; import { type QxObjectRef } from "./references.js";
export * from "./bindings.js";
export { relationshipMap, relationshipList, relationshipSet } from "./relationships.js";
export { createMigrationContext, migrationObjectId, serveMigration, type MigrationContext, type MigrationInput, type MigrationOutput, type MigrationEdge } from "./migration.js";
import { type Client, type ConnectRouter } from "@connectrpc/connect";
import { CaminoService, type Value } from "./camino/api_pb.js"; import { CaminoService, type Value } from "./camino/api_pb.js";
import { type InvokeRequest } from "./quixos/runtime_pb.js"; import { OrchestratorRuntime } from "./quixos/orch_pb.js";
declare const objectRefBrand: unique symbol;
export type ObjectRef<ClassId extends string> = string & {
readonly [objectRefBrand]: ClassId;
};
export type CaminoClient = Client<typeof CaminoService>; export type CaminoClient = Client<typeof CaminoService>;
export type { InvokeRequest, Value }; export type OrchClient = Client<typeof OrchestratorRuntime>;
export type DerivedDependency = { export type RuntimeDependency = {
kind: "object"; kind: "state";
objectId: string; objectId: string;
attachmentId: string;
} | { } | {
kind: "field"; kind: "edge";
objectId: string; objectId: string;
fieldName: string; attachmentId: string;
} | { projectionId: string;
kind: "edges";
objectId: string;
sourceField?: string;
}; };
export declare const recordDerivedDependency: (dependency: DerivedDependency) => void; export declare const objectRef: (reference: QxObjectRef) => QxObjectRef<string>;
export declare const getActiveDerivedDependencies: () => DerivedDependency[]; export declare const liveValue: (value: Value) => {
export declare const runWithDerivedDependencyTracking: <T>(fn: () => Promise<T> | T) => Promise<{ $quixosValue: Value;
value: T; };
dependencies: DerivedDependency[]; export declare const jsToProtoValue: (value: unknown) => Value;
}>; export declare const protoValueToJs: (value: Value | undefined) => unknown;
export type Field<T> = { export declare const protoFieldsToJs: (fields: Record<string, Value>) => {
get(): Promise<T | undefined>; [k: string]: unknown;
};
export type StatePort<T = unknown> = {
slotId: string;
get(): Promise<T>;
live(): Promise<ReturnType<typeof liveValue>>;
set(value: T): Promise<void>; set(value: T): Promise<void>;
}; };
export type CrdtField<T> = Field<CaminoAutomergeDoc<T>> & { export type EdgePort = {
change(fn: (doc: { edgeTypeId: string;
value: T; projectionId: string;
}) => void): Promise<CaminoAutomergeDoc<T>>; resolve(): Promise<QxObjectRef[]>;
replaceFromJson(value: T): Promise<void>; connect(target: QxObjectRef): Promise<void>;
disconnect(target: QxObjectRef): Promise<void>;
collection(): Promise<RelationshipCollection>;
replace(entries: RelationshipEntry[], expectedRevision: bigint): Promise<RelationshipCollection>;
}; };
export type LiveFieldValue<T> = { export type RelationshipEntry<T extends QxObjectRef = QxObjectRef> = {
$caminoValue: T; edgeId?: string;
$caminoSource: { target: T;
field: { key?: string | boolean | bigint;
objectId: string;
fieldName: string;
fieldType?: string;
fieldStorage?: string;
conflictStrategy?: string;
revision?: number | string | bigint;
};
};
}; };
export declare const liveFieldValue: <T>(params: { export type RelationshipCollection<T extends QxObjectRef = QxObjectRef> = {
value: T; revision: bigint;
entries: RelationshipEntry<T>[];
};
export type InterfacePort = {
objectId: QxObjectRef;
interfaceRevisionId: string;
invoke(operationId: string, input?: Record<string, unknown>): Promise<unknown>;
live(operationId: string, input?: Record<string, unknown>): Promise<ReturnType<typeof liveValue>>;
};
export type ConstructorPort = {
atomId: string;
construct(input?: Record<string, unknown>): Promise<QxObjectRef>;
};
export type RuntimePort = StatePort | EdgePort | InterfacePort | ConstructorPort;
export type RuntimeContext = {
/** Cooperative cancellation. Completion is acknowledged only after the handler returns. */
signal?: AbortSignal;
openSession?: () => Promise<RuntimeSession>;
objectId: QxObjectRef;
input: Record<string, unknown>;
inputProto: Record<string, Value>;
ports: ReadonlyMap<string, RuntimePort>;
state<T = unknown>(portId: string): StatePort<T>;
edge(portId: string): EdgePort;
interface(portId: string): InterfacePort;
constructor(portId: string): ConstructorPort;
};
export type RuntimeSession = {
id: string;
run<T>(work: (context: RuntimeContext) => Promise<T>): Promise<T>;
/** Close the external resource first, then close its host retention/session. */
close(): Promise<void>;
};
export declare class RuntimeAuthorityError extends Error {
readonly retryable: boolean;
constructor(message: string);
}
export declare const createRuntimeContext: (camino: CaminoClient, orch: OrchClient, request: RuntimeRequest) => RuntimeContext;
export type RuntimeHandler = (context: RuntimeContext) => unknown | Promise<unknown>;
export type DerivedHandler = {
kind: "derived";
get: RuntimeHandler;
};
export declare const derived: (get: RuntimeHandler) => DerivedHandler;
export declare const createPackageRuntimeRoutes: (config: {
packageRevisionId: string;
exports: Record<string, RuntimeHandler | DerivedHandler>;
caminoUrl?: string;
orchUrl?: string;
}) => (router: ConnectRouter) => ConnectRouter;
export declare const servePackageRuntime: (config: {
packageRevisionId: string;
exports: Record<string, RuntimeHandler | DerivedHandler>;
}) => http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
type RuntimeRequest = {
objectId: string; objectId: string;
fieldName: string; input: Record<string, Value>;
fieldType?: string; dependencies: import("./quixos/refs_pb.js").InjectedDependency[];
fieldStorage?: string;
conflictStrategy?: string;
revision?: number | string | bigint;
}) => LiveFieldValue<T>;
export type RuntimeHandler<Context> = (context: Context) => Promise<unknown> | unknown;
export type FieldOperation<Context> = {
get?: RuntimeHandler<Context>;
set?: RuntimeHandler<Context>;
watchStart?: RuntimeHandler<Context>;
watchStop?: RuntimeHandler<Context>;
}; };
export declare const fieldOps: <Context>(operation: FieldOperation<Context>) => FieldOperation<Context>;
export declare const derivedWithDeps: <Context>(operation: {
get: RuntimeHandler<Context>;
}) => FieldOperation<Context>;
export type RuntimeFunctionSpec<ExportName extends string = string> = {
exportName: ExportName;
symbol: string;
operation?: string;
field?: {
name: string;
type?: string;
storage?: string;
conflict?: string;
};
};
type FieldCodec = {
fieldType?: string;
conflictStrategy?: string;
};
export declare const jsToProtoValue: (value: unknown, codec?: FieldCodec) => Value;
export declare const protoValueToJs: (value: Value | undefined) => unknown;
export declare const jsObjectToProtoFields: (value: Record<string, unknown>) => {
[k: string]: Value;
};
export declare const protoFieldsToJs: (fields: Record<string, Value> | undefined) => Record<string, unknown>;
export declare const canonicalFieldParams: (params: Record<string, Value> | undefined) => string;
export declare const fieldOperationKey: (params: {
objectId: string;
fieldName: string;
input?: Record<string, Value>;
}) => string;
export declare const objectRef: <ClassId extends string>(objectId: string) => ObjectRef<ClassId>;
export declare const createField: <T>(camino: CaminoClient, objectId: string, fieldName: string, codec?: FieldCodec) => Field<T>;
export declare const createCrdtField: <T>(camino: CaminoClient, objectId: string, fieldName: string, fieldType: string) => CrdtField<T>;
export declare const serveQuixosPackageRuntime: <Context, Spec extends readonly RuntimeFunctionSpec[]>(params: {
packageNamespace: string;
packageName: string;
runtimeProtocolVersion: string;
functions: Spec;
implementation: { [Name in Spec[number]["exportName"]]: RuntimeHandler<Context> | FieldOperation<Context>; };
createContext: (camino: CaminoClient, request: InvokeRequest) => Context;
}) => void;
//# sourceMappingURL=index.d.ts.map //# sourceMappingURL=index.d.ts.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,MAAM,EAGZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,yCAAyC,CAAC;AAKjD,OAAO,EACL,aAAa,EASb,KAAK,KAAK,EACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAOL,KAAK,aAAa,EAGnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAE5C,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,GAAG;IACvD,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,YAAY,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAErC,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAgCN,eAAO,MAAM,uBAAuB,GAAI,YAAY,iBAAiB,SAEpE,CAAC;AAEF,eAAO,MAAM,4BAA4B,QAAO,iBAAiB,EACb,CAAC;AAErD,eAAO,MAAM,gCAAgC,GAAU,CAAC,EACtD,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KACvB,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,YAAY,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAOzD,CAAC;AAqEF,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI;IACrB,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC9B,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG;IACxD,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE;QAAE,KAAK,EAAE,CAAC,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,eAAe,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,YAAY,EAAE,CAAC,CAAC;IAChB,aAAa,EAAE;QACb,KAAK,EAAE;YACL,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;YAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;SACrC,CAAC;KACH,CAAC;CACH,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,QAAQ;IACxC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CACrC,KAAG,cAAc,CAAC,CAAC,CAclB,CAAC;AAEH,MAAM,MAAM,cAAc,CAAC,OAAO,IAAI,CACpC,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,MAAM,MAAM,cAAc,CAAC,OAAO,IAAI;IACpC,GAAG,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,EAC9B,WAAW,cAAc,CAAC,OAAO,CAAC,KACjC,cAAc,CAAC,OAAO,CAAc,CAAC;AAExC,eAAO,MAAM,eAAe,GAAI,OAAO,EAAE,WAAW;IAClD,GAAG,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;CAC9B,KAAG,cAAc,CAAC,OAAO,CA0KzB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,UAAU,SAAS,MAAM,GAAG,MAAM,IAAI;IACpE,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC;AAuDF,KAAK,UAAU,GAAG;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAoDF,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,EAAE,QAAQ,UAAU,KAAG,KAyGnE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,KAAK,GAAG,SAAS,KAAG,OA2BzD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;CAKjE,CAAC;AAEJ,eAAO,MAAM,eAAe,GAC1B,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS,KACxC,MAAM,CAAC,MAAM,EAAE,OAAO,CAMtB,CAAC;AAiBJ,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS,WAWxC,CAAC;AAEJ,eAAO,MAAM,iBAAiB,GAAI,QAAQ;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B,WAKY,CAAC;AA4Dd,eAAO,MAAM,SAAS,GAAI,OAAO,SAAS,MAAM,EAAE,UAAU,MAAM,KACpD,SAAS,CAAC,OAAO,CAAC,CAAC;AAEjC,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,QAAQ,YAAY,EACpB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,QAAQ,UAAU,KACjB,KAAK,CAAC,CAAC,CAaR,CAAC;AAEH,eAAO,MAAM,eAAe,GAAI,CAAC,EAC/B,QAAQ,YAAY,EACpB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,WAAW,MAAM,KAChB,SAAS,CAAC,CAAC,CA0Bb,CAAC;AA+CF,eAAO,MAAM,yBAAyB,GACpC,OAAO,EACP,IAAI,SAAS,SAAS,mBAAmB,EAAE,EAC3C,QAAQ;IACR,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,cAAc,EAAE,GACb,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,GAC/B,cAAc,CAAC,OAAO,CAAC,GACvB,cAAc,CAAC,OAAO,CAAC,GAC5B,CAAC;IACF,aAAa,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC;CAC1E,SAwNA,CAAC"} {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
+524 -689
View File
File diff suppressed because it is too large Load Diff
+16
View File
@@ -0,0 +1,16 @@
/** Execution completion, not HTTP disconnection, is the drain boundary. */
export declare const createInvocationRegistry: () => {
begin(id: string): {
signal: AbortSignal;
finish(failed?: boolean): void;
};
status(id: string): {
invocationId: string;
state: string;
};
cancel(id: string): {
invocationId: string;
state: string;
};
};
//# sourceMappingURL=invocations.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"invocations.d.ts","sourceRoot":"","sources":["../src/invocations.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB;IAGjC,KAAK,KAAK,MAAM;QAOL,MAAM;QAA2B,MAAM;;IAElD,MAAM,KAAK,MAAM;QAAa,YAAY;QAAM,KAAK;;IACrD,MAAM,KAAK,MAAM;;;;CASpB,CAAC"}
+26
View File
@@ -0,0 +1,26 @@
/** Execution completion, not HTTP disconnection, is the drain boundary. */
export const createInvocationRegistry = () => {
const entries = new Map();
return {
begin(id) {
if (!id || entries.has(id))
throw new Error("Invocation ID is missing or already used; invocations are never replayed implicitly");
// Completed identities remain until process retirement. A bounded process
// may reject new work; it must not evict and accidentally replay a call.
if (entries.size >= 100_000)
throw new Error("Invocation registry full; explicit runtime retirement required");
const entry = { state: "running", controller: new AbortController() };
entries.set(id, entry);
return { signal: entry.controller.signal, finish(failed = false) { entry.state = failed ? "failed" : "completed"; } };
},
status(id) { return { invocationId: id, state: entries.get(id)?.state ?? "unknown" }; },
cancel(id) {
const entry = entries.get(id);
if (entry && ["running", "cancellation-requested"].includes(entry.state)) {
entry.state = "cancellation-requested";
entry.controller.abort();
}
return this.status(id);
},
};
};
+72
View File
@@ -0,0 +1,72 @@
export type MigrationInput = {
schemaVersion: 1;
executionId: string;
exportId: string;
ports: {
name: string;
binding: string;
view: "old" | "new";
access: ("read" | "write" | "create" | "edge")[];
atomId?: string;
attachedAtomId?: string;
defaultValue?: unknown;
states?: {
objectId: string;
value: unknown;
}[];
edges?: MigrationEdge[];
}[];
};
export type MigrationEdge = {
id: string;
edgeTypeId: string;
firstObjectId: string;
secondObjectId: string;
firstProjectionId: string;
secondProjectionId: string;
firstOrdinal?: number;
secondOrdinal?: number;
firstKeyJson?: string;
secondKeyJson?: string;
};
export type MigrationOutput = {
schemaVersion: 1;
executionId: string;
writes: {
port: string;
objectId: string;
value: unknown;
}[];
creates: {
port: string;
logicalKey: string;
objectId: string;
}[];
edgeReplacements: {
port: string;
edges: MigrationEdge[];
}[];
};
export type MigrationContext = {
enumerate(port: string): {
objectId: string;
value: unknown;
}[];
read(port: string, objectId: string): unknown;
write(port: string, objectId: string, value: unknown): void;
create(port: string, logicalKey: string): string;
edges(port: string): MigrationEdge[];
replaceEdges(port: string, edges: MigrationEdge[]): void;
};
export declare const migrationObjectId: (executionId: string, port: string, logicalKey: string) => string;
/** No ordinary RuntimeContext or network/database clients are supplied here.
* Process isolation belongs to the host, not this convenience API. */
export declare const createMigrationContext: (input: MigrationInput) => {
context: MigrationContext;
result: () => MigrationOutput;
};
/** Entrypoint for an immutable package's dedicated bin/migrate executable.
* stdout is protocol-only; send diagnostics to stderr. The host independently
* validates every write, helper identity, contract, and completion receipt. */
export declare const serveMigration: (exports: Record<string, (context: MigrationContext) => void | Promise<void>>) => Promise<void>;
//# sourceMappingURL=migration.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"migration.d.ts","sourceRoot":"","sources":["../src/migration.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACxD,KAAK,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,MAAM,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAC5H,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAChD,MAAM,CAAC,EAAE;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,OAAO,CAAA;SAAC,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;KAAC,EAAE,CAAC;CAC7E,CAAC;AACF,MAAM,MAAM,aAAa,GAAG;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AACjQ,MAAM,MAAM,eAAe,GAAG;IAAC,aAAa,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IACnE,MAAM,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAC,EAAE,CAAC;IAC3D,OAAO,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;IAChE,gBAAgB,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,aAAa,EAAE,CAAA;KAAC,EAAE,CAAA;CAAC,CAAC;AAC9D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAC,EAAE,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACjD,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAAC;IACrC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;CAC1D,CAAC;AACF,eAAO,MAAM,iBAAiB,gBAAiB,MAAM,QAAQ,MAAM,cAAc,MAAM,WACwB,CAAC;AAEhH;sEACsE;AACtE,eAAO,MAAM,sBAAsB,UAAW,cAAc;;;CAgD3D,CAAC;AAEF;;+EAE+E;AAC/E,eAAO,MAAM,cAAc,YAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,kBAehH,CAAC"}
+93
View File
@@ -0,0 +1,93 @@
import { createHash } from "node:crypto";
export const migrationObjectId = (executionId, port, logicalKey) => `obj:migration:${createHash("sha256").update(JSON.stringify([executionId, port, logicalKey])).digest("hex")}`;
/** No ordinary RuntimeContext or network/database clients are supplied here.
* Process isolation belongs to the host, not this convenience API. */
export const createMigrationContext = (input) => {
if (input.schemaVersion !== 1 || !input.executionId || new Set(input.ports.map((entry) => entry.name)).size !== input.ports.length)
throw new Error("Invalid migration input");
const output = { schemaVersion: 1, executionId: input.executionId, writes: [], creates: [], edgeReplacements: [] };
const port = (name, access) => {
const selected = input.ports.find((entry) => entry.name === name);
if (!selected?.access.includes(access) || (selected.view === "old" && access !== "read"))
throw new Error(`Migration port ${name} does not grant ${access}`);
return selected;
};
const context = {
enumerate(name) {
const selected = port(name, "read"), states = structuredClone(selected.states ?? []);
if (selected.view === "new" && Object.hasOwn(selected, "defaultValue"))
for (const helper of output.creates) {
if (input.ports.find((entry) => entry.name === helper.port)?.atomId === selected.attachedAtomId && !states.some((entry) => entry.objectId === helper.objectId))
states.push({ objectId: helper.objectId, value: structuredClone(selected.defaultValue) });
}
if (selected.view === "new")
for (const write of output.writes) {
if (input.ports.find((entry) => entry.name === write.port)?.binding !== selected.binding)
continue;
const existing = states.findIndex((entry) => entry.objectId === write.objectId), entry = { objectId: write.objectId, value: structuredClone(write.value) };
if (existing < 0)
states.push(entry);
else
states[existing] = entry;
}
return states.sort((a, b) => a.objectId < b.objectId ? -1 : a.objectId > b.objectId ? 1 : 0);
},
read(name, objectId) { return context.enumerate(name).find((entry) => entry.objectId === objectId)?.value; },
write(name, objectId, value) {
port(name, "write");
const previous = output.writes.findIndex((entry) => entry.port === name && entry.objectId === objectId);
const entry = { port: name, objectId, value: structuredClone(value) };
if (previous < 0)
output.writes.push(entry);
else
output.writes[previous] = entry;
},
create(name, logicalKey) {
port(name, "create");
if (!logicalKey || logicalKey.length > 1024)
throw new Error("Migration creation requires a bounded stable logical key");
const objectId = migrationObjectId(input.executionId, name, logicalKey);
if (!output.creates.some((entry) => entry.objectId === objectId))
output.creates.push({ port: name, logicalKey, objectId });
return objectId;
},
edges(name) {
const selected = port(name, "read");
const replacement = selected.view === "new" ? output.edgeReplacements.find((entry) => input.ports.find((candidate) => candidate.name === entry.port)?.binding === selected.binding) : undefined;
return structuredClone(replacement?.edges ?? selected.edges ?? []);
},
replaceEdges(name, edges) {
port(name, "edge");
const previous = output.edgeReplacements.findIndex((entry) => entry.port === name);
const entry = { port: name, edges: structuredClone(edges) };
if (previous < 0)
output.edgeReplacements.push(entry);
else
output.edgeReplacements[previous] = entry;
},
};
return { context, result: () => structuredClone(output) };
};
/** Entrypoint for an immutable package's dedicated bin/migrate executable.
* stdout is protocol-only; send diagnostics to stderr. The host independently
* validates every write, helper identity, contract, and completion receipt. */
export const serveMigration = async (exports) => {
const chunks = [];
let bytes = 0;
for await (const chunk of process.stdin) {
bytes += chunk.length;
if (bytes > 16 * 1024 * 1024)
throw new Error("Migration input exceeds 16 MiB");
chunks.push(Buffer.from(chunk));
}
const input = JSON.parse(Buffer.concat(chunks).toString("utf8"));
const implementation = Object.hasOwn(exports, input.exportId) ? exports[input.exportId] : undefined;
if (!implementation)
throw new Error("Unknown migration export");
const execution = createMigrationContext(input);
await implementation(execution.context);
const result = JSON.stringify(execution.result());
if (Buffer.byteLength(result) > 16 * 1024 * 1024)
throw new Error("Migration output exceeds 16 MiB");
process.stdout.write(`${result}\n`);
};
+529
View File
@@ -0,0 +1,529 @@
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import type { CaminoObject, Value } from "../camino/api_pb.js";
import type { PackageDescriptor } from "./package_pb.js";
import type { CapabilityRef, PackageExportRef } from "./refs_pb.js";
import type { DerivedDependency } from "./runtime_pb.js";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file quixos/orch.proto.
*/
export declare const file_quixos_orch: GenFile;
/**
* @generated from message quixos.orch.ConstructObjectRequest
*/
export type ConstructObjectRequest = Message<"quixos.orch.ConstructObjectRequest"> & {
/**
* @generated from field: string atom_id = 1;
*/
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 declare const ConstructObjectRequestSchema: GenMessage<ConstructObjectRequest>;
/**
* @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 declare const ConstructObjectResponseSchema: GenMessage<ConstructObjectResponse>;
/**
* @generated from message quixos.orch.ResolveOrConstructRelatedObjectRequest
*/
export type ResolveOrConstructRelatedObjectRequest = Message<"quixos.orch.ResolveOrConstructRelatedObjectRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
/**
* @generated from field: string interface_revision_id = 2;
*/
interfaceRevisionId: string;
/**
* @generated from field: string member_id = 3;
*/
memberId: string;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectRequest.
* Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message.
*/
export declare const ResolveOrConstructRelatedObjectRequestSchema: GenMessage<ResolveOrConstructRelatedObjectRequest>;
/**
* @generated from message quixos.orch.ResolveOrConstructRelatedObjectResponse
*/
export type ResolveOrConstructRelatedObjectResponse = Message<"quixos.orch.ResolveOrConstructRelatedObjectResponse"> & {
/**
* @generated from field: camino.CaminoObject object = 1;
*/
object?: CaminoObject | undefined;
/**
* @generated from field: bool constructed = 2;
*/
constructed: boolean;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectResponse.
* Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message.
*/
export declare const ResolveOrConstructRelatedObjectResponseSchema: GenMessage<ResolveOrConstructRelatedObjectResponse>;
/**
* @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;
*/
objectId: string;
/**
* @generated from field: map<string, camino.Value> input = 3;
*/
input: {
[key: string]: Value;
};
/**
* Identifies one logical client mutation across the capability and Camino
* layers so a live-value controller can recognize its own confirmation.
*
* @generated from field: string client_mutation_id = 4;
*/
clientMutationId: string;
};
/**
* Describes the message quixos.orch.InvokeCapabilityRequest.
* Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/
export declare const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest>;
/**
* @generated from message quixos.orch.InvokeCapabilityResponse
*/
export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResponse"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* @generated from field: quixos.orch.Activation activation = 2;
*/
activation?: Activation | undefined;
/**
* @generated from field: bool ok = 3;
*/
ok: boolean;
/**
* @generated from field: camino.Value result = 4;
*/
result?: Value | undefined;
/**
* @generated from field: string error = 5;
*/
error: string;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 6;
*/
dependencies: DerivedDependency[];
};
/**
* Describes the message quixos.orch.InvokeCapabilityResponse.
* Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/
export declare const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse>;
/**
* @generated from message quixos.orch.WatchCapabilityRequest
*/
export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest"> & {
/**
* @generated from field: quixos.CapabilityRef capability = 1;
*/
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
*/
objectId: string;
/**
* @generated from field: map<string, camino.Value> input = 3;
*/
input: {
[key: string]: Value;
};
};
/**
* Describes the message quixos.orch.WatchCapabilityRequest.
* Use `create(WatchCapabilityRequestSchema)` to create a new message.
*/
export declare const WatchCapabilityRequestSchema: GenMessage<WatchCapabilityRequest>;
/**
* @generated from message quixos.orch.WatchCapabilityEvent
*/
export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* @generated from field: quixos.orch.Activation activation = 2;
*/
activation?: Activation | undefined;
/**
* @generated from field: string watch_id = 3;
*/
watchId: string;
/**
* @generated from field: camino.Value value = 4;
*/
value?: Value | undefined;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 5;
*/
dependencies: DerivedDependency[];
/**
* @generated from field: string error = 6;
*/
error: string;
/**
* @generated from field: bool initial = 7;
*/
initial: boolean;
};
/**
* Describes the message quixos.orch.WatchCapabilityEvent.
* Use `create(WatchCapabilityEventSchema)` to create a new message.
*/
export declare const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent>;
/**
* @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 declare const GetWorkspaceRequestSchema: GenMessage<GetWorkspaceRequest>;
/**
* @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 declare const GetWorkspaceResponseSchema: GenMessage<GetWorkspaceResponse>;
/**
* @generated from message quixos.orch.ListActivationsRequest
*/
export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest"> & {};
/**
* Describes the message quixos.orch.ListActivationsRequest.
* Use `create(ListActivationsRequestSchema)` to create a new message.
*/
export declare const ListActivationsRequestSchema: GenMessage<ListActivationsRequest>;
/**
* @generated from message quixos.orch.ListPackageDescriptorsRequest
*/
export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDescriptorsRequest"> & {};
/**
* Describes the message quixos.orch.ListPackageDescriptorsRequest.
* Use `create(ListPackageDescriptorsRequestSchema)` to create a new message.
*/
export declare const ListPackageDescriptorsRequestSchema: GenMessage<ListPackageDescriptorsRequest>;
/**
* @generated from message quixos.orch.ListPackageDescriptorsResponse
*/
export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDescriptorsResponse"> & {
/**
* @generated from field: repeated quixos.PackageDescriptor descriptors = 1;
*/
descriptors: PackageDescriptor[];
};
/**
* Describes the message quixos.orch.ListPackageDescriptorsResponse.
* Use `create(ListPackageDescriptorsResponseSchema)` to create a new message.
*/
export declare const ListPackageDescriptorsResponseSchema: GenMessage<ListPackageDescriptorsResponse>;
/**
* @generated from message quixos.orch.ListPackageRuntimesRequest
*/
export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntimesRequest"> & {};
/**
* Describes the message quixos.orch.ListPackageRuntimesRequest.
* Use `create(ListPackageRuntimesRequestSchema)` to create a new message.
*/
export declare const ListPackageRuntimesRequestSchema: GenMessage<ListPackageRuntimesRequest>;
/**
* @generated from message quixos.orch.ListPackageRuntimesResponse
*/
export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntimesResponse"> & {
/**
* @generated from field: repeated quixos.orch.PackageRuntimeStatus runtimes = 1;
*/
runtimes: PackageRuntimeStatus[];
};
/**
* Describes the message quixos.orch.ListPackageRuntimesResponse.
* Use `create(ListPackageRuntimesResponseSchema)` to create a new message.
*/
export declare const ListPackageRuntimesResponseSchema: GenMessage<ListPackageRuntimesResponse>;
/**
* @generated from message quixos.orch.ListActivationsResponse
*/
export type ListActivationsResponse = Message<"quixos.orch.ListActivationsResponse"> & {
/**
* @generated from field: repeated quixos.orch.Activation activations = 1;
*/
activations: Activation[];
};
/**
* Describes the message quixos.orch.ListActivationsResponse.
* Use `create(ListActivationsResponseSchema)` to create a new message.
*/
export declare const ListActivationsResponseSchema: GenMessage<ListActivationsResponse>;
/**
* @generated from message quixos.orch.CloseActivationRequest
*/
export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest"> & {
/**
* @generated from field: string activation_id = 1;
*/
activationId: string;
/**
* @generated from field: string reason = 2;
*/
reason: string;
};
/**
* Describes the message quixos.orch.CloseActivationRequest.
* Use `create(CloseActivationRequestSchema)` to create a new message.
*/
export declare const CloseActivationRequestSchema: GenMessage<CloseActivationRequest>;
/**
* @generated from message quixos.orch.CloseActivationResponse
*/
export type CloseActivationResponse = Message<"quixos.orch.CloseActivationResponse"> & {
/**
* @generated from field: quixos.orch.Activation activation = 1;
*/
activation?: Activation | undefined;
};
/**
* Describes the message quixos.orch.CloseActivationResponse.
* Use `create(CloseActivationResponseSchema)` to create a new message.
*/
export declare const CloseActivationResponseSchema: GenMessage<CloseActivationResponse>;
/**
* @generated from message quixos.orch.Activation
*/
export type Activation = Message<"quixos.orch.Activation"> & {
/**
* @generated from field: string activation_id = 1;
*/
activationId: string;
/**
* @generated from field: quixos.PackageExportRef export = 2;
*/
export?: PackageExportRef | undefined;
/**
* @generated from field: string object_id = 3;
*/
objectId: string;
/**
* @generated from field: string state = 4;
*/
state: string;
/**
* @generated from field: uint32 demand = 5;
*/
demand: number;
/**
* @generated from field: string opened_at = 6;
*/
openedAt: string;
/**
* @generated from field: string last_used_at = 7;
*/
lastUsedAt: string;
/**
* @generated from field: string idle_deadline_at = 8;
*/
idleDeadlineAt: string;
/**
* @generated from field: string closed_at = 9;
*/
closedAt: string;
/**
* @generated from field: string close_reason = 10;
*/
closeReason: string;
};
/**
* Describes the message quixos.orch.Activation.
* Use `create(ActivationSchema)` to create a new message.
*/
export declare const ActivationSchema: GenMessage<Activation>;
/**
* @generated from message quixos.orch.PackageRuntimeStatus
*/
export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> & {
/**
* @generated from field: string runtime_key = 1;
*/
runtimeKey: string;
/**
* @generated from field: string package_revision_id = 2;
*/
packageRevisionId: string;
/**
* @generated from field: string source_repository = 3;
*/
sourceRepository: string;
/**
* @generated from field: string source_commit = 4;
*/
sourceCommit: string;
/**
* @generated from field: string build_target = 5;
*/
buildTarget: string;
/**
* @generated from field: string server_path = 6;
*/
serverPath: string;
/**
* @generated from field: uint32 pid = 7;
*/
pid: number;
/**
* @generated from field: string state = 8;
*/
state: string;
/**
* @generated from field: string started_at = 9;
*/
startedAt: string;
/**
* @generated from field: string last_handshake_at = 10;
*/
lastHandshakeAt: string;
/**
* @generated from field: string runtime_protocol_version = 11;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: uint32 advertised_export_count = 12;
*/
advertisedExportCount: number;
};
/**
* Describes the message quixos.orch.PackageRuntimeStatus.
* Use `create(PackageRuntimeStatusSchema)` to create a new message.
*/
export declare const PackageRuntimeStatusSchema: GenMessage<PackageRuntimeStatus>;
/**
* @generated from service quixos.orch.OrchestratorRuntime
*/
export declare const OrchestratorRuntime: GenService<{
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.InvokeCapability
*/
invokeCapability: {
methodKind: "unary";
input: typeof InvokeCapabilityRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.WatchCapability
*/
watchCapability: {
methodKind: "server_streaming";
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.ResolveOrConstructRelatedObject
*/
resolveOrConstructRelatedObject: {
methodKind: "unary";
input: typeof ResolveOrConstructRelatedObjectRequestSchema;
output: typeof ResolveOrConstructRelatedObjectResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace
*/
getWorkspace: {
methodKind: "unary";
input: typeof GetWorkspaceRequestSchema;
output: typeof GetWorkspaceResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListPackageDescriptors
*/
listPackageDescriptors: {
methodKind: "unary";
input: typeof ListPackageDescriptorsRequestSchema;
output: typeof ListPackageDescriptorsResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListPackageRuntimes
*/
listPackageRuntimes: {
methodKind: "unary";
input: typeof ListPackageRuntimesRequestSchema;
output: typeof ListPackageRuntimesResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListActivations
*/
listActivations: {
methodKind: "unary";
input: typeof ListActivationsRequestSchema;
output: typeof ListActivationsResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.CloseActivation
*/
closeActivation: {
methodKind: "unary";
input: typeof CloseActivationRequestSchema;
output: typeof CloseActivationResponseSchema;
};
}>;
//# sourceMappingURL=orch_pb.d.ts.map
+1
View File
File diff suppressed because one or more lines are too long
+116
View File
@@ -0,0 +1,116 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/orch.proto (package quixos.orch, syntax proto3)
/* eslint-disable */
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import { file_camino_api } from "../camino/api_pb.js";
import { file_quixos_package } from "./package_pb.js";
import { file_quixos_refs } from "./refs_pb.js";
import { file_quixos_runtime } from "./runtime_pb.js";
/**
* Describes the file quixos/orch.proto.
*/
export const file_quixos_orch = /*@__PURE__*/ fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLwAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJGjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASLRAQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5ItIBChZXYXRjaENhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPQoFaW5wdXQYAyADKAsyLi5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIuMBChRXYXRjaENhcGFiaWxpdHlFdmVudBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEhAKCHdhdGNoX2lkGAMgASgJEhwKBXZhbHVlGAQgASgLMg0uY2FtaW5vLlZhbHVlEjcKDGRlcGVuZGVuY2llcxgFIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5Eg0KBWVycm9yGAYgASgJEg8KB2luaXRpYWwYByABKAgiFQoTR2V0V29ya3NwYWNlUmVxdWVzdCJnChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCSIYChZMaXN0QWN0aXZhdGlvbnNSZXF1ZXN0Ih8KHUxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0IlAKHkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRIuCgtkZXNjcmlwdG9ycxgBIAMoCzIZLnF1aXhvcy5QYWNrYWdlRGVzY3JpcHRvciIcChpMaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdCJSChtMaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USMwoIcnVudGltZXMYASADKAsyIS5xdWl4b3Mub3JjaC5QYWNrYWdlUnVudGltZVN0YXR1cyJHChdMaXN0QWN0aXZhdGlvbnNSZXNwb25zZRIsCgthY3RpdmF0aW9ucxgBIAMoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24iPwoWQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJGChdDbG9zZUFjdGl2YXRpb25SZXNwb25zZRIrCgphY3RpdmF0aW9uGAEgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiLrAQoKQWN0aXZhdGlvbhIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRINCgVzdGF0ZRgEIAEoCRIOCgZkZW1hbmQYBSABKA0SEQoJb3BlbmVkX2F0GAYgASgJEhQKDGxhc3RfdXNlZF9hdBgHIAEoCRIYChBpZGxlX2RlYWRsaW5lX2F0GAggASgJEhEKCWNsb3NlZF9hdBgJIAEoCRIUCgxjbG9zZV9yZWFzb24YCiABKAkiswIKFFBhY2thZ2VSdW50aW1lU3RhdHVzEhMKC3J1bnRpbWVfa2V5GAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSGQoRc291cmNlX3JlcG9zaXRvcnkYAyABKAkSFQoNc291cmNlX2NvbW1pdBgEIAEoCRIUCgxidWlsZF90YXJnZXQYBSABKAkSEwoLc2VydmVyX3BhdGgYBiABKAkSCwoDcGlkGAcgASgNEg0KBXN0YXRlGAggASgJEhIKCnN0YXJ0ZWRfYXQYCSABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYCiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAsgASgJEh8KF2FkdmVydGlzZWRfZXhwb3J0X2NvdW50GAwgASgNMq4HChNPcmNoZXN0cmF0b3JSdW50aW1lEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]);
/**
* Describes the message quixos.orch.ConstructObjectRequest.
* Use `create(ConstructObjectRequestSchema)` to create a new message.
*/
export const ConstructObjectRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 0);
/**
* Describes the message quixos.orch.ConstructObjectResponse.
* Use `create(ConstructObjectResponseSchema)` to create a new message.
*/
export const ConstructObjectResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 1);
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectRequest.
* Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 2);
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectResponse.
* Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 3);
/**
* Describes the message quixos.orch.InvokeCapabilityRequest.
* Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/
export const InvokeCapabilityRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 4);
/**
* Describes the message quixos.orch.InvokeCapabilityResponse.
* Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/
export const InvokeCapabilityResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 5);
/**
* Describes the message quixos.orch.WatchCapabilityRequest.
* Use `create(WatchCapabilityRequestSchema)` to create a new message.
*/
export const WatchCapabilityRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 6);
/**
* Describes the message quixos.orch.WatchCapabilityEvent.
* Use `create(WatchCapabilityEventSchema)` to create a new message.
*/
export const WatchCapabilityEventSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 7);
/**
* Describes the message quixos.orch.GetWorkspaceRequest.
* Use `create(GetWorkspaceRequestSchema)` to create a new message.
*/
export const GetWorkspaceRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 8);
/**
* Describes the message quixos.orch.GetWorkspaceResponse.
* Use `create(GetWorkspaceResponseSchema)` to create a new message.
*/
export const GetWorkspaceResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 9);
/**
* Describes the message quixos.orch.ListActivationsRequest.
* Use `create(ListActivationsRequestSchema)` to create a new message.
*/
export const ListActivationsRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 10);
/**
* Describes the message quixos.orch.ListPackageDescriptorsRequest.
* Use `create(ListPackageDescriptorsRequestSchema)` to create a new message.
*/
export const ListPackageDescriptorsRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 11);
/**
* Describes the message quixos.orch.ListPackageDescriptorsResponse.
* Use `create(ListPackageDescriptorsResponseSchema)` to create a new message.
*/
export const ListPackageDescriptorsResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 12);
/**
* Describes the message quixos.orch.ListPackageRuntimesRequest.
* Use `create(ListPackageRuntimesRequestSchema)` to create a new message.
*/
export const ListPackageRuntimesRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 13);
/**
* Describes the message quixos.orch.ListPackageRuntimesResponse.
* Use `create(ListPackageRuntimesResponseSchema)` to create a new message.
*/
export const ListPackageRuntimesResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 14);
/**
* Describes the message quixos.orch.ListActivationsResponse.
* Use `create(ListActivationsResponseSchema)` to create a new message.
*/
export const ListActivationsResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 15);
/**
* Describes the message quixos.orch.CloseActivationRequest.
* Use `create(CloseActivationRequestSchema)` to create a new message.
*/
export const CloseActivationRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 16);
/**
* Describes the message quixos.orch.CloseActivationResponse.
* Use `create(CloseActivationResponseSchema)` to create a new message.
*/
export const CloseActivationResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 17);
/**
* Describes the message quixos.orch.Activation.
* Use `create(ActivationSchema)` to create a new message.
*/
export const ActivationSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 18);
/**
* Describes the message quixos.orch.PackageRuntimeStatus.
* Use `create(PackageRuntimeStatusSchema)` to create a new message.
*/
export const PackageRuntimeStatusSchema = /*@__PURE__*/ messageDesc(file_quixos_orch, 19);
/**
* @generated from service quixos.orch.OrchestratorRuntime
*/
export const OrchestratorRuntime = /*@__PURE__*/ serviceDesc(file_quixos_orch, 0);
+51
View File
@@ -0,0 +1,51 @@
import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file quixos/package.proto.
*/
export declare const file_quixos_package: GenFile;
/**
* @generated from message quixos.PackageDescriptor
*/
export type PackageDescriptor = Message<"quixos.PackageDescriptor"> & {
/**
* @generated from field: string package_id = 1;
*/
packageId: string;
/**
* @generated from field: string package_revision_id = 2;
*/
packageRevisionId: string;
/**
* @generated from field: string runtime_protocol_version = 3;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: repeated quixos.RuntimeExport exports = 4;
*/
exports: RuntimeExport[];
};
/**
* Describes the message quixos.PackageDescriptor.
* Use `create(PackageDescriptorSchema)` to create a new message.
*/
export declare const PackageDescriptorSchema: GenMessage<PackageDescriptor>;
/**
* @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 declare const RuntimeExportSchema: GenMessage<RuntimeExport>;
//# sourceMappingURL=package_pb.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"package_pb.d.ts","sourceRoot":"","sources":["../../src/quixos/package_pb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,OACgT,CAAC;AAEnV;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,0BAA0B,CAAC,GAAG;IACpE;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAE/B;;OAEG;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,UAAU,CAAC,iBAAiB,CAC7B,CAAC;AAEtC;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,GAAG;IAC5D;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC,aAAa,CACrB,CAAC"}
+18
View File
@@ -0,0 +1,18 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/package.proto (package quixos, syntax proto3)
/* eslint-disable */
import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
/**
* Describes the file quixos/package.proto.
*/
export const file_quixos_package = /*@__PURE__*/ fileDesc("ChRxdWl4b3MvcGFja2FnZS5wcm90bxIGcXVpeG9zIo4BChFQYWNrYWdlRGVzY3JpcHRvchISCgpwYWNrYWdlX2lkGAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAMgASgJEiYKB2V4cG9ydHMYBCADKAsyFS5xdWl4b3MuUnVudGltZUV4cG9ydCI6Cg1SdW50aW1lRXhwb3J0EhEKCWV4cG9ydF9pZBgBIAEoCRIWCg5ydW50aW1lX3N5bWJvbBgCIAEoCWIGcHJvdG8z");
/**
* Describes the message quixos.PackageDescriptor.
* Use `create(PackageDescriptorSchema)` to create a new message.
*/
export const PackageDescriptorSchema = /*@__PURE__*/ messageDesc(file_quixos_package, 0);
/**
* Describes the message quixos.RuntimeExport.
* Use `create(RuntimeExportSchema)` to create a new message.
*/
export const RuntimeExportSchema = /*@__PURE__*/ messageDesc(file_quixos_package, 1);
+97 -21
View File
@@ -5,33 +5,109 @@ import type { Message } from "@bufbuild/protobuf";
*/ */
export declare const file_quixos_refs: GenFile; export declare const file_quixos_refs: GenFile;
/** /**
* @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; operationId: 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;
}; };
/** /**
* Describes the message quixos.FunctionRef. * Describes the message quixos.CapabilityRef.
* Use `create(FunctionRefSchema)` to create a new message. * Use `create(CapabilityRefSchema)` to create a new message.
*/ */
export declare const FunctionRefSchema: GenMessage<FunctionRef>; export declare const CapabilityRefSchema: GenMessage<CapabilityRef>;
/**
* @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 declare const PackageExportRefSchema: GenMessage<PackageExportRef>;
/**
* @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 interface_revision_id = 4;
*/
value: string;
case: "interfaceRevisionId";
} | {
/**
* @generated from field: string constructor_atom_id = 5;
*/
value: string;
case: "constructorAtomId";
} | {
case: undefined;
value?: undefined;
};
/**
* Defaults to the invocation receiver. A checked dependency traversal can
* select a related object explicitly before the package runtime starts.
*
* @generated from field: string object_id = 6;
*/
objectId: string;
};
/**
* Describes the message quixos.InjectedDependency.
* Use `create(InjectedDependencySchema)` to create a new message.
*/
export declare const InjectedDependencySchema: GenMessage<InjectedDependency>;
/**
* @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 declare const EdgeDependencySchema: GenMessage<EdgeDependency>;
//# sourceMappingURL=refs_pb.d.ts.map //# sourceMappingURL=refs_pb.d.ts.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"refs_pb.d.ts","sourceRoot":"","sources":["../../src/quixos/refs_pb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAC8L,CAAC;AAE9N;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG;IACxD;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAAU,CAAC,WAAW,CACpB,CAAC"} {"version":3,"file":"refs_pb.d.ts","sourceRoot":"","sources":["../../src/quixos/refs_pb.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAExE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,OACmjB,CAAC;AAEnlB;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC,GAAG;IAC5D;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAAU,CAAC,aAAa,CACxB,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,yBAAyB,CAAC,GAAG;IAClE;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,gBAAgB,CAC9B,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,2BAA2B,CAAC,GAAG;IACtE;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE;QACP;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,aAAa,CAAC;KACrB,GAAG;QACF;;WAEG;QACH,KAAK,EAAE,cAAc,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG;QACF;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,qBAAqB,CAAC;KAC7B,GAAG;QACF;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,mBAAmB,CAAC;KAC3B,GAAG;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAE3C;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,UAAU,CAAC,kBAAkB,CAClC,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,uBAAuB,CAAC,GAAG;IAC9D;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAAU,CAAC,cAAc,CAC1B,CAAC"}
+19 -4
View File
@@ -5,9 +5,24 @@ import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
/** /**
* Describes the file quixos/refs.proto. * Describes the file quixos/refs.proto.
*/ */
export const file_quixos_refs = /*@__PURE__*/ fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInYKC0Z1bmN0aW9uUmVmEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIOCgZzeW1ib2wYAyABKAkSEwoLdmVyc2lvbl9yZWYYBCABKAkSEQoJb3BlcmF0aW9uGAUgASgJYgZwcm90bzM"); export const file_quixos_refs = /*@__PURE__*/ fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIsQBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z");
/** /**
* Describes the message quixos.FunctionRef. * Describes the message quixos.CapabilityRef.
* Use `create(FunctionRefSchema)` to create a new message. * Use `create(CapabilityRefSchema)` to create a new message.
*/ */
export const FunctionRefSchema = /*@__PURE__*/ messageDesc(file_quixos_refs, 0); export const CapabilityRefSchema = /*@__PURE__*/ messageDesc(file_quixos_refs, 0);
/**
* Describes the message quixos.PackageExportRef.
* Use `create(PackageExportRefSchema)` to create a new message.
*/
export const PackageExportRefSchema = /*@__PURE__*/ messageDesc(file_quixos_refs, 1);
/**
* Describes the message quixos.InjectedDependency.
* Use `create(InjectedDependencySchema)` to create a new message.
*/
export const InjectedDependencySchema = /*@__PURE__*/ messageDesc(file_quixos_refs, 2);
/**
* Describes the message quixos.EdgeDependency.
* Use `create(EdgeDependencySchema)` to create a new message.
*/
export const EdgeDependencySchema = /*@__PURE__*/ messageDesc(file_quixos_refs, 3);
+136 -18
View File
@@ -1,6 +1,6 @@
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import type { Value } from "../camino/api_pb.js"; import type { Value } from "../camino/api_pb.js";
import type { FunctionRef } from "./refs_pb.js"; import type { InjectedDependency, PackageExportRef } from "./refs_pb.js";
import type { Message } from "@bufbuild/protobuf"; import type { Message } from "@bufbuild/protobuf";
/** /**
* Describes the file quixos/runtime.proto. * Describes the file quixos/runtime.proto.
@@ -14,6 +14,10 @@ export type HandshakeRequest = Message<"quixos.runtime.HandshakeRequest"> & {
* @generated from field: string orch_protocol_version = 1; * @generated from field: string orch_protocol_version = 1;
*/ */
orchProtocolVersion: string; orchProtocolVersion: string;
/**
* @generated from field: string nonce = 2;
*/
nonce: string;
}; };
/** /**
* Describes the message quixos.runtime.HandshakeRequest. * Describes the message quixos.runtime.HandshakeRequest.
@@ -25,27 +29,105 @@ export declare const HandshakeRequestSchema: GenMessage<HandshakeRequest>;
*/ */
export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & { 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; * @generated from field: string runtime_protocol_version = 2;
*/
packageName: string;
/**
* @generated from field: string runtime_protocol_version = 3;
*/ */
runtimeProtocolVersion: string; runtimeProtocolVersion: string;
/** /**
* @generated from field: repeated quixos.FunctionRef functions = 4; * @generated from field: repeated string export_ids = 3;
*/ */
functions: FunctionRef[]; exportIds: string[];
/**
* @generated from field: string instance_id = 4;
*/
instanceId: string;
/**
* @generated from field: string authentication_proof = 5;
*/
authenticationProof: string;
/**
* @generated from field: repeated string capabilities = 6;
*/
capabilities: string[];
}; };
/** /**
* Describes the message quixos.runtime.HandshakeResponse. * Describes the message quixos.runtime.HandshakeResponse.
* Use `create(HandshakeResponseSchema)` to create a new message. * Use `create(HandshakeResponseSchema)` to create a new message.
*/ */
export declare const HandshakeResponseSchema: GenMessage<HandshakeResponse>; export declare const HandshakeResponseSchema: GenMessage<HandshakeResponse>;
/**
* @generated from message quixos.runtime.InvocationContext
*/
export type InvocationContext = Message<"quixos.runtime.InvocationContext"> & {
/**
* @generated from field: string workspace_epoch = 1;
*/
workspaceEpoch: string;
/**
* @generated from field: string instance_id = 2;
*/
instanceId: string;
/**
* @generated from field: string binding_digest = 3;
*/
bindingDigest: string;
/**
* @generated from field: string grant = 4;
*/
grant: string;
/**
* @generated from field: string session_id = 5;
*/
sessionId: string;
/**
* Host-selected owner; packages must not invent workspace-local ownership.
*
* @generated from field: string owner_conformance_id = 6;
*/
ownerConformanceId: string;
};
/**
* Describes the message quixos.runtime.InvocationContext.
* Use `create(InvocationContextSchema)` to create a new message.
*/
export declare const InvocationContextSchema: GenMessage<InvocationContext>;
/**
* @generated from message quixos.runtime.InvocationControlRequest
*/
export type InvocationControlRequest = Message<"quixos.runtime.InvocationControlRequest"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
};
/**
* Describes the message quixos.runtime.InvocationControlRequest.
* Use `create(InvocationControlRequestSchema)` to create a new message.
*/
export declare const InvocationControlRequestSchema: GenMessage<InvocationControlRequest>;
/**
* @generated from message quixos.runtime.InvocationStatus
*/
export type InvocationStatus = Message<"quixos.runtime.InvocationStatus"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* unknown, running, cancellation-requested, completed, failed
*
* @generated from field: string state = 2;
*/
state: string;
};
/**
* Describes the message quixos.runtime.InvocationStatus.
* Use `create(InvocationStatusSchema)` to create a new message.
*/
export declare const InvocationStatusSchema: GenMessage<InvocationStatus>;
/** /**
* @generated from message quixos.runtime.InvokeRequest * @generated from message quixos.runtime.InvokeRequest
*/ */
@@ -55,9 +137,9 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
*/ */
invocationId: string; 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; * @generated from field: string object_id = 3;
*/ */
@@ -68,6 +150,14 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
input: { input: {
[key: string]: Value; [key: string]: Value;
}; };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
/**
* @generated from field: quixos.runtime.InvocationContext context = 6;
*/
context?: InvocationContext | undefined;
}; };
/** /**
* Describes the message quixos.runtime.InvokeRequest. * Describes the message quixos.runtime.InvokeRequest.
@@ -90,6 +180,10 @@ export type InvokeResponse = Message<"quixos.runtime.InvokeResponse"> & {
* @generated from field: string error = 3; * @generated from field: string error = 3;
*/ */
error: string; error: string;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 4;
*/
dependencies: DerivedDependency[];
}; };
/** /**
* Describes the message quixos.runtime.InvokeResponse. * Describes the message quixos.runtime.InvokeResponse.
@@ -105,9 +199,9 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
*/ */
invocationId: string; 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; * @generated from field: string object_id = 3;
*/ */
@@ -118,6 +212,14 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
input: { input: {
[key: string]: Value; [key: string]: Value;
}; };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
/**
* @generated from field: quixos.runtime.InvocationContext context = 6;
*/
context?: InvocationContext | undefined;
}; };
/** /**
* Describes the message quixos.runtime.WatchRequest. * Describes the message quixos.runtime.WatchRequest.
@@ -137,13 +239,13 @@ export type DerivedDependency = Message<"quixos.runtime.DerivedDependency"> & {
*/ */
objectId: string; 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;
}; };
/** /**
* Describes the message quixos.runtime.DerivedDependency. * Describes the message quixos.runtime.DerivedDependency.
@@ -208,5 +310,21 @@ export declare const PackageRuntime: GenService<{
input: typeof WatchRequestSchema; input: typeof WatchRequestSchema;
output: typeof WatchEventSchema; output: typeof WatchEventSchema;
}; };
/**
* @generated from rpc quixos.runtime.PackageRuntime.GetInvocationStatus
*/
getInvocationStatus: {
methodKind: "unary";
input: typeof InvocationControlRequestSchema;
output: typeof InvocationStatusSchema;
};
/**
* @generated from rpc quixos.runtime.PackageRuntime.CancelInvocation
*/
cancelInvocation: {
methodKind: "unary";
input: typeof InvocationControlRequestSchema;
output: typeof InvocationStatusSchema;
};
}>; }>;
//# sourceMappingURL=runtime_pb.d.ts.map //# sourceMappingURL=runtime_pb.d.ts.map
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"runtime_pb.d.ts","sourceRoot":"","sources":["../../src/quixos/runtime_pb.ts"],"names":[],"mappings":"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"} {"version":3,"file":"runtime_pb.d.ts","sourceRoot":"","sources":["../../src/quixos/runtime_pb.ts"],"names":[],"mappings":"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"}
+21 -6
View File
@@ -7,7 +7,7 @@ import { file_quixos_refs } from "./refs_pb.js";
/** /**
* Describes the file quixos/runtime.proto. * Describes the file quixos/runtime.proto.
*/ */
export const file_quixos_runtime = /*@__PURE__*/ fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkijgEKEUhhbmRzaGFrZVJlc3BvbnNlEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAyABKAkSJgoJZnVuY3Rpb25zGAQgAygLMhMucXVpeG9zLkZ1bmN0aW9uUmVmItYBCg1JbnZva2VSZXF1ZXN0EhUKDWludm9jYXRpb25faWQYASABKAkSJQoIZnVuY3Rpb24YAiABKAsyEy5xdWl4b3MuRnVuY3Rpb25SZWYSEQoJb2JqZWN0X2lkGAMgASgJEjcKBWlucHV0GAQgAygLMigucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJKCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAki1AEKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEiUKCGZ1bmN0aW9uGAIgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJeChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRISCgpmaWVsZF9uYW1lGAMgASgJEhQKDHNvdXJjZV9maWVsZBgEIAEoCSKVAQoKV2F0Y2hFdmVudBIQCgh3YXRjaF9pZBgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYAyADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgEIAEoCRIPCgdpbml0aWFsGAUgASgIMvABCg5QYWNrYWdlUnVudGltZRJQCglIYW5kc2hha2USIC5xdWl4b3MucnVudGltZS5IYW5kc2hha2VSZXF1ZXN0GiEucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVzcG9uc2USRwoGSW52b2tlEh0ucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdBoeLnF1aXhvcy5ydW50aW1lLkludm9rZVJlc3BvbnNlEkMKBVdhdGNoEhwucXVpeG9zLnJ1bnRpbWUuV2F0Y2hSZXF1ZXN0GhoucXVpeG9zLnJ1bnRpbWUuV2F0Y2hFdmVudDABYgZwcm90bzM", [file_camino_api, file_quixos_refs]); export const file_quixos_runtime = /*@__PURE__*/ fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiQAoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkSDQoFbm9uY2UYAiABKAkirwEKEUhhbmRzaGFrZVJlc3BvbnNlEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAIgASgJEhIKCmV4cG9ydF9pZHMYAyADKAkSEwoLaW5zdGFuY2VfaWQYBCABKAkSHAoUYXV0aGVudGljYXRpb25fcHJvb2YYBSABKAkSFAoMY2FwYWJpbGl0aWVzGAYgAygJIpoBChFJbnZvY2F0aW9uQ29udGV4dBIXCg93b3Jrc3BhY2VfZXBvY2gYASABKAkSEwoLaW5zdGFuY2VfaWQYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSDQoFZ3JhbnQYBCABKAkSEgoKc2Vzc2lvbl9pZBgFIAEoCRIcChRvd25lcl9jb25mb3JtYW5jZV9pZBgGIAEoCSIxChhJbnZvY2F0aW9uQ29udHJvbFJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCSI4ChBJbnZvY2F0aW9uU3RhdHVzEhUKDWludm9jYXRpb25faWQYASABKAkSDQoFc3RhdGUYAiABKAkivwIKDUludm9rZVJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSNwoFaW5wdXQYBCADKAsyKC5xdWl4b3MucnVudGltZS5JbnZva2VSZXF1ZXN0LklucHV0RW50cnkSMAoMZGVwZW5kZW5jaWVzGAUgAygLMhoucXVpeG9zLkluamVjdGVkRGVwZW5kZW5jeRIyCgdjb250ZXh0GAYgASgLMiEucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRleHQaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIoMBCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAkSNwoMZGVwZW5kZW5jaWVzGAQgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kivQIKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5EjAKDGRlcGVuZGVuY2llcxgFIAMoCzIaLnF1aXhvcy5JbmplY3RlZERlcGVuZGVuY3kSMgoHY29udGV4dBgGIAEoCzIhLnF1aXhvcy5ydW50aW1lLkludm9jYXRpb25Db250ZXh0GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJiChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIVCg1hdHRhY2htZW50X2lkGAMgASgJEhUKDXByb2plY3Rpb25faWQYBCABKAkilQEKCldhdGNoRXZlbnQSEAoId2F0Y2hfaWQYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAMgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBCABKAkSDwoHaW5pdGlhbBgFIAEoCDKzAwoOUGFja2FnZVJ1bnRpbWUSUAoJSGFuZHNoYWtlEiAucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVxdWVzdBohLnF1aXhvcy5ydW50aW1lLkhhbmRzaGFrZVJlc3BvbnNlEkcKBkludm9rZRIdLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QaHi5xdWl4b3MucnVudGltZS5JbnZva2VSZXNwb25zZRJDCgVXYXRjaBIcLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdBoaLnF1aXhvcy5ydW50aW1lLldhdGNoRXZlbnQwARJhChNHZXRJbnZvY2F0aW9uU3RhdHVzEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1cxJeChBDYW5jZWxJbnZvY2F0aW9uEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1c2IGcHJvdG8z", [file_camino_api, file_quixos_refs]);
/** /**
* Describes the message quixos.runtime.HandshakeRequest. * Describes the message quixos.runtime.HandshakeRequest.
* Use `create(HandshakeRequestSchema)` to create a new message. * Use `create(HandshakeRequestSchema)` to create a new message.
@@ -18,31 +18,46 @@ export const HandshakeRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runt
* Use `create(HandshakeResponseSchema)` to create a new message. * Use `create(HandshakeResponseSchema)` to create a new message.
*/ */
export const HandshakeResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 1); export const HandshakeResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 1);
/**
* Describes the message quixos.runtime.InvocationContext.
* Use `create(InvocationContextSchema)` to create a new message.
*/
export const InvocationContextSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 2);
/**
* Describes the message quixos.runtime.InvocationControlRequest.
* Use `create(InvocationControlRequestSchema)` to create a new message.
*/
export const InvocationControlRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 3);
/**
* Describes the message quixos.runtime.InvocationStatus.
* Use `create(InvocationStatusSchema)` to create a new message.
*/
export const InvocationStatusSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 4);
/** /**
* Describes the message quixos.runtime.InvokeRequest. * Describes the message quixos.runtime.InvokeRequest.
* Use `create(InvokeRequestSchema)` to create a new message. * Use `create(InvokeRequestSchema)` to create a new message.
*/ */
export const InvokeRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 2); export const InvokeRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 5);
/** /**
* Describes the message quixos.runtime.InvokeResponse. * Describes the message quixos.runtime.InvokeResponse.
* Use `create(InvokeResponseSchema)` to create a new message. * Use `create(InvokeResponseSchema)` to create a new message.
*/ */
export const InvokeResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 3); export const InvokeResponseSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 6);
/** /**
* Describes the message quixos.runtime.WatchRequest. * Describes the message quixos.runtime.WatchRequest.
* Use `create(WatchRequestSchema)` to create a new message. * Use `create(WatchRequestSchema)` to create a new message.
*/ */
export const WatchRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 4); export const WatchRequestSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 7);
/** /**
* Describes the message quixos.runtime.DerivedDependency. * Describes the message quixos.runtime.DerivedDependency.
* Use `create(DerivedDependencySchema)` to create a new message. * Use `create(DerivedDependencySchema)` to create a new message.
*/ */
export const DerivedDependencySchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 5); export const DerivedDependencySchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 8);
/** /**
* Describes the message quixos.runtime.WatchEvent. * Describes the message quixos.runtime.WatchEvent.
* Use `create(WatchEventSchema)` to create a new message. * Use `create(WatchEventSchema)` to create a new message.
*/ */
export const WatchEventSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 6); export const WatchEventSchema = /*@__PURE__*/ messageDesc(file_quixos_runtime, 9);
/** /**
* @generated from service quixos.runtime.PackageRuntime * @generated from service quixos.runtime.PackageRuntime
*/ */
+14
View File
@@ -0,0 +1,14 @@
declare const referenceBrand: unique symbol;
export interface QxObjectRef<Identity extends string = string> {
readonly [referenceBrand]: {
readonly [K in Identity]: true;
};
equals(other: QxObjectRef<string>): boolean;
}
export declare const isObjectReference: (value: unknown) => value is QxObjectRef;
/** Internal transport boundary; intentionally not exported from the SDK entry. */
export declare const referenceFromWire: (id: string) => QxObjectRef;
export declare const referenceToWire: (value: unknown) => string;
export declare const assertReferenceFree: (value: unknown, seen?: Set<object>) => void;
export {};
//# sourceMappingURL=references.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAC5C,MAAM,WAAW,WAAW,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM;IAC3D,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE;QAAC,QAAQ,EAAE,CAAC,IAAI,QAAQ,GAAG,IAAI;KAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;CAC7C;AAQD,eAAO,MAAM,iBAAiB,UAAW,OAAO,KAAG,KAAK,IAAI,WACU,CAAC;AAEvE,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,OAAQ,MAAM,KAAG,WAG9C,CAAC;AACF,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,MAGhD,CAAC;AACF,eAAO,MAAM,mBAAmB,UAAW,OAAO,yBAA6B,IAO9E,CAAC"}
+35
View File
@@ -0,0 +1,35 @@
/** Opaque runtime identity. The wire codec, never ordinary package state, owns
* the raw ID. These handles do not themselves confer authority or a lease. */
const identities = new WeakMap();
class Reference {
constructor(id) { identities.set(this, id); Object.freeze(this); }
equals(other) { return isObjectReference(other) && identities.get(this) === identities.get(other); }
toJSON() { throw new Error("Object references cannot be serialized into ordinary data"); }
toString() { throw new Error("Object references cannot be coerced to strings"); }
[Symbol.toPrimitive]() { throw new Error("Object references cannot be coerced to scalar values"); }
}
export const isObjectReference = (value) => typeof value === "object" && value !== null && identities.has(value);
/** Internal transport boundary; intentionally not exported from the SDK entry. */
export const referenceFromWire = (id) => {
if (typeof id !== "string" || !id)
throw new Error("Missing object reference identity");
return new Reference(id);
};
export const referenceToWire = (value) => {
if (!isObjectReference(value))
throw new Error("Expected an opaque object reference, not a raw ID");
return identities.get(value);
};
export const assertReferenceFree = (value, seen = new Set()) => {
if (!value || typeof value !== "object")
return;
if (isObjectReference(value))
throw new Error("Managed references belong in declared RPC references or graph relationships, not ordinary state/messages");
if (seen.has(value))
throw new Error("Cyclic ordinary data");
seen.add(value);
if (!(value instanceof Uint8Array))
for (const child of Object.values(value))
assertReferenceFree(child, seen);
seen.delete(value);
};
+30
View File
@@ -0,0 +1,30 @@
import type { QxObjectRef } from "./references.js";
import type { RelationshipCollection, RelationshipEntry } from "./index.js";
type Key = string | boolean | bigint;
type Port<T extends QxObjectRef> = {
collection(): Promise<RelationshipCollection<T>>;
replace(entries: RelationshipEntry<T>[], expectedRevision: bigint): Promise<RelationshipCollection<T>>;
};
/** Helpers never retry a failed CAS or silently overwrite concurrent edits. */
export declare const relationshipMap: <T extends QxObjectRef, K extends Key = Key>(port: Port<T>) => {
read: () => Promise<RelationshipCollection<T>>;
get(key: K): Promise<{
revision: bigint;
value: T | undefined;
}>;
set(key: K, target: T, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
delete(key: K, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
};
export declare const relationshipList: <T extends QxObjectRef>(port: Port<T>) => {
read: () => Promise<RelationshipCollection<T>>;
insert(index: number, target: T, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
move(edgeId: string, index: number, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
delete(edgeId: string, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
};
export declare const relationshipSet: <T extends QxObjectRef>(port: Port<T>) => {
read: () => Promise<RelationshipCollection<T>>;
add(target: T, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
delete(target: T, expectedRevision: bigint): Promise<RelationshipCollection<T>>;
};
export {};
//# sourceMappingURL=relationships.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"relationships.d.ts","sourceRoot":"","sources":["../src/relationships.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAC,sBAAsB,EAAE,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAC1E,KAAK,GAAG,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AACrC,KAAK,IAAI,CAAC,CAAC,SAAS,WAAW,IAAI;IAAC,UAAU,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAA;CAAC,CAAC;AAM9L,+EAA+E;AAC/E,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,CAAC,CAAC;IACvF,IAAI;IACE,GAAG,MAAM,CAAC;;;;IACV,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,MAAM;IAO/C,MAAM,MAAM,CAAC,oBAAoB,MAAM;CAI7C,CAAC;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,WAAW,QAAQ,IAAI,CAAC,CAAC,CAAC;IACnE,IAAI;IACE,MAAM,QAAQ,MAAM,UAAU,CAAC,oBAAoB,MAAM;IAMzD,IAAI,SAAS,MAAM,SAAS,MAAM,oBAAoB,MAAM;IAQ5D,MAAM,SAAS,MAAM,oBAAoB,MAAM;CAKrD,CAAC;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,WAAW,QAAQ,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI;IACE,GAAG,SAAS,CAAC,oBAAoB,MAAM;IAKvC,MAAM,SAAS,CAAC,oBAAoB,MAAM;CAIhD,CAAC"}
+60
View File
@@ -0,0 +1,60 @@
const checked = async (port, revision) => {
const snapshot = await port.collection();
if (snapshot.revision !== revision)
throw new Error("STALE_COLLECTION_REVISION");
return snapshot;
};
/** Helpers never retry a failed CAS or silently overwrite concurrent edits. */
export const relationshipMap = (port) => ({
read: () => port.collection(),
async get(key) { const snapshot = await port.collection(); return { revision: snapshot.revision, value: snapshot.entries.find((entry) => entry.key === key)?.target }; },
async set(key, target, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
const entries = snapshot.entries.filter((entry) => entry.key !== key);
const existing = snapshot.entries.find((entry) => entry.key === key && entry.target.equals(target));
entries.push(existing ?? { key, target });
return port.replace(entries, expectedRevision);
},
async delete(key, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
return port.replace(snapshot.entries.filter((entry) => entry.key !== key), expectedRevision);
},
});
export const relationshipList = (port) => ({
read: () => port.collection(),
async insert(index, target, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
if (!Number.isSafeInteger(index) || index < 0 || index > snapshot.entries.length)
throw new Error("List index out of bounds");
snapshot.entries.splice(index, 0, { target });
return port.replace(snapshot.entries, expectedRevision);
},
async move(edgeId, index, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
const prior = snapshot.entries.findIndex((entry) => entry.edgeId === edgeId);
if (prior < 0 || !Number.isSafeInteger(index) || index < 0 || index >= snapshot.entries.length)
throw new Error("Unknown list entry or invalid index");
const [entry] = snapshot.entries.splice(prior, 1);
snapshot.entries.splice(index, 0, entry);
return port.replace(snapshot.entries, expectedRevision);
},
async delete(edgeId, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
if (!snapshot.entries.some((entry) => entry.edgeId === edgeId))
throw new Error("Unknown list entry");
return port.replace(snapshot.entries.filter((entry) => entry.edgeId !== edgeId), expectedRevision);
},
});
export const relationshipSet = (port) => ({
read: () => port.collection(),
async add(target, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
if (snapshot.entries.some((entry) => entry.target.equals(target)))
return snapshot;
return port.replace([...snapshot.entries, { target }], expectedRevision);
},
async delete(target, expectedRevision) {
const snapshot = await checked(port, expectedRevision);
return port.replace(snapshot.entries.filter((entry) => !entry.target.equals(target)), expectedRevision);
},
});
-3
View File
@@ -1,3 +0,0 @@
import type { SchemaCompileResult } from "./schema-ir.js";
export declare const compileCaminoSchema: (sourceFile: string) => Promise<SchemaCompileResult>;
//# sourceMappingURL=schema-compiler.d.ts.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"schema-compiler.d.ts","sourceRoot":"","sources":["../src/schema-compiler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAeV,mBAAmB,EAIpB,MAAM,gBAAgB,CAAC;AAg2BxB,eAAO,MAAM,mBAAmB,GAC9B,YAAY,MAAM,KACjB,OAAO,CAAC,mBAAmB,CAuE7B,CAAC"}
-708
View File
@@ -1,708 +0,0 @@
import fs from "node:fs";
import path from "node:path";
import protobuf from "protobufjs";
const CLASS_OPTION = "(camino.class)";
const INTERFACE_OPTION = "(camino.interface)";
const IMPLEMENTS_OPTION = "(camino.implements)";
const CONSTRUCTOR_OPTION = "(camino.constructor)";
const METHOD_OPTION = "(camino.method)";
const MIGRATION_OPTION = "(camino.migration)";
const CONFLICT_OPTION = "(camino.conflict)";
const EDGE_OPTION = "(camino.edge)";
const FIELD_STORAGE_OPTION = "(camino.field_storage)";
const FIELD_OPS_OPTION = "(camino.field_ops)";
const INTERFACE_FIELD_OPTION = "(camino.interface_field)";
const DISPLAY_LABEL_OPTION = "(camino.display_label)";
const IMPL_OPTION = "(camino.impl)";
const SCHEMA_NAMESPACE_OPTION = "(camino.schema_namespace)";
const SCHEMA_VERSION_OPTION = "(camino.schema_version)";
const enumName = (value) => String(value)
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
.replace(/-/g, "_")
.toUpperCase();
const lowerEnumName = (value) => enumName(value).toLowerCase();
const getOption = (options, name) => {
if (!options) {
return undefined;
}
if (Object.hasOwn(options, name)) {
return options[name];
}
const bareName = name.replace(/^\((.*)\)$/, "$1");
if (Object.hasOwn(options, bareName)) {
return options[bareName];
}
return undefined;
};
const getParsedOptions = (reflection) => {
const parsedOptions = reflection
.parsedOptions;
return Array.isArray(parsedOptions)
? parsedOptions.filter((option) => Boolean(option) && typeof option === "object" && !Array.isArray(option))
: [];
};
const getReflectionOptions = (reflection, name) => {
const parsedValues = getParsedOptions(reflection).flatMap((option) => {
const value = getOption(option, name);
return value === undefined ? [] : [value];
});
if (parsedValues.length > 0) {
return parsedValues;
}
const value = getOption(reflection.options, name);
return value === undefined ? [] : [value];
};
const getReflectionOption = (reflection, name) => getReflectionOptions(reflection, name)[0];
const asObject = (value) => value && typeof value === "object" && !Array.isArray(value)
? value
: undefined;
const asArray = (value) => Array.isArray(value) ? value : value === undefined ? [] : [value];
const readString = (object, key) => {
const value = object?.[key];
return typeof value === "string" ? value : undefined;
};
const readNumber = (object, key) => {
const value = object?.[key];
return typeof value === "number" && Number.isFinite(value)
? value
: undefined;
};
const readBoolean = (object, key) => {
const value = object?.[key];
return typeof value === "boolean" ? value : undefined;
};
const symbolRefFromOption = (value, fallback) => {
const object = asObject(value);
if (!object) {
return fallback;
}
return {
namespace: readString(object, "namespace") ?? fallback.namespace,
name: readString(object, "name") ?? fallback.name,
version: readString(object, "version") ?? fallback.version,
...(readString(object, "hash")
? { hash: readString(object, "hash") }
: {}),
};
};
const typeRefFromOption = (value, fallbackVersion) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const symbol = asObject(object.symbol)
? symbolRefFromOption(object.symbol, {
namespace: "",
name: "",
version: fallbackVersion,
})
: undefined;
const protoType = readString(object, "proto_type")?.replace(/^\./, "");
const symbolProtoType = symbol?.namespace && symbol.name ? `${symbol.namespace}.${symbol.name}` : "";
const resolvedProtoType = protoType ?? symbolProtoType;
if (!resolvedProtoType) {
return undefined;
}
return {
protoType: resolvedProtoType,
...(symbol?.namespace && symbol.name ? { symbol } : {}),
};
};
const interfaceFieldContractFromOption = (value, schemaVersion) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const type = typeRefFromOption(object.type, schemaVersion);
return {
required: readBoolean(object, "required") ?? false,
readable: readBoolean(object, "readable") ?? false,
writable: readBoolean(object, "writable") ?? false,
watchable: readBoolean(object, "watchable") ?? false,
...(readString(object, "type_param")
? { typeParam: readString(object, "type_param") }
: {}),
...(type ? { type } : {}),
};
};
const functionRefFromOption = (value) => {
const object = asObject(value);
if (!object) {
throw new Error("Expected function ref option object");
}
const packageNamespace = readString(object, "package_namespace");
const packageName = readString(object, "package_name");
const symbol = readString(object, "symbol");
if (!packageNamespace || !packageName || !symbol) {
throw new Error("Function ref requires package_namespace, package_name, and symbol");
}
return {
packageNamespace,
packageName,
symbol,
...(readString(object, "operation")
? { operation: readString(object, "operation") }
: {}),
...(readString(object, "version_ref")
? { versionRef: readString(object, "version_ref") }
: {}),
};
};
const conflictFromOption = (value) => {
const normalized = enumName(value);
if (!value || normalized === "CONFLICT_STRATEGY_UNSPECIFIED") {
return "preserve_conflicts";
}
if (normalized === "REPLACE") {
return "replace";
}
if (normalized === "PRESERVE_CONFLICTS") {
return "preserve_conflicts";
}
if (normalized === "CRDT") {
return "crdt";
}
throw new Error(`Unknown Camino conflict strategy: ${String(value)}`);
};
const cardinalityFromOption = (value) => {
const normalized = lowerEnumName(value);
if (!value || normalized === "cardinality_unspecified") {
return "many";
}
if (normalized === "optional_one" ||
normalized === "exactly_one" ||
normalized === "many" ||
normalized === "many_unique" ||
normalized === "many_ordered" ||
normalized === "many_unique_ordered") {
return normalized;
}
throw new Error(`Unknown Camino cardinality: ${String(value)}`);
};
const fieldStorageKindFromOption = (value) => {
if (value === 5) {
return "static_final";
}
const normalized = lowerEnumName(value);
if (!value || normalized === "field_storage_kind_unspecified") {
return "stored";
}
if (normalized === "stored" ||
normalized === "derived" ||
normalized === "lazy" ||
normalized === "external" ||
normalized === "static_final") {
return normalized;
}
throw new Error(`Unknown Camino field storage kind: ${String(value)}`);
};
const fieldStorageFromOption = (value) => {
const object = asObject(value);
if (!object) {
return {
kind: "stored",
cache: false,
};
}
const kind = fieldStorageKindFromOption(object.kind);
const resolver = object.resolver === undefined
? undefined
: functionRefFromOption(object.resolver);
if ((kind === "derived" || kind === "lazy" || kind === "external") && !resolver) {
throw new Error(`${kind} field storage requires resolver`);
}
return {
kind,
...(resolver ? { resolver } : {}),
cache: object.cache === true,
};
};
const fieldOpsFromOption = (value) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const implementation = enumName(object.implementation);
if (implementation !== "SERVICE") {
throw new Error(`Unsupported Camino field implementation: ${String(object.implementation)}`);
}
const service = readString(object, "service");
if (!service) {
throw new Error("SERVICE field_ops requires service");
}
return {
implementation: "service",
service,
};
};
const extractFileDefaults = (sourceFile) => {
const text = fs.readFileSync(sourceFile, "utf8");
const packageMatch = /^\s*package\s+([a-zA-Z0-9_.]+)\s*;/m.exec(text);
const namespaceMatch = /^\s*option\s+\(camino\.schema_namespace\)\s*=\s*"([^"]+)"\s*;/m.exec(text);
const versionMatch = /^\s*option\s+\(camino\.schema_version\)\s*=\s*"([^"]+)"\s*;/m.exec(text);
return {
packageName: packageMatch?.[1] ?? "",
schemaNamespace: namespaceMatch?.[1] ?? packageMatch?.[1] ?? "",
schemaVersion: versionMatch?.[1] ?? "1",
};
};
const protoSymbolFromReflection = (reflection, fallbackVersion) => {
if (!reflection?.fullName) {
return undefined;
}
const parts = reflection.fullName.replace(/^\./, "").split(".");
const name = parts.pop();
if (!name) {
return undefined;
}
return {
namespace: parts.join("."),
name,
version: fallbackVersion,
};
};
const typeRefForField = (field, schemaVersion) => {
const symbol = protoSymbolFromReflection(field.resolvedType, schemaVersion);
const enumValues = field.resolvedType instanceof protobuf.Enum
? Object.entries(field.resolvedType.values)
.filter(([_name, value]) => value !== 0)
.map(([name]) => name)
: undefined;
return {
protoType: field.type,
...(symbol ? { symbol } : {}),
...(enumValues ? { enumValues } : {}),
};
};
const typeRefForType = (type, fallbackType, schemaVersion) => {
const symbol = protoSymbolFromReflection(type ?? null, schemaVersion);
return {
protoType: type?.fullName?.replace(/^\./, "") ?? fallbackType,
...(symbol ? { symbol } : {}),
};
};
const fieldSchemaFromField = (field, schemaVersion) => {
const storage = fieldStorageFromOption(getReflectionOption(field, FIELD_STORAGE_OPTION));
const ops = fieldOpsFromOption(getReflectionOption(field, FIELD_OPS_OPTION));
if (ops && storage.kind !== "stored" && storage.kind !== "static_final") {
throw new Error(`Field ${field.fullName} cannot declare both field_ops and package-resolved storage`);
}
if (storage.kind === "static_final" && !ops) {
throw new Error(`Field ${field.fullName} with static_final storage requires field_ops`);
}
const interfaceContract = interfaceFieldContractFromOption(getReflectionOption(field, INTERFACE_FIELD_OPTION), schemaVersion);
return {
name: field.name,
tag: field.id,
type: typeRefForField(field, schemaVersion),
conflict: conflictFromOption(getReflectionOption(field, CONFLICT_OPTION)),
repeated: field.repeated,
optional: field.optional,
storage,
...(ops ? { ops } : {}),
...(interfaceContract ? { interfaceContract } : {}),
isDisplayLabel: getReflectionOption(field, DISPLAY_LABEL_OPTION) === true,
};
};
const isManyCardinality = (cardinality) => cardinality === "many" ||
cardinality === "many_unique" ||
cardinality === "many_ordered" ||
cardinality === "many_unique_ordered";
const materializationFromOption = (value, fallbackVersion) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const classRef = symbolRefFromOption(object.class, {
namespace: "",
name: "",
version: fallbackVersion,
});
if (!classRef.name) {
throw new Error("Edge materialization requires class");
}
return {
class: classRef,
connectProjection: readString(object, "connect_projection") ?? "",
};
};
const endpointFromOption = (params) => {
const object = asObject(params.option);
const classRef = asObject(object?.class)
? symbolRefFromOption(object?.class, {
namespace: "",
name: "",
version: params.fallbackVersion,
})
: params.fallbackClass;
const interfaceRef = asObject(object?.interface)
? symbolRefFromOption(object?.interface, {
namespace: "",
name: "",
version: params.fallbackVersion,
})
: undefined;
const projection = readString(object, "projection") ?? params.fallbackProjection;
const cardinality = object?.cardinality === undefined
? params.fallbackCardinality
: cardinalityFromOption(object.cardinality);
const materialization = materializationFromOption(object?.materialize, params.fallbackVersion);
if (!classRef?.name && !interfaceRef?.name) {
throw new Error(`Edge endpoint ${projection} requires class or interface`);
}
return {
...(classRef?.name ? { class: classRef } : {}),
...(interfaceRef?.name ? { interface: interfaceRef } : {}),
projection,
cardinality,
indexed: readBoolean(object, "indexed") ?? false,
...(materialization ? { materialization } : {}),
};
};
const symbolKey = (ref) => ref ? [ref.namespace, ref.name, ref.version, ref.hash ?? ""].join(":") : "";
const endpointRoleKey = (endpoint) => [
symbolKey(endpoint.class),
symbolKey(endpoint.interface),
endpoint.projection,
endpoint.cardinality,
].join("|");
const normalizeEdgeEndpoints = (params) => {
if (params.directionality === "directed") {
return {
fromEndpoint: params.fromEndpoint,
toEndpoint: params.toEndpoint,
};
}
return endpointRoleKey(params.fromEndpoint) <= endpointRoleKey(params.toEndpoint)
? {
fromEndpoint: params.fromEndpoint,
toEndpoint: params.toEndpoint,
}
: {
fromEndpoint: params.toEndpoint,
toEndpoint: params.fromEndpoint,
};
};
const symbolArrayFromOption = (value, defaults) => asArray(value)
.map((item) => symbolRefFromOption(item, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
}))
.filter((symbol) => Boolean(symbol.name));
const isStringType = (type) => type.protoType === "string" || type.protoType === "google.protobuf.StringValue";
const validateDisplayLabelFields = (type, fields, operationServices) => {
const displayLabelFields = fields.filter((field) => field.isDisplayLabel);
if (displayLabelFields.length > 1) {
throw new Error(`Class ${type.fullName} declares multiple Camino display label fields`);
}
const displayLabelField = displayLabelFields[0];
if (!displayLabelField) {
return;
}
if (!displayLabelField.ops) {
if (!isStringType(displayLabelField.type)) {
throw new Error(`Display label field ${type.fullName}.${displayLabelField.name} must have string type`);
}
return;
}
const serviceName = displayLabelField.ops.service.replace(/^\./, "");
const getOperation = operationServices
.find((service) => service.fullName === serviceName)
?.operations.find((operation) => operation.name === "Get");
if (!getOperation || !isStringType(getOperation.outputType)) {
throw new Error(`Display label field ${type.fullName}.${displayLabelField.name} must resolve to string`);
}
};
const typeBindingFromOption = (value, schemaVersion) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const name = readString(object, "name");
const type = typeRefFromOption(object.type, schemaVersion);
if (!name || !type) {
throw new Error("Interface type_binding requires name and type");
}
return { name, type };
};
const interfaceImplementationFromOption = (value, defaults) => {
const object = asObject(value);
if (!object) {
throw new Error("Expected implements option object");
}
const interfaceId = symbolRefFromOption(object.interface, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
});
if (!interfaceId.name) {
throw new Error("implements option requires interface name");
}
return {
interface: interfaceId,
typeBindings: asArray(object.type_binding)
.map((binding) => typeBindingFromOption(binding, defaults.schemaVersion))
.filter((binding) => Boolean(binding)),
};
};
const serviceName = (service) => service.fullName.replace(/^\./, "");
const operationFromMethod = (method, schemaVersion) => {
const fn = functionRefFromOption(getReflectionOption(method, IMPL_OPTION));
const methodWithTypes = method;
return {
name: method.name,
inputType: typeRefForType(methodWithTypes.resolvedRequestType, method.requestType, schemaVersion),
outputType: typeRefForType(methodWithTypes.resolvedResponseType, method.responseType, schemaVersion),
function: fn,
};
};
const operationServiceFromService = (service, schemaVersion) => ({
name: service.name,
fullName: serviceName(service),
operations: service.methodsArray.map((method) => operationFromMethod(method, schemaVersion)),
});
const classSchemaFromType = (type, sourceFile, defaults, operationServices) => {
const classOption = asObject(getReflectionOption(type, CLASS_OPTION));
if (!classOption) {
return undefined;
}
const fallbackClassRef = {
namespace: defaults.schemaNamespace,
name: type.name,
version: defaults.schemaVersion,
};
const classId = symbolRefFromOption(classOption.id, fallbackClassRef);
const classVersion = readNumber(classOption, "version") ?? Number(classId.version);
if (!Number.isInteger(classVersion) || classVersion <= 0) {
throw new Error(`Class ${type.fullName} has invalid Camino class version`);
}
const fields = type.fieldsArray.map((field) => fieldSchemaFromField(field, defaults.schemaVersion));
validateDisplayLabelFields(type, fields, operationServices);
const edges = type.fieldsArray.flatMap((field) => {
const edgeOption = asObject(getReflectionOption(field, EDGE_OPTION));
if (!edgeOption) {
return [];
}
const legacyTargetClass = symbolRefFromOption(edgeOption.target, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
});
const cardinality = cardinalityFromOption(edgeOption.cardinality);
const declaredFromEndpoint = endpointFromOption({
option: edgeOption.this_endpoint,
fallbackClass: classId,
fallbackProjection: field.name,
fallbackCardinality: cardinality,
fallbackVersion: defaults.schemaVersion,
});
const declaredToEndpoint = endpointFromOption({
option: edgeOption.other_endpoint,
fallbackClass: legacyTargetClass.name ? legacyTargetClass : undefined,
fallbackProjection: readString(edgeOption, "inverse") ?? "",
fallbackCardinality: "many",
fallbackVersion: defaults.schemaVersion,
});
if (!declaredToEndpoint.projection) {
throw new Error(`Edge field ${type.fullName}.${field.name} requires other_endpoint.projection or inverse`);
}
const sourceType = typeRefForField(field, defaults.schemaVersion);
if (sourceType.symbol?.namespace !== "camino" ||
sourceType.symbol.name !== "Ref") {
throw new Error(`Edge field ${type.fullName}.${field.name} must use camino.Ref`);
}
const isMany = isManyCardinality(declaredFromEndpoint.cardinality);
if (isMany && !field.repeated) {
throw new Error(`Edge field ${type.fullName}.${field.name} must be repeated for ${declaredFromEndpoint.cardinality}`);
}
if (!isMany && field.repeated) {
throw new Error(`Edge field ${type.fullName}.${field.name} must not be repeated for ${declaredFromEndpoint.cardinality}`);
}
const directionality = edgeOption.undirected === true ? "undirected" : "directed";
const { fromEndpoint, toEndpoint } = normalizeEdgeEndpoints({
directionality,
fromEndpoint: declaredFromEndpoint,
toEndpoint: declaredToEndpoint,
});
const edgeId = symbolRefFromOption(edgeOption.id, {
namespace: defaults.schemaNamespace,
name: `${type.name}.${field.name}`,
version: defaults.schemaVersion,
});
const fallbackToClass = toEndpoint.class ?? {
namespace: "",
name: "",
version: "",
};
return [
{
id: edgeId,
directionality,
sourceField: fromEndpoint.projection,
fromClass: fromEndpoint.class ?? classId,
toClass: fallbackToClass,
cardinality: fromEndpoint.cardinality,
...(toEndpoint.projection
? { inverse: toEndpoint.projection }
: {}),
fields: [],
fromEndpoint,
toEndpoint,
declaringClass: classId,
tags: symbolArrayFromOption(edgeOption.tag, defaults),
implements: symbolArrayFromOption(edgeOption.implements, defaults),
},
];
});
const methods = getReflectionOptions(type, METHOD_OPTION)
.map(asObject)
.filter((option) => Boolean(option))
.map((option) => {
const name = readString(option, "name");
if (!name) {
throw new Error(`Method option on ${type.fullName} requires name`);
}
return {
name,
function: functionRefFromOption(option.function),
};
});
const migrations = getReflectionOptions(type, MIGRATION_OPTION)
.map(asObject)
.filter((option) => Boolean(option))
.map((option) => {
const fromVersion = readNumber(option, "from_version");
const toVersion = readNumber(option, "to_version");
if (!fromVersion || !toVersion) {
throw new Error(`Migration option on ${type.fullName} requires versions`);
}
return {
fromVersion,
toVersion,
function: functionRefFromOption(option.function),
};
});
const constructorOption = asObject(getReflectionOption(type, CONSTRUCTOR_OPTION));
const constructorSpec = constructorOption
? { function: functionRefFromOption(constructorOption.function) }
: undefined;
return {
id: classId,
version: classVersion,
fields,
edges,
methods,
migrations,
operationServices,
implements: getReflectionOptions(type, IMPLEMENTS_OPTION).map((option) => interfaceImplementationFromOption(option, defaults)),
...(constructorSpec ? { constructorSpec } : {}),
sourceFile,
protoMessage: type.fullName,
};
};
const interfaceSchemaFromType = (type, sourceFile, defaults) => {
const interfaceOption = asObject(getReflectionOption(type, INTERFACE_OPTION));
if (!interfaceOption) {
return undefined;
}
const classOption = asObject(getReflectionOption(type, CLASS_OPTION));
if (classOption) {
throw new Error(`${type.fullName} cannot be both a Camino class and interface`);
}
const fallbackInterfaceRef = {
namespace: defaults.schemaNamespace,
name: type.name,
version: defaults.schemaVersion,
};
const interfaceId = symbolRefFromOption(interfaceOption.id, fallbackInterfaceRef);
const interfaceVersion = readNumber(interfaceOption, "version") ?? Number(interfaceId.version);
if (!Number.isInteger(interfaceVersion) || interfaceVersion <= 0) {
throw new Error(`Interface ${type.fullName} has invalid Camino interface version`);
}
return {
id: interfaceId,
version: interfaceVersion,
fields: type.fieldsArray.map((field) => fieldSchemaFromField(field, defaults.schemaVersion)),
sourceFile,
protoMessage: type.fullName,
};
};
const walkTypes = (namespace, visit) => {
for (const nested of namespace.nestedArray) {
if (nested instanceof protobuf.Type) {
visit(nested);
walkTypes(nested, visit);
}
else if (nested instanceof protobuf.Namespace) {
walkTypes(nested, visit);
}
}
};
const walkServices = (namespace, visit) => {
for (const nested of namespace.nestedArray) {
if (nested instanceof protobuf.Service) {
visit(nested);
}
else if (nested instanceof protobuf.Namespace) {
walkServices(nested, visit);
}
}
};
export const compileCaminoSchema = async (sourceFile) => {
const absoluteSourceFile = path.resolve(sourceFile);
const defaults = extractFileDefaults(absoluteSourceFile);
const root = new protobuf.Root();
const envIncludeDirs = [
process.env.QUIXOS_PROTO_PATH,
process.env.CAMINO_PROTO_PATH,
]
.filter((value) => Boolean(value))
.join(path.delimiter)
.split(path.delimiter)
.map((entry) => entry.trim())
.filter(Boolean)
.map((entry) => path.resolve(entry));
const includeDirs = [
path.dirname(absoluteSourceFile),
path.resolve("../../quixos-protocol/proto"),
path.resolve("quixos-protocol/proto"),
path.resolve("proto"),
...envIncludeDirs,
];
root.resolvePath = (origin, target) => {
if (path.isAbsolute(target) && fs.existsSync(target)) {
return target;
}
const originDir = origin ? path.dirname(origin) : undefined;
const candidates = [
...(originDir ? [path.resolve(originDir, target)] : []),
...includeDirs.map((dir) => path.resolve(dir, target)),
];
const found = candidates.find((candidate) => fs.existsSync(candidate));
return found ?? target;
};
await root.load(absoluteSourceFile, { keepCase: true });
root.resolveAll();
const operationServices = [];
walkServices(root, (service) => {
operationServices.push(operationServiceFromService(service, defaults.schemaVersion));
});
const classes = [];
const interfaces = [];
walkTypes(root, (type) => {
const interfaceSchema = interfaceSchemaFromType(type, absoluteSourceFile, defaults);
if (interfaceSchema) {
interfaces.push(interfaceSchema);
}
const classSchema = classSchemaFromType(type, absoluteSourceFile, defaults, operationServices);
if (classSchema) {
classes.push(classSchema);
}
});
return {
sourceFile: absoluteSourceFile,
classes,
interfaces,
};
};
-135
View File
@@ -1,135 +0,0 @@
export type SymbolRef = {
namespace: string;
name: string;
version: string;
hash?: string;
};
export type FunctionRef = {
packageNamespace: string;
packageName: string;
symbol: string;
operation?: string;
versionRef?: string;
};
export type ConflictStrategy = "replace" | "preserve_conflicts" | "crdt";
export type Cardinality = "optional_one" | "exactly_one" | "many" | "many_unique" | "many_ordered" | "many_unique_ordered";
export type EdgeDirectionality = "directed" | "undirected";
export type EdgeMaterialization = {
class: SymbolRef;
connectProjection: string;
};
export type FieldStorageKind = "stored" | "derived" | "lazy" | "external" | "static_final";
export type FieldStorage = {
kind: FieldStorageKind;
resolver?: FunctionRef;
cache: boolean;
};
export type FieldOps = {
implementation: "service";
service: string;
};
export type TypeRef = {
protoType: string;
symbol?: SymbolRef;
enumValues?: string[];
};
export type TypeBinding = {
name: string;
type: TypeRef;
};
export type InterfaceFieldContract = {
required: boolean;
readable: boolean;
writable: boolean;
watchable: boolean;
typeParam?: string;
type?: TypeRef;
};
export type InterfaceImplementation = {
interface: SymbolRef;
typeBindings: TypeBinding[];
};
export type FieldSchema = {
name: string;
tag: number;
type: TypeRef;
conflict: ConflictStrategy;
repeated: boolean;
optional: boolean;
storage: FieldStorage;
ops?: FieldOps;
interfaceContract?: InterfaceFieldContract;
isDisplayLabel: boolean;
};
export type EdgeEndpointSchema = {
class?: SymbolRef;
interface?: SymbolRef;
projection: string;
cardinality: Cardinality;
indexed: boolean;
materialization?: EdgeMaterialization;
};
export type EdgeSchema = {
id: SymbolRef;
directionality: EdgeDirectionality;
sourceField: string;
fromClass: SymbolRef;
toClass: SymbolRef;
cardinality: Cardinality;
inverse?: string;
fields: FieldSchema[];
fromEndpoint: EdgeEndpointSchema;
toEndpoint: EdgeEndpointSchema;
declaringClass: SymbolRef;
tags: SymbolRef[];
implements: SymbolRef[];
};
export type MethodSchema = {
name: string;
function: FunctionRef;
};
export type MigrationSpec = {
fromVersion: number;
toVersion: number;
function: FunctionRef;
};
export type ConstructorSpec = {
function: FunctionRef;
};
export type OperationSchema = {
name: string;
inputType: TypeRef;
outputType: TypeRef;
function: FunctionRef;
};
export type OperationServiceSchema = {
name: string;
fullName: string;
operations: OperationSchema[];
};
export type ClassSchema = {
id: SymbolRef;
version: number;
fields: FieldSchema[];
edges: EdgeSchema[];
methods: MethodSchema[];
migrations: MigrationSpec[];
operationServices: OperationServiceSchema[];
implements: InterfaceImplementation[];
constructorSpec?: ConstructorSpec;
sourceFile: string;
protoMessage: string;
};
export type InterfaceSchema = {
id: SymbolRef;
version: number;
fields: FieldSchema[];
sourceFile: string;
protoMessage: string;
};
export type SchemaCompileResult = {
sourceFile: string;
classes: ClassSchema[];
interfaces: InterfaceSchema[];
};
//# sourceMappingURL=schema-ir.d.ts.map
-1
View File
@@ -1 +0,0 @@
{"version":3,"file":"schema-ir.d.ts","sourceRoot":"","sources":["../src/schema-ir.ts"],"names":[],"mappings":"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"}
-1
View File
@@ -1 +0,0 @@
export {};
Generated
+14 -14
View File
@@ -74,17 +74,17 @@
"nixpkgs": "nixpkgs_2" "nixpkgs": "nixpkgs_2"
}, },
"locked": { "locked": {
"lastModified": 1784395768, "lastModified": 1789328055,
"narHash": "sha256-g03xOnzJHiL/edNV6nqURtaPqiapq2uCm7wQTZh4b5s=", "narHash": "sha256-tZVGOpDnT80j3roNQXpCxw8BxNZxqVutclxr49Vhg4w=",
"ref": "refs/heads/exported", "ref": "refs/tags/quixos-reachability/9867bf4552c09ee71ebeefe08e652fd870894130",
"rev": "e6b34535afa6e94a118e1f9d082054855e7df632", "rev": "9867bf4552c09ee71ebeefe08e652fd870894130",
"revCount": 24, "revCount": 45,
"type": "git", "type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git" "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git"
}, },
"original": { "original": {
"ref": "refs/heads/exported", "ref": "refs/tags/quixos-reachability/9867bf4552c09ee71ebeefe08e652fd870894130",
"rev": "e6b34535afa6e94a118e1f9d082054855e7df632", "rev": "9867bf4552c09ee71ebeefe08e652fd870894130",
"type": "git", "type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git" "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git"
} }
@@ -92,17 +92,17 @@
"quixosNixHelpers": { "quixosNixHelpers": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1783914102, "lastModified": 1788574090,
"narHash": "sha256-A9EnXxKaODNrSUpw1IlUBR8fe4px5I+wNJFUFGbZY7c=", "narHash": "sha256-bSgc0LS2Ub01fnE14VqazdZzFuVPl4sykmA2d1l4kDs=",
"ref": "refs/heads/exported", "ref": "refs/tags/quixos-reachability/7177130c0365f2fa58ea4877366e1c5d17db4c01",
"rev": "1f0c39b01501d646fe97dfc6e5777ccab0bde2f1", "rev": "7177130c0365f2fa58ea4877366e1c5d17db4c01",
"revCount": 6, "revCount": 4,
"type": "git", "type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git" "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
}, },
"original": { "original": {
"ref": "refs/heads/exported", "ref": "refs/tags/quixos-reachability/7177130c0365f2fa58ea4877366e1c5d17db4c01",
"rev": "1f0c39b01501d646fe97dfc6e5777ccab0bde2f1", "rev": "7177130c0365f2fa58ea4877366e1c5d17db4c01",
"type": "git", "type": "git",
"url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git" "url": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git"
} }
+33 -20
View File
@@ -4,9 +4,9 @@
inputs = { inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils"; flake-utils.url = "github:numtide/flake-utils";
quixos-protocol.url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git?ref=refs/heads/exported&rev=e6b34535afa6e94a118e1f9d082054855e7df632"; quixos-protocol.url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git?ref=refs/tags/quixos-reachability/9867bf4552c09ee71ebeefe08e652fd870894130&rev=9867bf4552c09ee71ebeefe08e652fd870894130";
quixosNixHelpers = { quixosNixHelpers = {
url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/heads/exported&rev=1f0c39b01501d646fe97dfc6e5777ccab0bde2f1"; url = "git+https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-nix-helpers.git?ref=refs/tags/quixos-reachability/7177130c0365f2fa58ea4877366e1c5d17db4c01&rev=7177130c0365f2fa58ea4877366e1c5d17db4c01";
flake = false; flake = false;
}; };
}; };
@@ -14,23 +14,36 @@
outputs = inputs@{ nixpkgs, flake-utils, quixosNixHelpers, ... }: outputs = inputs@{ nixpkgs, flake-utils, quixosNixHelpers, ... }:
let let
quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix"; quixosHelpers = import "${quixosNixHelpers}/quixos-package-helpers.nix";
in packageOutputs = quixosHelpers.mkCaminoTsYarnNixifyFlake {
quixosHelpers.mkCaminoTsYarnNixifyFlake { inherit inputs nixpkgs flake-utils;
inherit inputs nixpkgs flake-utils; packageRoot = ./.;
packageRoot = ./.; sourceName = "quixos-camino-package-runtime-source";
sourceName = "quixos-camino-package-runtime-source"; promptName = "camino-package-runtime";
promptName = "camino-package-runtime"; nativeBuildInputs = { pkgs, ... }: [
nativeBuildInputs = { pkgs, ... }: [ pkgs.protobuf
pkgs.protobuf ];
]; buildEnv = { inputs, pkgs, system }: {
buildEnv = { inputs, pkgs, system }: { QUIXOS_PROTO_PATH = "${pkgs.protobuf}/include:${inputs.quixos-protocol.packages.${system}.default}/proto";
QUIXOS_PROTO_PATH = "${pkgs.protobuf}/include:${inputs.quixos-protocol.packages.${system}.default}/proto"; };
devShellPackages = { pkgs, ... }: [
pkgs.protobuf
];
devShellHook = { inputs, pkgs, system, ... }: ''
export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:${inputs.quixos-protocol.packages.${system}.default}/proto''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}"
'';
}; };
devShellPackages = { pkgs, ... }: [ in
pkgs.protobuf packageOutputs // flake-utils.lib.eachDefaultSystem (system:
]; let
devShellHook = { inputs, pkgs, system, ... }: '' pkgs = import nixpkgs { inherit system; };
export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:${inputs.quixos-protocol.packages.${system}.default}/proto''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}" builtPackage = packageOutputs.packages.${system}.default;
''; in
}; {
checks.dist-current = pkgs.runCommand "camino-package-runtime-dist-current" { } ''
diff --recursive --unified \
${./dist} \
${builtPackage}/libexec/-quixos-camino-package-runtime/dist
touch "$out"
'';
});
} }
+7 -12
View File
@@ -2,13 +2,10 @@
"name": "@quixos/camino-package-runtime", "name": "@quixos/camino-package-runtime",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"packageManager": "yarn@4.14.1", "packageManager": "yarn@4.18.0",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"bin": {
"camino-codegen-ts-runtime": "dist/codegen-ts-runtime.js"
},
"exports": { "exports": {
".": { ".": {
"types": "./dist/index.d.ts", "types": "./dist/index.d.ts",
@@ -16,21 +13,19 @@
} }
}, },
"scripts": { "scripts": {
"build": "yarn generate && tsc -p tsconfig.json", "build": "rm -rf dist && yarn generate && tsc -p tsconfig.json",
"generate": "rm -rf src/camino src/quixos && protoc --es_out=src --es_opt=target=ts,import_extension=js --proto_path=$QUIXOS_PROTO_PATH quixos/refs.proto quixos/runtime.proto camino/schema.proto camino/api.proto", "generate": "rm -rf src/camino src/quixos && protoc --experimental_allow_proto3_optional --es_out=src --es_opt=target=ts,import_extension=js --proto_path=$QUIXOS_PROTO_PATH quixos/refs.proto quixos/runtime.proto quixos/orch.proto quixos/package.proto camino/schema.proto camino/api.proto",
"typecheck": "yarn generate && tsc --noEmit" "typecheck": "yarn generate && tsc --noEmit",
"test": "yarn build && node --test test/*.test.mjs"
}, },
"dependencies": { "dependencies": {
"@automerge/automerge": "^3.3.0",
"@bufbuild/protobuf": "^2.12.1", "@bufbuild/protobuf": "^2.12.1",
"@connectrpc/connect": "^2.1.2", "@connectrpc/connect": "^2.1.2",
"@connectrpc/connect-node": "^2.1.2", "@connectrpc/connect-node": "^2.1.2"
"@quixos/camino-datatypes": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-datatypes.git#commit=e061e290709c672d2dc675e5c871733de195211a",
"protobufjs": "^7.5.4"
}, },
"devDependencies": { "devDependencies": {
"@bufbuild/protoc-gen-es": "^2.12.1", "@bufbuild/protoc-gen-es": "^2.12.1",
"@types/node": "^24", "@types/node": "^24",
"typescript": "^5.9.3" "typescript": "^7.0.2"
} }
} }
+148
View File
@@ -0,0 +1,148 @@
import { create } from "@bufbuild/protobuf";
import { ValueSchema, ObjectValueSchema, type Value } from "./camino/api_pb.js";
import { derived, jsToProtoValue, liveValue, protoValueToJs,
type RuntimeContext, type RuntimeHandler, type DerivedHandler } from "./index.js";
export type { QxObjectRef } from "./references.js";
import { assertReferenceFree, referenceToWire } from "./references.js";
declare const watchBrand: unique symbol;
export type QxWatchHandle = string & { readonly [watchBrand]: true };
export type MessageBinding<T> = { encode(value: T): Value; decode(value: Value): T };
export type BindingValue<B> = B extends MessageBinding<infer T> ? T : never;
export type QxHandler<C, O> = (context: C) => O | Promise<O>;
export type QxDerived<C, O> = { kind: "derived"; get: QxHandler<C, O> };
export type QxSession<C> = {id: string; run<T>(work: (context: C) => Promise<T>): Promise<T>; close(): Promise<void>};
export type QxContextLifecycle<C> = {signal?: AbortSignal; openSession?: () => Promise<QxSession<C>>};
export const qxDerived = <C, O>(get: QxHandler<C, O>): QxDerived<C, O> => ({ kind: "derived", get });
/** Versioned binding ABI. This mirrors the language-neutral value IR. */
export type QxValueType =
| { kind: "builtin"; name: "unit" | "watch-handle" }
| { kind: "scalar"; name: string }
| { kind: "message"; descriptorId: string }
| { kind: "object-ref"; expectation: unknown }
| { kind: "optional" | "list"; value: QxValueType };
export type QxOperationSpec = { id: string; inputType: QxValueType; outputType: QxValueType };
export type QxPortSpec =
| { kind: "state"; id: string; valueType: QxValueType; primitives: string[] }
| { kind: "edge"; id: string; primitives: string[] }
| { kind: "interface"; id: string; operations: Record<string, QxOperationSpec> }
| { kind: "constructor"; id: string; inputType: QxValueType };
export type QxHandlerSpec = {
inputType: QxValueType; outputType: QxValueType; eventType?: QxValueType;
ports: Record<string, QxPortSpec>;
};
export type QxMessages = Record<string, MessageBinding<any>>;
// Conversion belongs at the binding boundary. It does not add orchestrator validation.
export const decodeQxValue = (type: QxValueType, value: Value | undefined, messages: QxMessages): any => {
if (type.kind === "builtin" && type.name === "unit") return null;
if (!value) throw new Error("Missing QX wire value");
if (type.kind === "optional") return value.kind.case === "nullValue" ? null : decodeQxValue(type.value, value, messages);
if (type.kind === "list") {
if (value.kind.case !== "listValue") throw new Error("Expected QX list");
return value.kind.value.values.map((entry) => decodeQxValue(type.value, entry, messages));
}
if (type.kind === "message") {
assertReferenceFree(protoValueToJs(value));
const decoded = requireMessage(messages, type.descriptorId).decode(value);
assertReferenceFree(decoded);
return decoded;
}
if (type.kind === "object-ref") {
if (value.kind.case !== "refValue") throw new Error("Expected a declared RPC object reference");
return protoValueToJs(value);
}
if (value.kind.case === "refValue") throw new Error("Reference supplied to a non-reference value");
if (type.kind === "scalar") {
if (type.name === "int64" || type.name === "uint64") {
if (value.kind.case !== "integerValue") throw new Error("Expected QX integer");
return BigInt(value.kind.value);
}
if (type.name === "bytes") {
if (value.kind.case !== "bytesValue") throw new Error("Expected QX bytes");
return value.kind.value;
}
}
return protoValueToJs(value);
};
const requireMessage = (messages: QxMessages, id: string) => {
const binding = messages[id];
if (!binding) throw new Error(`Missing message binding ${id}`);
return binding;
};
export const encodeQxValue = (type: QxValueType, value: any, messages: QxMessages): Value => {
if (type.kind === "builtin" && type.name === "unit") return jsToProtoValue(null);
if (type.kind === "optional") return value === null ? jsToProtoValue(null) : encodeQxValue(type.value, value, messages);
if (type.kind === "list") return jsToProtoValue(value.map((entry: unknown) => liveValue(encodeQxValue(type.value, entry, messages))));
if (type.kind === "object-ref") { referenceToWire(value); return jsToProtoValue(value); }
assertReferenceFree(value);
if (type.kind === "message") {
const encoded = requireMessage(messages, type.descriptorId).encode(value);
assertReferenceFree(protoValueToJs(encoded));
return encoded;
}
return jsToProtoValue(value);
};
const inputValue = (context: RuntimeContext, type: QxValueType) => {
if (type.kind === "message") return create(ValueSchema, { kind: { case: "objectValue",
value: create(ObjectValueSchema, { fields: context.inputProto }) } });
return context.inputProto.value;
};
const inputFields = (type: QxValueType, value: unknown, messages: QxMessages): Record<string, unknown> => {
if (type.kind === "builtin" && type.name === "unit") return {};
const encoded = encodeQxValue(type, value, messages);
if (type.kind === "message") {
if (encoded.kind.case !== "objectValue") throw new Error("Message inputs must encode an object value");
return Object.fromEntries(Object.entries(encoded.kind.value.fields).map(([key, entry]) => [key, liveValue(entry)]));
}
return { value: liveValue(encoded) };
};
/** The sole unchecked cast connects generated contracts to the dynamic RPC runtime. */
export const bindQxHandler = <C, O>(
spec: QxHandlerSpec, handler: QxHandler<C, O> | QxDerived<C, O>, messages: QxMessages,
): RuntimeHandler | DerivedHandler => {
const bindContext = (raw: RuntimeContext): C => {
const ports = Object.fromEntries(Object.entries(spec.ports).map(([name, port]) => {
switch (port.kind) {
case "state": {
const state = raw.state(port.id);
return [name, {
...(port.primitives.includes("read") ? { get: async () => decodeQxValue(port.valueType, (await state.live()).$quixosValue, messages) } : {}),
...(port.primitives.includes("write") ? { set: async (value: unknown) => state.set(liveValue(encodeQxValue(port.valueType, value, messages))) } : {}),
}];
}
case "edge": {
const edge = raw.edge(port.id);
return [name, {...Object.fromEntries(port.primitives.map((primitive) => [primitive, edge[primitive as "resolve" | "connect" | "disconnect"]])),
...(port.primitives.includes("resolve") ? {collection: edge.collection} : {}),
...(port.primitives.includes("resolve") && port.primitives.includes("connect") && port.primitives.includes("disconnect") ? {replace: edge.replace} : {})}];
}
case "interface": {
const target = raw.interface(port.id);
return [name, Object.fromEntries(Object.entries(port.operations).map(([name, operation]) => [name,
async (input: unknown) => decodeQxValue(operation.outputType,
(await target.live(operation.id, inputFields(operation.inputType, input, messages))).$quixosValue, messages),
]))];
}
case "constructor": return [name, { construct: (input: unknown) => raw.constructor(port.id).construct(inputFields(port.inputType, input, messages)) }];
}
}));
return { objectId: raw.objectId, signal: raw.signal,
...(raw.openSession ? {openSession: async () => {
const session = await raw.openSession!();
return {id: session.id, close: () => session.close(),
run: <T>(work: (context: C) => Promise<T>) => session.run((next) => work(bindContext(next)))};
}} : {}),
input: decodeQxValue(spec.inputType, inputValue(raw, spec.inputType), messages), ports } as C;
};
const execute = async (raw: RuntimeContext) => {
const context = bindContext(raw);
const value = await (typeof handler === "function" ? handler(context) : handler.get(context));
return liveValue(encodeQxValue(spec.eventType ?? spec.outputType, value, messages));
};
return typeof handler === "function" ? execute : derived(execute);
};
+376 -327
View File
File diff suppressed because one or more lines are too long
+181 -840
View File
File diff suppressed because one or more lines are too long
-673
View File
@@ -1,673 +0,0 @@
#!/usr/bin/env node
import fs from "node:fs";
import path from "node:path";
import protobuf from "protobufjs";
import {
compileCaminoSchema,
loadCaminoSchemaRoot,
} from "./schema-compiler.js";
import type {
ClassSchema,
FieldSchema,
FunctionRef,
InterfaceImplementation,
TypeRef,
} from "./schema-ir.js";
const usage = (): never => {
console.error(
"Usage: camino-codegen-ts-runtime [--react-only] <class-schema.camino.proto> <out-dir> [implementation-import]",
);
process.exit(1);
};
const required = (value: string | undefined) => value ?? usage();
const stringLiteral = (value: string) => JSON.stringify(value);
const upperFirst = (value: string) =>
value.length === 0 ? value : `${value[0]?.toUpperCase()}${value.slice(1)}`;
const lowerFirst = (value: string) =>
value.length === 0 ? value : `${value[0]?.toLowerCase()}${value.slice(1)}`;
const camel = (value: string) =>
value
.split(/[^a-zA-Z0-9]+/)
.filter(Boolean)
.map((part, index) =>
index === 0 ? lowerFirst(part) : upperFirst(lowerFirst(part)),
)
.join("");
const isIdentifier = (value: string) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);
const classId = (schema: ClassSchema) =>
`${schema.id.namespace}:${schema.id.name}:${schema.id.version}:${
schema.id.hash ?? ""
}`;
const symbolId = (value: { namespace: string; name: string; version: string; hash?: string }) =>
`${value.namespace}:${value.name}:${value.version}:${value.hash ?? ""}`;
const normalizedProtoType = (value: string) => value.replace(/^\./, "");
const declarationName = (value: protobuf.Type | protobuf.Enum) => value.name;
const tsTypeForTypeRef = (
type: TypeRef,
root?: protobuf.Root,
): string => {
if (type.symbol) {
return `ObjectRef<${stringLiteral(symbolId(type.symbol))}>`;
}
if (type.enumValues && type.enumValues.length > 0) {
return type.enumValues.map(stringLiteral).join(" | ");
}
const protoType = normalizedProtoType(type.protoType);
switch (protoType) {
case "string":
case "google.protobuf.StringValue":
return "string";
case "bool":
case "google.protobuf.BoolValue":
return "boolean";
case "double":
case "float":
case "google.protobuf.DoubleValue":
case "google.protobuf.FloatValue":
case "int32":
case "sint32":
case "sfixed32":
case "uint32":
case "fixed32":
case "int64":
case "sint64":
case "sfixed64":
case "uint64":
case "fixed64":
case "google.protobuf.Int32Value":
case "google.protobuf.UInt32Value":
case "google.protobuf.Int64Value":
case "google.protobuf.UInt64Value":
return "number";
case "bytes":
case "google.protobuf.BytesValue":
return "Uint8Array";
default:
if (protoType === "google.protobuf.Empty") {
return "Record<string, never>";
}
try {
const reflected = root?.lookup(protoType);
if (reflected instanceof protobuf.Type || reflected instanceof protobuf.Enum) {
return declarationName(reflected);
}
} catch {
// Unknown imported message types remain opaque at this codegen boundary.
}
return "unknown";
}
};
const tsTypeForField = (field: FieldSchema, root?: protobuf.Root): string =>
tsTypeForTypeRef(field.type, root);
const tsValueTypeForField = (field: FieldSchema, root?: protobuf.Root) =>
field.repeated ? `${tsTypeForField(field, root)}[]` : tsTypeForField(field, root);
const tsFieldApiType = (field: FieldSchema, root?: protobuf.Root) =>
field.conflict === "crdt"
? `CrdtField<${tsValueTypeForField(field, root)}>`
: `Field<${tsValueTypeForField(field, root)}>`;
const functionExportName = (fn: FunctionRef, fallback: string) => {
if (isIdentifier(fn.symbol)) {
return fn.symbol;
}
const fallbackName = camel(fallback);
if (isIdentifier(fallbackName)) {
return fallbackName;
}
throw new Error(`Cannot generate TS export name for function ${fn.symbol}`);
};
const generatedWarning = `// @generated by camino-codegen-ts-runtime. Do not edit.\n`;
const scalarTsType = (field: protobuf.Field, root: protobuf.Root): string => {
const primitive = tsTypeForTypeRef({ protoType: field.type }, root);
if (primitive !== "unknown") {
return primitive;
}
const resolved = field.resolvedType;
if (resolved instanceof protobuf.Type || resolved instanceof protobuf.Enum) {
return declarationName(resolved);
}
return "unknown";
};
const collectProtoDeclarations = (
root: protobuf.Root,
types: TypeRef[],
) => {
const declarations = new Map<string, protobuf.Type | protobuf.Enum>();
const visit = (value: protobuf.Type | protobuf.Enum) => {
const key = value.fullName;
if (declarations.has(key)) {
return;
}
declarations.set(key, value);
if (value instanceof protobuf.Type) {
for (const field of value.fieldsArray) {
if (
field.resolvedType instanceof protobuf.Type ||
field.resolvedType instanceof protobuf.Enum
) {
visit(field.resolvedType);
}
}
}
};
for (const type of types) {
if (type.symbol || !type.protoType) {
continue;
}
try {
const reflected = root.lookup(normalizedProtoType(type.protoType));
if (reflected instanceof protobuf.Type || reflected instanceof protobuf.Enum) {
visit(reflected);
}
} catch {
// Opaque imported types are represented as unknown by the generated API.
}
}
return [...declarations.values()]
.map((value) => {
if (value instanceof protobuf.Enum) {
return `export type ${declarationName(value)} = ${Object.keys(value.values)
.map(stringLiteral)
.join(" | ")};`;
}
const fields = value.fieldsArray.map((field) => {
const fieldType = scalarTsType(field, root);
const valueType = field.map
? `Record<string, ${fieldType}>`
: field.repeated
? `${fieldType}[]`
: fieldType;
return ` ${JSON.stringify(field.name)}${field.optional ? "?" : ""}: ${valueType};`;
});
return `export type ${declarationName(value)} = {\n${fields.join("\n")}\n};`;
})
.join("\n\n");
};
type FunctionSpec = {
exportName: string;
symbol: string;
operation?: string;
packageNamespace: string;
packageName: string;
field?: {
name: string;
type: string;
storage: string;
conflict: string;
};
};
const fieldTypeId = (field: FieldSchema) =>
field.type.symbol ? symbolId(field.type.symbol) : field.type.protoType;
const crdtStorageTypeId = (field: FieldSchema) =>
field.type.protoType ||
(field.type.symbol
? `${field.type.symbol.namespace}.${field.type.symbol.name}`
: fieldTypeId(field));
const fieldStorageId = (field: FieldSchema) =>
field.ops && field.storage.kind === "stored" ? "derived" : field.storage.kind;
const interfaceTypeName = (implementation: InterfaceImplementation) =>
`${implementation.interface.name}Ref`;
const renderInterfaceRefTypes = (schema: ClassSchema) =>
schema.implements
.map((implementation) => {
const typeParams = implementation.typeBindings.map((binding) => binding.name);
const generic =
typeParams.length > 0 ? `<${typeParams.join(", ")}>` : "";
const bindings =
typeParams.length > 0
? typeParams
.map((param) => ` readonly ${param}: ${param};`)
.join("\n")
: " readonly value: unknown;";
return `export type ${interfaceTypeName(implementation)}${generic} = ObjectRef<string> & {
readonly $caminoInterfaces: {
readonly ${stringLiteral(symbolId(implementation.interface))}: {
${bindings}
};
};
};`;
})
.join("\n\n");
const interfaceMixins = (schema: ClassSchema, root: protobuf.Root) =>
schema.implements.map((implementation) => {
const typeArgs = implementation.typeBindings.map((binding) =>
tsTypeForTypeRef(binding.type, root),
);
return `${interfaceTypeName(implementation)}${
typeArgs.length > 0 ? `<${typeArgs.join(", ")}>` : ""
}`;
});
const operationFunctionSpecs = (schema: ClassSchema): FunctionSpec[] =>
schema.fields.flatMap((field) => {
const serviceName = field.ops?.service.replace(/^\./, "");
if (!serviceName) {
return [];
}
const service = schema.operationServices.find(
(candidate) => candidate.fullName === serviceName,
);
if (!service) {
throw new Error(
`${schema.id.name}.${field.name} points to missing operation service ${field.ops?.service}`,
);
}
return service.operations.map((operation) => ({
exportName: functionExportName(
operation.function,
`${field.name}_${operation.name}`,
),
symbol: operation.function.symbol,
...(operation.function.operation
? { operation: operation.function.operation }
: {}),
packageNamespace: operation.function.packageNamespace,
packageName: operation.function.packageName,
field: {
name: field.name,
type: fieldTypeId(field),
storage: fieldStorageId(field),
conflict: field.conflict,
},
}));
});
const renderRuntime = (schema: ClassSchema, root: protobuf.Root) => {
const className = schema.id.name;
const objectTypeName = `${className}Object`;
const refTypeName = `${className}Ref`;
const contextTypeName = `${className}Context`;
const implementationTypeName = `${className}Implementation`;
const serveName = `serve${className}Runtime`;
const createObjectName = `create${className}Object`;
const interfaceRefTypes = renderInterfaceRefTypes(schema);
const refType =
[ `ObjectRef<${stringLiteral(classId(schema))}>`, ...interfaceMixins(schema, root)]
.join(" & ");
const edgeFields = new Set(schema.edges.map((edge) => edge.sourceField));
const writableFields = schema.fields.filter(
(field) =>
field.storage.kind === "stored" &&
!field.ops &&
!edgeFields.has(field.name),
);
const functionSpecs = [
...(schema.constructorSpec
? [
{
exportName: functionExportName(
schema.constructorSpec.function,
"constructor",
),
symbol: schema.constructorSpec.function.symbol,
...(schema.constructorSpec.function.operation
? { operation: schema.constructorSpec.function.operation }
: {}),
packageNamespace: schema.constructorSpec.function.packageNamespace,
packageName: schema.constructorSpec.function.packageName,
},
]
: []),
...schema.methods.map((method) => ({
exportName: functionExportName(method.function, method.name),
symbol: method.function.symbol,
...(method.function.operation ? { operation: method.function.operation } : {}),
packageNamespace: method.function.packageNamespace,
packageName: method.function.packageName,
})),
...schema.fields.flatMap((field) =>
field.storage.resolver
? [
{
exportName: functionExportName(field.storage.resolver, field.name),
symbol: field.storage.resolver.symbol,
...(field.storage.resolver.operation
? { operation: field.storage.resolver.operation }
: {}),
packageNamespace: field.storage.resolver.packageNamespace,
packageName: field.storage.resolver.packageName,
},
]
: [],
),
...operationFunctionSpecs(schema),
];
const firstFunction = functionSpecs[0];
if (!firstFunction) {
throw new Error(`${schema.id.name} has no runtime functions to generate`);
}
const mixedPackage = functionSpecs.find(
(spec) =>
spec.packageNamespace !== firstFunction.packageNamespace ||
spec.packageName !== firstFunction.packageName,
);
if (mixedPackage) {
throw new Error(
`${schema.id.name} points to multiple packages; v0 TS runtime generation expects one package`,
);
}
return `${generatedWarning}import {
type CaminoClient,
createCrdtField,
createField,
type CrdtField,
type Field,
type FieldOperation,
type InvokeRequest,
objectRef,
type ObjectRef,
type RuntimeHandler,
serveQuixosPackageRuntime,
} from "@quixos/camino-package-runtime";
${collectProtoDeclarations(root, schema.implements.flatMap((entry) => entry.typeBindings.map((binding) => binding.type)))}
${interfaceRefTypes ? `${interfaceRefTypes}\n\n` : ""}export type ${refTypeName} = ${refType};
export type ${objectTypeName} = {
id: ${refTypeName};
${writableFields
.map(
(field) =>
` ${camel(field.name)}: ${tsFieldApiType(field, root)};`,
)
.join("\n")}
};
export type ${contextTypeName} = {
object: ${objectTypeName};
camino: CaminoClient;
request: InvokeRequest;
};
export type ${implementationTypeName} = {
${functionSpecs
.map((spec) =>
spec.operation
? ` ${spec.exportName}: FieldOperation<${contextTypeName}>;`
: ` ${spec.exportName}: RuntimeHandler<${contextTypeName}>;`,
)
.filter((line, index, lines) => lines.indexOf(line) === index)
.join("\n")}
};
const packageNamespace = ${stringLiteral(firstFunction.packageNamespace)};
const packageName = ${stringLiteral(firstFunction.packageName)};
const runtimeProtocolVersion = ${stringLiteral("camino-orch-v0")};
const functions = [
${functionSpecs
.map(
(spec) =>
` { exportName: ${stringLiteral(spec.exportName)}, symbol: ${stringLiteral(spec.symbol)}${
spec.operation ? `, operation: ${stringLiteral(spec.operation)}` : ""
}${
spec.field
? `, field: { name: ${stringLiteral(spec.field.name)}, type: ${stringLiteral(spec.field.type)}, storage: ${stringLiteral(spec.field.storage)}, conflict: ${stringLiteral(spec.field.conflict)} }`
: ""
} },`,
)
.join("\n")}
] as const;
export const ${createObjectName} = (
camino: CaminoClient,
objectId: string,
): ${objectTypeName} => {
const id = objectRef<${stringLiteral(classId(schema))}>(objectId) as ${refTypeName};
return {
id,
${writableFields
.map(
(fieldSchema) =>
fieldSchema.conflict === "crdt"
? ` ${camel(fieldSchema.name)}: createCrdtField(camino, id, ${stringLiteral(fieldSchema.name)}, ${stringLiteral(crdtStorageTypeId(fieldSchema))}),`
: ` ${camel(fieldSchema.name)}: createField(camino, id, ${stringLiteral(fieldSchema.name)}),`,
)
.join("\n")}
};
};
export const create${className}Context = (
camino: CaminoClient,
request: InvokeRequest,
): ${contextTypeName} => ({
object: ${createObjectName}(camino, request.objectId),
camino,
request,
});
export const ${serveName} = (implementation: ${implementationTypeName}) => {
serveQuixosPackageRuntime({
packageNamespace,
packageName,
runtimeProtocolVersion,
functions,
implementation,
createContext: create${className}Context,
});
};
`;
};
const implementationNamed = (schema: ClassSchema, name: string) =>
schema.implements.find(
(entry) =>
entry.interface.namespace === "quixos.react" &&
entry.interface.name === name,
);
const requiredBinding = (
implementation: InterfaceImplementation,
name: string,
) => {
const binding = implementation.typeBindings.find((entry) => entry.name === name);
if (!binding) {
throw new Error(
`${implementation.interface.name} implementation is missing ${name}`,
);
}
return binding.type;
};
const renderReactClient = (schema: ClassSchema, root: protobuf.Root) => {
const react = implementationNamed(schema, "ReactComponent");
const componentFor = implementationNamed(schema, "ReactComponentFor");
if (!react || !componentFor) {
return undefined;
}
const renderProps = requiredBinding(react, "RenderProps");
const action = requiredBinding(react, "Action");
const object = requiredBinding(componentFor, "Object");
if (!object.symbol) {
throw new Error(`${schema.id.name}.ReactComponentFor.Object must bind a class symbol`);
}
const edge = schema.edges.find((candidate) => candidate.sourceField === "for_object");
if (!edge) {
throw new Error(`${schema.id.name} must declare its ReactComponentFor edge`);
}
const componentEndpoint =
edge.fromEndpoint.projection === "for_object"
? edge.fromEndpoint
: edge.toEndpoint.projection === "for_object"
? edge.toEndpoint
: undefined;
const objectEndpoint =
componentEndpoint === edge.fromEndpoint ? edge.toEndpoint : edge.fromEndpoint;
if (!componentEndpoint || !objectEndpoint.projection) {
throw new Error(`${schema.id.name}.for_object edge has no inverse projection`);
}
if (componentEndpoint.cardinality !== "exactly_one") {
throw new Error(`${schema.id.name}.for_object must have exactly_one cardinality`);
}
if (
!objectEndpoint.materialization ||
symbolId(objectEndpoint.materialization.class) !== symbolId(schema.id)
) {
throw new Error(
`${schema.id.name}.${objectEndpoint.projection} must materialize ${classId(schema)}`,
);
}
const className = schema.id.name;
const componentName = className.endsWith("ReactComponent")
? `${className.slice(0, -"ReactComponent".length)}Component`
: className;
const propsTypeName = `${componentName}Props`;
const renderPropsType = tsTypeForTypeRef(renderProps, root);
const actionType = tsTypeForTypeRef(action, root);
const objectType = tsTypeForTypeRef(object, root);
const declarations = collectProtoDeclarations(root, [renderProps, action]);
return `${generatedWarning}import {
createReactComponentFor,
type ReactComponentHostProps,
type ObjectRef,
} from "@quixos/camino-react-runtime";
${declarations}
export type ${propsTypeName} = {
forObject: ${objectType};
} & ${renderPropsType} & ReactComponentHostProps<${actionType}>;
export const ${componentName} = createReactComponentFor<
${objectType},
${renderPropsType},
${actionType}
>({
componentClassId: ${stringLiteral(classId(schema))},
projection: ${stringLiteral(objectEndpoint.projection)},
});
`;
};
const reactRuntimeDeclaration = `${generatedWarning}declare module "@quixos/camino-react-runtime" {
import type * as AutomergeNamespace from "@automerge/automerge";
export type ObjectRef<ClassId extends string> = string & {
readonly $caminoClass: ClassId;
};
export type LiveFieldProp<T> = {
value: T;
source: {
objectId: string;
fieldName: string;
fieldType?: string;
fieldStorage?: string;
conflictStrategy?: string;
revision?: string | number | bigint;
};
};
export type ReactComponentHostProps<Action> = {
onAction?: (action: Action) => void;
fallback?: unknown;
className?: string;
style?: Record<string, string | number | undefined>;
onError?: (error: Error) => void;
};
export type ReactComponentImplementationProps<CaminoProps, RenderProps, Action> = {
camino: CaminoProps;
render: RenderProps;
dispatch: (action: Action) => void;
};
export const createReactComponentFor: <
ForObject extends ObjectRef<string>,
RenderProps extends object,
Action,
>(config: {
componentClassId: string;
projection: string;
}) => (props: {
forObject: ForObject;
} & RenderProps & ReactComponentHostProps<Action>) => any;
export const h: (...args: any[]) => any;
export const useLiveField: <T>(
field: LiveFieldProp<T>,
) => [T, (value: T) => void | Promise<void>];
export const Automerge: typeof AutomergeNamespace;
}
`;
const renderServer = (schema: ClassSchema, implementationImport: string) => {
const className = schema.id.name;
return `${generatedWarning}import * as implementation from ${stringLiteral(implementationImport)};
import { serve${className}Runtime } from "./${schema.id.namespace}.${className}.runtime.js";
serve${className}Runtime(implementation);
`;
};
const main = async () => {
const reactOnly = process.argv[2] === "--react-only";
const offset = reactOnly ? 1 : 0;
const sourceFile = required(process.argv[2 + offset]);
const outDir = required(process.argv[3 + offset]);
const implementationImport = process.argv[4 + offset] ?? "../task.impl.js";
const compiled = await compileCaminoSchema(sourceFile);
const { root } = await loadCaminoSchemaRoot(sourceFile);
if (compiled.classes.length !== 1) {
throw new Error(
`Expected exactly one Camino class in ${sourceFile}, found ${compiled.classes.length}`,
);
}
const schema = compiled.classes[0];
if (!schema) {
throw new Error(`No Camino class found in ${sourceFile}`);
}
fs.mkdirSync(outDir, { recursive: true });
const baseName = `${schema.id.namespace}.${schema.id.name}`;
const reactClient = renderReactClient(schema, root);
if (!reactOnly) {
fs.writeFileSync(
path.join(outDir, `${baseName}.runtime.ts`),
renderRuntime(schema, root),
);
fs.writeFileSync(
path.join(outDir, `${baseName}.server.ts`),
renderServer(schema, implementationImport),
);
}
if (reactClient) {
fs.writeFileSync(path.join(outDir, `${baseName}.react.ts`), reactClient);
fs.writeFileSync(
path.join(outDir, "camino-react-runtime.d.ts"),
reactRuntimeDeclaration,
);
} else if (reactOnly) {
throw new Error(`${schema.id.name} does not implement ReactComponentFor`);
}
};
await main();
+598 -1050
View File
File diff suppressed because it is too large Load Diff
+24
View File
@@ -0,0 +1,24 @@
/** Execution completion, not HTTP disconnection, is the drain boundary. */
export const createInvocationRegistry = () => {
const entries = new Map<string, { state: string; controller: AbortController }>();
return {
begin(id: string) {
if (!id || entries.has(id)) throw new Error("Invocation ID is missing or already used; invocations are never replayed implicitly");
// Completed identities remain until process retirement. A bounded process
// may reject new work; it must not evict and accidentally replay a call.
if (entries.size >= 100_000) throw new Error("Invocation registry full; explicit runtime retirement required");
const entry = { state: "running", controller: new AbortController() };
entries.set(id, entry);
return { signal: entry.controller.signal, finish(failed = false) { entry.state = failed ? "failed" : "completed"; } };
},
status(id: string) { return { invocationId: id, state: entries.get(id)?.state ?? "unknown" }; },
cancel(id: string) {
const entry = entries.get(id);
if (entry && ["running", "cancellation-requested"].includes(entry.state)) {
entry.state = "cancellation-requested";
entry.controller.abort();
}
return this.status(id);
},
};
};
+95
View File
@@ -0,0 +1,95 @@
import {createHash} from "node:crypto";
export type MigrationInput = {
schemaVersion: 1; executionId: string; exportId: string;
ports: {name: string; binding: string; view: "old" | "new"; access: ("read" | "write" | "create" | "edge")[]; atomId?: string;
attachedAtomId?: string; defaultValue?: unknown;
states?: {objectId: string; value: unknown}[]; edges?: MigrationEdge[]}[];
};
export type MigrationEdge = {id: string; edgeTypeId: string; firstObjectId: string; secondObjectId: string; firstProjectionId: string; secondProjectionId: string; firstOrdinal?: number; secondOrdinal?: number; firstKeyJson?: string; secondKeyJson?: string};
export type MigrationOutput = {schemaVersion: 1; executionId: string;
writes: {port: string; objectId: string; value: unknown}[];
creates: {port: string; logicalKey: string; objectId: string}[];
edgeReplacements: {port: string; edges: MigrationEdge[]}[]};
export type MigrationContext = {
enumerate(port: string): {objectId: string; value: unknown}[];
read(port: string, objectId: string): unknown;
write(port: string, objectId: string, value: unknown): void;
create(port: string, logicalKey: string): string;
edges(port: string): MigrationEdge[];
replaceEdges(port: string, edges: MigrationEdge[]): void;
};
export const migrationObjectId = (executionId: string, port: string, logicalKey: string) =>
`obj:migration:${createHash("sha256").update(JSON.stringify([executionId, port, logicalKey])).digest("hex")}`;
/** No ordinary RuntimeContext or network/database clients are supplied here.
* Process isolation belongs to the host, not this convenience API. */
export const createMigrationContext = (input: MigrationInput) => {
if (input.schemaVersion !== 1 || !input.executionId || new Set(input.ports.map((entry) => entry.name)).size !== input.ports.length) throw new Error("Invalid migration input");
const output: MigrationOutput = {schemaVersion: 1, executionId: input.executionId, writes: [], creates: [], edgeReplacements: []};
const port = (name: string, access: string) => {
const selected = input.ports.find((entry) => entry.name === name);
if (!selected?.access.includes(access as "read") || (selected.view === "old" && access !== "read")) throw new Error(`Migration port ${name} does not grant ${access}`);
return selected;
};
const context: MigrationContext = {
enumerate(name) {
const selected = port(name, "read"), states = structuredClone(selected.states ?? []);
if (selected.view === "new" && Object.hasOwn(selected, "defaultValue")) for (const helper of output.creates) {
if (input.ports.find((entry) => entry.name === helper.port)?.atomId === selected.attachedAtomId && !states.some((entry) => entry.objectId === helper.objectId)) states.push({objectId: helper.objectId, value: structuredClone(selected.defaultValue)});
}
if (selected.view === "new") for (const write of output.writes) {
if (input.ports.find((entry) => entry.name === write.port)?.binding !== selected.binding) continue;
const existing = states.findIndex((entry) => entry.objectId === write.objectId), entry = {objectId: write.objectId, value: structuredClone(write.value)};
if (existing < 0) states.push(entry); else states[existing] = entry;
}
return states.sort((a, b) => a.objectId < b.objectId ? -1 : a.objectId > b.objectId ? 1 : 0);
},
read(name, objectId) {return context.enumerate(name).find((entry) => entry.objectId === objectId)?.value;},
write(name, objectId, value) {
port(name, "write");
const previous = output.writes.findIndex((entry) => entry.port === name && entry.objectId === objectId);
const entry = {port: name, objectId, value: structuredClone(value)};
if (previous < 0) output.writes.push(entry); else output.writes[previous] = entry;
},
create(name, logicalKey) {
port(name, "create");
if (!logicalKey || logicalKey.length > 1024) throw new Error("Migration creation requires a bounded stable logical key");
const objectId = migrationObjectId(input.executionId, name, logicalKey);
if (!output.creates.some((entry) => entry.objectId === objectId)) output.creates.push({port: name, logicalKey, objectId});
return objectId;
},
edges(name) {
const selected = port(name, "read");
const replacement = selected.view === "new" ? output.edgeReplacements.find((entry) => input.ports.find((candidate) => candidate.name === entry.port)?.binding === selected.binding) : undefined;
return structuredClone(replacement?.edges ?? selected.edges ?? []);
},
replaceEdges(name, edges) {
port(name, "edge");
const previous = output.edgeReplacements.findIndex((entry) => entry.port === name);
const entry = {port: name, edges: structuredClone(edges)};
if (previous < 0) output.edgeReplacements.push(entry); else output.edgeReplacements[previous] = entry;
},
};
return {context, result: () => structuredClone(output)};
};
/** Entrypoint for an immutable package's dedicated bin/migrate executable.
* stdout is protocol-only; send diagnostics to stderr. The host independently
* validates every write, helper identity, contract, and completion receipt. */
export const serveMigration = async (exports: Record<string, (context: MigrationContext) => void | Promise<void>>) => {
const chunks: Buffer[] = []; let bytes = 0;
for await (const chunk of process.stdin) {
bytes += chunk.length;
if (bytes > 16 * 1024 * 1024) throw new Error("Migration input exceeds 16 MiB");
chunks.push(Buffer.from(chunk));
}
const input = JSON.parse(Buffer.concat(chunks).toString("utf8")) as MigrationInput;
const implementation = Object.hasOwn(exports, input.exportId) ? exports[input.exportId] : undefined;
if (!implementation) throw new Error("Unknown migration export");
const execution = createMigrationContext(input);
await implementation(execution.context);
const result = JSON.stringify(execution.result());
if (Buffer.byteLength(result) > 16 * 1024 * 1024) throw new Error("Migration output exceeds 16 MiB");
process.stdout.write(`${result}\n`);
};
+643
View File
@@ -0,0 +1,643 @@
// @generated by protoc-gen-es v2.12.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 { 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 { 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";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file quixos/orch.proto.
*/
export const file_quixos_orch: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLwAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJGjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASLRAQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5ItIBChZXYXRjaENhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPQoFaW5wdXQYAyADKAsyLi5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIuMBChRXYXRjaENhcGFiaWxpdHlFdmVudBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEhAKCHdhdGNoX2lkGAMgASgJEhwKBXZhbHVlGAQgASgLMg0uY2FtaW5vLlZhbHVlEjcKDGRlcGVuZGVuY2llcxgFIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5Eg0KBWVycm9yGAYgASgJEg8KB2luaXRpYWwYByABKAgiFQoTR2V0V29ya3NwYWNlUmVxdWVzdCJnChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCSIYChZMaXN0QWN0aXZhdGlvbnNSZXF1ZXN0Ih8KHUxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0IlAKHkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRIuCgtkZXNjcmlwdG9ycxgBIAMoCzIZLnF1aXhvcy5QYWNrYWdlRGVzY3JpcHRvciIcChpMaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdCJSChtMaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USMwoIcnVudGltZXMYASADKAsyIS5xdWl4b3Mub3JjaC5QYWNrYWdlUnVudGltZVN0YXR1cyJHChdMaXN0QWN0aXZhdGlvbnNSZXNwb25zZRIsCgthY3RpdmF0aW9ucxgBIAMoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24iPwoWQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJGChdDbG9zZUFjdGl2YXRpb25SZXNwb25zZRIrCgphY3RpdmF0aW9uGAEgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiLrAQoKQWN0aXZhdGlvbhIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRINCgVzdGF0ZRgEIAEoCRIOCgZkZW1hbmQYBSABKA0SEQoJb3BlbmVkX2F0GAYgASgJEhQKDGxhc3RfdXNlZF9hdBgHIAEoCRIYChBpZGxlX2RlYWRsaW5lX2F0GAggASgJEhEKCWNsb3NlZF9hdBgJIAEoCRIUCgxjbG9zZV9yZWFzb24YCiABKAkiswIKFFBhY2thZ2VSdW50aW1lU3RhdHVzEhMKC3J1bnRpbWVfa2V5GAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSGQoRc291cmNlX3JlcG9zaXRvcnkYAyABKAkSFQoNc291cmNlX2NvbW1pdBgEIAEoCRIUCgxidWlsZF90YXJnZXQYBSABKAkSEwoLc2VydmVyX3BhdGgYBiABKAkSCwoDcGlkGAcgASgNEg0KBXN0YXRlGAggASgJEhIKCnN0YXJ0ZWRfYXQYCSABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYCiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAsgASgJEh8KF2FkdmVydGlzZWRfZXhwb3J0X2NvdW50GAwgASgNMq4HChNPcmNoZXN0cmF0b3JSdW50aW1lEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]);
/**
* @generated from message quixos.orch.ConstructObjectRequest
*/
export type ConstructObjectRequest = Message<"quixos.orch.ConstructObjectRequest"> & {
/**
* @generated from field: string atom_id = 1;
*/
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.ResolveOrConstructRelatedObjectRequest
*/
export type ResolveOrConstructRelatedObjectRequest = Message<"quixos.orch.ResolveOrConstructRelatedObjectRequest"> & {
/**
* @generated from field: string object_id = 1;
*/
objectId: string;
/**
* @generated from field: string interface_revision_id = 2;
*/
interfaceRevisionId: string;
/**
* @generated from field: string member_id = 3;
*/
memberId: string;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectRequest.
* Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectRequestSchema: GenMessage<ResolveOrConstructRelatedObjectRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 2);
/**
* @generated from message quixos.orch.ResolveOrConstructRelatedObjectResponse
*/
export type ResolveOrConstructRelatedObjectResponse = Message<"quixos.orch.ResolveOrConstructRelatedObjectResponse"> & {
/**
* @generated from field: camino.CaminoObject object = 1;
*/
object?: CaminoObject | undefined;
/**
* @generated from field: bool constructed = 2;
*/
constructed: boolean;
};
/**
* Describes the message quixos.orch.ResolveOrConstructRelatedObjectResponse.
* Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message.
*/
export const ResolveOrConstructRelatedObjectResponseSchema: GenMessage<ResolveOrConstructRelatedObjectResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 3);
/**
* @generated from message quixos.orch.InvokeCapabilityRequest
*/
export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityRequest"> & {
/**
* @generated from field: quixos.CapabilityRef capability = 1;
*/
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
*/
objectId: string;
/**
* @generated from field: map<string, camino.Value> input = 3;
*/
input: { [key: string]: Value };
/**
* Identifies one logical client mutation across the capability and Camino
* layers so a live-value controller can recognize its own confirmation.
*
* @generated from field: string client_mutation_id = 4;
*/
clientMutationId: string;
};
/**
* Describes the message quixos.orch.InvokeCapabilityRequest.
* Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/
export const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 4);
/**
* @generated from message quixos.orch.InvokeCapabilityResponse
*/
export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResponse"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* @generated from field: quixos.orch.Activation activation = 2;
*/
activation?: Activation | undefined;
/**
* @generated from field: bool ok = 3;
*/
ok: boolean;
/**
* @generated from field: camino.Value result = 4;
*/
result?: Value | undefined;
/**
* @generated from field: string error = 5;
*/
error: string;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 6;
*/
dependencies: DerivedDependency[];
};
/**
* Describes the message quixos.orch.InvokeCapabilityResponse.
* Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/
export const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 5);
/**
* @generated from message quixos.orch.WatchCapabilityRequest
*/
export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest"> & {
/**
* @generated from field: quixos.CapabilityRef capability = 1;
*/
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
*/
objectId: string;
/**
* @generated from field: map<string, camino.Value> input = 3;
*/
input: { [key: string]: Value };
};
/**
* Describes the message quixos.orch.WatchCapabilityRequest.
* Use `create(WatchCapabilityRequestSchema)` to create a new message.
*/
export const WatchCapabilityRequestSchema: GenMessage<WatchCapabilityRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 6);
/**
* @generated from message quixos.orch.WatchCapabilityEvent
*/
export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* @generated from field: quixos.orch.Activation activation = 2;
*/
activation?: Activation | undefined;
/**
* @generated from field: string watch_id = 3;
*/
watchId: string;
/**
* @generated from field: camino.Value value = 4;
*/
value?: Value | undefined;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 5;
*/
dependencies: DerivedDependency[];
/**
* @generated from field: string error = 6;
*/
error: string;
/**
* @generated from field: bool initial = 7;
*/
initial: boolean;
};
/**
* Describes the message quixos.orch.WatchCapabilityEvent.
* Use `create(WatchCapabilityEventSchema)` to create a new message.
*/
export const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent> = /*@__PURE__*/
messageDesc(file_quixos_orch, 7);
/**
* @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, 8);
/**
* @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, 9);
/**
* @generated from message quixos.orch.ListActivationsRequest
*/
export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest"> & {
};
/**
* Describes the message quixos.orch.ListActivationsRequest.
* Use `create(ListActivationsRequestSchema)` to create a new message.
*/
export const ListActivationsRequestSchema: GenMessage<ListActivationsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 10);
/**
* @generated from message quixos.orch.ListPackageDescriptorsRequest
*/
export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDescriptorsRequest"> & {
};
/**
* Describes the message quixos.orch.ListPackageDescriptorsRequest.
* Use `create(ListPackageDescriptorsRequestSchema)` to create a new message.
*/
export const ListPackageDescriptorsRequestSchema: GenMessage<ListPackageDescriptorsRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 11);
/**
* @generated from message quixos.orch.ListPackageDescriptorsResponse
*/
export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDescriptorsResponse"> & {
/**
* @generated from field: repeated quixos.PackageDescriptor descriptors = 1;
*/
descriptors: PackageDescriptor[];
};
/**
* Describes the message quixos.orch.ListPackageDescriptorsResponse.
* Use `create(ListPackageDescriptorsResponseSchema)` to create a new message.
*/
export const ListPackageDescriptorsResponseSchema: GenMessage<ListPackageDescriptorsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 12);
/**
* @generated from message quixos.orch.ListPackageRuntimesRequest
*/
export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntimesRequest"> & {
};
/**
* Describes the message quixos.orch.ListPackageRuntimesRequest.
* Use `create(ListPackageRuntimesRequestSchema)` to create a new message.
*/
export const ListPackageRuntimesRequestSchema: GenMessage<ListPackageRuntimesRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 13);
/**
* @generated from message quixos.orch.ListPackageRuntimesResponse
*/
export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntimesResponse"> & {
/**
* @generated from field: repeated quixos.orch.PackageRuntimeStatus runtimes = 1;
*/
runtimes: PackageRuntimeStatus[];
};
/**
* Describes the message quixos.orch.ListPackageRuntimesResponse.
* Use `create(ListPackageRuntimesResponseSchema)` to create a new message.
*/
export const ListPackageRuntimesResponseSchema: GenMessage<ListPackageRuntimesResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 14);
/**
* @generated from message quixos.orch.ListActivationsResponse
*/
export type ListActivationsResponse = Message<"quixos.orch.ListActivationsResponse"> & {
/**
* @generated from field: repeated quixos.orch.Activation activations = 1;
*/
activations: Activation[];
};
/**
* Describes the message quixos.orch.ListActivationsResponse.
* Use `create(ListActivationsResponseSchema)` to create a new message.
*/
export const ListActivationsResponseSchema: GenMessage<ListActivationsResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 15);
/**
* @generated from message quixos.orch.CloseActivationRequest
*/
export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest"> & {
/**
* @generated from field: string activation_id = 1;
*/
activationId: string;
/**
* @generated from field: string reason = 2;
*/
reason: string;
};
/**
* Describes the message quixos.orch.CloseActivationRequest.
* Use `create(CloseActivationRequestSchema)` to create a new message.
*/
export const CloseActivationRequestSchema: GenMessage<CloseActivationRequest> = /*@__PURE__*/
messageDesc(file_quixos_orch, 16);
/**
* @generated from message quixos.orch.CloseActivationResponse
*/
export type CloseActivationResponse = Message<"quixos.orch.CloseActivationResponse"> & {
/**
* @generated from field: quixos.orch.Activation activation = 1;
*/
activation?: Activation | undefined;
};
/**
* Describes the message quixos.orch.CloseActivationResponse.
* Use `create(CloseActivationResponseSchema)` to create a new message.
*/
export const CloseActivationResponseSchema: GenMessage<CloseActivationResponse> = /*@__PURE__*/
messageDesc(file_quixos_orch, 17);
/**
* @generated from message quixos.orch.Activation
*/
export type Activation = Message<"quixos.orch.Activation"> & {
/**
* @generated from field: string activation_id = 1;
*/
activationId: string;
/**
* @generated from field: quixos.PackageExportRef export = 2;
*/
export?: PackageExportRef | undefined;
/**
* @generated from field: string object_id = 3;
*/
objectId: string;
/**
* @generated from field: string state = 4;
*/
state: string;
/**
* @generated from field: uint32 demand = 5;
*/
demand: number;
/**
* @generated from field: string opened_at = 6;
*/
openedAt: string;
/**
* @generated from field: string last_used_at = 7;
*/
lastUsedAt: string;
/**
* @generated from field: string idle_deadline_at = 8;
*/
idleDeadlineAt: string;
/**
* @generated from field: string closed_at = 9;
*/
closedAt: string;
/**
* @generated from field: string close_reason = 10;
*/
closeReason: string;
};
/**
* Describes the message quixos.orch.Activation.
* Use `create(ActivationSchema)` to create a new message.
*/
export const ActivationSchema: GenMessage<Activation> = /*@__PURE__*/
messageDesc(file_quixos_orch, 18);
/**
* @generated from message quixos.orch.PackageRuntimeStatus
*/
export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> & {
/**
* @generated from field: string runtime_key = 1;
*/
runtimeKey: string;
/**
* @generated from field: string package_revision_id = 2;
*/
packageRevisionId: string;
/**
* @generated from field: string source_repository = 3;
*/
sourceRepository: string;
/**
* @generated from field: string source_commit = 4;
*/
sourceCommit: string;
/**
* @generated from field: string build_target = 5;
*/
buildTarget: string;
/**
* @generated from field: string server_path = 6;
*/
serverPath: string;
/**
* @generated from field: uint32 pid = 7;
*/
pid: number;
/**
* @generated from field: string state = 8;
*/
state: string;
/**
* @generated from field: string started_at = 9;
*/
startedAt: string;
/**
* @generated from field: string last_handshake_at = 10;
*/
lastHandshakeAt: string;
/**
* @generated from field: string runtime_protocol_version = 11;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: uint32 advertised_export_count = 12;
*/
advertisedExportCount: number;
};
/**
* Describes the message quixos.orch.PackageRuntimeStatus.
* Use `create(PackageRuntimeStatusSchema)` to create a new message.
*/
export const PackageRuntimeStatusSchema: GenMessage<PackageRuntimeStatus> = /*@__PURE__*/
messageDesc(file_quixos_orch, 19);
/**
* @generated from service quixos.orch.OrchestratorRuntime
*/
export const OrchestratorRuntime: GenService<{
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.InvokeCapability
*/
invokeCapability: {
methodKind: "unary";
input: typeof InvokeCapabilityRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.WatchCapability
*/
watchCapability: {
methodKind: "server_streaming";
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.ResolveOrConstructRelatedObject
*/
resolveOrConstructRelatedObject: {
methodKind: "unary";
input: typeof ResolveOrConstructRelatedObjectRequestSchema;
output: typeof ResolveOrConstructRelatedObjectResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace
*/
getWorkspace: {
methodKind: "unary";
input: typeof GetWorkspaceRequestSchema;
output: typeof GetWorkspaceResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListPackageDescriptors
*/
listPackageDescriptors: {
methodKind: "unary";
input: typeof ListPackageDescriptorsRequestSchema;
output: typeof ListPackageDescriptorsResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListPackageRuntimes
*/
listPackageRuntimes: {
methodKind: "unary";
input: typeof ListPackageRuntimesRequestSchema;
output: typeof ListPackageRuntimesResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.ListActivations
*/
listActivations: {
methodKind: "unary";
input: typeof ListActivationsRequestSchema;
output: typeof ListActivationsResponseSchema;
},
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.CloseActivation
*/
closeActivation: {
methodKind: "unary";
input: typeof CloseActivationRequestSchema;
output: typeof CloseActivationResponseSchema;
},
}> = /*@__PURE__*/
serviceDesc(file_quixos_orch, 0);
+68
View File
@@ -0,0 +1,68 @@
// @generated by protoc-gen-es v2.12.1 with parameter "target=ts,import_extension=js"
// @generated from file quixos/package.proto (package quixos, syntax proto3)
/* eslint-disable */
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("ChRxdWl4b3MvcGFja2FnZS5wcm90bxIGcXVpeG9zIo4BChFQYWNrYWdlRGVzY3JpcHRvchISCgpwYWNrYWdlX2lkGAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAMgASgJEiYKB2V4cG9ydHMYBCADKAsyFS5xdWl4b3MuUnVudGltZUV4cG9ydCI6Cg1SdW50aW1lRXhwb3J0EhEKCWV4cG9ydF9pZBgBIAEoCRIWCg5ydW50aW1lX3N5bWJvbBgCIAEoCWIGcHJvdG8z");
/**
* @generated from message quixos.PackageDescriptor
*/
export type PackageDescriptor = Message<"quixos.PackageDescriptor"> & {
/**
* @generated from field: string package_id = 1;
*/
packageId: string;
/**
* @generated from field: string package_revision_id = 2;
*/
packageRevisionId: string;
/**
* @generated from field: string runtime_protocol_version = 3;
*/
runtimeProtocolVersion: string;
/**
* @generated from field: repeated quixos.RuntimeExport exports = 4;
*/
exports: RuntimeExport[];
};
/**
* Describes the 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);
+108 -25
View File
@@ -10,42 +10,125 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/refs.proto. * Describes the file quixos/refs.proto.
*/ */
export const file_quixos_refs: GenFile = /*@__PURE__*/ export const file_quixos_refs: GenFile = /*@__PURE__*/
fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInYKC0Z1bmN0aW9uUmVmEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIOCgZzeW1ib2wYAyABKAkSEwoLdmVyc2lvbl9yZWYYBCABKAkSEQoJb3BlcmF0aW9uGAUgASgJYgZwcm90bzM"); fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIsQBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z");
/** /**
* @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; operationId: 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;
}; };
/** /**
* Describes the message quixos.FunctionRef. * Describes the message quixos.CapabilityRef.
* Use `create(FunctionRefSchema)` to create a new message. * 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); 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 interface_revision_id = 4;
*/
value: string;
case: "interfaceRevisionId";
} | {
/**
* @generated from field: string constructor_atom_id = 5;
*/
value: string;
case: "constructorAtomId";
} | { case: undefined; value?: undefined };
/**
* Defaults to the invocation receiver. A checked dependency traversal can
* select a related object explicitly before the package runtime starts.
*
* @generated from field: string object_id = 6;
*/
objectId: string;
};
/**
* 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);
+166 -25
View File
@@ -6,7 +6,7 @@ import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegen
import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
import type { Value } from "../camino/api_pb.js"; import type { Value } from "../camino/api_pb.js";
import { file_camino_api } 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 { file_quixos_refs } from "./refs_pb.js";
import type { Message } from "@bufbuild/protobuf"; import type { Message } from "@bufbuild/protobuf";
@@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file quixos/runtime.proto. * Describes the file quixos/runtime.proto.
*/ */
export const file_quixos_runtime: GenFile = /*@__PURE__*/ export const file_quixos_runtime: GenFile = /*@__PURE__*/
fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkijgEKEUhhbmRzaGFrZVJlc3BvbnNlEhkKEXBhY2thZ2VfbmFtZXNwYWNlGAEgASgJEhQKDHBhY2thZ2VfbmFtZRgCIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAyABKAkSJgoJZnVuY3Rpb25zGAQgAygLMhMucXVpeG9zLkZ1bmN0aW9uUmVmItYBCg1JbnZva2VSZXF1ZXN0EhUKDWludm9jYXRpb25faWQYASABKAkSJQoIZnVuY3Rpb24YAiABKAsyEy5xdWl4b3MuRnVuY3Rpb25SZWYSEQoJb2JqZWN0X2lkGAMgASgJEjcKBWlucHV0GAQgAygLMigucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJKCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAki1AEKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEiUKCGZ1bmN0aW9uGAIgASgLMhMucXVpeG9zLkZ1bmN0aW9uUmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJeChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRISCgpmaWVsZF9uYW1lGAMgASgJEhQKDHNvdXJjZV9maWVsZBgEIAEoCSKVAQoKV2F0Y2hFdmVudBIQCgh3YXRjaF9pZBgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYAyADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgEIAEoCRIPCgdpbml0aWFsGAUgASgIMvABCg5QYWNrYWdlUnVudGltZRJQCglIYW5kc2hha2USIC5xdWl4b3MucnVudGltZS5IYW5kc2hha2VSZXF1ZXN0GiEucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVzcG9uc2USRwoGSW52b2tlEh0ucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdBoeLnF1aXhvcy5ydW50aW1lLkludm9rZVJlc3BvbnNlEkMKBVdhdGNoEhwucXVpeG9zLnJ1bnRpbWUuV2F0Y2hSZXF1ZXN0GhoucXVpeG9zLnJ1bnRpbWUuV2F0Y2hFdmVudDABYgZwcm90bzM", [file_camino_api, file_quixos_refs]); fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiQAoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkSDQoFbm9uY2UYAiABKAkirwEKEUhhbmRzaGFrZVJlc3BvbnNlEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAIgASgJEhIKCmV4cG9ydF9pZHMYAyADKAkSEwoLaW5zdGFuY2VfaWQYBCABKAkSHAoUYXV0aGVudGljYXRpb25fcHJvb2YYBSABKAkSFAoMY2FwYWJpbGl0aWVzGAYgAygJIpoBChFJbnZvY2F0aW9uQ29udGV4dBIXCg93b3Jrc3BhY2VfZXBvY2gYASABKAkSEwoLaW5zdGFuY2VfaWQYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSDQoFZ3JhbnQYBCABKAkSEgoKc2Vzc2lvbl9pZBgFIAEoCRIcChRvd25lcl9jb25mb3JtYW5jZV9pZBgGIAEoCSIxChhJbnZvY2F0aW9uQ29udHJvbFJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCSI4ChBJbnZvY2F0aW9uU3RhdHVzEhUKDWludm9jYXRpb25faWQYASABKAkSDQoFc3RhdGUYAiABKAkivwIKDUludm9rZVJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSNwoFaW5wdXQYBCADKAsyKC5xdWl4b3MucnVudGltZS5JbnZva2VSZXF1ZXN0LklucHV0RW50cnkSMAoMZGVwZW5kZW5jaWVzGAUgAygLMhoucXVpeG9zLkluamVjdGVkRGVwZW5kZW5jeRIyCgdjb250ZXh0GAYgASgLMiEucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRleHQaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIoMBCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAkSNwoMZGVwZW5kZW5jaWVzGAQgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kivQIKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5EjAKDGRlcGVuZGVuY2llcxgFIAMoCzIaLnF1aXhvcy5JbmplY3RlZERlcGVuZGVuY3kSMgoHY29udGV4dBgGIAEoCzIhLnF1aXhvcy5ydW50aW1lLkludm9jYXRpb25Db250ZXh0GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJiChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIVCg1hdHRhY2htZW50X2lkGAMgASgJEhUKDXByb2plY3Rpb25faWQYBCABKAkilQEKCldhdGNoRXZlbnQSEAoId2F0Y2hfaWQYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAMgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBCABKAkSDwoHaW5pdGlhbBgFIAEoCDKzAwoOUGFja2FnZVJ1bnRpbWUSUAoJSGFuZHNoYWtlEiAucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVxdWVzdBohLnF1aXhvcy5ydW50aW1lLkhhbmRzaGFrZVJlc3BvbnNlEkcKBkludm9rZRIdLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QaHi5xdWl4b3MucnVudGltZS5JbnZva2VSZXNwb25zZRJDCgVXYXRjaBIcLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdBoaLnF1aXhvcy5ydW50aW1lLldhdGNoRXZlbnQwARJhChNHZXRJbnZvY2F0aW9uU3RhdHVzEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1cxJeChBDYW5jZWxJbnZvY2F0aW9uEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1c2IGcHJvdG8z", [file_camino_api, file_quixos_refs]);
/** /**
* @generated from message quixos.runtime.HandshakeRequest * @generated from message quixos.runtime.HandshakeRequest
@@ -24,6 +24,11 @@ export type HandshakeRequest = Message<"quixos.runtime.HandshakeRequest"> & {
* @generated from field: string orch_protocol_version = 1; * @generated from field: string orch_protocol_version = 1;
*/ */
orchProtocolVersion: string; orchProtocolVersion: string;
/**
* @generated from field: string nonce = 2;
*/
nonce: string;
}; };
/** /**
@@ -38,24 +43,34 @@ export const HandshakeRequestSchema: GenMessage<HandshakeRequest> = /*@__PURE__*
*/ */
export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & { 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; * @generated from field: string runtime_protocol_version = 2;
*/
packageName: string;
/**
* @generated from field: string runtime_protocol_version = 3;
*/ */
runtimeProtocolVersion: string; runtimeProtocolVersion: string;
/** /**
* @generated from field: repeated quixos.FunctionRef functions = 4; * @generated from field: repeated string export_ids = 3;
*/ */
functions: FunctionRef[]; exportIds: string[];
/**
* @generated from field: string instance_id = 4;
*/
instanceId: string;
/**
* @generated from field: string authentication_proof = 5;
*/
authenticationProof: string;
/**
* @generated from field: repeated string capabilities = 6;
*/
capabilities: string[];
}; };
/** /**
@@ -65,6 +80,91 @@ export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & {
export const HandshakeResponseSchema: GenMessage<HandshakeResponse> = /*@__PURE__*/ export const HandshakeResponseSchema: GenMessage<HandshakeResponse> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 1); messageDesc(file_quixos_runtime, 1);
/**
* @generated from message quixos.runtime.InvocationContext
*/
export type InvocationContext = Message<"quixos.runtime.InvocationContext"> & {
/**
* @generated from field: string workspace_epoch = 1;
*/
workspaceEpoch: string;
/**
* @generated from field: string instance_id = 2;
*/
instanceId: string;
/**
* @generated from field: string binding_digest = 3;
*/
bindingDigest: string;
/**
* @generated from field: string grant = 4;
*/
grant: string;
/**
* @generated from field: string session_id = 5;
*/
sessionId: string;
/**
* Host-selected owner; packages must not invent workspace-local ownership.
*
* @generated from field: string owner_conformance_id = 6;
*/
ownerConformanceId: string;
};
/**
* Describes the message quixos.runtime.InvocationContext.
* Use `create(InvocationContextSchema)` to create a new message.
*/
export const InvocationContextSchema: GenMessage<InvocationContext> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 2);
/**
* @generated from message quixos.runtime.InvocationControlRequest
*/
export type InvocationControlRequest = Message<"quixos.runtime.InvocationControlRequest"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
};
/**
* Describes the message quixos.runtime.InvocationControlRequest.
* Use `create(InvocationControlRequestSchema)` to create a new message.
*/
export const InvocationControlRequestSchema: GenMessage<InvocationControlRequest> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 3);
/**
* @generated from message quixos.runtime.InvocationStatus
*/
export type InvocationStatus = Message<"quixos.runtime.InvocationStatus"> & {
/**
* @generated from field: string invocation_id = 1;
*/
invocationId: string;
/**
* unknown, running, cancellation-requested, completed, failed
*
* @generated from field: string state = 2;
*/
state: string;
};
/**
* Describes the message quixos.runtime.InvocationStatus.
* Use `create(InvocationStatusSchema)` to create a new message.
*/
export const InvocationStatusSchema: GenMessage<InvocationStatus> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 4);
/** /**
* @generated from message quixos.runtime.InvokeRequest * @generated from message quixos.runtime.InvokeRequest
*/ */
@@ -75,9 +175,9 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
invocationId: string; 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; * @generated from field: string object_id = 3;
@@ -88,6 +188,16 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
* @generated from field: map<string, camino.Value> input = 4; * @generated from field: map<string, camino.Value> input = 4;
*/ */
input: { [key: string]: Value }; input: { [key: string]: Value };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
/**
* @generated from field: quixos.runtime.InvocationContext context = 6;
*/
context?: InvocationContext | undefined;
}; };
/** /**
@@ -95,7 +205,7 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & {
* Use `create(InvokeRequestSchema)` to create a new message. * Use `create(InvokeRequestSchema)` to create a new message.
*/ */
export const InvokeRequestSchema: GenMessage<InvokeRequest> = /*@__PURE__*/ export const InvokeRequestSchema: GenMessage<InvokeRequest> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 2); messageDesc(file_quixos_runtime, 5);
/** /**
* @generated from message quixos.runtime.InvokeResponse * @generated from message quixos.runtime.InvokeResponse
@@ -115,6 +225,11 @@ export type InvokeResponse = Message<"quixos.runtime.InvokeResponse"> & {
* @generated from field: string error = 3; * @generated from field: string error = 3;
*/ */
error: string; error: string;
/**
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 4;
*/
dependencies: DerivedDependency[];
}; };
/** /**
@@ -122,7 +237,7 @@ export type InvokeResponse = Message<"quixos.runtime.InvokeResponse"> & {
* Use `create(InvokeResponseSchema)` to create a new message. * Use `create(InvokeResponseSchema)` to create a new message.
*/ */
export const InvokeResponseSchema: GenMessage<InvokeResponse> = /*@__PURE__*/ export const InvokeResponseSchema: GenMessage<InvokeResponse> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 3); messageDesc(file_quixos_runtime, 6);
/** /**
* @generated from message quixos.runtime.WatchRequest * @generated from message quixos.runtime.WatchRequest
@@ -134,9 +249,9 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
invocationId: string; 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; * @generated from field: string object_id = 3;
@@ -147,6 +262,16 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
* @generated from field: map<string, camino.Value> input = 4; * @generated from field: map<string, camino.Value> input = 4;
*/ */
input: { [key: string]: Value }; input: { [key: string]: Value };
/**
* @generated from field: repeated quixos.InjectedDependency dependencies = 5;
*/
dependencies: InjectedDependency[];
/**
* @generated from field: quixos.runtime.InvocationContext context = 6;
*/
context?: InvocationContext | undefined;
}; };
/** /**
@@ -154,7 +279,7 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & {
* Use `create(WatchRequestSchema)` to create a new message. * Use `create(WatchRequestSchema)` to create a new message.
*/ */
export const WatchRequestSchema: GenMessage<WatchRequest> = /*@__PURE__*/ export const WatchRequestSchema: GenMessage<WatchRequest> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 4); messageDesc(file_quixos_runtime, 7);
/** /**
* @generated from message quixos.runtime.DerivedDependency * @generated from message quixos.runtime.DerivedDependency
@@ -171,14 +296,14 @@ export type DerivedDependency = Message<"quixos.runtime.DerivedDependency"> & {
objectId: string; 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;
}; };
/** /**
@@ -186,7 +311,7 @@ export type DerivedDependency = Message<"quixos.runtime.DerivedDependency"> & {
* Use `create(DerivedDependencySchema)` to create a new message. * Use `create(DerivedDependencySchema)` to create a new message.
*/ */
export const DerivedDependencySchema: GenMessage<DerivedDependency> = /*@__PURE__*/ export const DerivedDependencySchema: GenMessage<DerivedDependency> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 5); messageDesc(file_quixos_runtime, 8);
/** /**
* @generated from message quixos.runtime.WatchEvent * @generated from message quixos.runtime.WatchEvent
@@ -223,7 +348,7 @@ export type WatchEvent = Message<"quixos.runtime.WatchEvent"> & {
* Use `create(WatchEventSchema)` to create a new message. * Use `create(WatchEventSchema)` to create a new message.
*/ */
export const WatchEventSchema: GenMessage<WatchEvent> = /*@__PURE__*/ export const WatchEventSchema: GenMessage<WatchEvent> = /*@__PURE__*/
messageDesc(file_quixos_runtime, 6); messageDesc(file_quixos_runtime, 9);
/** /**
* @generated from service quixos.runtime.PackageRuntime * @generated from service quixos.runtime.PackageRuntime
@@ -253,6 +378,22 @@ export const PackageRuntime: GenService<{
input: typeof WatchRequestSchema; input: typeof WatchRequestSchema;
output: typeof WatchEventSchema; output: typeof WatchEventSchema;
}, },
/**
* @generated from rpc quixos.runtime.PackageRuntime.GetInvocationStatus
*/
getInvocationStatus: {
methodKind: "unary";
input: typeof InvocationControlRequestSchema;
output: typeof InvocationStatusSchema;
},
/**
* @generated from rpc quixos.runtime.PackageRuntime.CancelInvocation
*/
cancelInvocation: {
methodKind: "unary";
input: typeof InvocationControlRequestSchema;
output: typeof InvocationStatusSchema;
},
}> = /*@__PURE__*/ }> = /*@__PURE__*/
serviceDesc(file_quixos_runtime, 0); serviceDesc(file_quixos_runtime, 0);
+35
View File
@@ -0,0 +1,35 @@
/** Opaque runtime identity. The wire codec, never ordinary package state, owns
* the raw ID. These handles do not themselves confer authority or a lease. */
const identities = new WeakMap<object, string>();
declare const referenceBrand: unique symbol;
export interface QxObjectRef<Identity extends string = string> {
readonly [referenceBrand]: {readonly [K in Identity]: true};
equals(other: QxObjectRef<string>): boolean;
}
class Reference {
constructor(id: string) { identities.set(this, id); Object.freeze(this); }
equals(other: unknown) { return isObjectReference(other) && identities.get(this) === identities.get(other); }
toJSON(): never { throw new Error("Object references cannot be serialized into ordinary data"); }
toString(): never { throw new Error("Object references cannot be coerced to strings"); }
[Symbol.toPrimitive](): never { throw new Error("Object references cannot be coerced to scalar values"); }
}
export const isObjectReference = (value: unknown): value is QxObjectRef =>
typeof value === "object" && value !== null && identities.has(value);
/** Internal transport boundary; intentionally not exported from the SDK entry. */
export const referenceFromWire = (id: string): QxObjectRef => {
if (typeof id !== "string" || !id) throw new Error("Missing object reference identity");
return new Reference(id) as unknown as QxObjectRef;
};
export const referenceToWire = (value: unknown): string => {
if (!isObjectReference(value)) throw new Error("Expected an opaque object reference, not a raw ID");
return identities.get(value)!;
};
export const assertReferenceFree = (value: unknown, seen = new Set<object>()): void => {
if (!value || typeof value !== "object") return;
if (isObjectReference(value)) throw new Error("Managed references belong in declared RPC references or graph relationships, not ordinary state/messages");
if (seen.has(value)) throw new Error("Cyclic ordinary data");
seen.add(value);
if (!(value instanceof Uint8Array)) for (const child of Object.values(value)) assertReferenceFree(child, seen);
seen.delete(value);
};
+59
View File
@@ -0,0 +1,59 @@
import type {QxObjectRef} from "./references.js";
import type {RelationshipCollection, RelationshipEntry} from "./index.js";
type Key = string | boolean | bigint;
type Port<T extends QxObjectRef> = {collection(): Promise<RelationshipCollection<T>>; replace(entries: RelationshipEntry<T>[], expectedRevision: bigint): Promise<RelationshipCollection<T>>};
const checked = async <T extends QxObjectRef>(port: Port<T>, revision: bigint) => {
const snapshot = await port.collection();
if (snapshot.revision !== revision) throw new Error("STALE_COLLECTION_REVISION");
return snapshot;
};
/** Helpers never retry a failed CAS or silently overwrite concurrent edits. */
export const relationshipMap = <T extends QxObjectRef, K extends Key = Key>(port: Port<T>) => ({
read: () => port.collection(),
async get(key: K) {const snapshot = await port.collection(); return {revision: snapshot.revision, value: snapshot.entries.find((entry) => entry.key === key)?.target};},
async set(key: K, target: T, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
const entries = snapshot.entries.filter((entry) => entry.key !== key);
const existing = snapshot.entries.find((entry) => entry.key === key && entry.target.equals(target));
entries.push(existing ?? {key, target});
return port.replace(entries, expectedRevision);
},
async delete(key: K, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
return port.replace(snapshot.entries.filter((entry) => entry.key !== key), expectedRevision);
},
});
export const relationshipList = <T extends QxObjectRef>(port: Port<T>) => ({
read: () => port.collection(),
async insert(index: number, target: T, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
if (!Number.isSafeInteger(index) || index < 0 || index > snapshot.entries.length) throw new Error("List index out of bounds");
snapshot.entries.splice(index, 0, {target});
return port.replace(snapshot.entries, expectedRevision);
},
async move(edgeId: string, index: number, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
const prior = snapshot.entries.findIndex((entry) => entry.edgeId === edgeId);
if (prior < 0 || !Number.isSafeInteger(index) || index < 0 || index >= snapshot.entries.length) throw new Error("Unknown list entry or invalid index");
const [entry] = snapshot.entries.splice(prior, 1);
snapshot.entries.splice(index, 0, entry);
return port.replace(snapshot.entries, expectedRevision);
},
async delete(edgeId: string, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
if (!snapshot.entries.some((entry) => entry.edgeId === edgeId)) throw new Error("Unknown list entry");
return port.replace(snapshot.entries.filter((entry) => entry.edgeId !== edgeId), expectedRevision);
},
});
export const relationshipSet = <T extends QxObjectRef>(port: Port<T>) => ({
read: () => port.collection(),
async add(target: T, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
if (snapshot.entries.some((entry) => entry.target.equals(target))) return snapshot;
return port.replace([...snapshot.entries, {target}], expectedRevision);
},
async delete(target: T, expectedRevision: bigint) {
const snapshot = await checked(port, expectedRevision);
return port.replace(snapshot.entries.filter((entry) => !entry.target.equals(target)), expectedRevision);
},
});
-978
View File
@@ -1,978 +0,0 @@
import fs from "node:fs";
import path from "node:path";
import protobuf from "protobufjs";
import type {
Cardinality,
ClassSchema,
ConflictStrategy,
FieldSchema,
FieldStorage,
FieldStorageKind,
FunctionRef,
InterfaceFieldContract,
InterfaceImplementation,
InterfaceSchema,
MethodSchema,
OperationSchema,
OperationServiceSchema,
MigrationSpec,
SchemaCompileResult,
SymbolRef,
EdgeDirectionality,
TypeRef,
} from "./schema-ir.js";
type OptionBag = Record<string, unknown>;
const CLASS_OPTION = "(camino.class)";
const INTERFACE_OPTION = "(camino.interface)";
const IMPLEMENTS_OPTION = "(camino.implements)";
const CONSTRUCTOR_OPTION = "(camino.constructor)";
const METHOD_OPTION = "(camino.method)";
const MIGRATION_OPTION = "(camino.migration)";
const CONFLICT_OPTION = "(camino.conflict)";
const EDGE_OPTION = "(camino.edge)";
const FIELD_STORAGE_OPTION = "(camino.field_storage)";
const FIELD_OPS_OPTION = "(camino.field_ops)";
const INTERFACE_FIELD_OPTION = "(camino.interface_field)";
const DISPLAY_LABEL_OPTION = "(camino.display_label)";
const IMPL_OPTION = "(camino.impl)";
const SCHEMA_NAMESPACE_OPTION = "(camino.schema_namespace)";
const SCHEMA_VERSION_OPTION = "(camino.schema_version)";
const enumName = (value: unknown) =>
String(value)
.replace(/([a-z0-9])([A-Z])/g, "$1_$2")
.replace(/-/g, "_")
.toUpperCase();
const lowerEnumName = (value: unknown) => enumName(value).toLowerCase();
const getOption = (
options: OptionBag | undefined,
name: string,
): unknown => {
if (!options) {
return undefined;
}
if (Object.hasOwn(options, name)) {
return options[name];
}
const bareName = name.replace(/^\((.*)\)$/, "$1");
if (Object.hasOwn(options, bareName)) {
return options[bareName];
}
return undefined;
};
const getParsedOptions = (
reflection: protobuf.ReflectionObject,
): OptionBag[] => {
const parsedOptions = (reflection as unknown as { parsedOptions?: unknown })
.parsedOptions;
return Array.isArray(parsedOptions)
? parsedOptions.filter(
(option): option is OptionBag =>
Boolean(option) && typeof option === "object" && !Array.isArray(option),
)
: [];
};
const getReflectionOptions = (
reflection: protobuf.ReflectionObject,
name: string,
): unknown[] => {
const parsedValues = getParsedOptions(reflection).flatMap((option) => {
const value = getOption(option, name);
return value === undefined ? [] : [value];
});
if (parsedValues.length > 0) {
return parsedValues;
}
const value = getOption(reflection.options, name);
return value === undefined ? [] : [value];
};
const getReflectionOption = (
reflection: protobuf.ReflectionObject,
name: string,
): unknown => getReflectionOptions(reflection, name)[0];
const asObject = (value: unknown): OptionBag | undefined =>
value && typeof value === "object" && !Array.isArray(value)
? (value as OptionBag)
: undefined;
const asArray = (value: unknown): unknown[] =>
Array.isArray(value) ? value : value === undefined ? [] : [value];
const readString = (
object: OptionBag | undefined,
key: string,
): string | undefined => {
const value = object?.[key];
return typeof value === "string" ? value : undefined;
};
const readNumber = (
object: OptionBag | undefined,
key: string,
): number | undefined => {
const value = object?.[key];
return typeof value === "number" && Number.isFinite(value)
? value
: undefined;
};
const readBoolean = (
object: OptionBag | undefined,
key: string,
): boolean | undefined => {
const value = object?.[key];
return typeof value === "boolean" ? value : undefined;
};
const symbolRefFromOption = (
value: unknown,
fallback: SymbolRef,
): SymbolRef => {
const object = asObject(value);
if (!object) {
return fallback;
}
return {
namespace: readString(object, "namespace") ?? fallback.namespace,
name: readString(object, "name") ?? fallback.name,
version: readString(object, "version") ?? fallback.version,
...(readString(object, "hash")
? { hash: readString(object, "hash") }
: {}),
};
};
const typeRefFromOption = (
value: unknown,
fallbackVersion: string,
): TypeRef | undefined => {
const object = asObject(value);
if (!object) {
return undefined;
}
const symbol = asObject(object.symbol)
? symbolRefFromOption(object.symbol, {
namespace: "",
name: "",
version: fallbackVersion,
})
: undefined;
const protoType = readString(object, "proto_type")?.replace(/^\./, "");
const symbolProtoType =
symbol?.namespace && symbol.name ? `${symbol.namespace}.${symbol.name}` : "";
const resolvedProtoType = protoType ?? symbolProtoType;
if (!resolvedProtoType) {
return undefined;
}
return {
protoType: resolvedProtoType,
...(symbol?.namespace && symbol.name ? { symbol } : {}),
};
};
const interfaceFieldContractFromOption = (
value: unknown,
schemaVersion: string,
): InterfaceFieldContract | undefined => {
const object = asObject(value);
if (!object) {
return undefined;
}
const type = typeRefFromOption(object.type, schemaVersion);
const refTargetTypeParam = readString(object, "ref_target_type_param");
const edgeCardinality =
object.edge_cardinality === undefined
? undefined
: cardinalityFromOption(object.edge_cardinality);
return {
required: readBoolean(object, "required") ?? false,
readable: readBoolean(object, "readable") ?? false,
writable: readBoolean(object, "writable") ?? false,
watchable: readBoolean(object, "watchable") ?? false,
...(readString(object, "type_param")
? { typeParam: readString(object, "type_param") }
: {}),
...(type ? { type } : {}),
...(refTargetTypeParam ? { refTargetTypeParam } : {}),
...(edgeCardinality ? { edgeCardinality } : {}),
};
};
const functionRefFromOption = (value: unknown): FunctionRef => {
const object = asObject(value);
if (!object) {
throw new Error("Expected function ref option object");
}
const packageNamespace = readString(object, "package_namespace");
const packageName = readString(object, "package_name");
const symbol = readString(object, "symbol");
if (!packageNamespace || !packageName || !symbol) {
throw new Error("Function ref requires package_namespace, package_name, and symbol");
}
return {
packageNamespace,
packageName,
symbol,
...(readString(object, "operation")
? { operation: readString(object, "operation") }
: {}),
...(readString(object, "version_ref")
? { versionRef: readString(object, "version_ref") }
: {}),
};
};
const conflictFromOption = (value: unknown): ConflictStrategy => {
const normalized = enumName(value);
if (!value || normalized === "CONFLICT_STRATEGY_UNSPECIFIED") {
return "preserve_conflicts";
}
if (normalized === "REPLACE") {
return "replace";
}
if (normalized === "PRESERVE_CONFLICTS") {
return "preserve_conflicts";
}
if (normalized === "CRDT") {
return "crdt";
}
throw new Error(`Unknown Camino conflict strategy: ${String(value)}`);
};
const cardinalityFromOption = (value: unknown): Cardinality => {
const normalized = lowerEnumName(value);
if (!value || normalized === "cardinality_unspecified") {
return "many";
}
if (
normalized === "optional_one" ||
normalized === "exactly_one" ||
normalized === "many" ||
normalized === "many_unique" ||
normalized === "many_ordered" ||
normalized === "many_unique_ordered"
) {
return normalized;
}
throw new Error(`Unknown Camino cardinality: ${String(value)}`);
};
const fieldStorageKindFromOption = (value: unknown): FieldStorageKind => {
if (value === 5) {
return "static_final";
}
const normalized = lowerEnumName(value);
if (!value || normalized === "field_storage_kind_unspecified") {
return "stored";
}
if (
normalized === "stored" ||
normalized === "derived" ||
normalized === "lazy" ||
normalized === "external" ||
normalized === "static_final"
) {
return normalized;
}
throw new Error(`Unknown Camino field storage kind: ${String(value)}`);
};
const fieldStorageFromOption = (value: unknown): FieldStorage => {
const object = asObject(value);
if (!object) {
return {
kind: "stored",
cache: false,
};
}
const kind = fieldStorageKindFromOption(object.kind);
const resolver = object.resolver === undefined
? undefined
: functionRefFromOption(object.resolver);
if ((kind === "derived" || kind === "lazy" || kind === "external") && !resolver) {
throw new Error(`${kind} field storage requires resolver`);
}
return {
kind,
...(resolver ? { resolver } : {}),
cache: object.cache === true,
};
};
const fieldOpsFromOption = (value: unknown) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const implementation = enumName(object.implementation);
if (implementation !== "SERVICE") {
throw new Error(
`Unsupported Camino field implementation: ${String(object.implementation)}`,
);
}
const service = readString(object, "service");
if (!service) {
throw new Error("SERVICE field_ops requires service");
}
return {
implementation: "service" as const,
service,
};
};
const extractFileDefaults = (sourceFile: string) => {
const text = fs.readFileSync(sourceFile, "utf8");
const packageMatch = /^\s*package\s+([a-zA-Z0-9_.]+)\s*;/m.exec(text);
const namespaceMatch =
/^\s*option\s+\(camino\.schema_namespace\)\s*=\s*"([^"]+)"\s*;/m.exec(
text,
);
const versionMatch =
/^\s*option\s+\(camino\.schema_version\)\s*=\s*"([^"]+)"\s*;/m.exec(text);
return {
packageName: packageMatch?.[1] ?? "",
schemaNamespace: namespaceMatch?.[1] ?? packageMatch?.[1] ?? "",
schemaVersion: versionMatch?.[1] ?? "1",
};
};
const protoSymbolFromReflection = (
reflection: protobuf.ReflectionObject | null,
fallbackVersion: string,
): SymbolRef | undefined => {
if (!reflection?.fullName) {
return undefined;
}
const parts = reflection.fullName.replace(/^\./, "").split(".");
const name = parts.pop();
if (!name) {
return undefined;
}
return {
namespace: parts.join("."),
name,
version: fallbackVersion,
};
};
const typeRefForField = (
field: protobuf.Field,
schemaVersion: string,
): TypeRef => {
const symbol = protoSymbolFromReflection(field.resolvedType, schemaVersion);
const enumValues =
field.resolvedType instanceof protobuf.Enum
? Object.entries(field.resolvedType.values)
.filter(([_name, value]) => value !== 0)
.map(([name]) => name)
: undefined;
return {
protoType: field.type,
...(symbol ? { symbol } : {}),
...(enumValues ? { enumValues } : {}),
};
};
const typeRefForType = (
type: protobuf.Type | undefined,
fallbackType: string,
schemaVersion: string,
): TypeRef => {
const symbol = protoSymbolFromReflection(type ?? null, schemaVersion);
return {
protoType: type?.fullName?.replace(/^\./, "") ?? fallbackType,
...(symbol ? { symbol } : {}),
};
};
const fieldSchemaFromField = (
field: protobuf.Field,
schemaVersion: string,
): FieldSchema => {
const storage = fieldStorageFromOption(
getReflectionOption(field, FIELD_STORAGE_OPTION),
);
const ops = fieldOpsFromOption(getReflectionOption(field, FIELD_OPS_OPTION));
if (ops && storage.kind !== "stored" && storage.kind !== "static_final") {
throw new Error(
`Field ${field.fullName} cannot declare both field_ops and package-resolved storage`,
);
}
if (storage.kind === "static_final" && !ops) {
throw new Error(`Field ${field.fullName} with static_final storage requires field_ops`);
}
const interfaceContract = interfaceFieldContractFromOption(
getReflectionOption(field, INTERFACE_FIELD_OPTION),
schemaVersion,
);
return {
name: field.name,
tag: field.id,
type: typeRefForField(field, schemaVersion),
conflict: conflictFromOption(getReflectionOption(field, CONFLICT_OPTION)),
repeated: field.repeated,
optional: field.optional,
storage,
...(ops ? { ops } : {}),
...(interfaceContract ? { interfaceContract } : {}),
isDisplayLabel: getReflectionOption(field, DISPLAY_LABEL_OPTION) === true,
};
};
const isManyCardinality = (cardinality: Cardinality) =>
cardinality === "many" ||
cardinality === "many_unique" ||
cardinality === "many_ordered" ||
cardinality === "many_unique_ordered";
const materializationFromOption = (
value: unknown,
fallbackVersion: string,
) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const classRef = symbolRefFromOption(object.class, {
namespace: "",
name: "",
version: fallbackVersion,
});
if (!classRef.name) {
throw new Error("Edge materialization requires class");
}
return {
class: classRef,
connectProjection: readString(object, "connect_projection") ?? "",
};
};
const endpointFromOption = (params: {
option: unknown;
fallbackClass?: SymbolRef;
fallbackProjection: string;
fallbackCardinality: Cardinality;
fallbackVersion: string;
}) => {
const object = asObject(params.option);
const classRef = asObject(object?.class)
? symbolRefFromOption(object?.class, {
namespace: "",
name: "",
version: params.fallbackVersion,
})
: params.fallbackClass;
const interfaceRef = asObject(object?.interface)
? symbolRefFromOption(object?.interface, {
namespace: "",
name: "",
version: params.fallbackVersion,
})
: undefined;
const projection = readString(object, "projection") ?? params.fallbackProjection;
const cardinality = object?.cardinality === undefined
? params.fallbackCardinality
: cardinalityFromOption(object.cardinality);
const materialization = materializationFromOption(
object?.materialize,
params.fallbackVersion,
);
if (!classRef?.name && !interfaceRef?.name) {
throw new Error(`Edge endpoint ${projection} requires class or interface`);
}
return {
...(classRef?.name ? { class: classRef } : {}),
...(interfaceRef?.name ? { interface: interfaceRef } : {}),
projection,
cardinality,
indexed: readBoolean(object, "indexed") ?? false,
...(materialization ? { materialization } : {}),
};
};
const symbolKey = (ref: SymbolRef | undefined) =>
ref ? [ref.namespace, ref.name, ref.version, ref.hash ?? ""].join(":") : "";
const endpointRoleKey = (endpoint: ReturnType<typeof endpointFromOption>) =>
[
symbolKey(endpoint.class),
symbolKey(endpoint.interface),
endpoint.projection,
endpoint.cardinality,
].join("|");
const normalizeEdgeEndpoints = (params: {
directionality: "directed" | "undirected";
fromEndpoint: ReturnType<typeof endpointFromOption>;
toEndpoint: ReturnType<typeof endpointFromOption>;
}) => {
if (params.directionality === "directed") {
return {
fromEndpoint: params.fromEndpoint,
toEndpoint: params.toEndpoint,
};
}
return endpointRoleKey(params.fromEndpoint) <= endpointRoleKey(params.toEndpoint)
? {
fromEndpoint: params.fromEndpoint,
toEndpoint: params.toEndpoint,
}
: {
fromEndpoint: params.toEndpoint,
toEndpoint: params.fromEndpoint,
};
};
const symbolArrayFromOption = (
value: unknown,
defaults: ReturnType<typeof extractFileDefaults>,
) =>
asArray(value)
.map((item) =>
symbolRefFromOption(item, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
}),
)
.filter((symbol) => Boolean(symbol.name));
const isStringType = (type: TypeRef) =>
type.protoType === "string" || type.protoType === "google.protobuf.StringValue";
const validateDisplayLabelFields = (
type: protobuf.Type,
fields: FieldSchema[],
operationServices: OperationServiceSchema[],
) => {
const displayLabelFields = fields.filter((field) => field.isDisplayLabel);
if (displayLabelFields.length > 1) {
throw new Error(
`Class ${type.fullName} declares multiple Camino display label fields`,
);
}
const displayLabelField = displayLabelFields[0];
if (!displayLabelField) {
return;
}
if (!displayLabelField.ops) {
if (!isStringType(displayLabelField.type)) {
throw new Error(
`Display label field ${type.fullName}.${displayLabelField.name} must have string type`,
);
}
return;
}
const serviceName = displayLabelField.ops.service.replace(/^\./, "");
const getOperation = operationServices
.find((service) => service.fullName === serviceName)
?.operations.find((operation) => operation.name === "Get");
if (!getOperation || !isStringType(getOperation.outputType)) {
throw new Error(
`Display label field ${type.fullName}.${displayLabelField.name} must resolve to string`,
);
}
};
const typeBindingFromOption = (
value: unknown,
schemaVersion: string,
) => {
const object = asObject(value);
if (!object) {
return undefined;
}
const name = readString(object, "name");
const type = typeRefFromOption(object.type, schemaVersion);
if (!name || !type) {
throw new Error("Interface type_binding requires name and type");
}
return { name, type };
};
const interfaceImplementationFromOption = (
value: unknown,
defaults: ReturnType<typeof extractFileDefaults>,
): InterfaceImplementation => {
const object = asObject(value);
if (!object) {
throw new Error("Expected implements option object");
}
const interfaceId = symbolRefFromOption(object.interface, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
});
if (!interfaceId.name) {
throw new Error("implements option requires interface name");
}
return {
interface: interfaceId,
typeBindings: asArray(object.type_binding)
.map((binding) => typeBindingFromOption(binding, defaults.schemaVersion))
.filter((binding): binding is NonNullable<typeof binding> =>
Boolean(binding),
),
};
};
const serviceName = (service: protobuf.Service) =>
service.fullName.replace(/^\./, "");
const operationFromMethod = (
method: protobuf.Method,
schemaVersion: string,
): OperationSchema => {
const fn = functionRefFromOption(getReflectionOption(method, IMPL_OPTION));
const methodWithTypes = method as protobuf.Method & {
resolvedRequestType?: protobuf.Type;
resolvedResponseType?: protobuf.Type;
};
return {
name: method.name,
inputType: typeRefForType(
methodWithTypes.resolvedRequestType,
method.requestType,
schemaVersion,
),
outputType: typeRefForType(
methodWithTypes.resolvedResponseType,
method.responseType,
schemaVersion,
),
function: fn,
};
};
const operationServiceFromService = (
service: protobuf.Service,
schemaVersion: string,
): OperationServiceSchema => ({
name: service.name,
fullName: serviceName(service),
operations: service.methodsArray.map((method) =>
operationFromMethod(method, schemaVersion),
),
});
const classSchemaFromType = (
type: protobuf.Type,
sourceFile: string,
defaults: ReturnType<typeof extractFileDefaults>,
operationServices: OperationServiceSchema[],
): ClassSchema | undefined => {
const classOption = asObject(getReflectionOption(type, CLASS_OPTION));
if (!classOption) {
return undefined;
}
const fallbackClassRef = {
namespace: defaults.schemaNamespace,
name: type.name,
version: defaults.schemaVersion,
};
const classId = symbolRefFromOption(classOption.id, fallbackClassRef);
const classVersion = readNumber(classOption, "version") ?? Number(classId.version);
if (!Number.isInteger(classVersion) || classVersion <= 0) {
throw new Error(`Class ${type.fullName} has invalid Camino class version`);
}
const fields = type.fieldsArray.map((field) =>
fieldSchemaFromField(field, defaults.schemaVersion),
);
validateDisplayLabelFields(type, fields, operationServices);
const edges = type.fieldsArray.flatMap((field) => {
const edgeOption = asObject(getReflectionOption(field, EDGE_OPTION));
if (!edgeOption) {
return [];
}
const legacyTargetClass = symbolRefFromOption(edgeOption.target, {
namespace: defaults.schemaNamespace,
name: "",
version: defaults.schemaVersion,
});
const cardinality = cardinalityFromOption(edgeOption.cardinality);
const declaredFromEndpoint = endpointFromOption({
option: edgeOption.this_endpoint,
fallbackClass: classId,
fallbackProjection: field.name,
fallbackCardinality: cardinality,
fallbackVersion: defaults.schemaVersion,
});
const declaredToEndpoint = endpointFromOption({
option: edgeOption.other_endpoint,
fallbackClass: legacyTargetClass.name ? legacyTargetClass : undefined,
fallbackProjection: readString(edgeOption, "inverse") ?? "",
fallbackCardinality: "many",
fallbackVersion: defaults.schemaVersion,
});
if (!declaredToEndpoint.projection) {
throw new Error(
`Edge field ${type.fullName}.${field.name} requires other_endpoint.projection or inverse`,
);
}
const sourceType = typeRefForField(field, defaults.schemaVersion);
if (
sourceType.symbol?.namespace !== "camino" ||
sourceType.symbol.name !== "Ref"
) {
throw new Error(`Edge field ${type.fullName}.${field.name} must use camino.Ref`);
}
const isMany = isManyCardinality(declaredFromEndpoint.cardinality);
if (isMany && !field.repeated) {
throw new Error(`Edge field ${type.fullName}.${field.name} must be repeated for ${declaredFromEndpoint.cardinality}`);
}
if (!isMany && field.repeated) {
throw new Error(`Edge field ${type.fullName}.${field.name} must not be repeated for ${declaredFromEndpoint.cardinality}`);
}
const directionality: EdgeDirectionality =
edgeOption.undirected === true ? "undirected" : "directed";
const { fromEndpoint, toEndpoint } = normalizeEdgeEndpoints({
directionality,
fromEndpoint: declaredFromEndpoint,
toEndpoint: declaredToEndpoint,
});
const edgeId = symbolRefFromOption(edgeOption.id, {
namespace: defaults.schemaNamespace,
name: `${type.name}.${field.name}`,
version: defaults.schemaVersion,
});
const fallbackToClass = toEndpoint.class ?? {
namespace: "",
name: "",
version: "",
};
return [
{
id: edgeId,
directionality,
sourceField: fromEndpoint.projection,
fromClass: fromEndpoint.class ?? classId,
toClass: fallbackToClass,
cardinality: fromEndpoint.cardinality,
...(toEndpoint.projection
? { inverse: toEndpoint.projection }
: {}),
fields: [],
fromEndpoint,
toEndpoint,
declaringClass: classId,
tags: symbolArrayFromOption(edgeOption.tag, defaults),
implements: symbolArrayFromOption(edgeOption.implements, defaults),
},
];
});
const methods: MethodSchema[] = getReflectionOptions(type, METHOD_OPTION)
.map(asObject)
.filter((option): option is OptionBag => Boolean(option))
.map((option) => {
const name = readString(option, "name");
if (!name) {
throw new Error(`Method option on ${type.fullName} requires name`);
}
return {
name,
function: functionRefFromOption(option.function),
};
});
const migrations: MigrationSpec[] = getReflectionOptions(type, MIGRATION_OPTION)
.map(asObject)
.filter((option): option is OptionBag => Boolean(option))
.map((option) => {
const fromVersion = readNumber(option, "from_version");
const toVersion = readNumber(option, "to_version");
if (!fromVersion || !toVersion) {
throw new Error(`Migration option on ${type.fullName} requires versions`);
}
return {
fromVersion,
toVersion,
function: functionRefFromOption(option.function),
};
});
const constructorOption = asObject(
getReflectionOption(type, CONSTRUCTOR_OPTION),
);
const constructorSpec = constructorOption
? { function: functionRefFromOption(constructorOption.function) }
: undefined;
return {
id: classId,
version: classVersion,
fields,
edges,
methods,
migrations,
operationServices,
implements: getReflectionOptions(type, IMPLEMENTS_OPTION).map((option) =>
interfaceImplementationFromOption(option, defaults),
),
...(constructorSpec ? { constructorSpec } : {}),
sourceFile,
protoMessage: type.fullName,
};
};
const interfaceSchemaFromType = (
type: protobuf.Type,
sourceFile: string,
defaults: ReturnType<typeof extractFileDefaults>,
): InterfaceSchema | undefined => {
const interfaceOption = asObject(getReflectionOption(type, INTERFACE_OPTION));
if (!interfaceOption) {
return undefined;
}
const classOption = asObject(getReflectionOption(type, CLASS_OPTION));
if (classOption) {
throw new Error(`${type.fullName} cannot be both a Camino class and interface`);
}
const fallbackInterfaceRef = {
namespace: defaults.schemaNamespace,
name: type.name,
version: defaults.schemaVersion,
};
const interfaceId = symbolRefFromOption(
interfaceOption.id,
fallbackInterfaceRef,
);
const interfaceVersion =
readNumber(interfaceOption, "version") ?? Number(interfaceId.version);
if (!Number.isInteger(interfaceVersion) || interfaceVersion <= 0) {
throw new Error(`Interface ${type.fullName} has invalid Camino interface version`);
}
return {
id: interfaceId,
version: interfaceVersion,
fields: type.fieldsArray.map((field) =>
fieldSchemaFromField(field, defaults.schemaVersion),
),
sourceFile,
protoMessage: type.fullName,
typeParameters: asArray(interfaceOption.type_parameter)
.map((entry) => String(entry).trim())
.filter(Boolean),
};
};
const walkTypes = (
namespace: protobuf.NamespaceBase,
visit: (type: protobuf.Type) => void,
) => {
for (const nested of namespace.nestedArray) {
if (nested instanceof protobuf.Type) {
visit(nested);
walkTypes(nested, visit);
} else if (nested instanceof protobuf.Namespace) {
walkTypes(nested, visit);
}
}
};
const walkServices = (
namespace: protobuf.NamespaceBase,
visit: (service: protobuf.Service) => void,
) => {
for (const nested of namespace.nestedArray) {
if (nested instanceof protobuf.Service) {
visit(nested);
} else if (nested instanceof protobuf.Namespace) {
walkServices(nested, visit);
}
}
};
export const loadCaminoSchemaRoot = async (
sourceFile: string,
): Promise<{ absoluteSourceFile: string; root: protobuf.Root }> => {
const absoluteSourceFile = path.resolve(sourceFile);
const root = new protobuf.Root();
const envIncludeDirs = [
process.env.QUIXOS_PROTO_PATH,
process.env.CAMINO_PROTO_PATH,
]
.filter((value): value is string => Boolean(value))
.join(path.delimiter)
.split(path.delimiter)
.map((entry) => entry.trim())
.filter(Boolean)
.map((entry) => path.resolve(entry));
const includeDirs = [
path.dirname(absoluteSourceFile),
path.resolve("../../quixos-protocol/proto"),
path.resolve("quixos-protocol/proto"),
path.resolve("proto"),
...envIncludeDirs,
];
root.resolvePath = (origin, target) => {
if (path.isAbsolute(target) && fs.existsSync(target)) {
return target;
}
const originDir = origin ? path.dirname(origin) : undefined;
const candidates = [
...(originDir ? [path.resolve(originDir, target)] : []),
...includeDirs.map((dir) => path.resolve(dir, target)),
];
const found = candidates.find((candidate) => fs.existsSync(candidate));
return found ?? target;
};
await root.load(absoluteSourceFile, { keepCase: true });
root.resolveAll();
return { absoluteSourceFile, root };
};
export const compileCaminoSchema = async (
sourceFile: string,
): Promise<SchemaCompileResult> => {
const { absoluteSourceFile, root } = await loadCaminoSchemaRoot(sourceFile);
const defaults = extractFileDefaults(absoluteSourceFile);
const operationServices: OperationServiceSchema[] = [];
walkServices(root, (service) => {
operationServices.push(
operationServiceFromService(service, defaults.schemaVersion),
);
});
const classes: ClassSchema[] = [];
const interfaces: InterfaceSchema[] = [];
walkTypes(root, (type) => {
const interfaceSchema = interfaceSchemaFromType(
type,
absoluteSourceFile,
defaults,
);
if (interfaceSchema) {
interfaces.push(interfaceSchema);
}
const classSchema = classSchemaFromType(
type,
absoluteSourceFile,
defaults,
operationServices,
);
if (classSchema) {
classes.push(classSchema);
}
});
return {
sourceFile: absoluteSourceFile,
classes,
interfaces,
};
};
-174
View File
@@ -1,174 +0,0 @@
export type SymbolRef = {
namespace: string;
name: string;
version: string;
hash?: string;
};
export type FunctionRef = {
packageNamespace: string;
packageName: string;
symbol: string;
operation?: string;
versionRef?: string;
};
export type ConflictStrategy =
| "replace"
| "preserve_conflicts"
| "crdt";
export type Cardinality =
| "optional_one"
| "exactly_one"
| "many"
| "many_unique"
| "many_ordered"
| "many_unique_ordered";
export type EdgeDirectionality = "directed" | "undirected";
export type EdgeMaterialization = {
class: SymbolRef;
connectProjection: string;
};
export type FieldStorageKind =
| "stored"
| "derived"
| "lazy"
| "external"
| "static_final";
export type FieldStorage = {
kind: FieldStorageKind;
resolver?: FunctionRef;
cache: boolean;
};
export type FieldOps = {
implementation: "service";
service: string;
};
export type TypeRef = {
protoType: string;
symbol?: SymbolRef;
enumValues?: string[];
};
export type TypeBinding = {
name: string;
type: TypeRef;
};
export type InterfaceFieldContract = {
required: boolean;
readable: boolean;
writable: boolean;
watchable: boolean;
typeParam?: string;
type?: TypeRef;
refTargetTypeParam?: string;
edgeCardinality?: Cardinality;
};
export type InterfaceImplementation = {
interface: SymbolRef;
typeBindings: TypeBinding[];
};
export type FieldSchema = {
name: string;
tag: number;
type: TypeRef;
conflict: ConflictStrategy;
repeated: boolean;
optional: boolean;
storage: FieldStorage;
ops?: FieldOps;
interfaceContract?: InterfaceFieldContract;
isDisplayLabel: boolean;
};
export type EdgeEndpointSchema = {
class?: SymbolRef;
interface?: SymbolRef;
projection: string;
cardinality: Cardinality;
indexed: boolean;
materialization?: EdgeMaterialization;
};
export type EdgeSchema = {
id: SymbolRef;
directionality: EdgeDirectionality;
sourceField: string;
fromClass: SymbolRef;
toClass: SymbolRef;
cardinality: Cardinality;
inverse?: string;
fields: FieldSchema[];
fromEndpoint: EdgeEndpointSchema;
toEndpoint: EdgeEndpointSchema;
declaringClass: SymbolRef;
tags: SymbolRef[];
implements: SymbolRef[];
};
export type MethodSchema = {
name: string;
function: FunctionRef;
};
export type MigrationSpec = {
fromVersion: number;
toVersion: number;
function: FunctionRef;
};
export type ConstructorSpec = {
function: FunctionRef;
};
export type OperationSchema = {
name: string;
inputType: TypeRef;
outputType: TypeRef;
function: FunctionRef;
};
export type OperationServiceSchema = {
name: string;
fullName: string;
operations: OperationSchema[];
};
export type ClassSchema = {
id: SymbolRef;
version: number;
fields: FieldSchema[];
edges: EdgeSchema[];
methods: MethodSchema[];
migrations: MigrationSpec[];
operationServices: OperationServiceSchema[];
implements: InterfaceImplementation[];
constructorSpec?: ConstructorSpec;
sourceFile: string;
protoMessage: string;
};
export type InterfaceSchema = {
id: SymbolRef;
version: number;
fields: FieldSchema[];
sourceFile: string;
protoMessage: string;
typeParameters: string[];
};
export type SchemaCompileResult = {
sourceFile: string;
classes: ClassSchema[];
interfaces: InterfaceSchema[];
};
+82
View File
@@ -0,0 +1,82 @@
import assert from "node:assert/strict";
import test from "node:test";
import { referenceFromWire } from "../dist/references.js";
import { bindQxHandler, decodeQxValue, encodeQxValue, jsToProtoValue, liveValue, protoValueToJs } from "../dist/index.js";
const scalar = (name) => ({ kind: "scalar", name });
const unit = { kind: "builtin", name: "unit" };
test("typed sessions rebind ports and cancellation to each acquired invocation", async () => {
const first = new AbortController(), second = new AbortController();
let closed = false;
const context = (value, signal) => ({objectId: referenceFromWire("obj:owner"), inputProto: {}, signal,
state: () => ({live: async () => liveValue(jsToProtoValue(value))})});
const raw = {...context(1n, first.signal), openSession: async () => ({id: "session:test",
run: (work) => work(context(2n, second.signal)), close: async () => {closed = true;}})};
const handler = bindQxHandler({inputType: unit, outputType: unit, ports: {counter: {kind: "state", id: "counter", valueType: scalar("int64"), primitives: ["read"]}}}, async (bound) => {
assert.equal(bound.signal, first.signal);
const session = await bound.openSession();
await session.run(async (next) => {
assert.equal(next.signal, second.signal);
assert.equal(await next.ports.counter.get(), 2n);
assert.equal(next.openSession, undefined);
});
await session.close();
}, {});
await handler(raw);
assert.equal(closed, true);
});
test("binding codecs round trip nested bytes, 64-bit integers, nulls, and references", () => {
const values = [[scalar("int64"), -(2n ** 63n)], [scalar("uint64"), 2n ** 64n - 1n],
[scalar("bytes"), new Uint8Array([0, 255])],
[{ kind: "list", value: { kind: "optional", value: scalar("int64") } }, [null, 2n ** 60n]],
[{ kind: "object-ref", expectation: { kind: "atom", atomId: "thing" } }, referenceFromWire("obj:thing")]];
for (const [type, value] of values) assert.deepEqual(decodeQxValue(type, encodeQxValue(type, value, {}), {}), value);
});
test("opaque references pass declared RPC boundaries but cannot enter ordinary data", () => {
const reference = referenceFromWire("obj:thing");
const type = {kind: "object-ref", expectation: {kind: "atom", atomId: "thing"}};
const roundtrip = decodeQxValue(type, encodeQxValue(type, reference, {}), {});
assert.equal(reference.equals(roundtrip), true);
assert.equal(reference.equals(referenceFromWire("obj:other")), false);
assert.throws(() => JSON.stringify({nested: [reference]}), /cannot be serialized/);
assert.throws(() => String(reference), /cannot be coerced/);
assert.throws(() => encodeQxValue(type, "obj:thing", {}), /opaque/);
assert.throws(() => encodeQxValue(scalar("string"), reference, {}), /Managed references/);
const message = {kind: "message", descriptorId: "Payload"};
assert.throws(() => encodeQxValue(message, {nested: reference}, {Payload: {encode: jsToProtoValue}}), /Managed references/);
assert.throws(() => encodeQxValue(message, {}, {Payload: {encode: () => jsToProtoValue(reference)}}), /Managed references/);
assert.throws(() => decodeQxValue(message, jsToProtoValue(reference), {Payload: {decode: () => ({})}}), /Managed references/);
});
test("typed state and interface ports preserve declared values and exact operation IDs", async () => {
const spec = { inputType: scalar("int64"), outputType: scalar("bytes"), ports: {
data: { kind: "state", id: "state-id", valueType: scalar("int64"), primitives: ["read", "write"] },
reader: { kind: "interface", id: "interface-id", operations: { "payload.get": { id: "get-id", inputType: unit, outputType: scalar("bytes") } } },
} };
let written;
const handler = bindQxHandler(spec, async ({ input, ports }) => {
assert.equal(input, 2n ** 60n);
assert.equal(await ports.data.get(), 9n);
await ports.data.set(input);
return ports.reader["payload.get"]();
}, {});
const result = await handler({ inputProto: { value: jsToProtoValue(2n ** 60n) }, objectId: "obj",
state: (id) => { assert.equal(id, "state-id"); return {
live: async () => liveValue(jsToProtoValue(9n)), set: async (value) => { written = value; },
}; },
interface: (id) => { assert.equal(id, "interface-id"); return { live: async (operation, input) => {
assert.equal(operation, "get-id"); assert.deepEqual(input, {}); return liveValue(jsToProtoValue(new Uint8Array([7])));
} }; },
});
assert.equal(written.$quixosValue.kind.value, String(2n ** 60n));
assert.deepEqual(result.$quixosValue.kind.value, new Uint8Array([7]));
});
test("external message bindings and derived event types are used at the boundary", async () => {
const message = { kind: "message", descriptorId: "Payload" };
const messages = { Payload: { encode: jsToProtoValue, decode: protoValueToJs } };
const handler = bindQxHandler({ inputType: message, outputType: { kind: "builtin", name: "watch-handle" }, eventType: message, ports: {} },
{ kind: "derived", get: ({ input }) => ({ value: input.title }) }, messages);
assert.equal(handler.kind, "derived");
const result = await handler.get({ objectId: "obj", inputProto: { title: jsToProtoValue("hello") } });
assert.deepEqual(protoValueToJs(result.$quixosValue), { value: "hello" });
assert.throws(() => encodeQxValue(message, {}, {}), /Missing message binding/);
});
+30
View File
@@ -0,0 +1,30 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import crypto from 'node:crypto';
import {spawnSync} from 'node:child_process';
test('supervised SDK reads a credential file and proves instance identity without an environment token', async t => {
const directory = await fs.mkdtemp(path.join(os.tmpdir(), 'qx-sdk-credential-'));
t.after(() => fs.rm(directory, {recursive:true, force:true}));
const token = crypto.randomBytes(32).toString('hex');
const filename = path.join(directory, 'process-token');
await fs.writeFile(filename, token, {mode:0o600});
const env = {...process.env, CAMINO_RUNTIME_AUTH_TOKEN_FILE: filename,
CAMINO_RUNTIME_AUTH_REQUIRED:'1', QUIXOS_RUNTIME_INSTANCE_ID:'instance:test'};
delete env.CAMINO_RUNTIME_AUTH_TOKEN;
const result = spawnSync(process.execPath, ['--input-type=module', '-e', `
import {createPackageRuntimeRoutes} from ${JSON.stringify(new URL('../dist/index.js', import.meta.url).href)};
createPackageRuntimeRoutes({packageRevisionId:'package:test',exports:{}})({
service(_type, implementation) { console.log(JSON.stringify(implementation.handshake({nonce:'challenge'}))); }
});
`], {env, encoding:'utf8'});
assert.equal(result.status, 0, result.stderr);
const handshake = JSON.parse(result.stdout);
assert.equal(handshake.authenticationProof, crypto.createHmac('sha256', token)
.update(JSON.stringify(['challenge','instance:test','package:test'])).digest('hex'));
assert.ok(handshake.capabilities.includes('epoch-grants-v1'));
assert.ok(!result.stdout.includes(token));
});
+15
View File
@@ -0,0 +1,15 @@
import test from "node:test";
import assert from "node:assert/strict";
import { createInvocationRegistry } from "../dist/invocations.js";
test("cancel requests do not acknowledge execution completion or allow replay", () => {
const registry = createInvocationRegistry();
const execution = registry.begin("call-1");
assert.equal(registry.cancel("call-1").state, "cancellation-requested");
assert.equal(execution.signal.aborted, true);
assert.equal(registry.status("call-1").state, "cancellation-requested");
execution.finish();
assert.equal(registry.status("call-1").state, "completed");
assert.throws(() => registry.begin("call-1"), /already used/);
assert.equal(registry.status("missing").state, "unknown");
});
+24
View File
@@ -0,0 +1,24 @@
import test from "node:test";
import assert from "node:assert/strict";
import {createMigrationContext, migrationObjectId} from "../dist/migration.js";
test("migration context offers restricted ports and deterministic helper identities", () => {
const input = {schemaVersion: 1, executionId: "operation:transition", exportId: "migrate", ports: [
{name: "old", binding: "slot:name", view: "old", access: ["read"], states: [{objectId: "obj:one", value: "Alice"}]},
{name: "new", binding: "slot:name", view: "new", access: ["write"]}, {name: "newRead", binding: "slot:name", view: "new", access: ["read"]},
{name: "helpers", binding: "atom:helper", view: "new", access: ["create"]},
]};
const {context, result} = createMigrationContext(input);
assert.equal(context.read("old", "obj:one"), "Alice");
assert.throws(() => context.write("old", "obj:one", "Bob"), /does not grant/);
assert.throws(() => context.read("new", "obj:one"), /does not grant/);
context.write("new", "obj:one", "Alice");
assert.equal(context.read("newRead", "obj:one"), "Alice");
context.write("new", "obj:one", "Bob");
assert.equal(context.read("newRead", "obj:one"), "Bob");
assert.equal(context.read("old", "obj:one"), "Alice");
const helper = context.create("helpers", "one");
assert.equal(helper, migrationObjectId(input.executionId, "helpers", "one"));
assert.equal(context.create("helpers", "one"), helper);
assert.equal(result().creates.length, 1);
assert.deepEqual(input.ports[0].states, [{objectId: "obj:one", value: "Alice"}]);
});
+27
View File
@@ -0,0 +1,27 @@
import test from "node:test";
import assert from "node:assert/strict";
import {relationshipMap, relationshipList, relationshipSet} from "../dist/index.js";
import {referenceFromWire} from "../dist/references.js";
test("relationship helpers preserve handles and require explicit collection revisions", async () => {
let current = {revision: 0n, entries: []}, serial = 0;
const port = {collection: async () => ({revision: current.revision, entries: current.entries.map((entry) => ({...entry}))}),
replace: async (entries, revision) => {
assert.equal(revision, current.revision);
current = {revision: revision + 1n, entries: entries.map((entry) => ({...entry, edgeId: entry.edgeId ?? `edge:${++serial}`}))};
return port.collection();
}};
const a = referenceFromWire("obj:a"), b = referenceFromWire("obj:b");
const map = relationshipMap(port);
await map.set("a1", a, 0n);
assert.equal((await map.get("a1")).value.equals(a), true);
await assert.rejects(() => map.set("b1", b, 0n), /STALE_COLLECTION/);
await map.delete("a1", 1n);
const list = relationshipList(port);
const inserted = await list.insert(0, a, 2n);
await list.insert(1, b, 3n);
const moved = await list.move(inserted.entries[0].edgeId, 1, 4n);
assert.equal(moved.entries[1].target.equals(a), true);
const set = relationshipSet(port);
const unchanged = await set.add(referenceFromWire("obj:a"), 5n);
assert.equal(unchanged.revision, 5n);
});
+372
View File
@@ -0,0 +1,372 @@
import assert from "node:assert/strict";
import http from "node:http";
import test from "node:test";
import { referenceFromWire } from "../dist/references.js";
import { create } from "@bufbuild/protobuf";
import { createClient } from "@connectrpc/connect";
import { connectNodeAdapter, createConnectTransport } from "@connectrpc/connect-node";
import {
createPackageRuntimeRoutes,
createRuntimeContext,
derived,
jsToProtoValue,
liveValue,
protoValueToJs,
} from "../dist/index.js";
import {
CaminoObjectSchema,
CaminoService,
CrdtValueSchema,
StateValueSourceSchema,
ValueSchema,
ValueSourceSchema,
} from "../dist/camino/api_pb.js";
import {
EdgeDependencySchema,
InjectedDependencySchema,
PackageExportRefSchema,
} from "../dist/quixos/refs_pb.js";
import { InvokeCapabilityResponseSchema, OrchestratorRuntime } from "../dist/quixos/orch_pb.js";
import { DerivedDependencySchema, PackageRuntime } from "../dist/quixos/runtime_pb.js";
const listen = async (routes) => {
const server = http.createServer((request, response) => void connectNodeAdapter({ routes })(request, response));
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
const address = server.address();
assert.ok(address && typeof address === "object");
return {
url: `http://127.0.0.1:${address.port}`,
close: async () => {
server.closeAllConnections();
await new Promise((resolve) => server.close(resolve));
},
};
};
test("generic values preserve nested values and object references", () => {
const value = jsToProtoValue({
title: "A task",
target: referenceFromWire("obj:target"),
tags: ["one", "two"],
});
assert.deepEqual(protoValueToJs(value), {
title: "A task",
target: referenceFromWire("obj:target"),
tags: ["one", "two"],
});
});
test("live values preserve writable CRDT source identity through derivation", () => {
const value = create(ValueSchema, {
kind: { case: "stringValue", value: "notes" },
source: create(ValueSourceSchema, {
state: create(StateValueSourceSchema, {
objectId: "obj:task",
slotId: "slot:task:notes",
revision: 7n,
crdtSnapshot: create(CrdtValueSchema, {
type: "quixos.automerge-document.v1",
encoding: "automerge-snapshot-v1",
payload: new Uint8Array([1, 2, 3]),
}),
}),
}),
});
const forwarded = jsToProtoValue(liveValue(value));
assert.equal(forwarded.source?.state?.objectId, "obj:task");
assert.equal(forwarded.source?.state?.slotId, "slot:task:notes");
assert.equal(forwarded.source?.state?.revision, 7n);
assert.deepEqual(forwarded.source?.state?.crdtSnapshot?.payload, new Uint8Array([1, 2, 3]));
});
test("runtime context exposes only explicitly injected ports", async () => {
const writes = [];
const camino = {
readState: async ({ objectId, slotId }) => ({
value: jsToProtoValue(`${objectId}/${slotId}`),
}),
writeState: async (request) => {
writes.push(request);
return {};
},
resolveEdge: async () => ({ edges: [] }),
connectEdge: async () => ({}),
};
const context = createRuntimeContext(camino, {}, {
objectId: "obj:task",
input: {},
dependencies: [
create(InjectedDependencySchema, {
portId: "port:title",
binding: { case: "stateSlotId", value: "slot:task:title" },
}),
create(InjectedDependencySchema, {
portId: "port:children",
binding: {
case: "edge",
value: create(EdgeDependencySchema, {
edgeTypeId: "edge:task:children",
projectionId: "projection:task:children",
}),
},
}),
],
});
assert.equal(await context.state("port:title").get(), "obj:task/slot:task:title");
await context.state("port:title").set("Changed");
assert.equal(writes.length, 1);
assert.equal("camino" in context, false);
assert.equal("orch" in context, false);
assert.throws(() => context.state("port:not-injected"), /Missing slotId dependency/);
assert.throws(() => context.interface("port:title"), /Missing interfaceRevisionId dependency/);
assert.deepEqual(await context.edge("port:children").resolve(), []);
});
test("injected ports preserve an explicitly traversed object through PackageRuntime RPC", async () => {
const reads = [];
const caminoServer = await listen((router) => router.service(CaminoService, {
readState: (request) => {
reads.push(request);
return { value: jsToProtoValue("Project name") };
},
}));
const runtimeServer = await listen(createPackageRuntimeRoutes({
packageRevisionId: "package:test@1",
caminoUrl: caminoServer.url,
exports: {
"export:test:value": (context) => context.state("port:value").get(),
},
}));
const client = createClient(PackageRuntime, createConnectTransport({
baseUrl: runtimeServer.url,
httpVersion: "1.1",
}));
try {
const response = await client.invoke({
export: create(PackageExportRefSchema, {
packageRevisionId: "package:test@1",
exportId: "export:test:value",
}),
objectId: "obj:component",
dependencies: [create(InjectedDependencySchema, {
portId: "port:value",
objectId: "obj:project",
binding: { case: "stateSlotId", value: "slot:project:name" },
})],
});
assert.equal(response.ok, true);
assert.equal(protoValueToJs(response.result), "Project name");
assert.equal(reads.length, 1);
assert.equal(reads[0]?.objectId, "obj:project");
} finally {
await runtimeServer.close();
await caminoServer.close();
}
});
test("interface views invoke a related object and propagate transitive live dependencies", async () => {
const invocations = [];
const sourceValue = create(ValueSchema, {
kind: { case: "stringValue", value: "Project name" },
source: create(ValueSourceSchema, {
state: create(StateValueSourceSchema, {
objectId: "obj:project",
slotId: "slot:project:name",
revision: 4n,
}),
}),
});
const orchServer = await listen((router) => router.service(OrchestratorRuntime, {
invokeCapability: (request) => {
invocations.push(request);
return create(InvokeCapabilityResponseSchema, {
ok: true,
result: sourceValue,
dependencies: [create(DerivedDependencySchema, {
kind: "state",
objectId: "obj:project",
attachmentId: "slot:project:name",
})],
});
},
}));
const runtimeServer = await listen(createPackageRuntimeRoutes({
packageRevisionId: "package:test@1",
orchUrl: orchServer.url,
exports: {
"export:test:value": derived((context) =>
context.interface("port:named").live("operation:named:name:get")),
},
}));
const client = createClient(PackageRuntime, createConnectTransport({
baseUrl: runtimeServer.url,
httpVersion: "1.1",
}));
try {
const response = await client.invoke({
export: create(PackageExportRefSchema, {
packageRevisionId: "package:test@1",
exportId: "export:test:value",
}),
objectId: "obj:component",
dependencies: [create(InjectedDependencySchema, {
portId: "port:named",
objectId: "obj:project",
binding: { case: "interfaceRevisionId", value: "interface:named@1" },
})],
});
assert.equal(response.ok, true);
assert.equal(invocations[0]?.objectId, "obj:project");
assert.equal(invocations[0]?.capability?.interfaceRevisionId, "interface:named@1");
assert.equal(response.dependencies[0]?.objectId, "obj:project");
assert.equal(response.dependencies[0]?.attachmentId, "slot:project:name");
assert.equal(response.result?.source?.state?.revision, 4n);
} finally {
await runtimeServer.close();
await orchServer.close();
}
});
test("derived interface views reread after their transitive subscriptions become live", async () => {
let current = "before subscription";
let invocationCount = 0;
const caminoServer = await listen((router) => router.service(CaminoService, {
watchObject: async function* (request, context) {
// Model a write racing the first nested capability read. Camino makes
// the subscription live before yielding this snapshot.
current = "after subscription";
yield {
objectId: request.objectId,
snapshot: create(CaminoObjectSchema, {
id: request.objectId,
atomId: "atom:project",
workspaceRevisionId: "workspace:test@1",
}),
};
await new Promise((resolve) =>
context.signal.addEventListener("abort", resolve, { once: true }));
},
}));
const orchServer = await listen((router) => router.service(OrchestratorRuntime, {
invokeCapability: () => {
invocationCount += 1;
return create(InvokeCapabilityResponseSchema, {
ok: true,
result: jsToProtoValue(current),
dependencies: [create(DerivedDependencySchema, {
kind: "state",
objectId: "obj:project",
attachmentId: "slot:project:name",
})],
});
},
}));
const runtimeServer = await listen(createPackageRuntimeRoutes({
packageRevisionId: "package:test@1",
caminoUrl: caminoServer.url,
orchUrl: orchServer.url,
exports: {
"export:test:value": derived((context) =>
context.interface("port:named").invoke("operation:named:name:get")),
},
}));
const client = createClient(PackageRuntime, createConnectTransport({
baseUrl: runtimeServer.url,
httpVersion: "1.1",
}));
const controller = new AbortController();
try {
const stream = client.watch({
export: create(PackageExportRefSchema, {
packageRevisionId: "package:test@1",
exportId: "export:test:value",
}),
objectId: "obj:component",
dependencies: [create(InjectedDependencySchema, {
portId: "port:named",
objectId: "obj:project",
binding: { case: "interfaceRevisionId", value: "interface:named@1" },
})],
}, { signal: controller.signal })[Symbol.asyncIterator]();
const initial = await stream.next();
assert.equal(protoValueToJs(initial.value?.value), "after subscription");
assert.equal(invocationCount, 2);
} finally {
controller.abort();
await runtimeServer.close();
await orchServer.close();
await caminoServer.close();
}
});
test("derived watches subscribe before reading and emit only real changes", async () => {
let current = "before";
let subscribed = false;
const changes = [];
const caminoServer = await listen((router) => router.service(CaminoService, {
readState: () => {
assert.equal(subscribed, true, "the dependency stream must be live before the state read");
return { value: jsToProtoValue(current) };
},
watchObject: async function* (request, context) {
subscribed = true;
yield {
objectId: request.objectId,
snapshot: create(CaminoObjectSchema, {
id: request.objectId,
atomId: "atom:test",
workspaceRevisionId: "workspace:test@1",
}),
};
while (!context.signal.aborted) {
const changed = await new Promise((resolve) => {
const finish = () => resolve(true);
changes.push(finish);
context.signal.addEventListener("abort", () => resolve(false), { once: true });
});
if (!changed) return;
yield { objectId: request.objectId };
}
},
}));
const runtimeServer = await listen(createPackageRuntimeRoutes({
packageRevisionId: "package:test@1",
caminoUrl: caminoServer.url,
exports: {
"export:test:value": derived((context) => context.state("port:value").get()),
},
}));
const client = createClient(PackageRuntime, createConnectTransport({
baseUrl: runtimeServer.url,
httpVersion: "1.1",
}));
const controller = new AbortController();
try {
const stream = client.watch({
export: create(PackageExportRefSchema, {
packageRevisionId: "package:test@1",
exportId: "export:test:value",
}),
objectId: "obj:test",
dependencies: [create(InjectedDependencySchema, {
portId: "port:value",
binding: { case: "stateSlotId", value: "slot:test:value" },
})],
}, { signal: controller.signal })[Symbol.asyncIterator]();
const initial = await stream.next();
assert.equal(protoValueToJs(initial.value?.value), "before");
assert.equal(initial.value?.initial, true);
current = "after";
changes.shift()?.();
const updated = await stream.next();
assert.equal(protoValueToJs(updated.value?.value), "after");
assert.equal(updated.value?.initial, false);
} finally {
controller.abort();
await runtimeServer.close();
await caminoServer.close();
}
});
+3 -1
View File
@@ -7,9 +7,11 @@
"esModuleInterop": true, "esModuleInterop": true,
"skipLibCheck": true, "skipLibCheck": true,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"types": ["node"],
"declaration": true, "declaration": true,
"declarationMap": true, "declarationMap": true,
"outDir": "dist" "outDir": "dist",
"rootDir": "src"
}, },
"include": ["src/**/*.ts"] "include": ["src/**/*.ts"]
} }
+6 -19
View File
@@ -7,8 +7,8 @@
let let
yarnBin = fetchurl { yarnBin = fetchurl {
url = "https://repo.yarnpkg.com/4.14.1/packages/yarnpkg-cli/bin/yarn.js"; url = "https://repo.yarnpkg.com/4.18.0/packages/yarnpkg-cli/bin/yarn.js";
hash = "sha512-ZN9EgFWy03uiadfbU1pGm42pP47xFAwl/XqDwAqPuqyyFMoOAlU7kqLFTO94u2fQtIF/qwIAHfDiT6wPrMw7Qg=="; hash = "sha512-/Lhxb+fNDuzhQf/Bi5IZOp35IEwbqDGJwoiDUiP8C75kr0c7qw1emSen2utcryuwfrJ4fMkzjKBA6hJfKh8vfg==";
}; };
cacheFolder = ".yarn/cache"; cacheFolder = ".yarn/cache";
@@ -156,35 +156,22 @@ let
overriddenProject = optionalOverride overrideAttrs project; overriddenProject = optionalOverride overrideAttrs project;
cacheEntries = { cacheEntries = {
"@automerge/automerge@npm:3.3.0" = { filename = "@automerge-automerge-npm-3.3.0-3f6661ca17-74b3a8ef9e.zip"; hash = "sha512-dLOo7548v0B2DomHJ+za1RKOUv0rBTgJRUrnsrhbTsZHw8uipjXNv4MfIxVzGtQl2jenhLeb8TvIbsKKfpKv8g=="; };
"@bufbuild/protobuf@npm:2.12.1" = { filename = "@bufbuild-protobuf-npm-2.12.1-d8afb467b3-2d40cfe4ec.zip"; hash = "sha512-LUDP5Ow7sOPwarLih3HcXcVm6qywVfvok9dWIbBAfQJy1I9ApJCtR97YOe1UFRThr3G7E68CSzrjbvDFbVbdqQ=="; }; "@bufbuild/protobuf@npm:2.12.1" = { filename = "@bufbuild-protobuf-npm-2.12.1-d8afb467b3-2d40cfe4ec.zip"; hash = "sha512-LUDP5Ow7sOPwarLih3HcXcVm6qywVfvok9dWIbBAfQJy1I9ApJCtR97YOe1UFRThr3G7E68CSzrjbvDFbVbdqQ=="; };
"@bufbuild/protoc-gen-es@npm:2.12.1" = { filename = "@bufbuild-protoc-gen-es-npm-2.12.1-6e9387fcb8-0e2805376d.zip"; hash = "sha512-DigFN22Lmj/OD9OdkPZa4dH/vqMSvi2tk2f3xyEqvFHcKleC531iqPhh7De9xtG9MM+sVRDRJCeCzXA/kH4f9Q=="; }; "@bufbuild/protoc-gen-es@npm:2.12.1" = { filename = "@bufbuild-protoc-gen-es-npm-2.12.1-6e9387fcb8-0e2805376d.zip"; hash = "sha512-DigFN22Lmj/OD9OdkPZa4dH/vqMSvi2tk2f3xyEqvFHcKleC531iqPhh7De9xtG9MM+sVRDRJCeCzXA/kH4f9Q=="; };
"@bufbuild/protoplugin@npm:2.12.1" = { filename = "@bufbuild-protoplugin-npm-2.12.1-e1aebb80bf-c7b401ab31.zip"; hash = "sha512-x7QBqzHZSsaCXLm75c/3XQXSjuINRnskt6XUKZuaygZmhuo5t6OoRTuLWgGD+qd4HoP8LliAZhgHudMVX3Hr6Q=="; }; "@bufbuild/protoplugin@npm:2.12.1" = { filename = "@bufbuild-protoplugin-npm-2.12.1-e1aebb80bf-c7b401ab31.zip"; hash = "sha512-x7QBqzHZSsaCXLm75c/3XQXSjuINRnskt6XUKZuaygZmhuo5t6OoRTuLWgGD+qd4HoP8LliAZhgHudMVX3Hr6Q=="; };
"@connectrpc/connect-node@npm:2.1.2" = { filename = "@connectrpc-connect-node-npm-2.1.2-021434d5d5-ba8b0c9384.zip"; hash = "sha512-uosMk4TDgps3eqeoJtwM1Qpgk1J9LscBRgSRKDYzbqlgSitazqQrEEd/i+RWnknd7WbKD8d/X1sCcDXgKeE+qQ=="; }; "@connectrpc/connect-node@npm:2.1.2" = { filename = "@connectrpc-connect-node-npm-2.1.2-021434d5d5-ba8b0c9384.zip"; hash = "sha512-uosMk4TDgps3eqeoJtwM1Qpgk1J9LscBRgSRKDYzbqlgSitazqQrEEd/i+RWnknd7WbKD8d/X1sCcDXgKeE+qQ=="; };
"@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; }; "@connectrpc/connect@npm:2.1.2" = { filename = "@connectrpc-connect-npm-2.1.2-ab34825de3-4e15000890.zip"; hash = "sha512-ThUACJAjt1Lv1E+pQKWuHh+gDhvrxLoM7ScruTWSDYw7hbd0UOZErUQruMqaJ1sMFxNviWuo7/A2F4Ex2wHWFQ=="; };
"@protobufjs/aspromise@npm:1.1.2" = { filename = "@protobufjs-aspromise-npm-1.1.2-71d00b938f-a83343a468.zip"; hash = "sha512-qDNDpGj/W17Gv/Nv14imTIOeSKB/+fT4E1ZPWMr0TQEc1lBO0hR780g1vXp90hBwUq91WWHGsJj9iQK09lANDw=="; };
"@protobufjs/base64@npm:1.1.2" = { filename = "@protobufjs-base64-npm-1.1.2-cd8ca6814a-eec925e681.zip"; hash = "sha512-7skl5oEIGvGQuO4jH5utMQHhiau8GC/yedprUx59vSpW8fMG83qAsb6eAKotJxaQ0I3MXzJvccnu2FRmdcjK9g=="; };
"@protobufjs/codegen@npm:2.0.5" = { filename = "@protobufjs-codegen-npm-2.0.5-bb74ff329d-1b8a2ae56e.zip"; hash = "sha512-G4oq5W7mClbp0gXNS2ByoVA8UGm467kFcQ+XT/AJig0HAGQcE34KjZje3xRCMVahBqlDNpXL9SV0gQ9VAA/cqw=="; };
"@protobufjs/eventemitter@npm:1.1.1" = { filename = "@protobufjs-eventemitter-npm-1.1.1-dbe0dfc812-8e06193d46.zip"; hash = "sha512-jgYZPUYpxefAnU+MLduo/E36c58BSfM6HZAVaNNbt7i1J3pOhFK6873QswL9WZzyVdGTJnqpOgpHR+I80HPErA=="; };
"@protobufjs/fetch@npm:1.1.1" = { filename = "@protobufjs-fetch-npm-1.1.1-b98d5396a8-a497ff5433.zip"; hash = "sha512-pJf/VDOFToV38EJ5g+o5uRE7SagSD5RRUpHXYzJwYdLDAT5g4k6kNtCR2vrgGg9usYZ+OxYWBF2Wox2LPGRu1A=="; };
"@protobufjs/float@npm:1.0.2" = { filename = "@protobufjs-float-npm-1.0.2-5678f64d08-18f2bdede7.zip"; hash = "sha512-GPK97edv/PAXBwivFcnJ22JZt3HmuExRsG3zSpwznbvuwmfRTOC93SCswUKx2YDZg9MUNDmN9/mOsMlKDreQaQ=="; };
"@protobufjs/path@npm:1.1.2" = { filename = "@protobufjs-path-npm-1.1.2-641d08de76-cece0a938e.zip"; hash = "sha512-zs4Kk45/Xf0voD+MFPLxz4sNbhOscyb/TJbqMR7/1ft64LunVPv1BTEq8uOFACUMkOaFBrl8AjYKQ3k9iKDYtA=="; };
"@protobufjs/pool@npm:1.1.0" = { filename = "@protobufjs-pool-npm-1.1.0-47a76f96a1-eda2718b7f.zip"; hash = "sha512-7aJxi38iKsbmrTb3WKku+Q0mUmAmoZ9PF/Zo9F4DBqW9c03vP0j1H4E0rgl4tiYqXFF8CLEVpVF1bRo6rfzwOA=="; };
"@protobufjs/utf8@npm:1.1.2" = { filename = "@protobufjs-utf8-npm-1.1.2-9c7ca5968f-975c6e2c03.zip"; hash = "sha512-l1xuLAMZvVDBdTHRhrU3qIy00yBePKkpfNhCtjHTQdoO4/8WvoZWzSZgdW3HU7KcimoUwK2O1gLB+R3fIuez8w=="; };
"@quixos/camino-datatypes@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-datatypes.git#commit=e061e290709c672d2dc675e5c871733de195211a" = { filename = "@quixos-camino-datatypes-https-faf980267e-4ed01c75c1.zip"; hash = "sha512-TtAcdcG7mReSI/kmbu+U91w39uYetoOiQbq6ex48zaTphDXn1vO1aaw0k8kEDhQgE1LMZrFgHyPzjlUIkyKdrA=="; };
"@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; }; "@types/node@npm:24.13.3" = { filename = "@types-node-npm-24.13.3-b512a0bbeb-a5bc08f49b.zip"; hash = "sha512-pbwI9JuVgdzcqQ4CzXcZejx5mECAdmSULlzVFhpVPU0q6AZPfjKUQQ10jX0Ji1wYSL5/pQwG8pxBk6sWvk5Z6w=="; };
"@types/node@npm:26.1.1" = { filename = "@types-node-npm-26.1.1-7a7a9f32f4-25ac509319.zip"; hash = "sha512-JaxQkxlXNt0HTVAnrbuoVhe8lR1aQVBuvTuQcwSKy3IzYT84ItX5uUR/nAhByR9jh8Rig5FnZ+PvefI5F0UsRg=="; }; "@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=="; }; "@typescript/vfs@npm:1.6.4" = { filename = "@typescript-vfs-npm-1.6.4-78935c9d3e-acb9de42f2.zip"; hash = "sha512-rLneQvI/2j9149eQC6EG7zI6L0588OSpTbtFfibTU8pjuzUZPtGjL8hzPzrlkJlhKykLBr1iIWlIYb65v7YvYg=="; };
"debug@npm:4.4.3" = { filename = "debug-npm-4.4.3-0105c6123a-d79136ec6c.zip"; hash = "sha512-15E27GyD7L79D2pVk9pqnJHsTX3cS1TIg9bnHsmsy19noaXpbQCjKBlrW1yG02XpjYo6cIVqrxa057GYXmf1pg=="; }; "debug@npm:4.4.3" = { filename = "debug-npm-4.4.3-0105c6123a-d79136ec6c.zip"; hash = "sha512-15E27GyD7L79D2pVk9pqnJHsTX3cS1TIg9bnHsmsy19noaXpbQCjKBlrW1yG02XpjYo6cIVqrxa057GYXmf1pg=="; };
"long@npm:5.3.2" = { filename = "long-npm-5.3.2-f80d0f7d39-7130fe1cbc.zip"; hash = "sha512-cTD+HLzi3KBnNLNbcNOAyj9wJxx/iFLJIqfGLIbE418MOSkFZeynEzxiWQjUDhJqxXwCsbGkY2uUV9d+HmC5gQ=="; };
"ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip"; hash = "sha512-2SS1fnMSs7Y60h/Fs9wK9eeNYaH8fPtUV+2vJjJr9ivlMHzIf/toYu8cKzOwIzzbXU8BxMlYzA1mCUi2Wih6SA=="; }; "ms@npm:2.1.3" = { filename = "ms-npm-2.1.3-81ff3cfac1-d924b57e73.zip"; hash = "sha512-2SS1fnMSs7Y60h/Fs9wK9eeNYaH8fPtUV+2vJjJr9ivlMHzIf/toYu8cKzOwIzzbXU8BxMlYzA1mCUi2Wih6SA=="; };
"protobufjs@npm:7.6.5" = { filename = "protobufjs-npm-7.6.5-ff4a872120-863eaca9c6.zip"; hash = "sha512-hj6sqcb0W/z7h4fFRfU+nGaWUH4yjjmBtGQ8EtNd9/KCYCHBDj/TC+80LBOo6dMGVHusnAhJ7jv1D3cKEvAdxQ=="; };
"typescript@npm:5.4.5" = { filename = "typescript-npm-5.4.5-8568a42232-2954022ada.zip"; hash = "sha512-KVQCKto0D9PWqeK45TT2XVfJLV85iaJjdUp4q6VJ9+ZSmswZIZE1YKS4FsRtzn30pNKfnxGj3A1CE7t20EMlHg=="; }; "typescript@npm:5.4.5" = { filename = "typescript-npm-5.4.5-8568a42232-2954022ada.zip"; hash = "sha512-KVQCKto0D9PWqeK45TT2XVfJLV85iaJjdUp4q6VJ9+ZSmswZIZE1YKS4FsRtzn30pNKfnxGj3A1CE7t20EMlHg=="; };
"typescript@npm:5.9.3" = { filename = "typescript-npm-5.9.3-48715be868-6bd7552ce3.zip"; hash = "sha512-a9dVLOOfl+cR21qgSPb5mVtT8cUvfYZnwavcFwDGinajCPV5zTCc5rU2Rt606aG+fIE6k7qvCijM1TajAnDhxQ=="; }; "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%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%3A5.9.3#optional!builtin<compat/typescript>::version=5.9.3&hash=5786d5" = { filename = "typescript-patch-6fda4d02cf-ad09fdf7a7.zip"; hash = "sha512-rQn996dWgU3OZbxgwWV7QNREUTRoWO6iMOEPLpWiidkYO24y5cEelazAzMIUtPNiidytS/GIawrbhNcR0zakMA=="; }; "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=="; }; "undici-types@npm:7.18.2" = { filename = "undici-types-npm-7.18.2-3e6d69d829-85a7918911.zip"; hash = "sha512-haeRiRE6I4lZ16ZHNo5PfFVZw6QE69uPxEiBRc6UJvzYIlKoRKMCeY38Djfm+xeP9IHtA7xMr2NMV1fZ70NSHQ=="; };
"undici-types@npm:8.3.0" = { filename = "undici-types-npm-8.3.0-d34470de3e-c8aa7e2fbe.zip"; hash = "sha512-yKp+L76/zlGWVNr63A7OWb6IjSzK8YD7RJXah157U20kVjRcOEBpx+bz6cmrdDXwdJV9owbxQjQ+7ob/gEiFWg=="; };
}; };
in overriddenProject in overriddenProject
+274 -140
View File
@@ -2,16 +2,9 @@
# Manual changes might be lost - proceed with caution! # Manual changes might be lost - proceed with caution!
__metadata: __metadata:
version: 9 version: 10
cacheKey: 10c0 cacheKey: 10c0
"@automerge/automerge@npm:^3.3.0":
version: 3.3.0
resolution: "@automerge/automerge@npm:3.3.0"
checksum: 10c0/74b3a8ef9e3cbf40760e898727ecdad5128e52fd2b053809454ae7b2b85b4ec647c3cba2a635cdbf831f2315731ad425da37a784b79bf13bc86ec28a7e92aff2
languageName: node
linkType: hard
"@bufbuild/protobuf@npm:2.12.1, @bufbuild/protobuf@npm:^2.12.1": "@bufbuild/protobuf@npm:2.12.1, @bufbuild/protobuf@npm:^2.12.1":
version: 2.12.1 version: 2.12.1
resolution: "@bufbuild/protobuf@npm:2.12.1" resolution: "@bufbuild/protobuf@npm:2.12.1"
@@ -66,107 +59,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@protobufjs/aspromise@npm:^1.1.1, @protobufjs/aspromise@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/aspromise@npm:1.1.2"
checksum: 10c0/a83343a468ff5b5ec6bff36fd788a64c839e48a07ff9f4f813564f58caf44d011cd6504ed2147bf34835bd7a7dd2107052af755961c6b098fd8902b4f6500d0f
languageName: node
linkType: hard
"@protobufjs/base64@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/base64@npm:1.1.2"
checksum: 10c0/eec925e681081af190b8ee231f9bad3101e189abbc182ff279da6b531e7dbd2a56f1f306f37a80b1be9e00aa2d271690d08dcc5f326f71c9eed8546675c8caf6
languageName: node
linkType: hard
"@protobufjs/codegen@npm:^2.0.5":
version: 2.0.5
resolution: "@protobufjs/codegen@npm:2.0.5"
checksum: 10c0/1b8a2ae56ee60a56e9d205cd4b6072a1503c5069b8ebb905710f974ff0098a0d0700641c137e0a8d98dedf14423156a106a9433695cbf52574810f55000fdcab
languageName: node
linkType: hard
"@protobufjs/eventemitter@npm:^1.1.1":
version: 1.1.1
resolution: "@protobufjs/eventemitter@npm:1.1.1"
checksum: 10c0/8e06193d4629c5e7c09d4f8c2ddba8fc4dfa739f0149f33a1d901568d35bb7b8b5277a4e8452baf3bdd0b302fd599cf255d193267aa93a0a4747e23cd073c4ac
languageName: node
linkType: hard
"@protobufjs/fetch@npm:^1.1.1":
version: 1.1.1
resolution: "@protobufjs/fetch@npm:1.1.1"
dependencies:
"@protobufjs/aspromise": "npm:^1.1.1"
checksum: 10c0/a497ff5433854e8577f0427983ea39b9113b49a8120f94515291d763327061d2c3013e60e24ea436d091dafae01a0f6eb1867e3b1616045d96a31d8b3c646ed4
languageName: node
linkType: hard
"@protobufjs/float@npm:^1.0.2":
version: 1.0.2
resolution: "@protobufjs/float@npm:1.0.2"
checksum: 10c0/18f2bdede76ffcf0170708af15c9c9db6259b771e6b84c51b06df34a9c339dbbeec267d14ce0bddd20acc142b1d980d983d31434398df7f98eb0c94a0eb79069
languageName: node
linkType: hard
"@protobufjs/path@npm:^1.1.2":
version: 1.1.2
resolution: "@protobufjs/path@npm:1.1.2"
checksum: 10c0/cece0a938e7f5dfd2fa03f8c14f2f1cf8b0d6e13ac7326ff4c96ea311effd5fb7ae0bba754fbf505312af2e38500250c90e68506b97c02360a43793d88a0d8b4
languageName: node
linkType: hard
"@protobufjs/pool@npm:^1.1.0":
version: 1.1.0
resolution: "@protobufjs/pool@npm:1.1.0"
checksum: 10c0/eda2718b7f222ac6e6ad36f758a92ef90d26526026a19f4f17f668f45e0306a5bd734def3f48f51f8134ae0978b6262a5c517c08b115a551756d1a3aadfcf038
languageName: node
linkType: hard
"@protobufjs/utf8@npm:^1.1.1":
version: 1.1.2
resolution: "@protobufjs/utf8@npm:1.1.2"
checksum: 10c0/975c6e2c0319bd50c17531d186b537a88cb4d3205e3ca9297cd842b631d341da0ee3ff16be8656cd2660756dc753b29c8a6a14c0ad8ed602c1f91ddf22e7b3f3
languageName: node
linkType: hard
"@quixos/camino-datatypes@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-datatypes.git#commit=e061e290709c672d2dc675e5c871733de195211a":
version: 0.1.0
resolution: "@quixos/camino-datatypes@https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-datatypes.git#commit=e061e290709c672d2dc675e5c871733de195211a"
dependencies:
"@automerge/automerge": "npm:^3.3.0"
checksum: 10c0/4ed01c75c1bb99179223f9266eef94f75c37f6e61eb683a241baba7b1e3ccda4e98435e7d6f3b569ac3493c9040e14201352cc66b1601f23f38e550893229dac
languageName: node
linkType: hard
"@quixos/camino-package-runtime@workspace:.": "@quixos/camino-package-runtime@workspace:.":
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "@quixos/camino-package-runtime@workspace:." resolution: "@quixos/camino-package-runtime@workspace:."
dependencies: dependencies:
"@automerge/automerge": "npm:^3.3.0"
"@bufbuild/protobuf": "npm:^2.12.1" "@bufbuild/protobuf": "npm:^2.12.1"
"@bufbuild/protoc-gen-es": "npm:^2.12.1" "@bufbuild/protoc-gen-es": "npm:^2.12.1"
"@connectrpc/connect": "npm:^2.1.2" "@connectrpc/connect": "npm:^2.1.2"
"@connectrpc/connect-node": "npm:^2.1.2" "@connectrpc/connect-node": "npm:^2.1.2"
"@quixos/camino-datatypes": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/camino-datatypes.git#commit=e061e290709c672d2dc675e5c871733de195211a"
"@types/node": "npm:^24" "@types/node": "npm:^24"
protobufjs: "npm:^7.5.4" typescript: "npm:^7.0.2"
typescript: "npm:^5.9.3"
bin:
camino-codegen-ts-runtime: dist/codegen-ts-runtime.js
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@types/node@npm:>=13.7.0":
version: 26.1.1
resolution: "@types/node@npm:26.1.1"
dependencies:
undici-types: "npm:~8.3.0"
checksum: 10c0/25ac5093195736dd074d5027adbba85617bc951d5a41506ebd3b9073048acb7233613f3822d5f9b9447f9c0841c91f6387c46283916767e3ef79f23917452c46
languageName: node
linkType: hard
"@types/node@npm:^24": "@types/node@npm:^24":
version: 24.13.3 version: 24.13.3
resolution: "@types/node@npm:24.13.3" resolution: "@types/node@npm:24.13.3"
@@ -176,6 +81,146 @@ __metadata:
languageName: node languageName: node
linkType: hard 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": "@typescript/vfs@npm:^1.6.2":
version: 1.6.4 version: 1.6.4
resolution: "@typescript/vfs@npm:1.6.4" resolution: "@typescript/vfs@npm:1.6.4"
@@ -199,13 +244,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"long@npm:^5.3.2":
version: 5.3.2
resolution: "long@npm:5.3.2"
checksum: 10c0/7130fe1cbce2dca06734b35b70d380ca3f70271c7f8852c922a7c62c86c4e35f0c39290565eca7133c625908d40e126ac57c02b1b1a4636b9457d77e1e60b981
languageName: node
linkType: hard
"ms@npm:^2.1.3": "ms@npm:^2.1.3":
version: 2.1.3 version: 2.1.3
resolution: "ms@npm:2.1.3" resolution: "ms@npm:2.1.3"
@@ -213,25 +251,6 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"protobufjs@npm:^7.5.4":
version: 7.6.5
resolution: "protobufjs@npm:7.6.5"
dependencies:
"@protobufjs/aspromise": "npm:^1.1.2"
"@protobufjs/base64": "npm:^1.1.2"
"@protobufjs/codegen": "npm:^2.0.5"
"@protobufjs/eventemitter": "npm:^1.1.1"
"@protobufjs/fetch": "npm:^1.1.1"
"@protobufjs/float": "npm:^1.0.2"
"@protobufjs/path": "npm:^1.1.2"
"@protobufjs/pool": "npm:^1.1.0"
"@protobufjs/utf8": "npm:^1.1.1"
"@types/node": "npm:>=13.7.0"
long: "npm:^5.3.2"
checksum: 10c0/863eaca9c6f45bfcfb8787c545f53e9c6696507e328e3981b4643c12d35df7f2826021c10e3fd30bef342c13a8e9d306547bac9c0849ee3bf50f770a12f01dc5
languageName: node
linkType: hard
"typescript@npm:5.4.5": "typescript@npm:5.4.5":
version: 5.4.5 version: 5.4.5
resolution: "typescript@npm:5.4.5" resolution: "typescript@npm:5.4.5"
@@ -242,13 +261,74 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@npm:^5.9.3": "typescript@npm:^7.0.2":
version: 5.9.3 version: 7.0.2
resolution: "typescript@npm:5.9.3" 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: bin:
tsc: bin/tsc tsc: bin/tsc
tsserver: bin/tsserver checksum: 10c0/3dcee51ec8c332492325bcdbf7df48b66668751f127e622ae7d41b6c716eb19184424a45e14f7750f50f340232388b69e6287859155f06a5ce2df76f12cb31cf
checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5
languageName: node languageName: node
linkType: hard linkType: hard
@@ -262,13 +342,74 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"typescript@patch:typescript@npm%3A^5.9.3#optional!builtin<compat/typescript>": "typescript@patch:typescript@npm%3A^7.0.2#optional!builtin<compat/typescript>":
version: 5.9.3 version: 7.0.2
resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin<compat/typescript>::version=5.9.3&hash=5786d5" 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: bin:
tsc: bin/tsc tsc: bin/tsc
tsserver: bin/tsserver checksum: 10c0/6b3cdc369cd829d46e00734ea64233ee84419c2825ad8fe408915adde77abced4b7a2401f7eed517d54a7a4f5d1c1869753cb99018df1c2159c761d9f33483a6
checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430
languageName: node languageName: node
linkType: hard linkType: hard
@@ -278,10 +419,3 @@ __metadata:
checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d
languageName: node languageName: node
linkType: hard linkType: hard
"undici-types@npm:~8.3.0":
version: 8.3.0
resolution: "undici-types@npm:8.3.0"
checksum: 10c0/c8aa7e2fbebfce519654dafadc0ece59be888d2ccaf180fb4495da875e7b536d2456345c384069c7e6f3e9c9ab7435f074957da306f142343eee86ff8048855a
languageName: node
linkType: hard