Add checked React field bindings and Web Studio factories

Replace opaque props with checked generic presentation contracts and lazy typed
interface references. Generate readonly/writable field APIs and component checks.

Preserve CRDT editing through explicit resolved getter/setter contracts, binding-
fenced delta RPCs, native watches and replica-aware field adapters. Custom setters
retain semantic writes; storage snapshots never grant write authority. Cover
concurrent edits, lost acknowledgements, readonly contracts and authorization.

Add receiver-free static factory dispatch, state-field binding shorthand, and
conformance-based creation. Migrate TODO, editable scaffolds and authoring guides.
Verify language/codegen, SDK, RPC, browser lifecycle, local scaffolds, production
browser bundling and CRDT persistence with temporary PostgreSQL.
This commit is contained in:
Timothy J. Aveni
2026-09-16 11:25:20 -07:00
parent 0e183516c0
commit 5bb8ee876d
12 changed files with 474 additions and 112 deletions
+171 -4
View File
@@ -1,5 +1,5 @@
import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
import type { CaminoObject, Value } from "../camino/api_pb.js";
import type { CaminoObject, CrdtValue, Value } from "../camino/api_pb.js";
import type { PackageDescriptor } from "./package_pb.js";
import type { CapabilityRef, PackageExportRef } from "./refs_pb.js";
import type { DerivedDependency } from "./runtime_pb.js";
@@ -113,6 +113,30 @@ export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityReque
* Use `create(InvokeCapabilityRequestSchema)` to create a new message.
*/
export declare const InvokeCapabilityRequestSchema: GenMessage<InvokeCapabilityRequest>;
/**
* @generated from message quixos.orch.InvokeClassCapabilityRequest
*/
export type InvokeClassCapabilityRequest = Message<"quixos.orch.InvokeClassCapabilityRequest"> & {
/**
* @generated from field: string conformance_id = 1;
*/
conformanceId: string;
/**
* @generated from field: string operation_id = 2;
*/
operationId: string;
/**
* @generated from field: map<string, camino.Value> input = 3;
*/
input: {
[key: string]: Value;
};
};
/**
* Describes the message quixos.orch.InvokeClassCapabilityRequest.
* Use `create(InvokeClassCapabilityRequestSchema)` to create a new message.
*/
export declare const InvokeClassCapabilityRequestSchema: GenMessage<InvokeClassCapabilityRequest>;
/**
* @generated from message quixos.orch.InvokeCapabilityResponse
*/
@@ -141,12 +165,80 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp
* @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 6;
*/
dependencies: DerivedDependency[];
/**
* @generated from field: quixos.orch.FieldEditing field_editing = 7;
*/
fieldEditing?: FieldEditing | undefined;
};
/**
* Describes the message quixos.orch.InvokeCapabilityResponse.
* Use `create(InvokeCapabilityResponseSchema)` to create a new message.
*/
export declare const InvokeCapabilityResponseSchema: GenMessage<InvokeCapabilityResponse>;
/**
* 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 declare const FieldEditingSchema: GenMessage<FieldEditing>;
/**
* @generated from message quixos.orch.EditCapabilityFieldRequest
*/
export type EditCapabilityFieldRequest = Message<"quixos.orch.EditCapabilityFieldRequest"> & {
/**
* The public getter; setter must belong to the same value member.
*
* @generated from field: quixos.CapabilityRef capability = 1;
*/
capability?: CapabilityRef | undefined;
/**
* @generated from field: string object_id = 2;
*/
objectId: string;
/**
* @generated from field: string setter_operation_id = 3;
*/
setterOperationId: string;
/**
* @generated from field: string binding_digest = 4;
*/
bindingDigest: string;
/**
* @generated from field: camino.CrdtValue update = 5;
*/
update?: CrdtValue | undefined;
/**
* @generated from field: string client_mutation_id = 6;
*/
clientMutationId: string;
};
/**
* Describes the message quixos.orch.EditCapabilityFieldRequest.
* Use `create(EditCapabilityFieldRequestSchema)` to create a new message.
*/
export declare const EditCapabilityFieldRequestSchema: GenMessage<EditCapabilityFieldRequest>;
/**
* @generated from message quixos.orch.WatchCapabilityRequest
*/
@@ -203,6 +295,10 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> &
* @generated from field: bool initial = 7;
*/
initial: boolean;
/**
* @generated from field: quixos.orch.FieldEditing field_editing = 8;
*/
fieldEditing?: FieldEditing | undefined;
};
/**
* Describes the message quixos.orch.WatchCapabilityEvent.
@@ -212,7 +308,14 @@ export declare const WatchCapabilityEventSchema: GenMessage<WatchCapabilityEvent
/**
* @generated from message quixos.orch.GetWorkspaceRequest
*/
export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & {};
export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & {
/**
* Revision polling must not download the entire interface graph.
*
* @generated from field: bool include_interface_contracts = 1;
*/
includeInterfaceContracts: boolean;
};
/**
* Describes the message quixos.orch.GetWorkspaceRequest.
* Use `create(GetWorkspaceRequestSchema)` to create a new message.
@@ -235,8 +338,8 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> &
*/
sourceRootCommit: string;
/**
* Checked constructors whose wire input can be empty. Web Studio intersects
* this with its temporary Createable marker; the marker is not a factory.
* Checked constructors whose wire input can be empty. The create panel uses
* class factory conformances instead of this constructor inventory.
*
* @generated from field: repeated string empty_input_constructible_atom_ids = 4;
*/
@@ -249,12 +352,60 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> &
* @generated from field: repeated quixos.orch.ConstructorInputContract constructor_inputs = 6;
*/
constructorInputs: ConstructorInputContract[];
/**
* Exact closed interface contracts used by checked presentation consumers.
*
* @generated from field: string interfaces_json = 7;
*/
interfacesJson: string;
/**
* @generated from field: repeated quixos.orch.ClassCapability class_capabilities = 8;
*/
classCapabilities: ClassCapability[];
};
/**
* Describes the message quixos.orch.GetWorkspaceResponse.
* Use `create(GetWorkspaceResponseSchema)` to create a new message.
*/
export declare const GetWorkspaceResponseSchema: GenMessage<GetWorkspaceResponse>;
/**
* @generated from message quixos.orch.ClassCapability
*/
export type ClassCapability = Message<"quixos.orch.ClassCapability"> & {
/**
* @generated from field: string conformance_id = 1;
*/
conformanceId: string;
/**
* @generated from field: string atom_id = 2;
*/
atomId: string;
/**
* @generated from field: string interface_revision_id = 3;
*/
interfaceRevisionId: string;
/**
* @generated from field: string definition_id = 4;
*/
definitionId: string;
/**
* @generated from field: string operation_id = 5;
*/
operationId: string;
/**
* @generated from field: string input_type_json = 6;
*/
inputTypeJson: string;
/**
* @generated from field: string output_type_json = 7;
*/
outputTypeJson: string;
};
/**
* Describes the message quixos.orch.ClassCapability.
* Use `create(ClassCapabilitySchema)` to create a new message.
*/
export declare const ClassCapabilitySchema: GenMessage<ClassCapability>;
/**
* @generated from message quixos.orch.CapabilityInputContract
*/
@@ -516,6 +667,22 @@ export declare const OrchestratorRuntime: GenService<{
input: typeof InvokeCapabilityRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.EditCapabilityField
*/
editCapabilityField: {
methodKind: "unary";
input: typeof EditCapabilityFieldRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.InvokeClassCapability
*/
invokeClassCapability: {
methodKind: "unary";
input: typeof InvokeClassCapabilityRequestSchema;
output: typeof InvokeCapabilityResponseSchema;
};
/**
* @generated from rpc quixos.orch.OrchestratorRuntime.WatchCapability
*/
+1 -1
View File
File diff suppressed because one or more lines are too long
+39 -19
View File
File diff suppressed because one or more lines are too long