agents 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +8 -9
  2. package/dist/{agent-routing-0DR0Tk2v.d.ts → agent-routing-Bhdbvf7s.d.ts} +13 -8
  3. package/dist/agent-routing.d.ts +1 -1
  4. package/dist/agent-tool-types.d.ts +1 -1
  5. package/dist/{agent-tools-YrATZJu2.d.ts → agent-tools-bJZwBMfq.d.ts} +2 -2
  6. package/dist/agent-tools.d.ts +1 -1
  7. package/dist/ai-sdk-OoGkFy3s.js +2444 -0
  8. package/dist/ai-sdk-OoGkFy3s.js.map +1 -0
  9. package/dist/apply-chunks-1FheRb9W.js +99 -0
  10. package/dist/apply-chunks-1FheRb9W.js.map +1 -0
  11. package/dist/broadcast-state-CEyI4uAK.js +69 -0
  12. package/dist/broadcast-state-CEyI4uAK.js.map +1 -0
  13. package/dist/browser/ai-sdk.d.ts +1 -1
  14. package/dist/browser/ai-sdk.js +2 -2
  15. package/dist/browser/ai-sdk.js.map +1 -1
  16. package/dist/browser/index.d.ts +1 -1
  17. package/dist/browser/tanstack-ai.d.ts +1 -1
  18. package/dist/browser/tanstack-ai.js +1 -1
  19. package/dist/{browser-DE3d-RLk.d.ts → browser-tmkcAAI3.d.ts} +2 -2
  20. package/dist/{browser-tool-DuNdlwZ9.d.ts → browser-tool-Bn-nzJQI.d.ts} +3 -3
  21. package/dist/{browser-tool-CQ10e6Kj.js → browser-tool-CBqs6hqa.js} +58 -18
  22. package/dist/browser-tool-CBqs6hqa.js.map +1 -0
  23. package/dist/capability-B4WbF81e.js.map +1 -1
  24. package/dist/{capability-runner-DBAnGr6L.d.ts → capability-runner-O5VbQzqg.d.ts} +9 -1
  25. package/dist/channel-Bak_6zDP.d.ts +333 -0
  26. package/dist/chat/index.d.ts +11 -9
  27. package/dist/chat/index.js +5 -194
  28. package/dist/chat/index.js.map +1 -1
  29. package/dist/chat/react.d.ts +2 -4
  30. package/dist/chat/react.js +3 -1
  31. package/dist/chat/react.js.map +1 -1
  32. package/dist/chat-sdk/index.d.ts +1 -1
  33. package/dist/chat-sdk/index.js +1 -1
  34. package/dist/cli.js +144 -0
  35. package/dist/{client-fyQrLGkD.js → client-1tEQ1Oqz.js} +27 -2
  36. package/dist/{client-fyQrLGkD.js.map → client-1tEQ1Oqz.js.map} +1 -1
  37. package/dist/{client-je3koD9Z.d.ts → client-DS3Dz9l0.d.ts} +2 -2
  38. package/dist/client-tools-aIBO0Fk7.d.ts +53 -0
  39. package/dist/client.d.ts +1 -1
  40. package/dist/conversations-DH0ut_8n.d.ts +192 -0
  41. package/dist/{current-agent-vAk_5JMt.d.ts → current-agent-C07C5o5Y.d.ts} +3 -3
  42. package/dist/daemon-core-Buubj-y1.js +481 -0
  43. package/dist/daemon-core-Buubj-y1.js.map +1 -0
  44. package/dist/daemon-core-CbohVPAu.d.ts +132 -0
  45. package/dist/{do-oauth-client-provider-Tmf1vgKz.d.ts → do-oauth-client-provider-DfsUcpc3.d.ts} +7 -1
  46. package/dist/{durable-object-lifecycle-HhgOMWq9.d.ts → durable-object-lifecycle-DRqp475_.d.ts} +2 -2
  47. package/dist/{channels/email.d.ts → experimental/channels/email/index.d.ts} +25 -12
  48. package/dist/{channels/email.js → experimental/channels/email/index.js} +13 -35
  49. package/dist/experimental/channels/email/index.js.map +1 -0
  50. package/dist/experimental/channels/index.d.ts +270 -0
  51. package/dist/experimental/channels/index.js +1186 -0
  52. package/dist/experimental/channels/index.js.map +1 -0
  53. package/dist/{channels/slack.d.ts → experimental/channels/slack/index.d.ts} +19 -9
  54. package/dist/experimental/channels/slack/index.js +267 -0
  55. package/dist/experimental/channels/slack/index.js.map +1 -0
  56. package/dist/{channels/telegram.d.ts → experimental/channels/telegram/index.d.ts} +19 -9
  57. package/dist/experimental/channels/telegram/index.js +198 -0
  58. package/dist/experimental/channels/telegram/index.js.map +1 -0
  59. package/dist/experimental/channels/web/ai-sdk.d.ts +55 -0
  60. package/dist/experimental/channels/web/ai-sdk.js +266 -0
  61. package/dist/experimental/channels/web/ai-sdk.js.map +1 -0
  62. package/dist/experimental/channels/web/client.d.ts +97 -0
  63. package/dist/experimental/channels/web/client.js +349 -0
  64. package/dist/experimental/channels/web/client.js.map +1 -0
  65. package/dist/experimental/channels/web/index.d.ts +189 -0
  66. package/dist/experimental/channels/web/index.js +332 -0
  67. package/dist/experimental/channels/web/index.js.map +1 -0
  68. package/dist/gateway-BDC07gYO.d.ts +100 -0
  69. package/dist/handle-zAzh0UW2.d.ts +460 -0
  70. package/dist/harness/ai-sdk/index.d.ts +175 -0
  71. package/dist/harness/ai-sdk/index.js +605 -0
  72. package/dist/harness/ai-sdk/index.js.map +1 -0
  73. package/dist/harness/container/daemon/index.d.ts +76 -0
  74. package/dist/harness/container/daemon/index.js +3 -0
  75. package/dist/harness/container/index.d.ts +740 -0
  76. package/dist/harness/container/index.js +2152 -0
  77. package/dist/harness/container/index.js.map +1 -0
  78. package/dist/harness/container/runtime/index.d.ts +144 -0
  79. package/dist/harness/container/runtime/index.js +1082 -0
  80. package/dist/harness/container/runtime/index.js.map +1 -0
  81. package/dist/harness/opencode/index.d.ts +369 -0
  82. package/dist/harness/opencode/index.js +1072 -0
  83. package/dist/harness/opencode/index.js.map +1 -0
  84. package/dist/{harnesses → harness}/pi/index.d.ts +85 -88
  85. package/dist/{harnesses → harness}/pi/index.js +196 -77
  86. package/dist/harness/pi/index.js.map +1 -0
  87. package/dist/harness/store/index.d.ts +24 -0
  88. package/dist/harness/store/index.js +2 -0
  89. package/dist/harness/think/index.d.ts +821 -0
  90. package/dist/harness/think/index.js +2529 -0
  91. package/dist/harness/think/index.js.map +1 -0
  92. package/dist/harness-B6B9S3rb.d.ts +203 -0
  93. package/dist/{images-iiTDSyRu.js → images-Ce9SCu3X.js} +2 -248
  94. package/dist/images-Ce9SCu3X.js.map +1 -0
  95. package/dist/{index-BreL0YrQ.d.ts → index-D0A5tbWu.d.ts} +2 -2
  96. package/dist/index-Ib_4dwOo.d.ts +200 -0
  97. package/dist/index.d.ts +5 -5
  98. package/dist/index.js +2 -2
  99. package/dist/ingress-EFbrS547.js +9 -0
  100. package/dist/ingress-EFbrS547.js.map +1 -0
  101. package/dist/input-schema-DNrpTu49.js +23 -0
  102. package/dist/input-schema-DNrpTu49.js.map +1 -0
  103. package/dist/internal-kmw70xwR.js +46 -0
  104. package/dist/internal-kmw70xwR.js.map +1 -0
  105. package/dist/internal_context.d.ts +1 -1
  106. package/dist/lifecycle/index.d.ts +3 -3
  107. package/dist/mcp/client/do-oauth-client-provider.d.ts +1 -1
  108. package/dist/mcp/client/do-oauth-client-provider.js +9 -0
  109. package/dist/mcp/client/do-oauth-client-provider.js.map +1 -1
  110. package/dist/mcp/client/index.d.ts +1 -1
  111. package/dist/mcp/client/index.js +1 -1
  112. package/dist/mcp/client/x402.d.ts +35 -4
  113. package/dist/mcp/client/x402.js +24 -3
  114. package/dist/mcp/client/x402.js.map +1 -1
  115. package/dist/mcp/index.d.ts +1 -1
  116. package/dist/mcp/index.js +2 -2
  117. package/dist/models/ai-sdk/index.d.ts +16 -14
  118. package/dist/models/ai-sdk/index.js +1 -2442
  119. package/dist/models/opencode/index.d.ts +65 -0
  120. package/dist/models/opencode/index.js +285 -0
  121. package/dist/models/opencode/index.js.map +1 -0
  122. package/dist/models/pi-ai/index.d.ts +23 -21
  123. package/dist/models/pi-ai/index.js +7 -6
  124. package/dist/models/pi-ai/index.js.map +1 -1
  125. package/dist/options-pwTNq9z6.d.ts +134 -0
  126. package/dist/protocol-BEgrJYC5.d.ts +331 -0
  127. package/dist/protocol-CukuI73M.d.ts +386 -0
  128. package/dist/protocol-cOklVBBD.js +227 -0
  129. package/dist/protocol-cOklVBBD.js.map +1 -0
  130. package/dist/{protocol-kHsr-f0X.js → protocol-eXeJxhgu.js} +2 -67
  131. package/dist/protocol-eXeJxhgu.js.map +1 -0
  132. package/dist/protocol-y2sSY584.js +148 -0
  133. package/dist/protocol-y2sSY584.js.map +1 -0
  134. package/dist/queue/index.d.ts +1 -1
  135. package/dist/react.d.ts +2 -2
  136. package/dist/routing/index.d.ts +2 -2
  137. package/dist/{scheduler-RdACNXDP.d.ts → scheduler-CrFCnv_J.d.ts} +2 -2
  138. package/dist/schedules/index.d.ts +1 -1
  139. package/dist/serializable.d.ts +1 -1
  140. package/dist/sessions/index.d.ts +11 -434
  141. package/dist/sessions/index.js +1 -2271
  142. package/dist/sessions-B9pNuxdT.js +2272 -0
  143. package/dist/sessions-B9pNuxdT.js.map +1 -0
  144. package/dist/settings-C45hDliX.js +253 -0
  145. package/dist/settings-C45hDliX.js.map +1 -0
  146. package/dist/{transport-PfFnt-Ld.d.ts → settings-NgGwF7Qt.d.ts} +14 -208
  147. package/dist/{src-BZeu-SCD.js → src-DgCbZtIR.js} +4 -4
  148. package/dist/{src-BZeu-SCD.js.map → src-DgCbZtIR.js.map} +1 -1
  149. package/dist/stall-watchdog-BpRF2uwG.js +195 -0
  150. package/dist/stall-watchdog-BpRF2uwG.js.map +1 -0
  151. package/dist/state/index.d.ts +1 -1
  152. package/dist/store-DLeqKuj3.d.ts +310 -0
  153. package/dist/store-vgcPYo8K.js +432 -0
  154. package/dist/store-vgcPYo8K.js.map +1 -0
  155. package/dist/streams/index.d.ts +1 -1
  156. package/dist/streams/index.js +1 -1
  157. package/dist/{streams-DW-UCOUc.js → streams-CITClVer.js} +16 -3
  158. package/dist/streams-CITClVer.js.map +1 -0
  159. package/dist/{streams-Cmkj9QfW.d.ts → streams-fbG61qM8.d.ts} +2 -2
  160. package/dist/sub-routing.d.ts +1 -1
  161. package/dist/tasks/index.d.ts +1 -1
  162. package/dist/tasks/index.js +1 -1
  163. package/dist/{tasks-68DESxf0.js → tasks-CkTZNaV1.js} +2 -1
  164. package/dist/tasks-CkTZNaV1.js.map +1 -0
  165. package/dist/{tasks-9YxYtByh.d.ts → tasks-PtlB4Uyn.d.ts} +2 -2
  166. package/dist/tool-3PA8xjB_.js +421 -0
  167. package/dist/tool-3PA8xjB_.js.map +1 -0
  168. package/dist/tool-BPJEbwaX.d.ts +278 -0
  169. package/dist/transport-k2mFrtL8.d.ts +200 -0
  170. package/dist/turns-DCV3ycDl.js +317 -0
  171. package/dist/turns-DCV3ycDl.js.map +1 -0
  172. package/dist/voice/client.js +1 -1
  173. package/dist/voice/index.d.ts +2 -2
  174. package/dist/voice/index.js +1 -1
  175. package/dist/websearch/index.d.ts +58 -0
  176. package/dist/websearch/index.js +2 -0
  177. package/dist/websearch/tools/ai-sdk.d.ts +77 -0
  178. package/dist/websearch/tools/ai-sdk.js +46 -0
  179. package/dist/websearch/tools/ai-sdk.js.map +1 -0
  180. package/dist/websearch/tools/pi.d.ts +82 -0
  181. package/dist/websearch/tools/pi.js +89 -0
  182. package/dist/websearch/tools/pi.js.map +1 -0
  183. package/dist/websearch/tools/tanstack-ai.d.ts +71 -0
  184. package/dist/websearch/tools/tanstack-ai.js +46 -0
  185. package/dist/websearch/tools/tanstack-ai.js.map +1 -0
  186. package/dist/websockets/index.d.ts +12 -296
  187. package/dist/websockets/index.js +1 -1
  188. package/dist/{websockets-Ci-LZFHH.js → websockets-CmENGb-Z.js} +18 -4
  189. package/dist/websockets-CmENGb-Z.js.map +1 -0
  190. package/dist/{wire-types-CrjKvDyi.d.ts → wire-types-Cv0iwjk5.d.ts} +3 -51
  191. package/dist/workflow-types.d.ts +1 -1
  192. package/dist/workflows.d.ts +1 -1
  193. package/dist/workflows.js +1 -1
  194. package/docs/browse-the-web.md +3 -0
  195. package/docs/harnesses/pi.md +114 -32
  196. package/docs/harnesses/think.md +215 -0
  197. package/docs/index.md +4 -3
  198. package/docs/lifecycle.md +40 -0
  199. package/docs/models-pi-ai.md +5 -5
  200. package/docs/search-the-web.md +133 -0
  201. package/package.json +126 -47
  202. package/dist/browser-tool-CQ10e6Kj.js.map +0 -1
  203. package/dist/channel-Bnm4S7T2.d.ts +0 -491
  204. package/dist/channels/ai-sdk.d.ts +0 -46
  205. package/dist/channels/ai-sdk.js +0 -120
  206. package/dist/channels/ai-sdk.js.map +0 -1
  207. package/dist/channels/email.js.map +0 -1
  208. package/dist/channels/index.d.ts +0 -233
  209. package/dist/channels/index.js +0 -608
  210. package/dist/channels/index.js.map +0 -1
  211. package/dist/channels/slack.js +0 -614
  212. package/dist/channels/slack.js.map +0 -1
  213. package/dist/channels/tanstack-ai.d.ts +0 -39
  214. package/dist/channels/tanstack-ai.js +0 -17
  215. package/dist/channels/tanstack-ai.js.map +0 -1
  216. package/dist/channels/telegram.js +0 -427
  217. package/dist/channels/telegram.js.map +0 -1
  218. package/dist/channels/voice.d.ts +0 -45
  219. package/dist/channels/voice.js +0 -122
  220. package/dist/channels/voice.js.map +0 -1
  221. package/dist/harnesses/pi/index.js.map +0 -1
  222. package/dist/images-iiTDSyRu.js.map +0 -1
  223. package/dist/index-BB0kqhIz.d.ts +0 -101
  224. package/dist/ingress-BfetZbMO.js +0 -83
  225. package/dist/ingress-BfetZbMO.js.map +0 -1
  226. package/dist/internal-CYlgHl1l.js +0 -59
  227. package/dist/internal-CYlgHl1l.js.map +0 -1
  228. package/dist/models/ai-sdk/index.js.map +0 -1
  229. package/dist/protocol-kHsr-f0X.js.map +0 -1
  230. package/dist/sessions/index.js.map +0 -1
  231. package/dist/streams-DW-UCOUc.js.map +0 -1
  232. package/dist/surface-bZZJqBka.js +0 -17
  233. package/dist/surface-bZZJqBka.js.map +0 -1
  234. package/dist/tasks-68DESxf0.js.map +0 -1
  235. package/dist/tool-schema-CBjGPrsQ.js +0 -31
  236. package/dist/tool-schema-CBjGPrsQ.js.map +0 -1
  237. package/dist/websockets-Ci-LZFHH.js.map +0 -1
  238. 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,25 +3,22 @@ import {
3
3
  n as CapabilityStartContext,
4
4
  s as LifecycleCapability,
5
5
  v as LifecycleJobOutcome
6
- } from "../../capability-runner-DBAnGr6L.js";
6
+ } from "../../capability-runner-O5VbQzqg.js";
7
7
  import { T as SkillSource } from "../../index-kbSUIer3.js";
