agents 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -9
- package/dist/abortable-C1SpfVoi.js +21 -0
- package/dist/abortable-C1SpfVoi.js.map +1 -0
- package/dist/{agent-routing-0DR0Tk2v.d.ts → agent-routing-QDcchcQP.d.ts} +16 -16
- package/dist/agent-routing.d.ts +1 -1
- package/dist/agent-tool-types.d.ts +1 -1
- package/dist/{agent-tools-YrATZJu2.d.ts → agent-tools-DHL2XI7u.d.ts} +2 -2
- package/dist/agent-tools.d.ts +1 -1
- package/dist/ai-ahruGw7e.d.ts +239 -0
- package/dist/ai-sdk-Bdsf6mSA.js +2444 -0
- package/dist/ai-sdk-Bdsf6mSA.js.map +1 -0
- package/dist/apply-chunks-1FheRb9W.js +99 -0
- package/dist/apply-chunks-1FheRb9W.js.map +1 -0
- package/dist/broadcast-state-CEyI4uAK.js +69 -0
- package/dist/broadcast-state-CEyI4uAK.js.map +1 -0
- package/dist/browser/ai.d.ts +8 -227
- package/dist/browser/ai.js +259 -1
- package/dist/browser/ai.js.map +1 -0
- package/dist/browser/index.d.ts +56 -46
- package/dist/browser/index.js +4 -361
- package/dist/browser/{ai-sdk.d.ts → tools/ai-sdk.d.ts} +7 -7
- package/dist/browser/{ai-sdk.js → tools/ai-sdk.js} +6 -5
- package/dist/browser/tools/ai-sdk.js.map +1 -0
- package/dist/browser/tools/pi.d.ts +111 -0
- package/dist/browser/tools/pi.js +119 -0
- package/dist/browser/tools/pi.js.map +1 -0
- package/dist/browser/{tanstack-ai.d.ts → tools/tanstack-ai.d.ts} +39 -37
- package/dist/browser/{tanstack-ai.js → tools/tanstack-ai.js} +73 -59
- package/dist/browser/tools/tanstack-ai.js.map +1 -0
- package/dist/browser-CEdNlsaD.js +481 -0
- package/dist/browser-CEdNlsaD.js.map +1 -0
- package/dist/{browser-DE3d-RLk.d.ts → browser-D30VlpcA.d.ts} +63 -37
- package/dist/{browser-tool-CQ10e6Kj.js → browser-tool-4iomavs_.js} +198 -62
- package/dist/browser-tool-4iomavs_.js.map +1 -0
- package/dist/{browser-tool-DuNdlwZ9.d.ts → browser-tool-vtrPOV8e.d.ts} +25 -6
- package/dist/{capability-B4WbF81e.js → capability-DBAKc6UZ.js} +1 -3
- package/dist/capability-DBAKc6UZ.js.map +1 -0
- package/dist/{capability-runner-DBAnGr6L.d.ts → capability-runner-BiVUtjqC.d.ts} +9 -7
- package/dist/channel-Bak_6zDP.d.ts +333 -0
- package/dist/chat/index.d.ts +11 -9
- package/dist/chat/index.js +5 -194
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/react.d.ts +2 -4
- package/dist/chat/react.js +3 -1
- package/dist/chat/react.js.map +1 -1
- package/dist/chat-sdk/index.d.ts +1 -1
- package/dist/chat-sdk/index.js +1 -1
- package/dist/cli.js +144 -0
- package/dist/{client-je3koD9Z.d.ts → client-BGIQKJhX.d.ts} +2 -2
- package/dist/{client-fyQrLGkD.js → client-BnYbNT3z.js} +29 -5
- package/dist/client-BnYbNT3z.js.map +1 -0
- package/dist/client-tools-aIBO0Fk7.d.ts +53 -0
- package/dist/client.d.ts +1 -1
- package/dist/{connector-58XDGvc3.js → connector-CtZylXdk.js} +3 -603
- package/dist/connector-CtZylXdk.js.map +1 -0
- package/dist/{connector-Cl-VqPmA.d.ts → connector-DEXzVoaY.d.ts} +9 -374
- package/dist/conversations-FjHDRZyD.d.ts +192 -0
- package/dist/{current-agent-vAk_5JMt.d.ts → current-agent-CKgT5d1O.d.ts} +3 -5
- package/dist/current-agent-DhoDkSnH.js.map +1 -1
- package/dist/daemon-core-Buubj-y1.js +481 -0
- package/dist/daemon-core-Buubj-y1.js.map +1 -0
- package/dist/daemon-core-CbohVPAu.d.ts +132 -0
- package/dist/{do-oauth-client-provider-Tmf1vgKz.d.ts → do-oauth-client-provider-DfsUcpc3.d.ts} +7 -1
- package/dist/{durable-object-lifecycle-HhgOMWq9.d.ts → durable-object-lifecycle-DOI_bzCH.d.ts} +2 -2
- package/dist/{channels/email.d.ts → experimental/channels/email/index.d.ts} +25 -12
- package/dist/{channels/email.js → experimental/channels/email/index.js} +13 -35
- package/dist/experimental/channels/email/index.js.map +1 -0
- package/dist/experimental/channels/index.d.ts +270 -0
- package/dist/experimental/channels/index.js +1186 -0
- package/dist/experimental/channels/index.js.map +1 -0
- package/dist/{channels/slack.d.ts → experimental/channels/slack/index.d.ts} +19 -9
- package/dist/experimental/channels/slack/index.js +267 -0
- package/dist/experimental/channels/slack/index.js.map +1 -0
- package/dist/{channels/telegram.d.ts → experimental/channels/telegram/index.d.ts} +19 -9
- package/dist/experimental/channels/telegram/index.js +198 -0
- package/dist/experimental/channels/telegram/index.js.map +1 -0
- package/dist/experimental/channels/web/ai-sdk.d.ts +55 -0
- package/dist/experimental/channels/web/ai-sdk.js +266 -0
- package/dist/experimental/channels/web/ai-sdk.js.map +1 -0
- package/dist/experimental/channels/web/client.d.ts +97 -0
- package/dist/experimental/channels/web/client.js +349 -0
- package/dist/experimental/channels/web/client.js.map +1 -0
- package/dist/experimental/channels/web/index.d.ts +189 -0
- package/dist/experimental/channels/web/index.js +332 -0
- package/dist/experimental/channels/web/index.js.map +1 -0
- package/dist/gateway-BFO6vRDn.d.ts +100 -0
- package/dist/handle-zAzh0UW2.d.ts +460 -0
- package/dist/harness/ai-sdk/index.d.ts +175 -0
- package/dist/harness/ai-sdk/index.js +605 -0
- package/dist/harness/ai-sdk/index.js.map +1 -0
- package/dist/harness/container/daemon/index.d.ts +76 -0
- package/dist/harness/container/daemon/index.js +3 -0
- package/dist/harness/container/index.d.ts +740 -0
- package/dist/harness/container/index.js +2152 -0
- package/dist/harness/container/index.js.map +1 -0
- package/dist/harness/container/runtime/index.d.ts +144 -0
- package/dist/harness/container/runtime/index.js +1082 -0
- package/dist/harness/container/runtime/index.js.map +1 -0
- package/dist/harness/opencode/index.d.ts +369 -0
- package/dist/harness/opencode/index.js +1072 -0
- package/dist/harness/opencode/index.js.map +1 -0
- package/dist/harness/pi/index.d.ts +3 -2
- package/dist/harness/pi/index.js +3 -3
- package/dist/harness/store/index.d.ts +24 -0
- package/dist/harness/store/index.js +2 -0
- package/dist/harness/think/index.d.ts +821 -0
- package/dist/harness/think/index.js +2721 -0
- package/dist/harness/think/index.js.map +1 -0
- package/dist/harness-B6B9S3rb.d.ts +203 -0
- package/dist/{images-iiTDSyRu.js → images-Ce9SCu3X.js} +2 -248
- package/dist/images-Ce9SCu3X.js.map +1 -0
- package/dist/{index-BreL0YrQ.d.ts → index-BEL3ZV-s.d.ts} +2 -6
- package/dist/index-CBt8oRJt.d.ts +198 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +2 -2
- package/dist/ingress-EFbrS547.js +9 -0
- package/dist/ingress-EFbrS547.js.map +1 -0
- package/dist/input-schema-BQykTEp_.js +20 -0
- package/dist/input-schema-BQykTEp_.js.map +1 -0
- package/dist/input-schema-D2QAtHZH.js +23 -0
- package/dist/input-schema-D2QAtHZH.js.map +1 -0
- package/dist/internal-kmw70xwR.js +46 -0
- package/dist/internal-kmw70xwR.js.map +1 -0
- package/dist/internal_context.d.ts +1 -1
- package/dist/lifecycle/index.d.ts +3 -3
- package/dist/lifecycle/index.js +2 -2
- package/dist/{lifecycle-CFu6OV03.js → lifecycle-DGorpAmA.js} +2 -4
- package/dist/lifecycle-DGorpAmA.js.map +1 -0
- package/dist/mcp/client/do-oauth-client-provider.d.ts +1 -1
- package/dist/mcp/client/do-oauth-client-provider.js +9 -0
- package/dist/mcp/client/do-oauth-client-provider.js.map +1 -1
- package/dist/mcp/client/index.d.ts +1 -1
- package/dist/mcp/client/index.js +1 -1
- package/dist/mcp/client/x402.d.ts +35 -4
- package/dist/mcp/client/x402.js +24 -3
- package/dist/mcp/client/x402.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/models/ai-sdk/index.d.ts +16 -14
- package/dist/models/ai-sdk/index.js +1 -2442
- package/dist/models/opencode/index.d.ts +65 -0
- package/dist/models/opencode/index.js +285 -0
- package/dist/models/opencode/index.js.map +1 -0
- package/dist/models/pi-ai/index.d.ts +9 -7
- package/dist/models/pi-ai/index.js +2 -1
- package/dist/models/pi-ai/index.js.map +1 -1
- package/dist/options-CiIsJHXR.d.ts +130 -0
- package/dist/protocol-BEgrJYC5.d.ts +331 -0
- package/dist/protocol-CukuI73M.d.ts +386 -0
- package/dist/protocol-cOklVBBD.js +227 -0
- package/dist/protocol-cOklVBBD.js.map +1 -0
- package/dist/{protocol-kHsr-f0X.js → protocol-eXeJxhgu.js} +2 -67
- package/dist/protocol-eXeJxhgu.js.map +1 -0
- package/dist/protocol-y2sSY584.js +148 -0
- package/dist/protocol-y2sSY584.js.map +1 -0
- package/dist/queue/index.d.ts +1 -1
- package/dist/queue/index.js +1 -1
- package/dist/{queue-BB-zfIYF.js → queue-CcIjVYTE.js} +2 -2
- package/dist/{queue-BB-zfIYF.js.map → queue-CcIjVYTE.js.map} +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/routing/index.d.ts +2 -2
- package/dist/routing/index.js +1 -1
- package/dist/{scheduler-RdACNXDP.d.ts → scheduler-BCLESHSC.d.ts} +2 -12
- package/dist/{scheduler-DZ3xQfeK.js → scheduler-FIHv2-kJ.js} +2 -4
- package/dist/scheduler-FIHv2-kJ.js.map +1 -0
- package/dist/schedules/index.d.ts +1 -1
- package/dist/schedules/index.js +1 -1
- package/dist/serializable.d.ts +1 -1
- package/dist/session-store-Do4xkDcf.js +606 -0
- package/dist/session-store-Do4xkDcf.js.map +1 -0
- package/dist/session-store-DoPY12xM.d.ts +383 -0
- package/dist/sessions/index.d.ts +11 -434
- package/dist/sessions/index.js +1 -2271
- package/dist/sessions-_vN5BEZX.js +2272 -0
- package/dist/sessions-_vN5BEZX.js.map +1 -0
- package/dist/settings-C45hDliX.js +253 -0
- package/dist/settings-C45hDliX.js.map +1 -0
- package/dist/{transport-PfFnt-Ld.d.ts → settings-NgGwF7Qt.d.ts} +14 -208
- package/dist/{src-BZeu-SCD.js → src-CQxJFv4l.js} +8 -8
- package/dist/src-CQxJFv4l.js.map +1 -0
- package/dist/stall-watchdog-BpRF2uwG.js +195 -0
- package/dist/stall-watchdog-BpRF2uwG.js.map +1 -0
- package/dist/state/index.d.ts +1 -1
- package/dist/state/index.js +1 -3
- package/dist/state/index.js.map +1 -1
- package/dist/store-BKM4Xm9M.d.ts +332 -0
- package/dist/store-CslVzfN7.js +458 -0
- package/dist/store-CslVzfN7.js.map +1 -0
- package/dist/streams/index.d.ts +1 -1
- package/dist/streams/index.js +1 -1
- package/dist/{streams-DW-UCOUc.js → streams-lsHMJhRW.js} +17 -4
- package/dist/streams-lsHMJhRW.js.map +1 -0
- package/dist/{streams-Cmkj9QfW.d.ts → streams-vrCtbUIn.d.ts} +2 -2
- package/dist/sub-routing.d.ts +1 -1
- package/dist/tasks/index.d.ts +1 -1
- package/dist/tasks/index.js +1 -1
- package/dist/{tasks-68DESxf0.js → tasks-BN_5AWqI.js} +3 -2
- package/dist/tasks-BN_5AWqI.js.map +1 -0
- package/dist/{tasks-9YxYtByh.d.ts → tasks-E89KdwkS.d.ts} +2 -2
- package/dist/tool-CTp72Jb_.d.ts +278 -0
- package/dist/tool-CxKsvxjm.js +1126 -0
- package/dist/tool-CxKsvxjm.js.map +1 -0
- package/dist/tool-DoVberpN.d.ts +301 -0
- package/dist/tool-cQRkwSZZ.js +410 -0
- package/dist/tool-cQRkwSZZ.js.map +1 -0
- package/dist/tool-helpers-O5BDVEAY.js +58 -0
- package/dist/tool-helpers-O5BDVEAY.js.map +1 -0
- package/dist/transport-k2mFrtL8.d.ts +200 -0
- package/dist/turns-DCV3ycDl.js +317 -0
- package/dist/turns-DCV3ycDl.js.map +1 -0
- package/dist/voice/client.js +1 -1
- package/dist/voice/index.d.ts +2 -2
- package/dist/voice/index.js +1 -1
- package/dist/web/fetch/index.d.ts +89 -0
- package/dist/web/fetch/index.js +20 -0
- package/dist/web/fetch/index.js.map +1 -0
- package/dist/web/fetch/tools/ai-sdk.d.ts +80 -0
- package/dist/web/fetch/tools/ai-sdk.js +47 -0
- package/dist/web/fetch/tools/ai-sdk.js.map +1 -0
- package/dist/web/fetch/tools/pi.d.ts +84 -0
- package/dist/web/fetch/tools/pi.js +88 -0
- package/dist/web/fetch/tools/pi.js.map +1 -0
- package/dist/web/fetch/tools/tanstack-ai.d.ts +78 -0
- package/dist/web/fetch/tools/tanstack-ai.js +45 -0
- package/dist/web/fetch/tools/tanstack-ai.js.map +1 -0
- package/dist/web/search/index.d.ts +58 -0
- package/dist/web/search/index.js +2 -0
- package/dist/web/search/tools/ai-sdk.d.ts +77 -0
- package/dist/web/search/tools/ai-sdk.js +46 -0
- package/dist/web/search/tools/ai-sdk.js.map +1 -0
- package/dist/web/search/tools/pi.d.ts +82 -0
- package/dist/web/search/tools/pi.js +89 -0
- package/dist/web/search/tools/pi.js.map +1 -0
- package/dist/web/search/tools/tanstack-ai.d.ts +71 -0
- package/dist/web/search/tools/tanstack-ai.js +46 -0
- package/dist/web/search/tools/tanstack-ai.js.map +1 -0
- package/dist/websockets/index.d.ts +12 -296
- package/dist/websockets/index.js +1 -1
- package/dist/{websockets-Ci-LZFHH.js → websockets-C3zy8YR0.js} +20 -8
- package/dist/websockets-C3zy8YR0.js.map +1 -0
- package/dist/{wire-types-CrjKvDyi.d.ts → wire-types-Cv0iwjk5.d.ts} +3 -51
- package/dist/workflow-types.d.ts +1 -1
- package/dist/workflows.d.ts +1 -1
- package/dist/workflows.js +1 -1
- package/docs/browse-the-web.md +29 -1
- package/docs/fetch-the-web.md +276 -0
- package/docs/harnesses/pi.md +25 -0
- package/docs/harnesses/think.md +215 -0
- package/docs/index.md +99 -75
- package/docs/lifecycle.md +42 -3
- package/docs/queue.md +2 -3
- package/docs/scheduling.md +2 -6
- package/docs/search-the-web.md +135 -0
- package/package.json +148 -44
- package/dist/ai-fm7xx1BK.js +0 -312
- package/dist/ai-fm7xx1BK.js.map +0 -1
- package/dist/browser/ai-sdk.js.map +0 -1
- package/dist/browser/index.js.map +0 -1
- package/dist/browser/tanstack-ai.js.map +0 -1
- package/dist/browser-tool-CQ10e6Kj.js.map +0 -1
- package/dist/capability-B4WbF81e.js.map +0 -1
- package/dist/channel-Bnm4S7T2.d.ts +0 -491
- package/dist/channels/ai-sdk.d.ts +0 -46
- package/dist/channels/ai-sdk.js +0 -120
- package/dist/channels/ai-sdk.js.map +0 -1
- package/dist/channels/email.js.map +0 -1
- package/dist/channels/index.d.ts +0 -233
- package/dist/channels/index.js +0 -608
- package/dist/channels/index.js.map +0 -1
- package/dist/channels/slack.js +0 -614
- package/dist/channels/slack.js.map +0 -1
- package/dist/channels/tanstack-ai.d.ts +0 -39
- package/dist/channels/tanstack-ai.js +0 -17
- package/dist/channels/tanstack-ai.js.map +0 -1
- package/dist/channels/telegram.js +0 -427
- package/dist/channels/telegram.js.map +0 -1
- package/dist/channels/voice.d.ts +0 -45
- package/dist/channels/voice.js +0 -122
- package/dist/channels/voice.js.map +0 -1
- package/dist/client-fyQrLGkD.js.map +0 -1
- package/dist/connector-58XDGvc3.js.map +0 -1
- package/dist/images-iiTDSyRu.js.map +0 -1
- package/dist/index-BB0kqhIz.d.ts +0 -101
- package/dist/ingress-BfetZbMO.js +0 -83
- package/dist/ingress-BfetZbMO.js.map +0 -1
- package/dist/internal-CYlgHl1l.js +0 -59
- package/dist/internal-CYlgHl1l.js.map +0 -1
- package/dist/lifecycle-CFu6OV03.js.map +0 -1
- package/dist/models/ai-sdk/index.js.map +0 -1
- package/dist/protocol-kHsr-f0X.js.map +0 -1
- package/dist/scheduler-DZ3xQfeK.js.map +0 -1
- package/dist/sessions/index.js.map +0 -1
- package/dist/src-BZeu-SCD.js.map +0 -1
- package/dist/streams-DW-UCOUc.js.map +0 -1
- package/dist/surface-bZZJqBka.js +0 -17
- package/dist/surface-bZZJqBka.js.map +0 -1
- package/dist/tasks-68DESxf0.js.map +0 -1
- package/dist/tool-schema-CBjGPrsQ.js +0 -31
- package/dist/tool-schema-CBjGPrsQ.js.map +0 -1
- package/dist/websockets-Ci-LZFHH.js.map +0 -1
- package/docs/channels.md +0 -323
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/harness/table-prefix.ts","../../../src/harness/opencode/harness.ts"],"sourcesContent":["/**\n * Gives an embedded engine its own namespace in a Durable Object's SQLite\n * database.\n *\n * A harness that embeds an engine with its own schema (OpenCode, pi, …)\n * shares one database with the SDK's tables (`cf_agents_*`) and the host's.\n * Engines that name their tables `session` or `event` and assume they own\n * the database collide with both. `prefixTables` returns a view of\n * `DurableObjectStorage` whose `sql.exec` rewrites the engine's SQL so every\n * table and index it creates or reads is stored as `<prefix><name>`, and\n * its reads of `sqlite_master` see only its own objects, under their\n * unprefixed names.\n *\n * The rewrite is by SQL position, not by word: a name is rewritten where it\n * names a table or index (after `FROM`, `JOIN`, `INTO`, `UPDATE`, `TABLE`,\n * `INDEX`, `REFERENCES`, `RENAME TO`, the `ON` of `CREATE INDEX`, or as a\n * `table.column` qualifier), so a column that shares a table's name is left\n * alone. Names the engine creates are learned from its DDL; names it already\n * has are read from the database on first use. Outside DDL, only learned\n * names are rewritten, so common table expressions, aliases, and table-valued\n * functions pass through.\n *\n * It is a stopgap for engines that have no table prefix option of their own,\n * and it relies on the engine's SQL being ordinary SQLite. Nothing in it is\n * specific to one engine.\n */\n\n/** A SQLite identifier prefix, checked by {@link prefixTables}. */\nexport type TablePrefix = string;\n\n/**\n * A view of `storage` whose SQL is rewritten into `prefix`'s namespace.\n * Everything other than `sql.exec` is the original storage, so transactions\n * and the rest of the API behave as before.\n *\n * @param storage - The Durable Object's storage.\n * @param prefix - The namespace, such as `opencode_`. Letters, digits and\n * underscores, starting with a letter; never `_cf_`, which Durable Objects\n * reserve.\n * @returns The same storage, with `sql.exec` rewritten.\n * @throws When `prefix` is not a valid prefix: a defect in the caller.\n */\nexport function prefixTables<S extends { readonly sql: SqlStorage }>(\n storage: S,\n prefix: TablePrefix\n): S {\n const rewriter = new TablePrefixRewriter(storage.sql, prefix);\n const sql = new Proxy(storage.sql, {\n get(target, property) {\n if (property === \"exec\") return rewriter.exec;\n const value: unknown = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n }\n });\n return new Proxy(storage, {\n get(target, property) {\n if (property === \"sql\") return sql;\n const value: unknown = Reflect.get(target, property, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n }\n });\n}\n\ntype Token =\n | { readonly kind: \"space\"; readonly text: string }\n | { readonly kind: \"string\"; readonly text: string }\n | { readonly kind: \"word\"; readonly text: string }\n | {\n readonly kind: \"quoted\";\n readonly text: string;\n readonly name: string;\n readonly open: string;\n readonly close: string;\n }\n | { readonly kind: \"punct\"; readonly text: string };\n\n/** Words after which an identifier names a table or index in DDL. */\nconst DDL_KEYWORDS = new Set([\"TABLE\", \"INDEX\", \"REFERENCES\"]);\n/** Words after which an identifier names a table in DML. */\nconst DML_KEYWORDS = new Set([\"FROM\", \"JOIN\", \"INTO\", \"UPDATE\"]);\n/** Words that may follow `sqlite_master` without being its alias. */\nconst CLAUSE_KEYWORDS = new Set([\n \"WHERE\",\n \"ORDER\",\n \"GROUP\",\n \"LIMIT\",\n \"JOIN\",\n \"LEFT\",\n \"INNER\",\n \"CROSS\",\n \"ON\",\n \"UNION\",\n \"EXCEPT\",\n \"INTERSECT\",\n \"HAVING\",\n \"WINDOW\"\n]);\nconst MASTER_TABLES = new Set([\"sqlite_master\", \"sqlite_schema\"]);\n/** PRAGMAs whose argument is a table or index name. */\nconst SCHEMA_PRAGMAS = new Set([\n \"table_info\",\n \"table_xinfo\",\n \"index_list\",\n \"index_info\",\n \"index_xinfo\",\n \"foreign_key_list\",\n \"foreign_key_check\",\n \"integrity_check\",\n \"quick_check\"\n]);\n/**\n * Bare words that follow a table keyword without naming a table:\n * `TABLE IF NOT EXISTS`, `INSERT OR REPLACE INTO`, `FROM (SELECT …)`.\n */\nconst NOT_NAMES = new Set([\"IF\", \"NOT\", \"EXISTS\", \"SELECT\", \"VALUES\", \"OR\"]);\n\nclass TablePrefixRewriter {\n readonly #sql: SqlStorage;\n readonly #prefix: string;\n readonly #masterView: string;\n /** Lower-cased unprefixed names of the engine's tables and indexes. */\n #names: Set<string> | undefined;\n readonly #cache = new Map<string, string>();\n\n constructor(sql: SqlStorage, prefix: string) {\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(prefix)) {\n throw new Error(`Invalid table prefix ${JSON.stringify(prefix)}`);\n }\n if (prefix.toLowerCase().startsWith(\"_cf_\")) {\n throw new Error(\"A table prefix must not start with _cf_\");\n }\n this.#sql = sql;\n this.#prefix = prefix;\n const length = prefix.length;\n // The engine's objects only, under their unprefixed names. Prefixes\n // are checked to be plain identifiers, so quoting them is safe.\n this.#masterView =\n `(SELECT type, substr(name, ${length + 1}) AS name, ` +\n `substr(tbl_name, ${length + 1}) AS tbl_name, rootpage, sql ` +\n `FROM sqlite_master WHERE substr(name, 1, ${length}) = '${prefix}')`;\n }\n\n readonly exec = <T extends Record<string, SqlStorageValue>>(\n query: string,\n ...bindings: unknown[]\n ): SqlStorageCursor<T> => this.#sql.exec<T>(this.rewrite(query), ...bindings);\n\n rewrite(query: string): string {\n const cached = this.#cache.get(query);\n if (cached !== undefined) return cached;\n const names = this.#known();\n const before = names.size;\n const rewritten = this.#rewrite(tokenize(query), names);\n // A statement that learned names may rewrite differently next time.\n if (names.size === before) this.#cache.set(query, rewritten);\n else this.#cache.clear();\n return rewritten;\n }\n\n #known(): Set<string> {\n if (this.#names) return this.#names;\n const rows = this.#sql\n .exec<{ name: string }>(\n \"SELECT name FROM sqlite_master WHERE substr(name, 1, ?) = ?\",\n this.#prefix.length,\n this.#prefix\n )\n .toArray();\n this.#names = new Set(\n rows.map((row) => row.name.slice(this.#prefix.length).toLowerCase())\n );\n return this.#names;\n }\n\n #rewrite(tokens: readonly Token[], names: Set<string>): string {\n const significant = tokens\n .map((token, index) => ({ token, index }))\n .filter(({ token }) => token.kind !== \"space\");\n const out = tokens.map((token) => token.text);\n const firstWord = upper(significant[0]?.token);\n const isCreateIndex =\n firstWord === \"CREATE\" &&\n significant.slice(1, 4).some(({ token }) => upper(token) === \"INDEX\");\n\n for (let i = 0; i < significant.length; i++) {\n const { token, index } = significant[i];\n if (token.kind !== \"word\" && token.kind !== \"quoted\") continue;\n if (token.kind === \"word\" && NOT_NAMES.has(token.text.toUpperCase())) {\n continue;\n }\n const name = token.kind === \"word\" ? token.text : token.name;\n const lower = name.toLowerCase();\n const previous = significant[i - 1]?.token;\n const next = significant[i + 1]?.token;\n // `schema.table` or `x.y` where this is the right-hand side.\n if (previous?.text === \".\") continue;\n\n const position = tablePosition(significant, i, isCreateIndex);\n\n if (position === \"dml\" && MASTER_TABLES.has(lower)) {\n const aliased =\n upper(next) === \"AS\" ||\n (next !== undefined &&\n (next.kind === \"word\" || next.kind === \"quoted\") &&\n !CLAUSE_KEYWORDS.has(upper(next)));\n out[index] = aliased\n ? this.#masterView\n : `${this.#masterView} AS ${token.text}`;\n continue;\n }\n if (lower.startsWith(\"sqlite_\")) continue;\n\n if (position === \"ddl\") {\n names.add(lower);\n out[index] = this.#prefixed(token);\n continue;\n }\n if (position === \"dml\" && names.has(lower)) {\n out[index] = this.#prefixed(token);\n continue;\n }\n // A qualifier: `\"session\".\"id\"`.\n if (\n next?.text === \".\" &&\n significant[i + 2] !== undefined &&\n names.has(lower)\n ) {\n out[index] = this.#prefixed(token);\n continue;\n }\n // `pragma_table_info('name')` and `PRAGMA table_info(name)`.\n if (lower.startsWith(\"pragma_\") && next?.text === \"(\") {\n const argument = significant[i + 2];\n if (argument?.token.kind === \"string\") {\n const inner = argument.token.text.slice(1, -1);\n if (names.has(inner.toLowerCase())) {\n out[argument.index] = `'${this.#prefix}${inner}'`;\n }\n }\n }\n if (\n firstWord === \"PRAGMA\" &&\n previous?.text === \"(\" &&\n names.has(lower)\n ) {\n out[index] = this.#prefixed(token);\n }\n }\n // `PRAGMA table_info('name')`: the statement form with a string\n // argument, for the PRAGMAs whose argument names a table or index.\n // The name may be schema-qualified (`main.table_info`) or quoted.\n const pragma =\n significant[2]?.token.text === \".\"\n ? significant[3]?.token\n : significant[1]?.token;\n const pragmaName =\n pragma?.kind === \"word\"\n ? pragma.text\n : pragma?.kind === \"quoted\"\n ? pragma.name\n : \"\";\n if (\n firstWord === \"PRAGMA\" &&\n SCHEMA_PRAGMAS.has(pragmaName.toLowerCase())\n ) {\n for (let i = 1; i < significant.length; i++) {\n const { token, index } = significant[i];\n if (token.kind !== \"string\" || significant[i - 1]?.token.text !== \"(\") {\n continue;\n }\n const inner = token.text.slice(1, -1);\n if (names.has(inner.toLowerCase())) {\n out[index] = `'${this.#prefix}${inner}'`;\n }\n }\n }\n return out.join(\"\");\n }\n\n #prefixed(token: Token & { readonly kind: \"word\" | \"quoted\" }): string {\n return token.kind === \"word\"\n ? `${this.#prefix}${token.text}`\n : `${token.open}${this.#prefix}${token.name}${token.close}`;\n }\n}\n\ntype Significant = { readonly token: Token; readonly index: number };\n\n/** Whether the identifier at `i` names a table in DDL, DML, or neither. */\nfunction tablePosition(\n significant: readonly Significant[],\n i: number,\n isCreateIndex: boolean\n): \"ddl\" | \"dml\" | undefined {\n let j = i - 1;\n // Skip `IF NOT EXISTS` / `IF EXISTS`.\n if (upper(significant[j]?.token) === \"EXISTS\") {\n j -= 1;\n if (upper(significant[j]?.token) === \"NOT\") j -= 1;\n if (upper(significant[j]?.token) !== \"IF\") return undefined;\n j -= 1;\n }\n const keyword = upper(significant[j]?.token);\n if (DDL_KEYWORDS.has(keyword)) return \"ddl\";\n if (keyword === \"TO\" && upper(significant[j - 1]?.token) === \"RENAME\") {\n return \"ddl\";\n }\n if (keyword === \"ON\" && isCreateIndex) return \"ddl\";\n if (DML_KEYWORDS.has(keyword)) return \"dml\";\n return undefined;\n}\n\nfunction upper(token: Token | undefined): string {\n return token?.kind === \"word\" ? token.text.toUpperCase() : \"\";\n}\n\n/**\n * Splits SQL into identifiers, literals, and everything else. Comments are\n * kept as whitespace so positions stay intact.\n */\nfunction tokenize(sql: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < sql.length) {\n const char = sql[i];\n if (/\\s/.test(char)) {\n let j = i + 1;\n while (j < sql.length && /\\s/.test(sql[j])) j++;\n tokens.push({ kind: \"space\", text: sql.slice(i, j) });\n i = j;\n } else if (char === \"-\" && sql[i + 1] === \"-\") {\n const end = sql.indexOf(\"\\n\", i);\n const j = end === -1 ? sql.length : end;\n tokens.push({ kind: \"space\", text: sql.slice(i, j) });\n i = j;\n } else if (char === \"/\" && sql[i + 1] === \"*\") {\n const end = sql.indexOf(\"*/\", i + 2);\n const j = end === -1 ? sql.length : end + 2;\n tokens.push({ kind: \"space\", text: sql.slice(i, j) });\n i = j;\n } else if (char === \"'\") {\n const j = closing(sql, i, \"'\");\n tokens.push({ kind: \"string\", text: sql.slice(i, j) });\n i = j;\n } else if (char === '\"' || char === \"`\" || char === \"[\") {\n const close = char === \"[\" ? \"]\" : char;\n const j = closing(sql, i, close);\n const text = sql.slice(i, j);\n const name = text\n .slice(1, -1)\n .replaceAll(close === \"]\" ? \"]]\" : close + close, close);\n tokens.push({ kind: \"quoted\", text, name, open: char, close });\n i = j;\n } else if (/[A-Za-z_]/.test(char)) {\n let j = i + 1;\n while (j < sql.length && /[A-Za-z0-9_$]/.test(sql[j])) j++;\n tokens.push({ kind: \"word\", text: sql.slice(i, j) });\n i = j;\n } else {\n tokens.push({ kind: \"punct\", text: char });\n i++;\n }\n }\n return tokens;\n}\n\n/** The index just past the quote that closes the one at `start`. */\nfunction closing(sql: string, start: number, close: string): number {\n let j = start + 1;\n while (j < sql.length) {\n if (sql[j] === close) {\n if (close !== \"]\" && sql[j + 1] === close) {\n j += 2;\n continue;\n }\n return j + 1;\n }\n j++;\n }\n return sql.length;\n}\n","import {\n LifecycleCapability,\n type CapabilityStartContext,\n type LifecycleJobContext,\n type LifecycleJobOutcome\n} from \"../../lifecycle\";\nimport { prefixTables } from \"../table-prefix\";\nimport type {\n OpenCode,\n OpenCodeEvent,\n OpenCodeInput,\n OpenCodeLogEvent,\n OpenCodeMessage,\n OpenCodeOperationResult,\n OpenCodePendingOperation,\n OpenCodePromptResponse,\n OpenCodeReceipt,\n OpenCodeSessionId,\n OpenCodeSessionInfo,\n OpenCodeSessionOptions,\n OpenCodeSubmitOptions\n} from \"./types\";\n\n/** The root session's id. OpenCode session ids start with `ses`. */\nexport const ROOT_SESSION: OpenCodeSessionId = \"ses_root\";\n\n/** Every table and index OpenCode creates is stored under this prefix. */\nconst TABLE_PREFIX = \"opencode_\";\n\n/**\n * Longest one wake waits on OpenCode. It waits inside an alarm invocation,\n * which has a 15 minute wall-time limit, so a longer run is waited on across\n * several alarms.\n */\nconst WAIT_BUDGET_MS = 10 * 60_000;\n\n/**\n * The wake job's heartbeat while it waits. If the object is evicted, the job\n * is still due and its alarm restarts the object.\n */\nconst HEARTBEAT_MS = 30_000;\n\n/**\n * How long OpenCode stays open after the harness last used it. An open\n * OpenCode host runs periodic background work (catalog refreshes, local\n * provider discovery, cleanups) whose timers keep the object in memory, so\n * the harness closes it once nothing is running and reopens it on the next\n * call.\n */\nconst IDLE_CLOSE_MS = 30_000;\n\n/** Messages read per page when looking an operation up. */\nconst MESSAGE_PAGE = 50;\n\nlet setWakeTiming: (harness: OpenCodeHarness, timing: WakeTiming) => void;\n\n/**\n * @internal Shorten a harness's wake timings, so a test suite does not sit\n * on the real heartbeat. Not exported from `agents/harness/opencode`.\n */\nexport function setWakeTimingForTests(\n harness: OpenCodeHarness,\n timing: WakeTiming\n): void {\n setWakeTiming(harness, timing);\n}\n\nconst WAKE_FN = \"wake\";\nconst CLOSE_FN = \"close\";\nconst CLOSE_JOB_ID = \"opencode-close\";\n\nfunction wakeJobId(session: OpenCodeSessionId): string {\n return `opencode-wake:${session}`;\n}\n\nfunction sessionOfJob(payload: unknown): OpenCodeSessionId | undefined {\n return typeof payload === \"object\" &&\n payload !== null &&\n \"session\" in payload &&\n typeof payload.session === \"string\"\n ? payload.session\n : undefined;\n}\n\n/** How long the wake waits. */\ntype WakeTiming = {\n /** Longest one wake waits inside an alarm. Default 600_000. */\n readonly waitBudgetMs?: number;\n /** Heartbeat while waiting. Default 30_000. */\n readonly heartbeatMs?: number;\n /** Close OpenCode after this long unused. Default 30_000. */\n readonly idleCloseMs?: number;\n};\n\n/** What the factory is handed: the one thing only the harness can build. */\nexport type OpenCodeHarnessContext = {\n /**\n * This object's storage, with OpenCode's tables moved under the\n * `opencode_` prefix so they cannot collide with the SDK's or the host's.\n * Pass it as `OpenCodeWorkerd.create({ storage })`.\n */\n readonly storage: DurableObjectStorage;\n};\n\n/**\n * Opens OpenCode. The harness adopts what it returns and closes it on\n * `dispose()`.\n *\n * ```ts\n * opencode: ({ storage }) =>\n * OpenCodeWorkerd.create({ storage, plugins: [ai.plugin] })\n * ```\n */\nexport type OpenCodeHarnessFactory = (\n context: OpenCodeHarnessContext\n) => OpenCode | Promise<OpenCode>;\n\n/** A model, as OpenCode references one; `agents/models/opencode` makes them. */\nexport type OpenCodeModel = {\n readonly providerID: string;\n readonly id: string;\n};\n\n/**\n * Applied to a session when the harness creates it. Without a model, a\n * session uses OpenCode's default model, if its config names one.\n */\nexport type OpenCodeSessionDefaults = {\n /** Model for new sessions. Change one session's with `session.setModel`. */\n readonly model?: OpenCodeModel;\n /** OpenCode agent for new sessions, such as `build`. */\n readonly agent?: string;\n};\n\n/** `OpenCodeHarness`'s options. Only `opencode`, which opens it, is required. */\nexport type OpenCodeHarnessOptions = {\n /** Opens OpenCode over the storage this object prepared. */\n readonly opencode: OpenCodeHarnessFactory;\n /** What a new session starts with. */\n readonly defaults?: OpenCodeSessionDefaults;\n};\n\n/** Where an operation is, read from OpenCode's inbox and transcript. */\ntype OperationState =\n | { readonly _tag: \"missing\" }\n | { readonly _tag: \"queued\" }\n | { readonly _tag: \"running\" }\n | {\n readonly _tag: \"settled\";\n readonly outcome: \"succeeded\" | \"failed\" | \"interrupted\";\n readonly text: string;\n readonly error: string | undefined;\n };\n\ntype InboxItem = Awaited<\n ReturnType<OpenCode[\"sessions\"][\"inbox\"][\"list\"]>\n>[number];\n\nconst OPERATION_ID = /^[A-Za-z0-9._~-]+$/;\n\n/** OpenCode's id for the user message an operation submits. */\nfunction messageIdOf(operationId: string): string {\n if (!OPERATION_ID.test(operationId)) {\n throw new TypeError(\n `Invalid operation id ${JSON.stringify(operationId)}: use letters, digits, \".\", \"_\", \"~\" and \"-\"`\n );\n }\n return `msg_${operationId}`;\n}\n\n/** The operation id of a message or inbox item, the inverse of `messageIdOf`. */\nfunction operationIdOf(messageId: string): string {\n return messageId.startsWith(\"msg_\") ? messageId.slice(4) : messageId;\n}\n\n/** Whether an OpenCode client error is the tagged error `tag`. */\nfunction isTagged(error: unknown, tag: string): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"_tag\" in error &&\n error._tag === tag\n );\n}\n\n/** OpenCode's client errors are tagged objects; give them a message. */\nfunction describe(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (typeof error === \"object\" && error !== null) {\n const tag = \"_tag\" in error ? String(error._tag) : \"Error\";\n const message =\n \"message\" in error && typeof error.message === \"string\"\n ? `: ${error.message}`\n : \"\";\n return `${tag}${message}`;\n }\n return String(error);\n}\n\nfunction textOf(message: OpenCodeMessage | undefined): string {\n if (message?.type !== \"assistant\") return \"\";\n return message.content\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .join(\"\");\n}\n\nfunction sessionIdOf(\n event: OpenCodeEvent | OpenCodeLogEvent\n): string | undefined {\n if (!(\"data\" in event)) return undefined;\n const data: unknown = event.data;\n return typeof data === \"object\" &&\n data !== null &&\n \"sessionID\" in data &&\n typeof data.sessionID === \"string\"\n ? data.sessionID\n : undefined;\n}\n\n/**\n * OpenCode v2 hosted in a Durable Object, behind the same harness interface\n * as `PiHarness`: `harness.prompt()`, `harness.sessions`, `harness.session(id)`.\n * How a session reaches a client (sockets, SSE, RPC) is the host's glue,\n * built on `session.events()` and `session.log()`.\n *\n * OpenCode owns everything about a run: the transcript, the inbox of steers\n * and follow-ups, model and tool steps, retries, and crash recovery. It keeps\n * all of it in its own tables in this object's SQLite database, under the\n * `opencode_` prefix.\n *\n * What OpenCode cannot do on a Durable Object is wake itself: it resumes an\n * interrupted turn when it boots, but an evicted object does not boot until\n * something calls it. The harness is that wake, with one Lifecycle job per\n * session. Input goes to OpenCode once, in `submit()`, after the session's\n * job is scheduled. The job waits while the session runs, rescheduling itself\n * as a heartbeat, and completes when the session is idle with nothing left\n * to do. An eviction mid-run leaves the job due, so its alarm restarts the\n * object, OpenCode boots and resumes the turn, and the job waits again.\n *\n * @experimental The API may change between releases.\n */\nexport class OpenCodeHarness extends LifecycleCapability {\n /** Every session in this object. */\n readonly sessions: OpenCodeSessions;\n readonly #options: OpenCodeHarnessOptions;\n /** In-memory waits on OpenCode, per session, each inside an alarm's work. */\n readonly #waits = new Map<OpenCodeSessionId, Promise<void>>();\n /** Submissions between their wake and OpenCode's admission, per session. */\n readonly #admitting = new Map<OpenCodeSessionId, number>();\n #waitBudgetMs = WAIT_BUDGET_MS;\n #heartbeatMs = HEARTBEAT_MS;\n #idleCloseMs = IDLE_CLOSE_MS;\n /** Harness calls and event streams using OpenCode right now. */\n #leases = 0;\n #opening: Promise<OpenCode> | undefined;\n\n static {\n setWakeTiming = (harness, timing) => harness.#setWakeTiming(timing);\n }\n\n /**\n * @param options - How to open OpenCode, and what new sessions start with.\n */\n constructor(options: OpenCodeHarnessOptions) {\n super(\"opencode-harness\");\n this.#options = options;\n this.sessions = new OpenCodeSessions(this);\n }\n\n #setWakeTiming(timing: WakeTiming): void {\n for (const [name, value] of Object.entries(timing)) {\n if (!Number.isFinite(value) || value <= 0) {\n throw new Error(\n `OpenCodeHarness timing.${name} must be a positive number`\n );\n }\n }\n this.#waitBudgetMs = timing.waitBudgetMs ?? this.#waitBudgetMs;\n this.#heartbeatMs = timing.heartbeatMs ?? this.#heartbeatMs;\n this.#idleCloseMs = timing.idleCloseMs ?? this.#idleCloseMs;\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n /** Open OpenCode, which resumes interrupted turns, and wake running sessions. */\n override async onStart(_context: CapabilityStartContext): Promise<void> {\n const opencode = await this.#open();\n for (const session of Object.keys(await opencode.sessions.active())) {\n await this.#wake(session);\n }\n await this.#scheduleClose();\n }\n\n /** Run one step of a session's wake job. */\n async onJob(\n context: LifecycleJobContext\n ): Promise<LifecycleJobOutcome | void> {\n if (context.job.fn === CLOSE_FN) return this.#closeStep();\n if (context.job.fn !== WAKE_FN) return;\n const session = sessionOfJob(context.job.payload);\n if (session !== undefined) return this.#wakeStep(session);\n }\n\n /** Close OpenCode's in-memory resources. Durable state is untouched. */\n async dispose(): Promise<void> {\n const opening = this.#opening;\n this.#opening = undefined;\n const opencode = await opening?.catch(() => undefined);\n await opencode?.close();\n }\n\n // ── The harness interface ────────────────────────────────────────────────\n\n /**\n * A handle on one session. No I/O until you call it.\n *\n * @param id - The session; default the root session.\n */\n session(id: OpenCodeSessionId = ROOT_SESSION): OpenCodeSession {\n return new OpenCodeSession(this, id);\n }\n\n /** Submit a prompt and wait for its answer. */\n prompt(\n input: OpenCodeInput,\n options: OpenCodeSubmitOptions = {}\n ): Promise<OpenCodePromptResponse> {\n return this.session(options.session).prompt(input, options);\n }\n\n /** Durably submit a prompt. Resolves before the model runs. */\n submit(\n input: OpenCodeInput,\n options: OpenCodeSubmitOptions = {}\n ): Promise<OpenCodeReceipt> {\n return this.session(options.session).submit(input, options);\n }\n\n /** Stop one operation, or everything running in a session. */\n abort(\n options: OpenCodeSessionOptions & { readonly operationId?: string } = {}\n ): Promise<boolean> {\n return this.session(options.session).abort(options.operationId);\n }\n\n /** Wait for an operation to settle. Aborting `signal` stops only the wait. */\n wait(\n operationId: string,\n options: OpenCodeSessionOptions & { readonly signal?: AbortSignal } = {}\n ): Promise<OpenCodeOperationResult> {\n return this.session(options.session).wait(operationId, options.signal);\n }\n\n /** The session's active transcript, as OpenCode's messages. */\n messages(options: OpenCodeSessionOptions = {}): Promise<OpenCodeMessage[]> {\n return this.session(options.session).messages();\n }\n\n /** Submissions OpenCode has not settled yet, oldest first. */\n pending(\n options: OpenCodeSessionOptions = {}\n ): Promise<OpenCodePendingOperation[]> {\n return this.use((opencode) => this.#pending(opencode, options.session));\n }\n\n async #pending(\n opencode: OpenCode,\n only: OpenCodeSessionId | undefined\n ): Promise<OpenCodePendingOperation[]> {\n const sessions =\n only === undefined\n ? (await listSessions(opencode)).map((info) => info.id)\n : [only];\n const active = await opencode.sessions.active();\n const pending: OpenCodePendingOperation[] = [];\n for (const session of sessions) {\n if (\n active[session] !== undefined ||\n (await unsettled(opencode, session))\n ) {\n for (const operationId of await this.#running(opencode, session)) {\n pending.push({ operationId, session, status: \"running\" });\n }\n }\n for (const item of await opencode.sessions.inbox.list({\n sessionID: session\n })) {\n pending.push({\n operationId: operationIdOf(item.id),\n session,\n status: \"queued\"\n });\n }\n }\n return pending;\n }\n\n /**\n * The opened OpenCode host, for anything the interface does not cover.\n * The harness closes an idle host, so call this again each time rather\n * than keeping the result; work done through it does not keep it open.\n */\n opencode(): Promise<OpenCode> {\n return this.use(async (opencode) => opencode);\n }\n\n /**\n * @internal Run `call` with OpenCode open. The host is not closed while\n * any call holds it.\n */\n async use<T>(call: (opencode: OpenCode) => Promise<T>): Promise<T> {\n const release = this.lease();\n try {\n return await call(await this.#open());\n } finally {\n await release();\n }\n }\n\n /**\n * @internal Hold OpenCode open until the returned release is called, for\n * work that outlives one call, such as an event stream.\n */\n lease(): () => Promise<void> {\n this.#leases += 1;\n let released = false;\n return async () => {\n if (released) return;\n released = true;\n this.#leases -= 1;\n if (this.#leases === 0) await this.#scheduleClose();\n };\n }\n\n // ── Used by OpenCodeSession and OpenCodeSessions ─────────────────────────\n\n /** @internal Admit an input to OpenCode once, behind the session's wake. */\n async enqueue(\n session: OpenCodeSessionId,\n input: OpenCodeInput,\n options: OpenCodeSubmitOptions\n ): Promise<OpenCodeReceipt> {\n const operationId = options.operationId ?? crypto.randomUUID();\n const messageId = messageIdOf(operationId);\n return this.use(async (opencode) => {\n const content = typeof input === \"string\" ? { text: input } : input;\n this.#admitting.set(session, (this.#admitting.get(session) ?? 0) + 1);\n let accepted: boolean;\n try {\n // 1. The wake first, so a job is scheduled before OpenCode has the\n // work. If the object dies after OpenCode admits the input, that\n // job restarts it. While this admission is in flight the step will\n // not park.\n await this.#wake(session);\n // 2. The one admission. OpenCode deduplicates by message id.\n accepted = !(await this.#known(opencode, session, messageId));\n await this.#call(() =>\n opencode.sessions.prompt({\n ...content,\n sessionID: session,\n id: messageId,\n delivery: options.whenBusy === \"steer\" ? \"steer\" : \"queue\",\n resume: true\n })\n );\n } finally {\n const left = (this.#admitting.get(session) ?? 1) - 1;\n if (left === 0) this.#admitting.delete(session);\n else this.#admitting.set(session, left);\n }\n // 3. Step now, so the wake sees the work even if it just parked.\n await this.#wake(session);\n return { operationId, session, accepted };\n });\n }\n\n /** @internal Withdraw a queued input, or interrupt the run it joined. */\n async withdraw(\n session: OpenCodeSessionId,\n operationId: string\n ): Promise<boolean> {\n const messageId = messageIdOf(operationId);\n return this.use(async (opencode) => {\n const state = await this.#state(opencode, session, messageId);\n switch (state._tag) {\n case \"queued\":\n await this.#call(() =>\n opencode.sessions.inbox.cancel({\n sessionID: session,\n inboxID: messageId\n })\n );\n return true;\n case \"running\":\n return (\n await this.#call(() =>\n opencode.sessions.interrupt({ sessionID: session })\n )\n ).interrupted;\n case \"missing\":\n case \"settled\":\n return false;\n }\n });\n }\n\n /** @internal Withdraw every queued input and interrupt the running work. */\n interrupt(session: OpenCodeSessionId): Promise<void> {\n return this.use(async (opencode) => {\n for (const item of await this.#call(() =>\n opencode.sessions.inbox.list({ sessionID: session })\n )) {\n await this.#call(() =>\n opencode.sessions.inbox.cancel({\n sessionID: session,\n inboxID: item.id\n })\n );\n }\n await this.#call(() =>\n opencode.sessions.interrupt({ sessionID: session })\n );\n });\n }\n\n /** @internal Wait for OpenCode to settle an operation, by its id. */\n async settled(\n session: OpenCodeSessionId,\n operationId: string,\n signal?: AbortSignal\n ): Promise<OpenCodeOperationResult> {\n const messageId = messageIdOf(operationId);\n return this.use(async (opencode) => {\n for (;;) {\n signal?.throwIfAborted();\n const state = await this.#state(opencode, session, messageId);\n switch (state._tag) {\n case \"missing\":\n return {\n operationId,\n session,\n status: \"unanswered\",\n reason: \"not_found\"\n };\n case \"settled\":\n return state.outcome === \"succeeded\"\n ? { operationId, session, status: \"done\", text: state.text }\n : {\n operationId,\n session,\n status: \"unanswered\",\n reason:\n state.outcome === \"failed\"\n ? (state.error ?? \"failed\")\n : \"interrupted\"\n };\n case \"queued\":\n case \"running\":\n await this.#call(() =>\n opencode.sessions.wait(\n { sessionID: session },\n signal ? { signal } : undefined\n )\n );\n // Idle while the operation is unsettled: the run is between an\n // eviction and its resume. Let the wake job bring it back.\n if ((await opencode.sessions.active())[session] === undefined) {\n await this.#wake(session);\n await delay(this.#heartbeatMs / 30, signal);\n }\n }\n }\n });\n }\n\n /** Call OpenCode, turning its tagged errors into `Error`s. */\n async #call<T>(call: () => Promise<T>): Promise<T> {\n try {\n return await call();\n } catch (error) {\n if (error instanceof Error) throw error;\n throw new Error(`OpenCode: ${describe(error)}`, { cause: error });\n }\n }\n\n /** The session's info, or undefined when it does not exist. */\n async #info(opencode: OpenCode, session: OpenCodeSessionId) {\n try {\n return await opencode.sessions.get({ sessionID: session });\n } catch (error) {\n if (isTagged(error, \"SessionNotFoundError\")) return undefined;\n throw new Error(`OpenCode: ${describe(error)}`, { cause: error });\n }\n }\n\n /** @internal Create a session with the harness defaults. */\n async create(\n options: { readonly id?: OpenCodeSessionId } = {}\n ): Promise<OpenCodeSessionId> {\n return this.use((opencode) => this.#createSession(opencode, options.id));\n }\n\n async #createSession(\n opencode: OpenCode,\n id: OpenCodeSessionId | undefined\n ): Promise<OpenCodeSessionId> {\n const defaults = this.#options.defaults;\n const created = await this.#call(() =>\n opencode.sessions.create({\n ...(id === undefined ? {} : { id }),\n ...(defaults?.model === undefined\n ? {}\n : {\n model: {\n providerID: defaults.model.providerID,\n id: defaults.model.id\n }\n }),\n ...(defaults?.agent === undefined ? {} : { agent: defaults.agent })\n })\n );\n return created.id;\n }\n\n // ── The wake ─────────────────────────────────────────────────────────────\n\n /** Schedule the session's wake job now, or pull it forward. */\n #wake(session: OpenCodeSessionId, time = Date.now()): Promise<unknown> {\n // A push made while the job is dispatching supersedes that dispatch's\n // outcome, so a submit is never lost to a wake that is completing.\n return this.lifecycle.jobs.push({\n id: wakeJobId(session),\n fn: WAKE_FN,\n time,\n payload: { session },\n singleflight: true,\n recoveryLoop: true\n });\n }\n\n /**\n * One run of a session's wake job. It never admits anything new: it waits\n * while the session runs and completes when it is idle with nothing left\n * to do. OpenCode does all the work in between.\n */\n async #wakeStep(session: OpenCodeSessionId): Promise<LifecycleJobOutcome> {\n const heartbeat = { rescheduleAt: Date.now() + this.#heartbeatMs };\n if (this.#waits.has(session)) return heartbeat;\n const opencode = await this.#open();\n if ((await this.#info(opencode, session)) === undefined) return undefined;\n\n // Read in this order: OpenCode takes an input off the inbox before it\n // writes the user message, and only while the session is running. So\n // whatever moment the reads straddle, one of them sees the work.\n const inbox = await opencode.sessions.inbox.list({ sessionID: session });\n const open = await unsettled(opencode, session);\n const running = (await opencode.sessions.active())[session] !== undefined;\n if (!running) {\n // A move is applied by OpenCode between turns and cannot start one,\n // so only an input, synthetic message or compaction rings.\n const first = inbox.find((item) => item.type !== \"move\");\n if (first !== undefined) {\n // Admitted but not running: the object died between OpenCode's\n // admission and the turn's start. Ring OpenCode's doorbell again.\n await this.#ring(opencode, session, first);\n } else if (open) {\n // A turn the last isolate left open. OpenCode resumes it on boot,\n // in the background; check again on the next heartbeat.\n return heartbeat;\n } else {\n // A submit between its wake and OpenCode's admission: check later.\n return this.#admitting.has(session) ? heartbeat : undefined;\n }\n }\n\n const wait = this.#waitForIdle(opencode, session).finally(() => {\n this.#waits.delete(session);\n // Re-check now: OpenCode may have started more work, such as a\n // follow-up.\n void this.#wake(session);\n });\n this.#waits.set(session, wait);\n // The wait runs past this dispatch, inside the alarm's work, so the\n // object stays alive for it. The heartbeat covers an eviction.\n this.lifecycle.trackAlarmWork(wait);\n return heartbeat;\n }\n\n async #waitForIdle(opencode: OpenCode, session: string): Promise<void> {\n const budget = new AbortController();\n const timer = setTimeout(() => budget.abort(), this.#waitBudgetMs);\n try {\n // Cancelling the wait never cancels OpenCode's work.\n await opencode.sessions.wait(\n { sessionID: session },\n { signal: budget.signal }\n );\n } catch (error) {\n if (!budget.signal.aborted) {\n this.lifecycle.events.emit(\"opencode:wake_error\", {\n session,\n error: describe(error)\n });\n }\n } finally {\n clearTimeout(timer);\n }\n }\n\n /** Re-admit an inbox item by its id, which starts the session again. */\n async #ring(\n opencode: OpenCode,\n session: OpenCodeSessionId,\n item: InboxItem\n ): Promise<void> {\n switch (item.type) {\n case \"user\":\n // OpenCode matches the existing item by id and only wakes the\n // session; the text is not admitted again.\n await opencode.sessions.prompt({\n text: item.payload.text,\n sessionID: session,\n id: item.id,\n delivery: item.delivery,\n resume: true\n });\n return;\n case \"synthetic\":\n await opencode.sessions.synthetic({\n text: item.payload.text,\n sessionID: session,\n id: item.id,\n delivery: item.delivery,\n resume: true\n });\n return;\n case \"compaction\":\n await opencode.sessions.compact({\n sessionID: session,\n id: item.id,\n delivery: item.delivery\n });\n return;\n case \"move\":\n // Not rung: see #wakeStep.\n return;\n }\n }\n\n // ── Closing an idle OpenCode ─────────────────────────────────────────────\n\n /** Schedule the idle close, unless one is already due late enough. */\n async #scheduleClose(): Promise<void> {\n const time = Date.now() + this.#idleCloseMs;\n const pending = this.lifecycle.jobs.get(CLOSE_JOB_ID);\n if (pending !== undefined && pending.time >= time - this.#idleCloseMs / 2) {\n return;\n }\n await this.lifecycle.jobs.push({\n id: CLOSE_JOB_ID,\n fn: CLOSE_FN,\n time,\n payload: {},\n singleflight: true\n });\n }\n\n /** Close OpenCode if nothing is using it or running in it. */\n async #closeStep(): Promise<LifecycleJobOutcome> {\n const opening = this.#opening;\n if (opening === undefined) return undefined;\n const later = { rescheduleAt: Date.now() + this.#idleCloseMs };\n const busy = () =>\n this.#leases > 0 ||\n this.#waits.size > 0 ||\n this.#admitting.size > 0 ||\n this.lifecycle.jobs.list().some((job) => job.fn === WAKE_FN);\n if (busy()) return later;\n const opencode = await opening.catch(() => undefined);\n if (opencode === undefined) return undefined;\n if (Object.keys(await opencode.sessions.active()).length > 0) return later;\n // Checked again: a call may have started while OpenCode answered.\n if (busy() || this.#opening !== opening) return later;\n this.#opening = undefined;\n await opencode.close();\n return undefined;\n }\n\n // ── OpenCode ─────────────────────────────────────────────────────────────\n\n /**\n * OpenCode, opened. Waits for Lifecycle startup first, so it is only ever\n * opened inside it: startup holds the input gate (`blockConcurrencyWhile`)\n * and awaits the open in `onStart`, so an open begun before startup would\n * be awaited behind a closed gate and never finish.\n */\n async #open(): Promise<OpenCode> {\n await this.lifecycle.ready();\n this.#opening ??= this.#doOpen().catch((error: unknown) => {\n this.#opening = undefined;\n throw error;\n });\n return this.#opening;\n }\n\n async #doOpen(): Promise<OpenCode> {\n const storage = prefixTables(this.lifecycle.storage, TABLE_PREFIX);\n const opencode = await this.#options.opencode({ storage });\n try {\n await opencode.sessions.get({ sessionID: ROOT_SESSION });\n } catch (error) {\n if (!isTagged(error, \"SessionNotFoundError\")) {\n await opencode.close();\n throw new Error(`OpenCode: ${describe(error)}`, { cause: error });\n }\n await this.#createSession(opencode, ROOT_SESSION);\n }\n return opencode;\n }\n\n /** Whether OpenCode has the message, as an inbox item or in the transcript. */\n async #known(\n opencode: OpenCode,\n session: OpenCodeSessionId,\n messageId: string\n ): Promise<boolean> {\n return (await this.#state(opencode, session, messageId))._tag !== \"missing\";\n }\n\n /**\n * Where an operation is. Reads the transcript newest first, back to the\n * operation's message, then finds the first idle marker after it: the end\n * of the run that answered it.\n */\n async #state(\n opencode: OpenCode,\n session: OpenCodeSessionId,\n messageId: string\n ): Promise<OperationState> {\n const inbox = await this.#call(() =>\n opencode.sessions.inbox.list({ sessionID: session })\n );\n if (inbox.some((item) => item.id === messageId)) return { _tag: \"queued\" };\n\n const after = await this.#messagesAfter(opencode, session, messageId);\n if (after === undefined) return { _tag: \"missing\" };\n // OpenCode drains queued follow-ups inside one run and marks only the\n // run's end with an idle message. So an operation's answer ends at the\n // next user message, or at the idle marker if none comes first.\n let last: OpenCodeMessage | undefined;\n for (const message of after) {\n if (message.type === \"idle\") {\n return settledState(message.outcome, last);\n }\n if (message.type === \"user\" && last !== undefined) {\n return settledState(\"succeeded\", last);\n }\n if (message.type === \"assistant\") last = message;\n }\n return { _tag: \"running\" };\n }\n\n /**\n * The messages after `messageId`, oldest first, or undefined when the\n * transcript has no such message.\n */\n async #messagesAfter(\n opencode: OpenCode,\n session: OpenCodeSessionId,\n messageId: string\n ): Promise<OpenCodeMessage[] | undefined> {\n const newer: OpenCodeMessage[] = [];\n let cursor: string | undefined;\n for (;;) {\n // OpenCode rejects an explicit order or limit alongside a cursor.\n const page = await this.#call(() =>\n opencode.message.list(\n cursor === undefined\n ? { sessionID: session, order: \"desc\", limit: MESSAGE_PAGE }\n : { sessionID: session, cursor }\n )\n );\n for (const message of page.data) {\n if (message.id === messageId) return newer.reverse();\n newer.push(message);\n }\n const next = page.cursor.next;\n if (next === undefined || next === null) return undefined;\n cursor = next;\n }\n }\n\n /**\n * Operations the running turn is answering: the newest user messages, back\n * to the assistant message or idle marker before them. Earlier inputs of\n * the same run already have their answer.\n */\n async #running(\n opencode: OpenCode,\n session: OpenCodeSessionId\n ): Promise<string[]> {\n const running: string[] = [];\n let cursor: string | undefined;\n for (;;) {\n const page = await this.#call(() =>\n opencode.message.list(\n cursor === undefined\n ? { sessionID: session, order: \"desc\", limit: MESSAGE_PAGE }\n : { sessionID: session, cursor }\n )\n );\n for (const message of page.data) {\n if (message.type === \"user\") {\n running.push(operationIdOf(message.id));\n } else if (\n message.type === \"idle\" ||\n (message.type === \"assistant\" && running.length > 0)\n ) {\n return running.reverse();\n }\n }\n const next = page.cursor.next;\n if (next === undefined || next === null) return running.reverse();\n cursor = next;\n }\n }\n}\n\n/**\n * Whether the transcript ends in a turn with no idle marker after it: a run\n * in progress, or one a restart cut off that OpenCode resumes on boot.\n */\nasync function unsettled(\n opencode: OpenCode,\n session: OpenCodeSessionId\n): Promise<boolean> {\n let cursor: string | undefined;\n for (;;) {\n const page = await opencode.message.list(\n cursor === undefined\n ? { sessionID: session, order: \"desc\", limit: MESSAGE_PAGE }\n : { sessionID: session, cursor }\n );\n for (const message of page.data) {\n if (message.type === \"idle\") return false;\n if (message.type === \"user\" || message.type === \"synthetic\") {\n return true;\n }\n }\n const next = page.cursor.next;\n if (next === undefined || next === null) return false;\n cursor = next;\n }\n}\n\n/**\n * Whether the session has work: running, input waiting in its inbox, or a\n * turn a restart cut off, which OpenCode resumes in the background on boot\n * and so is not running yet.\n */\nasync function sessionBusy(\n opencode: OpenCode,\n session: OpenCodeSessionId,\n active: Readonly<Record<string, unknown>>\n): Promise<boolean> {\n if (active[session] !== undefined) return true;\n const inbox = await opencode.sessions.inbox.list({ sessionID: session });\n return inbox.length > 0 || (await unsettled(opencode, session));\n}\n\n/** Every session, with whether it has work. */\nasync function listSessions(\n opencode: OpenCode\n): Promise<OpenCodeSessionInfo[]> {\n const active = await opencode.sessions.active();\n const sessions: OpenCodeSessionInfo[] = [];\n let cursor: string | undefined;\n for (;;) {\n const page = await opencode.sessions.list(\n cursor === undefined ? {} : { cursor }\n );\n for (const info of page.data) {\n const parent = info.fork?.sessionID ?? info.parentID;\n sessions.push({\n id: info.id,\n ...(parent === undefined ? {} : { parent }),\n ...(info.title === undefined ? {} : { title: info.title }),\n busy: await sessionBusy(opencode, info.id, active)\n });\n }\n const next = page.cursor.next;\n if (next === undefined || next === null) return sessions;\n cursor = next;\n }\n}\n\n/** An operation's end, from the last assistant message of its run. */\nfunction settledState(\n outcome: \"succeeded\" | \"failed\" | \"interrupted\",\n last: OpenCodeMessage | undefined\n): OperationState {\n const error = last?.type === \"assistant\" ? last.error?.message : undefined;\n return {\n _tag: \"settled\",\n outcome:\n error !== undefined && outcome === \"succeeded\" ? \"failed\" : outcome,\n text: textOf(last),\n error\n };\n}\n\n/** Resolve after `ms`, or reject when `signal` aborts. */\nfunction delay(ms: number, signal: AbortSignal | undefined): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason);\n },\n { once: true }\n );\n });\n}\n\n/** One OpenCode session, addressed through the harness. */\nexport class OpenCodeSession {\n readonly #harness: OpenCodeHarness;\n /** The session's id. */\n readonly id: OpenCodeSessionId;\n\n /**\n * @param harness - The harness that hosts the session.\n * @param id - The session's id.\n */\n constructor(harness: OpenCodeHarness, id: OpenCodeSessionId) {\n this.#harness = harness;\n this.id = id;\n }\n\n /** Durably submit a prompt. Resolves before the model runs. */\n submit(\n input: OpenCodeInput,\n options: OpenCodeSubmitOptions = {}\n ): Promise<OpenCodeReceipt> {\n return this.#harness.enqueue(this.id, input, options);\n }\n\n /** Submit and wait for the answer and the updated transcript. */\n async prompt(\n input: OpenCodeInput,\n options: OpenCodeSubmitOptions = {}\n ): Promise<OpenCodePromptResponse> {\n const receipt = await this.submit(input, options);\n const result = await this.wait(receipt.operationId);\n return { ...result, messages: await this.messages() };\n }\n\n /** Join the running work at its next step. */\n steer(\n input: OpenCodeInput,\n options: Omit<OpenCodeSubmitOptions, \"whenBusy\"> = {}\n ): Promise<OpenCodeReceipt> {\n return this.submit(input, { ...options, whenBusy: \"steer\" });\n }\n\n /** Wait for an operation to settle. Aborting `signal` stops only the wait. */\n wait(\n operationId: string,\n signal?: AbortSignal\n ): Promise<OpenCodeOperationResult> {\n return this.#harness.settled(this.id, operationId, signal);\n }\n\n /**\n * Withdraw one queued operation (or interrupt the run it joined), or, with\n * no id, abort the session: OpenCode's queued inputs are withdrawn and the\n * running work is interrupted.\n */\n async abort(operationId?: string): Promise<boolean> {\n if (operationId !== undefined) {\n return this.#harness.withdraw(this.id, operationId);\n }\n await this.#harness.interrupt(this.id);\n return true;\n }\n\n /** Change this session's model; `agents/models/opencode` makes them. */\n async setModel(model: {\n readonly providerID: string;\n readonly id: string;\n }): Promise<void> {\n await this.#harness.use((opencode) =>\n opencode.sessions.switchModel({\n sessionID: this.id,\n model: { providerID: model.providerID, id: model.id }\n })\n );\n }\n\n /** Change this session's OpenCode agent, such as `build` or `plan`. */\n async setAgent(agent: string): Promise<void> {\n await this.#harness.use((opencode) =>\n opencode.sessions.switchAgent({ sessionID: this.id, agent })\n );\n }\n\n /** The active transcript: OpenCode's messages since the newest compaction. */\n async messages(): Promise<OpenCodeMessage[]> {\n return this.#harness.use((opencode) =>\n opencode.sessions.context({ sessionID: this.id })\n );\n }\n\n /**\n * The whole transcript, oldest first, compacted messages included.\n * OpenCode compacts a long session on its own; `messages()` is what the\n * model sees after that, this is everything the session has said.\n */\n history(): Promise<OpenCodeMessage[]> {\n return this.#harness.use(async (opencode) => {\n const messages: OpenCodeMessage[] = [];\n let cursor: string | undefined;\n for (;;) {\n // OpenCode rejects an explicit order or limit alongside a cursor.\n const page = await opencode.message.list(\n cursor === undefined\n ? { sessionID: this.id, order: \"asc\", limit: 100 }\n : { sessionID: this.id, cursor }\n );\n messages.push(...page.data);\n const next = page.cursor.next;\n if (next === undefined || next === null) return messages;\n cursor = next;\n }\n });\n }\n\n /**\n * OpenCode's events for this session as they happen, durable and live\n * (text deltas, tool input), until `signal` aborts. Read the transcript\n * with `messages()` first for a snapshot; use `log()` to resume from a\n * durable position instead.\n */\n async *events(signal?: AbortSignal): AsyncIterable<OpenCodeEvent> {\n const release = this.#harness.lease();\n try {\n const opencode = await this.#harness.opencode();\n for await (const event of opencode.events.subscribe(\n signal ? { signal } : {}\n )) {\n if (sessionIdOf(event) === this.id) yield event;\n }\n } finally {\n await release();\n }\n }\n\n /**\n * The session's durable events after sequence number `after` (from the\n * start by default), then, with `follow`, new ones as they are committed,\n * until `signal` aborts.\n */\n async *log(\n options: {\n readonly after?: number;\n readonly follow?: boolean;\n readonly signal?: AbortSignal;\n } = {}\n ): AsyncIterable<OpenCodeLogEvent> {\n const release = this.#harness.lease();\n try {\n const opencode = await this.#harness.opencode();\n yield* opencode.sessions.log(\n {\n sessionID: this.id,\n ...(options.after === undefined ? {} : { after: options.after }),\n ...(options.follow === undefined ? {} : { follow: options.follow })\n },\n options.signal ? { signal: options.signal } : undefined\n );\n } finally {\n await release();\n }\n }\n\n /**\n * Whether the session has work: running, input waiting, or a turn a\n * restart cut off that OpenCode is about to resume.\n */\n async busy(): Promise<boolean> {\n return this.#harness.use(async (opencode) =>\n sessionBusy(opencode, this.id, await opencode.sessions.active())\n );\n }\n}\n\n/** Every OpenCode session in this object. */\nexport class OpenCodeSessions {\n readonly #harness: OpenCodeHarness;\n\n /** @param harness - The harness that hosts the sessions. */\n constructor(harness: OpenCodeHarness) {\n this.#harness = harness;\n }\n\n /** A handle on one session. No I/O until you call it. */\n get(id: OpenCodeSessionId): OpenCodeSession {\n return this.#harness.session(id);\n }\n\n /** A new top-level session, configured like the root. */\n async create(): Promise<OpenCodeSession> {\n return this.#harness.session(await this.#harness.create());\n }\n\n /** A new session that sees `from`'s history up to now. */\n async fork(from: OpenCodeSessionId): Promise<OpenCodeSession> {\n const fork = await this.#harness.use((opencode) =>\n opencode.sessions.fork({ sessionID: from })\n );\n return this.#harness.session(fork.id);\n }\n\n /** Every session, including subagent sessions OpenCode spawned. */\n list(): Promise<OpenCodeSessionInfo[]> {\n return this.#harness.use(listSessions);\n }\n}\n"],"mappings":"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"}
|
|
@@ -3,8 +3,9 @@ import {
|
|
|
3
3
|
n as CapabilityStartContext,
|
|
4
4
|
s as LifecycleCapability,
|
|
5
5
|
v as LifecycleJobOutcome
|
|
6
|
-
} from "../../capability-runner-
|
|
6
|
+
} from "../../capability-runner-BiVUtjqC.js";
|
|
7
7
|
import { T as SkillSource } from "../../index-kbSUIer3.js";
|
|
8
|
+
import { Api, Model, ModelThinkingLevel } from "@earendil-works/pi-ai";
|
|
8
9
|
import {
|
|
9
10
|
AgentChange,
|
|
10
11
|
AgentEventStream,
|
|
@@ -12,10 +13,10 @@ import {
|
|
|
12
13
|
EntryRecord,
|
|
13
14
|
Extension,
|
|
14
15
|
Harness,
|
|
16
|
+
ToolRegistration,
|
|
15
17
|
UserInput
|
|
16
18
|
} from "@earendil-works/pi-durable";
|
|
17
19
|
import { SqliteStorage } from "@earendil-works/pi-durable/storage/sqlite";
|
|
18
|
-
import { Api, Model, ModelThinkingLevel } from "@earendil-works/pi-ai";
|
|
19
20
|
|
|
20
21
|
//#region src/harness/pi/context.d.ts
|
|
21
22
|
/**
|
package/dist/harness/pi/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { i as _classPrivateFieldInitSpec, n as _classPrivateFieldSet2, r as _assertClassBrand, t as _classPrivateFieldGet2 } from "../../classPrivateFieldGet2-DZBYAB34.js";
|
|
2
2
|
import { t as _classPrivateMethodInitSpec } from "../../classPrivateMethodInitSpec-qMjJ6sHQ.js";
|
|
3
|
-
import { t as LifecycleCapability } from "../../capability-
|
|
4
|
-
import "../../lifecycle-
|
|
3
|
+
import { t as LifecycleCapability } from "../../capability-DBAKc6UZ.js";
|
|
4
|
+
import "../../lifecycle-DGorpAmA.js";
|
|
5
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
5
6
|
import { LiveDoc, ROOT_CONVERSATION_ID, watchEvents } from "@earendil-works/pi-durable";
|
|
6
7
|
import { SQLITE_MIGRATIONS, SqliteStorage } from "@earendil-works/pi-durable/storage/sqlite";
|
|
7
|
-
import { Type } from "@earendil-works/pi-ai";
|
|
8
8
|
//#region src/harness/pi/context.ts
|
|
9
9
|
/** chord's `BACKGROUND_CONTEXT`: no values, never cancelled. */
|
|
10
10
|
const BACKGROUND_CONTEXT = Object.freeze({
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
a as LogEntry,
|
|
3
|
+
c as OperationStatus,
|
|
4
|
+
i as LogAppend,
|
|
5
|
+
l as SessionRecord,
|
|
6
|
+
n as HarnessStoreOptions,
|
|
7
|
+
o as OperationOutcome,
|
|
8
|
+
r as JsonValue,
|
|
9
|
+
s as OperationRecord,
|
|
10
|
+
t as HarnessStore,
|
|
11
|
+
u as openHarnessStore
|
|
12
|
+
} from "../../store-BKM4Xm9M.js";
|
|
13
|
+
export {
|
|
14
|
+
HarnessStore,
|
|
15
|
+
type HarnessStoreOptions,
|
|
16
|
+
type JsonValue,
|
|
17
|
+
type LogAppend,
|
|
18
|
+
type LogEntry,
|
|
19
|
+
type OperationOutcome,
|
|
20
|
+
type OperationRecord,
|
|
21
|
+
type OperationStatus,
|
|
22
|
+
type SessionRecord,
|
|
23
|
+
openHarnessStore
|
|
24
|
+
};
|