@obversa/api 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@obversa/api",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Shared contracts and validation for Obversa engines, memory, graphs, and storage.",
5
5
  "author": "Jonny Neill <jonnyneill@hotmail.com>",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/action-decision.ts","../src/callback/gate.ts","../src/callback/approval.ts"],"names":["createHash"],"mappings":"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","file":"chunk-6NAMCSPJ.js","sourcesContent":["import { cloneFrozenJson, type JsonObject, type JsonValue } from './json.js';\n\nconst CONTROL_CHARACTER = /[\\u0000-\\u001f\\u007f]/u;\nfunction text(value: unknown, field: string): string {\n if (\n typeof value !== 'string' ||\n value.length === 0 ||\n value !== value.trim() ||\n CONTROL_CHARACTER.test(value)\n ) {\n throw new TypeError(\n `${field} must be a non-empty trimmed string without control characters`,\n );\n }\n cloneFrozenJson(value);\n return value;\n}\n\nexport interface AllowActionDecision extends JsonObject {\n readonly kind: 'allow';\n}\n\nexport interface WaitActionDecision extends JsonObject {\n readonly kind: 'wait';\n readonly reason: string;\n readonly request: JsonValue;\n}\n\nexport interface DenyActionDecision extends JsonObject {\n readonly kind: 'deny';\n readonly reason: string;\n}\n\nexport type ActionDecision =\n | AllowActionDecision\n | WaitActionDecision\n | DenyActionDecision;\n\nexport function validateActionDecision(value: ActionDecision): ActionDecision {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new TypeError('action decision must be an object');\n }\n if (value.kind === 'allow') {\n if (Object.keys(value).length !== 1) {\n throw new TypeError('allow action decision has unknown fields');\n }\n return cloneFrozenJson({ kind: 'allow' });\n }\n if (value.kind === 'wait') {\n if (\n Object.keys(value).length !== 3 ||\n !Object.hasOwn(value, 'reason') ||\n !Object.hasOwn(value, 'request')\n ) {\n throw new TypeError('wait action decision has missing or unknown fields');\n }\n return cloneFrozenJson({\n kind: 'wait',\n reason: text(value.reason, 'action wait reason'),\n request: cloneFrozenJson(value.request),\n });\n }\n if (value.kind === 'deny') {\n if (Object.keys(value).length !== 2 || !Object.hasOwn(value, 'reason')) {\n throw new TypeError('deny action decision has missing or unknown fields');\n }\n return cloneFrozenJson({\n kind: 'deny',\n reason: text(value.reason, 'action deny reason'),\n });\n }\n throw new TypeError('action decision kind must be allow, wait, or deny');\n}\n","/**\n * The Callback Gate (roadmap D7): a question the run asks and waits for,\n * answered through a replaceable router. The runtime stores the durable\n * request and its assignment; an external router claims the request,\n * submits a structured response, and the runtime validates and records it.\n *\n * The request digest covers the gate version, the decision text, the\n * response schema, and the referenced input bytes. Display-only data —\n * placement, layout, theme, and other presentation or routing hints — is\n * stored in the request payload but excluded from the digest, so\n * restyling a question never invalidates a pending answer, and changing\n * what is asked always does.\n */\n\nimport { createHash } from 'node:crypto';\n\nimport {\n canonicalJson,\n cloneFrozenJson,\n type JsonObject,\n type JsonValue,\n} from '../json.js';\n\nexport interface CallbackGateDefinition {\n readonly gateId: string;\n readonly gateVersion: number;\n /** The question the run is asking, in plain text. */\n readonly decisionText: string;\n /** The shape a valid answer takes. */\n readonly responseSchema: JsonObject;\n /** The input bytes the decision refers to. */\n readonly input: JsonValue;\n /** Presentation and routing hints: stored, never digested. */\n readonly presentation?: JsonObject;\n}\n\nexport interface CallbackRequest extends JsonObject {\n readonly requestId: string;\n readonly gateId: string;\n readonly gateVersion: number;\n readonly digest: string;\n readonly decisionText: string;\n readonly responseSchema: JsonObject;\n readonly input: JsonValue;\n readonly presentation: JsonObject;\n}\n\nconst REQUEST_FIELDS = [\n 'decisionText',\n 'digest',\n 'gateId',\n 'gateVersion',\n 'input',\n 'presentation',\n 'requestId',\n 'responseSchema',\n] as const;\n\nfunction digestOf(definition: CallbackGateDefinition): string {\n return createHash('sha256').update(canonicalJson({\n gateId: definition.gateId,\n gateVersion: definition.gateVersion,\n decisionText: definition.decisionText,\n responseSchema: definition.responseSchema,\n input: definition.input,\n } as JsonValue)).digest('hex');\n}\n\n/** Create the gate's request. Same definition bytes, same digest. */\nexport function createCallbackGate(\n definition: CallbackGateDefinition,\n): CallbackRequest {\n if (typeof definition.gateId !== 'string' || definition.gateId.length === 0) {\n throw new Error('a callback gate needs a gateId');\n }\n if (!Number.isSafeInteger(definition.gateVersion) || definition.gateVersion < 1) {\n throw new Error('a callback gate needs a positive gateVersion');\n }\n if (typeof definition.decisionText !== 'string' || definition.decisionText.length === 0) {\n throw new Error('a callback gate needs decision text');\n }\n const fixed = cloneFrozenJson({\n gateId: definition.gateId,\n gateVersion: definition.gateVersion,\n decisionText: definition.decisionText,\n responseSchema: definition.responseSchema,\n input: definition.input,\n presentation: definition.presentation ?? {},\n }) as unknown as CallbackGateDefinition;\n const digest = digestOf(fixed);\n return cloneFrozenJson({\n requestId: `${fixed.gateId}#${fixed.gateVersion}#${digest}`,\n gateId: fixed.gateId,\n gateVersion: fixed.gateVersion,\n digest,\n decisionText: fixed.decisionText,\n responseSchema: fixed.responseSchema,\n input: fixed.input,\n presentation: fixed.presentation ?? {},\n }) as CallbackRequest;\n}\n\n/** The digest a gate definition produces, without creating a request. */\nexport function callbackRequestDigest(\n definition: Omit<CallbackGateDefinition, 'presentation'>,\n): string {\n return digestOf({ ...definition, presentation: {} } as CallbackGateDefinition);\n}\n\n/** Validate stored request bytes and their content-derived identity. */\nexport function validateCallbackRequest(value: unknown): CallbackRequest {\n const stored = cloneFrozenJson(value as JsonValue);\n if (stored === null || typeof stored !== 'object' || Array.isArray(stored)) {\n throw new TypeError('a stored callback request must be an object');\n }\n const record = stored as JsonObject;\n const fields = Object.keys(record).sort();\n if (fields.length !== REQUEST_FIELDS.length\n || fields.some((field, index) => field !== REQUEST_FIELDS[index])) {\n throw new TypeError('a stored callback request has missing or unknown fields');\n }\n if (typeof record.gateId !== 'string'\n || typeof record.gateVersion !== 'number'\n || typeof record.decisionText !== 'string'\n || record.responseSchema === null\n || typeof record.responseSchema !== 'object'\n || Array.isArray(record.responseSchema)\n || record.presentation === null\n || typeof record.presentation !== 'object'\n || Array.isArray(record.presentation)) {\n throw new TypeError('a stored callback request has invalid fields');\n }\n const rebuilt = createCallbackGate({\n gateId: record.gateId,\n gateVersion: record.gateVersion,\n decisionText: record.decisionText,\n responseSchema: record.responseSchema as JsonObject,\n input: record.input as JsonValue,\n presentation: record.presentation as JsonObject,\n });\n if (canonicalJson(stored) !== canonicalJson(rebuilt)) {\n throw new TypeError('stored callback request bytes do not match its identity');\n }\n return stored as CallbackRequest;\n}\n\nfunction hasJsonType(value: unknown, type: unknown): boolean {\n switch (type) {\n case 'array': return Array.isArray(value);\n case 'object': return typeof value === 'object' && value !== null && !Array.isArray(value);\n case 'null': return value === null;\n case 'integer': return typeof value === 'number' && Number.isInteger(value);\n case 'number': return typeof value === 'number';\n case 'string': return typeof value === 'string';\n case 'boolean': return typeof value === 'boolean';\n default: return false;\n }\n}\n\n/** Validate a response object against a response schema's plain shape. */\nexport function validateCallbackResponse(\n response: JsonValue,\n schema: JsonObject,\n): { ok: true } | { ok: false; reason: string } {\n if (typeof response !== 'object' || response === null || Array.isArray(response)) {\n return { ok: false, reason: 'a callback response must be an object' };\n }\n const record = response as Record<string, unknown>;\n const properties = schema.properties;\n if (properties !== undefined\n && (typeof properties !== 'object' || properties === null || Array.isArray(properties))) {\n return { ok: false, reason: 'the response schema properties must be an object' };\n }\n const required = schema.required;\n if (required !== undefined) {\n if (!Array.isArray(required)) {\n return { ok: false, reason: 'the response schema required list must be an array' };\n }\n for (const key of required) {\n if (typeof key !== 'string' || !Object.hasOwn(record, key)) {\n return { ok: false, reason: `the response is missing the required field \"${String(key)}\"` };\n }\n }\n }\n if (properties !== undefined) {\n const fields = properties as Record<string, unknown>;\n for (const [key, field] of Object.entries(record)) {\n const declared = fields[key];\n if (declared === undefined) continue;\n if (typeof declared !== 'object' || declared === null || Array.isArray(declared)) {\n return { ok: false, reason: `the schema field \"${key}\" must be an object` };\n }\n const expected = (declared as { type?: unknown }).type;\n if (expected === undefined) continue;\n const allowed = Array.isArray(expected) ? expected : [expected];\n if (!allowed.some((type) => hasJsonType(field, type))) {\n return { ok: false, reason: `the response field \"${key}\" must be ${String(expected)}` };\n }\n }\n }\n return { ok: true };\n}\n","import { createHash } from 'node:crypto';\nimport { validateArtifactReference } from '../artifacts/store.js';\nimport type { NewDomainEvent } from '../events/envelope.js';\nimport type { PermissionDescriptor } from '../graph-plan.js';\nimport { canonicalJson, cloneFrozenJson, digestJson, type JsonObject, type JsonValue, type Sha256Digest } from '../json.js';\nimport { validateActionDecision, type ActionDecision } from '../action-decision.js';\nimport type { WorkspaceAnchor } from '../workspace/provider.js';\nimport type { AcceptedResultGraph } from '../proof/acceptance.js';\nimport type { ProofArtifactReference } from '../proof/artifact.js';\nimport type { CallbackEvent } from './client-contract.js';\nimport { callbackRequestDigest, createCallbackGate, type CallbackGateDefinition, type CallbackRequest } from './gate.js';\n\nexport type ApprovalSubmission = Extract<\n CallbackEvent,\n { readonly kind: 'callback-submitted' }\n>;\n\nexport interface ApprovalSubjectInput {\n readonly workspaceAnchor: WorkspaceAnchor | null;\n readonly inputArtifactHashes: Readonly<Record<string, Sha256Digest>>;\n readonly proofScope: JsonObject;\n readonly proofArtifact: ProofArtifactReference;\n readonly proposedOutput: Uint8Array;\n readonly effectivePermissions: readonly PermissionDescriptor[];\n}\n\nexport interface ApprovalResolutionInput extends ApprovalSubjectInput {\n readonly request: CallbackRequest;\n}\n\nexport interface ApprovalSubject extends JsonObject {\n readonly workspaceAnchor: WorkspaceAnchor | null;\n readonly inputArtifactHashes: Readonly<Record<string, Sha256Digest>>;\n readonly proofScope: JsonObject;\n readonly proofArtifact: ProofArtifactReference;\n readonly proposedOutputDigest: Sha256Digest;\n readonly effectivePermissions: readonly JsonObject[];\n}\n\nexport interface ApprovalBinding extends JsonObject {\n readonly requestId: string;\n readonly requestDigest: string;\n readonly planDigest: Sha256Digest;\n readonly graph: AcceptedResultGraph;\n readonly workspaceAnchor: WorkspaceAnchor | null;\n readonly inputArtifactHashes: Readonly<Record<string, Sha256Digest>>;\n readonly proofScope: JsonObject;\n readonly proofArtifact: ProofArtifactReference;\n readonly proposedOutputDigest: Sha256Digest;\n readonly actor: JsonObject;\n readonly responsePath: string;\n readonly decision: ActionDecision;\n readonly effectivePermissions: readonly JsonObject[];\n}\n\nexport interface ApprovalRecord extends JsonObject {\n readonly schemaVersion: 1;\n readonly binding: ApprovalBinding;\n readonly bindingDigest: Sha256Digest;\n}\n\nexport interface ApprovalEventPayload extends JsonObject {\n readonly requestId: string;\n readonly record: ApprovalRecord;\n}\n\nexport type NewApprovalEvent = NewDomainEvent<\n 'callback:approval-recorded',\n 1,\n ApprovalEventPayload\n>;\n\nexport class ApprovalSubjectError extends Error {\n readonly code = 'SUBJECT_MISMATCH' as const;\n\n constructor(message: string) {\n super(message);\n this.name = 'ApprovalSubjectError';\n }\n}\n\nconst SHA256_DIGEST = /^sha256:[0-9a-f]{64}$/u;\nconst CALLBACK_DIGEST = /^[0-9a-f]{64}$/u;\n\nexport function isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function hasExactFields(value: JsonObject, fields: readonly string[]): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...fields].sort();\n return actual.length === expected.length\n && actual.every((field, index) => field === expected[index]);\n}\n\nfunction isDigest(value: JsonValue | undefined): value is Sha256Digest {\n return typeof value === 'string' && SHA256_DIGEST.test(value);\n}\n\nfunction proposedOutputDigest(bytes: Uint8Array): Sha256Digest {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\nexport function snapshotApprovalSubject(input: ApprovalSubjectInput): ApprovalSubject {\n const subject = cloneFrozenJson({\n workspaceAnchor: input.workspaceAnchor,\n inputArtifactHashes: input.inputArtifactHashes,\n proofScope: input.proofScope,\n proofArtifact: input.proofArtifact,\n proposedOutputDigest: proposedOutputDigest(Uint8Array.from(input.proposedOutput)),\n effectivePermissions: input.effectivePermissions.map((permission) => ({\n name: permission.name,\n scope: permission.scope,\n })),\n } as JsonValue);\n return validateApprovalSubject(subject);\n}\n\nexport function approvalSubjectDigest(input: ApprovalSubjectInput): Sha256Digest {\n return digestJson(snapshotApprovalSubject(input));\n}\n\nexport function createApprovalCallbackGate(\n definition: CallbackGateDefinition,\n subject: ApprovalSubjectInput,\n): CallbackRequest {\n if (!isObject(definition.input)) {\n throw new TypeError('an approval callback gate needs object input');\n }\n // The request identity is fixed before post, so this digest must be part of\n // the input bytes or changed approval bytes could leave an answered request.\n return createCallbackGate({\n ...definition,\n input: {\n ...definition.input,\n approvalSubjectDigest: approvalSubjectDigest(subject),\n },\n });\n}\n\nfunction requestDigest(request: CallbackRequest): string {\n return callbackRequestDigest({\n gateId: request.gateId,\n gateVersion: request.gateVersion,\n decisionText: request.decisionText,\n responseSchema: request.responseSchema,\n input: request.input,\n });\n}\n\nexport function validateApprovalSubject(value: unknown): ApprovalSubject {\n const subject = cloneFrozenJson(value as JsonValue);\n if (!isObject(subject)\n || !hasExactFields(subject, [\n 'workspaceAnchor',\n 'inputArtifactHashes',\n 'proofScope',\n 'proofArtifact',\n 'proposedOutputDigest',\n 'effectivePermissions',\n ])\n || (subject.workspaceAnchor !== null && !isObject(subject.workspaceAnchor))\n || !isObject(subject.inputArtifactHashes)\n || Object.values(subject.inputArtifactHashes).some((hash) => !isDigest(hash))\n || !isObject(subject.proofScope)\n || !isObject(subject.proofArtifact)\n || !isDigest(subject.proposedOutputDigest)\n || !Array.isArray(subject.effectivePermissions)\n || subject.effectivePermissions.some((permission) => (\n !isObject(permission)\n || !hasExactFields(permission, ['name', 'scope'])\n || typeof permission.name !== 'string'\n || permission.name.length === 0\n ))) {\n throw new TypeError('invalid approval subject');\n }\n const proofArtifact = validateArtifactReference(subject.proofArtifact);\n if (proofArtifact.purpose !== 'proof-packet') {\n throw new TypeError('approval needs a proof-packet artifact');\n }\n return subject as ApprovalSubject;\n}\n\nexport function assertApprovalPermissionsAdmitted(\n subject: ApprovalSubject,\n admitted: readonly PermissionDescriptor[],\n): void {\n for (const permission of subject.effectivePermissions) {\n if (!admitted.some((grant) => (\n grant.name === permission.name\n && canonicalJson(grant.scope) === canonicalJson(permission.scope as JsonValue)\n ))) {\n throw new ApprovalSubjectError(\n `Approval permission \"${permission.name}\" is outside the stored plan admission.`,\n );\n }\n }\n}\n\nexport interface StoredApprovalBindingInput {\n readonly request: CallbackRequest;\n readonly planDigest: Sha256Digest;\n readonly graph: AcceptedResultGraph;\n readonly subject: ApprovalSubject;\n readonly actor: JsonObject;\n readonly responsePath: string;\n}\n\nexport function bindingFromSubject(\n input: StoredApprovalBindingInput,\n decision: ActionDecision,\n): ApprovalBinding {\n const digest = requestDigest(input.request);\n if (input.request.digest !== digest\n || input.request.requestId !== `${input.request.gateId}#${input.request.gateVersion}#${digest}`) {\n throw new TypeError('callback request bytes do not match its identity');\n }\n if (input.responsePath.length === 0) {\n throw new TypeError('approval response path must not be empty');\n }\n return cloneFrozenJson({\n requestId: input.request.requestId,\n requestDigest: digest,\n planDigest: input.planDigest,\n graph: input.graph,\n workspaceAnchor: input.subject.workspaceAnchor,\n inputArtifactHashes: input.subject.inputArtifactHashes,\n proofScope: input.subject.proofScope,\n proofArtifact: input.subject.proofArtifact,\n proposedOutputDigest: input.subject.proposedOutputDigest,\n actor: input.actor,\n responsePath: input.responsePath,\n decision,\n effectivePermissions: input.subject.effectivePermissions,\n } as JsonValue) as ApprovalBinding;\n}\n\nexport function validateApprovalRecord(value: unknown): ApprovalRecord {\n const record = cloneFrozenJson(value as JsonValue);\n if (!isObject(record)) {\n throw new TypeError('invalid approval record');\n }\n const { binding } = record;\n if (!hasExactFields(record, ['schemaVersion', 'binding', 'bindingDigest'])\n || record.schemaVersion !== 1\n || !isObject(binding)\n || !isDigest(record.bindingDigest)) {\n throw new TypeError('invalid approval record');\n }\n if (!hasExactFields(binding, [\n 'requestId',\n 'requestDigest',\n 'planDigest',\n 'graph',\n 'workspaceAnchor',\n 'inputArtifactHashes',\n 'proofScope',\n 'proofArtifact',\n 'proposedOutputDigest',\n 'actor',\n 'responsePath',\n 'decision',\n 'effectivePermissions',\n ])\n || typeof binding.requestId !== 'string'\n || binding.requestId.length === 0\n || typeof binding.requestDigest !== 'string'\n || !CALLBACK_DIGEST.test(binding.requestDigest)\n || !isDigest(binding.planDigest)\n || !isObject(binding.graph)\n || !hasExactFields(binding.graph, ['definitionDigest', 'typeVersion'])\n || !isDigest(binding.graph.definitionDigest)\n || typeof binding.graph.typeVersion !== 'number'\n || !Number.isSafeInteger(binding.graph.typeVersion)\n || binding.graph.typeVersion < 1\n || (binding.workspaceAnchor !== null && !isObject(binding.workspaceAnchor))\n || !isObject(binding.inputArtifactHashes)\n || Object.values(binding.inputArtifactHashes).some((hash) => !isDigest(hash))\n || !isObject(binding.proofScope)\n || !isObject(binding.proofArtifact)\n || !isDigest(binding.proposedOutputDigest)\n || !isObject(binding.actor)\n || typeof binding.responsePath !== 'string'\n || binding.responsePath.length === 0\n || !isObject(binding.decision)\n || !Array.isArray(binding.effectivePermissions)\n || binding.effectivePermissions.some((permission) => (\n !isObject(permission)\n || !hasExactFields(permission, ['name', 'scope'])\n || typeof permission.name !== 'string'\n || permission.name.length === 0\n ))\n || record.bindingDigest !== digestJson(binding)) {\n throw new TypeError('invalid approval binding');\n }\n const proofArtifact = validateArtifactReference(binding.proofArtifact);\n if (proofArtifact.purpose !== 'proof-packet') {\n throw new TypeError('approval needs a proof-packet artifact');\n }\n validateActionDecision(binding.decision as ActionDecision);\n return record as ApprovalRecord;\n}\n\nexport interface PrepareApprovalRecordInput extends StoredApprovalBindingInput {\n readonly submission: ApprovalSubmission;\n}\n"]}