8
8
  import {
9
+ AgentChange,
9
10
  AgentEventStream,
10
11
  Conversation,
11
- ConversationId,
12
- ConversationRetryPolicy,
13
12
  EntryRecord,
13
+ Extension,
14
14
  Harness,
15
- ModelRef,
16
- Registry,
17
15
  ToolRegistration,
18
- Tx,
19
16
  UserInput
20
17
  } from "@earendil-works/pi-durable";
21
18
  import { SqliteStorage } from "@earendil-works/pi-durable/storage/sqlite";
22
- import { ModelThinkingLevel } from "@earendil-works/pi-ai";
19
+ import { Api, Model, ModelThinkingLevel } from "@earendil-works/pi-ai";
23
20
 
24
- //#region src/harnesses/pi/context.d.ts
21
+ //#region src/harness/pi/context.d.ts
25
22
  /**
26
23
  * pi's invocation context, as `@earendil-works/chord` defines it.
27
24
  *
@@ -34,44 +31,16 @@ import { ModelThinkingLevel } from "@earendil-works/pi-ai";
34
31
  *
35
32
  * One limit: chord's own derived contexts read the abort signal through a
36
33
  * private key rather than `abortSignal`, so a chord `withContextValue`
37
- * wrapped around one of these would not see its signal. pi 0.99.2 never
38
- * wraps a caller's context that way; `withAbortSignal` and `withCancel`
39
- * read `abortSignal` and work.
34
+ * wrapped around one of these would not see its signal. pi-durable does not
35
+ * use `withContextValue` to wrap a caller's context that way; `withAbortSignal`
36
+ * and `withCancel` read `abortSignal` and work.
40
37
  *
41
38
  * If pi-durable starts re-exporting chord's context helpers, replace this
42
39
  * file with those.
43
40
  */
