diff --git a/.quixos-subtree-source.json b/.quixos-subtree-source.json index 1a6577f..b207eac 100644 --- a/.quixos-subtree-source.json +++ b/.quixos-subtree-source.json @@ -1,7 +1,7 @@ { "version": 1, "sourceRepo": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos", - "sourceCommit": "4c88728f144add3457b4273d4b9a04ee53c53be3", + "sourceCommit": "c87835bff85794bc232dbaaddc1eb3b593c2aab8", "sourcePath": "quixos-protocol", "exportName": "quixos-protocol", "mirrorRemote": "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/quixos-protocol.git" diff --git a/proto/camino/api.proto b/proto/camino/api.proto index 21372bc..6f25c8b 100644 --- a/proto/camino/api.proto +++ b/proto/camino/api.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package camino; import "camino/schema.proto"; +import "quixos/refs.proto"; service CaminoService { rpc ExecuteQuery(QueryRequest) returns (QueryResponse); @@ -69,6 +70,27 @@ message Value { CrdtValue crdt_value = 10; } ValueSource source = 11; + // Trusted query coordinator annotation. Travels with values through residual + // row selection, then is removed in favor of final-path hydration metadata. + QueryFieldOrigin query_origin = 12; +} + +message QueryFieldOrigin { + string selection_id = 1; + string atom_id = 2; + string interface_revision_id = 3; + string member_id = 4; + StateValueSource source = 5; +} +message QueryLiveField { + repeated QueryPathPart path = 1; + string selection_id = 2; + string object_id = 3; + quixos.CapabilityRef capability = 4; + string watch_operation_id = 5; + string setter_operation_id = 6; + quixos.FieldEditing editing = 7; + StateValueSource source = 8; } message InstallPersistencePlanRequest { @@ -271,6 +293,7 @@ message QueryResponse { // Native reads share one database snapshot; package enrichment does not. string consistency = 9; // native-snapshot | mixed repeated QueryRelationalCapture relational_captures = 10; + repeated QueryLiveField live_fields = 11; } // Private coordinator input, removed before publishing a result. Memberships diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index 3997ef5..d88091b 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -104,6 +104,8 @@ message QuerySelection { repeated QuerySelection selection = 8; QueryRelationalPlan relational = 9; QueryPredicate predicate = 10; + // Stable checked selection identity; empty for ordinary value projections. + string live_selection_id = 11; } // Resolved IDs, not GraphQL names, determine execution. Response selections // remain separate so aliases and fragments cannot change relational semantics. diff --git a/proto/quixos/orch.proto b/proto/quixos/orch.proto index d086022..4b74f42 100644 --- a/proto/quixos/orch.proto +++ b/proto/quixos/orch.proto @@ -87,20 +87,16 @@ message InvokeCapabilityResponse { FieldEditing field_editing = 7; } -// Resolved from the checked native getter/setter binding, not Value.source. -message FieldEditing { - string getter_operation_id = 1; - string setter_operation_id = 2; - string document_type = 3; - string binding_digest = 4; -} message EditCapabilityFieldRequest { // The public getter; setter must belong to the same value member. quixos.CapabilityRef capability = 1; string object_id = 2; string setter_operation_id = 3; string binding_digest = 4; - camino.CrdtValue update = 5; + oneof edit { + camino.CrdtValue update = 5; + camino.Value replacement = 7; + } string client_mutation_id = 6; } diff --git a/proto/quixos/refs.proto b/proto/quixos/refs.proto index 7b0efc5..af15c91 100644 --- a/proto/quixos/refs.proto +++ b/proto/quixos/refs.proto @@ -9,6 +9,20 @@ message CapabilityRef { ConformanceWitness conformance = 3; } +// Resolved native editing semantics. A source snapshot alone grants no writer. +message FieldEditing { + string getter_operation_id = 1; + string setter_operation_id = 2; + string document_type = 3; + string binding_digest = 4; + enum Mode { + UNSPECIFIED = 0; + REGISTER = 1; + CRDT = 2; + } + Mode mode = 5; +} + message ConformanceWitness { string object_id = 1; string interface_revision_id = 2; diff --git a/src/bindings/react-platform.ts b/src/bindings/react-platform.ts index bc90192..790ccb4 100644 --- a/src/bindings/react-platform.ts +++ b/src/bindings/react-platform.ts @@ -5,6 +5,8 @@ declare module "@quixos/web-studio-react-runtime" { import type * as React from "react"; export function useComponentOverlayContainer(): HTMLElement; export function useComponentStyleRoot(): ShadowRoot; + /** Aggregate transport counters only; contains no object identities or values. */ + export function getFieldTransportMetrics(): Partial>>; export type ObjectRef = string & { readonly $quixosAtom: AtomId; }; @@ -22,8 +24,9 @@ declare module "@quixos/web-studio-react-runtime" { export function useTryConform(object: string | {readonly $quixosRef: string}, contract: ReactInterfaceContract): ConformanceResult; export type QueryValueType = {kind: "builtin" | "scalar"; name: string} | {kind: "record"; fields: Record} | {kind: "optional" | "list"; value: QueryValueType} | {kind: "object-ref"; expectation: {kind: "atom"; atomId: string} | {kind: "interface"; interfaceRevisionId: string}}; export type QueryReference = {readonly $quixosRef: string; readonly queryContract: Contract}; - export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} - export type QueryPartial = T extends QueryReference ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; + export type QueryLiveProjection = {path: readonly string[]; selectionId: string; interfaceRevisionId: string; getOperationId: string; setOperationId?: string; watchOperationId?: string; inputKind: "fields" | "value"; valueType: QueryValueType; conditions: {include: boolean; defaultValue?: boolean; value: {kind: "variable"; name: string} | {kind: "literal"; value: unknown}}[]}; + export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly liveFields?: readonly QueryLiveProjection[]; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} + export type QueryPartial = T extends {readonly $quixosRef: string} | {readonly capability: {readonly getOperationId: string}} ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; export type QueryFieldState = {path: readonly (string | number)[]; status: "pending" | "error"; error?: string}; export type QueryState = {refreshing: boolean; fields: QueryFieldState[]; runId?: string; sequence?: bigint; consistency?: string} & ({status: "loading"; data?: undefined; error?: undefined} | {status: "ready"; data: T; error?: undefined} | {status: "partial"; data: QueryPartial; error?: undefined} | {status: "error"; data?: T | QueryPartial; error: Error}); export function useQuery(descriptor: QueryDescriptor, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState & {refresh(): void}; @@ -55,8 +58,12 @@ declare module "@quixos/web-studio-react-runtime" { options?: {clientMutationId?: string; signal?: AbortSignal}, ) => Promise; export const h: typeof React.createElement; - export function useLiveField(field: ReadableField, options: {write: (value: T) => Promise}): readonly [T, (value: T) => Promise]; - export function useLiveField(field: WritableField): readonly [T, (value: T) => Promise]; - export function useLiveField(field: ReadableField): readonly [T]; + export type LiveFieldState = {refreshing: boolean; stale: boolean; pendingWrites: number; writeError?: Error; refresh(): Promise; discard(): void} & ({status: "loading"; value?: undefined; error?: undefined} | {status: "ready"; value: T; error?: Error} | {status: "error"; value?: undefined; error: Error}); + export type WritableLiveFieldState = LiveFieldState & {set(value: T): Promise; retry(): Promise}; + export function useLiveField(field: ReadableField, options: {id: string; write: (value: T) => Promise}): WritableLiveFieldState; + export function useLiveField(field: WritableField): WritableLiveFieldState; + export function useLiveField(field: ReadableField): LiveFieldState; + export function useSuspenseLiveField(field: WritableField): WritableLiveFieldState & {status: "ready"; value: T}; + export function useSuspenseLiveField(field: ReadableField): LiveFieldState & {status: "ready"; value: T}; } `; diff --git a/src/bindings/react.ts b/src/bindings/react.ts index 589bfc5..ab91177 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -1,5 +1,6 @@ import type { BindingSchema } from "./index.js"; import type { ValueType } from "../capability-model/types.js"; +import { queryPresentation } from "../query/presentation.js"; /** Browser projection of the SAME checked RPC types, not a second props schema. */ export function generateReactBindings( @@ -128,9 +129,25 @@ export function generateReactBindings( return type(value); }; const queries = pkg.checkedQueries ?? []; + const presentedType = ( + value: ValueType, + fields: ReturnType, + path: string[] = [], + ): string => { + const field = fields.find((field) => JSON.stringify(field.path) === JSON.stringify(path)); + if (field) + return `${field.conditions.length ? "(" : ""}${field.setOperationId ? "WritableField" : "ReadableField"}<${type(field.valueType)}>${field.conditions.length ? " | null)" : ""}`; + if (value.kind === "optional") return `(${presentedType(value.value, fields, path)} | null)`; + if (value.kind === "list") return `Array<${presentedType(value.value, fields, [...path, "*"])}>`; + if (value.kind === "record") + return `{${Object.entries(value.fields) + .map(([key, child]) => `${q(key)}: ${presentedType(child, fields, [...path, key])}`) + .join(";")}}`; + return queryType(value); + }; const queryCode = `export type QueryVariables = {${queries.map((query) => `${q(query.declaration.displayName)}: ${queryType(query.variables)}`).join(";")}};\n` + - `export type QueryResults = {${queries.map((query) => `${q(query.declaration.displayName)}: ${queryType(query.output)}`).join(";")}};\n` + + `export type QueryResults = {${queries.map((query) => `${q(query.declaration.displayName)}: ${presentedType(query.output, queryPresentation(query, schema.interfaces))}`).join(";")}};\n` + `export const queries: {${queries.map((query) => `${q(query.declaration.displayName)}: QueryDescriptor`).join(";")}} = ${JSON.stringify( Object.fromEntries( queries.map((query) => [ @@ -141,6 +158,7 @@ export function generateReactBindings( rootInterfaceRevisionId: query.declaration.root, variables: query.variables, output: query.output, + liveFields: queryPresentation(query, schema.interfaces), watch: query.declaration.watch, }, ]), diff --git a/src/gen/camino/api_pb.ts b/src/gen/camino/api_pb.ts index d6af006..3cf4ae5 100644 --- a/src/gen/camino/api_pb.ts +++ b/src/gen/camino/api_pb.ts @@ -6,13 +6,15 @@ import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegen import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; import type { PersistencePlan, QueryRelationalPlan, QuerySelection } from "./schema_pb.js"; import { file_camino_schema } from "./schema_pb.js"; +import type { CapabilityRef, FieldEditing } from "../quixos/refs_pb.js"; +import { file_quixos_refs } from "../quixos/refs_pb.js"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file camino/api.proto. */ export const file_camino_api: GenFile = /*@__PURE__*/ - fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSL5AgoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZUIGCgRraW5kIkYKHUluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0EiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIkcKHkluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiIbChlHZXRQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0IkMKGkdldFBlcnNpc3RlbmNlUGxhblJlc3BvbnNlEiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIrABChNDcmVhdGVPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSRAoNaW5pdGlhbF9zdGF0ZRgCIAMoCzItLmNhbWluby5DcmVhdGVPYmplY3RSZXF1ZXN0LkluaXRpYWxTdGF0ZUVudHJ5GkIKEUluaXRpYWxTdGF0ZUVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPAoUQ3JlYXRlT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChBHZXRPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSI5ChFHZXRPYmplY3RSZXNwb25zZRIkCgZvYmplY3QYASABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IiUKEkxpc3RPYmplY3RzUmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJIjwKE0xpc3RPYmplY3RzUmVzcG9uc2USJQoHb2JqZWN0cxgBIAMoCzIULmNhbWluby5DYW1pbm9PYmplY3QiNgoQUmVhZFN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCSIxChFSZWFkU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZSJxChFXcml0ZVN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCRIcCgV2YWx1ZRgDIAEoCzINLmNhbWluby5WYWx1ZRIaChJjbGllbnRfbXV0YXRpb25faWQYBCABKAkiWAoSV3JpdGVTdGF0ZVJlc3BvbnNlEhwKBXZhbHVlGAEgASgLMg0uY2FtaW5vLlZhbHVlEiQKBm9iamVjdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiwAEKEkNvbm5lY3RFZGdlUmVxdWVzdBIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCRIRCglvYmplY3RfaWQYAyABKAkSGAoQdGFyZ2V0X29iamVjdF9pZBgEIAEoCRIUCgdvcmRpbmFsGAUgASgFSACIAQESGwoOdGFyZ2V0X29yZGluYWwYBiABKAVIAYgBAUIKCghfb3JkaW5hbEIRCg9fdGFyZ2V0X29yZGluYWwiNwoTQ29ubmVjdEVkZ2VSZXNwb25zZRIgCgRlZGdlGAEgASgLMhIuY2FtaW5vLkNhbWlub0VkZ2UiVAoSUmVzb2x2ZUVkZ2VSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRIUCgxlZGdlX3R5cGVfaWQYAiABKAkSFQoNcHJvamVjdGlvbl9pZBgDIAEoCSI4ChNSZXNvbHZlRWRnZVJlc3BvbnNlEiEKBWVkZ2VzGAEgAygLMhIuY2FtaW5vLkNhbWlub0VkZ2UiKAoVRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Eg8KB2VkZ2VfaWQYASABKAkiKQoWRGlzY29ubmVjdEVkZ2VSZXNwb25zZRIPCgdlZGdlX2lkGAEgASgJIlgKD0NvbGxlY3Rpb25FbnRyeRIPCgdlZGdlX2lkGAEgASgJEhgKEHRhcmdldF9vYmplY3RfaWQYAiABKAkSGgoDa2V5GAMgASgLMg0uY2FtaW5vLlZhbHVlIlQKFlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USEAoIcmV2aXNpb24YASABKAQSKAoHZW50cmllcxgCIAMoCzIXLmNhbWluby5Db2xsZWN0aW9uRW50cnkinwEKGFJlcGxhY2VDb2xsZWN0aW9uUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhUKDXByb2plY3Rpb25faWQYAyABKAkSGQoRZXhwZWN0ZWRfcmV2aXNpb24YBCABKAQSKAoHZW50cmllcxgFIAMoCzIXLmNhbWluby5Db2xsZWN0aW9uRW50cnkiIwoOTGlzdE9wc1JlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJIjAKD0xpc3RPcHNSZXNwb25zZRIdCgNvcHMYASADKAsyEC5jYW1pbm8uQ2FtaW5vT3AibgoSV2F0Y2hPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRITCgthZnRlcl9vcF9pZBgCIAEoCRIYChBpbmNsdWRlX3NuYXBzaG90GAMgASgIEhYKDmF0dGFjaG1lbnRfaWRzGAQgAygJImsKEFdhdGNoT2JqZWN0RXZlbnQSEQoJb2JqZWN0X2lkGAEgASgJEiYKCHNuYXBzaG90GAIgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBIcCgJvcBgDIAEoCzIQLmNhbWluby5DYW1pbm9PcCLZAgoMQ2FtaW5vT2JqZWN0EgoKAmlkGAEgASgJEg8KB2F0b21faWQYAiABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAMgASgJEhIKCmNyZWF0ZWRfYXQYBCABKAkSEgoKdXBkYXRlZF9hdBgFIAEoCRIuCgVzdGF0ZRgGIAMoCzIfLmNhbWluby5DYW1pbm9PYmplY3QuU3RhdGVFbnRyeRJBCg9zdGF0ZV9yZXZpc2lvbnMYByADKAsyKC5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlUmV2aXNpb25zRW50cnkaOwoKU3RhdGVFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBGjUKE1N0YXRlUmV2aXNpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgEOgI4ASK/AgoKQ2FtaW5vRWRnZRIKCgJpZBgBIAEoCRIUCgxlZGdlX3R5cGVfaWQYAiABKAkSFwoPZmlyc3Rfb2JqZWN0X2lkGAMgASgJEhgKEHNlY29uZF9vYmplY3RfaWQYBCABKAkSGwoTZmlyc3RfcHJvamVjdGlvbl9pZBgFIAEoCRIcChRzZWNvbmRfcHJvamVjdGlvbl9pZBgGIAEoCRIaCg1maXJzdF9vcmRpbmFsGAcgASgFSACIAQESGwoOc2Vjb25kX29yZGluYWwYCCABKAVIAYgBARISCgpjcmVhdGVkX2F0GAkgASgJEhYKDmZpcnN0X2tleV9qc29uGAogASgJEhcKD3NlY29uZF9rZXlfanNvbhgLIAEoCUIQCg5fZmlyc3Rfb3JkaW5hbEIRCg9fc2Vjb25kX29yZGluYWwimQEKCENhbWlub09wEgoKAmlkGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIPCgdvcF9raW5kGAMgASgJEh4KB3BheWxvYWQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFYWN0b3IYBSABKAkSEgoKY3JlYXRlZF9hdBgGIAEoCRIaChJjbGllbnRfbXV0YXRpb25faWQYByABKAki0AEKDFF1ZXJ5UmVxdWVzdBIQCghxdWVyeV9pZBgBIAEoCRIRCglvYmplY3RfaWQYAiABKAkSNgoJdmFyaWFibGVzGAMgAygLMiMuY2FtaW5vLlF1ZXJ5UmVxdWVzdC5WYXJpYWJsZXNFbnRyeRIiChpleHBlY3RlZF9kZWZpbml0aW9uX2RpZ2VzdBgEIAEoCRo/Cg5WYXJpYWJsZXNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIjkKDVF1ZXJ5UGF0aFBhcnQSDwoFZmllbGQYASABKAlIABIPCgVpbmRleBgCIAEoDUgAQgYKBHBhcnQi3QIKEVF1ZXJ5UGVuZGluZ0ZpZWxkEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBIRCglvYmplY3RfaWQYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIUCgxvcGVyYXRpb25faWQYBSABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAYgASgJEhwKD3Jlc2lkdWFsX3dpbmRvdxgHIAEoDUgAiAEBEhQKDHJlc2lkdWFsX3JvdxgIIAEoDRIWCg5yZXNpZHVhbF9maWVsZBgJIAEoCRIfChJyZWxhdGlvbmFsX2NhcHR1cmUYCiABKA1IAYgBARIXCg9jYXB0dXJlZF9vYmplY3QYCyABKA1CEgoQX3Jlc2lkdWFsX3dpbmRvd0IVChNfcmVsYXRpb25hbF9jYXB0dXJlIvYBCgpRdWVyeVN0YXRzEhEKCXNxbF9jb3VudBgBIAEoDRIOCgZzcWxfbXMYAiABKAESEQoJcnBjX2NvdW50GAMgASgNEg4KBnJwY19tcxgEIAEoARIUCgxyZXN1bHRfYnl0ZXMYBSABKA0SFgoOcHJlcGFyYXRpb25fbXMYBiABKAESEAoIdG90YWxfbXMYByABKAESGQoRcmVsYXRpb25hbF9zdGFnZXMYCCABKA0SGwoTY2FwdHVyZWRfY2FuZGlkYXRlcxgJIAEoDRIVCg1yZWxhdGlvbmFsX21zGAogASgBEhMKC3Jlc2lkdWFsX21zGAsgASgBIvkCCg1RdWVyeVJlc3BvbnNlEhwKBXZhbHVlGAEgASgLMg0uY2FtaW5vLlZhbHVlEhQKDGRhdGFfdmVyc2lvbhgCIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgDIAEoCRIqCgdwZW5kaW5nGAQgAygLMhkuY2FtaW5vLlF1ZXJ5UGVuZGluZ0ZpZWxkEiEKBXN0YXRzGAUgASgLMhIuY2FtaW5vLlF1ZXJ5U3RhdHMSGQoRcHJlcGFyYXRpb25fdG9rZW4YBiABKAkSKQoGZXJyb3JzGAcgAygLMhkuY2FtaW5vLlF1ZXJ5RmllbGRGYWlsdXJlEjUKEHJlc2lkdWFsX3dpbmRvd3MYCCADKAsyGy5jYW1pbm8uUXVlcnlSZXNpZHVhbFdpbmRvdxITCgtjb25zaXN0ZW5jeRgJIAEoCRI7ChNyZWxhdGlvbmFsX2NhcHR1cmVzGAogAygLMh4uY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbENhcHR1cmUiWgoTUXVlcnlDYXB0dXJlZE1lbWJlchIRCglvYmplY3RfaWQYASABKAkSEAoIZW50cnlfaWQYAiABKAkSHgoHbWFwX2tleRgDIAEoCzINLmNhbWluby5WYWx1ZSJEChRRdWVyeUNhcHR1cmVkTWVtYmVycxIsCgdlbnRyaWVzGAEgAygLMhsuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRNZW1iZXIirwMKE1F1ZXJ5Q2FwdHVyZWRPYmplY3QSEQoJb2JqZWN0X2lkGAEgASgJEjcKBmZpZWxkcxgCIAMoCzInLmNhbWluby5RdWVyeUNhcHR1cmVkT2JqZWN0LkZpZWxkc0VudHJ5EkAKC2ZpZWxkX3R5cGVzGAMgAygLMisuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QuRmllbGRUeXBlc0VudHJ5EkUKDXJlbGF0aW9uc2hpcHMYBCADKAsyLi5jYW1pbm8uUXVlcnlDYXB0dXJlZE9iamVjdC5SZWxhdGlvbnNoaXBzRW50cnkaPAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ARoxCg9GaWVsZFR5cGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARpSChJSZWxhdGlvbnNoaXBzRW50cnkSCwoDa2V5GAEgASgJEisKBXZhbHVlGAIgASgLMhwuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRNZW1iZXJzOgI4ASK5AgoWUXVlcnlSZWxhdGlvbmFsQ2FwdHVyZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSKQoEcGxhbhgCIAEoCzIbLmNhbWluby5RdWVyeVJlbGF0aW9uYWxQbGFuEhYKDnJvb3Rfb2JqZWN0X2lkGAMgASgJEiwKB29iamVjdHMYBCADKAsyGy5jYW1pbm8uUXVlcnlDYXB0dXJlZE9iamVjdBIWCg52YXJpYWJsZXNfanNvbhgFIAEoCRIRCglyb3dfbGltaXQYBiABKA0SFwoPY2FuZGlkYXRlX2xpbWl0GAcgASgNEhwKD3Jlc2lkdWFsX3dpbmRvdxgIIAEoDUgAiAEBEhMKC3Jlc3VsdF9wYXRoGAkgAygJQhIKEF9yZXNpZHVhbF93aW5kb3cimAEKEFF1ZXJ5UmVzaWR1YWxSb3cSEAoIZW50cnlfaWQYASABKAkSNAoGZmllbGRzGAIgAygLMiQuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxSb3cuRmllbGRzRW50cnkaPAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASI3ChJRdWVyeVJlc2lkdWFsT3JkZXISDQoFZmllbGQYASABKAkSEgoKZGVzY2VuZGluZxgCIAEoCCKWAwoTUXVlcnlSZXNpZHVhbFdpbmRvdxIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSJgoEcm93cxgCIAMoCzIYLmNhbWluby5RdWVyeVJlc2lkdWFsUm93EhYKDnByZWRpY2F0ZV9qc29uGAMgASgJEikKBW9yZGVyGAQgAygLMhouY2FtaW5vLlF1ZXJ5UmVzaWR1YWxPcmRlchINCgVsaW1pdBgFIAEoDRITCgtib3VuZGVkX2FsbBgGIAEoCBIpCglzZWxlY3Rpb24YByADKAsyFi5jYW1pbm8uUXVlcnlTZWxlY3Rpb24SQAoLZmllbGRfdHlwZXMYCCADKAsyKy5jYW1pbm8uUXVlcnlSZXNpZHVhbFdpbmRvdy5GaWVsZFR5cGVzRW50cnkSEgoKcmVsYXRpb25hbBgJIAEoCBIXCg9tYXRjaGVkX2VudHJpZXMYCiADKAkaMQoPRmllbGRUeXBlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiRwoRUXVlcnlGaWVsZEZhaWx1cmUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0Eg0KBWVycm9yGAIgASgJIlAKE1F1ZXJ5Q2hhbmdlc1JlcXVlc3QSEAoIcXVlcnlfaWQYASABKAkSEQoJb2JqZWN0X2lkGAIgASgJEhQKDGRhdGFfdmVyc2lvbhgDIAEoCSInChRRdWVyeUNoYW5nZXNSZXNwb25zZRIPCgdjaGFuZ2VkGAEgASgIMsIJCg1DYW1pbm9TZXJ2aWNlEjsKDEV4ZWN1dGVRdWVyeRIULmNhbWluby5RdWVyeVJlcXVlc3QaFS5jYW1pbm8uUXVlcnlSZXNwb25zZRJJCgxRdWVyeUNoYW5nZXMSGy5jYW1pbm8uUXVlcnlDaGFuZ2VzUmVxdWVzdBocLmNhbWluby5RdWVyeUNoYW5nZXNSZXNwb25zZRJnChZJbnN0YWxsUGVyc2lzdGVuY2VQbGFuEiUuY2FtaW5vLkluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0GiYuY2FtaW5vLkluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRJbChJHZXRQZXJzaXN0ZW5jZVBsYW4SIS5jYW1pbm8uR2V0UGVyc2lzdGVuY2VQbGFuUmVxdWVzdBoiLmNhbWluby5HZXRQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRJJCgxDcmVhdGVPYmplY3QSGy5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVxdWVzdBocLmNhbWluby5DcmVhdGVPYmplY3RSZXNwb25zZRJACglHZXRPYmplY3QSGC5jYW1pbm8uR2V0T2JqZWN0UmVxdWVzdBoZLmNhbWluby5HZXRPYmplY3RSZXNwb25zZRJGCgtMaXN0T2JqZWN0cxIaLmNhbWluby5MaXN0T2JqZWN0c1JlcXVlc3QaGy5jYW1pbm8uTGlzdE9iamVjdHNSZXNwb25zZRJACglSZWFkU3RhdGUSGC5jYW1pbm8uUmVhZFN0YXRlUmVxdWVzdBoZLmNhbWluby5SZWFkU3RhdGVSZXNwb25zZRJDCgpXcml0ZVN0YXRlEhkuY2FtaW5vLldyaXRlU3RhdGVSZXF1ZXN0GhouY2FtaW5vLldyaXRlU3RhdGVSZXNwb25zZRJGCgtDb25uZWN0RWRnZRIaLmNhbWluby5Db25uZWN0RWRnZVJlcXVlc3QaGy5jYW1pbm8uQ29ubmVjdEVkZ2VSZXNwb25zZRJGCgtSZXNvbHZlRWRnZRIaLmNhbWluby5SZXNvbHZlRWRnZVJlcXVlc3QaGy5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXNwb25zZRJPCg5EaXNjb25uZWN0RWRnZRIdLmNhbWluby5EaXNjb25uZWN0RWRnZVJlcXVlc3QaHi5jYW1pbm8uRGlzY29ubmVjdEVkZ2VSZXNwb25zZRJMCg5SZWFkQ29sbGVjdGlvbhIaLmNhbWluby5SZXNvbHZlRWRnZVJlcXVlc3QaHi5jYW1pbm8uUmVhZENvbGxlY3Rpb25SZXNwb25zZRJVChFSZXBsYWNlQ29sbGVjdGlvbhIgLmNhbWluby5SZXBsYWNlQ29sbGVjdGlvblJlcXVlc3QaHi5jYW1pbm8uUmVhZENvbGxlY3Rpb25SZXNwb25zZRI6CgdMaXN0T3BzEhYuY2FtaW5vLkxpc3RPcHNSZXF1ZXN0GhcuY2FtaW5vLkxpc3RPcHNSZXNwb25zZRJFCgtXYXRjaE9iamVjdBIaLmNhbWluby5XYXRjaE9iamVjdFJlcXVlc3QaGC5jYW1pbm8uV2F0Y2hPYmplY3RFdmVudDABYgZwcm90bzM", [file_camino_schema]); + fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSKpAwoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZRIuCgxxdWVyeV9vcmlnaW4YDCABKAsyGC5jYW1pbm8uUXVlcnlGaWVsZE9yaWdpbkIGCgRraW5kIpUBChBRdWVyeUZpZWxkT3JpZ2luEhQKDHNlbGVjdGlvbl9pZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSKAoGc291cmNlGAUgASgLMhguY2FtaW5vLlN0YXRlVmFsdWVTb3VyY2UikwIKDlF1ZXJ5TGl2ZUZpZWxkEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBIUCgxzZWxlY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEikKCmNhcGFiaWxpdHkYBCABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIaChJ3YXRjaF9vcGVyYXRpb25faWQYBSABKAkSGwoTc2V0dGVyX29wZXJhdGlvbl9pZBgGIAEoCRIlCgdlZGl0aW5nGAcgASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZxIoCgZzb3VyY2UYCCABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSJGCh1JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiJHCh5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USJQoEcGxhbhgBIAEoCzIXLmNhbWluby5QZXJzaXN0ZW5jZVBsYW4iGwoZR2V0UGVyc2lzdGVuY2VQbGFuUmVxdWVzdCJDChpHZXRQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiKwAQoTQ3JlYXRlT2JqZWN0UmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJEkQKDWluaXRpYWxfc3RhdGUYAiADKAsyLS5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVxdWVzdC5Jbml0aWFsU3RhdGVFbnRyeRpCChFJbml0aWFsU3RhdGVFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIjwKFENyZWF0ZU9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiJQoQR2V0T2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkiOQoRR2V0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChJMaXN0T2JqZWN0c1JlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCSI8ChNMaXN0T2JqZWN0c1Jlc3BvbnNlEiUKB29iamVjdHMYASADKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IjYKEFJlYWRTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkiMQoRUmVhZFN0YXRlUmVzcG9uc2USHAoFdmFsdWUYASABKAsyDS5jYW1pbm8uVmFsdWUicQoRV3JpdGVTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSHAoFdmFsdWUYAyABKAsyDS5jYW1pbm8uVmFsdWUSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJIlgKEldyaXRlU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIkCgZvYmplY3QYAiABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IsABChJDb25uZWN0RWRnZVJlcXVlc3QSFAoMZWRnZV90eXBlX2lkGAEgASgJEhUKDXByb2plY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEhgKEHRhcmdldF9vYmplY3RfaWQYBCABKAkSFAoHb3JkaW5hbBgFIAEoBUgAiAEBEhsKDnRhcmdldF9vcmRpbmFsGAYgASgFSAGIAQFCCgoIX29yZGluYWxCEQoPX3RhcmdldF9vcmRpbmFsIjcKE0Nvbm5lY3RFZGdlUmVzcG9uc2USIAoEZWRnZRgBIAEoCzISLmNhbWluby5DYW1pbm9FZGdlIlQKElJlc29sdmVFZGdlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhUKDXByb2plY3Rpb25faWQYAyABKAkiOAoTUmVzb2x2ZUVkZ2VSZXNwb25zZRIhCgVlZGdlcxgBIAMoCzISLmNhbWluby5DYW1pbm9FZGdlIigKFURpc2Nvbm5lY3RFZGdlUmVxdWVzdBIPCgdlZGdlX2lkGAEgASgJIikKFkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USDwoHZWRnZV9pZBgBIAEoCSJYCg9Db2xsZWN0aW9uRW50cnkSDwoHZWRnZV9pZBgBIAEoCRIYChB0YXJnZXRfb2JqZWN0X2lkGAIgASgJEhoKA2tleRgDIAEoCzINLmNhbWluby5WYWx1ZSJUChZSZWFkQ29sbGVjdGlvblJlc3BvbnNlEhAKCHJldmlzaW9uGAEgASgEEigKB2VudHJpZXMYAiADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5Ip8BChhSZXBsYWNlQ29sbGVjdGlvblJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEhQKDGVkZ2VfdHlwZV9pZBgCIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAMgASgJEhkKEWV4cGVjdGVkX3JldmlzaW9uGAQgASgEEigKB2VudHJpZXMYBSADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5IiMKDkxpc3RPcHNSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSIwCg9MaXN0T3BzUmVzcG9uc2USHQoDb3BzGAEgAygLMhAuY2FtaW5vLkNhbWlub09wIm4KEldhdGNoT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSEwoLYWZ0ZXJfb3BfaWQYAiABKAkSGAoQaW5jbHVkZV9zbmFwc2hvdBgDIAEoCBIWCg5hdHRhY2htZW50X2lkcxgEIAMoCSJrChBXYXRjaE9iamVjdEV2ZW50EhEKCW9iamVjdF9pZBgBIAEoCRImCghzbmFwc2hvdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSHAoCb3AYAyABKAsyEC5jYW1pbm8uQ2FtaW5vT3Ai2QIKDENhbWlub09iamVjdBIKCgJpZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgDIAEoCRISCgpjcmVhdGVkX2F0GAQgASgJEhIKCnVwZGF0ZWRfYXQYBSABKAkSLgoFc3RhdGUYBiADKAsyHy5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlRW50cnkSQQoPc3RhdGVfcmV2aXNpb25zGAcgAygLMiguY2FtaW5vLkNhbWlub09iamVjdC5TdGF0ZVJldmlzaW9uc0VudHJ5GjsKClN0YXRlRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ARo1ChNTdGF0ZVJldmlzaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEivwIKCkNhbWlub0VkZ2USCgoCaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhcKD2ZpcnN0X29iamVjdF9pZBgDIAEoCRIYChBzZWNvbmRfb2JqZWN0X2lkGAQgASgJEhsKE2ZpcnN0X3Byb2plY3Rpb25faWQYBSABKAkSHAoUc2Vjb25kX3Byb2plY3Rpb25faWQYBiABKAkSGgoNZmlyc3Rfb3JkaW5hbBgHIAEoBUgAiAEBEhsKDnNlY29uZF9vcmRpbmFsGAggASgFSAGIAQESEgoKY3JlYXRlZF9hdBgJIAEoCRIWCg5maXJzdF9rZXlfanNvbhgKIAEoCRIXCg9zZWNvbmRfa2V5X2pzb24YCyABKAlCEAoOX2ZpcnN0X29yZGluYWxCEQoPX3NlY29uZF9vcmRpbmFsIpkBCghDYW1pbm9PcBIKCgJpZBgBIAEoCRIRCglvYmplY3RfaWQYAiABKAkSDwoHb3Bfa2luZBgDIAEoCRIeCgdwYXlsb2FkGAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWFjdG9yGAUgASgJEhIKCmNyZWF0ZWRfYXQYBiABKAkSGgoSY2xpZW50X211dGF0aW9uX2lkGAcgASgJItABCgxRdWVyeVJlcXVlc3QSEAoIcXVlcnlfaWQYASABKAkSEQoJb2JqZWN0X2lkGAIgASgJEjYKCXZhcmlhYmxlcxgDIAMoCzIjLmNhbWluby5RdWVyeVJlcXVlc3QuVmFyaWFibGVzRW50cnkSIgoaZXhwZWN0ZWRfZGVmaW5pdGlvbl9kaWdlc3QYBCABKAkaPwoOVmFyaWFibGVzRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASI5Cg1RdWVyeVBhdGhQYXJ0Eg8KBWZpZWxkGAEgASgJSAASDwoFaW5kZXgYAiABKA1IAEIGCgRwYXJ0It0CChFRdWVyeVBlbmRpbmdGaWVsZBIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSEQoJb2JqZWN0X2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSFAoMb3BlcmF0aW9uX2lkGAUgASgJEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCRIcCg9yZXNpZHVhbF93aW5kb3cYByABKA1IAIgBARIUCgxyZXNpZHVhbF9yb3cYCCABKA0SFgoOcmVzaWR1YWxfZmllbGQYCSABKAkSHwoScmVsYXRpb25hbF9jYXB0dXJlGAogASgNSAGIAQESFwoPY2FwdHVyZWRfb2JqZWN0GAsgASgNQhIKEF9yZXNpZHVhbF93aW5kb3dCFQoTX3JlbGF0aW9uYWxfY2FwdHVyZSL2AQoKUXVlcnlTdGF0cxIRCglzcWxfY291bnQYASABKA0SDgoGc3FsX21zGAIgASgBEhEKCXJwY19jb3VudBgDIAEoDRIOCgZycGNfbXMYBCABKAESFAoMcmVzdWx0X2J5dGVzGAUgASgNEhYKDnByZXBhcmF0aW9uX21zGAYgASgBEhAKCHRvdGFsX21zGAcgASgBEhkKEXJlbGF0aW9uYWxfc3RhZ2VzGAggASgNEhsKE2NhcHR1cmVkX2NhbmRpZGF0ZXMYCSABKA0SFQoNcmVsYXRpb25hbF9tcxgKIAEoARITCgtyZXNpZHVhbF9tcxgLIAEoASKmAwoNUXVlcnlSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIUCgxkYXRhX3ZlcnNpb24YAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSKgoHcGVuZGluZxgEIAMoCzIZLmNhbWluby5RdWVyeVBlbmRpbmdGaWVsZBIhCgVzdGF0cxgFIAEoCzISLmNhbWluby5RdWVyeVN0YXRzEhkKEXByZXBhcmF0aW9uX3Rva2VuGAYgASgJEikKBmVycm9ycxgHIAMoCzIZLmNhbWluby5RdWVyeUZpZWxkRmFpbHVyZRI1ChByZXNpZHVhbF93aW5kb3dzGAggAygLMhsuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cSEwoLY29uc2lzdGVuY3kYCSABKAkSOwoTcmVsYXRpb25hbF9jYXB0dXJlcxgKIAMoCzIeLmNhbWluby5RdWVyeVJlbGF0aW9uYWxDYXB0dXJlEisKC2xpdmVfZmllbGRzGAsgAygLMhYuY2FtaW5vLlF1ZXJ5TGl2ZUZpZWxkIloKE1F1ZXJ5Q2FwdHVyZWRNZW1iZXISEQoJb2JqZWN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEh4KB21hcF9rZXkYAyABKAsyDS5jYW1pbm8uVmFsdWUiRAoUUXVlcnlDYXB0dXJlZE1lbWJlcnMSLAoHZW50cmllcxgBIAMoCzIbLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyIq8DChNRdWVyeUNhcHR1cmVkT2JqZWN0EhEKCW9iamVjdF9pZBgBIAEoCRI3CgZmaWVsZHMYAiADKAsyJy5jYW1pbm8uUXVlcnlDYXB0dXJlZE9iamVjdC5GaWVsZHNFbnRyeRJACgtmaWVsZF90eXBlcxgDIAMoCzIrLmNhbWluby5RdWVyeUNhcHR1cmVkT2JqZWN0LkZpZWxkVHlwZXNFbnRyeRJFCg1yZWxhdGlvbnNoaXBzGAQgAygLMi4uY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QuUmVsYXRpb25zaGlwc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEaMQoPRmllbGRUeXBlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUgoSUmVsYXRpb25zaGlwc0VudHJ5EgsKA2tleRgBIAEoCRIrCgV2YWx1ZRgCIAEoCzIcLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyczoCOAEiuQIKFlF1ZXJ5UmVsYXRpb25hbENhcHR1cmUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EikKBHBsYW4YAiABKAsyGy5jYW1pbm8uUXVlcnlSZWxhdGlvbmFsUGxhbhIWCg5yb290X29iamVjdF9pZBgDIAEoCRIsCgdvYmplY3RzGAQgAygLMhsuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QSFgoOdmFyaWFibGVzX2pzb24YBSABKAkSEQoJcm93X2xpbWl0GAYgASgNEhcKD2NhbmRpZGF0ZV9saW1pdBgHIAEoDRIcCg9yZXNpZHVhbF93aW5kb3cYCCABKA1IAIgBARITCgtyZXN1bHRfcGF0aBgJIAMoCUISChBfcmVzaWR1YWxfd2luZG93IpgBChBRdWVyeVJlc2lkdWFsUm93EhAKCGVudHJ5X2lkGAEgASgJEjQKBmZpZWxkcxgCIAMoCzIkLmNhbWluby5RdWVyeVJlc2lkdWFsUm93LkZpZWxkc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiNwoSUXVlcnlSZXNpZHVhbE9yZGVyEg0KBWZpZWxkGAEgASgJEhIKCmRlc2NlbmRpbmcYAiABKAgilgMKE1F1ZXJ5UmVzaWR1YWxXaW5kb3cSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EiYKBHJvd3MYAiADKAsyGC5jYW1pbm8uUXVlcnlSZXNpZHVhbFJvdxIWCg5wcmVkaWNhdGVfanNvbhgDIAEoCRIpCgVvcmRlchgEIAMoCzIaLmNhbWluby5RdWVyeVJlc2lkdWFsT3JkZXISDQoFbGltaXQYBSABKA0SEwoLYm91bmRlZF9hbGwYBiABKAgSKQoJc2VsZWN0aW9uGAcgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEkAKC2ZpZWxkX3R5cGVzGAggAygLMisuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cuRmllbGRUeXBlc0VudHJ5EhIKCnJlbGF0aW9uYWwYCSABKAgSFwoPbWF0Y2hlZF9lbnRyaWVzGAogAygJGjEKD0ZpZWxkVHlwZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkcKEVF1ZXJ5RmllbGRGYWlsdXJlEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBINCgVlcnJvchgCIAEoCSJQChNRdWVyeUNoYW5nZXNSZXF1ZXN0EhAKCHF1ZXJ5X2lkGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIUCgxkYXRhX3ZlcnNpb24YAyABKAkiJwoUUXVlcnlDaGFuZ2VzUmVzcG9uc2USDwoHY2hhbmdlZBgBIAEoCDLCCQoNQ2FtaW5vU2VydmljZRI7CgxFeGVjdXRlUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhUuY2FtaW5vLlF1ZXJ5UmVzcG9uc2USSQoMUXVlcnlDaGFuZ2VzEhsuY2FtaW5vLlF1ZXJ5Q2hhbmdlc1JlcXVlc3QaHC5jYW1pbm8uUXVlcnlDaGFuZ2VzUmVzcG9uc2USZwoWSW5zdGFsbFBlcnNpc3RlbmNlUGxhbhIlLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBomLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USWwoSR2V0UGVyc2lzdGVuY2VQbGFuEiEuY2FtaW5vLkdldFBlcnNpc3RlbmNlUGxhblJlcXVlc3QaIi5jYW1pbm8uR2V0UGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USSQoMQ3JlYXRlT2JqZWN0EhsuY2FtaW5vLkNyZWF0ZU9iamVjdFJlcXVlc3QaHC5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVzcG9uc2USQAoJR2V0T2JqZWN0EhguY2FtaW5vLkdldE9iamVjdFJlcXVlc3QaGS5jYW1pbm8uR2V0T2JqZWN0UmVzcG9uc2USRgoLTGlzdE9iamVjdHMSGi5jYW1pbm8uTGlzdE9iamVjdHNSZXF1ZXN0GhsuY2FtaW5vLkxpc3RPYmplY3RzUmVzcG9uc2USQAoJUmVhZFN0YXRlEhguY2FtaW5vLlJlYWRTdGF0ZVJlcXVlc3QaGS5jYW1pbm8uUmVhZFN0YXRlUmVzcG9uc2USQwoKV3JpdGVTdGF0ZRIZLmNhbWluby5Xcml0ZVN0YXRlUmVxdWVzdBoaLmNhbWluby5Xcml0ZVN0YXRlUmVzcG9uc2USRgoLQ29ubmVjdEVkZ2USGi5jYW1pbm8uQ29ubmVjdEVkZ2VSZXF1ZXN0GhsuY2FtaW5vLkNvbm5lY3RFZGdlUmVzcG9uc2USRgoLUmVzb2x2ZUVkZ2USGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0GhsuY2FtaW5vLlJlc29sdmVFZGdlUmVzcG9uc2USTwoORGlzY29ubmVjdEVkZ2USHS5jYW1pbm8uRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USTAoOUmVhZENvbGxlY3Rpb24SGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USVQoRUmVwbGFjZUNvbGxlY3Rpb24SIC5jYW1pbm8uUmVwbGFjZUNvbGxlY3Rpb25SZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USOgoHTGlzdE9wcxIWLmNhbWluby5MaXN0T3BzUmVxdWVzdBoXLmNhbWluby5MaXN0T3BzUmVzcG9uc2USRQoLV2F0Y2hPYmplY3QSGi5jYW1pbm8uV2F0Y2hPYmplY3RSZXF1ZXN0GhguY2FtaW5vLldhdGNoT2JqZWN0RXZlbnQwAWIGcHJvdG8z", [file_camino_schema, file_quixos_refs]); /** * @generated from message camino.NullValue @@ -241,6 +243,14 @@ export type Value = Message<"camino.Value"> & { * @generated from field: camino.ValueSource source = 11; */ source?: ValueSource | undefined; + + /** + * Trusted query coordinator annotation. Travels with values through residual + * row selection, then is removed in favor of final-path hydration metadata. + * + * @generated from field: camino.QueryFieldOrigin query_origin = 12; + */ + queryOrigin?: QueryFieldOrigin | undefined; }; /** @@ -250,6 +260,95 @@ export type Value = Message<"camino.Value"> & { export const ValueSchema: GenMessage = /*@__PURE__*/ messageDesc(file_camino_api, 7); +/** + * @generated from message camino.QueryFieldOrigin + */ +export type QueryFieldOrigin = Message<"camino.QueryFieldOrigin"> & { + /** + * @generated from field: string selection_id = 1; + */ + selectionId: string; + + /** + * @generated from field: string atom_id = 2; + */ + atomId: string; + + /** + * @generated from field: string interface_revision_id = 3; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string member_id = 4; + */ + memberId: string; + + /** + * @generated from field: camino.StateValueSource source = 5; + */ + source?: StateValueSource | undefined; +}; + +/** + * Describes the message camino.QueryFieldOrigin. + * Use `create(QueryFieldOriginSchema)` to create a new message. + */ +export const QueryFieldOriginSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_api, 8); + +/** + * @generated from message camino.QueryLiveField + */ +export type QueryLiveField = Message<"camino.QueryLiveField"> & { + /** + * @generated from field: repeated camino.QueryPathPart path = 1; + */ + path: QueryPathPart[]; + + /** + * @generated from field: string selection_id = 2; + */ + selectionId: string; + + /** + * @generated from field: string object_id = 3; + */ + objectId: string; + + /** + * @generated from field: quixos.CapabilityRef capability = 4; + */ + capability?: CapabilityRef | undefined; + + /** + * @generated from field: string watch_operation_id = 5; + */ + watchOperationId: string; + + /** + * @generated from field: string setter_operation_id = 6; + */ + setterOperationId: string; + + /** + * @generated from field: quixos.FieldEditing editing = 7; + */ + editing?: FieldEditing | undefined; + + /** + * @generated from field: camino.StateValueSource source = 8; + */ + source?: StateValueSource | undefined; +}; + +/** + * Describes the message camino.QueryLiveField. + * Use `create(QueryLiveFieldSchema)` to create a new message. + */ +export const QueryLiveFieldSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_api, 9); + /** * @generated from message camino.InstallPersistencePlanRequest */ @@ -265,7 +364,7 @@ export type InstallPersistencePlanRequest = Message<"camino.InstallPersistencePl * Use `create(InstallPersistencePlanRequestSchema)` to create a new message. */ export const InstallPersistencePlanRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 8); + messageDesc(file_camino_api, 10); /** * @generated from message camino.InstallPersistencePlanResponse @@ -282,7 +381,7 @@ export type InstallPersistencePlanResponse = Message<"camino.InstallPersistenceP * Use `create(InstallPersistencePlanResponseSchema)` to create a new message. */ export const InstallPersistencePlanResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 9); + messageDesc(file_camino_api, 11); /** * @generated from message camino.GetPersistencePlanRequest @@ -295,7 +394,7 @@ export type GetPersistencePlanRequest = Message<"camino.GetPersistencePlanReques * Use `create(GetPersistencePlanRequestSchema)` to create a new message. */ export const GetPersistencePlanRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 10); + messageDesc(file_camino_api, 12); /** * @generated from message camino.GetPersistencePlanResponse @@ -312,7 +411,7 @@ export type GetPersistencePlanResponse = Message<"camino.GetPersistencePlanRespo * Use `create(GetPersistencePlanResponseSchema)` to create a new message. */ export const GetPersistencePlanResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 11); + messageDesc(file_camino_api, 13); /** * @generated from message camino.CreateObjectRequest @@ -334,7 +433,7 @@ export type CreateObjectRequest = Message<"camino.CreateObjectRequest"> & { * Use `create(CreateObjectRequestSchema)` to create a new message. */ export const CreateObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 12); + messageDesc(file_camino_api, 14); /** * @generated from message camino.CreateObjectResponse @@ -351,7 +450,7 @@ export type CreateObjectResponse = Message<"camino.CreateObjectResponse"> & { * Use `create(CreateObjectResponseSchema)` to create a new message. */ export const CreateObjectResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 13); + messageDesc(file_camino_api, 15); /** * @generated from message camino.GetObjectRequest @@ -368,7 +467,7 @@ export type GetObjectRequest = Message<"camino.GetObjectRequest"> & { * Use `create(GetObjectRequestSchema)` to create a new message. */ export const GetObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 14); + messageDesc(file_camino_api, 16); /** * @generated from message camino.GetObjectResponse @@ -385,7 +484,7 @@ export type GetObjectResponse = Message<"camino.GetObjectResponse"> & { * Use `create(GetObjectResponseSchema)` to create a new message. */ export const GetObjectResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 15); + messageDesc(file_camino_api, 17); /** * @generated from message camino.ListObjectsRequest @@ -402,7 +501,7 @@ export type ListObjectsRequest = Message<"camino.ListObjectsRequest"> & { * Use `create(ListObjectsRequestSchema)` to create a new message. */ export const ListObjectsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 16); + messageDesc(file_camino_api, 18); /** * @generated from message camino.ListObjectsResponse @@ -419,7 +518,7 @@ export type ListObjectsResponse = Message<"camino.ListObjectsResponse"> & { * Use `create(ListObjectsResponseSchema)` to create a new message. */ export const ListObjectsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 17); + messageDesc(file_camino_api, 19); /** * @generated from message camino.ReadStateRequest @@ -441,7 +540,7 @@ export type ReadStateRequest = Message<"camino.ReadStateRequest"> & { * Use `create(ReadStateRequestSchema)` to create a new message. */ export const ReadStateRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 18); + messageDesc(file_camino_api, 20); /** * @generated from message camino.ReadStateResponse @@ -458,7 +557,7 @@ export type ReadStateResponse = Message<"camino.ReadStateResponse"> & { * Use `create(ReadStateResponseSchema)` to create a new message. */ export const ReadStateResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 19); + messageDesc(file_camino_api, 21); /** * @generated from message camino.WriteStateRequest @@ -490,7 +589,7 @@ export type WriteStateRequest = Message<"camino.WriteStateRequest"> & { * Use `create(WriteStateRequestSchema)` to create a new message. */ export const WriteStateRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 20); + messageDesc(file_camino_api, 22); /** * @generated from message camino.WriteStateResponse @@ -512,7 +611,7 @@ export type WriteStateResponse = Message<"camino.WriteStateResponse"> & { * Use `create(WriteStateResponseSchema)` to create a new message. */ export const WriteStateResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 21); + messageDesc(file_camino_api, 23); /** * @generated from message camino.ConnectEdgeRequest @@ -554,7 +653,7 @@ export type ConnectEdgeRequest = Message<"camino.ConnectEdgeRequest"> & { * Use `create(ConnectEdgeRequestSchema)` to create a new message. */ export const ConnectEdgeRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 22); + messageDesc(file_camino_api, 24); /** * @generated from message camino.ConnectEdgeResponse @@ -571,7 +670,7 @@ export type ConnectEdgeResponse = Message<"camino.ConnectEdgeResponse"> & { * Use `create(ConnectEdgeResponseSchema)` to create a new message. */ export const ConnectEdgeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 23); + messageDesc(file_camino_api, 25); /** * @generated from message camino.ResolveEdgeRequest @@ -598,7 +697,7 @@ export type ResolveEdgeRequest = Message<"camino.ResolveEdgeRequest"> & { * Use `create(ResolveEdgeRequestSchema)` to create a new message. */ export const ResolveEdgeRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 24); + messageDesc(file_camino_api, 26); /** * @generated from message camino.ResolveEdgeResponse @@ -615,7 +714,7 @@ export type ResolveEdgeResponse = Message<"camino.ResolveEdgeResponse"> & { * Use `create(ResolveEdgeResponseSchema)` to create a new message. */ export const ResolveEdgeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 25); + messageDesc(file_camino_api, 27); /** * @generated from message camino.DisconnectEdgeRequest @@ -632,7 +731,7 @@ export type DisconnectEdgeRequest = Message<"camino.DisconnectEdgeRequest"> & { * Use `create(DisconnectEdgeRequestSchema)` to create a new message. */ export const DisconnectEdgeRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 26); + messageDesc(file_camino_api, 28); /** * @generated from message camino.DisconnectEdgeResponse @@ -649,7 +748,7 @@ export type DisconnectEdgeResponse = Message<"camino.DisconnectEdgeResponse"> & * Use `create(DisconnectEdgeResponseSchema)` to create a new message. */ export const DisconnectEdgeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 27); + messageDesc(file_camino_api, 29); /** * @generated from message camino.CollectionEntry @@ -678,7 +777,7 @@ export type CollectionEntry = Message<"camino.CollectionEntry"> & { * Use `create(CollectionEntrySchema)` to create a new message. */ export const CollectionEntrySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 28); + messageDesc(file_camino_api, 30); /** * @generated from message camino.ReadCollectionResponse @@ -700,7 +799,7 @@ export type ReadCollectionResponse = Message<"camino.ReadCollectionResponse"> & * Use `create(ReadCollectionResponseSchema)` to create a new message. */ export const ReadCollectionResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 29); + messageDesc(file_camino_api, 31); /** * @generated from message camino.ReplaceCollectionRequest @@ -737,7 +836,7 @@ export type ReplaceCollectionRequest = Message<"camino.ReplaceCollectionRequest" * Use `create(ReplaceCollectionRequestSchema)` to create a new message. */ export const ReplaceCollectionRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 30); + messageDesc(file_camino_api, 32); /** * @generated from message camino.ListOpsRequest @@ -754,7 +853,7 @@ export type ListOpsRequest = Message<"camino.ListOpsRequest"> & { * Use `create(ListOpsRequestSchema)` to create a new message. */ export const ListOpsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 31); + messageDesc(file_camino_api, 33); /** * @generated from message camino.ListOpsResponse @@ -771,7 +870,7 @@ export type ListOpsResponse = Message<"camino.ListOpsResponse"> & { * Use `create(ListOpsResponseSchema)` to create a new message. */ export const ListOpsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 32); + messageDesc(file_camino_api, 34); /** * @generated from message camino.WatchObjectRequest @@ -805,7 +904,7 @@ export type WatchObjectRequest = Message<"camino.WatchObjectRequest"> & { * Use `create(WatchObjectRequestSchema)` to create a new message. */ export const WatchObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 33); + messageDesc(file_camino_api, 35); /** * @generated from message camino.WatchObjectEvent @@ -832,7 +931,7 @@ export type WatchObjectEvent = Message<"camino.WatchObjectEvent"> & { * Use `create(WatchObjectEventSchema)` to create a new message. */ export const WatchObjectEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 34); + messageDesc(file_camino_api, 36); /** * @generated from message camino.CaminoObject @@ -879,7 +978,7 @@ export type CaminoObject = Message<"camino.CaminoObject"> & { * Use `create(CaminoObjectSchema)` to create a new message. */ export const CaminoObjectSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 35); + messageDesc(file_camino_api, 37); /** * @generated from message camino.CaminoEdge @@ -946,7 +1045,7 @@ export type CaminoEdge = Message<"camino.CaminoEdge"> & { * Use `create(CaminoEdgeSchema)` to create a new message. */ export const CaminoEdgeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 36); + messageDesc(file_camino_api, 38); /** * @generated from message camino.CaminoOp @@ -993,7 +1092,7 @@ export type CaminoOp = Message<"camino.CaminoOp"> & { * Use `create(CaminoOpSchema)` to create a new message. */ export const CaminoOpSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 37); + messageDesc(file_camino_api, 39); /** * @generated from message camino.QueryRequest @@ -1028,7 +1127,7 @@ export type QueryRequest = Message<"camino.QueryRequest"> & { * Use `create(QueryRequestSchema)` to create a new message. */ export const QueryRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 38); + messageDesc(file_camino_api, 40); /** * @generated from message camino.QueryPathPart @@ -1057,7 +1156,7 @@ export type QueryPathPart = Message<"camino.QueryPathPart"> & { * Use `create(QueryPathPartSchema)` to create a new message. */ export const QueryPathPartSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 39); + messageDesc(file_camino_api, 41); /** * @generated from message camino.QueryPendingField @@ -1126,7 +1225,7 @@ export type QueryPendingField = Message<"camino.QueryPendingField"> & { * Use `create(QueryPendingFieldSchema)` to create a new message. */ export const QueryPendingFieldSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 40); + messageDesc(file_camino_api, 42); /** * @generated from message camino.QueryStats @@ -1193,7 +1292,7 @@ export type QueryStats = Message<"camino.QueryStats"> & { * Use `create(QueryStatsSchema)` to create a new message. */ export const QueryStatsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 41); + messageDesc(file_camino_api, 43); /** * @generated from message camino.QueryResponse @@ -1254,6 +1353,11 @@ export type QueryResponse = Message<"camino.QueryResponse"> & { * @generated from field: repeated camino.QueryRelationalCapture relational_captures = 10; */ relationalCaptures: QueryRelationalCapture[]; + + /** + * @generated from field: repeated camino.QueryLiveField live_fields = 11; + */ + liveFields: QueryLiveField[]; }; /** @@ -1261,7 +1365,7 @@ export type QueryResponse = Message<"camino.QueryResponse"> & { * Use `create(QueryResponseSchema)` to create a new message. */ export const QueryResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 42); + messageDesc(file_camino_api, 44); /** * Private coordinator input, removed before publishing a result. Memberships @@ -1291,7 +1395,7 @@ export type QueryCapturedMember = Message<"camino.QueryCapturedMember"> & { * Use `create(QueryCapturedMemberSchema)` to create a new message. */ export const QueryCapturedMemberSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 43); + messageDesc(file_camino_api, 45); /** * @generated from message camino.QueryCapturedMembers @@ -1308,7 +1412,7 @@ export type QueryCapturedMembers = Message<"camino.QueryCapturedMembers"> & { * Use `create(QueryCapturedMembersSchema)` to create a new message. */ export const QueryCapturedMembersSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 44); + messageDesc(file_camino_api, 46); /** * @generated from message camino.QueryCapturedObject @@ -1340,7 +1444,7 @@ export type QueryCapturedObject = Message<"camino.QueryCapturedObject"> & { * Use `create(QueryCapturedObjectSchema)` to create a new message. */ export const QueryCapturedObjectSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 45); + messageDesc(file_camino_api, 47); /** * @generated from message camino.QueryRelationalCapture @@ -1397,7 +1501,7 @@ export type QueryRelationalCapture = Message<"camino.QueryRelationalCapture"> & * Use `create(QueryRelationalCaptureSchema)` to create a new message. */ export const QueryRelationalCaptureSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 46); + messageDesc(file_camino_api, 48); /** * @generated from message camino.QueryResidualRow @@ -1419,7 +1523,7 @@ export type QueryResidualRow = Message<"camino.QueryResidualRow"> & { * Use `create(QueryResidualRowSchema)` to create a new message. */ export const QueryResidualRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 47); + messageDesc(file_camino_api, 49); /** * @generated from message camino.QueryResidualOrder @@ -1441,7 +1545,7 @@ export type QueryResidualOrder = Message<"camino.QueryResidualOrder"> & { * Use `create(QueryResidualOrderSchema)` to create a new message. */ export const QueryResidualOrderSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 48); + messageDesc(file_camino_api, 50); /** * @generated from message camino.QueryResidualWindow @@ -1503,7 +1607,7 @@ export type QueryResidualWindow = Message<"camino.QueryResidualWindow"> & { * Use `create(QueryResidualWindowSchema)` to create a new message. */ export const QueryResidualWindowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 49); + messageDesc(file_camino_api, 51); /** * @generated from message camino.QueryFieldFailure @@ -1525,7 +1629,7 @@ export type QueryFieldFailure = Message<"camino.QueryFieldFailure"> & { * Use `create(QueryFieldFailureSchema)` to create a new message. */ export const QueryFieldFailureSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 50); + messageDesc(file_camino_api, 52); /** * @generated from message camino.QueryChangesRequest @@ -1552,7 +1656,7 @@ export type QueryChangesRequest = Message<"camino.QueryChangesRequest"> & { * Use `create(QueryChangesRequestSchema)` to create a new message. */ export const QueryChangesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 51); + messageDesc(file_camino_api, 53); /** * @generated from message camino.QueryChangesResponse @@ -1569,7 +1673,7 @@ export type QueryChangesResponse = Message<"camino.QueryChangesResponse"> & { * Use `create(QueryChangesResponseSchema)` to create a new message. */ export const QueryChangesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 52); + messageDesc(file_camino_api, 54); /** * @generated from service camino.CaminoService diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 512b38d..644a900 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK5AwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkikgEKDFF1ZXJ5QnVkZ2V0cxIMCgRyb3dzGAEgASgNEg0KBWRlcHRoGAIgASgNEhQKDHJlc3VsdF9ieXRlcxgDIAEoDRISCgpjYW5kaWRhdGVzGAQgASgNEhEKCXJwY19jYWxscxgFIAEoDRITCgtjb25jdXJyZW5jeRgGIAEoDRITCgtkZWFkbGluZV9tcxgHIAEoDSKNBAoOSW5zdGFsbGVkUXVlcnkSCgoCaWQYASABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSIgoacm9vdF9pbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAkSKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgaTgoVVmFyaWFibGVEZWZhdWx0c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYquQIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHKoQCCh5RdWVyeVJlbGF0aW9uUHJlZGljYXRlT3BlcmF0b3ISMQotUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1NPTUUQARIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfTk9ORRACEigKJFFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JUxADEi0KKVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JU19OVUxMEARiBnByb3RvMw"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkikgEKDFF1ZXJ5QnVkZ2V0cxIMCgRyb3dzGAEgASgNEg0KBWRlcHRoGAIgASgNEhQKDHJlc3VsdF9ieXRlcxgDIAEoDRISCgpjYW5kaWRhdGVzGAQgASgNEhEKCXJwY19jYWxscxgFIAEoDRITCgtjb25jdXJyZW5jeRgGIAEoDRITCgtkZWFkbGluZV9tcxgHIAEoDSKNBAoOSW5zdGFsbGVkUXVlcnkSCgoCaWQYASABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSIgoacm9vdF9pbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAkSKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgaTgoVVmFyaWFibGVEZWZhdWx0c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYquQIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHKoQCCh5RdWVyeVJlbGF0aW9uUHJlZGljYXRlT3BlcmF0b3ISMQotUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1NPTUUQARIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfTk9ORRACEigKJFFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JUxADEi0KKVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JU19OVUxMEARiBnByb3RvMw"); /** * @generated from message camino.AtomDefinition @@ -440,6 +440,13 @@ export type QuerySelection = Message<"camino.QuerySelection"> & { * @generated from field: camino.QueryPredicate predicate = 10; */ predicate?: QueryPredicate | undefined; + + /** + * Stable checked selection identity; empty for ordinary value projections. + * + * @generated from field: string live_selection_id = 11; + */ + liveSelectionId: string; }; /** diff --git a/src/gen/quixos/orch_pb.ts b/src/gen/quixos/orch_pb.ts index 714d782..80285fd 100644 --- a/src/gen/quixos/orch_pb.ts +++ b/src/gen/quixos/orch_pb.ts @@ -10,7 +10,7 @@ import type { InstalledQuery } from "../camino/schema_pb.js"; import { file_camino_schema } from "../camino/schema_pb.js"; import type { PackageDescriptor } from "./package_pb.js"; import { file_quixos_package } from "./package_pb.js"; -import type { CapabilityRef, ConformanceWitness, PackageExportRef } from "./refs_pb.js"; +import type { CapabilityRef, ConformanceWitness, FieldEditing, 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"; @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/orch.proto. */ export const file_quixos_orch: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gitwEKClF1ZXJ5RXZlbnQSDgoGcnVuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEgwKBGtpbmQYAyABKAkSJwoIc25hcHNob3QYBCABKAsyFS5jYW1pbm8uUXVlcnlSZXNwb25zZRIjCgRwYXRoGAUgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSHAoFdmFsdWUYBiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYByABKAkiRQoRVHJ5Q29uZm9ybVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCSJFChJUcnlDb25mb3JtUmVzcG9uc2USLwoLY29uZm9ybWFuY2UYASABKAsyGi5xdWl4b3MuQ29uZm9ybWFuY2VXaXRuZXNzIqUBChZDb25zdHJ1Y3RPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSPQoFaW5wdXQYAiADKAsyLi5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIj8KF0NvbnN0cnVjdE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QibQomUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkiZAonUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSEwoLY29uc3RydWN0ZWQYAiABKAgi8AEKF0ludm9rZUNhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPgoFaW5wdXQYAyADKAsyLy5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5EhoKEmNsaWVudF9tdXRhdGlvbl9pZBgEIAEoCRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEizgEKHEludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEkMKBWlucHV0GAMgAygLMjQucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASKDAgoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5EjAKDWZpZWxkX2VkaXRpbmcYByABKAsyGS5xdWl4b3Mub3JjaC5GaWVsZEVkaXRpbmcidwoMRmllbGRFZGl0aW5nEhsKE2dldHRlcl9vcGVyYXRpb25faWQYASABKAkSGwoTc2V0dGVyX29wZXJhdGlvbl9pZBgCIAEoCRIVCg1kb2N1bWVudF90eXBlGAMgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAQgASgJIs4BChpFZGl0Q2FwYWJpbGl0eUZpZWxkUmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAyABKAkSFgoOYmluZGluZ19kaWdlc3QYBCABKAkSIQoGdXBkYXRlGAUgASgLMhEuY2FtaW5vLkNyZHRWYWx1ZRIaChJjbGllbnRfbXV0YXRpb25faWQYBiABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEilQIKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCBIwCg1maWVsZF9lZGl0aW5nGAggASgLMhkucXVpeG9zLm9yY2guRmllbGRFZGl0aW5nIlsKE0dldFdvcmtzcGFjZVJlcXVlc3QSIwobaW5jbHVkZV9pbnRlcmZhY2VfY29udHJhY3RzGAEgASgIEh8KF2luY2x1ZGVfcXVlcnlfY29udHJhY3RzGAIgASgIIrsDChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCRIqCiJlbXB0eV9pbnB1dF9jb25zdHJ1Y3RpYmxlX2F0b21faWRzGAQgAygJEj8KEWNhcGFiaWxpdHlfaW5wdXRzGAUgAygLMiQucXVpeG9zLm9yY2guQ2FwYWJpbGl0eUlucHV0Q29udHJhY3QSQQoSY29uc3RydWN0b3JfaW5wdXRzGAYgAygLMiUucXVpeG9zLm9yY2guQ29uc3RydWN0b3JJbnB1dENvbnRyYWN0EhcKD2ludGVyZmFjZXNfanNvbhgHIAEoCRI4ChJjbGFzc19jYXBhYmlsaXRpZXMYCCADKAsyHC5xdWl4b3Mub3JjaC5DbGFzc0NhcGFiaWxpdHkSLgoHcXVlcmllcxgJIAMoCzIdLnF1aXhvcy5vcmNoLlF1ZXJ5RGVzY3JpcHRpb24SHwoXYWN0aXZlX3F1ZXJ5X2V4ZWN1dGlvbnMYCiABKA0ivQEKEFF1ZXJ5RGVzY3JpcHRpb24SCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIbChNwYWNrYWdlX3JldmlzaW9uX2lkGAMgASgJEhAKCGRvY3VtZW50GAQgASgJEg4KBnNjaGVtYRgFIAEoCRIUCgxzb3VyY2VfZmlsZXMYBiADKAkSFAoMZWZmZWN0c19qc29uGAcgASgJEiQKBHBsYW4YCCABKAsyFi5jYW1pbm8uSW5zdGFsbGVkUXVlcnkiuQEKD0NsYXNzQ2FwYWJpbGl0eRIWCg5jb25mb3JtYW5jZV9pZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIVCg1kZWZpbml0aW9uX2lkGAQgASgJEhQKDG9wZXJhdGlvbl9pZBgFIAEoCRIXCg9pbnB1dF90eXBlX2pzb24YBiABKAkSGAoQb3V0cHV0X3R5cGVfanNvbhgHIAEoCSJhChdDYXBhYmlsaXR5SW5wdXRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEhEKCXR5cGVfanNvbhgDIAEoCSI+ChhDb25zdHJ1Y3RvcklucHV0Q29udHJhY3QSDwoHYXRvbV9pZBgBIAEoCRIRCgl0eXBlX2pzb24YAiABKAkiGAoWTGlzdEFjdGl2YXRpb25zUmVxdWVzdCIfCh1MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdCJQCh5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVzcG9uc2USLgoLZGVzY3JpcHRvcnMYASADKAsyGS5xdWl4b3MuUGFja2FnZURlc2NyaXB0b3IiHAoaTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QiUgobTGlzdFBhY2thZ2VSdW50aW1lc1Jlc3BvbnNlEjMKCHJ1bnRpbWVzGAEgAygLMiEucXVpeG9zLm9yY2guUGFja2FnZVJ1bnRpbWVTdGF0dXMiRwoXTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USLAoLYWN0aXZhdGlvbnMYASADKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIj8KFkNsb3NlQWN0aXZhdGlvblJlcXVlc3QSFQoNYWN0aXZhdGlvbl9pZBgBIAEoCRIOCgZyZWFzb24YAiABKAkiRgoXQ2xvc2VBY3RpdmF0aW9uUmVzcG9uc2USKwoKYWN0aXZhdGlvbhgBIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24i6wEKCkFjdGl2YXRpb24SFQoNYWN0aXZhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSDQoFc3RhdGUYBCABKAkSDgoGZGVtYW5kGAUgASgNEhEKCW9wZW5lZF9hdBgGIAEoCRIUCgxsYXN0X3VzZWRfYXQYByABKAkSGAoQaWRsZV9kZWFkbGluZV9hdBgIIAEoCRIRCgljbG9zZWRfYXQYCSABKAkSFAoMY2xvc2VfcmVhc29uGAogASgJIrMCChRQYWNrYWdlUnVudGltZVN0YXR1cxITCgtydW50aW1lX2tleRgBIAEoCRIbChNwYWNrYWdlX3JldmlzaW9uX2lkGAIgASgJEhkKEXNvdXJjZV9yZXBvc2l0b3J5GAMgASgJEhUKDXNvdXJjZV9jb21taXQYBCABKAkSFAoMYnVpbGRfdGFyZ2V0GAUgASgJEhMKC3NlcnZlcl9wYXRoGAYgASgJEgsKA3BpZBgHIAEoDRINCgVzdGF0ZRgIIAEoCRISCgpzdGFydGVkX2F0GAkgASgJEhkKEWxhc3RfaGFuZHNoYWtlX2F0GAogASgJEiAKGHJ1bnRpbWVfcHJvdG9jb2xfdmVyc2lvbhgLIAEoCRIfChdhZHZlcnRpc2VkX2V4cG9ydF9jb3VudBgMIAEoDTLLCgoTT3JjaGVzdHJhdG9yUnVudGltZRI7CgxFeGVjdXRlUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhUuY2FtaW5vLlF1ZXJ5UmVzcG9uc2USPQoKV2F0Y2hRdWVyeRIULmNhbWluby5RdWVyeVJlcXVlc3QaFy5xdWl4b3Mub3JjaC5RdWVyeUV2ZW50MAESTQoKVHJ5Q29uZm9ybRIeLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXF1ZXN0Gh8ucXVpeG9zLm9yY2guVHJ5Q29uZm9ybVJlc3BvbnNlEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJlChNFZGl0Q2FwYWJpbGl0eUZpZWxkEicucXVpeG9zLm9yY2guRWRpdENhcGFiaWxpdHlGaWVsZFJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USaQoVSW52b2tlQ2xhc3NDYXBhYmlsaXR5EikucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gitwEKClF1ZXJ5RXZlbnQSDgoGcnVuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEgwKBGtpbmQYAyABKAkSJwoIc25hcHNob3QYBCABKAsyFS5jYW1pbm8uUXVlcnlSZXNwb25zZRIjCgRwYXRoGAUgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSHAoFdmFsdWUYBiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYByABKAkiRQoRVHJ5Q29uZm9ybVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCSJFChJUcnlDb25mb3JtUmVzcG9uc2USLwoLY29uZm9ybWFuY2UYASABKAsyGi5xdWl4b3MuQ29uZm9ybWFuY2VXaXRuZXNzIqUBChZDb25zdHJ1Y3RPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSPQoFaW5wdXQYAiADKAsyLi5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIj8KF0NvbnN0cnVjdE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QibQomUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkiZAonUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSEwoLY29uc3RydWN0ZWQYAiABKAgi8AEKF0ludm9rZUNhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPgoFaW5wdXQYAyADKAsyLy5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5EhoKEmNsaWVudF9tdXRhdGlvbl9pZBgEIAEoCRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEizgEKHEludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEkMKBWlucHV0GAMgAygLMjQucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASL+AQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5EisKDWZpZWxkX2VkaXRpbmcYByABKAsyFC5xdWl4b3MuRmllbGRFZGl0aW5nIv4BChpFZGl0Q2FwYWJpbGl0eUZpZWxkUmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAyABKAkSFgoOYmluZGluZ19kaWdlc3QYBCABKAkSIwoGdXBkYXRlGAUgASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiQKC3JlcGxhY2VtZW50GAcgASgLMg0uY2FtaW5vLlZhbHVlSAASGgoSY2xpZW50X211dGF0aW9uX2lkGAYgASgJQgYKBGVkaXQi0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEikAIKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCBIrCg1maWVsZF9lZGl0aW5nGAggASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZyJbChNHZXRXb3Jrc3BhY2VSZXF1ZXN0EiMKG2luY2x1ZGVfaW50ZXJmYWNlX2NvbnRyYWN0cxgBIAEoCBIfChdpbmNsdWRlX3F1ZXJ5X2NvbnRyYWN0cxgCIAEoCCK7AwoUR2V0V29ya3NwYWNlUmVzcG9uc2USFAoMd29ya3NwYWNlX2lkGAEgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgCIAEoCRIaChJzb3VyY2Vfcm9vdF9jb21taXQYAyABKAkSKgoiZW1wdHlfaW5wdXRfY29uc3RydWN0aWJsZV9hdG9tX2lkcxgEIAMoCRI/ChFjYXBhYmlsaXR5X2lucHV0cxgFIAMoCzIkLnF1aXhvcy5vcmNoLkNhcGFiaWxpdHlJbnB1dENvbnRyYWN0EkEKEmNvbnN0cnVjdG9yX2lucHV0cxgGIAMoCzIlLnF1aXhvcy5vcmNoLkNvbnN0cnVjdG9ySW5wdXRDb250cmFjdBIXCg9pbnRlcmZhY2VzX2pzb24YByABKAkSOAoSY2xhc3NfY2FwYWJpbGl0aWVzGAggAygLMhwucXVpeG9zLm9yY2guQ2xhc3NDYXBhYmlsaXR5Ei4KB3F1ZXJpZXMYCSADKAsyHS5xdWl4b3Mub3JjaC5RdWVyeURlc2NyaXB0aW9uEh8KF2FjdGl2ZV9xdWVyeV9leGVjdXRpb25zGAogASgNIr0BChBRdWVyeURlc2NyaXB0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgDIAEoCRIQCghkb2N1bWVudBgEIAEoCRIOCgZzY2hlbWEYBSABKAkSFAoMc291cmNlX2ZpbGVzGAYgAygJEhQKDGVmZmVjdHNfanNvbhgHIAEoCRIkCgRwbGFuGAggASgLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5IrkBCg9DbGFzc0NhcGFiaWxpdHkSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSDwoHYXRvbV9pZBgCIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSFQoNZGVmaW5pdGlvbl9pZBgEIAEoCRIUCgxvcGVyYXRpb25faWQYBSABKAkSFwoPaW5wdXRfdHlwZV9qc29uGAYgASgJEhgKEG91dHB1dF90eXBlX2pzb24YByABKAkiYQoXQ2FwYWJpbGl0eUlucHV0Q29udHJhY3QSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIRCgl0eXBlX2pzb24YAyABKAkiPgoYQ29uc3RydWN0b3JJbnB1dENvbnRyYWN0Eg8KB2F0b21faWQYASABKAkSEQoJdHlwZV9qc29uGAIgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yywoKE09yY2hlc3RyYXRvclJ1bnRpbWUSOwoMRXhlY3V0ZVF1ZXJ5EhQuY2FtaW5vLlF1ZXJ5UmVxdWVzdBoVLmNhbWluby5RdWVyeVJlc3BvbnNlEj0KCldhdGNoUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhcucXVpeG9zLm9yY2guUXVlcnlFdmVudDABEk0KClRyeUNvbmZvcm0SHi5xdWl4b3Mub3JjaC5UcnlDb25mb3JtUmVxdWVzdBofLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXNwb25zZRJfChBJbnZva2VDYXBhYmlsaXR5EiQucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USZQoTRWRpdENhcGFiaWxpdHlGaWVsZBInLnF1aXhvcy5vcmNoLkVkaXRDYXBhYmlsaXR5RmllbGRSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEmkKFUludm9rZUNsYXNzQ2FwYWJpbGl0eRIpLnF1aXhvcy5vcmNoLkludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USWwoPV2F0Y2hDYXBhYmlsaXR5EiMucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5UmVxdWVzdBohLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eUV2ZW50MAESXAoPQ29uc3RydWN0T2JqZWN0EiMucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVxdWVzdBokLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlc3BvbnNlEowBCh9SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0EjMucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QaNC5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USUwoMR2V0V29ya3NwYWNlEiAucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVxdWVzdBohLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlc3BvbnNlEnEKFkxpc3RQYWNrYWdlRGVzY3JpcHRvcnMSKi5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdBorLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRJoChNMaXN0UGFja2FnZVJ1bnRpbWVzEicucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QaKC5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USXAoPTGlzdEFjdGl2YXRpb25zEiMucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVxdWVzdBokLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlElwKD0Nsb3NlQWN0aXZhdGlvbhIjLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlcXVlc3QaJC5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXNwb25zZWIGcHJvdG8z", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); /** * @generated from message quixos.orch.QueryEvent @@ -297,7 +297,7 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp dependencies: DerivedDependency[]; /** - * @generated from field: quixos.orch.FieldEditing field_editing = 7; + * @generated from field: quixos.FieldEditing field_editing = 7; */ fieldEditing?: FieldEditing | undefined; }; @@ -309,40 +309,6 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp export const InvokeCapabilityResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_orch, 9); -/** - * Resolved from the checked native getter/setter binding, not Value.source. - * - * @generated from message quixos.orch.FieldEditing - */ -export type FieldEditing = Message<"quixos.orch.FieldEditing"> & { - /** - * @generated from field: string getter_operation_id = 1; - */ - getterOperationId: string; - - /** - * @generated from field: string setter_operation_id = 2; - */ - setterOperationId: string; - - /** - * @generated from field: string document_type = 3; - */ - documentType: string; - - /** - * @generated from field: string binding_digest = 4; - */ - bindingDigest: string; -}; - -/** - * Describes the message quixos.orch.FieldEditing. - * Use `create(FieldEditingSchema)` to create a new message. - */ -export const FieldEditingSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 10); - /** * @generated from message quixos.orch.EditCapabilityFieldRequest */ @@ -370,9 +336,21 @@ export type EditCapabilityFieldRequest = Message<"quixos.orch.EditCapabilityFiel bindingDigest: string; /** - * @generated from field: camino.CrdtValue update = 5; + * @generated from oneof quixos.orch.EditCapabilityFieldRequest.edit */ - update?: CrdtValue | undefined; + edit: { + /** + * @generated from field: camino.CrdtValue update = 5; + */ + value: CrdtValue; + case: "update"; + } | { + /** + * @generated from field: camino.Value replacement = 7; + */ + value: Value; + case: "replacement"; + } | { case: undefined; value?: undefined }; /** * @generated from field: string client_mutation_id = 6; @@ -385,7 +363,7 @@ export type EditCapabilityFieldRequest = Message<"quixos.orch.EditCapabilityFiel * Use `create(EditCapabilityFieldRequestSchema)` to create a new message. */ export const EditCapabilityFieldRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 11); + messageDesc(file_quixos_orch, 10); /** * @generated from message quixos.orch.WatchCapabilityRequest @@ -412,7 +390,7 @@ export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest * Use `create(WatchCapabilityRequestSchema)` to create a new message. */ export const WatchCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 12); + messageDesc(file_quixos_orch, 11); /** * @generated from message quixos.orch.WatchCapabilityEvent @@ -454,7 +432,7 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & initial: boolean; /** - * @generated from field: quixos.orch.FieldEditing field_editing = 8; + * @generated from field: quixos.FieldEditing field_editing = 8; */ fieldEditing?: FieldEditing | undefined; }; @@ -464,7 +442,7 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & * Use `create(WatchCapabilityEventSchema)` to create a new message. */ export const WatchCapabilityEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 13); + messageDesc(file_quixos_orch, 12); /** * @generated from message quixos.orch.GetWorkspaceRequest @@ -488,7 +466,7 @@ export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & { * Use `create(GetWorkspaceRequestSchema)` to create a new message. */ export const GetWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 14); + messageDesc(file_quixos_orch, 13); /** * @generated from message quixos.orch.GetWorkspaceResponse @@ -555,7 +533,7 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> & * Use `create(GetWorkspaceResponseSchema)` to create a new message. */ export const GetWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 15); + messageDesc(file_quixos_orch, 14); /** * @generated from message quixos.orch.QueryDescription @@ -607,7 +585,7 @@ export type QueryDescription = Message<"quixos.orch.QueryDescription"> & { * Use `create(QueryDescriptionSchema)` to create a new message. */ export const QueryDescriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 16); + messageDesc(file_quixos_orch, 15); /** * @generated from message quixos.orch.ClassCapability @@ -654,7 +632,7 @@ export type ClassCapability = Message<"quixos.orch.ClassCapability"> & { * Use `create(ClassCapabilitySchema)` to create a new message. */ export const ClassCapabilitySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 17); + messageDesc(file_quixos_orch, 16); /** * @generated from message quixos.orch.CapabilityInputContract @@ -681,7 +659,7 @@ export type CapabilityInputContract = Message<"quixos.orch.CapabilityInputContra * Use `create(CapabilityInputContractSchema)` to create a new message. */ export const CapabilityInputContractSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 18); + messageDesc(file_quixos_orch, 17); /** * @generated from message quixos.orch.ConstructorInputContract @@ -703,7 +681,7 @@ export type ConstructorInputContract = Message<"quixos.orch.ConstructorInputCont * Use `create(ConstructorInputContractSchema)` to create a new message. */ export const ConstructorInputContractSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 19); + messageDesc(file_quixos_orch, 18); /** * @generated from message quixos.orch.ListActivationsRequest @@ -716,7 +694,7 @@ export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest * Use `create(ListActivationsRequestSchema)` to create a new message. */ export const ListActivationsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 20); + messageDesc(file_quixos_orch, 19); /** * @generated from message quixos.orch.ListPackageDescriptorsRequest @@ -729,7 +707,7 @@ export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDesc * Use `create(ListPackageDescriptorsRequestSchema)` to create a new message. */ export const ListPackageDescriptorsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 21); + messageDesc(file_quixos_orch, 20); /** * @generated from message quixos.orch.ListPackageDescriptorsResponse @@ -746,7 +724,7 @@ export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDes * Use `create(ListPackageDescriptorsResponseSchema)` to create a new message. */ export const ListPackageDescriptorsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 22); + messageDesc(file_quixos_orch, 21); /** * @generated from message quixos.orch.ListPackageRuntimesRequest @@ -759,7 +737,7 @@ export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntime * Use `create(ListPackageRuntimesRequestSchema)` to create a new message. */ export const ListPackageRuntimesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 23); + messageDesc(file_quixos_orch, 22); /** * @generated from message quixos.orch.ListPackageRuntimesResponse @@ -776,7 +754,7 @@ export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntim * Use `create(ListPackageRuntimesResponseSchema)` to create a new message. */ export const ListPackageRuntimesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 24); + messageDesc(file_quixos_orch, 23); /** * @generated from message quixos.orch.ListActivationsResponse @@ -793,7 +771,7 @@ export type ListActivationsResponse = Message<"quixos.orch.ListActivationsRespon * Use `create(ListActivationsResponseSchema)` to create a new message. */ export const ListActivationsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 25); + messageDesc(file_quixos_orch, 24); /** * @generated from message quixos.orch.CloseActivationRequest @@ -815,7 +793,7 @@ export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest * Use `create(CloseActivationRequestSchema)` to create a new message. */ export const CloseActivationRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 26); + messageDesc(file_quixos_orch, 25); /** * @generated from message quixos.orch.CloseActivationResponse @@ -832,7 +810,7 @@ export type CloseActivationResponse = Message<"quixos.orch.CloseActivationRespon * Use `create(CloseActivationResponseSchema)` to create a new message. */ export const CloseActivationResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 27); + messageDesc(file_quixos_orch, 26); /** * @generated from message quixos.orch.Activation @@ -894,7 +872,7 @@ export type Activation = Message<"quixos.orch.Activation"> & { * Use `create(ActivationSchema)` to create a new message. */ export const ActivationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 28); + messageDesc(file_quixos_orch, 27); /** * @generated from message quixos.orch.PackageRuntimeStatus @@ -966,7 +944,7 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> & * Use `create(PackageRuntimeStatusSchema)` to create a new message. */ export const PackageRuntimeStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 29); + messageDesc(file_quixos_orch, 28); /** * @generated from service quixos.orch.OrchestratorRuntime diff --git a/src/gen/quixos/refs_pb.ts b/src/gen/quixos/refs_pb.ts index f6e0675..7e54117 100644 --- a/src/gen/quixos/refs_pb.ts +++ b/src/gen/quixos/refs_pb.ts @@ -2,15 +2,15 @@ // @generated from file quixos/refs.proto (package quixos, syntax proto3) /* eslint-disable */ -import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; +import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file quixos/refs.proto. */ export const file_quixos_refs: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3MilgEKEkNvbmZvcm1hbmNlV2l0bmVzcxIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgEIAEoCRIXCg93b3Jrc3BhY2VfZXBvY2gYBSABKAkiQgoQUGFja2FnZUV4cG9ydFJlZhIbChNwYWNrYWdlX3JldmlzaW9uX2lkGAEgASgJEhEKCWV4cG9ydF9pZBgCIAEoCSLYAQoSSW5qZWN0ZWREZXBlbmRlbmN5Eg8KB3BvcnRfaWQYASABKAkSFwoNc3RhdGVfc2xvdF9pZBgCIAEoCUgAEiYKBGVkZ2UYAyABKAsyFi5xdWl4b3MuRWRnZURlcGVuZGVuY3lIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAlIABIdChNjb25zdHJ1Y3Rvcl9hdG9tX2lkGAUgASgJSAASEgoIcXVlcnlfaWQYByABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z"); + fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3Mi0QEKDEZpZWxkRWRpdGluZxIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAEgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAiABKAkSFQoNZG9jdW1lbnRfdHlwZRgDIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgEIAEoCRInCgRtb2RlGAUgASgOMhkucXVpeG9zLkZpZWxkRWRpdGluZy5Nb2RlIi8KBE1vZGUSDwoLVU5TUEVDSUZJRUQQABIMCghSRUdJU1RFUhABEggKBENSRFQQAiKWAQoSQ29uZm9ybWFuY2VXaXRuZXNzEhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSFgoOY29uZm9ybWFuY2VfaWQYAyABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAQgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgFIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJItgBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABISCghxdWVyeV9pZBgHIAEoCUgAEhEKCW9iamVjdF9pZBgGIAEoCUIJCgdiaW5kaW5nIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM"); /** * @generated from message quixos.CapabilityRef @@ -41,6 +41,71 @@ export type CapabilityRef = Message<"quixos.CapabilityRef"> & { export const CapabilityRefSchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_refs, 0); +/** + * Resolved native editing semantics. A source snapshot alone grants no writer. + * + * @generated from message quixos.FieldEditing + */ +export type FieldEditing = Message<"quixos.FieldEditing"> & { + /** + * @generated from field: string getter_operation_id = 1; + */ + getterOperationId: string; + + /** + * @generated from field: string setter_operation_id = 2; + */ + setterOperationId: string; + + /** + * @generated from field: string document_type = 3; + */ + documentType: string; + + /** + * @generated from field: string binding_digest = 4; + */ + bindingDigest: string; + + /** + * @generated from field: quixos.FieldEditing.Mode mode = 5; + */ + mode: FieldEditing_Mode; +}; + +/** + * Describes the message quixos.FieldEditing. + * Use `create(FieldEditingSchema)` to create a new message. + */ +export const FieldEditingSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_refs, 1); + +/** + * @generated from enum quixos.FieldEditing.Mode + */ +export enum FieldEditing_Mode { + /** + * @generated from enum value: UNSPECIFIED = 0; + */ + UNSPECIFIED = 0, + + /** + * @generated from enum value: REGISTER = 1; + */ + REGISTER = 1, + + /** + * @generated from enum value: CRDT = 2; + */ + CRDT = 2, +} + +/** + * Describes the enum quixos.FieldEditing.Mode. + */ +export const FieldEditing_ModeSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_quixos_refs, 1, 0); + /** * @generated from message quixos.ConformanceWitness */ @@ -76,7 +141,7 @@ export type ConformanceWitness = Message<"quixos.ConformanceWitness"> & { * Use `create(ConformanceWitnessSchema)` to create a new message. */ export const ConformanceWitnessSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 1); + messageDesc(file_quixos_refs, 2); /** * @generated from message quixos.PackageExportRef @@ -98,7 +163,7 @@ export type PackageExportRef = Message<"quixos.PackageExportRef"> & { * Use `create(PackageExportRefSchema)` to create a new message. */ export const PackageExportRefSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 2); + messageDesc(file_quixos_refs, 3); /** * @generated from message quixos.InjectedDependency @@ -158,7 +223,7 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { * Use `create(InjectedDependencySchema)` to create a new message. */ export const InjectedDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 3); + messageDesc(file_quixos_refs, 4); /** * @generated from message quixos.EdgeDependency @@ -180,5 +245,5 @@ export type EdgeDependency = Message<"quixos.EdgeDependency"> & { * Use `create(EdgeDependencySchema)` to create a new message. */ export const EdgeDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 4); + messageDesc(file_quixos_refs, 5); diff --git a/src/query/compile.ts b/src/query/compile.ts index 1c9de21..c899715 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -101,7 +101,7 @@ export async function compileQuery( if (node.name.value.startsWith("__")) fail("QUERY_UNSUPPORTED_FEATURE", "Introspection is not supported", node); }, Directive(node) { - if (!["include", "skip"].includes(node.name.value)) + if (!["include", "skip", "live"].includes(node.name.value)) fail("QUERY_UNSUPPORTED_FEATURE", `Unsupported directive ${node.name.value}`, node); }, InlineFragment(node) { @@ -180,6 +180,15 @@ export async function compileQuery( Field(node) { const parent = info.getParentType(); const contract = parent && generated.byName.get(parent.name); + if (node.directives?.some((directive) => directive.name.value === "live")) { + const member = contract?.members.find((entry) => entry.displayName === node.name.value); + if (!member || member.kind !== "value" || member.queryRead?.execution !== "native") + fail( + "QUERY_LIVE_UNSUPPORTED", + "@live requires a direct native-queryable value field, not RPC enrichment or a synthetic result", + node, + ); + } if (!contract || node.name.value === "_qx") return; mark(contract.revisionId, node.name.value, "select", node); const member = contract.members.find((entry) => entry.displayName === node.name.value)!; @@ -286,9 +295,12 @@ export async function compileQuery( field.type, selection.selectionSet, depth + 1, - conditional || !!selection.directives?.length, + conditional || !!selection.directives?.some((entry) => entry.name.value !== "live"), ); - if ((conditional || selection.directives?.length) && fields[key]!.kind !== "optional") + if ( + (conditional || selection.directives?.some((entry) => entry.name.value !== "live")) && + fields[key]!.kind !== "optional" + ) fields[key] = valueType.optional(fields[key]!); if (previous) fields[key] = mergeOutput(previous, fields[key]!); } @@ -354,10 +366,12 @@ export async function compileQuery( } }; const conditions = (directives: readonly DirectiveNode[] = []) => - directives.map((directive) => ({ - include: directive.name.value === "include", - value: argument(directive.arguments!.find((entry) => entry.name.value === "if")!.value), - })); + directives + .filter((directive) => directive.name.value !== "live") + .map((directive) => ({ + include: directive.name.value === "include", + value: argument(directive.arguments!.find((entry) => entry.name.value === "if")!.value), + })); const selection = ( set: SelectionSetNode, parent: import("graphql").GraphQLObjectType, @@ -390,6 +404,13 @@ export async function compileQuery( { name: node.name.value, key: node.alias?.value ?? node.name.value, + ...(node.directives?.some((directive) => directive.name.value === "live") + ? { + liveSelectionId: createHash("sha256") + .update(JSON.stringify([node.loc?.source.name, node.loc?.start, contract?.revisionId, member?.id])) + .digest("hex"), + } + : {}), ...(member && contract ? { interfaceRevisionId: contract.revisionId, memberId: member.id } : {}), ...(member?.kind === "relationship" ? { targetInterfaceRevisionId: generated.target(member) } : {}), conditions: [...inherited, ...conditions(node.directives)], @@ -405,6 +426,18 @@ export async function compileQuery( const normalized = print(document), schema = printSchema(generated.schema); const selections = selection(operations[0]!.selectionSet, generated.schema.getQueryType()!); + const checkPresentation = (entries: QuerySelection[]) => { + for (const key of new Set(entries.map((entry) => entry.key))) { + const siblings = entries.filter((entry) => entry.key === key); + if (siblings.some((entry) => entry.liveSelectionId) && siblings.some((entry) => !entry.liveSelectionId)) + throw new QueryCompileError( + "QUERY_LIVE_CONFLICT", + `${key} mixes live and plain selections; use separate aliases`, + ); + checkPresentation(siblings.flatMap((entry) => entry.selection)); + } + }; + checkPresentation(selections); const definitionDigest = createHash("sha256") .update( canonicalJson({ diff --git a/src/query/presentation.ts b/src/query/presentation.ts new file mode 100644 index 0000000..2e9ddb5 --- /dev/null +++ b/src/query/presentation.ts @@ -0,0 +1,58 @@ +import type { InterfaceRevision, ValueType } from "../capability-model/types.js"; +import type { CheckedQuery, QuerySelection } from "./types.js"; + +/** Browser presentation is separate from the portable query value contract. */ +export function queryPresentation(query: CheckedQuery, interfaces: readonly InterfaceRevision[]) { + const result: { + path: string[]; + selectionId: string; + interfaceRevisionId: string; + getOperationId: string; + setOperationId?: string; + watchOperationId?: string; + inputKind: "value" | "fields"; + valueType: ValueType; + conditions: (QuerySelection["conditions"][number] & { defaultValue?: boolean })[]; + }[] = []; + const visit = (type: ValueType, selections: QuerySelection[], path: string[]) => { + if (type.kind === "optional") return visit(type.value, selections, path); + if (type.kind === "list") return visit(type.value, selections, [...path, "*"]); + if (type.kind !== "record") return; + for (const [name, field] of Object.entries(type.fields)) { + const matches = selections.filter((entry) => entry.key === name); + if (matches.some((entry) => entry.liveSelectionId) && matches.some((entry) => !entry.liveSelectionId)) + throw new Error(`QUERY_LIVE_CONFLICT: ${[...path, name].join(".")} mixes live and plain selections`); + for (const entry of matches) { + if (entry.liveSelectionId) { + const iface = interfaces.find((iface) => iface.revisionId === entry.interfaceRevisionId)!; + const member = iface.members.find((member) => member.id === entry.memberId)!; + if (member.kind !== "value") throw new Error("QUERY_LIVE_UNSUPPORTED"); + const get = member.operations.find((op) => op.displayName === "get")!; + const set = member.operations.find((op) => op.displayName === "set"); + result.push({ + path: [...path, name], + selectionId: entry.liveSelectionId, + interfaceRevisionId: iface.revisionId, + getOperationId: get.id, + setOperationId: set?.id, + watchOperationId: member.operations.find((op) => op.displayName === "watch-start")?.id, + inputKind: set?.inputType.kind === "record" ? "fields" : "value", + valueType: get.outputType, + conditions: entry.conditions.map((condition) => { + const fallback = + condition.value.kind === "variable" ? query.variableDefaults[condition.value.name] : undefined; + return { + ...condition, + ...(fallback?.kind === "literal" && typeof fallback.value === "boolean" + ? { defaultValue: fallback.value } + : {}), + }; + }), + }); + } else visit(field, entry.selection, [...path, name]); + } + } + }; + visit(query.output, query.selection, []); + return result; +} diff --git a/src/query/schema.ts b/src/query/schema.ts index 2d3c7d6..d8cbee2 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -10,6 +10,9 @@ import { GraphQLList, GraphQLNonNull, GraphQLSchema, + GraphQLDirective, + DirectiveLocation, + specifiedDirectives, type GraphQLOutputType, type GraphQLInputType, type GraphQLFieldConfigMap, @@ -241,6 +244,7 @@ export function querySchema( return result; }; const schema = new GraphQLSchema({ + directives: [...specifiedDirectives, new GraphQLDirective({ name: "live", locations: [DirectiveLocation.FIELD] })], query: new GraphQLObjectType({ name: "QxQuery", fields: { root: { type: new GraphQLNonNull(object(declaration.root)) } }, diff --git a/src/query/types.ts b/src/query/types.ts index 3f01b79..07aff34 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -98,6 +98,7 @@ export type QueryArgument = | { kind: "list"; values: QueryArgument[] } | { kind: "object"; fields: Record }; export interface QuerySelection { + liveSelectionId?: string; name: string; key: string; interfaceRevisionId?: InterfaceRevisionId; diff --git a/test/fixtures/query-workspace.ts b/test/fixtures/query-workspace.ts index 3582329..91cc26e 100644 --- a/test/fixtures/query-workspace.ts +++ b/test/fixtures/query-workspace.ts @@ -8,7 +8,7 @@ export const queryFixtureSource = { repository: "https://query-fixture.example.test/source.git", commit: "1".repeat(40), }; -export async function queryWorkspaceFixture() { +export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { const interfaces = new Map(); const sources: Record = {}; function iface(name: string, members: string, parameters = "") { @@ -29,7 +29,7 @@ export async function queryWorkspaceFixture() { ` queryable value title id "title" : string {get id "title:get"; set id "title:set";} queryable value done id "done" : bool {get id "done:get";} - queryable value rank id "rank" : int64 {get id "rank:get";} + queryable value rank id "rank" : int64 {get id "rank:get"; set id "rank:set";} queryable relation assignee id "assignee" : optional-one interface PersonFacts {resolve id "assignee:resolve";} queryable rpc value score id "score" : int32 {get id "score:get";} `, @@ -81,7 +81,16 @@ export async function queryWorkspaceFixture() { "score-totals.graphql": `query ScoreTotals {root {_qx {relations {items {aggregate {count sum {score}}}}}}}`, }; pkg.checkedQueries = await Promise.all( - pkg.queries!.map((query) => compileQuery(query, allInterfaces, async (name) => documents[name]!)), + pkg.queries!.map((query) => + compileQuery(query, allInterfaces, async (name) => + options.live + ? documents[name]!.replace(/\btitle\b/g, "title @live").replace( + "title @live rank done", + "title @live rank @live done @live", + ) + : documents[name]!, + ), + ), ); const implementation = (atom: string) => `conform ${atom} as TaskFacts id "${atom}-facts" { private state Title${atom} id "${atom}:title" on ${atom} : string policy crdt(string) default "Untitled"; @@ -92,7 +101,7 @@ export async function queryWorkspaceFixture() { interface PersonFacts projection tasks id "${atom}:assignee:inverse" many; } bind title.get to state Title${atom}.read; - bind title.set to package Queries.titleSet with {title to state Title${atom};}; + ${options.live ? `bind title.set to state Title${atom}.write;` : `bind title.set to package Queries.titleSet with {title to state Title${atom};};`} bind done to state Done${atom}; bind rank to state Rank${atom}; bind assignee.resolve to edge Assignee${atom}.assignee.resolve; bind score.get to package Queries.score query-reason "Explicit bounded score computation"; diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index 89e2267..ca7debf 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -4,6 +4,8 @@ import { compileCapabilityResourceSource } from "../src/capability-language/inde import { compileQuery } from "../src/query/compile.js"; import { QueryCompileError } from "../src/query/types.js"; import { checkQueryTemplate } from "../src/query/templates.js"; +import { queryPresentation } from "../src/query/presentation.js"; +import { querySelectionToWire } from "../src/query/proto.js"; import type { InterfaceRevision } from "../src/capability-model/types.js"; const source = { repository: "https://example.test/queries.git", commit: "a".repeat(40) }; @@ -125,6 +127,48 @@ const document = `query Upcoming($first: Int!, $before: Int64!) { const compile = (query = document, row = "fragment Row on TaskFacts { title due }", clauses = "") => compileQuery(fixture(clauses), [collection, facts], async (name) => (name.endsWith("row.graphql") ? row : query)); +test("live selections preserve aliases, nullable values, fragment conditions and wire identity", async () => { + const checked = await compile( + `query Upcoming($show: Boolean!) {root {items(first: 3) {entries {node {plain: title ...Row @include(if: $show)}}}}}`, + `fragment Row on TaskFacts {label: title @live due @live}`, + ); + const fields = queryPresentation(checked, [collection, facts]); + assert.deepEqual( + fields.map((f) => f.path), + [ + ["root", "items", "entries", "*", "node", "label"], + ["root", "items", "entries", "*", "node", "due"], + ], + ); + assert.equal(fields[0]!.getOperationId, "title:get"); + assert.equal(fields[0]!.setOperationId, undefined); + assert.equal(fields[1]!.valueType.kind, "optional"); + assert.equal(fields[0]!.conditions.length, 1); + assert.ok(JSON.stringify(checked.selection.map(querySelectionToWire)).includes(fields[0]!.selectionId)); + const defaults = await compile( + `query Upcoming($show: Boolean! = true) {root {items(first: 3) {entries {node {...Row @include(if: $show)}}}}}`, + "fragment Row on TaskFacts {title @live}", + ); + assert.equal(queryPresentation(defaults, [collection, facts])[0]!.conditions[0]!.defaultValue, true); +}); + +test("live selections reject RPC getters, synthetic selections and conflicting presentations", async () => { + for (const [selected, code] of [ + ["score @live", "QUERY_LIVE_UNSUPPORTED"], + ["_qx @live {ref}", "QUERY_LIVE_UNSUPPORTED"], + ["title @live title", "QUERY_LIVE_CONFLICT"], + ["title @live(unchecked: true)", "QUERY_VALIDATION"], + ]) + await assert.rejects( + compile( + `query Upcoming {root {items(first: 3) {entries {node {...Row}}}}}`, + `fragment Row on TaskFacts {${selected}}`, + 'allow TaskFacts.score select "bounded";', + ), + (error: unknown) => error instanceof QueryCompileError && error.code === code, + ); +}); + test("query dependency ports resolve exact exports without declaration ordering constraints", () => { const result = compileCapabilityResourceSource( `import interface Tasks; diff --git a/test/react-fields.test.ts b/test/react-fields.test.ts index f83a704..835c3f8 100644 --- a/test/react-fields.test.ts +++ b/test/react-fields.test.ts @@ -7,13 +7,14 @@ import { spawnSync } from "node:child_process"; import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; import { generateReactBindings } from "../src/bindings/react.js"; import { reactPlatformTypes } from "../src/bindings/react-platform.js"; +import { compileQuery } from "../src/query/compile.js"; const source = { repository: "https://example.test/fields.git", commit: "a".repeat(40) }; test("React bindings preserve read-only, writable and nested reference contracts", async (t) => { const iface = compileCapabilityResourceSource( `interface Fields id "fields" revision "fields@1" { - value title id "title" : string { get id "title:get"; set id "title:set"; watch start id "watch" stop id "stop"; } - value summary id "summary" : string { get id "summary:get"; } + queryable value title id "title" : string { get id "title:get"; set id "title:set"; watch start id "watch" stop id "stop"; } + queryable value summary id "summary" : string { get id "summary:get"; } }`, { source }, ); @@ -22,11 +23,19 @@ test("React bindings preserve read-only, writable and nested reference contracts const pkg = compileCapabilityResourceSource( `import interface Fields; package P id "p" revision "p@1" { function props id "props" : unit -> record {fields: interface-ref; caption: string;}; + query Editor id "editor" root Fields document "editor.graphql" operation "Editor" {max rows 1; watch;} }`, { source, environment: { interfaces: new Map([["Fields", iface.resource.revision]]) } }, ); assert.ok(pkg.ok && pkg.resource.kind === "package"); if (!pkg.ok || pkg.resource.kind !== "package") throw new Error("package failed"); + pkg.resource.revision.checkedQueries = [ + await compileQuery( + pkg.resource.revision.queries![0]!, + [iface.resource.revision], + async () => "query Editor {root {title @live summary @live plain: title}}", + ), + ]; const schema = { format: "quixos-bindings", version: 1, @@ -68,7 +77,14 @@ test("React bindings preserve read-only, writable and nested reference contracts path.join(root, "consumer.ts"), `import {useLiveField, tryConform, type ReadableField, type WritableField} from "@quixos/web-studio-react-runtime"; import {reactInterfaces} from "./react-props.gen.js"; -import type {ReactResults} from "./react-props.gen.js"; +import type {ReactResults, QueryResults} from "./react-props.gen.js"; +declare const query: QueryResults["Editor"]; +useLiveField(query.root.title).set("new"); +// @ts-expect-error live query fields retain exact setter types +useLiveField(query.root.title).set(123); +// @ts-expect-error readonly query fields do not acquire a setter +useLiveField(query.root.summary).set("no"); +const plain: string = query.root.plain; async function lookup() { const view = await tryConform("object", reactInterfaces.Fields); if (!view) return; @@ -79,14 +95,14 @@ async function lookup() { await view.call["summary.set"]("no setter"); } declare const props: ReactResults["props"]; -const [title, setTitle] = useLiveField(props.fields.fields.title); -setTitle("new"); +const title = useLiveField(props.fields.fields.title); +title.set("new"); // @ts-expect-error wrong setter value -setTitle(123); +title.set(123); // @ts-expect-error read-only hook has no setter -const [summary, setSummary] = useLiveField(props.fields.fields.summary); -const [manual, write] = useLiveField(props.fields.fields.summary, {write: async (value: string) => {}}); -write("new"); +useLiveField(props.fields.fields.summary).set("no"); +const manual = useLiveField(props.fields.fields.summary, {id: "manual", write: async (value: string) => {}}); +manual.set("new"); const readonly: ReadableField = props.fields.fields.title; // @ts-expect-error read-only does not satisfy writable const writable: WritableField = props.fields.fields.summary; @@ -94,7 +110,7 @@ declare const narrow: WritableField<"only">; // @ts-expect-error writable references are invariant const widened: WritableField = narrow; // @ts-expect-error callbacks must accept the field's type -useLiveField(props.fields.fields.summary, {write: async (value: number) => {}}); +useLiveField(props.fields.fields.summary, {id: "manual", write: async (value: number) => {}}); `, ); const result = spawnSync(