@bastani/atomic 0.9.40 → 0.9.41-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (295) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +1 -1
  3. package/dist/builtin/intercom/CHANGELOG.md +12 -0
  4. package/dist/builtin/intercom/README.md +1 -1
  5. package/dist/builtin/intercom/broker/broker.ts +24 -21
  6. package/dist/builtin/intercom/broker/client.ts +97 -6
  7. package/dist/builtin/intercom/broker/list-reply.ts +53 -0
  8. package/dist/builtin/intercom/index.bundle.mjs +278 -46
  9. package/dist/builtin/intercom/package.json +1 -1
  10. package/dist/builtin/intercom/recoverable-disconnect.ts +27 -1
  11. package/dist/builtin/intercom/types.ts +8 -1
  12. package/dist/builtin/mcp/package.json +1 -1
  13. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  14. package/dist/builtin/subagents/README.md +14 -0
  15. package/dist/builtin/subagents/package.json +1 -1
  16. package/dist/builtin/subagents/src/extension/index.bundle.mjs +99 -19
  17. package/dist/builtin/web-access/package.json +1 -1
  18. package/dist/builtin/workflows/CHANGELOG.md +25 -0
  19. package/dist/builtin/workflows/README.md +2 -0
  20. package/dist/builtin/workflows/package.json +1 -1
  21. package/dist/builtin/workflows/src/authoring.d.ts +1 -1
  22. package/dist/builtin/workflows/src/durable/journal/internal.d.ts +16 -0
  23. package/dist/builtin/workflows/src/durable/journal/legacy-journal-tables.d.ts +9 -0
  24. package/dist/builtin/workflows/src/durable/journal/sql-run-journal.d.ts +6 -0
  25. package/dist/builtin/workflows/src/extension/index.bundle.mjs +441 -90
  26. package/dist/builtin/workflows/src/index.js +226 -34
  27. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +17 -1
  28. package/dist/cli/credential-print.d.ts.map +1 -1
  29. package/dist/cli/credential-print.js +1 -1
  30. package/dist/cli/credential-print.js.map +1 -1
  31. package/dist/config.d.ts +1 -0
  32. package/dist/config.d.ts.map +1 -1
  33. package/dist/config.js +1 -0
  34. package/dist/config.js.map +1 -1
  35. package/dist/core/agent-session-extension-bindings.d.ts +2 -1
  36. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  37. package/dist/core/agent-session-extension-bindings.js +33 -18
  38. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  39. package/dist/core/agent-session-methods.d.ts +2 -1
  40. package/dist/core/agent-session-methods.d.ts.map +1 -1
  41. package/dist/core/agent-session-methods.js.map +1 -1
  42. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  43. package/dist/core/agent-session-prompt.js +114 -21
  44. package/dist/core/agent-session-prompt.js.map +1 -1
  45. package/dist/core/agent-session-runtime.d.ts +1 -1
  46. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  47. package/dist/core/agent-session-runtime.js +6 -0
  48. package/dist/core/agent-session-runtime.js.map +1 -1
  49. package/dist/core/agent-session-state.d.ts +19 -1
  50. package/dist/core/agent-session-state.d.ts.map +1 -1
  51. package/dist/core/agent-session-state.js +41 -6
  52. package/dist/core/agent-session-state.js.map +1 -1
  53. package/dist/core/auth-storage-backends.d.ts +3 -1
  54. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  55. package/dist/core/auth-storage-backends.js +79 -12
  56. package/dist/core/auth-storage-backends.js.map +1 -1
  57. package/dist/core/client-identity.d.ts +8 -0
  58. package/dist/core/client-identity.d.ts.map +1 -0
  59. package/dist/core/client-identity.js +16 -0
  60. package/dist/core/client-identity.js.map +1 -0
  61. package/dist/core/compaction/planner-outcome.d.ts.map +1 -1
  62. package/dist/core/compaction/planner-outcome.js +2 -1
  63. package/dist/core/compaction/planner-outcome.js.map +1 -1
  64. package/dist/core/execution-model-router.d.ts +18 -0
  65. package/dist/core/execution-model-router.d.ts.map +1 -1
  66. package/dist/core/execution-model-router.js +14 -8
  67. package/dist/core/execution-model-router.js.map +1 -1
  68. package/dist/core/extension-oauth-refresh-rejection.d.ts +12 -0
  69. package/dist/core/extension-oauth-refresh-rejection.d.ts.map +1 -0
  70. package/dist/core/extension-oauth-refresh-rejection.js +70 -0
  71. package/dist/core/extension-oauth-refresh-rejection.js.map +1 -0
  72. package/dist/core/extension-startup-failure.d.ts +30 -0
  73. package/dist/core/extension-startup-failure.d.ts.map +1 -0
  74. package/dist/core/extension-startup-failure.js +62 -0
  75. package/dist/core/extension-startup-failure.js.map +1 -0
  76. package/dist/core/extensions/context-types.d.ts +2 -0
  77. package/dist/core/extensions/context-types.d.ts.map +1 -1
  78. package/dist/core/extensions/context-types.js.map +1 -1
  79. package/dist/core/extensions/provider-types.d.ts +2 -0
  80. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  81. package/dist/core/extensions/provider-types.js.map +1 -1
  82. package/dist/core/extensions/runner-context.d.ts +1 -0
  83. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  84. package/dist/core/extensions/runner-context.js +8 -0
  85. package/dist/core/extensions/runner-context.js.map +1 -1
  86. package/dist/core/extensions/runner.d.ts +1 -0
  87. package/dist/core/extensions/runner.d.ts.map +1 -1
  88. package/dist/core/extensions/runner.js +3 -0
  89. package/dist/core/extensions/runner.js.map +1 -1
  90. package/dist/core/extensions/runtime-types.d.ts +1 -0
  91. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  92. package/dist/core/extensions/runtime-types.js.map +1 -1
  93. package/dist/core/extensions/workflow-run-control-hub.d.ts +1 -0
  94. package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -1
  95. package/dist/core/extensions/workflow-run-control-hub.js +3 -0
  96. package/dist/core/extensions/workflow-run-control-hub.js.map +1 -1
  97. package/dist/core/extensions/workflow-run-control.d.ts +8 -0
  98. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -1
  99. package/dist/core/extensions/workflow-run-control.js.map +1 -1
  100. package/dist/core/model-fallback-failures.d.ts.map +1 -1
  101. package/dist/core/model-fallback-failures.js +12 -0
  102. package/dist/core/model-fallback-failures.js.map +1 -1
  103. package/dist/core/model-resolver-defaults.js +1 -1
  104. package/dist/core/model-resolver-defaults.js.map +1 -1
  105. package/dist/core/model-runtime-streaming.d.ts.map +1 -1
  106. package/dist/core/model-runtime-streaming.js +9 -3
  107. package/dist/core/model-runtime-streaming.js.map +1 -1
  108. package/dist/core/model-runtime.d.ts +5 -0
  109. package/dist/core/model-runtime.d.ts.map +1 -1
  110. package/dist/core/model-runtime.js +6 -0
  111. package/dist/core/model-runtime.js.map +1 -1
  112. package/dist/core/provider-composer-internal.d.ts +6 -5
  113. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  114. package/dist/core/provider-composer-internal.js +13 -2
  115. package/dist/core/provider-composer-internal.js.map +1 -1
  116. package/dist/core/sdk.d.ts.map +1 -1
  117. package/dist/core/sdk.js +12 -4
  118. package/dist/core/sdk.js.map +1 -1
  119. package/dist/core/storage/session/sql-session-store.d.ts +35 -0
  120. package/dist/core/storage/session/sql-session-store.d.ts.map +1 -1
  121. package/dist/core/storage/session/sql-session-store.js +158 -42
  122. package/dist/core/storage/session/sql-session-store.js.map +1 -1
  123. package/dist/core/structured-output/deadline.d.ts +40 -0
  124. package/dist/core/structured-output/deadline.d.ts.map +1 -0
  125. package/dist/core/structured-output/deadline.js +110 -0
  126. package/dist/core/structured-output/deadline.js.map +1 -0
  127. package/dist/core/structured-output/index.d.ts.map +1 -1
  128. package/dist/core/structured-output/index.js +103 -47
  129. package/dist/core/structured-output/index.js.map +1 -1
  130. package/dist/core/structured-output/rejection-detail.d.ts +9 -0
  131. package/dist/core/structured-output/rejection-detail.d.ts.map +1 -0
  132. package/dist/core/structured-output/rejection-detail.js +129 -0
  133. package/dist/core/structured-output/rejection-detail.js.map +1 -0
  134. package/dist/core/structured-output/types.d.ts +8 -1
  135. package/dist/core/structured-output/types.d.ts.map +1 -1
  136. package/dist/core/structured-output/types.js.map +1 -1
  137. package/dist/core/tasks/completion.d.ts +7 -1
  138. package/dist/core/tasks/completion.d.ts.map +1 -1
  139. package/dist/core/tasks/completion.js +28 -6
  140. package/dist/core/tasks/completion.js.map +1 -1
  141. package/dist/core/tasks/contracts.d.ts +6 -1
  142. package/dist/core/tasks/contracts.d.ts.map +1 -1
  143. package/dist/core/tasks/contracts.js.map +1 -1
  144. package/dist/core/tasks/pause.d.ts +2 -1
  145. package/dist/core/tasks/pause.d.ts.map +1 -1
  146. package/dist/core/tasks/pause.js +3 -2
  147. package/dist/core/tasks/pause.js.map +1 -1
  148. package/dist/core/tools/bash-pty-native.d.ts.map +1 -1
  149. package/dist/core/tools/bash-pty-native.js +10 -5
  150. package/dist/core/tools/bash-pty-native.js.map +1 -1
  151. package/dist/core/tools/bash.d.ts.map +1 -1
  152. package/dist/core/tools/bash.js +16 -32
  153. package/dist/core/tools/bash.js.map +1 -1
  154. package/dist/core/tools/kill.d.ts.map +1 -1
  155. package/dist/core/tools/kill.js +17 -3
  156. package/dist/core/tools/kill.js.map +1 -1
  157. package/dist/core/tools/shell-task-render.d.ts +55 -0
  158. package/dist/core/tools/shell-task-render.d.ts.map +1 -0
  159. package/dist/core/tools/shell-task-render.js +123 -0
  160. package/dist/core/tools/shell-task-render.js.map +1 -0
  161. package/dist/core/tools/shell-task-status.d.ts +52 -0
  162. package/dist/core/tools/shell-task-status.d.ts.map +1 -0
  163. package/dist/core/tools/shell-task-status.js +184 -0
  164. package/dist/core/tools/shell-task-status.js.map +1 -0
  165. package/dist/core/tools/structured-output.d.ts +5 -0
  166. package/dist/core/tools/structured-output.d.ts.map +1 -1
  167. package/dist/core/tools/structured-output.js +3 -0
  168. package/dist/core/tools/structured-output.js.map +1 -1
  169. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  170. package/dist/extensions/codemode/execute.js +134 -57
  171. package/dist/extensions/codemode/execute.js.map +1 -1
  172. package/dist/extensions/mcp/config.d.ts.map +1 -1
  173. package/dist/extensions/mcp/config.js +3 -2
  174. package/dist/extensions/mcp/config.js.map +1 -1
  175. package/dist/index-extensions.d.ts +1 -0
  176. package/dist/index-extensions.d.ts.map +1 -1
  177. package/dist/index-extensions.js +3 -0
  178. package/dist/index-extensions.js.map +1 -1
  179. package/dist/index.d.ts +3 -1
  180. package/dist/index.d.ts.map +1 -1
  181. package/dist/index.js +3 -1
  182. package/dist/index.js.map +1 -1
  183. package/dist/main.d.ts.map +1 -1
  184. package/dist/main.js +19 -6
  185. package/dist/main.js.map +1 -1
  186. package/dist/modes/interactive/components/task-row.d.ts.map +1 -1
  187. package/dist/modes/interactive/components/task-row.js +11 -1
  188. package/dist/modes/interactive/components/task-row.js.map +1 -1
  189. package/dist/modes/interactive/interactive-auth-routing.js +12 -10
  190. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  191. package/dist/modes/interactive/interactive-extension-custom-ui.js +20 -30
  192. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  193. package/dist/modes/interactive/interactive-extension-dialogs.js +23 -96
  194. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  195. package/dist/modes/interactive/interactive-extension-runtime.js +7 -8
  196. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  197. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  198. package/dist/modes/interactive/interactive-input-handling.js +27 -4
  199. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  200. package/dist/modes/interactive/interactive-mode-base.d.ts +20 -10
  201. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  202. package/dist/modes/interactive/interactive-mode-base.js +40 -5
  203. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  204. package/dist/modes/interactive/interactive-mode-deps.d.ts +1 -1
  205. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  206. package/dist/modes/interactive/interactive-mode-deps.js +1 -1
  207. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  208. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -4
  209. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  210. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  211. package/dist/modes/interactive/interactive-mode-types.d.ts +4 -1
  212. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  213. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  214. package/dist/modes/interactive/interactive-prompt-restore.d.ts +3 -0
  215. package/dist/modes/interactive/interactive-prompt-restore.d.ts.map +1 -1
  216. package/dist/modes/interactive/interactive-prompt-restore.js +9 -1
  217. package/dist/modes/interactive/interactive-prompt-restore.js.map +1 -1
  218. package/dist/modes/interactive/interactive-prompt-turn.js +30 -2
  219. package/dist/modes/interactive/interactive-prompt-turn.js.map +1 -1
  220. package/dist/modes/interactive/interactive-queueing.js +43 -8
  221. package/dist/modes/interactive/interactive-queueing.js.map +1 -1
  222. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  223. package/dist/modes/interactive/interactive-startup.js +12 -3
  224. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  225. package/dist/modes/interactive/theme/color-utils.d.ts +6 -1
  226. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  227. package/dist/modes/interactive/theme/color-utils.js +39 -17
  228. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  229. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  230. package/dist/modes/interactive/theme/theme-class.js +2 -2
  231. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  232. package/dist/modes/interactive/theme/theme-tokens.d.ts +6 -0
  233. package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -1
  234. package/dist/modes/interactive/theme/theme-tokens.js +7 -3
  235. package/dist/modes/interactive/theme/theme-tokens.js.map +1 -1
  236. package/dist/modes/interactive-engine/isolated-auth.d.ts +3 -0
  237. package/dist/modes/interactive-engine/isolated-auth.d.ts.map +1 -1
  238. package/dist/modes/interactive-engine/isolated-auth.js +13 -1
  239. package/dist/modes/interactive-engine/isolated-auth.js.map +1 -1
  240. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  241. package/dist/modes/interactive-engine/isolated-runtime.js +11 -2
  242. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  243. package/dist/modes/interactive-engine/remote-model-catalog.d.ts +8 -0
  244. package/dist/modes/interactive-engine/remote-model-catalog.d.ts.map +1 -1
  245. package/dist/modes/interactive-engine/remote-model-catalog.js +54 -0
  246. package/dist/modes/interactive-engine/remote-model-catalog.js.map +1 -1
  247. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  248. package/dist/modes/rpc/rpc-command-handler.js +4 -13
  249. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  250. package/dist/modes/rpc/rpc-model-catalog.d.ts +9 -0
  251. package/dist/modes/rpc/rpc-model-catalog.d.ts.map +1 -0
  252. package/dist/modes/rpc/rpc-model-catalog.js +19 -0
  253. package/dist/modes/rpc/rpc-model-catalog.js.map +1 -0
  254. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  255. package/dist/modes/rpc/rpc-provider-auth.js +2 -6
  256. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  257. package/dist/modes/rpc/rpc-types.d.ts +6 -0
  258. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  259. package/dist/modes/rpc/rpc-types.js.map +1 -1
  260. package/dist/utils/changelog.d.ts +6 -0
  261. package/dist/utils/changelog.d.ts.map +1 -1
  262. package/dist/utils/changelog.js +11 -0
  263. package/dist/utils/changelog.js.map +1 -1
  264. package/dist/utils/clipboard.d.ts.map +1 -1
  265. package/dist/utils/clipboard.js +4 -0
  266. package/dist/utils/clipboard.js.map +1 -1
  267. package/dist/utils/tools-manager.d.ts.map +1 -1
  268. package/dist/utils/tools-manager.js +3 -2
  269. package/dist/utils/tools-manager.js.map +1 -1
  270. package/docs/background-tasks.md +5 -3
  271. package/docs/codemode.md +2 -2
  272. package/docs/custom-provider/oauth.md +42 -1
  273. package/docs/custom-provider/registration.md +2 -0
  274. package/docs/environment-variables.md +1 -0
  275. package/docs/extensions/api-reference.md +3 -4
  276. package/docs/extensions/authoring.md +1 -1
  277. package/docs/extensions/events.md +1 -1
  278. package/docs/providers.md +3 -3
  279. package/docs/rpc/protocol.md +4 -2
  280. package/docs/sdk/reference.md +2 -0
  281. package/docs/sdk/structured-decisions.md +7 -5
  282. package/docs/sdk.md +5 -2
  283. package/docs/settings.md +4 -2
  284. package/docs/subagents/reference.md +1 -1
  285. package/docs/subagents.md +15 -1
  286. package/docs/themes/reference.md +3 -1
  287. package/docs/usage.md +3 -1
  288. package/docs/workflows/api-reference.md +28 -0
  289. package/docs/workflows/operations.md +2 -2
  290. package/npm-shrinkwrap.json +32 -32
  291. package/package.json +3 -3
  292. package/dist/core/provider-attribution.d.ts +0 -4
  293. package/dist/core/provider-attribution.d.ts.map +0 -1
  294. package/dist/core/provider-attribution.js +0 -87
  295. package/dist/core/provider-attribution.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"sql-session-store.js","sourceRoot":"","sources":["../../../../src/core/storage/session/sql-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionEntry } from \"../../session-manager-types.ts\";\nimport type { SqliteDatabase, SqliteExecutor, SqliteRow } from \"../database.js\";\nimport { StorageInvalidTextError } from \"../errors.js\";\nimport { renderStorageIdentifiers } from \"../prefix.js\";\nimport { assertStorageSchemaVersion } from \"../schema.js\";\nimport {\n\tSessionConflictError,\n\tSessionExistsError,\n\tSessionIdMismatchError,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n\tStoreClosedError,\n} from \"./errors.js\";\nimport {\n\tapplySessionSummaryEntries,\n\tmaterializeSessionSummaryMetadata,\n\ttype SessionSummaryState,\n\ttype SessionSummaryText,\n} from \"./session-summary.js\";\nimport type {\n\tSessionCwdMatcher,\n\tSessionListQuery,\n\tSessionRecordHeader,\n\tSessionSnapshot,\n\tSessionStore,\n\tSessionSummary,\n\tSessionWriteOptions,\n\tStorageDescriptor,\n} from \"./types.js\";\nimport { validateSessionEntries, validateSessionHeader, validateSessionText } from \"./validation.js\";\n\nexport const SESSION_SCHEMA_VERSION = 1;\nexport const SESSION_TABLES = Object.freeze({\n\tmeta: \"meta\",\n\tsessions: \"sessions\",\n\tentries: \"entries\",\n\tsearchTexts: \"search_texts\",\n});\n\ntype Tables = Readonly<Record<keyof typeof SESSION_TABLES, string>>;\ntype HeaderRow = SqliteRow & { header_json: string; last_seq: number };\ntype SummaryStateRow = HeaderRow & { summary_state: string };\ntype SummaryRow = HeaderRow & {\n\tmodified_at: string;\n\tmessage_count: number;\n\tfirst_message: string;\n\tname: string | null;\n\thas_name: number;\n\tsummary: string | null;\n\tsummarized_through_id: string | null;\n\tsearch_texts_json: string;\n};\n\nexport class SqlSessionStore implements SessionStore {\n\tprivate readonly database: SqliteDatabase;\n\tprivate readonly tables: Tables;\n\tprivate readonly prefix: string;\n\tprivate closed = false;\n\tprivate readonly cwdMatcher?: SessionCwdMatcher;\n\n\tprivate constructor(database: SqliteDatabase, tables: Tables, prefix = \"\", cwdMatcher?: SessionCwdMatcher) {\n\t\tthis.database = database;\n\t\tthis.tables = tables;\n\t\tthis.prefix = prefix;\n\t\tthis.cwdMatcher = cwdMatcher;\n\t}\n\n\tstatic async open(\n\t\tdatabase: SqliteDatabase,\n\t\toptions: { readonly prefix?: string; readonly cwdMatcher?: SessionCwdMatcher } = {},\n\t): Promise<SqlSessionStore> {\n\t\tconst tables = renderStorageIdentifiers(\"sessions\", SESSION_TABLES, options.prefix);\n\t\tawait database.transaction(async (tx) => {\n\t\t\tawait tx.exec(`CREATE TABLE IF NOT EXISTS ${tables.meta} (schema_version INTEGER NOT NULL) STRICT`);\n\t\t\tconst versions = await tx.all(`SELECT schema_version FROM ${tables.meta}`);\n\t\t\tif (versions.length === 0) {\n\t\t\t\tawait tx.run(`INSERT INTO ${tables.meta} VALUES (?)`, SESSION_SCHEMA_VERSION);\n\t\t\t}\n\t\t\tfor (const version of versions) {\n\t\t\t\tassertStorageSchemaVersion(\"sessions\", version.schema_version!, SESSION_SCHEMA_VERSION);\n\t\t\t}\n\t\t\tawait tx.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.sessions} (\n\t\t\t\t\tid TEXT PRIMARY KEY, cwd TEXT NOT NULL, created_at TEXT NOT NULL,\n\t\t\t\t\theader_json TEXT NOT NULL CHECK(json_valid(header_json)), internal INTEGER NOT NULL,\n\t\t\t\t\tlast_seq INTEGER NOT NULL, modified_at TEXT NOT NULL, message_count INTEGER NOT NULL,\n\t\t\t\t\tfirst_message TEXT NOT NULL CHECK(json_valid(first_message)),\n\t\t\t\t\tname TEXT CHECK(name IS NULL OR json_valid(name)), has_name INTEGER NOT NULL,\n\t\t\t\t\tsummary TEXT CHECK(summary IS NULL OR json_valid(summary)), summarized_through_id TEXT,\n\t\t\t\t\tsummary_state TEXT NOT NULL CHECK(json_valid(summary_state))\n\t\t\t\t) STRICT;\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.entries} (\n\t\t\t\t\tsession_id TEXT NOT NULL, seq INTEGER NOT NULL, entry_id TEXT NOT NULL,\n\t\t\t\t\tentry_json TEXT NOT NULL CHECK(json_valid(entry_json)), PRIMARY KEY(session_id, seq)\n\t\t\t\t) STRICT;\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.searchTexts} (\n\t\t\t\t\tsession_id TEXT NOT NULL, seq INTEGER NOT NULL,\n\t\t\t\t\ttext_json TEXT NOT NULL CHECK(json_valid(text_json)), PRIMARY KEY(session_id, seq)\n\t\t\t\t) STRICT;\n\t\t\t`);\n\t\t});\n\t\treturn new SqlSessionStore(database, tables, options.prefix, options.cwdMatcher);\n\t}\n\n\tget descriptor(): StorageDescriptor {\n\t\treturn { ...this.database.descriptor, ...(this.prefix === \"\" ? {} : { prefix: this.prefix }) };\n\t}\n\n\tasync create(header: SessionRecordHeader, entries: readonly SessionEntry[]): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionHeader(header);\n\t\tvalidateSessionEntries(entries);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tif (await tx.get(`SELECT id FROM ${this.tables.sessions} WHERE id = ?`, header.id)) {\n\t\t\t\tthrow new SessionExistsError(header.id);\n\t\t\t}\n\t\t\tconst texts = await this.saveSummary(tx, header.id, { header, entries, lastSeq: entries.length });\n\t\t\tawait this.insertEntries(tx, header.id, entries, 0, texts);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tasync append(\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tconst previous = await this.forWrite(tx, sessionId, options, true);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tconst lastSeq = previous.last_seq + entries.length;\n\t\t\tconst texts = await this.saveSummary(\n\t\t\t\ttx,\n\t\t\t\tsessionId,\n\t\t\t\t{ header: JSON.parse(previous.header_json) as SessionRecordHeader, entries, lastSeq },\n\t\t\t\tJSON.parse(previous.summary_state) as SessionSummaryState,\n\t\t\t);\n\t\t\tawait this.insertEntries(tx, sessionId, entries, previous.last_seq, texts);\n\t\t\treturn { lastSeq };\n\t\t});\n\t}\n\n\tasync replace(\n\t\tsessionId: string,\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tawait this.forWrite(tx, sessionId, options);\n\t\t\tvalidateSessionHeader(header);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tif (header.id !== sessionId) throw new SessionIdMismatchError(sessionId, header.id);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.searchTexts} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.entries} WHERE session_id = ?`, sessionId);\n\t\t\tconst texts = await this.saveSummary(tx, sessionId, { header, entries, lastSeq: entries.length });\n\t\t\tawait this.insertEntries(tx, sessionId, entries, 0, texts);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tasync load(sessionId: string): Promise<SessionSnapshot> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction((tx) => this.read(tx, sessionId));\n\t}\n\n\tasync readHeader(sessionId: string): Promise<SessionRecordHeader | undefined> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tconst row = await this.database.get<HeaderRow>(\n\t\t\t`SELECT header_json FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\treturn row ? (JSON.parse(row.header_json) as SessionRecordHeader) : undefined;\n\t}\n\n\tasync delete(sessionId: string): Promise<void> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tawait this.database.transaction(async (tx) => {\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.searchTexts} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.entries} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.sessions} WHERE id = ?`, sessionId);\n\t\t});\n\t}\n\n\tasync *list(query: SessionListQuery): AsyncIterable<SessionSummary> {\n\t\tthis.assertListing(query);\n\t\t// Validate the original query before binding only matching stored spellings below.\n\t\tif (query.cwd?.includes(\"\\0\")) throw new StorageInvalidTextError(0);\n\t\tconst matchesCwd =\n\t\t\tquery.cwd === undefined\n\t\t\t\t? undefined\n\t\t\t\t: (this.cwdMatcher?.(query.cwd) ?? ((candidate: string | undefined) => candidate === query.cwd));\n\t\tlet projectCwds: string[] | undefined;\n\t\tif (matchesCwd) {\n\t\t\tconst projects = await this.database.all<SqliteRow & { cwd: string }>(\n\t\t\t\t`SELECT DISTINCT cwd FROM ${this.tables.sessions}`,\n\t\t\t);\n\t\t\tprojectCwds = projects.map((project) => project.cwd).filter(matchesCwd);\n\t\t\tthis.assertListing(query);\n\t\t\tif (projectCwds.length === 0) return;\n\t\t}\n\t\tconst projectFilter = projectCwds ? ` AND cwd IN (${projectCwds.map(() => \"?\").join(\", \")})` : \"\";\n\t\t// Combine encoded strings only at read time, preserving NUL and lone surrogates verbatim.\n\t\tconst rows = await this.database.all<SummaryRow>(\n\t\t\t`SELECT s.*, (\n\t\t\t\tSELECT COALESCE('[' || group_concat(text_json, ',') || ']', '[]')\n\t\t\t\tFROM (SELECT text_json FROM ${this.tables.searchTexts} WHERE session_id = s.id ORDER BY seq)\n\t\t\t) AS search_texts_json\n\t\t\tFROM ${this.tables.sessions} AS s WHERE (? = 1 OR internal = 0)${projectFilter}`,\n\t\t\tquery.includeInternal ? 1 : 0,\n\t\t\t...(projectCwds ?? []),\n\t\t);\n\t\tfor (const row of rows) {\n\t\t\tthis.assertListing(query);\n\t\t\tconst header = JSON.parse(row.header_json) as SessionRecordHeader;\n\t\t\tif (matchesCwd && !matchesCwd(header.cwd)) continue;\n\t\t\tyield {\n\t\t\t\tid: header.id,\n\t\t\t\tcwd: header.cwd,\n\t\t\t\t...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n\t\t\t\tinternal: header.internal === true,\n\t\t\t\t...(header.workflow !== undefined ? { workflow: header.workflow } : {}),\n\t\t\t\t...(row.name !== null ? { name: JSON.parse(row.name) as string } : {}),\n\t\t\t\thasName: row.has_name === 1,\n\t\t\t\tcreatedAt: header.createdAt,\n\t\t\t\tmodifiedAt: row.modified_at,\n\t\t\t\tmessageCount: row.message_count,\n\t\t\t\tfirstMessage: JSON.parse(row.first_message) as string,\n\t\t\t\t...(row.summary !== null ? { summary: JSON.parse(row.summary) as string } : {}),\n\t\t\t\t...(row.summarized_through_id !== null ? { summarizedThroughId: row.summarized_through_id } : {}),\n\t\t\t\tsearchText: (JSON.parse(row.search_texts_json) as string[]).join(\" \"),\n\t\t\t};\n\t\t}\n\t\tthis.assertListing(query);\n\t}\n\n\tasync findMostRecent(query: {\n\t\treadonly cwd: string;\n\t\treadonly includeInternal?: boolean;\n\t}): Promise<SessionSummary | undefined> {\n\t\tlet latest: SessionSummary | undefined;\n\t\tfor await (const summary of this.list(query)) {\n\t\t\tif (!latest || Date.parse(summary.modifiedAt) > Date.parse(latest.modifiedAt)) latest = summary;\n\t\t}\n\t\treturn latest;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.assertOpen();\n\t\tthis.closed = true;\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.closed) throw new StoreClosedError(this.descriptor);\n\t}\n\n\tprivate assertListing(query: SessionListQuery): void {\n\t\tthis.assertOpen();\n\t\tif (query.signal?.aborted) throw new DOMException(\"Session listing aborted\", \"AbortError\");\n\t}\n\n\tprivate async read(tx: SqliteExecutor, sessionId: string): Promise<SessionSnapshot> {\n\t\tconst row = await tx.get<HeaderRow>(\n\t\t\t`SELECT header_json, last_seq FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\tif (!row) throw new SessionNotFoundError(sessionId);\n\t\tconst entries = await tx.all<SqliteRow & { entry_json: string }>(\n\t\t\t`SELECT entry_json FROM ${this.tables.entries} WHERE session_id = ? ORDER BY seq`,\n\t\t\tsessionId,\n\t\t);\n\t\treturn {\n\t\t\theader: JSON.parse(row.header_json) as SessionRecordHeader,\n\t\t\tentries: entries.map((entry) => JSON.parse(entry.entry_json) as SessionEntry),\n\t\t\tlastSeq: row.last_seq,\n\t\t};\n\t}\n\n\tprivate forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState: true,\n\t): Promise<SummaryStateRow>;\n\tprivate forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState?: false,\n\t): Promise<HeaderRow>;\n\tprivate async forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState = false,\n\t): Promise<HeaderRow> {\n\t\tconst row = await tx.get<HeaderRow>(\n\t\t\t`SELECT header_json, last_seq${includeSummaryState ? \", summary_state\" : \"\"}\n\t\t\t FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\tif (!row) throw new SessionNotFoundError(sessionId);\n\t\tif (row.last_seq !== options.expectSeq) {\n\t\t\tthrow new SessionConflictError(sessionId, options.expectSeq, row.last_seq);\n\t\t}\n\t\treturn row;\n\t}\n\n\tprivate async saveSummary(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\tsnapshot: SessionSnapshot,\n\t\tprevious?: SessionSummaryState,\n\t): Promise<readonly SessionSummaryText[]> {\n\t\tconst { header, lastSeq } = snapshot;\n\t\tconst { state, texts } = applySessionSummaryEntries(previous, snapshot.entries);\n\t\tconst summary = materializeSessionSummaryMetadata(header, state);\n\t\tawait tx.run(\n\t\t\t`INSERT INTO ${this.tables.sessions}\n\t\t\t\t(id, cwd, created_at, header_json, internal, last_seq, modified_at, message_count,\n\t\t\t\t first_message, name, has_name, summary, summarized_through_id, summary_state)\n\t\t\t\tVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n\t\t\t\tON CONFLICT(id) DO UPDATE SET\n\t\t\t\tcwd = excluded.cwd, created_at = excluded.created_at, header_json = excluded.header_json,\n\t\t\t\tinternal = excluded.internal, last_seq = excluded.last_seq, modified_at = excluded.modified_at,\n\t\t\t\tmessage_count = excluded.message_count, first_message = excluded.first_message, name = excluded.name,\n\t\t\t\thas_name = excluded.has_name, summary = excluded.summary,\n\t\t\t\tsummarized_through_id = excluded.summarized_through_id,\n\t\t\t\tsummary_state = excluded.summary_state`,\n\t\t\tsessionId,\n\t\t\theader.cwd,\n\t\t\theader.createdAt,\n\t\t\tthis.encode(header),\n\t\t\theader.internal ? 1 : 0,\n\t\t\tlastSeq,\n\t\t\tsummary.modifiedAt,\n\t\t\tsummary.messageCount,\n\t\t\tthis.encode(summary.firstMessage),\n\t\t\tsummary.name === undefined ? null : this.encode(summary.name),\n\t\t\tsummary.hasName ? 1 : 0,\n\t\t\tsummary.summary === undefined ? null : this.encode(summary.summary),\n\t\t\tsummary.summarizedThroughId ?? null,\n\t\t\tthis.encode(state),\n\t\t);\n\t\treturn texts;\n\t}\n\n\tprivate async insertEntries(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\tlastSeq: number,\n\t\ttexts: readonly SessionSummaryText[],\n\t): Promise<void> {\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tawait tx.run(\n\t\t\t\t`INSERT INTO ${this.tables.entries} (session_id, seq, entry_id, entry_json) VALUES (?, ?, ?, ?)`,\n\t\t\t\tsessionId,\n\t\t\t\tlastSeq + index + 1,\n\t\t\t\tentry.id,\n\t\t\t\tthis.encode(entry),\n\t\t\t);\n\t\t}\n\t\tfor (const { index, text } of texts) {\n\t\t\tawait tx.run(\n\t\t\t\t`INSERT INTO ${this.tables.searchTexts} (session_id, seq, text_json) VALUES (?, ?, ?)`,\n\t\t\t\tsessionId,\n\t\t\t\tlastSeq + index + 1,\n\t\t\t\tthis.encode(text),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate encode(value: SessionRecordHeader | SessionEntry | SessionSummaryState | string): string {\n\t\ttry {\n\t\t\treturn JSON.stringify(value);\n\t\t} catch (cause) {\n\t\t\tthrow new StorageUnavailableError(this.descriptor, cause as Error);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"sql-session-store.js","sourceRoot":"","sources":["../../../../src/core/storage/session/sql-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionEntry } from \"../../session-manager-types.ts\";\nimport type { SqliteDatabase, SqliteExecutor, SqliteRow, SqliteValue } from \"../database.js\";\nimport { StorageInvalidTextError } from \"../errors.js\";\nimport { renderStorageIdentifiers } from \"../prefix.js\";\nimport { assertStorageSchemaVersion } from \"../schema.js\";\nimport {\n\tSessionConflictError,\n\tSessionExistsError,\n\tSessionIdMismatchError,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n\tStoreClosedError,\n} from \"./errors.js\";\nimport {\n\tapplySessionSummaryEntries,\n\tmaterializeSessionSummaryMetadata,\n\ttype SessionSummaryState,\n\ttype SessionSummaryText,\n} from \"./session-summary.js\";\nimport type {\n\tSessionCwdMatcher,\n\tSessionListQuery,\n\tSessionRecordHeader,\n\tSessionSnapshot,\n\tSessionStore,\n\tSessionSummary,\n\tSessionWriteOptions,\n\tStorageDescriptor,\n} from \"./types.js\";\nimport { validateSessionEntries, validateSessionHeader, validateSessionText } from \"./validation.js\";\n\nexport const SESSION_SCHEMA_VERSION = 1;\nexport const SESSION_TABLES = Object.freeze({\n\tmeta: \"meta\",\n\tsessions: \"sessions\",\n\tentries: \"entries\",\n\tsearchTexts: \"search_texts\",\n});\n\ntype Tables = Readonly<Record<keyof typeof SESSION_TABLES, string>>;\ntype HeaderRow = SqliteRow & { header_json: string; last_seq: number };\ntype SummaryStateRow = HeaderRow & { summary_state: string };\ntype ListingRow = HeaderRow & {\n\tid: string;\n\tcwd: string;\n\tinternal: number;\n\tmodified_at: string;\n\tmessage_count: number;\n\tfirst_message: string;\n\tname: string | null;\n\thas_name: number;\n\tsummary: string | null;\n\tsummarized_through_id: string | null;\n\trevision: string;\n};\ntype SummaryRow = ListingRow & { search_texts_json: string };\n\n/** Every listing column except search text, so an unchanged row keeps its cached summary. */\nconst LISTING_COLUMNS =\n\t\"id, cwd, internal, header_json, last_seq, modified_at, message_count, first_message, name, has_name, summary, summarized_through_id, revision\";\n/** Rows whose search text is read per query; well under SQLite's bound-parameter limit. */\nexport const LISTING_FETCH_BATCH = 500;\n/** Listing scopes (visibility and project) kept at once; the picker uses two. */\nconst LISTING_SCOPES = 8;\n\nfunction summaryFromRow(row: SummaryRow): SessionSummary {\n\tconst header = JSON.parse(row.header_json) as SessionRecordHeader;\n\treturn {\n\t\tid: header.id,\n\t\tcwd: header.cwd,\n\t\t...(header.parentSessionId !== undefined ? { parentSessionId: header.parentSessionId } : {}),\n\t\tinternal: header.internal === true,\n\t\t...(header.workflow !== undefined ? { workflow: header.workflow } : {}),\n\t\t...(row.name !== null ? { name: JSON.parse(row.name) as string } : {}),\n\t\thasName: row.has_name === 1,\n\t\tcreatedAt: header.createdAt,\n\t\tmodifiedAt: row.modified_at,\n\t\tmessageCount: row.message_count,\n\t\tfirstMessage: JSON.parse(row.first_message) as string,\n\t\t...(row.summary !== null ? { summary: JSON.parse(row.summary) as string } : {}),\n\t\t...(row.summarized_through_id !== null ? { summarizedThroughId: row.summarized_through_id } : {}),\n\t\tsearchText: (JSON.parse(row.search_texts_json) as string[]).join(\" \"),\n\t};\n}\n\n/** Changes on every write: `revision` catches a rewrite that leaves every other listed column as it was. */\nfunction listingVersion(row: ListingRow): string {\n\treturn `${row.revision}\\u0000${row.last_seq}\\u0000${row.modified_at}\\u0000${row.message_count}\\u0000${row.has_name}\\u0000${row.name}\\u0000${row.summarized_through_id}\\u0000${row.summary}\\u0000${row.first_message}\\u0000${row.header_json}`;\n}\n\nexport class SqlSessionStore implements SessionStore {\n\tprivate readonly database: SqliteDatabase;\n\tprivate readonly tables: Tables;\n\tprivate readonly prefix: string;\n\tprivate closed = false;\n\tprivate readonly cwdMatcher?: SessionCwdMatcher;\n\t/** Session ids of each recently listed scope, valid while the store's change token is unchanged. */\n\tprivate readonly scopes = new Map<string, { readonly token: string; readonly ids: readonly string[] }>();\n\t/** Listed summaries of sessions that still exist at the cached version; never more than the store holds. */\n\tprivate readonly summaries = new Map<string, { readonly version: string; readonly summary: SessionSummary }>();\n\t/**\n\t * Settles when the latest listing has read and updated the caches. Listings take turns, so one listing's\n\t * pruning never drops summaries that another has fetched but not yet recorded under its scope.\n\t */\n\tprivate listing: Promise<void> = Promise.resolve();\n\n\tprivate constructor(database: SqliteDatabase, tables: Tables, prefix = \"\", cwdMatcher?: SessionCwdMatcher) {\n\t\tthis.database = database;\n\t\tthis.tables = tables;\n\t\tthis.prefix = prefix;\n\t\tthis.cwdMatcher = cwdMatcher;\n\t}\n\n\tstatic async open(\n\t\tdatabase: SqliteDatabase,\n\t\toptions: { readonly prefix?: string; readonly cwdMatcher?: SessionCwdMatcher } = {},\n\t): Promise<SqlSessionStore> {\n\t\tconst tables = renderStorageIdentifiers(\"sessions\", SESSION_TABLES, options.prefix);\n\t\tawait database.transaction(async (tx) => {\n\t\t\tawait tx.exec(`CREATE TABLE IF NOT EXISTS ${tables.meta} (schema_version INTEGER NOT NULL) STRICT`);\n\t\t\tconst versions = await tx.all(`SELECT schema_version FROM ${tables.meta}`);\n\t\t\tif (versions.length === 0) {\n\t\t\t\tawait tx.run(`INSERT INTO ${tables.meta} VALUES (?)`, SESSION_SCHEMA_VERSION);\n\t\t\t}\n\t\t\tfor (const version of versions) {\n\t\t\t\tassertStorageSchemaVersion(\"sessions\", version.schema_version!, SESSION_SCHEMA_VERSION);\n\t\t\t}\n\t\t\tawait tx.exec(`\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.sessions} (\n\t\t\t\t\tid TEXT PRIMARY KEY, cwd TEXT NOT NULL, created_at TEXT NOT NULL,\n\t\t\t\t\theader_json TEXT NOT NULL CHECK(json_valid(header_json)), internal INTEGER NOT NULL,\n\t\t\t\t\tlast_seq INTEGER NOT NULL, modified_at TEXT NOT NULL, message_count INTEGER NOT NULL,\n\t\t\t\t\tfirst_message TEXT NOT NULL CHECK(json_valid(first_message)),\n\t\t\t\t\tname TEXT CHECK(name IS NULL OR json_valid(name)), has_name INTEGER NOT NULL,\n\t\t\t\t\tsummary TEXT CHECK(summary IS NULL OR json_valid(summary)), summarized_through_id TEXT,\n\t\t\t\t\tsummary_state TEXT NOT NULL CHECK(json_valid(summary_state)), revision TEXT NOT NULL DEFAULT ''\n\t\t\t\t) STRICT;\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.entries} (\n\t\t\t\t\tsession_id TEXT NOT NULL, seq INTEGER NOT NULL, entry_id TEXT NOT NULL,\n\t\t\t\t\tentry_json TEXT NOT NULL CHECK(json_valid(entry_json)), PRIMARY KEY(session_id, seq)\n\t\t\t\t) STRICT;\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${tables.searchTexts} (\n\t\t\t\t\tsession_id TEXT NOT NULL, seq INTEGER NOT NULL,\n\t\t\t\t\ttext_json TEXT NOT NULL CHECK(json_valid(text_json)), PRIMARY KEY(session_id, seq)\n\t\t\t\t) STRICT;\n\t\t\t`);\n\t\t\t// Sessions tables created before the write revision gain it; their rows pick one up on the next write.\n\t\t\tconst revision = await tx.get(\n\t\t\t\t\"SELECT name FROM pragma_table_info(?) WHERE name = 'revision'\",\n\t\t\t\ttables.sessions,\n\t\t\t);\n\t\t\tif (!revision) {\n\t\t\t\tawait tx.exec(`ALTER TABLE ${tables.sessions} ADD COLUMN revision TEXT NOT NULL DEFAULT ''`);\n\t\t\t}\n\t\t});\n\t\treturn new SqlSessionStore(database, tables, options.prefix, options.cwdMatcher);\n\t}\n\n\tget descriptor(): StorageDescriptor {\n\t\treturn { ...this.database.descriptor, ...(this.prefix === \"\" ? {} : { prefix: this.prefix }) };\n\t}\n\n\tasync create(header: SessionRecordHeader, entries: readonly SessionEntry[]): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionHeader(header);\n\t\tvalidateSessionEntries(entries);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tif (await tx.get(`SELECT id FROM ${this.tables.sessions} WHERE id = ?`, header.id)) {\n\t\t\t\tthrow new SessionExistsError(header.id);\n\t\t\t}\n\t\t\tconst texts = await this.saveSummary(tx, header.id, { header, entries, lastSeq: entries.length });\n\t\t\tawait this.insertEntries(tx, header.id, entries, 0, texts);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tasync append(\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tconst previous = await this.forWrite(tx, sessionId, options, true);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tconst lastSeq = previous.last_seq + entries.length;\n\t\t\tconst texts = await this.saveSummary(\n\t\t\t\ttx,\n\t\t\t\tsessionId,\n\t\t\t\t{ header: JSON.parse(previous.header_json) as SessionRecordHeader, entries, lastSeq },\n\t\t\t\tJSON.parse(previous.summary_state) as SessionSummaryState,\n\t\t\t);\n\t\t\tawait this.insertEntries(tx, sessionId, entries, previous.last_seq, texts);\n\t\t\treturn { lastSeq };\n\t\t});\n\t}\n\n\tasync replace(\n\t\tsessionId: string,\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction(async (tx) => {\n\t\t\tawait this.forWrite(tx, sessionId, options);\n\t\t\tvalidateSessionHeader(header);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tif (header.id !== sessionId) throw new SessionIdMismatchError(sessionId, header.id);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.searchTexts} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.entries} WHERE session_id = ?`, sessionId);\n\t\t\tconst texts = await this.saveSummary(tx, sessionId, { header, entries, lastSeq: entries.length });\n\t\t\tawait this.insertEntries(tx, sessionId, entries, 0, texts);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tasync load(sessionId: string): Promise<SessionSnapshot> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\treturn this.database.transaction((tx) => this.read(tx, sessionId));\n\t}\n\n\tasync readHeader(sessionId: string): Promise<SessionRecordHeader | undefined> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tconst row = await this.database.get<HeaderRow>(\n\t\t\t`SELECT header_json FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\treturn row ? (JSON.parse(row.header_json) as SessionRecordHeader) : undefined;\n\t}\n\n\tasync delete(sessionId: string): Promise<void> {\n\t\tthis.assertOpen();\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tawait this.database.transaction(async (tx) => {\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.searchTexts} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.entries} WHERE session_id = ?`, sessionId);\n\t\t\tawait tx.run(`DELETE FROM ${this.tables.sessions} WHERE id = ?`, sessionId);\n\t\t});\n\t}\n\n\t/**\n\t * Lists from a per-scope cache revalidated on every call. A cheap change token, which moves on any commit\n\t * from this or another connection, decides whether the scope is re-read. A scope listed for the first time\n\t * is read exactly as an uncached listing; afterwards only its light columns are re-read and search text is\n\t * read only for sessions whose stored listing columns changed. Listings of the same store take turns\n\t * reading and updating the caches; the yielding below runs outside that turn.\n\t */\n\tasync *list(query: SessionListQuery): AsyncIterable<SessionSummary> {\n\t\tthis.assertListing(query);\n\t\t// Validate the original query before binding only matching stored spellings below.\n\t\tif (query.cwd?.includes(\"\\0\")) throw new StorageInvalidTextError(0);\n\t\tconst listed = this.listing.then(() => this.listScope(query));\n\t\tthis.listing = listed.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\t// Resolve before yielding so a concurrent listing cannot change what this one returns.\n\t\tconst summaries = await listed;\n\t\tfor (const summary of summaries) {\n\t\t\tthis.assertListing(query);\n\t\t\tyield summary;\n\t\t}\n\t\tthis.assertListing(query);\n\t}\n\n\t/** Revalidates one scope's cache and resolves its summaries; called for one listing at a time. */\n\tprivate async listScope(query: SessionListQuery): Promise<readonly SessionSummary[]> {\n\t\t// The store may have closed, or the caller given up, while an earlier listing held the turn.\n\t\tthis.assertListing(query);\n\t\t// Read the token first: a commit racing the reads below moves it again before the next call.\n\t\tconst token = await this.changeToken();\n\t\tconst key = JSON.stringify([query.includeInternal === true, query.cwd ?? null]);\n\t\tconst cached = this.scopes.get(key);\n\t\t// A cached id without a summary is never expected; re-reading the scope repairs it instead of dropping it.\n\t\tconst scope =\n\t\t\tcached?.token === token && cached.ids.every((id) => this.summaries.has(id))\n\t\t\t\t? cached\n\t\t\t\t: { token, ids: await this.readScope(query, cached !== undefined) };\n\t\t// Map order is recency order: re-inserting marks the scope as used, and the oldest scope is evicted first.\n\t\tthis.scopes.delete(key);\n\t\tthis.scopes.set(key, scope);\n\t\tfor (const oldest of this.scopes.keys()) {\n\t\t\tif (this.scopes.size <= LISTING_SCOPES) break;\n\t\t\tthis.scopes.delete(oldest);\n\t\t}\n\t\tif (scope !== cached) this.pruneSummaries();\n\t\treturn scope.ids.flatMap((id) => this.summaries.get(id)?.summary ?? []);\n\t}\n\n\tasync findMostRecent(query: {\n\t\treadonly cwd: string;\n\t\treadonly includeInternal?: boolean;\n\t}): Promise<SessionSummary | undefined> {\n\t\tlet latest: SessionSummary | undefined;\n\t\tfor await (const summary of this.list(query)) {\n\t\t\tif (!latest || Date.parse(summary.modifiedAt) > Date.parse(latest.modifiedAt)) latest = summary;\n\t\t}\n\t\treturn latest;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.assertOpen();\n\t\tthis.closed = true;\n\t\tthis.scopes.clear();\n\t\tthis.summaries.clear();\n\t}\n\n\t/**\n\t * `data_version` moves when another connection commits and `total_changes()` when this one writes, so\n\t * together they cover writers in every process; the table aggregates also catch a change to the sessions\n\t * table if the adapter does not serve every statement from one connection.\n\t */\n\tprivate async changeToken(): Promise<string> {\n\t\tconst row = await this.database.get<SqliteRow>(\n\t\t\t`SELECT data_version, total_changes() AS changes,\n\t\t\t\t(SELECT count(*) FROM ${this.tables.sessions}) AS sessions,\n\t\t\t\t(SELECT max(rowid) FROM ${this.tables.sessions}) AS last_row\n\t\t\tFROM pragma_data_version`,\n\t\t);\n\t\treturn JSON.stringify(Object.values(row ?? {}).map(String));\n\t}\n\n\t/** The scope's session ids in store order, with a current summary cached for each. */\n\tprivate async readScope(query: SessionListQuery, listedBefore: boolean): Promise<readonly string[]> {\n\t\tconst matchesCwd =\n\t\t\tquery.cwd === undefined\n\t\t\t\t? undefined\n\t\t\t\t: (this.cwdMatcher?.(query.cwd) ?? ((candidate: string | undefined) => candidate === query.cwd));\n\t\tlet projectCwds: string[] | undefined;\n\t\tif (matchesCwd) {\n\t\t\tconst projects = await this.database.all<SqliteRow & { cwd: string }>(\n\t\t\t\t`SELECT DISTINCT cwd FROM ${this.tables.sessions}`,\n\t\t\t);\n\t\t\tprojectCwds = projects.map((project) => project.cwd).filter(matchesCwd);\n\t\t\tthis.assertListing(query);\n\t\t\tif (projectCwds.length === 0) return [];\n\t\t}\n\t\tconst scope = `(? = 1 OR internal = 0)${projectCwds ? ` AND cwd IN (${projectCwds.map(() => \"?\").join(\", \")})` : \"\"}`;\n\t\tconst params = [query.includeInternal ? 1 : 0, ...(projectCwds ?? [])];\n\t\tconst inScope = (row: ListingRow) => !matchesCwd || matchesCwd(row.cwd);\n\t\tif (listedBefore) {\n\t\t\tconst rows = (\n\t\t\t\tawait this.database.all<ListingRow>(\n\t\t\t\t\t`SELECT ${LISTING_COLUMNS} FROM ${this.tables.sessions} WHERE ${scope}`,\n\t\t\t\t\t...params,\n\t\t\t\t)\n\t\t\t).filter(inScope);\n\t\t\tthis.assertListing(query);\n\t\t\tconst stale = rows.filter((row) => this.summaries.get(row.id)?.version !== listingVersion(row));\n\t\t\t// A few changed sessions are read by id; when most changed, one scan of the scope is cheaper.\n\t\t\tif (stale.length <= rows.length / 4) {\n\t\t\t\tfor (let start = 0; start < stale.length; start += LISTING_FETCH_BATCH) {\n\t\t\t\t\tconst ids = stale.slice(start, start + LISTING_FETCH_BATCH).map((row) => row.id);\n\t\t\t\t\tconst fetched = new Set(\n\t\t\t\t\t\t(await this.readSummaries(`id IN (${ids.map(() => \"?\").join(\", \")})`, ids)).map((row) => row.id),\n\t\t\t\t\t);\n\t\t\t\t\t// A session deleted after the light read must not be listed from an older cached copy.\n\t\t\t\t\tfor (const id of ids) if (!fetched.has(id)) this.summaries.delete(id);\n\t\t\t\t\tthis.assertListing(query);\n\t\t\t\t}\n\t\t\t\treturn rows.flatMap((row) => (this.summaries.has(row.id) ? [row.id] : []));\n\t\t\t}\n\t\t}\n\t\tconst rows = (await this.readSummaries(scope, params)).filter(inScope);\n\t\tthis.assertListing(query);\n\t\treturn rows.map((row) => row.id);\n\t}\n\n\t/** Reads full listing rows, search text included, and caches their summaries. */\n\tprivate async readSummaries(where: string, params: readonly SqliteValue[]): Promise<readonly SummaryRow[]> {\n\t\t// Combine encoded strings only at read time, preserving NUL and lone surrogates verbatim.\n\t\tconst rows = await this.database.all<SummaryRow>(\n\t\t\t`SELECT ${LISTING_COLUMNS}, (\n\t\t\t\tSELECT COALESCE('[' || group_concat(text_json, ',') || ']', '[]')\n\t\t\t\tFROM (SELECT text_json FROM ${this.tables.searchTexts} WHERE session_id = s.id ORDER BY seq)\n\t\t\t) AS search_texts_json\n\t\t\tFROM ${this.tables.sessions} AS s WHERE ${where}`,\n\t\t\t...params,\n\t\t);\n\t\tfor (const row of rows)\n\t\t\tthis.summaries.set(row.id, { version: listingVersion(row), summary: summaryFromRow(row) });\n\t\treturn rows;\n\t}\n\n\t/**\n\t * Keeps only summaries some cached scope still lists, so memory follows the live sessions. Runs in a\n\t * listing's turn after it records its scope, when no other listing holds summaries it has not recorded.\n\t */\n\tprivate pruneSummaries(): void {\n\t\tconst listed = new Set([...this.scopes.values()].flatMap((scope) => scope.ids));\n\t\tfor (const id of this.summaries.keys()) if (!listed.has(id)) this.summaries.delete(id);\n\t}\n\n\tprivate assertOpen(): void {\n\t\tif (this.closed) throw new StoreClosedError(this.descriptor);\n\t}\n\n\tprivate assertListing(query: SessionListQuery): void {\n\t\tthis.assertOpen();\n\t\tif (query.signal?.aborted) throw new DOMException(\"Session listing aborted\", \"AbortError\");\n\t}\n\n\tprivate async read(tx: SqliteExecutor, sessionId: string): Promise<SessionSnapshot> {\n\t\tconst row = await tx.get<HeaderRow>(\n\t\t\t`SELECT header_json, last_seq FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\tif (!row) throw new SessionNotFoundError(sessionId);\n\t\tconst entries = await tx.all<SqliteRow & { entry_json: string }>(\n\t\t\t`SELECT entry_json FROM ${this.tables.entries} WHERE session_id = ? ORDER BY seq`,\n\t\t\tsessionId,\n\t\t);\n\t\treturn {\n\t\t\theader: JSON.parse(row.header_json) as SessionRecordHeader,\n\t\t\tentries: entries.map((entry) => JSON.parse(entry.entry_json) as SessionEntry),\n\t\t\tlastSeq: row.last_seq,\n\t\t};\n\t}\n\n\tprivate forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState: true,\n\t): Promise<SummaryStateRow>;\n\tprivate forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState?: false,\n\t): Promise<HeaderRow>;\n\tprivate async forWrite(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t\tincludeSummaryState = false,\n\t): Promise<HeaderRow> {\n\t\tconst row = await tx.get<HeaderRow>(\n\t\t\t`SELECT header_json, last_seq${includeSummaryState ? \", summary_state\" : \"\"}\n\t\t\t FROM ${this.tables.sessions} WHERE id = ?`,\n\t\t\tsessionId,\n\t\t);\n\t\tif (!row) throw new SessionNotFoundError(sessionId);\n\t\tif (row.last_seq !== options.expectSeq) {\n\t\t\tthrow new SessionConflictError(sessionId, options.expectSeq, row.last_seq);\n\t\t}\n\t\treturn row;\n\t}\n\n\tprivate async saveSummary(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\tsnapshot: SessionSnapshot,\n\t\tprevious?: SessionSummaryState,\n\t): Promise<readonly SessionSummaryText[]> {\n\t\tconst { header, lastSeq } = snapshot;\n\t\tconst { state, texts } = applySessionSummaryEntries(previous, snapshot.entries);\n\t\tconst summary = materializeSessionSummaryMetadata(header, state);\n\t\tawait tx.run(\n\t\t\t`INSERT INTO ${this.tables.sessions}\n\t\t\t\t(id, cwd, created_at, header_json, internal, last_seq, modified_at, message_count,\n\t\t\t\t first_message, name, has_name, summary, summarized_through_id, summary_state, revision)\n\t\t\t\tVALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, lower(hex(randomblob(16))))\n\t\t\t\tON CONFLICT(id) DO UPDATE SET\n\t\t\t\tcwd = excluded.cwd, created_at = excluded.created_at, header_json = excluded.header_json,\n\t\t\t\tinternal = excluded.internal, last_seq = excluded.last_seq, modified_at = excluded.modified_at,\n\t\t\t\tmessage_count = excluded.message_count, first_message = excluded.first_message, name = excluded.name,\n\t\t\t\thas_name = excluded.has_name, summary = excluded.summary,\n\t\t\t\tsummarized_through_id = excluded.summarized_through_id,\n\t\t\t\tsummary_state = excluded.summary_state, revision = excluded.revision`,\n\t\t\tsessionId,\n\t\t\theader.cwd,\n\t\t\theader.createdAt,\n\t\t\tthis.encode(header),\n\t\t\theader.internal ? 1 : 0,\n\t\t\tlastSeq,\n\t\t\tsummary.modifiedAt,\n\t\t\tsummary.messageCount,\n\t\t\tthis.encode(summary.firstMessage),\n\t\t\tsummary.name === undefined ? null : this.encode(summary.name),\n\t\t\tsummary.hasName ? 1 : 0,\n\t\t\tsummary.summary === undefined ? null : this.encode(summary.summary),\n\t\t\tsummary.summarizedThroughId ?? null,\n\t\t\tthis.encode(state),\n\t\t);\n\t\treturn texts;\n\t}\n\n\tprivate async insertEntries(\n\t\ttx: SqliteExecutor,\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\tlastSeq: number,\n\t\ttexts: readonly SessionSummaryText[],\n\t): Promise<void> {\n\t\tfor (const [index, entry] of entries.entries()) {\n\t\t\tawait tx.run(\n\t\t\t\t`INSERT INTO ${this.tables.entries} (session_id, seq, entry_id, entry_json) VALUES (?, ?, ?, ?)`,\n\t\t\t\tsessionId,\n\t\t\t\tlastSeq + index + 1,\n\t\t\t\tentry.id,\n\t\t\t\tthis.encode(entry),\n\t\t\t);\n\t\t}\n\t\tfor (const { index, text } of texts) {\n\t\t\tawait tx.run(\n\t\t\t\t`INSERT INTO ${this.tables.searchTexts} (session_id, seq, text_json) VALUES (?, ?, ?)`,\n\t\t\t\tsessionId,\n\t\t\t\tlastSeq + index + 1,\n\t\t\t\tthis.encode(text),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate encode(value: SessionRecordHeader | SessionEntry | SessionSummaryState | string): string {\n\t\ttry {\n\t\t\treturn JSON.stringify(value);\n\t\t} catch (cause) {\n\t\t\tthrow new StorageUnavailableError(this.descriptor, cause as Error);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,40 @@