44
41
  type Context$1 = Parameters<Harness["close"]>[0];
45
42
  //#endregion
46
- //#region src/harnesses/pi/session-store.d.ts
47
- /**
48
- * pi's session store on a Durable Object's SQLite database.
49
- *
50
- * pi owns its sessions: conversations, entries, tasks, submissions, and
51
- * documents live in pi's own schema, created and migrated by pi's portable
52
- * `SqliteStorage`. This file only supplies the synchronous database facade
53
- * pi asks for, over `ctx.storage.sql`, and moves pi's tables under a prefix
54
- * so they cannot collide with the SDK's or the host's tables in the same
55
- * object.
56
- *
57
- * It is the Durable Object counterpart of `agents/sessions` for a harness
58
- * that brings its own session model, and has nothing pi-harness specific in
59
- * it: any harness built on pi-durable can open its storage with it.
60
- */
61
- type PiSessionStoreOptions = {
62
- /**
63
- * Prefix for every table and index pi creates. Must not start with `_cf_`,
64
- * which Durable Objects reserve. Default `pi_`.
65
- */
66
- readonly prefix?: string;
67
- };
68
- /** Open pi-durable's storage over this object's SQLite database. */
69
- declare function openPiSessionStore(
70
- storage: DurableObjectStorage,
71
- options?: PiSessionStoreOptions
72
- ): Promise<SqliteStorage>;
73
- //#endregion
74
- //#region src/harnesses/pi/types.d.ts
43
+ //#region src/harness/pi/types.d.ts
75
44
  /**
76
45
  * `PiHarness`'s own types: how the harness addresses sessions and reports
77
46
  * operations. Anything pi already publishes (input, transcript entries,
@@ -125,56 +94,59 @@ type PiSessionInfo = {
125
94
  readonly busy: boolean;
126
95
  };
127
96
  //#endregion
128
- //#region src/harnesses/pi/harness.d.ts
97
+ //#region src/harness/pi/harness.d.ts
129
98
  /** The root session's id. */
