@obversa/runtime 0.1.0

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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/api.d.ts +72 -0
  4. package/dist/api.js +9775 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/artifacts/conformance.d.ts +1 -0
  7. package/dist/artifacts/file-store.d.ts +8 -0
  8. package/dist/artifacts/store.d.ts +1 -0
  9. package/dist/callback/approval.d.ts +8 -0
  10. package/dist/callback/client.d.ts +38 -0
  11. package/dist/callback/gate.d.ts +1 -0
  12. package/dist/callback/stored-client.d.ts +5 -0
  13. package/dist/chunk-3L6YNPN6.js +3 -0
  14. package/dist/chunk-3L6YNPN6.js.map +1 -0
  15. package/dist/chunk-5GLEABOU.js +3 -0
  16. package/dist/chunk-5GLEABOU.js.map +1 -0
  17. package/dist/chunk-DEW5R23M.js +338 -0
  18. package/dist/chunk-DEW5R23M.js.map +1 -0
  19. package/dist/chunk-DV5P4QLI.js +3056 -0
  20. package/dist/chunk-DV5P4QLI.js.map +1 -0
  21. package/dist/chunk-NIBHM5I5.js +34 -0
  22. package/dist/chunk-NIBHM5I5.js.map +1 -0
  23. package/dist/chunk-RZLMX3IA.js +368 -0
  24. package/dist/chunk-RZLMX3IA.js.map +1 -0
  25. package/dist/core/agent-md.d.ts +36 -0
  26. package/dist/core/agent.d.ts +86 -0
  27. package/dist/core/approval-job.d.ts +43 -0
  28. package/dist/core/assert-graph.d.ts +34 -0
  29. package/dist/core/budget.d.ts +49 -0
  30. package/dist/core/concurrency.d.ts +2 -0
  31. package/dist/core/condition.d.ts +209 -0
  32. package/dist/core/context.d.ts +36 -0
  33. package/dist/core/cost.d.ts +59 -0
  34. package/dist/core/dag.d.ts +20 -0
  35. package/dist/core/decision.d.ts +29 -0
  36. package/dist/core/describe.d.ts +56 -0
  37. package/dist/core/engine-meta.d.ts +5 -0
  38. package/dist/core/env-overlay.d.ts +35 -0
  39. package/dist/core/errors.d.ts +46 -0
  40. package/dist/core/feedback.d.ts +68 -0
  41. package/dist/core/git.d.ts +152 -0
  42. package/dist/core/guards.d.ts +70 -0
  43. package/dist/core/isolated.d.ts +40 -0
  44. package/dist/core/job.d.ts +134 -0
  45. package/dist/core/limits.d.ts +22 -0
  46. package/dist/core/loop.d.ts +24 -0
  47. package/dist/core/merge.d.ts +30 -0
  48. package/dist/core/pipeline.d.ts +35 -0
  49. package/dist/core/process.d.ts +11 -0
  50. package/dist/core/progress.d.ts +82 -0
  51. package/dist/core/redact.d.ts +1 -0
  52. package/dist/core/stats.d.ts +63 -0
  53. package/dist/core/team.d.ts +34 -0
  54. package/dist/core/text.d.ts +8 -0
  55. package/dist/core/tournament.d.ts +25 -0
  56. package/dist/core/types.d.ts +650 -0
  57. package/dist/engines/command-runner.d.ts +1 -0
  58. package/dist/engines/conformance.d.ts +1 -0
  59. package/dist/engines/engine.d.ts +4 -0
  60. package/dist/engines/failure.d.ts +1 -0
  61. package/dist/engines/fallback.d.ts +35 -0
  62. package/dist/engines/message-map.d.ts +1 -0
  63. package/dist/engines/mock.d.ts +1 -0
  64. package/dist/engines/preflight.d.ts +36 -0
  65. package/dist/env/command.d.ts +50 -0
  66. package/dist/env/command.js +65 -0
  67. package/dist/env/command.js.map +1 -0
  68. package/dist/env/environment.d.ts +4 -0
  69. package/dist/env/mock.d.ts +24 -0
  70. package/dist/events/conformance.d.ts +1 -0
  71. package/dist/events/envelope.d.ts +1 -0
  72. package/dist/events/jsonl-store.d.ts +8 -0
  73. package/dist/events/store.d.ts +1 -0
  74. package/dist/graph/commands.d.ts +5 -0
  75. package/dist/graph/conformance.d.ts +32 -0
  76. package/dist/graph/kernel.d.ts +5 -0
  77. package/dist/graph/plan.d.ts +1 -0
  78. package/dist/graph/type.d.ts +7 -0
  79. package/dist/graph/value.d.ts +1 -0
  80. package/dist/graph-types/dag.d.ts +137 -0
  81. package/dist/graph-types/loop.d.ts +194 -0
  82. package/dist/graph-types/team.d.ts +68 -0
  83. package/dist/memory.d.ts +82 -0
  84. package/dist/memory.js +397 -0
  85. package/dist/memory.js.map +1 -0
  86. package/dist/proof/acceptance.d.ts +5 -0
  87. package/dist/proof/artifact.d.ts +6 -0
  88. package/dist/proof/cache.d.ts +4 -0
  89. package/dist/runtime/attempt.d.ts +19 -0
  90. package/dist/runtime/budget.d.ts +4 -0
  91. package/dist/runtime/engine-availability.d.ts +18 -0
  92. package/dist/runtime/graph-executor.d.ts +7 -0
  93. package/dist/runtime/monitor.d.ts +80 -0
  94. package/dist/runtime/node-lifecycle.d.ts +84 -0
  95. package/dist/runtime/paths.d.ts +2 -0
  96. package/dist/runtime/persist.d.ts +31 -0
  97. package/dist/runtime/preflight-record.d.ts +149 -0
  98. package/dist/runtime/process-tree.d.ts +1 -0
  99. package/dist/runtime/result-contract.d.ts +4 -0
  100. package/dist/runtime/result-parts.d.ts +1 -0
  101. package/dist/runtime/run-definition.d.ts +24 -0
  102. package/dist/runtime/run-event.d.ts +9 -0
  103. package/dist/runtime/runner.d.ts +139 -0
  104. package/dist/runtime/supervisor.d.ts +111 -0
  105. package/dist/runtime/team-rooms.d.ts +13 -0
  106. package/dist/runtime/workspace-policy.d.ts +25 -0
  107. package/dist/storage/error.d.ts +1 -0
  108. package/dist/storage/id.d.ts +1 -0
  109. package/dist/storage/local.d.ts +12 -0
  110. package/dist/storage/local.js +1492 -0
  111. package/dist/storage/local.js.map +1 -0
  112. package/dist/testing.d.ts +15 -0
  113. package/dist/testing.js +274 -0
  114. package/dist/testing.js.map +1 -0
  115. package/dist/workflow-agent-response.d.ts +3 -0
  116. package/dist/workflow-support.d.ts +36 -0
  117. package/dist/workflow-support.js +5 -0
  118. package/dist/workflow-support.js.map +1 -0
  119. package/dist/workflow.d.ts +73 -0
  120. package/dist/workspace/conformance.d.ts +1 -0
  121. package/dist/workspace/git-provider.d.ts +26 -0
  122. package/dist/workspace/provider.d.ts +2 -0
  123. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/artifacts/file-store.ts","../../src/events/jsonl-store.ts","../../src/storage/local.ts"],"names":["entry","text","TextDecoder","storageError","resolve","existingDirectory","lstat","mkdir","join","createHash","readBoundedFile","open","constants","readdir","syncDirectory","randomUUID","link","unlink"],"mappings":"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","file":"local.js","sourcesContent":["import { constants } from 'node:fs';\nimport {\n link,\n lstat,\n mkdir,\n open,\n readdir,\n rm,\n unlink,\n type FileHandle,\n} from 'node:fs/promises';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { resolve, join } from 'node:path';\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { StorageError } from '../storage/error.js';\nimport { cloneFrozenJson } from '../graph/value.js';\nimport type { JsonObject, JsonValue, Sha256Digest } from '../graph/value.js';\nimport {\n validateArtifactReference,\n validateArtifactScope,\n validateNewArtifact,\n type ArtifactReference,\n type ArtifactBatch,\n type ArtifactScope,\n type ArtifactStore,\n type NewArtifact,\n} from './store.js';\n\nexport interface LocalArtifactStoreOptions {\n readonly root: string;\n readonly maxArtifactBytes?: number;\n readonly maxTotalArtifactBytesPerRun?: number;\n readonly knownSecrets?: readonly string[];\n}\n\ninterface Limits {\n readonly maxArtifactBytes: number;\n readonly maxTotalArtifactBytesPerRun: number;\n}\n\ninterface LedgerEntry {\n readonly schemaVersion: 1;\n readonly revision: number;\n readonly limits: Limits;\n readonly policyDigest: Sha256Digest;\n readonly reference: ArtifactReference;\n readonly checksum: Sha256Digest;\n}\n\ntype NewLedgerEntry = Omit<LedgerEntry, 'checksum'>;\n\ninterface PreparedArtifact {\n readonly bytes: Uint8Array;\n readonly reference: ArtifactReference;\n}\n\ninterface RunPaths {\n readonly run: string;\n readonly blobs: string;\n readonly admissions: string;\n}\n\nconst DEFAULT_LIMITS: Limits = {\n maxArtifactBytes: 1_048_576,\n maxTotalArtifactBytesPerRun: 16_777_216,\n};\nconst ADMISSION_FILE = /^(\\d{16})\\.json$/u;\nconst MAX_ADMISSION_RECORD_BYTES = 4_096;\nconst MAX_ADMISSION_RETRIES = 1_000;\nconst SHA256_DIGEST = /^sha256:[0-9a-f]{64}$/u;\nconst CONTENT_POLICY_RULES = Object.freeze({\n exact: 'reject-known-secret-bytes-v1',\n stateJson: 'parse-json-and-reject-known-secret-bytes-keys-values-v1',\n stateOther: 'reject-known-secret-bytes-v1',\n freeText: 'redact-known-secrets-then-reject-known-secret-output-v1',\n});\nconst decoder = new TextDecoder('utf-8', { fatal: true });\nconst encoder = new TextEncoder();\n\nfunction isJsonMediaType(mediaType: string): boolean {\n const value = mediaType.toLowerCase();\n return value === 'application/json'\n || (\n value.startsWith('application/')\n && value.endsWith('+json')\n && value.length > 'application/+json'.length\n );\n}\n\nfunction storageError(\n code: StorageError['code'],\n message: string,\n details: JsonObject = {},\n): StorageError {\n return new StorageError(code, message, details);\n}\n\nfunction nodeCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error\n ? String(error.code)\n : undefined;\n}\n\nfunction digest(bytes: Uint8Array): Sha256Digest {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\nfunction artifactPolicyDigest(\n limits: Limits,\n): Sha256Digest {\n return digest(Buffer.from(JSON.stringify({\n schemaVersion: 1,\n limits: {\n maxArtifactBytes: limits.maxArtifactBytes,\n maxTotalArtifactBytesPerRun: limits.maxTotalArtifactBytesPerRun,\n },\n contentModeRules: CONTENT_POLICY_RULES,\n }), 'utf8'));\n}\n\nfunction admissionChecksum(entry: NewLedgerEntry): Sha256Digest {\n return digest(Buffer.from(JSON.stringify({\n schemaVersion: entry.schemaVersion,\n revision: entry.revision,\n limits: {\n maxArtifactBytes: entry.limits.maxArtifactBytes,\n maxTotalArtifactBytesPerRun: entry.limits.maxTotalArtifactBytesPerRun,\n },\n policyDigest: entry.policyDigest,\n reference: {\n schemaVersion: entry.reference.schemaVersion,\n digest: entry.reference.digest,\n byteLength: entry.reference.byteLength,\n mediaType: entry.reference.mediaType,\n purpose: entry.reference.purpose,\n },\n }), 'utf8'));\n}\n\nfunction admissionRecord(entry: NewLedgerEntry): LedgerEntry {\n return Object.freeze({\n schemaVersion: 1,\n revision: entry.revision,\n limits: Object.freeze({ ...entry.limits }),\n policyDigest: entry.policyDigest,\n reference: entry.reference,\n checksum: admissionChecksum(entry),\n });\n}\n\nfunction containsKnownSecret(\n bytes: Uint8Array,\n knownSecrets: readonly string[],\n): boolean {\n const buffer = Buffer.from(bytes);\n return knownSecrets.some((value) => buffer.includes(Buffer.from(value, 'utf8')));\n}\n\nfunction assertSecretFree(\n bytes: Uint8Array,\n knownSecrets: readonly string[],\n message: string,\n): void {\n if (containsKnownSecret(bytes, knownSecrets)) {\n throw storageError('KNOWN_SECRET', message);\n }\n}\n\nfunction screenedAdmissionBytes(\n entry: NewLedgerEntry,\n knownSecrets: readonly string[],\n): Buffer {\n const record = admissionRecord(entry);\n for (const value of [\n record.policyDigest,\n record.checksum,\n record.reference.digest,\n record.reference.mediaType,\n record.reference.purpose,\n ]) {\n assertSecretFree(\n Buffer.from(value, 'utf8'),\n knownSecrets,\n 'Artifact admission metadata contains a known secret.',\n );\n }\n const bytes = Buffer.from(JSON.stringify(record), 'utf8');\n assertSecretFree(\n bytes,\n knownSecrets,\n 'Artifact admission metadata contains a known secret.',\n );\n return bytes;\n}\n\nfunction jsonContainsKnownSecret(\n value: JsonValue,\n knownSecrets: readonly string[],\n): boolean {\n if (typeof value === 'string') {\n return containsKnownSecret(Buffer.from(value, 'utf8'), knownSecrets);\n }\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) {\n return value.some((item) => jsonContainsKnownSecret(item, knownSecrets));\n }\n return Object.entries(value).some(([key, item]) =>\n containsKnownSecret(Buffer.from(key, 'utf8'), knownSecrets)\n || jsonContainsKnownSecret(item, knownSecrets));\n}\n\nfunction hashedPathPart(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex');\n}\n\nfunction validateLimits(options: LocalArtifactStoreOptions): Limits {\n const limits = {\n maxArtifactBytes: options.maxArtifactBytes ?? DEFAULT_LIMITS.maxArtifactBytes,\n maxTotalArtifactBytesPerRun:\n options.maxTotalArtifactBytesPerRun\n ?? DEFAULT_LIMITS.maxTotalArtifactBytesPerRun,\n };\n for (const [name, value] of Object.entries(limits)) {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n `${name} must be a positive safe integer.`,\n { path: `/${name}` },\n );\n }\n }\n if (limits.maxTotalArtifactBytesPerRun < limits.maxArtifactBytes) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'The per-run artifact limit cannot be smaller than the single-artifact limit.',\n { path: '/maxTotalArtifactBytesPerRun' },\n );\n }\n return Object.freeze(limits);\n}\n\nfunction validateKnownSecrets(values: readonly string[] | undefined): readonly string[] {\n const result = [...new Set(values ?? [])];\n if (result.some((value) =>\n typeof value !== 'string'\n || value.length === 0\n || /[\\ud800-\\udfff]/u.test(value))) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Known secrets must be non-empty well-formed strings.',\n { path: '/knownSecrets' },\n );\n }\n return Object.freeze(result.sort((left, right) => right.length - left.length));\n}\n\nasync function ensureDirectory(path: string): Promise<void> {\n try {\n await mkdir(path, { mode: 0o700 });\n } catch (error) {\n if (nodeCode(error) !== 'EEXIST') throw error;\n }\n let stat;\n try {\n stat = await lstat(path);\n } catch (error) {\n throw storageError('UNSAFE_STORAGE_PATH', 'Managed storage directory is unavailable.', {\n path,\n cause: nodeCode(error) ?? 'unknown',\n });\n }\n if (stat.isSymbolicLink() || !stat.isDirectory()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Managed storage path must be a real directory.',\n { path },\n );\n }\n}\n\nasync function existingDirectory(path: string): Promise<boolean> {\n try {\n const stat = await lstat(path);\n if (stat.isSymbolicLink() || !stat.isDirectory()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Managed storage path must be a real directory.',\n { path },\n );\n }\n return true;\n } catch (error) {\n if (nodeCode(error) === 'ENOENT') return false;\n throw error;\n }\n}\n\nasync function assertRegularFile(path: string): Promise<boolean> {\n try {\n const stat = await lstat(path);\n if (stat.isSymbolicLink() || !stat.isFile()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Managed storage path must be a regular file.',\n { path },\n );\n }\n return true;\n } catch (error) {\n if (nodeCode(error) === 'ENOENT') return false;\n throw error;\n }\n}\n\nfunction parseAdmission(\n value: unknown,\n expectedRevision: number,\n path: string,\n): LedgerEntry {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission is not an object.', {\n path,\n });\n }\n const item = value as Record<string, unknown>;\n const fields = [\n 'schemaVersion',\n 'revision',\n 'limits',\n 'policyDigest',\n 'reference',\n 'checksum',\n ];\n if (\n Object.keys(item).length !== fields.length\n || fields.some((field) => !Object.hasOwn(item, field))\n || item.schemaVersion !== 1\n || item.revision !== expectedRevision\n ) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission is invalid.', {\n path,\n });\n }\n if (item.limits === null || typeof item.limits !== 'object' || Array.isArray(item.limits)) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission limits are invalid.', {\n path,\n });\n }\n const rawLimits = item.limits as Record<string, unknown>;\n if (\n Object.keys(rawLimits).length !== 2\n || !Number.isSafeInteger(rawLimits.maxArtifactBytes)\n || (rawLimits.maxArtifactBytes as number) < 1\n || !Number.isSafeInteger(rawLimits.maxTotalArtifactBytesPerRun)\n || (rawLimits.maxTotalArtifactBytesPerRun as number) < 1\n || (rawLimits.maxTotalArtifactBytesPerRun as number)\n < (rawLimits.maxArtifactBytes as number)\n ) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission limits are invalid.', {\n path,\n });\n }\n let reference: ArtifactReference;\n try {\n reference = validateArtifactReference(item.reference);\n } catch (error) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission reference is invalid.', {\n path,\n cause: error instanceof Error ? error.message : String(error),\n });\n }\n if (typeof item.policyDigest !== 'string' || !SHA256_DIGEST.test(item.policyDigest)) {\n throw storageError(\n 'ARTIFACT_INTEGRITY',\n 'Artifact admission policy digest is invalid.',\n { path },\n );\n }\n const entry: NewLedgerEntry = {\n schemaVersion: 1,\n revision: expectedRevision,\n limits: {\n maxArtifactBytes: rawLimits.maxArtifactBytes as number,\n maxTotalArtifactBytesPerRun: rawLimits.maxTotalArtifactBytesPerRun as number,\n },\n policyDigest: item.policyDigest as Sha256Digest,\n reference,\n };\n if (item.checksum !== admissionChecksum(entry)) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission checksum is invalid.', {\n path,\n });\n }\n return admissionRecord(entry);\n}\n\nasync function readBoundedFile(\n handle: FileHandle,\n path: string,\n maxByteLength: number,\n expectedByteLength?: number,\n details: JsonObject = {},\n): Promise<Buffer> {\n const before = await handle.stat();\n if (!before.isFile()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Managed storage path must be a regular file.',\n { ...details, path },\n );\n }\n if (\n !Number.isSafeInteger(before.size)\n || before.size > maxByteLength\n || (expectedByteLength !== undefined && before.size !== expectedByteLength)\n ) {\n throw storageError('ARTIFACT_INTEGRITY', 'Stored bytes have an invalid length.', {\n ...details,\n path,\n actualByteLength: before.size,\n maxByteLength,\n ...(expectedByteLength === undefined ? {} : { expectedByteLength }),\n });\n }\n\n const bytes = Buffer.alloc(before.size);\n let offset = 0;\n while (offset < bytes.byteLength) {\n const read = await handle.read(bytes, offset, bytes.byteLength - offset, offset);\n if (read.bytesRead === 0) {\n throw storageError('ARTIFACT_INTEGRITY', 'Stored bytes changed while being read.', {\n ...details,\n path,\n actualByteLength: offset,\n expectedByteLength: before.size,\n });\n }\n offset += read.bytesRead;\n }\n\n const extra = Buffer.allocUnsafe(1);\n const extraRead = await handle.read(extra, 0, 1, bytes.byteLength);\n const after = await handle.stat();\n if (extraRead.bytesRead !== 0 || after.size !== before.size) {\n throw storageError('ARTIFACT_INTEGRITY', 'Stored bytes changed while being read.', {\n ...details,\n path,\n actualByteLength: after.size,\n expectedByteLength: before.size,\n });\n }\n return bytes;\n}\n\nasync function readAdmission(path: string, revision: number): Promise<LedgerEntry> {\n if (!(await assertRegularFile(path))) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission disappeared.', { path });\n }\n let handle;\n try {\n handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n const text = (await readBoundedFile(\n handle,\n path,\n MAX_ADMISSION_RECORD_BYTES,\n )).toString('utf8');\n try {\n return parseAdmission(JSON.parse(text), revision, path);\n } catch (error) {\n if (error instanceof StorageError) throw error;\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission contains invalid JSON.', {\n path,\n });\n }\n } catch (error) {\n if (nodeCode(error) === 'ELOOP') {\n throw storageError('UNSAFE_STORAGE_PATH', 'Artifact admission is a symlink.', { path });\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nasync function readAdmissions(directory: string): Promise<readonly LedgerEntry[]> {\n const records: { readonly path: string; readonly revision: number }[] = [];\n for (const entry of await readdir(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isSymbolicLink() || !entry.isFile()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Artifact admission path must be a regular file.',\n { path },\n );\n }\n if (entry.name.startsWith('.tmp-')) continue;\n const match = ADMISSION_FILE.exec(entry.name);\n const revision = match ? Number(match[1]) : Number.NaN;\n if (!Number.isSafeInteger(revision) || revision < 1) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission filename is invalid.', {\n path,\n });\n }\n records.push({ path, revision });\n }\n records.sort((left, right) => left.revision - right.revision);\n\n const result: LedgerEntry[] = [];\n for (const [index, record] of records.entries()) {\n const expectedRevision = index + 1;\n if (record.revision !== expectedRevision) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admission revisions are not contiguous.', {\n expectedRevision,\n actualRevision: record.revision,\n });\n }\n result.push(await readAdmission(record.path, expectedRevision));\n }\n return result;\n}\n\nfunction admissionFilename(revision: number): string {\n return `${String(revision).padStart(16, '0')}.json`;\n}\n\nasync function syncDirectory(path: string): Promise<void> {\n let handle;\n try {\n handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n await handle.sync();\n } catch (error) {\n if (nodeCode(error) === 'ELOOP') {\n throw storageError('UNSAFE_STORAGE_PATH', 'Managed storage directory is a symlink.', {\n path,\n });\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nasync function commitAdmission(\n directory: string,\n entry: NewLedgerEntry,\n knownSecrets: readonly string[],\n): Promise<'committed' | 'conflict'> {\n const temporary = join(directory, `.tmp-${randomUUID()}`);\n const destination = join(directory, admissionFilename(entry.revision));\n const bytes = screenedAdmissionBytes(entry, knownSecrets);\n let handle;\n try {\n handle = await open(\n temporary,\n constants.O_CREAT\n | constants.O_EXCL\n | constants.O_WRONLY\n | constants.O_NOFOLLOW,\n 0o600,\n );\n await handle.writeFile(bytes);\n await handle.sync();\n await handle.chmod(0o400);\n await handle.sync();\n await handle.close();\n handle = undefined;\n try {\n await link(temporary, destination);\n await syncDirectory(directory);\n return 'committed';\n } catch (error) {\n if (nodeCode(error) === 'EEXIST') return 'conflict';\n throw error;\n }\n } finally {\n await handle?.close();\n await unlink(temporary).catch((error) => {\n if (nodeCode(error) !== 'ENOENT') throw error;\n });\n }\n}\n\nasync function readBlob(path: string, reference: ArtifactReference): Promise<Uint8Array> {\n if (!(await assertRegularFile(path))) {\n throw storageError('ARTIFACT_NOT_FOUND', 'Admitted artifact bytes are missing.', {\n digest: reference.digest,\n });\n }\n let handle;\n try {\n handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);\n const bytes = await readBoundedFile(\n handle,\n path,\n reference.byteLength,\n reference.byteLength,\n { digest: reference.digest },\n );\n if (digest(bytes) !== reference.digest) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact bytes do not match their reference.', {\n digest: reference.digest,\n });\n }\n return Uint8Array.from(bytes);\n } finally {\n await handle?.close();\n }\n}\n\nasync function commitBlob(\n directory: string,\n reference: ArtifactReference,\n bytes: Uint8Array,\n): Promise<void> {\n const path = join(directory, reference.digest.slice('sha256:'.length));\n if (await assertRegularFile(path)) {\n await readBlob(path, reference);\n return;\n }\n\n const temporary = join(directory, `.tmp-${randomUUID()}`);\n let handle;\n try {\n handle = await open(\n temporary,\n constants.O_CREAT\n | constants.O_EXCL\n | constants.O_WRONLY\n | constants.O_NOFOLLOW,\n 0o600,\n );\n await handle.writeFile(bytes);\n await handle.sync();\n await handle.chmod(0o400);\n await handle.sync();\n await handle.close();\n handle = undefined;\n try {\n await link(temporary, path);\n await syncDirectory(directory);\n } catch (error) {\n if (nodeCode(error) !== 'EEXIST') throw error;\n await readBlob(path, reference);\n }\n } finally {\n await handle?.close();\n await unlink(temporary).catch((error) => {\n if (nodeCode(error) !== 'ENOENT') throw error;\n });\n }\n}\n\nasync function assertTreeHasNoSymlink(path: string): Promise<void> {\n for (const entry of await readdir(path, { withFileTypes: true })) {\n const child = join(path, entry.name);\n const stat = await lstat(child);\n if (stat.isSymbolicLink()) {\n throw storageError('UNSAFE_STORAGE_PATH', 'Managed storage contains a symlink.', {\n path: child,\n });\n }\n if (stat.isDirectory()) await assertTreeHasNoSymlink(child);\n }\n}\n\nclass LocalArtifactStore implements ArtifactStore {\n readonly #root: string;\n readonly #limits: Limits;\n readonly #knownSecrets: readonly string[];\n readonly #policyDigest: Sha256Digest;\n\n constructor(options: LocalArtifactStoreOptions) {\n if (typeof options.root !== 'string' || options.root.trim() === '') {\n throw storageError('INVALID_STORED_VALUE', 'Artifact store root must be a path.', {\n path: '/root',\n });\n }\n this.#root = resolve(options.root);\n this.#limits = validateLimits(options);\n this.#knownSecrets = validateKnownSecrets(options.knownSecrets);\n this.#policyDigest = artifactPolicyDigest(this.#limits);\n }\n\n async preflightWrite(\n scopeValue: ArtifactScope,\n artifactValues: ArtifactBatch,\n ): Promise<readonly ArtifactReference[]> {\n const scope = validateArtifactScope(scopeValue);\n if (!Array.isArray(artifactValues) || artifactValues.length === 0) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Artifact preflight requires a non-empty array.',\n { path: '/artifacts' },\n );\n }\n const prepared = artifactValues.map((artifact) => this.#prepareArtifact(artifact));\n const paths = await this.#paths(scope, false);\n const entries = paths ? await readAdmissions(paths.admissions) : [];\n this.#assertAdmissionPolicy(entries);\n\n if (paths) {\n const verified = new Set<Sha256Digest>();\n for (const item of prepared) {\n if (verified.has(item.reference.digest)) continue;\n verified.add(item.reference.digest);\n const path = this.#blobPath(paths, item.reference);\n const admitted = entries.some((entry) =>\n entry.reference.digest === item.reference.digest);\n if (admitted || await assertRegularFile(path)) {\n await readBlob(path, item.reference);\n }\n }\n }\n return this.#simulateAdmissions(entries, prepared);\n }\n\n async write(scopeValue: ArtifactScope, artifactValue: NewArtifact): Promise<ArtifactReference> {\n const scope = validateArtifactScope(scopeValue);\n const prepared = this.#prepareArtifact(artifactValue);\n const { bytes, reference } = prepared;\n const paths = await this.#paths(scope, true);\n const initialEntries = await readAdmissions(paths.admissions);\n this.#assertAdmissionPolicy(initialEntries);\n if (initialEntries.some((entry) =>\n isDeepStrictEqual(entry.reference, reference))) {\n await readBlob(this.#blobPath(paths, reference), reference);\n return reference;\n }\n\n // Screen the exact first candidate before any bytes are committed. A\n // concurrent admission can change its revision, so every retry screens its\n // newly encoded candidate again below.\n this.#assertAdmissionSafe(this.#newAdmission(reference, initialEntries.length + 1));\n this.#assertQuota(initialEntries, reference);\n\n // Commit bytes before their admission. A crash can leave an orphan, but an\n // orphan cannot be read through this store.\n await commitBlob(paths.blobs, reference, bytes);\n\n for (let attempt = 0; attempt < MAX_ADMISSION_RETRIES; attempt += 1) {\n const entries = await readAdmissions(paths.admissions);\n this.#assertAdmissionPolicy(entries);\n if (entries.some((entry) => isDeepStrictEqual(entry.reference, reference))) {\n await readBlob(this.#blobPath(paths, reference), reference);\n return reference;\n }\n\n const entry = this.#newAdmission(reference, entries.length + 1);\n this.#assertAdmissionSafe(entry);\n this.#assertQuota(entries, reference);\n const result = await commitAdmission(paths.admissions, entry, this.#knownSecrets);\n if (result === 'committed') return reference;\n // Another writer won this revision. Re-read all immutable records before\n // calculating the quota and next revision again.\n }\n throw storageError(\n 'REVISION_CONFLICT',\n 'Artifact admission changed too often to complete this write.',\n );\n }\n\n async read(scopeValue: ArtifactScope, referenceValue: ArtifactReference): Promise<Uint8Array> {\n const scope = validateArtifactScope(scopeValue);\n const reference = validateArtifactReference(referenceValue);\n const paths = await this.#paths(scope, false);\n if (!paths) {\n throw storageError('ARTIFACT_NOT_ADMITTED', 'Artifact is not admitted for this run.', {\n digest: reference.digest,\n });\n }\n\n const entries = await readAdmissions(paths.admissions);\n this.#assertAdmissionPolicy(entries);\n if (!entries.some((entry) => isDeepStrictEqual(entry.reference, reference))) {\n throw storageError('ARTIFACT_NOT_ADMITTED', 'Artifact is not admitted for this run.', {\n digest: reference.digest,\n });\n }\n return readBlob(this.#blobPath(paths, reference), reference);\n }\n\n async deleteRun(scopeValue: ArtifactScope): Promise<void> {\n const scope = validateArtifactScope(scopeValue);\n const paths = await this.#paths(scope, false);\n if (!paths) return;\n await assertTreeHasNoSymlink(paths.run);\n await rm(paths.run, { recursive: true });\n }\n\n #safeBytes(artifact: NewArtifact): Uint8Array {\n const source = Uint8Array.from(artifact.bytes);\n if (artifact.contentMode === 'exact') {\n assertSecretFree(\n source,\n this.#knownSecrets,\n 'Exact artifact bytes contain a known secret.',\n );\n return source;\n }\n\n if (artifact.contentMode === 'state') {\n assertSecretFree(\n source,\n this.#knownSecrets,\n 'State artifact bytes contain a known secret.',\n );\n if (!isJsonMediaType(artifact.mediaType)) return source;\n\n let parsed: JsonValue;\n try {\n const text = decoder.decode(source);\n parsed = cloneFrozenJson(JSON.parse(text) as JsonValue);\n } catch {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'JSON state artifact bytes must contain strict JSON encoded as UTF-8.',\n { path: '/bytes' },\n );\n }\n if (jsonContainsKnownSecret(parsed, this.#knownSecrets)) {\n throw storageError(\n 'KNOWN_SECRET',\n 'JSON state contains a known secret in a key or value.',\n );\n }\n return source;\n }\n\n let text: string;\n try {\n text = decoder.decode(source);\n } catch {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Free-text artifact bytes must contain valid UTF-8.',\n { path: '/bytes' },\n );\n }\n for (const value of this.#knownSecrets) text = text.split(value).join('[redacted]');\n const redacted = encoder.encode(text);\n assertSecretFree(\n redacted,\n this.#knownSecrets,\n 'Redacted free text still contains a known secret.',\n );\n return redacted;\n }\n\n #prepareArtifact(artifactValue: NewArtifact): PreparedArtifact {\n const artifact = validateNewArtifact(artifactValue);\n if (artifact.sensitive) {\n throw storageError('SENSITIVE_CONTENT', 'Marked-sensitive content cannot be stored.');\n }\n\n const bytes = this.#safeBytes(artifact);\n if (bytes.byteLength > this.#limits.maxArtifactBytes) {\n throw storageError('STORAGE_LIMIT_EXCEEDED', 'Artifact exceeds the single-artifact limit.', {\n byteLength: bytes.byteLength,\n maxArtifactBytes: this.#limits.maxArtifactBytes,\n });\n }\n const reference = Object.freeze({\n schemaVersion: 1 as const,\n digest: digest(bytes),\n byteLength: bytes.byteLength,\n mediaType: artifact.mediaType,\n purpose: artifact.purpose,\n });\n return Object.freeze({ bytes, reference });\n }\n\n #newAdmission(reference: ArtifactReference, revision: number): NewLedgerEntry {\n return Object.freeze({\n schemaVersion: 1,\n revision,\n limits: this.#limits,\n policyDigest: this.#policyDigest,\n reference,\n });\n }\n\n #assertAdmissionSafe(entry: NewLedgerEntry): void {\n screenedAdmissionBytes(entry, this.#knownSecrets);\n }\n\n #assertQuota(\n entries: readonly LedgerEntry[],\n reference: ArtifactReference,\n ): void {\n const unique = new Map<string, number>();\n for (const entry of entries) {\n unique.set(entry.reference.digest, entry.reference.byteLength);\n }\n const total = [...unique.values()].reduce((sum, size) => sum + size, 0);\n if (\n !unique.has(reference.digest)\n && total + reference.byteLength > this.#limits.maxTotalArtifactBytesPerRun\n ) {\n throw storageError('STORAGE_LIMIT_EXCEEDED', 'Artifact exceeds the per-run storage limit.', {\n byteLength: reference.byteLength,\n admittedBytes: total,\n maxTotalArtifactBytesPerRun: this.#limits.maxTotalArtifactBytesPerRun,\n });\n }\n }\n\n #simulateAdmissions(\n entries: readonly LedgerEntry[],\n artifacts: readonly PreparedArtifact[],\n ): readonly ArtifactReference[] {\n const simulated = [...entries];\n const unique = new Map<string, number>();\n for (const entry of entries) {\n unique.set(entry.reference.digest, entry.reference.byteLength);\n }\n let total = [...unique.values()].reduce((sum, size) => sum + size, 0);\n const references: ArtifactReference[] = [];\n\n for (const artifact of artifacts) {\n const { reference } = artifact;\n references.push(reference);\n if (simulated.some((entry) => isDeepStrictEqual(entry.reference, reference))) continue;\n\n const entry = this.#newAdmission(reference, simulated.length + 1);\n this.#assertAdmissionSafe(entry);\n if (\n !unique.has(reference.digest)\n && total + reference.byteLength > this.#limits.maxTotalArtifactBytesPerRun\n ) {\n throw storageError(\n 'STORAGE_LIMIT_EXCEEDED',\n 'Artifact batch exceeds the per-run storage limit.',\n {\n byteLength: reference.byteLength,\n admittedBytes: total,\n maxTotalArtifactBytesPerRun: this.#limits.maxTotalArtifactBytesPerRun,\n },\n );\n }\n if (!unique.has(reference.digest)) {\n unique.set(reference.digest, reference.byteLength);\n total += reference.byteLength;\n }\n simulated.push(admissionRecord(entry));\n }\n\n return Object.freeze(references);\n }\n\n #assertAdmissionIntegrity(entries: readonly LedgerEntry[]): void {\n const first = entries[0];\n if (entries.some((entry) =>\n !isDeepStrictEqual(entry.limits, first?.limits)\n || entry.policyDigest !== first?.policyDigest)) {\n throw storageError('ARTIFACT_INTEGRITY', 'Artifact admissions change the run policy.');\n }\n }\n\n #assertAdmissionPolicy(entries: readonly LedgerEntry[]): void {\n this.#assertAdmissionIntegrity(entries);\n const first = entries[0];\n if (first && !isDeepStrictEqual(first.limits, this.#limits)) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Artifact-store limits do not match the run admissions.',\n );\n }\n if (first && first.policyDigest !== this.#policyDigest) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Artifact-store behavior does not match the run admissions.',\n );\n }\n }\n\n #blobPath(paths: RunPaths, reference: ArtifactReference): string {\n return join(paths.blobs, reference.digest.slice('sha256:'.length));\n }\n\n async #paths(scope: ArtifactScope, create: true): Promise<RunPaths>;\n async #paths(scope: ArtifactScope, create: false): Promise<RunPaths | undefined>;\n async #paths(scope: ArtifactScope, create: boolean): Promise<RunPaths | undefined> {\n if (create) await mkdir(this.#root, { recursive: true, mode: 0o700 });\n if (!(await existingDirectory(this.#root))) return undefined;\n const namespaces = join(this.#root, 'namespaces');\n const namespace = join(namespaces, hashedPathPart(scope.namespace));\n const runs = join(namespace, 'runs');\n const run = join(runs, hashedPathPart(scope.runId));\n const blobs = join(run, 'blobs');\n const admissions = join(run, 'admissions');\n for (const path of [namespaces, namespace, runs, run, blobs, admissions]) {\n if (create) await ensureDirectory(path);\n else if (!(await existingDirectory(path))) return undefined;\n }\n return {\n run,\n blobs,\n admissions,\n };\n }\n}\n\nexport function createLocalArtifactStore(\n options: LocalArtifactStoreOptions,\n): ArtifactStore {\n return new LocalArtifactStore(options);\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { constants } from 'node:fs';\nimport {\n link,\n lstat,\n mkdir,\n open,\n readdir,\n realpath,\n unlink,\n} from 'node:fs/promises';\nimport { basename, join, resolve } from 'node:path';\nimport { TextDecoder } from 'node:util';\n\nimport { canonicalJson } from '../graph/value.js';\nimport { StorageError } from '../storage/error.js';\nimport {\n validateDomainEventEnvelope,\n type DomainEventEnvelope,\n type EventStreamRef,\n type NewDomainEvent,\n} from './envelope.js';\nimport {\n findKnownSecretInEvents,\n validateDomainEventBatch,\n validateEventStreamRef,\n validateStreamRevision,\n type DomainEventBatch,\n type EventStore,\n} from './store.js';\n\nconst DEFAULT_MAX_EVENT_PAYLOAD_BYTES = 256 * 1024;\nconst DEFAULT_MAX_APPEND_BATCH_BYTES = 1024 * 1024;\nconst CHECKSUM_RECORD_ALLOWANCE = 1024;\nconst SEGMENT_NAME = /^(\\d{16})\\.jsonl$/u;\nconst SHA256 = /^sha256:[0-9a-f]{64}$/u;\nconst UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });\n\nexport interface LocalEventStoreOptions {\n readonly root: string;\n readonly maxEventPayloadBytes?: number;\n readonly maxAppendBatchBytes?: number;\n readonly knownSecrets?: readonly string[];\n}\n\ninterface ResolvedOptions {\n readonly root: string;\n readonly maxEventPayloadBytes: number;\n readonly maxAppendBatchBytes: number;\n readonly knownSecrets: readonly string[];\n}\n\ninterface StreamDirectories {\n readonly segments: string;\n readonly temporary: string;\n}\n\ninterface StreamState {\n readonly events: readonly DomainEventEnvelope[];\n readonly revision: number;\n readonly segments: ReadonlyMap<number, Buffer>;\n}\n\ninterface SerializedSegment {\n readonly eventBytes: Buffer;\n readonly bytes: Buffer;\n}\n\ninterface PreparedAppend {\n readonly stream: EventStreamRef;\n readonly expectedRevision: number;\n readonly events: DomainEventBatch;\n readonly segment: SerializedSegment;\n readonly alreadyCommitted: boolean;\n}\n\ninterface SegmentChecksum {\n readonly segmentVersion: 1;\n readonly policyDigest: string;\n readonly startRevision: number;\n readonly endRevision: number;\n readonly eventCount: number;\n readonly sha256: string;\n}\n\nfunction storageError(\n code: 'INVALID_STORED_VALUE'\n | 'REVISION_CONFLICT'\n | 'DUPLICATE_EVENT_ID'\n | 'CORRUPT_EVENT_STREAM'\n | 'STORAGE_LIMIT_EXCEEDED'\n | 'KNOWN_SECRET'\n | 'UNSAFE_STORAGE_PATH',\n message: string,\n details = {},\n): StorageError {\n return new StorageError(code, message, details);\n}\n\nfunction positiveLimit(value: unknown, name: string, fallback: number): number {\n if (value === undefined) return fallback;\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n `${name} must be a positive safe integer.`,\n { path: `/${name}` },\n );\n }\n return value;\n}\n\nfunction resolveOptions(options: LocalEventStoreOptions): ResolvedOptions {\n if (typeof options.root !== 'string' || options.root.trim().length === 0) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Event-store root must be a non-empty path.',\n { path: '/root' },\n );\n }\n const knownSecrets = options.knownSecrets ?? [];\n if (\n !Array.isArray(knownSecrets)\n || knownSecrets.some((secret) => typeof secret !== 'string' || secret.length === 0)\n ) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Known secrets must be non-empty strings.',\n { path: '/knownSecrets' },\n );\n }\n return Object.freeze({\n root: resolve(options.root),\n maxEventPayloadBytes: positiveLimit(\n options.maxEventPayloadBytes,\n 'maxEventPayloadBytes',\n DEFAULT_MAX_EVENT_PAYLOAD_BYTES,\n ),\n maxAppendBatchBytes: positiveLimit(\n options.maxAppendBatchBytes,\n 'maxAppendBatchBytes',\n DEFAULT_MAX_APPEND_BATCH_BYTES,\n ),\n knownSecrets: Object.freeze([...knownSecrets]),\n });\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return error instanceof Error\n && 'code' in error\n && (error as NodeJS.ErrnoException).code === code;\n}\n\nasync function existingDirectory(path: string): Promise<boolean> {\n try {\n const item = await lstat(path);\n if (item.isSymbolicLink() || !item.isDirectory()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Event-store path contains a symlink or non-directory component.',\n { path },\n );\n }\n return true;\n } catch (error) {\n if (isNodeError(error, 'ENOENT')) return false;\n throw error;\n }\n}\n\nasync function createContainedDirectory(path: string): Promise<void> {\n try {\n await mkdir(path, { mode: 0o700 });\n } catch (error) {\n if (!isNodeError(error, 'EEXIST')) throw error;\n }\n if (!await existingDirectory(path)) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Event-store directory disappeared during creation.',\n { path },\n );\n }\n}\n\nasync function rootDirectory(options: ResolvedOptions): Promise<string> {\n await mkdir(options.root, { recursive: true, mode: 0o700 });\n if (!await existingDirectory(options.root)) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Event-store root disappeared during creation.',\n { path: options.root },\n );\n }\n const root = await realpath(options.root);\n const item = await lstat(root);\n if (!item.isDirectory()) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Event-store root is not a directory.',\n { path: options.root },\n );\n }\n return root;\n}\n\nconst PATH_PARTS = ['namespaces', 'streams', 'segments'] as const;\n\nasync function ensureStreamDirectories(\n options: ResolvedOptions,\n stream: EventStreamRef,\n): Promise<StreamDirectories> {\n const root = await rootDirectory(options);\n const namespaces = join(root, PATH_PARTS[0]);\n await createContainedDirectory(namespaces);\n const namespace = join(namespaces, storagePathComponent(stream.namespace));\n await createContainedDirectory(namespace);\n const streams = join(namespace, PATH_PARTS[1]);\n await createContainedDirectory(streams);\n const streamDirectory = join(streams, storagePathComponent(stream.streamId));\n await createContainedDirectory(streamDirectory);\n const segments = join(streamDirectory, PATH_PARTS[2]);\n await createContainedDirectory(segments);\n const temporary = join(streamDirectory, '.tmp');\n await createContainedDirectory(temporary);\n return { segments, temporary };\n}\n\nasync function findStreamSegments(\n options: ResolvedOptions,\n stream: EventStreamRef,\n): Promise<string | null> {\n if (!await existingDirectory(options.root)) return null;\n const root = await realpath(options.root);\n const parts = [\n 'namespaces',\n storagePathComponent(stream.namespace),\n 'streams',\n storagePathComponent(stream.streamId),\n 'segments',\n ];\n let current = root;\n for (const part of parts) {\n current = join(current, part);\n if (!await existingDirectory(current)) return null;\n }\n return current;\n}\n\nfunction sha256(bytes: Uint8Array): string {\n return `sha256:${createHash('sha256').update(bytes).digest('hex')}`;\n}\n\nfunction eventPolicyDigest(options: ResolvedOptions): string {\n return sha256(Buffer.from(canonicalJson({\n schemaVersion: 1,\n maxEventPayloadBytes: options.maxEventPayloadBytes,\n maxAppendBatchBytes: options.maxAppendBatchBytes,\n }), 'utf8'));\n}\n\nfunction storagePathComponent(value: string): string {\n return createHash('sha256').update(value, 'utf8').digest('hex');\n}\n\nasync function readBoundedFile(\n path: string,\n maximumBytes: number,\n): Promise<Buffer> {\n let file;\n try {\n file = await open(\n path,\n constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0),\n );\n } catch (error) {\n if (isNodeError(error, 'ELOOP')) {\n throw storageError(\n 'UNSAFE_STORAGE_PATH',\n 'Event segment cannot be a symlink.',\n { path },\n );\n }\n throw error;\n }\n\n try {\n const before = await file.stat();\n if (!before.isFile() || before.size < 1 || before.size > maximumBytes) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment size is invalid or exceeds the configured read bound.',\n { path, byteLength: before.size, maximumBytes },\n );\n }\n const bytes = Buffer.alloc(before.size);\n let offset = 0;\n while (offset < bytes.length) {\n const { bytesRead } = await file.read(\n bytes,\n offset,\n bytes.length - offset,\n offset,\n );\n if (bytesRead === 0) break;\n offset += bytesRead;\n }\n const extra = Buffer.alloc(1);\n const extraRead = await file.read(extra, 0, 1, before.size);\n const after = await file.stat();\n if (\n offset !== bytes.length\n || extraRead.bytesRead !== 0\n || after.size !== before.size\n ) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment changed while it was being read.',\n { path },\n );\n }\n return bytes;\n } finally {\n await file.close();\n }\n}\n\nfunction parseJsonLine(line: string, path: string): unknown {\n try {\n return JSON.parse(line) as unknown;\n } catch {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment contains invalid JSON.',\n { path },\n );\n }\n}\n\nfunction validateChecksum(\n value: unknown,\n path: string,\n): SegmentChecksum {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment checksum must be an object.',\n { path },\n );\n }\n const record = value as Record<string, unknown>;\n const fields = Object.keys(record).sort();\n const expected = [\n 'endRevision',\n 'eventCount',\n 'policyDigest',\n 'segmentVersion',\n 'sha256',\n 'startRevision',\n ];\n if (\n fields.length !== expected.length\n || fields.some((field, index) => field !== expected[index])\n || record.segmentVersion !== 1\n || typeof record.startRevision !== 'number'\n || !Number.isSafeInteger(record.startRevision)\n || record.startRevision < 1\n || typeof record.endRevision !== 'number'\n || !Number.isSafeInteger(record.endRevision)\n || record.endRevision < record.startRevision\n || typeof record.eventCount !== 'number'\n || !Number.isSafeInteger(record.eventCount)\n || record.eventCount < 1\n || typeof record.policyDigest !== 'string'\n || !SHA256.test(record.policyDigest)\n || typeof record.sha256 !== 'string'\n || !SHA256.test(record.sha256)\n ) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment checksum record is invalid.',\n { path },\n );\n }\n return record as unknown as SegmentChecksum;\n}\n\nfunction parseSegment(\n options: ResolvedOptions,\n bytes: Buffer,\n path: string,\n stream: EventStreamRef,\n expectedStart: number,\n): readonly DomainEventEnvelope[] {\n let text: string;\n try {\n text = UTF8_DECODER.decode(bytes);\n } catch {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment contains invalid UTF-8.',\n { path },\n );\n }\n if (!text.endsWith('\\n')) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment must end with a newline.',\n { path },\n );\n }\n const lines = text.slice(0, -1).split('\\n');\n if (lines.length < 2 || lines.some((line) => line.length === 0)) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment must contain events followed by one checksum record.',\n { path },\n );\n }\n const eventLines = lines.slice(0, -1);\n const eventBytes = Buffer.from(`${eventLines.join('\\n')}\\n`, 'utf8');\n const checksum = validateChecksum(\n parseJsonLine(lines.at(-1)!, `${path}#checksum`),\n `${path}#checksum`,\n );\n if (checksum.policyDigest !== eventPolicyDigest(options)) {\n throw storageError(\n 'INVALID_STORED_VALUE',\n 'Event-store policy does not match the committed stream.',\n { path },\n );\n }\n if (\n checksum.startRevision !== expectedStart\n || checksum.endRevision !== expectedStart + eventLines.length - 1\n || checksum.eventCount !== eventLines.length\n || checksum.sha256 !== sha256(eventBytes)\n ) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment checksum or revision range does not match its events.',\n { path },\n );\n }\n\n return Object.freeze(eventLines.map((line, index) => {\n let envelope: DomainEventEnvelope;\n try {\n envelope = validateDomainEventEnvelope(\n parseJsonLine(line, `${path}#event-${index + 1}`),\n );\n } catch (error) {\n if (error instanceof StorageError) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n `Event segment contains an invalid envelope: ${error.message}`,\n { path, eventIndex: index },\n );\n }\n throw error;\n }\n if (\n envelope.streamId !== stream.streamId\n || envelope.revision !== expectedStart + index\n ) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event envelope does not match its stream or revision position.',\n { path, eventIndex: index },\n );\n }\n return envelope;\n }));\n}\n\nasync function segmentPaths(directory: string): Promise<readonly string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const names: string[] = [];\n for (const entry of entries) {\n if (!SEGMENT_NAME.test(entry.name) || !entry.isFile()) {\n throw storageError(\n entry.isSymbolicLink()\n ? 'UNSAFE_STORAGE_PATH'\n : 'CORRUPT_EVENT_STREAM',\n 'Event segment directory contains an invalid entry.',\n { path: join(directory, entry.name) },\n );\n }\n names.push(entry.name);\n }\n names.sort();\n return Object.freeze(names.map((name) => join(directory, name)));\n}\n\nasync function readStreamStateFromDirectory(\n options: ResolvedOptions,\n stream: EventStreamRef,\n directory: string,\n): Promise<StreamState> {\n const paths = await segmentPaths(directory);\n const events: DomainEventEnvelope[] = [];\n const eventIds = new Set<string>();\n const segments = new Map<number, Buffer>();\n let nextRevision = 1;\n for (const path of paths) {\n const filename = basename(path);\n const match = SEGMENT_NAME.exec(filename);\n const namedStart = Number(match?.[1]);\n if (namedStart !== nextRevision) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Event segment filenames do not form one continuous stream.',\n { path, expectedRevision: nextRevision },\n );\n }\n const bytes = await readBoundedFile(\n path,\n options.maxAppendBatchBytes + CHECKSUM_RECORD_ALLOWANCE,\n );\n const segment = parseSegment(options, bytes, path, stream, nextRevision);\n segments.set(namedStart, bytes);\n for (const event of segment) {\n if (eventIds.has(event.eventId)) {\n throw storageError(\n 'CORRUPT_EVENT_STREAM',\n 'Committed event stream contains a duplicate event identity.',\n { path, eventId: event.eventId },\n );\n }\n eventIds.add(event.eventId);\n events.push(event);\n }\n nextRevision += segment.length;\n }\n return Object.freeze({\n events: Object.freeze(events),\n revision: nextRevision - 1,\n segments,\n });\n}\n\nasync function readStreamState(\n options: ResolvedOptions,\n stream: EventStreamRef,\n): Promise<StreamState> {\n const directory = await findStreamSegments(options, stream);\n if (directory === null) {\n return { events: [], revision: 0, segments: new Map() };\n }\n return readStreamStateFromDirectory(options, stream, directory);\n}\n\nfunction segmentFilename(startRevision: number): string {\n return `${String(startRevision).padStart(16, '0')}.jsonl`;\n}\n\nfunction serializedSegment(\n options: ResolvedOptions,\n envelopes: readonly DomainEventEnvelope[],\n): SerializedSegment {\n const eventBytes = Buffer.from(\n `${envelopes.map((event) => JSON.stringify(event)).join('\\n')}\\n`,\n 'utf8',\n );\n const checksum: SegmentChecksum = {\n segmentVersion: 1,\n policyDigest: eventPolicyDigest(options),\n startRevision: envelopes[0]!.revision,\n endRevision: envelopes.at(-1)!.revision,\n eventCount: envelopes.length,\n sha256: sha256(eventBytes),\n };\n return {\n eventBytes,\n bytes: Buffer.concat([\n eventBytes,\n Buffer.from(`${JSON.stringify(checksum)}\\n`, 'utf8'),\n ]),\n };\n}\n\nfunction validateLimitsAndSecrets(\n options: ResolvedOptions,\n events: DomainEventBatch,\n segment: SerializedSegment,\n): void {\n for (const event of events) {\n const byteLength = Buffer.byteLength(canonicalJson(event.payload), 'utf8');\n if (byteLength > options.maxEventPayloadBytes) {\n throw storageError(\n 'STORAGE_LIMIT_EXCEEDED',\n 'Event payload exceeds maxEventPayloadBytes.',\n {\n eventId: event.eventId,\n byteLength,\n maximumBytes: options.maxEventPayloadBytes,\n },\n );\n }\n }\n if (segment.eventBytes.byteLength > options.maxAppendBatchBytes) {\n throw storageError(\n 'STORAGE_LIMIT_EXCEEDED',\n 'Event append exceeds maxAppendBatchBytes.',\n {\n byteLength: segment.eventBytes.byteLength,\n maximumBytes: options.maxAppendBatchBytes,\n },\n );\n }\n const exactBytes = segment.bytes.toString('utf8');\n const secret = findKnownSecretInEvents(\n options.knownSecrets,\n exactBytes,\n events,\n );\n if (secret !== undefined) {\n throw storageError(\n 'KNOWN_SECRET',\n 'Exact event bytes contain a configured known secret.',\n { eventIds: events.map((event) => event.eventId) },\n );\n }\n}\n\nfunction hasExactCommittedAppend(\n state: StreamState,\n expectedRevision: number,\n segment: SerializedSegment,\n eventCount: number,\n): boolean {\n if (state.revision < expectedRevision + eventCount) return false;\n return state.segments.get(expectedRevision + 1)?.equals(segment.bytes)\n ?? false;\n}\n\nasync function prepareAppend(\n options: ResolvedOptions,\n unsafeStream: EventStreamRef,\n unsafeExpectedRevision: number,\n unsafeEvents: DomainEventBatch,\n allowCommittedRetry = false,\n): Promise<PreparedAppend> {\n const stream = validateEventStreamRef(unsafeStream);\n const expectedRevision = validateStreamRevision(\n unsafeExpectedRevision,\n '/expectedRevision',\n );\n const events = validateDomainEventBatch(unsafeEvents);\n if (expectedRevision + events.length > Number.MAX_SAFE_INTEGER) {\n throw storageError(\n 'STORAGE_LIMIT_EXCEEDED',\n 'Event append would exceed the maximum safe stream revision.',\n { expectedRevision, eventCount: events.length },\n );\n }\n\n const envelopes = Object.freeze(events.map((event, index) => (\n validateDomainEventEnvelope({\n ...event,\n envelopeVersion: 1,\n streamId: stream.streamId,\n revision: expectedRevision + index + 1,\n })\n )));\n const segment = serializedSegment(options, envelopes);\n validateLimitsAndSecrets(options, events, segment);\n\n const state = await readStreamState(options, stream);\n if (state.revision !== expectedRevision) {\n if (\n allowCommittedRetry\n && hasExactCommittedAppend(\n state,\n expectedRevision,\n segment,\n events.length,\n )\n ) {\n return {\n stream,\n expectedRevision,\n events,\n segment,\n alreadyCommitted: true,\n };\n }\n throw storageError(\n 'REVISION_CONFLICT',\n 'Event stream revision does not match the append expectation.',\n { expectedRevision, actualRevision: state.revision },\n );\n }\n const eventIds = new Set(state.events.map((event) => event.eventId));\n for (const event of events) {\n if (eventIds.has(event.eventId)) {\n throw storageError(\n 'DUPLICATE_EVENT_ID',\n 'Event identity is already present in this stream or append batch.',\n { eventId: event.eventId },\n );\n }\n eventIds.add(event.eventId);\n }\n\n return {\n stream,\n expectedRevision,\n events,\n segment,\n alreadyCommitted: false,\n };\n}\n\nasync function syncDirectory(path: string): Promise<void> {\n const directory = await open(path, constants.O_RDONLY);\n try {\n await directory.sync();\n } finally {\n await directory.close();\n }\n}\n\nasync function commitSegment(\n directories: StreamDirectories,\n startRevision: number,\n bytes: Buffer,\n): Promise<boolean> {\n const temporary = join(\n directories.temporary,\n `${segmentFilename(startRevision)}.${randomUUID()}.tmp`,\n );\n const target = join(directories.segments, segmentFilename(startRevision));\n const file = await open(temporary, 'wx', 0o600);\n try {\n await file.writeFile(bytes);\n await file.sync();\n await file.chmod(0o400);\n try {\n await link(temporary, target);\n } catch (error) {\n if (isNodeError(error, 'EEXIST')) return false;\n throw error;\n }\n await syncDirectory(directories.segments);\n return true;\n } finally {\n await file.close();\n await unlink(temporary).catch(() => undefined);\n }\n}\n\nclass LocalEventStore implements EventStore {\n readonly #options: ResolvedOptions;\n\n constructor(options: LocalEventStoreOptions) {\n this.#options = resolveOptions(options);\n }\n\n async preflightAppend(\n stream: EventStreamRef,\n expectedRevision: number,\n events: DomainEventBatch,\n ): Promise<void> {\n await prepareAppend(this.#options, stream, expectedRevision, events);\n }\n\n async *read(\n unsafeStream: EventStreamRef,\n unsafeAfterRevision = 0,\n ): AsyncIterable<DomainEventEnvelope> {\n const stream = validateEventStreamRef(unsafeStream);\n const afterRevision = validateStreamRevision(\n unsafeAfterRevision,\n '/afterRevision',\n );\n const state = await readStreamState(this.#options, stream);\n for (const event of state.events) {\n if (event.revision > afterRevision) yield event;\n }\n }\n\n async append(\n unsafeStream: EventStreamRef,\n unsafeExpectedRevision: number,\n unsafeEvents: DomainEventBatch,\n ): Promise<number> {\n const prepared = await prepareAppend(\n this.#options,\n unsafeStream,\n unsafeExpectedRevision,\n unsafeEvents,\n true,\n );\n if (prepared.alreadyCommitted) {\n return prepared.expectedRevision + prepared.events.length;\n }\n const directories = await ensureStreamDirectories(\n this.#options,\n prepared.stream,\n );\n if (await commitSegment(\n directories,\n prepared.expectedRevision + 1,\n prepared.segment.bytes,\n )) {\n return prepared.expectedRevision + prepared.events.length;\n }\n\n const actual = await readStreamState(this.#options, prepared.stream);\n if (hasExactCommittedAppend(\n actual,\n prepared.expectedRevision,\n prepared.segment,\n prepared.events.length,\n )) {\n return prepared.expectedRevision + prepared.events.length;\n }\n throw storageError(\n 'REVISION_CONFLICT',\n 'Another writer committed the expected stream revision first.',\n {\n expectedRevision: prepared.expectedRevision,\n actualRevision: actual.revision,\n },\n );\n }\n}\n\nexport function createLocalEventStore(\n options: LocalEventStoreOptions,\n): EventStore {\n return new LocalEventStore(options);\n}\n","import { join, resolve } from 'node:path';\n\nimport {\n createLocalArtifactStore,\n type LocalArtifactStoreOptions,\n} from '../artifacts/file-store.js';\nimport {\n createLocalEventStore,\n type LocalEventStoreOptions,\n} from '../events/jsonl-store.js';\nimport {\n canonicalJson,\n digestJson,\n type JsonValue,\n} from '../graph/value.js';\nimport {\n validateRunStorageRecord,\n validateRunStoragePolicy,\n type RunStorageBinding,\n type RunStoragePolicy,\n} from '../runtime/run-definition.js';\nimport { StorageError } from './error.js';\nimport { validateStorageId } from './id.js';\n\nexport interface LocalRunStorageOptions {\n readonly directory: string;\n readonly namespace: string;\n readonly policy: RunStoragePolicy;\n readonly knownSecrets?: readonly string[];\n}\n\nfunction containsText(value: JsonValue, textValue: string): boolean {\n if (typeof value === 'string') return value.includes(textValue);\n if (value === null || typeof value !== 'object') return false;\n if (Array.isArray(value)) {\n return value.some((item) => containsText(item, textValue));\n }\n return Object.entries(value).some(([key, item]) => (\n key.includes(textValue) || containsText(item, textValue)\n ));\n}\n\nfunction rejectKnownSecret(\n value: JsonValue,\n knownSecrets: readonly string[],\n label: string,\n): void {\n const serialized = canonicalJson(value);\n if (knownSecrets.some((secret) => (\n serialized.includes(secret) || containsText(value, secret)\n ))) {\n throw new StorageError(\n 'KNOWN_SECRET',\n `${label} contains a configured known secret.`,\n );\n }\n}\n\nexport function createLocalRunStorage(\n options: LocalRunStorageOptions,\n): RunStorageBinding {\n if (\n typeof options.directory !== 'string'\n || options.directory.trim().length === 0\n ) {\n throw new StorageError(\n 'INVALID_STORED_VALUE',\n 'Local storage directory must be a non-empty path.',\n { path: '/directory' },\n );\n }\n const knownSecrets = options.knownSecrets ?? [];\n if (\n !Array.isArray(knownSecrets)\n || knownSecrets.some((secret) => (\n typeof secret !== 'string' || secret.length === 0\n ))\n ) {\n throw new StorageError(\n 'INVALID_STORED_VALUE',\n 'Known secrets must be non-empty strings.',\n { path: '/knownSecrets' },\n );\n }\n const frozenSecrets = Object.freeze([...knownSecrets]);\n const namespace = validateStorageId(options.namespace, '/namespace');\n const policy = validateRunStoragePolicy(options.policy);\n const directory = resolve(options.directory);\n const eventRoot = join(directory, 'events');\n const artifactRoot = join(directory, 'artifacts');\n const eventOptions: LocalEventStoreOptions = {\n root: eventRoot,\n maxEventPayloadBytes: policy.maxEventPayloadBytes,\n maxAppendBatchBytes: policy.maxAppendBatchBytes,\n knownSecrets: frozenSecrets,\n };\n const artifactOptions: LocalArtifactStoreOptions = {\n root: artifactRoot,\n maxArtifactBytes: policy.maxArtifactBytes,\n maxTotalArtifactBytesPerRun: policy.maxTotalArtifactBytesPerRun,\n knownSecrets: frozenSecrets,\n };\n const eventConfiguration = {\n schemaVersion: 1,\n root: eventRoot,\n maxEventPayloadBytes: policy.maxEventPayloadBytes,\n maxAppendBatchBytes: policy.maxAppendBatchBytes,\n } as const;\n const artifactConfiguration = {\n schemaVersion: 1,\n root: artifactRoot,\n maxArtifactBytes: policy.maxArtifactBytes,\n maxTotalArtifactBytesPerRun: policy.maxTotalArtifactBytesPerRun,\n } as const;\n rejectKnownSecret(eventConfiguration, frozenSecrets, 'Event-store configuration');\n rejectKnownSecret(artifactConfiguration, frozenSecrets, 'Artifact-store configuration');\n const record = validateRunStorageRecord({\n schemaVersion: 1,\n namespace,\n eventStore: {\n schemaVersion: 1,\n name: 'local-jsonl',\n version: '1',\n configDigest: digestJson(eventConfiguration),\n },\n artifactStore: {\n schemaVersion: 1,\n name: 'local-files',\n version: '1',\n configDigest: digestJson(artifactConfiguration),\n },\n policy,\n });\n rejectKnownSecret(record, frozenSecrets, 'Storage binding record');\n return Object.freeze({\n record,\n knownSecrets: frozenSecrets,\n eventStore: createLocalEventStore(eventOptions),\n artifactStore: createLocalArtifactStore(artifactOptions),\n });\n}\n\nexport {\n createLocalArtifactStore,\n createLocalEventStore,\n};\nexport type {\n LocalArtifactStoreOptions,\n LocalEventStoreOptions,\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import { type GraphDefinition } from './graph/kernel.js';
2
+ import type { GraphEvent } from './graph/type.js';
3
+ export declare function defineGraphDefinition<const Definition extends GraphDefinition>(input: Definition): Definition;
4
+ export interface GraphEventTrace<Event extends GraphEvent = GraphEvent> {
5
+ readonly events: readonly Event[];
6
+ record<Next extends Event>(event: Next): Next;
7
+ }
8
+ export declare function createGraphEventTrace<Event extends GraphEvent>(seed?: readonly Event[]): GraphEventTrace<Event>;
9
+ export { MockEngine, mockVerdict, type MockResponder, } from './engines/mock.js';
10
+ export { MockEnvironment, type MockEnvOptions, } from './env/mock.js';
11
+ export { runGraphTypeConformance, assertGraphTypeConformance, type GraphTypeConformanceFixture, type GraphTypeConformanceFailure, type GraphTypeConformanceReport, } from './graph/conformance.js';
12
+ export { runEventStoreConformance, assertEventStoreConformance, type EventStoreConformanceFactory, type EventStoreConformanceFailure, type EventStoreConformanceReport, } from './events/conformance.js';
13
+ export { runArtifactStoreConformance, assertArtifactStoreConformance, type ArtifactStoreConformanceOptions, type ArtifactStoreConformanceFactory, type ArtifactStoreConformanceFailure, type ArtifactStoreConformanceReport, } from './artifacts/conformance.js';
14
+ export { runEngineConformance, assertEngineConformance, type EngineConformanceScenario, type EngineConformanceFixture, type EngineConformanceFailure, type EngineConformanceReport, } from '@obversa/api/testing';
15
+ export { runWorkspaceProviderConformance, assertWorkspaceProviderConformance, type WorkspaceProviderConformanceFixture, type WorkspaceProviderConformanceFailure, type WorkspaceProviderConformanceReport, } from './workspace/conformance.js';
@@ -0,0 +1,274 @@
1
+ import { createGraphKernel, compileGraph } from './chunk-DEW5R23M.js';
2
+ import { resolveGraphPlan } from './chunk-3L6YNPN6.js';
3
+ import { GraphValidationError, cloneFrozenJson, JsonValueError } from './chunk-5GLEABOU.js';
4
+ export { MockEngine, mockVerdict } from '@obversa/core/testing';
5
+ import { isDeepStrictEqual } from 'util';
6
+ export { assertArtifactStoreConformance, assertEngineConformance, assertEventStoreConformance, assertWorkspaceProviderConformance, runArtifactStoreConformance, runEngineConformance, runEventStoreConformance, runWorkspaceProviderConformance } from '@obversa/api/testing';
7
+
8
+ // src/env/mock.ts
9
+ var MockEnvironment = class {
10
+ constructor(opts = {}) {
11
+ this.opts = opts;
12
+ }
13
+ opts;
14
+ name = "mock-env";
15
+ upCount = 0;
16
+ downCount = 0;
17
+ async up(workspace) {
18
+ this.upCount += 1;
19
+ const url = typeof this.opts.url === "function" ? this.opts.url(workspace) : this.opts.url ?? `http://localhost/${workspace.branch ?? "main"}`;
20
+ this.opts.onUp?.(workspace);
21
+ const onDown = this.opts.onDown;
22
+ return {
23
+ url,
24
+ env: { BASE_URL: url, ...this.opts.env },
25
+ down: async () => {
26
+ this.downCount += 1;
27
+ onDown?.();
28
+ }
29
+ };
30
+ }
31
+ };
32
+ function message(error) {
33
+ return error instanceof Error ? error.message : String(error);
34
+ }
35
+ function assertExpectedDecisionTraceFitsBounds(decisions, bounds) {
36
+ const dispatchPositions = /* @__PURE__ */ new Set();
37
+ for (const commands of decisions) {
38
+ for (const command of commands) {
39
+ if (command.kind !== "dispatch") continue;
40
+ if (dispatchPositions.has(command.position)) {
41
+ throw new Error(
42
+ `Expected decision trace reuses dispatch position "${command.position}".`
43
+ );
44
+ }
45
+ dispatchPositions.add(command.position);
46
+ }
47
+ }
48
+ const dispatchCounts = decisions.map(
49
+ (commands) => commands.filter((command) => command.kind === "dispatch").length
50
+ );
51
+ const totalDispatches = dispatchCounts.reduce((total, count) => total + count, 0);
52
+ const maxFanOut = dispatchCounts.reduce(
53
+ (maximum, count) => Math.max(maximum, count),
54
+ 0
55
+ );
56
+ const finalDecision = decisions.at(-1);
57
+ const completed = finalDecision?.length === 1 && finalDecision[0]?.kind === "complete";
58
+ if (completed && bounds.dispatches.min.kind === "known" && totalDispatches < bounds.dispatches.min.value) {
59
+ const unit = totalDispatches === 1 ? "dispatch command" : "dispatch commands";
60
+ throw new Error(
61
+ `Completed trace contains ${totalDispatches} ${unit}, below declared minimum ${bounds.dispatches.min.value}.`
62
+ );
63
+ }
64
+ if (bounds.dispatches.max.kind === "known" && totalDispatches > bounds.dispatches.max.value) {
65
+ throw new Error(
66
+ `Expected decision trace contains ${totalDispatches} dispatch commands, above declared maximum ${bounds.dispatches.max.value}.`
67
+ );
68
+ }
69
+ if (bounds.maxFanOut.kind === "known" && maxFanOut > bounds.maxFanOut.value) {
70
+ throw new Error(
71
+ `Expected decision trace has fan-out ${maxFanOut}, above declared maximum ${bounds.maxFanOut.value}.`
72
+ );
73
+ }
74
+ }
75
+ function runGraphTypeConformance(fixture) {
76
+ const cases = [
77
+ {
78
+ name: "deterministic compile",
79
+ run() {
80
+ const first = compileGraph(fixture.graphType, fixture.definition);
81
+ const second = compileGraph(fixture.graphType, fixture.definition);
82
+ if (!isDeepStrictEqual(first.definition, second.definition)) {
83
+ throw new Error("Repeated compile changed the definition snapshot.");
84
+ }
85
+ if (!isDeepStrictEqual(first.describe(), second.describe())) {
86
+ throw new Error("Repeated compile changed the graph description.");
87
+ }
88
+ const initialStates = [
89
+ first.initialState(),
90
+ first.initialState(),
91
+ second.initialState(),
92
+ second.initialState()
93
+ ];
94
+ if (initialStates.some(
95
+ (state) => !isDeepStrictEqual(state, fixture.expected.states[0])
96
+ )) {
97
+ throw new Error("Repeated compile or initialState changed the expected initial state.");
98
+ }
99
+ }
100
+ },
101
+ {
102
+ name: "deterministic replay",
103
+ run() {
104
+ if (fixture.expected.states.length !== fixture.events.length + 1) {
105
+ throw new Error("Expected states must cover the initial state and every event prefix.");
106
+ }
107
+ const first = compileGraph(fixture.graphType, fixture.definition);
108
+ const second = compileGraph(fixture.graphType, fixture.definition);
109
+ let firstState = first.initialState();
110
+ let secondState = second.initialState();
111
+ for (let index = 0; index < fixture.events.length; index += 1) {
112
+ const event = fixture.events[index];
113
+ const expected = fixture.expected.states[index + 1];
114
+ const states = [
115
+ first.reduce(firstState, event),
116
+ first.reduce(firstState, event),
117
+ second.reduce(secondState, event),
118
+ second.reduce(secondState, event)
119
+ ];
120
+ if (states.some((state) => !isDeepStrictEqual(state, expected))) {
121
+ throw new Error(`Repeated replay changed state after event prefix ${index + 1}.`);
122
+ }
123
+ firstState = states[0];
124
+ secondState = states[2];
125
+ }
126
+ }
127
+ },
128
+ {
129
+ name: "deterministic decision",
130
+ run() {
131
+ if (fixture.expected.commands.length !== fixture.events.length + 1) {
132
+ throw new Error("Expected commands must cover the initial state and every event prefix.");
133
+ }
134
+ const first = compileGraph(fixture.graphType, fixture.definition);
135
+ const second = compileGraph(fixture.graphType, fixture.definition);
136
+ let firstState = first.initialState();
137
+ let secondState = second.initialState();
138
+ for (let index = 0; index <= fixture.events.length; index += 1) {
139
+ const expected = fixture.expected.commands[index];
140
+ const commands = [
141
+ first.decide(firstState),
142
+ first.decide(firstState),
143
+ second.decide(secondState),
144
+ second.decide(secondState)
145
+ ];
146
+ if (commands.some((decision) => !isDeepStrictEqual(decision, expected))) {
147
+ throw new Error(`Repeated decision changed the ordered command at event prefix ${index}.`);
148
+ }
149
+ const event = fixture.events[index];
150
+ if (event) {
151
+ firstState = first.reduce(firstState, event);
152
+ secondState = second.reduce(secondState, event);
153
+ }
154
+ }
155
+ }
156
+ },
157
+ {
158
+ name: "input immutability",
159
+ run() {
160
+ const definitionBefore = structuredClone(fixture.definition);
161
+ const eventsBefore = structuredClone(fixture.events);
162
+ const compiled = compileGraph(fixture.graphType, fixture.definition);
163
+ let state = compiled.initialState();
164
+ for (const event of fixture.events) state = compiled.reduce(state, event);
165
+ compiled.decide(state);
166
+ if (!isDeepStrictEqual(fixture.definition, definitionBefore)) {
167
+ throw new Error("Graph code changed the caller definition.");
168
+ }
169
+ if (!isDeepStrictEqual(fixture.events, eventsBefore)) {
170
+ throw new Error("Graph code changed caller events.");
171
+ }
172
+ }
173
+ },
174
+ {
175
+ name: "invalid definitions",
176
+ run() {
177
+ for (const invalid of fixture.invalidDefinitions) {
178
+ try {
179
+ compileGraph(fixture.graphType, invalid);
180
+ } catch (error) {
181
+ if (error instanceof GraphValidationError) continue;
182
+ throw new Error(`Invalid definition returned ${message(error)} instead of GraphValidationError.`);
183
+ }
184
+ throw new Error("Invalid definition compiled successfully.");
185
+ }
186
+ }
187
+ },
188
+ {
189
+ name: "deterministic plan resolution",
190
+ run() {
191
+ const firstCompiled = compileGraph(fixture.graphType, fixture.definition);
192
+ const secondCompiled = compileGraph(fixture.graphType, fixture.definition);
193
+ const plans = [
194
+ resolveGraphPlan(firstCompiled.describe(), fixture.planResolution),
195
+ resolveGraphPlan(firstCompiled.describe(), fixture.planResolution),
196
+ resolveGraphPlan(secondCompiled.describe(), fixture.planResolution),
197
+ resolveGraphPlan(secondCompiled.describe(), fixture.planResolution)
198
+ ];
199
+ if (plans.some((plan) => !isDeepStrictEqual(plan, plans[0]))) {
200
+ throw new Error("Repeated plan resolution changed the plan bytes or digest.");
201
+ }
202
+ if (!isDeepStrictEqual(plans[0].plan.bounds, fixture.expected.bounds)) {
203
+ throw new Error("Resolved plan bounds do not match the fixture.");
204
+ }
205
+ assertExpectedDecisionTraceFitsBounds(
206
+ fixture.expected.commands,
207
+ plans[0].plan.bounds
208
+ );
209
+ }
210
+ }
211
+ ];
212
+ const failures = [];
213
+ for (const item of cases) {
214
+ try {
215
+ item.run();
216
+ } catch (error) {
217
+ failures.push({ case: item.name, message: message(error) });
218
+ }
219
+ }
220
+ return Object.freeze({
221
+ ok: failures.length === 0,
222
+ cases: cases.length,
223
+ failures: Object.freeze(failures.map((failure) => Object.freeze(failure)))
224
+ });
225
+ }
226
+ function assertGraphTypeConformance(fixture) {
227
+ const report = runGraphTypeConformance(fixture);
228
+ if (report.ok) return;
229
+ const detail = report.failures.map((failure) => `${failure.case}: ${failure.message}`).join("; ");
230
+ throw new Error(`Graph type conformance failed: ${detail}`);
231
+ }
232
+
233
+ // src/testing.ts
234
+ function defineGraphDefinition(input) {
235
+ return createGraphKernel(input).definition.value;
236
+ }
237
+ function checkedEvent(input) {
238
+ let event;
239
+ try {
240
+ event = cloneFrozenJson(input);
241
+ } catch (error) {
242
+ if (!(error instanceof JsonValueError)) throw error;
243
+ throw new GraphValidationError("Invalid graph event.", [{
244
+ code: "INVALID_GRAPH_EVENT",
245
+ path: error.path,
246
+ message: error.message
247
+ }]);
248
+ }
249
+ if (event === null || typeof event !== "object" || Array.isArray(event) || Object.keys(event).sort().join(",") !== "payload,type,version" || typeof event.type !== "string" || event.type.trim().length === 0 || !Number.isSafeInteger(event.version) || event.version < 1) {
250
+ throw new GraphValidationError("Invalid graph event.", [{
251
+ code: "INVALID_GRAPH_EVENT",
252
+ path: "",
253
+ message: "An event must contain a non-empty type, positive version, and JSON payload."
254
+ }]);
255
+ }
256
+ return event;
257
+ }
258
+ function createGraphEventTrace(seed = []) {
259
+ let ordered = Object.freeze(seed.map(checkedEvent));
260
+ return Object.freeze({
261
+ get events() {
262
+ return ordered;
263
+ },
264
+ record(event) {
265
+ const checked = checkedEvent(event);
266
+ ordered = Object.freeze([...ordered, checked]);
267
+ return checked;
268
+ }
269
+ });
270
+ }
271
+
272
+ export { MockEnvironment, assertGraphTypeConformance, createGraphEventTrace, defineGraphDefinition, runGraphTypeConformance };
273
+ //# sourceMappingURL=testing.js.map
274
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/env/mock.ts","../src/graph/conformance.ts","../src/testing.ts"],"names":[],"mappings":"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","file":"testing.js","sourcesContent":["/**\n * A scripted, offline environment, mirroring `MockEngine`. It simulates a deploy\n * (hands back a URL + env vars, counts up/down) with no network, so the\n * lifecycle binding and gate integration run the same code paths in tests as a\n * real sst/Vercel adapter would.\n */\n\nimport type { Workspace } from '../core/types.js';\nimport type { Environment, EnvHandle } from './environment.js';\n\nexport interface MockEnvOptions {\n /** The URL to hand back. A function derives it from the workspace (branch). */\n url?: string | ((ws: Workspace) => string);\n /** Extra env vars to inject alongside `BASE_URL`. */\n env?: Record<string, string>;\n onUp?: (ws: Workspace) => void;\n onDown?: () => void;\n}\n\nexport class MockEnvironment implements Environment {\n readonly name = 'mock-env';\n upCount = 0;\n downCount = 0;\n\n constructor(private readonly opts: MockEnvOptions = {}) {}\n\n async up(workspace: Workspace): Promise<EnvHandle> {\n this.upCount += 1;\n const url =\n typeof this.opts.url === 'function'\n ? this.opts.url(workspace)\n : (this.opts.url ?? `http://localhost/${workspace.branch ?? 'main'}`);\n this.opts.onUp?.(workspace);\n const onDown = this.opts.onDown;\n return {\n url,\n env: { BASE_URL: url, ...this.opts.env },\n down: async () => {\n this.downCount += 1;\n onDown?.();\n },\n };\n }\n}\n","import { isDeepStrictEqual } from 'node:util';\n\nimport type { GraphDefinition } from './kernel.js';\nimport type { GraphCommand } from './commands.js';\nimport {\n resolveGraphPlan,\n type GraphBounds,\n type GraphRequirements,\n type PlanResolution,\n} from './plan.js';\nimport {\n compileGraph,\n type GraphEvent,\n type GraphType,\n} from './type.js';\nimport { GraphValidationError, type JsonValue } from './value.js';\n\nexport interface GraphTypeConformanceFixture<\n Definition extends GraphDefinition = GraphDefinition,\n State extends JsonValue = JsonValue,\n Event extends GraphEvent = GraphEvent,\n Requirements extends GraphRequirements = GraphRequirements,\n> {\n readonly graphType: GraphType<Definition, State, Event, Requirements>;\n readonly definition: Definition;\n readonly events: readonly Event[];\n readonly invalidDefinitions: readonly [Definition, ...Definition[]];\n readonly planResolution: PlanResolution;\n readonly expected: {\n /** Initial state followed by the state after each event prefix. */\n readonly states: readonly [State, ...State[]];\n /** Ordered decision at the initial state and after each event prefix. */\n readonly commands: readonly [readonly GraphCommand[], ...(readonly GraphCommand[])[]];\n readonly bounds: GraphBounds;\n };\n}\n\nexport interface GraphTypeConformanceFailure {\n readonly case: string;\n readonly message: string;\n}\n\nexport interface GraphTypeConformanceReport {\n readonly ok: boolean;\n readonly cases: number;\n readonly failures: readonly GraphTypeConformanceFailure[];\n}\n\ninterface ConformanceCase {\n readonly name: string;\n run(): void;\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction assertExpectedDecisionTraceFitsBounds(\n decisions: readonly (readonly GraphCommand[])[],\n bounds: GraphBounds,\n): void {\n const dispatchPositions = new Set<string>();\n for (const commands of decisions) {\n for (const command of commands) {\n if (command.kind !== 'dispatch') continue;\n if (dispatchPositions.has(command.position)) {\n throw new Error(\n `Expected decision trace reuses dispatch position \"${command.position}\".`,\n );\n }\n dispatchPositions.add(command.position);\n }\n }\n\n const dispatchCounts = decisions.map(\n (commands) => commands.filter((command) => command.kind === 'dispatch').length,\n );\n const totalDispatches = dispatchCounts.reduce((total, count) => total + count, 0);\n const maxFanOut = dispatchCounts.reduce(\n (maximum, count) => Math.max(maximum, count),\n 0,\n );\n const finalDecision = decisions.at(-1);\n const completed = finalDecision?.length === 1\n && finalDecision[0]?.kind === 'complete';\n\n if (\n completed\n && bounds.dispatches.min.kind === 'known'\n && totalDispatches < bounds.dispatches.min.value\n ) {\n const unit = totalDispatches === 1 ? 'dispatch command' : 'dispatch commands';\n throw new Error(\n `Completed trace contains ${totalDispatches} ${unit}, below declared minimum ${bounds.dispatches.min.value}.`,\n );\n }\n\n if (\n bounds.dispatches.max.kind === 'known'\n && totalDispatches > bounds.dispatches.max.value\n ) {\n throw new Error(\n `Expected decision trace contains ${totalDispatches} dispatch commands, above declared maximum ${bounds.dispatches.max.value}.`,\n );\n }\n if (\n bounds.maxFanOut.kind === 'known'\n && maxFanOut > bounds.maxFanOut.value\n ) {\n throw new Error(\n `Expected decision trace has fan-out ${maxFanOut}, above declared maximum ${bounds.maxFanOut.value}.`,\n );\n }\n}\n\n/** Run the framework-free behavioral checks for an outside graph type. */\nexport function runGraphTypeConformance<\n Definition extends GraphDefinition,\n State extends JsonValue,\n Event extends GraphEvent,\n Requirements extends GraphRequirements,\n>(\n fixture: GraphTypeConformanceFixture<Definition, State, Event, Requirements>,\n): GraphTypeConformanceReport {\n const cases: ConformanceCase[] = [\n {\n name: 'deterministic compile',\n run() {\n const first = compileGraph(fixture.graphType, fixture.definition);\n const second = compileGraph(fixture.graphType, fixture.definition);\n if (!isDeepStrictEqual(first.definition, second.definition)) {\n throw new Error('Repeated compile changed the definition snapshot.');\n }\n if (!isDeepStrictEqual(first.describe(), second.describe())) {\n throw new Error('Repeated compile changed the graph description.');\n }\n const initialStates = [\n first.initialState(),\n first.initialState(),\n second.initialState(),\n second.initialState(),\n ];\n if (initialStates.some(\n (state) => !isDeepStrictEqual(state, fixture.expected.states[0]),\n )) {\n throw new Error('Repeated compile or initialState changed the expected initial state.');\n }\n },\n },\n {\n name: 'deterministic replay',\n run() {\n if (fixture.expected.states.length !== fixture.events.length + 1) {\n throw new Error('Expected states must cover the initial state and every event prefix.');\n }\n const first = compileGraph(fixture.graphType, fixture.definition);\n const second = compileGraph(fixture.graphType, fixture.definition);\n let firstState = first.initialState();\n let secondState = second.initialState();\n for (let index = 0; index < fixture.events.length; index += 1) {\n const event = fixture.events[index]!;\n const expected = fixture.expected.states[index + 1]!;\n const states = [\n first.reduce(firstState, event),\n first.reduce(firstState, event),\n second.reduce(secondState, event),\n second.reduce(secondState, event),\n ];\n if (states.some((state) => !isDeepStrictEqual(state, expected))) {\n throw new Error(`Repeated replay changed state after event prefix ${index + 1}.`);\n }\n firstState = states[0]!;\n secondState = states[2]!;\n }\n },\n },\n {\n name: 'deterministic decision',\n run() {\n if (fixture.expected.commands.length !== fixture.events.length + 1) {\n throw new Error('Expected commands must cover the initial state and every event prefix.');\n }\n const first = compileGraph(fixture.graphType, fixture.definition);\n const second = compileGraph(fixture.graphType, fixture.definition);\n let firstState = first.initialState();\n let secondState = second.initialState();\n for (let index = 0; index <= fixture.events.length; index += 1) {\n const expected = fixture.expected.commands[index]!;\n const commands = [\n first.decide(firstState),\n first.decide(firstState),\n second.decide(secondState),\n second.decide(secondState),\n ];\n if (commands.some((decision) => !isDeepStrictEqual(decision, expected))) {\n throw new Error(`Repeated decision changed the ordered command at event prefix ${index}.`);\n }\n const event = fixture.events[index];\n if (event) {\n firstState = first.reduce(firstState, event);\n secondState = second.reduce(secondState, event);\n }\n }\n },\n },\n {\n name: 'input immutability',\n run() {\n const definitionBefore = structuredClone(fixture.definition);\n const eventsBefore = structuredClone(fixture.events);\n const compiled = compileGraph(fixture.graphType, fixture.definition);\n let state = compiled.initialState();\n for (const event of fixture.events) state = compiled.reduce(state, event);\n compiled.decide(state);\n if (!isDeepStrictEqual(fixture.definition, definitionBefore)) {\n throw new Error('Graph code changed the caller definition.');\n }\n if (!isDeepStrictEqual(fixture.events, eventsBefore)) {\n throw new Error('Graph code changed caller events.');\n }\n },\n },\n {\n name: 'invalid definitions',\n run() {\n for (const invalid of fixture.invalidDefinitions) {\n try {\n compileGraph(fixture.graphType, invalid);\n } catch (error) {\n if (error instanceof GraphValidationError) continue;\n throw new Error(`Invalid definition returned ${message(error)} instead of GraphValidationError.`);\n }\n throw new Error('Invalid definition compiled successfully.');\n }\n },\n },\n {\n name: 'deterministic plan resolution',\n run() {\n const firstCompiled = compileGraph(fixture.graphType, fixture.definition);\n const secondCompiled = compileGraph(fixture.graphType, fixture.definition);\n const plans = [\n resolveGraphPlan(firstCompiled.describe(), fixture.planResolution),\n resolveGraphPlan(firstCompiled.describe(), fixture.planResolution),\n resolveGraphPlan(secondCompiled.describe(), fixture.planResolution),\n resolveGraphPlan(secondCompiled.describe(), fixture.planResolution),\n ];\n if (plans.some((plan) => !isDeepStrictEqual(plan, plans[0]))) {\n throw new Error('Repeated plan resolution changed the plan bytes or digest.');\n }\n if (!isDeepStrictEqual(plans[0]!.plan.bounds, fixture.expected.bounds)) {\n throw new Error('Resolved plan bounds do not match the fixture.');\n }\n assertExpectedDecisionTraceFitsBounds(\n fixture.expected.commands,\n plans[0]!.plan.bounds,\n );\n },\n },\n ];\n\n const failures: GraphTypeConformanceFailure[] = [];\n for (const item of cases) {\n try {\n item.run();\n } catch (error) {\n failures.push({ case: item.name, message: message(error) });\n }\n }\n return Object.freeze({\n ok: failures.length === 0,\n cases: cases.length,\n failures: Object.freeze(failures.map((failure) => Object.freeze(failure))),\n });\n}\n\n/** Throw one readable error when an outside graph type breaks the contract. */\nexport function assertGraphTypeConformance<\n Definition extends GraphDefinition,\n State extends JsonValue,\n Event extends GraphEvent,\n Requirements extends GraphRequirements,\n>(\n fixture: GraphTypeConformanceFixture<Definition, State, Event, Requirements>,\n): void {\n const report = runGraphTypeConformance(fixture);\n if (report.ok) return;\n const detail = report.failures\n .map((failure) => `${failure.case}: ${failure.message}`)\n .join('; ');\n throw new Error(`Graph type conformance failed: ${detail}`);\n}\n","import {\n createGraphKernel,\n type GraphDefinition,\n} from './graph/kernel.js';\nimport type { GraphEvent } from './graph/type.js';\nimport {\n cloneFrozenJson,\n GraphValidationError,\n JsonValueError,\n type JsonValue,\n} from './graph/value.js';\n\nexport function defineGraphDefinition<const Definition extends GraphDefinition>(\n input: Definition,\n): Definition {\n return createGraphKernel(input).definition.value;\n}\n\nexport interface GraphEventTrace<Event extends GraphEvent = GraphEvent> {\n readonly events: readonly Event[];\n record<Next extends Event>(event: Next): Next;\n}\n\nfunction checkedEvent<Event extends GraphEvent>(input: Event): Event {\n let event: Event;\n try {\n event = cloneFrozenJson(input as unknown as JsonValue) as unknown as Event;\n } catch (error) {\n if (!(error instanceof JsonValueError)) throw error;\n throw new GraphValidationError('Invalid graph event.', [{\n code: 'INVALID_GRAPH_EVENT',\n path: error.path,\n message: error.message,\n }]);\n }\n if (\n event === null\n || typeof event !== 'object'\n || Array.isArray(event)\n || Object.keys(event).sort().join(',') !== 'payload,type,version'\n || typeof event.type !== 'string'\n || event.type.trim().length === 0\n || !Number.isSafeInteger(event.version)\n || event.version < 1\n ) {\n throw new GraphValidationError('Invalid graph event.', [{\n code: 'INVALID_GRAPH_EVENT',\n path: '',\n message: 'An event must contain a non-empty type, positive version, and JSON payload.',\n }]);\n }\n return event;\n}\n\nexport function createGraphEventTrace<Event extends GraphEvent>(\n seed: readonly Event[] = [],\n): GraphEventTrace<Event> {\n let ordered = Object.freeze(seed.map(checkedEvent));\n return Object.freeze({\n get events(): readonly Event[] {\n return ordered;\n },\n record<Next extends Event>(event: Next): Next {\n const checked = checkedEvent(event);\n ordered = Object.freeze([...ordered, checked]);\n return checked;\n },\n });\n}\n\nexport {\n MockEngine,\n mockVerdict,\n type MockResponder,\n} from './engines/mock.js';\nexport {\n MockEnvironment,\n type MockEnvOptions,\n} from './env/mock.js';\nexport {\n runGraphTypeConformance,\n assertGraphTypeConformance,\n type GraphTypeConformanceFixture,\n type GraphTypeConformanceFailure,\n type GraphTypeConformanceReport,\n} from './graph/conformance.js';\nexport {\n runEventStoreConformance,\n assertEventStoreConformance,\n type EventStoreConformanceFactory,\n type EventStoreConformanceFailure,\n type EventStoreConformanceReport,\n} from './events/conformance.js';\nexport {\n runArtifactStoreConformance,\n assertArtifactStoreConformance,\n type ArtifactStoreConformanceOptions,\n type ArtifactStoreConformanceFactory,\n type ArtifactStoreConformanceFailure,\n type ArtifactStoreConformanceReport,\n} from './artifacts/conformance.js';\nexport {\n runEngineConformance,\n assertEngineConformance,\n type EngineConformanceScenario,\n type EngineConformanceFixture,\n type EngineConformanceFailure,\n type EngineConformanceReport,\n} from '@obversa/api/testing';\nexport {\n runWorkspaceProviderConformance,\n assertWorkspaceProviderConformance,\n type WorkspaceProviderConformanceFixture,\n type WorkspaceProviderConformanceFailure,\n type WorkspaceProviderConformanceReport,\n} from './workspace/conformance.js';\n"]}
@@ -0,0 +1,3 @@
1
+ import type { Outcome } from './core/types.js';
2
+ export declare const INVALID_TEAM_DECISION = "The engine response was not a valid team decision JSON object.";
3
+ export declare function outcomeFromAgentText(text: string, target?: string): Outcome;