effect-agent 0.1.0-beta.132 → 0.1.0-beta.133

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 (55) hide show
  1. package/dist/{Admin-C34cVKlT.d.mts → Admin-CUja0lmO.d.mts} +21 -3
  2. package/dist/{DurableAgentRuntime-BydyN_n-.mjs → DurableAgentRuntime-DH2baLGe.mjs} +13 -21
  3. package/dist/DurableAgentRuntime-DH2baLGe.mjs.map +1 -0
  4. package/dist/{EventSource-Bac0SxKL.d.mts → EventSource-DoiZF3xv.d.mts} +2 -2
  5. package/dist/{PreparedInputAdmission-DcQGQ0Yp.d.mts → PreparedInputAdmission-B1bzyIuV.d.mts} +3 -3
  6. package/dist/{Subscription-Bk2Smmqc.d.mts → Subscription-m_yNfNeN.d.mts} +2 -2
  7. package/dist/{SubscriptionInput-ekbJz3pF.d.mts → SubscriptionInput-ON3-b8Sl.d.mts} +2 -2
  8. package/dist/durable/Admin.d.mts +1 -1
  9. package/dist/durable/AgentRegistration.d.mts +1 -1
  10. package/dist/durable/Certification.d.mts +1 -1
  11. package/dist/durable/CommittedActivity.d.mts +1 -1
  12. package/dist/durable/DurableAgentRuntime.d.mts +1 -1
  13. package/dist/durable/DurableAgentRuntime.mjs +1 -1
  14. package/dist/durable/EventSource.d.mts +1 -1
  15. package/dist/durable/GitHubWorkflowSource.d.mts +3 -3
  16. package/dist/durable/MessageDelivery.d.mts +41 -41
  17. package/dist/durable/MessageDeliveryStoreConformance.d.mts +39 -39
  18. package/dist/durable/PersistentHistory.d.mts +1 -1
  19. package/dist/durable/PreparedInputAdmission.d.mts +1 -1
  20. package/dist/durable/Recovery.d.mts +1 -1
  21. package/dist/durable/RunJournal.d.mts +1 -1
  22. package/dist/durable/Scheduling.d.mts +1 -1
  23. package/dist/durable/SqlStorageV2Upgrade.d.mts +1 -1
  24. package/dist/durable/SqlSubscriptionStore.d.mts +1 -1
  25. package/dist/durable/SqlThreadNativeReads.d.mts +2 -1
  26. package/dist/durable/SqlThreadNativeReads.mjs +75 -38
  27. package/dist/durable/SqlThreadNativeReads.mjs.map +1 -1
  28. package/dist/durable/SubmissionLedger.d.mts +1 -1
  29. package/dist/durable/SubmissionLedgerConformance.d.mts +1 -1
  30. package/dist/durable/SubmissionStatus.d.mts +1 -1
  31. package/dist/durable/Subscription.d.mts +1 -1
  32. package/dist/durable/SubscriptionInput.d.mts +1 -1
  33. package/dist/durable/SubscriptionStoreConformance.d.mts +1 -1
  34. package/dist/durable/SubscriptionTools.d.mts +2 -2
  35. package/dist/durable/SubscriptionTransition.d.mts +1 -1
  36. package/dist/durable/Subscriptions.d.mts +5 -5
  37. package/dist/durable/ThreadContextHistory.d.mts +1 -1
  38. package/dist/durable/ThreadInvariants.d.mts +1 -1
  39. package/dist/durable/ThreadProjectionMaintenance.d.mts +1 -1
  40. package/dist/durable/ThreadStore.d.mts +2 -2
  41. package/dist/durable/ThreadStore.mjs +30 -2
  42. package/dist/durable/ThreadStore.mjs.map +1 -1
  43. package/dist/durable/ThreadStoreConformance.d.mts +1 -1
  44. package/dist/durable/ThreadStoreConformance.mjs +34 -3
  45. package/dist/durable/ThreadStoreConformance.mjs.map +1 -1
  46. package/dist/durable/WorkerHost.d.mts +1 -1
  47. package/dist/index.d.mts +5 -5
  48. package/dist/index.mjs +2 -2
  49. package/package.json +1 -1
  50. package/src/durable/SqlThreadNativeReads.ts +75 -2
  51. package/src/durable/ThreadStore.ts +63 -1
  52. package/src/durable/ThreadStoreConformance.ts +113 -1
  53. package/src/durable/internal/agent-updates.ts +4 -0
  54. package/src/durable/internal/worker-host.ts +17 -18
  55. package/dist/DurableAgentRuntime-BydyN_n-.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SqlThreadNativeReads.mjs","names":[],"sources":["../../src/durable/SqlThreadNativeReads.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport {\n CanonicalRecord,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n RecordId,\n} from \"./Records.ts\";\nimport { runIdForSubmission } from \"./RunJournal.ts\";\nimport type { ThreadStore } from \"./ThreadStore.ts\";\nimport {\n SelectedThreadRead,\n ThreadPeerCountRequest,\n ThreadNotMaterialized,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\n\nconst failure = (operation: string, cause?: unknown) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n ...(cause === undefined ? {} : { cause }),\n });\n\n/** Adapter-owned metadata on canonical rows, never a second copy of execution records. */\nexport const createNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`ALTER TABLE effect_agent_canonical_records ADD COLUMN outstanding INTEGER NOT NULL DEFAULT 0`;\n yield* sql`CREATE INDEX effect_agent_records_outstanding ON effect_agent_canonical_records(thread_id, sequence) WHERE outstanding <> 0`;\n yield* sql`CREATE INDEX effect_agent_records_call ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload._tag'), json_extract(record_json, '$.payload.runId'), json_extract(record_json, '$.payload.toolCallId'))`;\n yield* sql`CREATE INDEX effect_agent_records_run_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.runId')) WHERE json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user'`;\n yield* sql`CREATE INDEX effect_agent_records_subtree ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.sourceSubmissionId'), sequence) WHERE json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved'`;\n yield* sql`CREATE INDEX effect_agent_records_worker_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.admission.messageId')) WHERE json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'`;\n});\n\n/** Must run in the canonical append/upgrade transaction, after inserting this record. */\nexport const indexCanonicalRecord = Effect.fnUntraced(function* (\n threadId: string,\n record: CanonicalRecord,\n) {\n const sql = yield* SqlClient.SqlClient;\n const payload = record.payload;\n\n switch (payload._tag) {\n case \"ToolCallPrepared\":\n case \"ToolCallUnknown\": {\n if (payload._tag === \"ToolCallUnknown\")\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'ToolCallPrepared'\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = ${payload._tag === \"ToolCallPrepared\" ? 1 : 2}\n WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n }\n case \"ToolCallSettled\":\n for (const tag of [\"ToolCallPrepared\", \"ToolCallUnknown\"])\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n break;\n case \"WorkerInputRequested\":\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = 3 WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n case \"WorkerInputCompleted\":\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = ${payload.effectsResolved ? 0 : 4}\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'\n AND json_extract(record_json, '$.payload.admission.messageId') = ${payload.messageId}`;\n break;\n }\n});\n\n/** One-time native index construction during the atomic supported-format upgrade. */\nexport const seedNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n // This is the one supported-format upgrade, in the adapter transaction. Decode in\n // bounded pages; malformed rows or gaps roll back both metadata and version.\n const gaps =\n yield* sql`SELECT t.thread_id FROM effect_agent_threads t LEFT JOIN effect_agent_canonical_records r ON r.thread_id = t.thread_id\n GROUP BY t.thread_id HAVING count(r.sequence) <> t.tail_sequence OR coalesce(max(r.sequence), 0) <> t.tail_sequence\n UNION ALL SELECT r.thread_id FROM effect_agent_canonical_records r LEFT JOIN effect_agent_threads t ON t.thread_id = r.thread_id WHERE t.thread_id IS NULL LIMIT 1`;\n\n if (gaps.length > 0) return yield* failure(\"native index upgrade canonical gap\");\n let afterThread = \"\";\n let afterSequence = 0;\n\n while (true) {\n const rows = yield* sql<{\n thread_id: string;\n record_id: string;\n sequence: number;\n record_json: string;\n }>`SELECT thread_id, record_id, sequence, record_json FROM effect_agent_canonical_records\n WHERE (thread_id, sequence) > (${afterThread}, ${afterSequence}) ORDER BY thread_id, sequence LIMIT 100`;\n\n if (rows.length === 0) break;\n for (const row of rows) {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(CanonicalRecord))(\n row.record_json,\n );\n\n if (\n record.recordId !== row.record_id ||\n row.sequence !== (row.thread_id === afterThread ? afterSequence : 0) + 1\n )\n return yield* failure(\"native index upgrade canonical identity\");\n yield* indexCanonicalRecord(row.thread_id, record);\n afterThread = row.thread_id;\n afterSequence = row.sequence;\n }\n }\n});\n\nconst Row = Schema.Struct({\n thread_id: SelectedThreadRead.fields.threadId,\n sequence: CanonicalSequence,\n record_id: RecordId,\n batch_id: CanonicalRecordEnvelope.fields.batchId,\n record_json: Schema.String,\n outstanding: Schema.optionalKey(Schema.Int),\n});\n\nexport const makeSelectedReads = Effect.fnUntraced(function* (\n envelope: (row: typeof Row.Type) => Effect.Effect<CanonicalRecordEnvelope, ThreadStoreError>,\n) {\n const sql = yield* SqlClient.SqlClient;\n\n const requireThread = Effect.fnUntraced(function* (threadId: SelectedThreadRead[\"threadId\"]) {\n const rows =\n yield* sql`SELECT tail_sequence, tail_digest FROM effect_agent_threads WHERE thread_id = ${threadId}`;\n\n if (rows.length === 0) return yield* ThreadNotMaterialized.make({ threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(Schema.Struct({ tail_sequence: CanonicalSequence, tail_digest: Digest })),\n )(rows);\n\n if (decoded.length !== 1 || decoded[0] === undefined)\n return yield* failure(\"native thread tail\");\n\n return decoded[0];\n });\n\n const read = Effect.fnUntraced(\n function* (request: SelectedThreadRead) {\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tail = yield* requireThread(request.threadId);\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n (tail.tail_sequence !== selection.expectedTailSequence ||\n tail.tail_digest !== selection.expectedTailDigest)\n )\n return yield* failure(\"selected read tail changed\");\n const after = request.page.afterSequence ?? 0;\n let rows: unknown;\n\n switch (selection._tag) {\n case \"RecordId\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;\n break;\n case \"RunInput\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;\n break;\n case \"Outstanding\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n case \"WorkerExecution\":\n rows = (yield* Effect.forEach(\n [\"UserInputRecorded\", \"RunStarted\"],\n (tag) =>\n sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') IS NOT NULL\n ORDER BY sequence DESC LIMIT 1`,\n ))\n .flat()\n .filter((row) => Number(row.sequence) > after)\n .sort((a, b) => Number(a.sequence) - Number(b.sequence))\n .slice(0, request.page.limit);\n break;\n case \"WorkerState\": {\n const runId =\n selection.sourceSubmissionId === undefined\n ? null\n : runIdForSubmission(selection.sourceSubmissionId);\n\n rows = yield* sql`\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') IN ('ThreadCreated', 'WorkerOriginRecorded', 'SubagentLineageRecorded', 'WorkerInputRequested', 'WorkerInputCompleted', 'WorkerStopRequested')\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved' AND json_extract(record_json, '$.payload.sourceSubmissionId') IS ${selection.sourceSubmissionId ?? null}\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubagentJoined' AND json_extract(record_json, '$.payload.runId') = ${runId}\n ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n }\n }\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);\n\n if (selection._tag === \"RunInput\" && decoded.length > 1)\n return yield* failure(\"ambiguous original Run input\");\n\n return yield* Effect.forEach(\n decoded.filter((row) => row.sequence > after),\n (row) =>\n Effect.gen(function* () {\n const value = yield* envelope(row);\n\n if (\n value.record.recordId !== row.record_id ||\n row.thread_id !== request.threadId ||\n (selection._tag === \"Outstanding\" &&\n !(\n (row.outstanding === 1 && value.record.payload._tag === \"ToolCallPrepared\") ||\n (row.outstanding === 2 && value.record.payload._tag === \"ToolCallUnknown\") ||\n (row.outstanding === 3 &&\n value.record.payload._tag === \"WorkerInputRequested\")\n ))\n )\n return yield* failure(\"selected record incomplete or corrupt\");\n\n return value;\n }),\n );\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"selected read\", cause),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(ThreadPeerCountRequest)(request);\n yield* requireThread(request.threadId);\n\n const rows =\n yield* sql`SELECT 1 FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'PeerMessagePrepared' LIMIT ${request.limit}`;\n\n return rows.length;\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"countPeerMessages\", cause),\n ),\n );\n\n return { read, countPeerMessages };\n});\n"],"mappings":";;;;;;;;;;;;;AAmBA,MAAM,WAAW,WAAmB,UAClC,iBAAiB,KAAK;CACpB;CACA,SAAS;CACT,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;AACzC,CAAC;;AAGH,MAAa,0BAA0B,OAAO,IAAI,aAAa;CAC7D,MAAM,MAAM,OAAO,UAAU;CAE7B,OAAO,GAAG;CACV,OAAO,GAAG;CACV,OAAO,GAAG;CACV,OAAO,GAAG;CACV,OAAO,GAAG;CACV,OAAO,GAAG;AACZ,CAAC;;AAGD,MAAa,uBAAuB,OAAO,WAAW,WACpD,UACA,QACA;CACA,MAAM,MAAM,OAAO,UAAU;CAC7B,MAAM,UAAU,OAAO;CAEvB,QAAQ,QAAQ,MAAhB;EACE,KAAK;EACL,KAAK;GACH,IAAI,QAAQ,SAAS,mBACnB,OAAO,GAAG;;4BAEU,SAAS;+DAC0B,QAAQ,MAAM;oEACT,QAAQ;GACtE,OAAO,GAAG,2DAA2D,QAAQ,SAAS,qBAAqB,IAAI,EAAE;4BAC3F,SAAS,mBAAmB,OAAO;GACzD;EAEF,KAAK;GACH,KAAK,MAAM,OAAO,CAAC,oBAAoB,iBAAiB,GACtD,OAAO,GAAG;;4BAEU,SAAS,qDAAqD,IAAI;+DAC/B,QAAQ,MAAM;oEACT,QAAQ;GACtE;EACF,KAAK;GACH,OAAO,GAAG,+EAA+E,SAAS,mBAAmB,OAAO;GAC5H;EACF,KAAK,wBACH,OAAO,GAAG;kEACkD,QAAQ,kBAAkB,IAAI,EAAE;4BACtE,SAAS;6EACwC,QAAQ;CAEnF;AACF,CAAC;;AAGD,MAAa,wBAAwB,OAAO,IAAI,aAAa;CAC3D,MAAM,MAAM,OAAO,UAAU;CAS7B,KAAI,OAJK,GAAG;;wKAIJ,CAAC,SAAS,GAAG,OAAO,OAAO,QAAQ,oCAAoC;CAC/E,IAAI,cAAc;CAClB,IAAI,gBAAgB;CAEpB,OAAO,MAAM;EACX,MAAM,OAAO,OAAO,GAKlB;uCACiC,YAAY,IAAI,cAAc;EAEjE,IAAI,KAAK,WAAW,GAAG;EACvB,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,SAAS,OAAO,OAAO,aAAa,OAAO,eAAe,eAAe,CAAC,CAAC,CAC/E,IAAI,WACN;GAEA,IACE,OAAO,aAAa,IAAI,aACxB,IAAI,cAAc,IAAI,cAAc,cAAc,gBAAgB,KAAK,GAEvE,OAAO,OAAO,QAAQ,yCAAyC;GACjE,OAAO,qBAAqB,IAAI,WAAW,MAAM;GACjD,cAAc,IAAI;GAClB,gBAAgB,IAAI;EACtB;CACF;AACF,CAAC;AAED,MAAM,MAAM,OAAO,OAAO;CACxB,WAAW,mBAAmB,OAAO;CACrC,UAAU;CACV,WAAW;CACX,UAAU,wBAAwB,OAAO;CACzC,aAAa,OAAO;CACpB,aAAa,OAAO,YAAY,OAAO,GAAG;AAC5C,CAAC;AAED,MAAa,oBAAoB,OAAO,WAAW,WACjD,UACA;CACA,MAAM,MAAM,OAAO,UAAU;CAE7B,MAAM,gBAAgB,OAAO,WAAW,WAAW,UAA0C;EAC3F,MAAM,OACJ,OAAO,GAAG,iFAAiF;EAE7F,IAAI,KAAK,WAAW,GAAG,OAAO,OAAO,sBAAsB,KAAK,EAAE,SAAS,CAAC;EAE5E,MAAM,UAAU,OAAO,OAAO,oBAC5B,OAAO,MAAM,OAAO,OAAO;GAAE,eAAe;GAAmB,aAAa;EAAO,CAAC,CAAC,CACvF,CAAC,CAAC,IAAI;EAEN,IAAI,QAAQ,WAAW,KAAK,QAAQ,OAAO,KAAA,GACzC,OAAO,OAAO,QAAQ,oBAAoB;EAE5C,OAAO,QAAQ;CACjB,CAAC;CAuHD,OAAO;EAAE,MArHI,OAAO,WAClB,WAAW,SAA6B;GACtC,OAAO,OAAO,IAAI,gBAChB,OAAO,IAAI,aAAa;IACtB,MAAM,OAAO,OAAO,cAAc,QAAQ,QAAQ;IAClD,MAAM,YAAY,QAAQ;IAE1B,IACE,0BAA0B,cACzB,KAAK,kBAAkB,UAAU,wBAChC,KAAK,gBAAgB,UAAU,qBAEjC,OAAO,OAAO,QAAQ,4BAA4B;IACpD,MAAM,QAAQ,QAAQ,KAAK,iBAAiB;IAC5C,IAAI;IAEJ,QAAQ,UAAU,MAAlB;KACE,KAAK;MACH,OACE,OAAO,GAAG,sHAAsH,QAAQ,SAAS,mBAAmB,UAAU,SAAS,kBAAkB;MAC3M;KACF,KAAK;MACH,OACE,OAAO,GAAG,sHAAsH,QAAQ,SAAS,qLAAqL,UAAU,MAAM;MACxV;KACF,KAAK;MACH,OACE,OAAO,GAAG,mIAAmI,QAAQ,SAAS,uCAAuC,MAAM,2BAA2B,QAAQ,KAAK;MACrP;KACF,KAAK;MACH,QAAQ,OAAO,OAAO,QACpB,CAAC,qBAAqB,YAAY,IACjC,QACC,GAAG;sCACiB,QAAQ,SAAS,qDAAqD,IAAI;;iDAGlG,EAAA,CACG,KAAK,CAAC,CACN,QAAQ,QAAQ,OAAO,IAAI,QAAQ,IAAI,KAAK,CAAC,CAC7C,MAAM,GAAG,MAAM,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,QAAQ,CAAC,CAAC,CACvD,MAAM,GAAG,QAAQ,KAAK,KAAK;MAC9B;KACF,KAAK,eAAe;MAClB,MAAM,QACJ,UAAU,uBAAuB,KAAA,IAC7B,OACA,mBAAmB,UAAU,kBAAkB;MAErD,OAAO,OAAO,GAAG;;gCAEC,QAAQ,SAAS,kBAAkB,MAAM;;;gCAGzC,QAAQ,SAAS,kBAAkB,MAAM,8IAA8I,UAAU,sBAAsB,KAAK;;;gCAG5N,QAAQ,SAAS,kBAAkB,MAAM,yHAAyH,MAAM;sCAClK,QAAQ,KAAK;MACrC;KACF;IACF;IACA,MAAM,UAAU,OAAO,OAAO,oBAAoB,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;IAEzE,IAAI,UAAU,SAAS,cAAc,QAAQ,SAAS,GACpD,OAAO,OAAO,QAAQ,8BAA8B;IAEtD,OAAO,OAAO,OAAO,QACnB,QAAQ,QAAQ,QAAQ,IAAI,WAAW,KAAK,IAC3C,QACC,OAAO,IAAI,aAAa;KACtB,MAAM,QAAQ,OAAO,SAAS,GAAG;KAEjC,IACE,MAAM,OAAO,aAAa,IAAI,aAC9B,IAAI,cAAc,QAAQ,YACzB,UAAU,SAAS,iBAClB,EACG,IAAI,gBAAgB,KAAK,MAAM,OAAO,QAAQ,SAAS,sBACvD,IAAI,gBAAgB,KAAK,MAAM,OAAO,QAAQ,SAAS,qBACvD,IAAI,gBAAgB,KACnB,MAAM,OAAO,QAAQ,SAAS,yBAGpC,OAAO,OAAO,QAAQ,uCAAuC;KAE/D,OAAO;IACT,CAAC,CACL;GACF,CAAC,CACH;EACF,GACA,OAAO,UAAU,UACf,MAAM,SAAS,2BAA2B,MAAM,SAAS,qBACrD,QACA,QAAQ,iBAAiB,KAAK,CACpC,CAqBU;EAAG,mBAjBb,OAAO,WACL,WAAW,SAAS;GAClB,OAAO,OAAO,aAAa,sBAAsB,CAAC,CAAC,OAAO;GAC1D,OAAO,cAAc,QAAQ,QAAQ;GAKrC,QAAO,OAFE,GAAG,kEAAkE,QAAQ,SAAS,iFAAiF,QAAQ,QAAA,CAE5K;EACd,GACA,OAAO,UAAU,UACf,MAAM,SAAS,2BAA2B,MAAM,SAAS,qBACrD,QACA,QAAQ,qBAAqB,KAAK,CACxC,CAG2B;CAAE;AACnC,CAAC"}