130
99
  declare const ROOT_SESSION: PiSessionId;
131
100
  /**
132
- * What the harness factory is handed. The store is already open and pi's
133
- * migrations have run, so a factory only has to decide how to call
134
- * `Harness.open` — or call something else that satisfies the same contract.
101
+ * What the factory is handed: the two things only the harness can build.
102
+ * Everything else `Harness.open` takes (models, registry, settings, env,
103
+ * onReport) the factory builds itself.
135
104
  */
136
105
  type PiHarnessContext = {
137
- /** pi's storage over this object's SQLite, tables under the store prefix. */ readonly storage: SqliteStorage /** Background context, for the open itself. */;
106
+ /** pi's storage over this object's SQLite, its migrations already run. */ readonly storage: SqliteStorage /** Background context, for the open itself. */;
138
107
  readonly context: Context$1;
139
108
  };
140
109
  /**
141
- * Builds pi's `Harness`. Return value is adopted as-is: the caller owns the
142
- * registry (tools, system prompt, hooks, skills), `models`, `env`,
143
- * `onReport` and anything else `HarnessOptions` grows.
110
+ * Opens pi's `Harness`. The harness adopts what it returns.
144
111
  *
145
112
  * ```ts
146
- * harness: ({ storage, context }) =>
147
- * Harness.open(storage, { models, registry }, context)
113
+ * harness: async ({ storage, context }) => {
114
+ * const registry = createRegistry();
115
+ * registry.install(await skills(sources));
116
+ * return Harness.open(storage, { models, registry }, context);
117
+ * }
148
118
  * ```
149
119
  */