1
+ export declare class StructuredOutputDeadlineError extends Error {
2
+ constructor(timeoutMs: number, attempts: string);
3
+ }
4
+ /** The failure for an aborted decision: the deadline error when the deadline fired, otherwise a plain cancellation. */
5
+ export declare function abortFailure(signal: AbortSignal): Error;
6
+ export declare function validateTimeoutOverride(value: number | undefined): void;
7
+ /**
8
+ * The wall-clock limit for one decision: an explicit `timeoutMs`, else the session's `httpIdleTimeoutMs`, else that
9
+ * setting's default. Like the provider clients, an idle timeout of `0` (disabled) becomes the largest timer delay.
10
+ */
11
+ export declare function resolveDecisionDeadlineMs(timeoutMs: number | undefined, httpIdleTimeoutMs?: number): number;
12
+ /** One model request, from send to response; transport retries and their waits are not part of it. Records only the stop reason and timing, never content. */
13
+ export declare class DecisionAttempt {
14
+ readonly startedAt: number;
15
+ endedAt: number | undefined;
16
+ stopReason: string | undefined;
17
+ settle(stopReason?: string): void;
18
+ describe(now: number): string;
19
+ }
20
+ /** How every generation of one decision ended and how long it took, across repairs, retries and candidates. */
21
+ export declare class DecisionTrace {
22
+ private readonly attempts;
23
+ get size(): number;
24
+ begin(): DecisionAttempt;
25
+ /** Mark every generation still in flight as ended without a response. */
26
+ settleOpen(): void;
27
+ /** The attempts from `first` onward, numbered from 1, or an empty string when there are none. */
28
+ describe(first?: number): string;
29
+ }
30
+ export interface DecisionRun {
31
+ readonly signal: AbortSignal;
32
+ readonly trace: DecisionTrace;
33
+ }
34
+ /**
35
+ * Run a whole decision under one wall-clock limit. `run` receives a signal that aborts with the caller's reason when
36
+ * the caller aborts and with a {@link StructuredOutputDeadlineError} when the limit passes, so the existing abort
37
+ * plumbing cancels the in-flight generation. The timer is always released.
38
+ */
39
+ export declare function withinDecisionDeadline<T>(callerSignal: AbortSignal | undefined, timeoutMs: number, run: (decision: DecisionRun) => Promise<T>): Promise<T>;
40
+ //# sourceMappingURL=deadline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadline.d.ts","sourceRoot":"","sources":["../../../src/core/structured-output/deadline.ts"],"names":[],"mappings":"AAOA,qBAAa,6BAA8B,SAAQ,KAAK;IACvD,YAAY,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAK9C;CACD;AAED,uHAAuH;AACvH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAEvD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAKvE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3G;AAcD,8JAA8J;AAC9J,qBAAa,eAAe;IAC3B,QAAQ,CAAC,SAAS,SAAqB;IACvC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAGhC;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ5B;CACD;AAED,+GAA+G;AAC/G,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,eAAe,CAIvB;IAED,yEAAyE;IACzE,UAAU,IAAI,IAAI,CAEjB;IAED,iGAAiG;IACjG,QAAQ,CAAC,KAAK,SAAI,GAAG,MAAM,CAK1B;CACD;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC7C,YAAY,EAAE,WAAW,GAAG,SAAS,EACrC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
@@ -0,0 +1,110 @@
1
+ import { SETTINGS_DEFAULTS } from "../settings-defaults.js";
2
+ /** The largest delay `setTimeout` honors; a larger one fires immediately. */
3
+ const MAX_DEADLINE_MS = 2_147_483_647;
4
+ const CANCELLED_MESSAGE = "Structured output cancelled; no decision was accepted.";
5
+ export class StructuredOutputDeadlineError extends Error {
6
+ constructor(timeoutMs, attempts) {
7
+ super(`Structured output decision exceeded its ${timeoutMs}ms deadline; no decision was accepted.${attempts ? ` ${attempts}` : ""}`);
8
+ this.name = "StructuredOutputDeadlineError";
9
+ }
10
+ }
11
+ /** The failure for an aborted decision: the deadline error when the deadline fired, otherwise a plain cancellation. */
12
+ export function abortFailure(signal) {
13
+ return signal.reason instanceof StructuredOutputDeadlineError ? signal.reason : new Error(CANCELLED_MESSAGE);
14
+ }
15
+ export function validateTimeoutOverride(value) {
16
+ if (value === undefined)
17
+ return;
18
+ if (!Number.isSafeInteger(value) || value <= 0) {
19
+ throw new Error("Structured output timeoutMs must be a positive integer.");
20
+ }
21
+ }
22
+ /**
23
+ * The wall-clock limit for one decision: an explicit `timeoutMs`, else the session's `httpIdleTimeoutMs`, else that
24
+ * setting's default. Like the provider clients, an idle timeout of `0` (disabled) becomes the largest timer delay.
25
+ */
26
+ export function resolveDecisionDeadlineMs(timeoutMs, httpIdleTimeoutMs) {
27
+ validateTimeoutOverride(timeoutMs);
28
+ const requested = timeoutMs ?? httpIdleTimeoutMs ?? SETTINGS_DEFAULTS.httpIdleTimeoutMs;
29
+ return requested === 0 ? MAX_DEADLINE_MS : Math.min(requested, MAX_DEADLINE_MS);
30
+ }
31
+ function formatDuration(milliseconds) {
32
+ const ms = Math.round(milliseconds);
33
+ if (ms < 1_000)
34
+ return `${ms}ms`;
35
+ if (ms < 60_000)
36
+ return `${(ms / 1_000).toFixed(1)}s`;
37
+ const totalSeconds = Math.round(ms / 1_000);
38
+ const hours = Math.floor(totalSeconds / 3_600);
39
+ const minutes = Math.floor((totalSeconds % 3_600) / 60);
40
+ const pad = (value) => String(value).padStart(2, "0");
41
+ const clock = hours > 0 ? `${hours}h${pad(minutes)}m` : `${minutes}m`;
42
+ return `${clock}${pad(totalSeconds % 60)}s`;
43
+ }
44
+ /** One model request, from send to response; transport retries and their waits are not part of it. Records only the stop reason and timing, never content. */
45
+ export class DecisionAttempt {
46
+ startedAt = performance.now();
47
+ endedAt;
48
+ stopReason;
49
+ settle(stopReason) {
50
+ this.endedAt ??= performance.now();
51
+ if (stopReason !== undefined)
52
+ this.stopReason = stopReason;
53
+ }
54
+ describe(now) {
55
+ const outcome = this.endedAt === undefined
56
+ ? "still generating"
57
+ : this.stopReason === undefined
58
+ ? "no response"
59
+ : `stopReason=${this.stopReason}`;
60
+ return `${outcome} ${formatDuration((this.endedAt ?? now) - this.startedAt)}`;
61
+ }
62
+ }
63
+ /** How every generation of one decision ended and how long it took, across repairs, retries and candidates. */
64
+ export class DecisionTrace {
65
+ attempts = [];
66
+ get size() {
67
+ return this.attempts.length;
68
+ }
69
+ begin() {
70
+ const attempt = new DecisionAttempt();
71
+ this.attempts.push(attempt);
72
+ return attempt;
73
+ }
74
+ /** Mark every generation still in flight as ended without a response. */
75
+ settleOpen() {
76
+ for (const attempt of this.attempts)
77
+ attempt.settle();
78
+ }
79
+ /** The attempts from `first` onward, numbered from 1, or an empty string when there are none. */
80
+ describe(first = 0) {
81
+ const now = performance.now();
82
+ const shown = this.attempts.slice(first);
83
+ if (shown.length === 0)
84
+ return "";
85
+ return `Attempts: ${shown.map((attempt, index) => `${index + 1}) ${attempt.describe(now)}`).join("; ")}.`;
86
+ }
87
+ }
88
+ /**
89
+ * Run a whole decision under one wall-clock limit. `run` receives a signal that aborts with the caller's reason when
90
+ * the caller aborts and with a {@link StructuredOutputDeadlineError} when the limit passes, so the existing abort
91
+ * plumbing cancels the in-flight generation. The timer is always released.
92
+ */
93
+ export async function withinDecisionDeadline(callerSignal, timeoutMs, run) {
94
+ const controller = new AbortController();
95
+ const trace = new DecisionTrace();
96
+ const forwardCallerAbort = () => controller.abort(callerSignal?.reason);
97
+ if (callerSignal?.aborted)
98
+ forwardCallerAbort();
99
+ else
100
+ callerSignal?.addEventListener("abort", forwardCallerAbort, { once: true });
101
+ const timer = setTimeout(() => controller.abort(new StructuredOutputDeadlineError(timeoutMs, trace.describe())), timeoutMs);
102
+ try {
103
+ return await run({ signal: controller.signal, trace });
104
+ }
105
+ finally {
106
+ clearTimeout(timer);
107
+ callerSignal?.removeEventListener("abort", forwardCallerAbort);
108
+ }
109
+ }
110
+ //# sourceMappingURL=deadline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deadline.js","sourceRoot":"","sources":["../../../src/core/structured-output/deadline.ts"],"names":[],"mappings":"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","sourcesContent":["import { SETTINGS_DEFAULTS } from \"../settings-defaults.ts\";\n\n/** The largest delay `setTimeout` honors; a larger one fires immediately. */\nconst MAX_DEADLINE_MS = 2_147_483_647;\n\nconst CANCELLED_MESSAGE = \"Structured output cancelled; no decision was accepted.\";\n\nexport class StructuredOutputDeadlineError extends Error {\n\tconstructor(timeoutMs: number, attempts: string) {\n\t\tsuper(\n\t\t\t`Structured output decision exceeded its ${timeoutMs}ms deadline; no decision was accepted.${attempts ? ` ${attempts}` : \"\"}`,\n\t\t);\n\t\tthis.name = \"StructuredOutputDeadlineError\";\n\t}\n}\n\n/** The failure for an aborted decision: the deadline error when the deadline fired, otherwise a plain cancellation. */\nexport function abortFailure(signal: AbortSignal): Error {\n\treturn signal.reason instanceof StructuredOutputDeadlineError ? signal.reason : new Error(CANCELLED_MESSAGE);\n}\n\nexport function validateTimeoutOverride(value: number | undefined): void {\n\tif (value === undefined) return;\n\tif (!Number.isSafeInteger(value) || value <= 0) {\n\t\tthrow new Error(\"Structured output timeoutMs must be a positive integer.\");\n\t}\n}\n\n/**\n * The wall-clock limit for one decision: an explicit `timeoutMs`, else the session's `httpIdleTimeoutMs`, else that\n * setting's default. Like the provider clients, an idle timeout of `0` (disabled) becomes the largest timer delay.\n */\nexport function resolveDecisionDeadlineMs(timeoutMs: number | undefined, httpIdleTimeoutMs?: number): number {\n\tvalidateTimeoutOverride(timeoutMs);\n\tconst requested = timeoutMs ?? httpIdleTimeoutMs ?? SETTINGS_DEFAULTS.httpIdleTimeoutMs;\n\treturn requested === 0 ? MAX_DEADLINE_MS : Math.min(requested, MAX_DEADLINE_MS);\n}\n\nfunction formatDuration(milliseconds: number): string {\n\tconst ms = Math.round(milliseconds);\n\tif (ms < 1_000) return `${ms}ms`;\n\tif (ms < 60_000) return `${(ms / 1_000).toFixed(1)}s`;\n\tconst totalSeconds = Math.round(ms / 1_000);\n\tconst hours = Math.floor(totalSeconds / 3_600);\n\tconst minutes = Math.floor((totalSeconds % 3_600) / 60);\n\tconst pad = (value: number) => String(value).padStart(2, \"0\");\n\tconst clock = hours > 0 ? `${hours}h${pad(minutes)}m` : `${minutes}m`;\n\treturn `${clock}${pad(totalSeconds % 60)}s`;\n}\n\n/** One model request, from send to response; transport retries and their waits are not part of it. Records only the stop reason and timing, never content. */\nexport class DecisionAttempt {\n\treadonly startedAt = performance.now();\n\tendedAt: number | undefined;\n\tstopReason: string | undefined;\n\n\tsettle(stopReason?: string): void {\n\t\tthis.endedAt ??= performance.now();\n\t\tif (stopReason !== undefined) this.stopReason = stopReason;\n\t}\n\n\tdescribe(now: number): string {\n\t\tconst outcome =\n\t\t\tthis.endedAt === undefined\n\t\t\t\t? \"still generating\"\n\t\t\t\t: this.stopReason === undefined\n\t\t\t\t\t? \"no response\"\n\t\t\t\t\t: `stopReason=${this.stopReason}`;\n\t\treturn `${outcome} ${formatDuration((this.endedAt ?? now) - this.startedAt)}`;\n\t}\n}\n\n/** How every generation of one decision ended and how long it took, across repairs, retries and candidates. */\nexport class DecisionTrace {\n\tprivate readonly attempts: DecisionAttempt[] = [];\n\n\tget size(): number {\n\t\treturn this.attempts.length;\n\t}\n\n\tbegin(): DecisionAttempt {\n\t\tconst attempt = new DecisionAttempt();\n\t\tthis.attempts.push(attempt);\n\t\treturn attempt;\n\t}\n\n\t/** Mark every generation still in flight as ended without a response. */\n\tsettleOpen(): void {\n\t\tfor (const attempt of this.attempts) attempt.settle();\n\t}\n\n\t/** The attempts from `first` onward, numbered from 1, or an empty string when there are none. */\n\tdescribe(first = 0): string {\n\t\tconst now = performance.now();\n\t\tconst shown = this.attempts.slice(first);\n\t\tif (shown.length === 0) return \"\";\n\t\treturn `Attempts: ${shown.map((attempt, index) => `${index + 1}) ${attempt.describe(now)}`).join(\"; \")}.`;\n\t}\n}\n\nexport interface DecisionRun {\n\treadonly signal: AbortSignal;\n\treadonly trace: DecisionTrace;\n}\n\n/**\n * Run a whole decision under one wall-clock limit. `run` receives a signal that aborts with the caller's reason when\n * the caller aborts and with a {@link StructuredOutputDeadlineError} when the limit passes, so the existing abort\n * plumbing cancels the in-flight generation. The timer is always released.\n */\nexport async function withinDecisionDeadline<T>(\n\tcallerSignal: AbortSignal | undefined,\n\ttimeoutMs: number,\n\trun: (decision: DecisionRun) => Promise<T>,\n): Promise<T> {\n\tconst controller = new AbortController();\n\tconst trace = new DecisionTrace();\n\tconst forwardCallerAbort = () => controller.abort(callerSignal?.reason);\n\tif (callerSignal?.aborted) forwardCallerAbort();\n\telse callerSignal?.addEventListener(\"abort\", forwardCallerAbort, { once: true });\n\tconst timer = setTimeout(\n\t\t() => controller.abort(new StructuredOutputDeadlineError(timeoutMs, trace.describe())),\n\t\ttimeoutMs,\n\t);\n\ttry {\n\t\treturn await run({ signal: controller.signal, trace });\n\t} finally {\n\t\tclearTimeout(timer);\n\t\tcallerSignal?.removeEventListener(\"abort\", forwardCallerAbort);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/structured-output/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,KAAK,EAGX,qBAAqB,EAErB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACX,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,YAAY,CAAC;AA8OpB,wBAAsB,wBAAwB,CAAC,CAAC,SAAS,OAAO,EAC/D,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAyE5C;AA8JD,6GAA6G;AAC7G,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EACjD,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACjC,iGAAiG;AACjG,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,GAC9C,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAU5C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/structured-output/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAU/C,OAAO,KAAK,EAGX,qBAAqB,EAErB,uBAAuB,EACvB,sBAAsB,EACtB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,YAAY,EACX,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,GACtB,MAAM,YAAY,CAAC;AAkRpB,wBAAsB,wBAAwB,CAAC,CAAC,SAAS,OAAO,EAC/D,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAM5C;AAkQD,6GAA6G;AAC7G,wBAAsB,UAAU,CAAC,CAAC,SAAS,OAAO,EACjD,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;AACjC,iGAAiG;AACjG,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,GAC9C,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAa5C"}