1
+ {"version":3,"file":"SqlThreadNativeReads.mjs","names":[],"sources":["../../src/durable/SqlThreadNativeReads.ts"],"sourcesContent":["import { Effect, Schema } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport {\n CanonicalRecord,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n ProducerEpoch,\n RecordId,\n} from \"./Records.ts\";\nimport { runIdForSubmission, subagentLineageRecordId, workerOriginRecordId } from \"./RunJournal.ts\";\nimport type { ThreadStore } from \"./ThreadStore.ts\";\nimport {\n SelectedThreadRead,\n ThreadPeerCountRequest,\n ThreadIdentity,\n ThreadIdentityRequest,\n ThreadNotMaterialized,\n ThreadStoreError,\n} from \"./ThreadStore.ts\";\n\nconst failure = (operation: string, cause?: unknown) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n ...(cause === undefined ? {} : { cause }),\n });\n\n/** Adapter-owned metadata on canonical rows, never a second copy of execution records. */\nexport const createNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`ALTER TABLE effect_agent_canonical_records ADD COLUMN outstanding INTEGER NOT NULL DEFAULT 0`;\n yield* sql`CREATE INDEX effect_agent_records_outstanding ON effect_agent_canonical_records(thread_id, sequence) WHERE outstanding <> 0`;\n yield* sql`CREATE INDEX effect_agent_records_call ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload._tag'), json_extract(record_json, '$.payload.runId'), json_extract(record_json, '$.payload.toolCallId'))`;\n yield* sql`CREATE INDEX effect_agent_records_run_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.runId')) WHERE json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user'`;\n yield* sql`CREATE INDEX effect_agent_records_subtree ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.sourceSubmissionId'), sequence) WHERE json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved'`;\n yield* sql`CREATE INDEX effect_agent_records_worker_input ON effect_agent_canonical_records(thread_id, json_extract(record_json, '$.payload.admission.messageId')) WHERE json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'`;\n});\n\n/** Must run in the canonical append/upgrade transaction, after inserting this record. */\nexport const indexCanonicalRecord = Effect.fnUntraced(function* (\n threadId: string,\n record: CanonicalRecord,\n) {\n const sql = yield* SqlClient.SqlClient;\n const payload = record.payload;\n\n switch (payload._tag) {\n case \"ToolCallPrepared\":\n case \"ToolCallUnknown\": {\n if (payload._tag === \"ToolCallUnknown\")\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'ToolCallPrepared'\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = ${payload._tag === \"ToolCallPrepared\" ? 1 : 2}\n WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n }\n case \"ToolCallSettled\":\n for (const tag of [\"ToolCallPrepared\", \"ToolCallUnknown\"])\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = 0\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') = ${payload.runId}\n AND json_extract(record_json, '$.payload.toolCallId') = ${payload.toolCallId}`;\n break;\n case \"WorkerInputRequested\":\n yield* sql`UPDATE effect_agent_canonical_records SET outstanding = 3 WHERE thread_id = ${threadId} AND record_id = ${record.recordId}`;\n break;\n case \"WorkerInputCompleted\":\n yield* sql`\n UPDATE effect_agent_canonical_records SET outstanding = ${payload.effectsResolved ? 0 : 4}\n WHERE thread_id = ${threadId} AND json_extract(record_json, '$.payload._tag') = 'WorkerInputRequested'\n AND json_extract(record_json, '$.payload.admission.messageId') = ${payload.messageId}`;\n break;\n }\n});\n\n/** One-time native index construction during the atomic supported-format upgrade. */\nexport const seedNativeReadIndexes = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n // This is the one supported-format upgrade, in the adapter transaction. Decode in\n // bounded pages; malformed rows or gaps roll back both metadata and version.\n const gaps =\n yield* sql`SELECT t.thread_id FROM effect_agent_threads t LEFT JOIN effect_agent_canonical_records r ON r.thread_id = t.thread_id\n GROUP BY t.thread_id HAVING count(r.sequence) <> t.tail_sequence OR coalesce(max(r.sequence), 0) <> t.tail_sequence\n UNION ALL SELECT r.thread_id FROM effect_agent_canonical_records r LEFT JOIN effect_agent_threads t ON t.thread_id = r.thread_id WHERE t.thread_id IS NULL LIMIT 1`;\n\n if (gaps.length > 0) return yield* failure(\"native index upgrade canonical gap\");\n let afterThread = \"\";\n let afterSequence = 0;\n\n while (true) {\n const rows = yield* sql<{\n thread_id: string;\n record_id: string;\n sequence: number;\n record_json: string;\n }>`SELECT thread_id, record_id, sequence, record_json FROM effect_agent_canonical_records\n WHERE (thread_id, sequence) > (${afterThread}, ${afterSequence}) ORDER BY thread_id, sequence LIMIT 100`;\n\n if (rows.length === 0) break;\n for (const row of rows) {\n const record = yield* Schema.decodeEffect(Schema.fromJsonString(CanonicalRecord))(\n row.record_json,\n );\n\n if (\n record.recordId !== row.record_id ||\n row.sequence !== (row.thread_id === afterThread ? afterSequence : 0) + 1\n )\n return yield* failure(\"native index upgrade canonical identity\");\n yield* indexCanonicalRecord(row.thread_id, record);\n afterThread = row.thread_id;\n afterSequence = row.sequence;\n }\n }\n});\n\nconst Row = Schema.Struct({\n thread_id: SelectedThreadRead.fields.threadId,\n sequence: CanonicalSequence,\n record_id: RecordId,\n batch_id: CanonicalRecordEnvelope.fields.batchId,\n record_json: Schema.String,\n outstanding: Schema.optionalKey(Schema.Int),\n});\n\nexport const makeSelectedReads = Effect.fnUntraced(function* (\n envelope: (row: typeof Row.Type) => Effect.Effect<CanonicalRecordEnvelope, ThreadStoreError>,\n) {\n const sql = yield* SqlClient.SqlClient;\n\n const requireThread = Effect.fnUntraced(function* (threadId: SelectedThreadRead[\"threadId\"]) {\n const rows =\n yield* sql`SELECT tail_sequence, tail_digest FROM effect_agent_threads WHERE thread_id = ${threadId}`;\n\n if (rows.length === 0) return yield* ThreadNotMaterialized.make({ threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(Schema.Struct({ tail_sequence: CanonicalSequence, tail_digest: Digest })),\n )(rows);\n\n if (decoded.length !== 1 || decoded[0] === undefined)\n return yield* failure(\"native thread tail\");\n\n return decoded[0];\n });\n\n const read = Effect.fnUntraced(\n function* (request: SelectedThreadRead) {\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tail = yield* requireThread(request.threadId);\n const selection = request.selection;\n\n if (\n \"expectedTailSequence\" in selection &&\n (tail.tail_sequence !== selection.expectedTailSequence ||\n tail.tail_digest !== selection.expectedTailDigest)\n )\n return yield* failure(\"selected read tail changed\");\n const after = request.page.afterSequence ?? 0;\n let rows: unknown;\n\n switch (selection._tag) {\n case \"RecordId\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${selection.recordId} AND sequence > ${after}`;\n break;\n case \"RunInput\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'UserInputRecorded' AND json_extract(record_json, '$.payload.kind') = 'user' AND json_extract(record_json, '$.payload.runId') = ${selection.runId} LIMIT 2`;\n break;\n case \"Outstanding\":\n rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json, outstanding FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND outstanding <> 0 AND sequence > ${after} ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n case \"WorkerExecution\":\n rows = (yield* Effect.forEach(\n [\"UserInputRecorded\", \"RunStarted\"],\n (tag) =>\n sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = ${tag}\n AND json_extract(record_json, '$.payload.runId') IS NOT NULL\n ORDER BY sequence DESC LIMIT 1`,\n ))\n .flat()\n .filter((row) => Number(row.sequence) > after)\n .sort((a, b) => Number(a.sequence) - Number(b.sequence))\n .slice(0, request.page.limit);\n break;\n case \"WorkerState\": {\n const runId =\n selection.sourceSubmissionId === undefined\n ? null\n : runIdForSubmission(selection.sourceSubmissionId);\n\n rows = yield* sql`\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') IN ('ThreadCreated', 'WorkerOriginRecorded', 'SubagentLineageRecorded', 'WorkerInputRequested', 'WorkerInputCompleted', 'WorkerStopRequested')\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubtreeBudgetReserved' AND json_extract(record_json, '$.payload.sourceSubmissionId') IS ${selection.sourceSubmissionId ?? null}\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json FROM effect_agent_canonical_records\n WHERE thread_id = ${request.threadId} AND sequence > ${after} AND json_extract(record_json, '$.payload._tag') = 'SubagentJoined' AND json_extract(record_json, '$.payload.runId') = ${runId}\n ORDER BY sequence LIMIT ${request.page.limit}`;\n break;\n }\n }\n const decoded = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows);\n\n if (selection._tag === \"RunInput\" && decoded.length > 1)\n return yield* failure(\"ambiguous original Run input\");\n\n return yield* Effect.forEach(\n decoded.filter((row) => row.sequence > after),\n (row) =>\n Effect.gen(function* () {\n const value = yield* envelope(row);\n\n if (\n value.record.recordId !== row.record_id ||\n row.thread_id !== request.threadId ||\n (selection._tag === \"Outstanding\" &&\n !(\n (row.outstanding === 1 && value.record.payload._tag === \"ToolCallPrepared\") ||\n (row.outstanding === 2 && value.record.payload._tag === \"ToolCallUnknown\") ||\n (row.outstanding === 3 &&\n value.record.payload._tag === \"WorkerInputRequested\")\n ))\n )\n return yield* failure(\"selected record incomplete or corrupt\");\n\n return value;\n }),\n );\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"selected read\", cause),\n ),\n );\n\n const readIdentity: ThreadStore[\"Service\"][\"readIdentity\"] = Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(Schema.toType(ThreadIdentityRequest))(request);\n\n return yield* sql.withTransaction(\n Effect.gen(function* () {\n const tails = yield* sql`SELECT tail_sequence, tail_digest, producer_epoch\n FROM effect_agent_threads WHERE thread_id = ${request.threadId}`;\n\n if (tails.length === 0)\n return yield* ThreadNotMaterialized.make({ threadId: request.threadId });\n\n const decoded = yield* Schema.decodeUnknownEffect(\n Schema.Array(\n Schema.Struct({\n tail_sequence: CanonicalSequence,\n tail_digest: Digest,\n producer_epoch: ProducerEpoch,\n }),\n ),\n )(tails);\n\n const tail = decoded[0];\n\n if (decoded.length !== 1 || tail === undefined) return yield* failure(\"identity tail\");\n const origin = workerOriginRecordId(request.threadId);\n const lineage = subagentLineageRecordId(request.threadId);\n\n const rows =\n yield* sql`SELECT thread_id, sequence, record_id, batch_id, record_json FROM (\n SELECT thread_id, sequence, record_id, batch_id, record_json, 0 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND sequence = 1\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json, 1 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${origin} AND sequence <> 1\n UNION ALL\n SELECT thread_id, sequence, record_id, batch_id, record_json, 2 AS identity_order\n FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND record_id = ${lineage} AND sequence <> 1\n ) ORDER BY identity_order`;\n\n const records = yield* Schema.decodeUnknownEffect(Schema.Array(Row))(rows).pipe(\n Effect.flatMap(\n Effect.forEach((row) =>\n envelope(row).pipe(\n Effect.filterOrFail(\n (value) => value.record.recordId === row.record_id,\n () => failure(\"identity record locator\"),\n ),\n ),\n ),\n ),\n );\n\n return yield* ThreadIdentity.makeEffect({\n threadId: request.threadId,\n tailSequence: tail.tail_sequence,\n tailDigest: tail.tail_digest,\n producerEpoch: tail.producer_epoch,\n records,\n });\n }),\n );\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"readIdentity\", cause),\n ),\n );\n\n const countPeerMessages: NonNullable<ThreadStore[\"Service\"][\"countPeerMessages\"]> =\n Effect.fnUntraced(\n function* (request) {\n yield* Schema.decodeEffect(ThreadPeerCountRequest)(request);\n yield* requireThread(request.threadId);\n\n const rows =\n yield* sql`SELECT 1 FROM effect_agent_canonical_records WHERE thread_id = ${request.threadId} AND json_extract(record_json, '$.payload._tag') = 'PeerMessagePrepared' LIMIT ${request.limit}`;\n\n return rows.length;\n },\n Effect.mapError((cause) =>\n cause._tag === \"ThreadNotMaterialized\" || cause._tag === \"ThreadStoreError\"\n ? cause\n : failure(\"countPeerMessages\", cause),\n ),\n );\n\n return { read, countPeerMessages, readIdentity };\n});\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { i as QueueSequence, n as JoinedToHost, r as Principal, t as IdempotencyKey } from "../Receipt-BAHyigAF.mjs";
2
- import { $t as RecoverySnapshot, An as UnknownResolution, At as ChildReservationConflict, Bn as submissionAbortRecordId, Bt as JoinSnapshot, Cn as SubmissionSnapshot, Ct as ApprovalDecisionIntent, Dn as SuspensionOutcome, Dt as ChildAttachmentSnapshot, En as SuspendRequest, Et as BeginChildBudgetReleaseRequest, Fn as WaitingForChildSuspension, Ft as Claim, Gn as submissionSettlementRecordId, Gt as MarkJoinedRequest, Hn as submissionInputRecordId, Ht as LedgerCapabilities, In as WorkerLedgerState, It as ClaimJoiningRequest, Jt as OwnershipLost, Kn as workerTerminalFromRecord, Kt as MarkReadyRequest, Ln as WorkerStopCommand, Lt as ClaimRequest, Mn as UnknownResolutionConflict, Mt as ChildReservationStatus, Nn as UnknownResolutionIntent, Nt as ChildSettledNotification, On as SuspensionReason, Ot as ChildBudgetReservationRequest, Pn as WaitingChild, Pt as ChildSettledOutcome, Qt as ParentLinkage, Rn as settlementFailureFromRecord, Rt as DEFAULT_OWNERSHIP_LEASE_DURATION, Sn as SubmissionLookupByKey, St as ApprovalDecisionCommand, Tn as SubmissionWorkItem, Tt as AttachChildToReservationRequest, Un as submissionSettlementBatchId, Ut as LedgerError, Vn as submissionInputBatchId, Vt as JoiningClaim, Wn as submissionSettlementId, Wt as MarkInputAppliedRequest, Xt as OwnershipSnapshot, Yt as OwnershipRenewal, Zt as OwnershipToken, _n as SubmissionLedger, _t as AdmissionPolicyError, an as ReservedSettlement, bn as SubmissionLookup, bt as AdmissionResult, cn as ResolutionNeverHappened, ct as AbortCommand, dn as Settlement, dt as AdmissionAdmitted, en as RecoverySnapshotRequest, fn as SettlementConflict, ft as AdmissionConflict, gn as SubmissionAdmissionFence, gt as AdmissionNotAdmitted, hn as SettlementReservationSnapshot, ht as AdmissionIndeterminate, in as ReservedChildBudget, jn as UnknownResolutionCommand, jt as ChildReservationId, kn as SuspensionSnapshot, kt as ChildBudgetReservationSnapshot, ln as ResolutionSafeToRetry, lt as AbortIntent, mn as SettlementReservation, mt as AdmissionGroup, nn as ReleaseOwnershipRequest, on as ResolutionAbortSubmission, pn as SettlementFinalization, pt as AdmissionFence, qt as MarkUnknownRequest, rn as RenewOwnershipRequest, sn as ResolutionCompletedWithResult, tn as ReleaseChildBudgetRequest, un as RevertJoiningRequest, ut as AbortIntentRequest, vn as SubmissionLedgerFailure, vt as AdmissionRequest, wn as SubmissionState, wt as ApprovalPendingSuspension, xn as SubmissionLookupById, xt as ApprovalConflict, yt as AdmissionResolution, zn as submissionAbortBatchId, zt as InputAppliedMarker } from "../Admin-C34cVKlT.mjs";
2
+ import { $t as RecoverySnapshot, An as UnknownResolution, At as ChildReservationConflict, Bn as submissionAbortRecordId, Bt as JoinSnapshot, Cn as SubmissionSnapshot, Ct as ApprovalDecisionIntent, Dn as SuspensionOutcome, Dt as ChildAttachmentSnapshot, En as SuspendRequest, Et as BeginChildBudgetReleaseRequest, Fn as WaitingForChildSuspension, Ft as Claim, Gn as submissionSettlementRecordId, Gt as MarkJoinedRequest, Hn as submissionInputRecordId, Ht as LedgerCapabilities, In as WorkerLedgerState, It as ClaimJoiningRequest, Jt as OwnershipLost, Kn as workerTerminalFromRecord, Kt as MarkReadyRequest, Ln as WorkerStopCommand, Lt as ClaimRequest, Mn as UnknownResolutionConflict, Mt as ChildReservationStatus, Nn as UnknownResolutionIntent, Nt as ChildSettledNotification, On as SuspensionReason, Ot as ChildBudgetReservationRequest, Pn as WaitingChild, Pt as ChildSettledOutcome, Qt as ParentLinkage, Rn as settlementFailureFromRecord, Rt as DEFAULT_OWNERSHIP_LEASE_DURATION, Sn as SubmissionLookupByKey, St as ApprovalDecisionCommand, Tn as SubmissionWorkItem, Tt as AttachChildToReservationRequest, Un as submissionSettlementBatchId, Ut as LedgerError, Vn as submissionInputBatchId, Vt as JoiningClaim, Wn as submissionSettlementId, Wt as MarkInputAppliedRequest, Xt as OwnershipSnapshot, Yt as OwnershipRenewal, Zt as OwnershipToken, _n as SubmissionLedger, _t as AdmissionPolicyError, an as ReservedSettlement, bn as SubmissionLookup, bt as AdmissionResult, cn as ResolutionNeverHappened, ct as AbortCommand, dn as Settlement, dt as AdmissionAdmitted, en as RecoverySnapshotRequest, fn as SettlementConflict, ft as AdmissionConflict, gn as SubmissionAdmissionFence, gt as AdmissionNotAdmitted, hn as SettlementReservationSnapshot, ht as AdmissionIndeterminate, in as ReservedChildBudget, jn as UnknownResolutionCommand, jt as ChildReservationId, kn as SuspensionSnapshot, kt as ChildBudgetReservationSnapshot, ln as ResolutionSafeToRetry, lt as AbortIntent, mn as SettlementReservation, mt as AdmissionGroup, nn as ReleaseOwnershipRequest, on as ResolutionAbortSubmission, pn as SettlementFinalization, pt as AdmissionFence, qt as MarkUnknownRequest, rn as RenewOwnershipRequest, sn as ResolutionCompletedWithResult, tn as ReleaseChildBudgetRequest, un as RevertJoiningRequest, ut as AbortIntentRequest, vn as SubmissionLedgerFailure, vt as AdmissionRequest, wn as SubmissionState, wt as ApprovalPendingSuspension, xn as SubmissionLookupById, xt as ApprovalConflict, yt as AdmissionResolution, zn as submissionAbortBatchId, zt as InputAppliedMarker } from "../Admin-CUja0lmO.mjs";
3
3
  export { AbortCommand, AbortIntent, AbortIntentRequest, AdmissionAdmitted, AdmissionConflict, AdmissionFence, AdmissionGroup, AdmissionIndeterminate, AdmissionNotAdmitted, AdmissionPolicyError, AdmissionRequest, AdmissionResolution, AdmissionResult, ApprovalConflict, ApprovalDecisionCommand, ApprovalDecisionIntent, ApprovalPendingSuspension, AttachChildToReservationRequest, BeginChildBudgetReleaseRequest, ChildAttachmentSnapshot, ChildBudgetReservationRequest, ChildBudgetReservationSnapshot, ChildReservationConflict, ChildReservationId, ChildReservationStatus, ChildSettledNotification, ChildSettledOutcome, Claim, ClaimJoiningRequest, ClaimRequest, DEFAULT_OWNERSHIP_LEASE_DURATION, IdempotencyKey, InputAppliedMarker, JoinSnapshot, JoinedToHost, JoiningClaim, LedgerCapabilities, LedgerError, MarkInputAppliedRequest, MarkJoinedRequest, MarkReadyRequest, MarkUnknownRequest, OwnershipLost, OwnershipRenewal, OwnershipSnapshot, OwnershipToken, ParentLinkage, Principal, QueueSequence, RecoverySnapshot, RecoverySnapshotRequest, ReleaseChildBudgetRequest, ReleaseOwnershipRequest, RenewOwnershipRequest, ReservedChildBudget, ReservedSettlement, ResolutionAbortSubmission, ResolutionCompletedWithResult, ResolutionNeverHappened, ResolutionSafeToRetry, RevertJoiningRequest, Settlement, SettlementConflict, SettlementFinalization, SettlementReservation, SettlementReservationSnapshot, SubmissionAdmissionFence, SubmissionLedger, SubmissionLedgerFailure, SubmissionLookup, SubmissionLookupById, SubmissionLookupByKey, SubmissionSnapshot, SubmissionState, SubmissionWorkItem, SuspendRequest, SuspensionOutcome, SuspensionReason, SuspensionSnapshot, UnknownResolution, UnknownResolutionCommand, UnknownResolutionConflict, UnknownResolutionIntent, WaitingChild, WaitingForChildSuspension, WorkerLedgerState, WorkerStopCommand, settlementFailureFromRecord, submissionAbortBatchId, submissionAbortRecordId, submissionInputBatchId, submissionInputRecordId, submissionSettlementBatchId, submissionSettlementId, submissionSettlementRecordId, workerTerminalFromRecord };
@@ -1,5 +1,5 @@
1
1
  import { t as DigestError } from "../Digest-U69rDHuO.mjs";
2
- import { _n as SubmissionLedger, vn as SubmissionLedgerFailure } from "../Admin-C34cVKlT.mjs";
2
+ import { _n as SubmissionLedger, vn as SubmissionLedgerFailure } from "../Admin-CUja0lmO.mjs";
3
3
  import { Crypto, Effect, Schema } from "effect";
4
4
  //#region src/durable/SubmissionLedgerConformance.d.ts
5
5
  declare const SubmissionLedgerConformanceViolation_base: Schema.Class<SubmissionLedgerConformanceViolation, Schema.TaggedStruct<"SubmissionLedgerConformanceViolation", {
@@ -1,2 +1,2 @@
1
- import { di as SettledSubmission, fi as SubmissionStatus, ui as PendingSubmission } from "../Admin-C34cVKlT.mjs";
1
+ import { fi as PendingSubmission, mi as SubmissionStatus, pi as SettledSubmission } from "../Admin-CUja0lmO.mjs";
2
2
  export { PendingSubmission, SettledSubmission, SubmissionStatus };
@@ -1,2 +1,2 @@
1
- import { A as defaultSubscriptionLimits, C as SubscriptionScanCursors, D as SubscriptionStore, E as SubscriptionSourceError, M as subscriptionKeyString, O as SubscriptionStoreFailure, S as SubscriptionRetentionPolicy, T as SubscriptionSnapshot, _ as SubscriptionKey, a as PreparedInput, b as SubscriptionRecord, c as SubscriptionAuthorizer, d as SubscriptionDelivery, f as SubscriptionDeliveryKey, g as SubscriptionFailpointError, h as SubscriptionFailpoint, i as EventSourceVersion, j as subscriptionDeliveryKeyString, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, p as SubscriptionDeliverySnapshot, r as EventAcknowledgement, s as SourceRecovery, t as AcceptedEvent, u as SubscriptionConfiguration, v as SubscriptionLimits, w as SubscriptionScope, x as SubscriptionRefusal, y as SubscriptionName } from "../Subscription-Bk2Smmqc.mjs";
1
+ import { A as defaultSubscriptionLimits, C as SubscriptionScanCursors, D as SubscriptionStore, E as SubscriptionSourceError, M as subscriptionKeyString, O as SubscriptionStoreFailure, S as SubscriptionRetentionPolicy, T as SubscriptionSnapshot, _ as SubscriptionKey, a as PreparedInput, b as SubscriptionRecord, c as SubscriptionAuthorizer, d as SubscriptionDelivery, f as SubscriptionDeliveryKey, g as SubscriptionFailpointError, h as SubscriptionFailpoint, i as EventSourceVersion, j as subscriptionDeliveryKeyString, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, p as SubscriptionDeliverySnapshot, r as EventAcknowledgement, s as SourceRecovery, t as AcceptedEvent, u as SubscriptionConfiguration, v as SubscriptionLimits, w as SubscriptionScope, x as SubscriptionRefusal, y as SubscriptionName } from "../Subscription-m_yNfNeN.mjs";
2
2
  export { AcceptedEvent, DeliveryChange, EventAcknowledgement, EventSourceVersion, PreparedInput, SourcePartition, SourceRecovery, SubscriptionAuthorizer, SubscriptionChange, SubscriptionConfiguration, SubscriptionDelivery, SubscriptionDeliveryKey, SubscriptionDeliverySnapshot, SubscriptionError, SubscriptionFailpoint, SubscriptionFailpointError, SubscriptionKey, SubscriptionLimits, SubscriptionName, SubscriptionRecord, SubscriptionRefusal, SubscriptionRetentionPolicy, SubscriptionScanCursors, SubscriptionScope, SubscriptionSnapshot, SubscriptionSourceError, SubscriptionStore, SubscriptionStoreFailure, defaultSubscriptionLimits, subscriptionDeliveryKeyString, subscriptionKeyString };
@@ -1,2 +1,2 @@
1
- import { a as resolveSubscriptionInput, i as makeSubscriptionInputBinding, n as SubscriptionInputBindings, t as SubscriptionInputBinding } from "../SubscriptionInput-ekbJz3pF.mjs";
1
+ import { a as resolveSubscriptionInput, i as makeSubscriptionInputBinding, n as SubscriptionInputBindings, t as SubscriptionInputBinding } from "../SubscriptionInput-ON3-b8Sl.mjs";
2
2
  export { SubscriptionInputBinding, SubscriptionInputBindings, makeSubscriptionInputBinding, resolveSubscriptionInput };
@@ -1,4 +1,4 @@
1
- import { D as SubscriptionStore, O as SubscriptionStoreFailure, o as SourcePartition } from "../Subscription-Bk2Smmqc.mjs";
1
+ import { D as SubscriptionStore, O as SubscriptionStoreFailure, o as SourcePartition } from "../Subscription-m_yNfNeN.mjs";
2
2
  import { Effect, Schema } from "effect";
3
3
  //#region src/durable/SubscriptionStoreConformance.d.ts
4
4
  declare const SubscriptionStoreConformanceViolation_base: Schema.Class<SubscriptionStoreConformanceViolation, Schema.TaggedStruct<"SubscriptionStoreConformanceViolation", {
@@ -2,9 +2,9 @@ import { t as AgentId, u as ThreadId } from "../Identifiers-CN2s30fF.mjs";
2
2
  import { r as Principal } from "../Receipt-BAHyigAF.mjs";
3
3
  import { t as DurableStep } from "../DurableStep-Cry_iol4.mjs";
4
4
  import { h as DefinitionDigests } from "../Records-B5GFWCpn.mjs";
5
- import "../Admin-C34cVKlT.mjs";
5
+ import "../Admin-CUja0lmO.mjs";
6
6
  import { c as ScheduleDestination } from "../Schedule-CtYREFnz.mjs";
7
- import { E as SubscriptionSourceError, g as SubscriptionFailpointError, i as EventSourceVersion, m as SubscriptionError, w as SubscriptionScope } from "../Subscription-Bk2Smmqc.mjs";
7
+ import { E as SubscriptionSourceError, g as SubscriptionFailpointError, i as EventSourceVersion, m as SubscriptionError, w as SubscriptionScope } from "../Subscription-m_yNfNeN.mjs";
8
8
  import { Subscriptions } from "./Subscriptions.mjs";
9
9
  import { Tool, Toolkit } from "effect/unstable/ai";
10
10
  import { Crypto, Layer, Schema } from "effect";
@@ -1,4 +1,4 @@
1
- import { b as SubscriptionRecord, d as SubscriptionDelivery, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, t as AcceptedEvent, v as SubscriptionLimits } from "../Subscription-Bk2Smmqc.mjs";
1
+ import { b as SubscriptionRecord, d as SubscriptionDelivery, l as SubscriptionChange, m as SubscriptionError, n as DeliveryChange, o as SourcePartition, t as AcceptedEvent, v as SubscriptionLimits } from "../Subscription-m_yNfNeN.mjs";
2
2
  import { Result } from "effect";
3
3
  declare namespace SubscriptionTransition_d_exports {
4
4
  export { applySubscriptionChange, applySubscriptionDeliveryChange, sameAcceptedEventIdentity, sameSourcePartition, sameSubscriptionDelivery, subscriptionCanSelect, subscriptionDeliveryCanSelect, subscriptionMatchesEvent, validateEventRetention };
@@ -1,10 +1,10 @@
1
1
  import { r as Principal } from "../Receipt-BAHyigAF.mjs";
2
2
  import { O as PersistedJson } from "../Records-B5GFWCpn.mjs";
3
- import { pt as AdmissionFence } from "../Admin-C34cVKlT.mjs";
4
- import { D as SubscriptionStore, E as SubscriptionSourceError, O as SubscriptionStoreFailure, T as SubscriptionSnapshot, _ as SubscriptionKey, c as SubscriptionAuthorizer, f as SubscriptionDeliveryKey, i as EventSourceVersion, m as SubscriptionError, p as SubscriptionDeliverySnapshot, r as EventAcknowledgement, u as SubscriptionConfiguration, v as SubscriptionLimits, w as SubscriptionScope } from "../Subscription-Bk2Smmqc.mjs";
5
- import { r as EventSources } from "../EventSource-Bac0SxKL.mjs";
6
- import { t as PreparedInputAdmission } from "../PreparedInputAdmission-DcQGQ0Yp.mjs";
7
- import { n as SubscriptionInputBindings } from "../SubscriptionInput-ekbJz3pF.mjs";
3
+ import { pt as AdmissionFence } from "../Admin-CUja0lmO.mjs";
4
+ import { D as SubscriptionStore, E as SubscriptionSourceError, O as SubscriptionStoreFailure, T as SubscriptionSnapshot, _ as SubscriptionKey, c as SubscriptionAuthorizer, f as SubscriptionDeliveryKey, i as EventSourceVersion, m as SubscriptionError, p as SubscriptionDeliverySnapshot, r as EventAcknowledgement, u as SubscriptionConfiguration, v as SubscriptionLimits, w as SubscriptionScope } from "../Subscription-m_yNfNeN.mjs";
5
+ import { r as EventSources } from "../EventSource-DoiZF3xv.mjs";
6
+ import { t as PreparedInputAdmission } from "../PreparedInputAdmission-B1bzyIuV.mjs";
7
+ import { n as SubscriptionInputBindings } from "../SubscriptionInput-ON3-b8Sl.mjs";
8
8
  import { Context, Crypto, Effect, Layer } from "effect";
9
9
  declare namespace Subscriptions_d_exports {
10
10
  export { SubscribeOptions, SubscriptionDriver, SubscriptionFailure, SubscriptionIntake, Subscriptions };
@@ -1,5 +1,5 @@
1
1
  import { ContextHistory, ContextHistoryError } from "../engine/ContextHistory.mjs";
2
- import { Qr as ThreadStore } from "../Admin-C34cVKlT.mjs";
2
+ import { ei as ThreadStore } from "../Admin-CUja0lmO.mjs";
3
3
  import { Layer, Schema } from "effect";
4
4
  declare namespace ThreadContextHistory_d_exports {
5
5
  export { ThreadContextHistoryOptions, layer };
@@ -1,5 +1,5 @@
1
1
  import { A as ProducerId, a as BatchId } from "../Records-B5GFWCpn.mjs";
2
- import { Cn as SubmissionSnapshot, Ir as ThreadCheckpoint, Rr as ThreadExport, c as IntegrityReport } from "../Admin-C34cVKlT.mjs";
2
+ import { Cn as SubmissionSnapshot, Ir as ThreadCheckpoint, Rr as ThreadExport, c as IntegrityReport } from "../Admin-CUja0lmO.mjs";
3
3
  import { Crypto, Effect } from "effect";
4
4
  declare namespace ThreadInvariants_d_exports {
5
5
  export { ThreadInvariantInput, verifyThreadInvariants };
@@ -1,4 +1,4 @@
1
- import { Ar as FencedAppendRequest, Dr as AppendResult } from "../Admin-C34cVKlT.mjs";
1
+ import { Ar as FencedAppendRequest, Dr as AppendResult } from "../Admin-CUja0lmO.mjs";
2
2
  import { Context, Effect, Layer, Option, Schema } from "effect";
3
3
  declare namespace ThreadProjectionMaintenance_d_exports {
4
4
  export { ThreadProjectionError, ThreadProjectionMaintenance, ThreadProjectionMaintenanceService, drainDue };
@@ -1,2 +1,2 @@
1
- import { $r as ThreadStoreDiagnostic, Ar as FencedAppendRequest, Br as ThreadMaterialization, Dr as AppendResult, Er as AppendConflict, Fr as SelectedThreadRead, Gr as ThreadPeerCountRequest, Hr as ThreadObservation, Ir as ThreadCheckpoint, Jr as ThreadRecordRequest, Kr as ThreadRead, Lr as ThreadCheckpoints, Mr as MAX_THREAD_EXPORT_RECORDS, Nr as SaveCheckpointRequest, Or as CheckpointRejected, Pr as SaveRecoveryCheckpointRequest, Qr as ThreadStore, Rr as ThreadExport, Ur as ThreadOutstanding, Vr as ThreadNotMaterialized, Wr as ThreadOutstandingRequest, Xr as ThreadRunInputRequest, Yr as ThreadRecoveryCheckpoints, Zr as ThreadSelection, ai as ThreadWorkerStateRequest, ci as readOutstanding, ei as ThreadStoreError, ii as ThreadTailRequest, jr as LoadCheckpointRequest, kr as FenceRejected, li as readWorkerState, oi as getRecord, qr as ThreadReadRequest, ri as ThreadTail, si as getRunInput, ti as ThreadStoreFailure, zr as ThreadExportRequest } from "../Admin-C34cVKlT.mjs";
2
- export { AppendConflict, AppendResult, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, MAX_THREAD_EXPORT_RECORDS, SaveCheckpointRequest, SaveRecoveryCheckpointRequest, SelectedThreadRead, ThreadCheckpoint, ThreadCheckpoints, ThreadExport, ThreadExportRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadOutstanding, ThreadOutstandingRequest, ThreadPeerCountRequest, ThreadRead, ThreadReadRequest, ThreadRecordRequest, ThreadRecoveryCheckpoints, ThreadRunInputRequest, ThreadSelection, ThreadStore, ThreadStoreDiagnostic, ThreadStoreError, ThreadStoreFailure, ThreadTail, ThreadTailRequest, ThreadWorkerStateRequest, getRecord, getRunInput, readOutstanding, readWorkerState };
1
+ import { $r as ThreadSelection, Ar as FencedAppendRequest, Br as ThreadIdentity, Dr as AppendResult, Er as AppendConflict, Fr as SelectedThreadRead, Gr as ThreadOutstanding, Hr as ThreadMaterialization, Ir as ThreadCheckpoint, Jr as ThreadRead, Kr as ThreadOutstandingRequest, Lr as ThreadCheckpoints, Mr as MAX_THREAD_EXPORT_RECORDS, Nr as SaveCheckpointRequest, Or as CheckpointRejected, Pr as SaveRecoveryCheckpointRequest, Qr as ThreadRunInputRequest, Rr as ThreadExport, Ur as ThreadNotMaterialized, Vr as ThreadIdentityRequest, Wr as ThreadObservation, Xr as ThreadRecordRequest, Yr as ThreadReadRequest, Zr as ThreadRecoveryCheckpoints, ai as ThreadTail, ci as getRecord, di as readWorkerState, ei as ThreadStore, jr as LoadCheckpointRequest, kr as FenceRejected, li as getRunInput, ni as ThreadStoreError, oi as ThreadTailRequest, qr as ThreadPeerCountRequest, ri as ThreadStoreFailure, si as ThreadWorkerStateRequest, ti as ThreadStoreDiagnostic, ui as readOutstanding, zr as ThreadExportRequest } from "../Admin-CUja0lmO.mjs";
2
+ export { AppendConflict, AppendResult, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, MAX_THREAD_EXPORT_RECORDS, SaveCheckpointRequest, SaveRecoveryCheckpointRequest, SelectedThreadRead, ThreadCheckpoint, ThreadCheckpoints, ThreadExport, ThreadExportRequest, ThreadIdentity, ThreadIdentityRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadOutstanding, ThreadOutstandingRequest, ThreadPeerCountRequest, ThreadRead, ThreadReadRequest, ThreadRecordRequest, ThreadRecoveryCheckpoints, ThreadRunInputRequest, ThreadSelection, ThreadStore, ThreadStoreDiagnostic, ThreadStoreError, ThreadStoreFailure, ThreadTail, ThreadTailRequest, ThreadWorkerStateRequest, getRecord, getRunInput, readOutstanding, readWorkerState };
@@ -2,7 +2,7 @@ import { t as __exportAll } from "../rolldown-runtime-D7D4PA-g.mjs";
2
2
  import { RunId, SubmissionId, ThreadId } from "../core/Identifiers.mjs";
3
3
  import { BatchId, CanonicalBatch, CanonicalRecordEnvelope, CanonicalSequence, Digest, ObservationOffset, PersistedJson, ProducerEpoch, RecordId } from "./Records.mjs";
4
4
  import { SubmissionLedger, SubmissionLookupById } from "./SubmissionLedger.mjs";
5
- import { F as toolCallPreparedRecordId, S as runIdForSubmission } from "../RunJournal-BXrq0VIK.mjs";
5
+ import { $ as workerOriginRecordId, F as toolCallPreparedRecordId, O as subagentLineageRecordId, S as runIdForSubmission } from "../RunJournal-BXrq0VIK.mjs";
6
6
  import { Context, Effect, Option, Schema, Stream } from "effect";
7
7
  //#region src/durable/ThreadStore.ts
8
8
  var ThreadStore_exports = /* @__PURE__ */ __exportAll({
@@ -19,6 +19,8 @@ var ThreadStore_exports = /* @__PURE__ */ __exportAll({
19
19
  ThreadCheckpoint: () => ThreadCheckpoint,
20
20
  ThreadExport: () => ThreadExport,
21
21
  ThreadExportRequest: () => ThreadExportRequest,
22
+ ThreadIdentity: () => ThreadIdentity,
23
+ ThreadIdentityRequest: () => ThreadIdentityRequest,
22
24
  ThreadMaterialization: () => ThreadMaterialization,
23
25
  ThreadNotMaterialized: () => ThreadNotMaterialized,
24
26
  ThreadObservation: () => ThreadObservation,
@@ -259,6 +261,32 @@ var ThreadTail = class extends Schema.Class("@effect-agent/thread/ThreadTail")({
259
261
  tailDigest: Digest,
260
262
  producerEpoch: ProducerEpoch
261
263
  }) {};
264
+ var ThreadIdentityRequest = class extends Schema.Class("@effect-agent/thread/ThreadIdentityRequest")({ threadId: ThreadId }) {};
265
+ /**
266
+ * One consistent canonical snapshot: tail/epoch, first record, exact worker origin,
267
+ * then exact subagent lineage. A row selected twice appears only once. Missing
268
+ * identity records remain absent; the snapshot itself grants no execution authority.
269
+ */
270
+ var ThreadIdentity = class extends Schema.Class("@effect-agent/thread/ThreadIdentity")(Schema.Struct({
271
+ ...ThreadTail.fields,
272
+ records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(3))
273
+ }).check(Schema.makeFilter((snapshot) => {
274
+ if (snapshot.tailSequence === 0) return snapshot.records.length === 0;
275
+ if (snapshot.records[0]?.sequence !== 1) return false;
276
+ const origin = workerOriginRecordId(snapshot.threadId);
277
+ const lineage = subagentLineageRecordId(snapshot.threadId);
278
+ const ids = /* @__PURE__ */ new Set();
279
+ const sequences = /* @__PURE__ */ new Set();
280
+ let previous = -1;
281
+ for (const entry of snapshot.records) {
282
+ const rank = entry.sequence === 1 ? 0 : entry.record.recordId === origin ? 1 : entry.record.recordId === lineage ? 2 : -1;
283
+ if (entry.threadId !== snapshot.threadId || entry.sequence < 1 || entry.sequence > snapshot.tailSequence || rank <= previous || ids.has(entry.record.recordId) || sequences.has(entry.sequence)) return false;
284
+ ids.add(entry.record.recordId);
285
+ sequences.add(entry.sequence);
286
+ previous = rank;
287
+ }
288
+ return true;
289
+ }))) {};
262
290
  /** Maximum canonical records represented by one Thread export. */
263
291
  var ThreadExport = class extends Schema.Class("@effect-agent/thread/ThreadExport")({
264
292
  format: Schema.Literal("effect-agent/thread@1"),
@@ -350,6 +378,6 @@ var CheckpointRejected = class extends Schema.TaggedError()("CheckpointRejected"
350
378
  }) {};
351
379
  var ThreadStore = class extends Context.Service()("@effect-agent/thread/ThreadStore") {};
352
380
  //#endregion
353
- export { AppendConflict, AppendResult, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, MAX_THREAD_EXPORT_RECORDS, SaveCheckpointRequest, SaveRecoveryCheckpointRequest, SelectedThreadRead, ThreadCheckpoint, ThreadExport, ThreadExportRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadOutstandingRequest, ThreadPeerCountRequest, ThreadRead, ThreadReadRequest, ThreadRecordRequest, ThreadRunInputRequest, ThreadSelection, ThreadStore, ThreadStoreDiagnostic, ThreadStoreError, ThreadTail, ThreadTailRequest, ThreadWorkerStateRequest, getRecord, getRunInput, readOutstanding, readWorkerState, ThreadStore_exports as t };
381
+ export { AppendConflict, AppendResult, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, MAX_THREAD_EXPORT_RECORDS, SaveCheckpointRequest, SaveRecoveryCheckpointRequest, SelectedThreadRead, ThreadCheckpoint, ThreadExport, ThreadExportRequest, ThreadIdentity, ThreadIdentityRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadOutstandingRequest, ThreadPeerCountRequest, ThreadRead, ThreadReadRequest, ThreadRecordRequest, ThreadRunInputRequest, ThreadSelection, ThreadStore, ThreadStoreDiagnostic, ThreadStoreError, ThreadTail, ThreadTailRequest, ThreadWorkerStateRequest, getRecord, getRunInput, readOutstanding, readWorkerState, ThreadStore_exports as t };
354
382
 
355
383
  //# sourceMappingURL=ThreadStore.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadStore.mjs","names":[],"sources":["../../src/durable/ThreadStore.ts"],"sourcesContent":["import { Context, Effect, Option, Schema, Stream } from \"effect\";\n\nimport { RunId, SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport type { ToolCallPrepared, WorkerInputRequested } from \"./Records.ts\";\nimport {\n BatchId,\n CanonicalBatch,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n ObservationOffset,\n PersistedJson,\n ProducerEpoch,\n RecordId,\n} from \"./Records.ts\";\nimport { runIdForSubmission, toolCallPreparedRecordId } from \"./RunJournal.ts\";\nimport { SubmissionLedger, SubmissionLookupById } from \"./SubmissionLedger.ts\";\n\nexport const MAX_THREAD_EXPORT_RECORDS = 131_072;\n\n/** Exact canonical identity; absence is not proof that an admission was never accepted. */\nexport const ThreadRecordRequest = Schema.Struct({ threadId: ThreadId, recordId: RecordId });\nexport type ThreadRecordRequest = typeof ThreadRecordRequest.Type;\n\n/** The original user input for a Run, excluding later joined inputs. */\nexport const ThreadRunInputRequest = Schema.Struct({ threadId: ThreadId, runId: RunId });\nexport type ThreadRunInputRequest = typeof ThreadRunInputRequest.Type;\n\nexport const ThreadOutstandingRequest = Schema.Struct({\n threadId: ThreadId,\n /** Exceeding this bound fails; a truncated inventory never grants authority. */\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(4_096)),\n});\n\nexport type ThreadOutstandingRequest = typeof ThreadOutstandingRequest.Type;\n\nexport interface ThreadOutstanding {\n readonly threadId: ThreadId;\n readonly throughSequence: CanonicalSequence;\n readonly complete: true;\n readonly operations: ReadonlyArray<{\n readonly submissionId: SubmissionId;\n readonly prepared: ToolCallPrepared;\n /** Prepared is not an unknown outcome or a grant to execute. */\n readonly state: \"prepared\" | \"unknown\";\n }>;\n /** Source reservations without proof that external effects are resolved. */\n readonly workerInputs: ReadonlyArray<WorkerInputRequested>;\n}\n\n/** Native worker reservation/accounting snapshot at a captured canonical tail. */\nexport const ThreadWorkerStateRequest = Schema.Struct({\n threadId: ThreadId,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n limit: Schema.Int.check(\n Schema.isGreaterThan(0),\n Schema.isLessThanOrEqualTo(MAX_THREAD_EXPORT_RECORDS),\n ),\n});\n\nexport type ThreadWorkerStateRequest = typeof ThreadWorkerStateRequest.Type;\n\n/** Saturating lifetime peer-message count: the result is at most the requested cap. */\nexport const ThreadPeerCountRequest = Schema.Struct({\n threadId: ThreadId,\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1000)),\n});\n\nexport type ThreadPeerCountRequest = typeof ThreadPeerCountRequest.Type;\n\nconst incomplete = (operation: string) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n });\n\n/** Collect a complete bounded selection, using canonical sequence as a sparse cursor. */\nconst selectedRecords = Effect.fnUntraced(function* (\n threadId: ThreadId,\n selection: ThreadSelection,\n limit: number,\n) {\n const store = yield* ThreadStore;\n const records: Array<CanonicalRecordEnvelope> = [];\n let afterSequence: CanonicalSequence | undefined;\n\n while (true) {\n const pageLimit = Math.min(1024, limit + 1 - records.length);\n\n const page = yield* Stream.runCollect(\n store.read({\n threadId,\n selection,\n page: { limit: pageLimit, ...(afterSequence === undefined ? {} : { afterSequence }) },\n }),\n );\n\n for (const entry of page) {\n if (\n entry.threadId !== threadId ||\n entry.sequence <= (afterSequence ?? 0) ||\n (\"expectedTailSequence\" in selection && entry.sequence > selection.expectedTailSequence)\n )\n return yield* incomplete(\"read selection identity\");\n afterSequence = entry.sequence;\n records.push(entry);\n }\n if (page.length > pageLimit || records.length > limit)\n return yield* incomplete(\"read selection limit\");\n if (page.length < pageLimit) return records;\n }\n});\n\n/** Host-owned read: authenticate the Thread and exact locator before calling. */\nexport const getRecord = Effect.fn(\"ThreadStore.getRecord\")(function* (\n request: ThreadRecordRequest,\n) {\n yield* Schema.decodeEffect(ThreadRecordRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRecord request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RecordId\", recordId: request.recordId },\n 1,\n );\n\n if (records.some((entry) => entry.record.recordId !== request.recordId))\n return yield* incomplete(\"getRecord identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\nexport const getRunInput = Effect.fn(\"ThreadStore.getRunInput\")(function* (\n request: ThreadRunInputRequest,\n) {\n yield* Schema.decodeEffect(ThreadRunInputRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRunInput request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RunInput\", runId: request.runId },\n 1,\n );\n\n if (\n records.some(\n ({ record: { payload } }) =>\n payload._tag !== \"UserInputRecorded\" ||\n payload.kind !== \"user\" ||\n payload.runId !== request.runId,\n )\n )\n return yield* incomplete(\"getRunInput identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\n/** A bounded snapshot of native lifetime and source-submission worker accounting. */\nexport const readWorkerState = Effect.fn(\"ThreadStore.readWorkerState\")(function* (\n request: ThreadWorkerStateRequest,\n) {\n yield* Schema.decodeEffect(ThreadWorkerStateRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"readWorkerState request\")),\n );\n const store = yield* ThreadStore;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId: request.threadId }));\n\n const records = yield* selectedRecords(\n request.threadId,\n {\n _tag: \"WorkerState\",\n expectedTailSequence: tail.tailSequence,\n expectedTailDigest: tail.tailDigest,\n ...(request.sourceSubmissionId === undefined\n ? {}\n : { sourceSubmissionId: request.sourceSubmissionId }),\n },\n request.limit,\n );\n\n return {\n threadId: request.threadId,\n tailSequence: tail.tailSequence,\n tailDigest: tail.tailDigest,\n records,\n };\n});\n\n/**\n * Work is proportional to outstanding records, independent of completed history. Unknown\n * effects survive abort and resolution intent; only canonical closure removes them. A\n * preparation from another Run still requires native recovery before it can be treated as\n * safe. This snapshot grants no execution authority and does not freeze other owners.\n */\nexport const readOutstanding = Effect.fn(\"ThreadStore.readOutstanding\")(function* (\n request: ThreadOutstandingRequest,\n) {\n yield* Schema.decodeEffect(ThreadOutstandingRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"readOutstanding request\")),\n );\n const store = yield* ThreadStore;\n const ledger = yield* SubmissionLedger;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId: request.threadId }));\n\n const records = yield* selectedRecords(\n request.threadId,\n {\n _tag: \"Outstanding\",\n expectedTailSequence: tail.tailSequence,\n expectedTailDigest: tail.tailDigest,\n },\n request.limit,\n );\n\n const operations: Array<ThreadOutstanding[\"operations\"][number]> = [];\n const workerInputs: Array<WorkerInputRequested> = [];\n\n for (const entry of records) {\n const payload = entry.record.payload;\n\n if (payload._tag === \"WorkerInputRequested\") {\n workerInputs.push(payload);\n continue;\n }\n if (payload._tag !== \"ToolCallPrepared\" && payload._tag !== \"ToolCallUnknown\")\n return yield* incomplete(\"readOutstanding record\");\n\n const preparedEntry =\n payload._tag === \"ToolCallPrepared\"\n ? entry\n : Option.getOrUndefined(\n yield* getRecord({\n threadId: request.threadId,\n recordId: toolCallPreparedRecordId(payload.runId, payload.turn, payload.toolCallId),\n }),\n );\n\n const inputEntry = Option.getOrUndefined(\n yield* getRunInput({ threadId: request.threadId, runId: payload.runId }),\n );\n\n if (\n preparedEntry === undefined ||\n inputEntry === undefined ||\n preparedEntry.sequence > tail.tailSequence ||\n inputEntry.sequence > tail.tailSequence\n )\n return yield* incomplete(\"readOutstanding proof beyond snapshot\");\n const prepared = preparedEntry.record.payload;\n const input = inputEntry.record.payload;\n\n if (\n prepared?._tag !== \"ToolCallPrepared\" ||\n prepared.runId !== payload.runId ||\n prepared.turn !== payload.turn ||\n prepared.toolCallId !== payload.toolCallId ||\n prepared.toolName !== payload.toolName ||\n input?._tag !== \"UserInputRecorded\" ||\n input.submissionId === undefined ||\n runIdForSubmission(input.submissionId) !== prepared.runId\n )\n return yield* incomplete(\"readOutstanding canonical ownership\");\n\n const submission = yield* ledger.lookup(\n SubmissionLookupById.make({ submissionId: input.submissionId }),\n );\n\n if (Option.isNone(submission) || submission.value.threadId !== request.threadId)\n return yield* incomplete(\"readOutstanding native admission\");\n operations.push({\n submissionId: input.submissionId,\n prepared,\n state: payload._tag === \"ToolCallUnknown\" ? \"unknown\" : \"prepared\",\n });\n }\n\n return {\n threadId: request.threadId,\n throughSequence: tail.tailSequence,\n complete: true as const,\n operations,\n workerInputs,\n };\n});\n\nexport class ThreadMaterialization extends Schema.Class<ThreadMaterialization>(\n \"@effect-agent/thread/ThreadMaterialization\",\n)({\n threadId: ThreadId,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class FencedAppendRequest extends Schema.Class<FencedAppendRequest>(\n \"@effect-agent/thread/FencedAppendRequest\",\n)({\n threadId: ThreadId,\n batch: CanonicalBatch,\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class AppendResult extends Schema.Class<AppendResult>(\"@effect-agent/thread/AppendResult\")({\n firstSequence: CanonicalSequence,\n lastSequence: CanonicalSequence,\n tailDigest: Digest,\n replayed: Schema.Boolean,\n}) {}\n\nexport class ThreadRead extends Schema.Class<ThreadRead>(\"@effect-agent/thread/ThreadRead\")({\n threadId: ThreadId,\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: Schema.Natural.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),\n}) {}\n\n/** Closed native selections; mutable metadata is read at this exact canonical tail. */\nexport const ThreadSelection = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"RecordId\"), recordId: RecordId }),\n Schema.Struct({ _tag: Schema.Literal(\"RunInput\"), runId: RunId }),\n Schema.Struct({\n _tag: Schema.Literal(\"Outstanding\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerExecution\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerState\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n }),\n]);\n\nexport type ThreadSelection = typeof ThreadSelection.Type;\n\n/** Nested page makes an old ThreadRead decoder reject, never strip a selection into history. */\nexport const SelectedThreadRead = Schema.Struct({\n threadId: ThreadId,\n selection: ThreadSelection,\n page: Schema.Struct({\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: ThreadRead.fields.limit,\n }),\n});\n\nexport type SelectedThreadRead = typeof SelectedThreadRead.Type;\nexport const ThreadReadRequest = Schema.Union([SelectedThreadRead, ThreadRead]);\nexport type ThreadReadRequest = typeof ThreadReadRequest.Type;\n\nexport class ThreadObservation extends Schema.Class<ThreadObservation>(\n \"@effect-agent/thread/ThreadObservation\",\n)({\n threadId: ThreadId,\n afterOffset: Schema.optionalKey(ObservationOffset),\n}) {}\n\nexport class ThreadExportRequest extends Schema.Class<ThreadExportRequest>(\n \"@effect-agent/thread/ThreadExportRequest\",\n)({\n threadId: ThreadId,\n}) {}\n\nexport class ThreadTailRequest extends Schema.Class<ThreadTailRequest>(\n \"@effect-agent/thread/ThreadTailRequest\",\n)({\n threadId: ThreadId,\n}) {}\n\n/**\n * The committed tail of one Thread Log. A resuming producer composes its next\n * FencedAppendRequest from this value instead of exporting the whole log.\n */\nexport class ThreadTail extends Schema.Class<ThreadTail>(\"@effect-agent/thread/ThreadTail\")({\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n tailDigest: Digest,\n producerEpoch: ProducerEpoch,\n}) {}\n\n/** Maximum canonical records represented by one Thread export. */\n\nexport class ThreadExport extends Schema.Class<ThreadExport>(\"@effect-agent/thread/ThreadExport\")({\n format: Schema.Literal(\"effect-agent/thread@1\"),\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n tailDigest: Digest,\n records: Schema.Array(CanonicalRecordEnvelope).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_RECORDS),\n ),\n}) {}\n\n/**\n * A disposable projection snapshot. Adapters bind its sequence and digest to the canonical\n * log; consumers decode `state` and decide projection compatibility before suffix replay.\n * Legacy metadata is optional for application projections and preserved when supplied.\n * Runtime-owned recovery checkpoints populate and compare it before using cached state.\n */\nexport class ThreadCheckpoint extends Schema.Class<ThreadCheckpoint>(\n \"@effect-agent/thread/ThreadCheckpoint\",\n)({\n schemaVersion: Schema.Literal(1),\n threadId: ThreadId,\n throughSequence: CanonicalSequence,\n tailDigest: Digest,\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n engineVersion: Schema.optionalKey(Schema.NonEmptyString),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n agentDefinitionDigest: Schema.optionalKey(Digest),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n modelDigest: Schema.optionalKey(Digest),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n toolDigest: Schema.optionalKey(Digest),\n state: PersistedJson,\n createdAt: Schema.DateTimeUtcFromString,\n}) {}\n\nexport class SaveCheckpointRequest extends Schema.Class<SaveCheckpointRequest>(\n \"@effect-agent/thread/SaveCheckpointRequest\",\n)({\n checkpoint: ThreadCheckpoint,\n}) {}\n\n/** Replace the disposable recovery view only under the current canonical producer fence. */\nexport class SaveRecoveryCheckpointRequest extends Schema.Class<SaveRecoveryCheckpointRequest>(\n \"@effect-agent/thread/SaveRecoveryCheckpointRequest\",\n)({\n checkpoint: ThreadCheckpoint,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class LoadCheckpointRequest extends Schema.Class<LoadCheckpointRequest>(\n \"@effect-agent/thread/LoadCheckpointRequest\",\n)({\n threadId: ThreadId,\n atOrBeforeSequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\n/**\n * Content-free storage provenance constructed by adapters from source-authored labels.\n * Raw foreign lookalikes are not trusted diagnostics. Never include rejected values, SQL,\n * or schema messages.\n */\nexport class ThreadStoreDiagnostic extends Schema.Class<ThreadStoreDiagnostic>(\n \"@effect-agent/thread/ThreadStoreDiagnostic\",\n)({\n causeTag: Schema.String.check(Schema.isMaxLength(128)),\n operation: Schema.String.check(Schema.isMaxLength(256)),\n decoder: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n issueTag: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n sequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\nexport class ThreadStoreError extends Schema.TaggedError<ThreadStoreError>()(\"ThreadStoreError\", {\n operation: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n diagnostic: Schema.optionalKey(ThreadStoreDiagnostic),\n}) {}\n\nexport class ThreadNotMaterialized extends Schema.TaggedError<ThreadNotMaterialized>()(\n \"ThreadNotMaterialized\",\n { threadId: ThreadId },\n) {}\n\n/**\n * A canonical append that cannot commit: `batch-digest` replays a batch ID with different\n * content, `record-identity` reuses a canonical record ID, and `tail` declares a stale expected\n * tail. Tail conflicts carry the actual committed tail as a diagnostic resume hint.\n */\nexport class AppendConflict extends Schema.TaggedError<AppendConflict>()(\"AppendConflict\", {\n threadId: ThreadId,\n batchId: BatchId,\n reason: Schema.Literals([\"batch-digest\", \"record-identity\", \"tail\"]),\n actualTailSequence: Schema.optionalKey(CanonicalSequence),\n actualTailDigest: Schema.optionalKey(Digest),\n}) {}\n\nexport class FenceRejected extends Schema.TaggedError<FenceRejected>()(\"FenceRejected\", {\n threadId: ThreadId,\n actualEpoch: ProducerEpoch,\n attemptedEpoch: ProducerEpoch,\n}) {}\n\nexport class CheckpointRejected extends Schema.TaggedError<CheckpointRejected>()(\n \"CheckpointRejected\",\n {\n threadId: ThreadId,\n reason: Schema.Literals([\"ahead-of-tail\", \"digest-mismatch\", \"unsupported-version\", \"corrupt\"]),\n },\n) {}\n\nexport type ThreadStoreFailure =\n | ThreadStoreError\n | ThreadNotMaterialized\n | AppendConflict\n | FenceRejected;\n\n/**\n * Optional, disposable projection storage. Neither history execution nor durable recovery\n * requires it. Adapters that offer it must bind every checkpoint to a canonical batch tail.\n * Application consumers own projection compatibility; this port does not interpret metadata.\n */\nexport interface ThreadCheckpoints {\n readonly save: (\n request: SaveCheckpointRequest,\n ) => Effect.Effect<void, ThreadStoreError | ThreadNotMaterialized | CheckpointRejected>;\n readonly load: (\n request: LoadCheckpointRequest,\n ) => Effect.Effect<\n Option.Option<ThreadCheckpoint>,\n ThreadStoreError | ThreadNotMaterialized | CheckpointRejected\n >;\n}\n\n/**\n * Optional latest-only recovery cache, independent of application projection checkpoints.\n * Saves atomically validate the producer epoch and canonical batch tail. An older snapshot\n * cannot replace a newer one; equal-tail replacement repairs disposable state. Invalid cached\n * data fails with CheckpointRejected, while infrastructure failures remain ThreadStoreError.\n * Loading at an earlier tail or outside the adapter's cache locality may return none so callers\n * can replay canonical records. Canonical records and the ledger remain authority.\n */\nexport interface ThreadRecoveryCheckpoints {\n readonly save: (\n request: SaveRecoveryCheckpointRequest,\n ) => Effect.Effect<\n void,\n ThreadStoreError | ThreadNotMaterialized | CheckpointRejected | FenceRejected\n >;\n readonly load: ThreadCheckpoints[\"load\"];\n}\n\nexport class ThreadStore extends Context.Service<\n ThreadStore,\n {\n readonly materialize: (\n request: ThreadMaterialization,\n ) => Effect.Effect<void, ThreadStoreError | FenceRejected>;\n readonly append: (\n request: FencedAppendRequest,\n ) => Effect.Effect<\n AppendResult,\n ThreadStoreError | ThreadNotMaterialized | AppendConflict | FenceRejected\n >;\n readonly read: (\n request: ThreadReadRequest,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly observe: (\n request: ThreadObservation,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly export: (\n request: ThreadExportRequest,\n ) => Effect.Effect<ThreadExport, ThreadStoreError | ThreadNotMaterialized>;\n readonly inspectTail: (\n request: ThreadTailRequest,\n ) => Effect.Effect<ThreadTail, ThreadStoreError | ThreadNotMaterialized>;\n /** Absent when this adapter does not support disposable checkpoints. */\n readonly checkpoints?: ThreadCheckpoints | undefined;\n readonly recoveryCheckpoints?: ThreadRecoveryCheckpoints | undefined;\n /** Indexed scalar count; unsupported adapters fail closed at the caller. */\n readonly countPeerMessages?:\n | ((\n request: ThreadPeerCountRequest,\n ) => Effect.Effect<number, ThreadStoreError | ThreadNotMaterialized>)\n | undefined;\n }\n>()(\"@effect-agent/thread/ThreadStore\") {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAa,4BAA4B;;AAGzC,MAAa,sBAAsB,OAAO,OAAO;CAAE,UAAU;CAAU,UAAU;AAAS,CAAC;;AAI3F,MAAa,wBAAwB,OAAO,OAAO;CAAE,UAAU;CAAU,OAAO;AAAM,CAAC;AAGvF,MAAa,2BAA2B,OAAO,OAAO;CACpD,UAAU;;CAEV,OAAO,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,GAAG,OAAO,oBAAoB,IAAK,CAAC;AACpF,CAAC;;AAmBD,MAAa,2BAA2B,OAAO,OAAO;CACpD,UAAU;CACV,oBAAoB,OAAO,YAAY,YAAY;CACnD,OAAO,OAAO,IAAI,MAChB,OAAO,cAAc,CAAC,GACtB,OAAO,oBAAoB,yBAAyB,CACtD;AACF,CAAC;;AAKD,MAAa,yBAAyB,OAAO,OAAO;CAClD,UAAU;CACV,OAAO,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,GAAG,OAAO,oBAAoB,GAAI,CAAC;AACnF,CAAC;AAID,MAAM,cAAc,cAClB,iBAAiB,KAAK;CACpB;CACA,SAAS;AACX,CAAC;;AAGH,MAAM,kBAAkB,OAAO,WAAW,WACxC,UACA,WACA,OACA;CACA,MAAM,QAAQ,OAAO;CACrB,MAAM,UAA0C,CAAC;CACjD,IAAI;CAEJ,OAAO,MAAM;EACX,MAAM,YAAY,KAAK,IAAI,MAAM,QAAQ,IAAI,QAAQ,MAAM;EAE3D,MAAM,OAAO,OAAO,OAAO,WACzB,MAAM,KAAK;GACT;GACA;GACA,MAAM;IAAE,OAAO;IAAW,GAAI,kBAAkB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc;GAAG;EACtF,CAAC,CACH;EAEA,KAAK,MAAM,SAAS,MAAM;GACxB,IACE,MAAM,aAAa,YACnB,MAAM,aAAa,iBAAiB,MACnC,0BAA0B,aAAa,MAAM,WAAW,UAAU,sBAEnE,OAAO,OAAO,WAAW,yBAAyB;GACpD,gBAAgB,MAAM;GACtB,QAAQ,KAAK,KAAK;EACpB;EACA,IAAI,KAAK,SAAS,aAAa,QAAQ,SAAS,OAC9C,OAAO,OAAO,WAAW,sBAAsB;EACjD,IAAI,KAAK,SAAS,WAAW,OAAO;CACtC;AACF,CAAC;;AAGD,MAAa,YAAY,OAAO,GAAG,uBAAuB,CAAC,CAAC,WAC1D,SACA;CACA,OAAO,OAAO,aAAa,mBAAmB,CAAC,CAAC,OAAO,CAAC,CAAC,KACvD,OAAO,eAAe,WAAW,mBAAmB,CAAC,CACvD;CAEA,MAAM,UAAU,OAAO,gBACrB,QAAQ,UACR;EAAE,MAAM;EAAY,UAAU,QAAQ;CAAS,GAC/C,CACF;CAEA,IAAI,QAAQ,MAAM,UAAU,MAAM,OAAO,aAAa,QAAQ,QAAQ,GACpE,OAAO,OAAO,WAAW,oBAAoB;CAE/C,OAAO,OAAO,gBAAgB,QAAQ,EAAE;AAC1C,CAAC;AAED,MAAa,cAAc,OAAO,GAAG,yBAAyB,CAAC,CAAC,WAC9D,SACA;CACA,OAAO,OAAO,aAAa,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,KACzD,OAAO,eAAe,WAAW,qBAAqB,CAAC,CACzD;CAEA,MAAM,UAAU,OAAO,gBACrB,QAAQ,UACR;EAAE,MAAM;EAAY,OAAO,QAAQ;CAAM,GACzC,CACF;CAEA,IACE,QAAQ,MACL,EAAE,QAAQ,EAAE,gBACX,QAAQ,SAAS,uBACjB,QAAQ,SAAS,UACjB,QAAQ,UAAU,QAAQ,KAC9B,GAEA,OAAO,OAAO,WAAW,sBAAsB;CAEjD,OAAO,OAAO,gBAAgB,QAAQ,EAAE;AAC1C,CAAC;;AAGD,MAAa,kBAAkB,OAAO,GAAG,6BAA6B,CAAC,CAAC,WACtE,SACA;CACA,OAAO,OAAO,aAAa,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,KAC5D,OAAO,eAAe,WAAW,yBAAyB,CAAC,CAC7D;CAEA,MAAM,OAAO,QAAO,OADC,YAAA,CACK,YAAY,kBAAkB,KAAK,EAAE,UAAU,QAAQ,SAAS,CAAC,CAAC;CAE5F,MAAM,UAAU,OAAO,gBACrB,QAAQ,UACR;EACE,MAAM;EACN,sBAAsB,KAAK;EAC3B,oBAAoB,KAAK;EACzB,GAAI,QAAQ,uBAAuB,KAAA,IAC/B,CAAC,IACD,EAAE,oBAAoB,QAAQ,mBAAmB;CACvD,GACA,QAAQ,KACV;CAEA,OAAO;EACL,UAAU,QAAQ;EAClB,cAAc,KAAK;EACnB,YAAY,KAAK;EACjB;CACF;AACF,CAAC;;;;;;;AAQD,MAAa,kBAAkB,OAAO,GAAG,6BAA6B,CAAC,CAAC,WACtE,SACA;CACA,OAAO,OAAO,aAAa,wBAAwB,CAAC,CAAC,OAAO,CAAC,CAAC,KAC5D,OAAO,eAAe,WAAW,yBAAyB,CAAC,CAC7D;CACA,MAAM,QAAQ,OAAO;CACrB,MAAM,SAAS,OAAO;CACtB,MAAM,OAAO,OAAO,MAAM,YAAY,kBAAkB,KAAK,EAAE,UAAU,QAAQ,SAAS,CAAC,CAAC;CAE5F,MAAM,UAAU,OAAO,gBACrB,QAAQ,UACR;EACE,MAAM;EACN,sBAAsB,KAAK;EAC3B,oBAAoB,KAAK;CAC3B,GACA,QAAQ,KACV;CAEA,MAAM,aAA6D,CAAC;CACpE,MAAM,eAA4C,CAAC;CAEnD,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,UAAU,MAAM,OAAO;EAE7B,IAAI,QAAQ,SAAS,wBAAwB;GAC3C,aAAa,KAAK,OAAO;GACzB;EACF;EACA,IAAI,QAAQ,SAAS,sBAAsB,QAAQ,SAAS,mBAC1D,OAAO,OAAO,WAAW,wBAAwB;EAEnD,MAAM,gBACJ,QAAQ,SAAS,qBACb,QACA,OAAO,eACL,OAAO,UAAU;GACf,UAAU,QAAQ;GAClB,UAAU,yBAAyB,QAAQ,OAAO,QAAQ,MAAM,QAAQ,UAAU;EACpF,CAAC,CACH;EAEN,MAAM,aAAa,OAAO,eACxB,OAAO,YAAY;GAAE,UAAU,QAAQ;GAAU,OAAO,QAAQ;EAAM,CAAC,CACzE;EAEA,IACE,kBAAkB,KAAA,KAClB,eAAe,KAAA,KACf,cAAc,WAAW,KAAK,gBAC9B,WAAW,WAAW,KAAK,cAE3B,OAAO,OAAO,WAAW,uCAAuC;EAClE,MAAM,WAAW,cAAc,OAAO;EACtC,MAAM,QAAQ,WAAW,OAAO;EAEhC,IACE,UAAU,SAAS,sBACnB,SAAS,UAAU,QAAQ,SAC3B,SAAS,SAAS,QAAQ,QAC1B,SAAS,eAAe,QAAQ,cAChC,SAAS,aAAa,QAAQ,YAC9B,OAAO,SAAS,uBAChB,MAAM,iBAAiB,KAAA,KACvB,mBAAmB,MAAM,YAAY,MAAM,SAAS,OAEpD,OAAO,OAAO,WAAW,qCAAqC;EAEhE,MAAM,aAAa,OAAO,OAAO,OAC/B,qBAAqB,KAAK,EAAE,cAAc,MAAM,aAAa,CAAC,CAChE;EAEA,IAAI,OAAO,OAAO,UAAU,KAAK,WAAW,MAAM,aAAa,QAAQ,UACrE,OAAO,OAAO,WAAW,kCAAkC;EAC7D,WAAW,KAAK;GACd,cAAc,MAAM;GACpB;GACA,OAAO,QAAQ,SAAS,oBAAoB,YAAY;EAC1D,CAAC;CACH;CAEA,OAAO;EACL,UAAU,QAAQ;EAClB,iBAAiB,KAAK;EACtB,UAAU;EACV;EACA;CACF;AACF,CAAC;AAED,IAAa,wBAAb,cAA2C,OAAO,MAChD,4CACF,CAAC,CAAC;CACA,UAAU;CACV,eAAe;AACjB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,sBAAb,cAAyC,OAAO,MAC9C,0CACF,CAAC,CAAC;CACA,UAAU;CACV,OAAO;CACP,sBAAsB;CACtB,oBAAoB;CACpB,eAAe;AACjB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,eAAb,cAAkC,OAAO,MAAoB,mCAAmC,CAAC,CAAC;CAChG,eAAe;CACf,cAAc;CACd,YAAY;CACZ,UAAU,OAAO;AACnB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,aAAb,cAAgC,OAAO,MAAkB,iCAAiC,CAAC,CAAC;CAC1F,UAAU;CACV,eAAe,OAAO,YAAY,iBAAiB;CACnD,OAAO,OAAO,QAAQ,MAAM,OAAO,cAAc,CAAC,GAAG,OAAO,oBAAoB,IAAK,CAAC;AACxF,CAAC,CAAC,CAAC,CAAC;;AAGJ,MAAa,kBAAkB,OAAO,MAAM;CAC1C,OAAO,OAAO;EAAE,MAAM,OAAO,QAAQ,UAAU;EAAG,UAAU;CAAS,CAAC;CACtE,OAAO,OAAO;EAAE,MAAM,OAAO,QAAQ,UAAU;EAAG,OAAO;CAAM,CAAC;CAChE,OAAO,OAAO;EACZ,MAAM,OAAO,QAAQ,aAAa;EAClC,sBAAsB;EACtB,oBAAoB;CACtB,CAAC;CACD,OAAO,OAAO;EACZ,MAAM,OAAO,QAAQ,iBAAiB;EACtC,sBAAsB;EACtB,oBAAoB;CACtB,CAAC;CACD,OAAO,OAAO;EACZ,MAAM,OAAO,QAAQ,aAAa;EAClC,sBAAsB;EACtB,oBAAoB;EACpB,oBAAoB,OAAO,YAAY,YAAY;CACrD,CAAC;AACH,CAAC;;AAKD,MAAa,qBAAqB,OAAO,OAAO;CAC9C,UAAU;CACV,WAAW;CACX,MAAM,OAAO,OAAO;EAClB,eAAe,OAAO,YAAY,iBAAiB;EACnD,OAAO,WAAW,OAAO;CAC3B,CAAC;AACH,CAAC;AAGD,MAAa,oBAAoB,OAAO,MAAM,CAAC,oBAAoB,UAAU,CAAC;AAG9E,IAAa,oBAAb,cAAuC,OAAO,MAC5C,wCACF,CAAC,CAAC;CACA,UAAU;CACV,aAAa,OAAO,YAAY,iBAAiB;AACnD,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,sBAAb,cAAyC,OAAO,MAC9C,0CACF,CAAC,CAAC,EACA,UAAU,SACZ,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,oBAAb,cAAuC,OAAO,MAC5C,wCACF,CAAC,CAAC,EACA,UAAU,SACZ,CAAC,CAAC,CAAC,CAAC;;;;;AAMJ,IAAa,aAAb,cAAgC,OAAO,MAAkB,iCAAiC,CAAC,CAAC;CAC1F,UAAU;CACV,cAAc;CACd,YAAY;CACZ,eAAe;AACjB,CAAC,CAAC,CAAC,CAAC;;AAIJ,IAAa,eAAb,cAAkC,OAAO,MAAoB,mCAAmC,CAAC,CAAC;CAChG,QAAQ,OAAO,QAAQ,uBAAuB;CAC9C,UAAU;CACV,cAAc;CACd,YAAY;CACZ,SAAS,OAAO,MAAM,uBAAuB,CAAC,CAAC,MAC7C,OAAO,YAAY,yBAAyB,CAC9C;AACF,CAAC,CAAC,CAAC,CAAC;;;;;;;AAQJ,IAAa,mBAAb,cAAsC,OAAO,MAC3C,uCACF,CAAC,CAAC;CACA,eAAe,OAAO,QAAQ,CAAC;CAC/B,UAAU;CACV,iBAAiB;CACjB,YAAY;;CAEZ,eAAe,OAAO,YAAY,OAAO,cAAc;;CAEvD,uBAAuB,OAAO,YAAY,MAAM;;CAEhD,aAAa,OAAO,YAAY,MAAM;;CAEtC,YAAY,OAAO,YAAY,MAAM;CACrC,OAAO;CACP,WAAW,OAAO;AACpB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,MAChD,4CACF,CAAC,CAAC,EACA,YAAY,iBACd,CAAC,CAAC,CAAC,CAAC;;AAGJ,IAAa,gCAAb,cAAmD,OAAO,MACxD,oDACF,CAAC,CAAC;CACA,YAAY;CACZ,eAAe;AACjB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,MAChD,4CACF,CAAC,CAAC;CACA,UAAU;CACV,oBAAoB,OAAO,YAAY,iBAAiB;AAC1D,CAAC,CAAC,CAAC,CAAC;;;;;;AAOJ,IAAa,wBAAb,cAA2C,OAAO,MAChD,4CACF,CAAC,CAAC;CACA,UAAU,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;CACrD,WAAW,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC;CACtD,SAAS,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC,CAAC;CACxE,UAAU,OAAO,YAAY,OAAO,OAAO,MAAM,OAAO,YAAY,GAAG,CAAC,CAAC;CACzE,UAAU,OAAO,YAAY,iBAAiB;AAChD,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,mBAAb,cAAsC,OAAO,YAA8B,CAAC,CAAC,oBAAoB;CAC/F,WAAW,OAAO;CAClB,SAAS,OAAO;CAChB,OAAO,OAAO,YAAY,OAAO,OAAO,CAAC;CACzC,YAAY,OAAO,YAAY,qBAAqB;AACtD,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,wBAAb,cAA2C,OAAO,YAAmC,CAAC,CACpF,yBACA,EAAE,UAAU,SAAS,CACvB,CAAC,CAAC,CAAC;;;;;;AAOH,IAAa,iBAAb,cAAoC,OAAO,YAA4B,CAAC,CAAC,kBAAkB;CACzF,UAAU;CACV,SAAS;CACT,QAAQ,OAAO,SAAS;EAAC;EAAgB;EAAmB;CAAM,CAAC;CACnE,oBAAoB,OAAO,YAAY,iBAAiB;CACxD,kBAAkB,OAAO,YAAY,MAAM;AAC7C,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,gBAAb,cAAmC,OAAO,YAA2B,CAAC,CAAC,iBAAiB;CACtF,UAAU;CACV,aAAa;CACb,gBAAgB;AAClB,CAAC,CAAC,CAAC,CAAC;AAEJ,IAAa,qBAAb,cAAwC,OAAO,YAAgC,CAAC,CAC9E,sBACA;CACE,UAAU;CACV,QAAQ,OAAO,SAAS;EAAC;EAAiB;EAAmB;EAAuB;CAAS,CAAC;AAChG,CACF,CAAC,CAAC,CAAC;AA2CH,IAAa,cAAb,cAAiC,QAAQ,QAkCvC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ThreadStore.mjs","names":[],"sources":["../../src/durable/ThreadStore.ts"],"sourcesContent":["import { Context, Effect, Option, Schema, Stream } from \"effect\";\n\nimport { RunId, SubmissionId, ThreadId } from \"../core/Identifiers.ts\";\nimport type { ToolCallPrepared, WorkerInputRequested } from \"./Records.ts\";\nimport {\n BatchId,\n CanonicalBatch,\n CanonicalRecordEnvelope,\n CanonicalSequence,\n Digest,\n ObservationOffset,\n PersistedJson,\n ProducerEpoch,\n RecordId,\n} from \"./Records.ts\";\nimport {\n runIdForSubmission,\n subagentLineageRecordId,\n toolCallPreparedRecordId,\n workerOriginRecordId,\n} from \"./RunJournal.ts\";\nimport { SubmissionLedger, SubmissionLookupById } from \"./SubmissionLedger.ts\";\n\nexport const MAX_THREAD_EXPORT_RECORDS = 131_072;\n\n/** Exact canonical identity; absence is not proof that an admission was never accepted. */\nexport const ThreadRecordRequest = Schema.Struct({ threadId: ThreadId, recordId: RecordId });\nexport type ThreadRecordRequest = typeof ThreadRecordRequest.Type;\n\n/** The original user input for a Run, excluding later joined inputs. */\nexport const ThreadRunInputRequest = Schema.Struct({ threadId: ThreadId, runId: RunId });\nexport type ThreadRunInputRequest = typeof ThreadRunInputRequest.Type;\n\nexport const ThreadOutstandingRequest = Schema.Struct({\n threadId: ThreadId,\n /** Exceeding this bound fails; a truncated inventory never grants authority. */\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(4_096)),\n});\n\nexport type ThreadOutstandingRequest = typeof ThreadOutstandingRequest.Type;\n\nexport interface ThreadOutstanding {\n readonly threadId: ThreadId;\n readonly throughSequence: CanonicalSequence;\n readonly complete: true;\n readonly operations: ReadonlyArray<{\n readonly submissionId: SubmissionId;\n readonly prepared: ToolCallPrepared;\n /** Prepared is not an unknown outcome or a grant to execute. */\n readonly state: \"prepared\" | \"unknown\";\n }>;\n /** Source reservations without proof that external effects are resolved. */\n readonly workerInputs: ReadonlyArray<WorkerInputRequested>;\n}\n\n/** Native worker reservation/accounting snapshot at a captured canonical tail. */\nexport const ThreadWorkerStateRequest = Schema.Struct({\n threadId: ThreadId,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n limit: Schema.Int.check(\n Schema.isGreaterThan(0),\n Schema.isLessThanOrEqualTo(MAX_THREAD_EXPORT_RECORDS),\n ),\n});\n\nexport type ThreadWorkerStateRequest = typeof ThreadWorkerStateRequest.Type;\n\n/** Saturating lifetime peer-message count: the result is at most the requested cap. */\nexport const ThreadPeerCountRequest = Schema.Struct({\n threadId: ThreadId,\n limit: Schema.Int.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1000)),\n});\n\nexport type ThreadPeerCountRequest = typeof ThreadPeerCountRequest.Type;\n\nconst incomplete = (operation: string) =>\n ThreadStoreError.make({\n operation,\n message: \"Native canonical read is incomplete or corrupt\",\n });\n\n/** Collect a complete bounded selection, using canonical sequence as a sparse cursor. */\nconst selectedRecords = Effect.fnUntraced(function* (\n threadId: ThreadId,\n selection: ThreadSelection,\n limit: number,\n) {\n const store = yield* ThreadStore;\n const records: Array<CanonicalRecordEnvelope> = [];\n let afterSequence: CanonicalSequence | undefined;\n\n while (true) {\n const pageLimit = Math.min(1024, limit + 1 - records.length);\n\n const page = yield* Stream.runCollect(\n store.read({\n threadId,\n selection,\n page: { limit: pageLimit, ...(afterSequence === undefined ? {} : { afterSequence }) },\n }),\n );\n\n for (const entry of page) {\n if (\n entry.threadId !== threadId ||\n entry.sequence <= (afterSequence ?? 0) ||\n (\"expectedTailSequence\" in selection && entry.sequence > selection.expectedTailSequence)\n )\n return yield* incomplete(\"read selection identity\");\n afterSequence = entry.sequence;\n records.push(entry);\n }\n if (page.length > pageLimit || records.length > limit)\n return yield* incomplete(\"read selection limit\");\n if (page.length < pageLimit) return records;\n }\n});\n\n/** Host-owned read: authenticate the Thread and exact locator before calling. */\nexport const getRecord = Effect.fn(\"ThreadStore.getRecord\")(function* (\n request: ThreadRecordRequest,\n) {\n yield* Schema.decodeEffect(ThreadRecordRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRecord request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RecordId\", recordId: request.recordId },\n 1,\n );\n\n if (records.some((entry) => entry.record.recordId !== request.recordId))\n return yield* incomplete(\"getRecord identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\nexport const getRunInput = Effect.fn(\"ThreadStore.getRunInput\")(function* (\n request: ThreadRunInputRequest,\n) {\n yield* Schema.decodeEffect(ThreadRunInputRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"getRunInput request\")),\n );\n\n const records = yield* selectedRecords(\n request.threadId,\n { _tag: \"RunInput\", runId: request.runId },\n 1,\n );\n\n if (\n records.some(\n ({ record: { payload } }) =>\n payload._tag !== \"UserInputRecorded\" ||\n payload.kind !== \"user\" ||\n payload.runId !== request.runId,\n )\n )\n return yield* incomplete(\"getRunInput identity\");\n\n return Option.fromUndefinedOr(records[0]);\n});\n\n/** A bounded snapshot of native lifetime and source-submission worker accounting. */\nexport const readWorkerState = Effect.fn(\"ThreadStore.readWorkerState\")(function* (\n request: ThreadWorkerStateRequest,\n) {\n yield* Schema.decodeEffect(ThreadWorkerStateRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"readWorkerState request\")),\n );\n const store = yield* ThreadStore;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId: request.threadId }));\n\n const records = yield* selectedRecords(\n request.threadId,\n {\n _tag: \"WorkerState\",\n expectedTailSequence: tail.tailSequence,\n expectedTailDigest: tail.tailDigest,\n ...(request.sourceSubmissionId === undefined\n ? {}\n : { sourceSubmissionId: request.sourceSubmissionId }),\n },\n request.limit,\n );\n\n return {\n threadId: request.threadId,\n tailSequence: tail.tailSequence,\n tailDigest: tail.tailDigest,\n records,\n };\n});\n\n/**\n * Work is proportional to outstanding records, independent of completed history. Unknown\n * effects survive abort and resolution intent; only canonical closure removes them. A\n * preparation from another Run still requires native recovery before it can be treated as\n * safe. This snapshot grants no execution authority and does not freeze other owners.\n */\nexport const readOutstanding = Effect.fn(\"ThreadStore.readOutstanding\")(function* (\n request: ThreadOutstandingRequest,\n) {\n yield* Schema.decodeEffect(ThreadOutstandingRequest)(request).pipe(\n Effect.mapError(() => incomplete(\"readOutstanding request\")),\n );\n const store = yield* ThreadStore;\n const ledger = yield* SubmissionLedger;\n const tail = yield* store.inspectTail(ThreadTailRequest.make({ threadId: request.threadId }));\n\n const records = yield* selectedRecords(\n request.threadId,\n {\n _tag: \"Outstanding\",\n expectedTailSequence: tail.tailSequence,\n expectedTailDigest: tail.tailDigest,\n },\n request.limit,\n );\n\n const operations: Array<ThreadOutstanding[\"operations\"][number]> = [];\n const workerInputs: Array<WorkerInputRequested> = [];\n\n for (const entry of records) {\n const payload = entry.record.payload;\n\n if (payload._tag === \"WorkerInputRequested\") {\n workerInputs.push(payload);\n continue;\n }\n if (payload._tag !== \"ToolCallPrepared\" && payload._tag !== \"ToolCallUnknown\")\n return yield* incomplete(\"readOutstanding record\");\n\n const preparedEntry =\n payload._tag === \"ToolCallPrepared\"\n ? entry\n : Option.getOrUndefined(\n yield* getRecord({\n threadId: request.threadId,\n recordId: toolCallPreparedRecordId(payload.runId, payload.turn, payload.toolCallId),\n }),\n );\n\n const inputEntry = Option.getOrUndefined(\n yield* getRunInput({ threadId: request.threadId, runId: payload.runId }),\n );\n\n if (\n preparedEntry === undefined ||\n inputEntry === undefined ||\n preparedEntry.sequence > tail.tailSequence ||\n inputEntry.sequence > tail.tailSequence\n )\n return yield* incomplete(\"readOutstanding proof beyond snapshot\");\n const prepared = preparedEntry.record.payload;\n const input = inputEntry.record.payload;\n\n if (\n prepared?._tag !== \"ToolCallPrepared\" ||\n prepared.runId !== payload.runId ||\n prepared.turn !== payload.turn ||\n prepared.toolCallId !== payload.toolCallId ||\n prepared.toolName !== payload.toolName ||\n input?._tag !== \"UserInputRecorded\" ||\n input.submissionId === undefined ||\n runIdForSubmission(input.submissionId) !== prepared.runId\n )\n return yield* incomplete(\"readOutstanding canonical ownership\");\n\n const submission = yield* ledger.lookup(\n SubmissionLookupById.make({ submissionId: input.submissionId }),\n );\n\n if (Option.isNone(submission) || submission.value.threadId !== request.threadId)\n return yield* incomplete(\"readOutstanding native admission\");\n operations.push({\n submissionId: input.submissionId,\n prepared,\n state: payload._tag === \"ToolCallUnknown\" ? \"unknown\" : \"prepared\",\n });\n }\n\n return {\n threadId: request.threadId,\n throughSequence: tail.tailSequence,\n complete: true as const,\n operations,\n workerInputs,\n };\n});\n\nexport class ThreadMaterialization extends Schema.Class<ThreadMaterialization>(\n \"@effect-agent/thread/ThreadMaterialization\",\n)({\n threadId: ThreadId,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class FencedAppendRequest extends Schema.Class<FencedAppendRequest>(\n \"@effect-agent/thread/FencedAppendRequest\",\n)({\n threadId: ThreadId,\n batch: CanonicalBatch,\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class AppendResult extends Schema.Class<AppendResult>(\"@effect-agent/thread/AppendResult\")({\n firstSequence: CanonicalSequence,\n lastSequence: CanonicalSequence,\n tailDigest: Digest,\n replayed: Schema.Boolean,\n}) {}\n\nexport class ThreadRead extends Schema.Class<ThreadRead>(\"@effect-agent/thread/ThreadRead\")({\n threadId: ThreadId,\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: Schema.Natural.check(Schema.isGreaterThan(0), Schema.isLessThanOrEqualTo(1_024)),\n}) {}\n\n/** Closed native selections; mutable metadata is read at this exact canonical tail. */\nexport const ThreadSelection = Schema.Union([\n Schema.Struct({ _tag: Schema.Literal(\"RecordId\"), recordId: RecordId }),\n Schema.Struct({ _tag: Schema.Literal(\"RunInput\"), runId: RunId }),\n Schema.Struct({\n _tag: Schema.Literal(\"Outstanding\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerExecution\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n }),\n Schema.Struct({\n _tag: Schema.Literal(\"WorkerState\"),\n expectedTailSequence: CanonicalSequence,\n expectedTailDigest: Digest,\n sourceSubmissionId: Schema.optionalKey(SubmissionId),\n }),\n]);\n\nexport type ThreadSelection = typeof ThreadSelection.Type;\n\n/** Nested page makes an old ThreadRead decoder reject, never strip a selection into history. */\nexport const SelectedThreadRead = Schema.Struct({\n threadId: ThreadId,\n selection: ThreadSelection,\n page: Schema.Struct({\n afterSequence: Schema.optionalKey(CanonicalSequence),\n limit: ThreadRead.fields.limit,\n }),\n});\n\nexport type SelectedThreadRead = typeof SelectedThreadRead.Type;\nexport const ThreadReadRequest = Schema.Union([SelectedThreadRead, ThreadRead]);\nexport type ThreadReadRequest = typeof ThreadReadRequest.Type;\n\nexport class ThreadObservation extends Schema.Class<ThreadObservation>(\n \"@effect-agent/thread/ThreadObservation\",\n)({\n threadId: ThreadId,\n afterOffset: Schema.optionalKey(ObservationOffset),\n}) {}\n\nexport class ThreadExportRequest extends Schema.Class<ThreadExportRequest>(\n \"@effect-agent/thread/ThreadExportRequest\",\n)({\n threadId: ThreadId,\n}) {}\n\nexport class ThreadTailRequest extends Schema.Class<ThreadTailRequest>(\n \"@effect-agent/thread/ThreadTailRequest\",\n)({\n threadId: ThreadId,\n}) {}\n\n/**\n * The committed tail of one Thread Log. A resuming producer composes its next\n * FencedAppendRequest from this value instead of exporting the whole log.\n */\nexport class ThreadTail extends Schema.Class<ThreadTail>(\"@effect-agent/thread/ThreadTail\")({\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n tailDigest: Digest,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class ThreadIdentityRequest extends Schema.Class<ThreadIdentityRequest>(\n \"@effect-agent/thread/ThreadIdentityRequest\",\n)({ threadId: ThreadId }) {}\n\n/**\n * One consistent canonical snapshot: tail/epoch, first record, exact worker origin,\n * then exact subagent lineage. A row selected twice appears only once. Missing\n * identity records remain absent; the snapshot itself grants no execution authority.\n */\nexport class ThreadIdentity extends Schema.Class<ThreadIdentity>(\n \"@effect-agent/thread/ThreadIdentity\",\n)(\n Schema.Struct({\n ...ThreadTail.fields,\n records: Schema.Array(CanonicalRecordEnvelope).check(Schema.isMaxLength(3)),\n }).check(\n Schema.makeFilter((snapshot) => {\n if (snapshot.tailSequence === 0) return snapshot.records.length === 0;\n if (snapshot.records[0]?.sequence !== 1) return false;\n const origin = workerOriginRecordId(snapshot.threadId);\n const lineage = subagentLineageRecordId(snapshot.threadId);\n const ids = new Set<RecordId>();\n const sequences = new Set<CanonicalSequence>();\n let previous = -1;\n\n for (const entry of snapshot.records) {\n const rank =\n entry.sequence === 1\n ? 0\n : entry.record.recordId === origin\n ? 1\n : entry.record.recordId === lineage\n ? 2\n : -1;\n\n if (\n entry.threadId !== snapshot.threadId ||\n entry.sequence < 1 ||\n entry.sequence > snapshot.tailSequence ||\n rank <= previous ||\n ids.has(entry.record.recordId) ||\n sequences.has(entry.sequence)\n )\n return false;\n ids.add(entry.record.recordId);\n sequences.add(entry.sequence);\n previous = rank;\n }\n\n return true;\n }),\n ),\n) {}\n\n/** Maximum canonical records represented by one Thread export. */\n\nexport class ThreadExport extends Schema.Class<ThreadExport>(\"@effect-agent/thread/ThreadExport\")({\n format: Schema.Literal(\"effect-agent/thread@1\"),\n threadId: ThreadId,\n tailSequence: CanonicalSequence,\n tailDigest: Digest,\n records: Schema.Array(CanonicalRecordEnvelope).check(\n Schema.isMaxLength(MAX_THREAD_EXPORT_RECORDS),\n ),\n}) {}\n\n/**\n * A disposable projection snapshot. Adapters bind its sequence and digest to the canonical\n * log; consumers decode `state` and decide projection compatibility before suffix replay.\n * Legacy metadata is optional for application projections and preserved when supplied.\n * Runtime-owned recovery checkpoints populate and compare it before using cached state.\n */\nexport class ThreadCheckpoint extends Schema.Class<ThreadCheckpoint>(\n \"@effect-agent/thread/ThreadCheckpoint\",\n)({\n schemaVersion: Schema.Literal(1),\n threadId: ThreadId,\n throughSequence: CanonicalSequence,\n tailDigest: Digest,\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n engineVersion: Schema.optionalKey(Schema.NonEmptyString),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n agentDefinitionDigest: Schema.optionalKey(Digest),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n modelDigest: Schema.optionalKey(Digest),\n /** @deprecated For application projections; retained for existing data and runtime recovery. */\n toolDigest: Schema.optionalKey(Digest),\n state: PersistedJson,\n createdAt: Schema.DateTimeUtcFromString,\n}) {}\n\nexport class SaveCheckpointRequest extends Schema.Class<SaveCheckpointRequest>(\n \"@effect-agent/thread/SaveCheckpointRequest\",\n)({\n checkpoint: ThreadCheckpoint,\n}) {}\n\n/** Replace the disposable recovery view only under the current canonical producer fence. */\nexport class SaveRecoveryCheckpointRequest extends Schema.Class<SaveRecoveryCheckpointRequest>(\n \"@effect-agent/thread/SaveRecoveryCheckpointRequest\",\n)({\n checkpoint: ThreadCheckpoint,\n producerEpoch: ProducerEpoch,\n}) {}\n\nexport class LoadCheckpointRequest extends Schema.Class<LoadCheckpointRequest>(\n \"@effect-agent/thread/LoadCheckpointRequest\",\n)({\n threadId: ThreadId,\n atOrBeforeSequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\n/**\n * Content-free storage provenance constructed by adapters from source-authored labels.\n * Raw foreign lookalikes are not trusted diagnostics. Never include rejected values, SQL,\n * or schema messages.\n */\nexport class ThreadStoreDiagnostic extends Schema.Class<ThreadStoreDiagnostic>(\n \"@effect-agent/thread/ThreadStoreDiagnostic\",\n)({\n causeTag: Schema.String.check(Schema.isMaxLength(128)),\n operation: Schema.String.check(Schema.isMaxLength(256)),\n decoder: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n issueTag: Schema.optionalKey(Schema.String.check(Schema.isMaxLength(128))),\n sequence: Schema.optionalKey(CanonicalSequence),\n}) {}\n\nexport class ThreadStoreError extends Schema.TaggedError<ThreadStoreError>()(\"ThreadStoreError\", {\n operation: Schema.String,\n message: Schema.String,\n cause: Schema.optionalKey(Schema.Defect()),\n diagnostic: Schema.optionalKey(ThreadStoreDiagnostic),\n}) {}\n\nexport class ThreadNotMaterialized extends Schema.TaggedError<ThreadNotMaterialized>()(\n \"ThreadNotMaterialized\",\n { threadId: ThreadId },\n) {}\n\n/**\n * A canonical append that cannot commit: `batch-digest` replays a batch ID with different\n * content, `record-identity` reuses a canonical record ID, and `tail` declares a stale expected\n * tail. Tail conflicts carry the actual committed tail as a diagnostic resume hint.\n */\nexport class AppendConflict extends Schema.TaggedError<AppendConflict>()(\"AppendConflict\", {\n threadId: ThreadId,\n batchId: BatchId,\n reason: Schema.Literals([\"batch-digest\", \"record-identity\", \"tail\"]),\n actualTailSequence: Schema.optionalKey(CanonicalSequence),\n actualTailDigest: Schema.optionalKey(Digest),\n}) {}\n\nexport class FenceRejected extends Schema.TaggedError<FenceRejected>()(\"FenceRejected\", {\n threadId: ThreadId,\n actualEpoch: ProducerEpoch,\n attemptedEpoch: ProducerEpoch,\n}) {}\n\nexport class CheckpointRejected extends Schema.TaggedError<CheckpointRejected>()(\n \"CheckpointRejected\",\n {\n threadId: ThreadId,\n reason: Schema.Literals([\"ahead-of-tail\", \"digest-mismatch\", \"unsupported-version\", \"corrupt\"]),\n },\n) {}\n\nexport type ThreadStoreFailure =\n | ThreadStoreError\n | ThreadNotMaterialized\n | AppendConflict\n | FenceRejected;\n\n/**\n * Optional, disposable projection storage. Neither history execution nor durable recovery\n * requires it. Adapters that offer it must bind every checkpoint to a canonical batch tail.\n * Application consumers own projection compatibility; this port does not interpret metadata.\n */\nexport interface ThreadCheckpoints {\n readonly save: (\n request: SaveCheckpointRequest,\n ) => Effect.Effect<void, ThreadStoreError | ThreadNotMaterialized | CheckpointRejected>;\n readonly load: (\n request: LoadCheckpointRequest,\n ) => Effect.Effect<\n Option.Option<ThreadCheckpoint>,\n ThreadStoreError | ThreadNotMaterialized | CheckpointRejected\n >;\n}\n\n/**\n * Optional latest-only recovery cache, independent of application projection checkpoints.\n * Saves atomically validate the producer epoch and canonical batch tail. An older snapshot\n * cannot replace a newer one; equal-tail replacement repairs disposable state. Invalid cached\n * data fails with CheckpointRejected, while infrastructure failures remain ThreadStoreError.\n * Loading at an earlier tail or outside the adapter's cache locality may return none so callers\n * can replay canonical records. Canonical records and the ledger remain authority.\n */\nexport interface ThreadRecoveryCheckpoints {\n readonly save: (\n request: SaveRecoveryCheckpointRequest,\n ) => Effect.Effect<\n void,\n ThreadStoreError | ThreadNotMaterialized | CheckpointRejected | FenceRejected\n >;\n readonly load: ThreadCheckpoints[\"load\"];\n}\n\nexport class ThreadStore extends Context.Service<\n ThreadStore,\n {\n readonly materialize: (\n request: ThreadMaterialization,\n ) => Effect.Effect<void, ThreadStoreError | FenceRejected>;\n readonly append: (\n request: FencedAppendRequest,\n ) => Effect.Effect<\n AppendResult,\n ThreadStoreError | ThreadNotMaterialized | AppendConflict | FenceRejected\n >;\n readonly read: (\n request: ThreadReadRequest,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly observe: (\n request: ThreadObservation,\n ) => Stream.Stream<CanonicalRecordEnvelope, ThreadStoreError | ThreadNotMaterialized>;\n readonly export: (\n request: ThreadExportRequest,\n ) => Effect.Effect<ThreadExport, ThreadStoreError | ThreadNotMaterialized>;\n readonly inspectTail: (\n request: ThreadTailRequest,\n ) => Effect.Effect<ThreadTail, ThreadStoreError | ThreadNotMaterialized>;\n readonly readIdentity: (\n request: ThreadIdentityRequest,\n ) => Effect.Effect<ThreadIdentity, ThreadStoreError | ThreadNotMaterialized>;\n /** Absent when this adapter does not support disposable checkpoints. */\n readonly checkpoints?: ThreadCheckpoints | undefined;\n readonly recoveryCheckpoints?: ThreadRecoveryCheckpoints | undefined;\n /** Indexed scalar count; unsupported adapters fail closed at the caller. */\n readonly countPeerMessages?:\n | ((\n request: ThreadPeerCountRequest,\n ) => Effect.Effect<number, ThreadStoreError | ThreadNotMaterialized>)\n | undefined;\n }\n>()(\"@effect-agent/thread/ThreadStore\") {}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Or as CheckpointRejected, Qr as ThreadStore, ti as ThreadStoreFailure } from "../Admin-C34cVKlT.mjs";
1
+ import { Or as CheckpointRejected, ei as ThreadStore, ri as ThreadStoreFailure } from "../Admin-CUja0lmO.mjs";
2
2
  import { Effect, Schema } from "effect";
3
3
  //#region src/durable/ThreadStoreConformance.d.ts
4
4
  declare const ThreadStoreConformanceViolation_base: Schema.Class<ThreadStoreConformanceViolation, Schema.TaggedStruct<"ThreadStoreConformanceViolation", {
@@ -4,7 +4,8 @@ import { IdempotencyKey } from "../core/Receipt.mjs";
4
4
  import { SubagentDelegationCaps, SubagentGrant, SubagentReservationAmounts } from "../core/SubagentContract.mjs";
5
5
  import { BatchId, CanonicalBatch, CanonicalSequence, DeploymentId, PeerMessagePrepared, ProducerEpoch, ProducerId, RecordEnvelope, RecordId, SubtreeBudgetReserved, ToolCallPrepared, ToolCallResolved, ToolCallSettled, ToolCallUnknown, UserInputRecorded, WorkerInputCompleted, WorkerInputRequested, WorkerStopRequested } from "./Records.mjs";
6
6
  import { EMPTY_TAIL_DIGEST } from "./Digest.mjs";
7
- import { AppendConflict, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, SaveCheckpointRequest, ThreadCheckpoint, ThreadExportRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadRead, ThreadStore, ThreadTailRequest, getRecord, getRunInput, readWorkerState } from "./ThreadStore.mjs";
7
+ import { $ as workerOriginRecordId, O as subagentLineageRecordId } from "../RunJournal-BXrq0VIK.mjs";
8
+ import { AppendConflict, CheckpointRejected, FenceRejected, FencedAppendRequest, LoadCheckpointRequest, SaveCheckpointRequest, ThreadCheckpoint, ThreadExportRequest, ThreadIdentityRequest, ThreadMaterialization, ThreadNotMaterialized, ThreadObservation, ThreadRead, ThreadStore, ThreadTailRequest, getRecord, getRunInput, readWorkerState } from "./ThreadStore.mjs";
8
9
  import { DateTime, Effect, Option, Schema, Stream } from "effect";
9
10
  //#region src/durable/ThreadStoreConformance.ts
10
11
  /** A ThreadStore contract invariant that an adapter under test violated. */
@@ -208,17 +209,38 @@ const tailInspection = conformanceCase("inspects the canonical tail so a resumin
208
209
  yield* materialize(threadId, EPOCH_ONE);
209
210
  const empty = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
210
211
  yield* ensure(empty.tailSequence === ZERO_SEQUENCE && empty.tailDigest === EMPTY_TAIL_DIGEST && empty.producerEpoch === EPOCH_ONE, "An empty Thread must report the zero tail and its registered epoch");
211
- const first = yield* append(threadId, batch("inspect-batch-1", [record("inspect-record-1", "first")]));
212
+ const emptyIdentity = yield* store.readIdentity(ThreadIdentityRequest.make({ threadId }));
213
+ yield* ensure(emptyIdentity.tailSequence === ZERO_SEQUENCE && emptyIdentity.tailDigest === EMPTY_TAIL_DIGEST && emptyIdentity.producerEpoch === EPOCH_ONE && emptyIdentity.records.length === 0, "A materialized empty identity remains distinct from a missing Thread");
214
+ const first = yield* append(threadId, batch("inspect-batch-1", [record(workerOriginRecordId(threadId), "first")]));
212
215
  const afterAppend = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
213
216
  yield* ensure(afterAppend.tailSequence === first.lastSequence && afterAppend.tailDigest === first.tailDigest, "Tail inspection must match the latest AppendResult");
217
+ const identity = yield* store.readIdentity(ThreadIdentityRequest.make({ threadId }));
218
+ yield* ensure(identity.threadId === threadId && identity.tailSequence === first.lastSequence && identity.tailDigest === first.tailDigest && identity.producerEpoch === EPOCH_ONE && identity.records.length === 1 && identity.records[0]?.record.recordId === workerOriginRecordId(threadId), "Identity captures the canonical tail and deduplicates a first record at the origin locator");
214
219
  const resumed = yield* append(threadId, batch("inspect-batch-2", [record("inspect-record-2", "second")]), {
215
220
  lastSequence: afterAppend.tailSequence,
216
221
  tailDigest: afterAppend.tailDigest
217
222
  }, afterAppend.producerEpoch);
218
223
  yield* ensure(resumed.firstSequence === afterAppend.tailSequence + 1, "An append composed from the inspected tail must commit without exporting the log");
224
+ const staleIdentity = yield* expectFailure("appending from an identity snapshot after a tail advance", append(threadId, batch("inspect-stale-identity", [record("inspect-record-3", "third")]), {
225
+ lastSequence: identity.tailSequence,
226
+ tailDigest: identity.tailDigest
227
+ }, identity.producerEpoch));
228
+ yield* ensure(isAppendConflict(staleIdentity) && staleIdentity.reason === "tail", "Identity reads do not bypass the canonical append tail fence");
229
+ const beforeTakeover = yield* store.readIdentity(ThreadIdentityRequest.make({ threadId }));
219
230
  yield* materialize(threadId, EPOCH_TWO);
220
231
  const afterTakeover = yield* store.inspectTail(ThreadTailRequest.make({ threadId }));
221
232
  yield* ensure(afterTakeover.producerEpoch === EPOCH_TWO && afterTakeover.tailSequence === resumed.lastSequence, "Tail inspection must reflect epoch takeover without disturbing the tail");
233
+ const fencedIdentity = yield* expectFailure("appending from an identity snapshot after an epoch-only takeover", append(threadId, batch("inspect-stale-epoch", [record("inspect-record-3", "third")]), {
234
+ lastSequence: beforeTakeover.tailSequence,
235
+ tailDigest: beforeTakeover.tailDigest
236
+ }, beforeTakeover.producerEpoch));
237
+ yield* ensure(isFenceRejected(fencedIdentity), "An epoch-only takeover rejects the identity snapshot's captured producer fence");
238
+ const afterTakeoverIdentity = yield* store.readIdentity(ThreadIdentityRequest.make({ threadId }));
239
+ const retried = yield* append(threadId, batch("inspect-retry-identity", [record("inspect-record-3", "third")]), {
240
+ lastSequence: afterTakeoverIdentity.tailSequence,
241
+ tailDigest: afterTakeoverIdentity.tailDigest
242
+ }, afterTakeoverIdentity.producerEpoch);
243
+ yield* ensure(afterTakeoverIdentity.producerEpoch === EPOCH_TWO && afterTakeoverIdentity.tailSequence === resumed.lastSequence && afterTakeoverIdentity.records.length === 1 && retried.lastSequence === resumed.lastSequence + 1, "Rereading identity after takeover retains the bounded facts and permits the current producer");
222
244
  }));
223
245
  const notMaterializedOperations = conformanceCase("fails every read and write against an unmaterialized Thread", ({ ensure, expectFailure }) => Effect.gen(function* () {
224
246
  const threadId = decodeThreadId("conformance-not-materialized");
@@ -228,7 +250,8 @@ const notMaterializedOperations = conformanceCase("fails every read and write ag
228
250
  yield* expectFailure("reading an unmaterialized Thread", readAll(threadId)),
229
251
  yield* expectFailure("observing an unmaterialized Thread", store.observe(ThreadObservation.make({ threadId })).pipe(Stream.take(1), Stream.runCollect)),
230
252
  yield* expectFailure("exporting an unmaterialized Thread", store.export(ThreadExportRequest.make({ threadId }))),
231
- yield* expectFailure("inspecting the tail of an unmaterialized Thread", store.inspectTail(ThreadTailRequest.make({ threadId })))
253
+ yield* expectFailure("inspecting the tail of an unmaterialized Thread", store.inspectTail(ThreadTailRequest.make({ threadId }))),
254
+ yield* expectFailure("reading the identity of an unmaterialized Thread", store.readIdentity(ThreadIdentityRequest.make({ threadId })))
232
255
  ];
233
256
  yield* Effect.forEach(failures, (failure) => ensure(isThreadNotMaterialized(failure) && failure.threadId === threadId, "Operations against an unmaterialized Thread must fail as not materialized"), { discard: true });
234
257
  }));
@@ -437,6 +460,7 @@ const threadStoreConformanceCases = [
437
460
  threadId,
438
461
  recordId: decodeRecordId("requested")
439
462
  })), "Proven completion retires the input while retaining its canonical reservation");
463
+ tail = yield* append(threadId, batch("identity-lineage", [record(subagentLineageRecordId(threadId), "lineage")]), tail);
440
464
  for (let base = 0; base < 4097; base += 256) {
441
465
  const makeInput = (n) => envelope(`history-${n}`, UserInputRecorded.make({
442
466
  kind: "steering",
@@ -444,6 +468,13 @@ const threadStoreConformanceCases = [
444
468
  }));
445
469
  tail = yield* append(threadId, batch(`history-${base}`, [makeInput(base), ...Array.from({ length: Math.min(255, 4096 - base) }, (_, offset) => makeInput(base + offset + 1))]), tail);
446
470
  }
471
+ tail = yield* append(threadId, batch("identity-origin", [record(workerOriginRecordId(threadId), "origin")]), tail);
472
+ const identity = yield* store.readIdentity(ThreadIdentityRequest.make({ threadId }));
473
+ yield* ensure(identity.threadId === threadId && identity.tailSequence === tail.lastSequence && identity.tailDigest === tail.tailDigest && identity.producerEpoch === EPOCH_ONE && identity.records.length === 3 && identity.records.map(({ record }) => record.recordId).join() === [
474
+ "requested",
475
+ workerOriginRecordId(threadId),
476
+ subagentLineageRecordId(threadId)
477
+ ].join() && identity.records.every((entry) => entry.threadId === threadId && entry.sequence <= identity.tailSequence), "Identity selects the exact canonical locators in semantic order beyond the recovery horizon");
447
478
  const budgetRow = (id, sourceSubmissionId) => envelope(id, SubtreeBudgetReserved.make({
448
479
  reservationId: id,
449
480
  sourceSubmissionId,