150
120
  type PiHarnessFactory = (
151
121
  context: PiHarnessContext
152
122
  ) => Harness | Promise<Harness>;
123
+ /**
124
+ * A model, as pi-ai describes one: `createAI`'s `ai("@cf/…")` returns one.
125
+ *
126
+ * Only its `provider` and `id` are used. pi stores that reference with
127
+ * the session and resolves it, at each request, against the `Models` the
128
+ * factory opened pi with. So the model must be one those `Models` list,
129
+ * and options passed to `ai(id, options)` here, such as `fallback`, are not
130
+ * applied.
131
+ */
132
+ type PiModel = Pick<Model<Api>, "provider" | "id">;
153
133
  /**
154
134
  * Applied to a session the first time it is created. Without a model, a
155
135
  * session's generation fails as unanswered until `session.setModel` sets one.
156
136
  */
157
137
  type PiSessionDefaults = {
158
- /** Model for new sessions. Change one session's with `session.setModel`. */ readonly model?: ModelRef;
159
- readonly thinkingLevel?: ModelThinkingLevel /** pi's generation retries for new sessions. */;
160
- readonly retry?: ConversationRetryPolicy;
161
- };
162
- /**
163
- * How long the wake waits and when it hands a wait to the alarm. Defaults
164
- * suit a real deployment; a test shortens them so a suite does not sit on
165
- * the real heartbeat.
166
- */
167
- type PiWakeTiming = {
168
- /** A pi wait further away than this goes to the alarm. Default 60_000. */ readonly sleepThresholdMs?: number /** Longest one wake waits inside an alarm. Default 600_000. */;
169
- readonly waitBudgetMs?: number /** Heartbeat while waiting, and the re-check for background work. Default 30_000. */;
170
- readonly heartbeatMs?: number;
138
+ /**
139
+ * Model for new sessions, by its `provider` and `id`; it must be on the
140
+ * `Models` the factory opens pi with (see `PiModel`). Change one
141
+ * session's with `session.setModel`.
142
+ */
143
+ readonly model?: PiModel;
144
+ readonly thinkingLevel?: ModelThinkingLevel;
171
145
  };
172
146
  /** `PiHarness`'s options. Only `harness`, which opens pi, is required. */
173
147
  type PiHarnessOptions = {
174
- /** Opens pi's `Harness` over the store this object prepared. */ readonly harness: PiHarnessFactory /** Applied to new sessions. */;
148
+ /** Opens pi's `Harness` over the storage this object prepared. */ readonly harness: PiHarnessFactory /** What a new session starts with. */;
175
149
  readonly defaults?: PiSessionDefaults;
176
- readonly store?: PiSessionStoreOptions;
177
- readonly timing?: PiWakeTiming;
178
150
  };
179
151
  /**
180
152
  * pi-durable hosted in a Durable Object, behind a small harness interface:
@@ -195,7 +167,7 @@ type PiHarnessOptions = {
195
167
  * restarts the object, pi reopens and resumes its own tasks, and the job
196
168
  * waits again.
197
169
  *
198
- * @experimental The API may change between releases.
170
+ * @beta The API may change between releases.
199
171
  */
200
172
  declare class PiHarness extends LifecycleCapability {
201
173
  #private;
@@ -236,8 +208,6 @@ declare class PiHarness extends LifecycleCapability {
236
208
  conversation(session: PiSessionId): Promise<Conversation>;
237
209
  /** @internal */
238
210
  storage(): Promise<SqliteStorage>;
239
- /** @internal Configure a new session like the root. */
240
- initSession(tx: Tx, id: ConversationId): Promise<void>;
241
211
  /** @internal */
242
212
  enqueue(
243
213
  session: PiSessionId,
@@ -252,6 +222,8 @@ declare class PiHarness extends LifecycleCapability {
252
222
  operationId: string,
253
223
  signal?: AbortSignal
254
224
  ): Promise<PiOperationResult>;
225
+ /** @internal The per-conversation defaults supported by pi-durable. */
226
+ agentDefaults(): AgentChange;
255
227
  }
256
228
  /** One pi conversation, addressed through the harness. */
257
229
  declare class PiSession {
@@ -280,7 +252,11 @@ declare class PiSession {
280
252
  abort(operationId?: string): Promise<boolean>;
281
253
  /** Start a new context, optionally from a handoff note. */
282
254
  reset(handoff?: string): Promise<void>;
283
- setModel(model: ModelRef): Promise<void>;
255
+ /**
256
+ * Change this session's model, by its `provider` and `id`; it must be on
257
+ * the `Models` the factory opened pi with (see `PiModel`).
258
+ */
259
+ setModel(model: PiModel): Promise<void>;
284
260
  /** The active transcript, as pi's entries since the newest reset. */
285
261
  messages(): Promise<EntryRecord[]>;
286
262
  /** pi's agent events for this session: a snapshot, then one batch per commit. */
@@ -303,29 +279,52 @@ declare class PiSessions {
303
279
  list(): Promise<PiSessionInfo[]>;
304
280
  }
305
281
  //#endregion
306
- //#region src/harnesses/pi/skills.d.ts
307
- /** Skills resolved from `agents/skills` sources for one process lifetime. */
308
- type ResolvedSkills = {
309
- /** Changes when any source's fingerprint changes. */ readonly fingerprint: string /** Model-facing activation tools; empty when there are no skills. */;
310
- readonly tools: readonly ToolRegistration[] /** System-prompt catalog, or null when there are no skills. */;
311
- readonly catalog: string | null;
312
- readonly warnings: readonly string[];
282
+ //#region src/harness/pi/session-store.d.ts
283
+ /**
284
+ * pi's session store on a Durable Object's SQLite database.
285
+ *
286
+ * pi owns its sessions: conversations, entries, tasks, submissions, and
287
+ * documents live in pi's own schema, created and migrated by pi's portable
288
+ * `SqliteStorage`. This file only supplies the asynchronous database facade
289
+ * pi asks for, over `ctx.storage.sql`, and moves pi's tables under a prefix
290
+ * so they cannot collide with the SDK's or the host's tables in the same
291
+ * object.
292
+ *
293
+ * It is the Durable Object counterpart of `agents/sessions` for a harness
294
+ * that brings its own session model, and has nothing pi-harness specific in
295
+ * it: any harness built on pi-durable can open its storage with it.
296
+ */
297
+ type PiSessionStoreOptions = {
298
+ /**
299
+ * Prefix for every table and index pi creates. Must not start with `_cf_`,
300
+ * which Durable Objects reserve. Default `pi_`.
301
+ */
302
+ readonly prefix?: string;
313
303
  };
304
+ /** Open pi-durable's storage over this object's SQLite database. */
305
+ declare function openPiSessionStore(
306
+ storage: DurableObjectStorage,
307
+ options?: PiSessionStoreOptions
308
+ ): Promise<SqliteStorage>;
309
+ //#endregion
310
+ //#region src/harness/pi/skills.d.ts
314
311
  /**
315
- * Register `agents/skills` sources on a pi registry: the activation tools
316
- * and a "skills" system prompt section. Resolution reads the sources, so a
317
- * host awaits this in its `harness` factory, before `Harness.open`.
312
+ * `agents/skills` sources as a pi extension, named `agents.skills`: the
313
+ * activation tools and a `skills` system prompt section. Install it on
314
+ * pi's registry in the harness factory.
315
+ *
316
+ * ```ts
317
+ * registry.install(await skills(sources));
318
+ * ```
318
319
  */
319
- declare function addSkills(
320
- registry: Registry,
321
- sources: readonly SkillSource[]
322
- ): Promise<ResolvedSkills>;
320
+ declare function skills(sources: readonly SkillSource[]): Promise<Extension>;
323
321
  //#endregion
324
322
  export {
325
323
  PiHarness,
326
324
  type PiHarnessContext,
327
325
  type PiHarnessFactory,
328
326
  type PiHarnessOptions,
327
+ type PiModel,
329
328
  type PiOperationResult,
330
329
  type PiPendingOperation,
331
330
  type PiPromptResponse,
@@ -338,11 +337,9 @@ export {
338
337
  type PiSessionStoreOptions,
339
338
  PiSessions,
340
339
  type PiSubmitOptions,
341
- type PiWakeTiming,
342
340
  type PiWhenBusy,
343
341
  ROOT_SESSION,
344
- type ResolvedSkills,
345
- addSkills,
346
- openPiSessionStore
342
+ openPiSessionStore,
343
+ skills
347
344
  };
348
345
  //# sourceMappingURL=index.d.ts.map