@bastani/atomic 0.9.39 → 0.9.40-alpha.2

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 (280) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +14 -0
  3. package/dist/builtin/intercom/broker/broker.ts +523 -72
  4. package/dist/builtin/intercom/broker/client.ts +136 -5
  5. package/dist/builtin/intercom/broker/database-wake-up-bus.ts +274 -0
  6. package/dist/builtin/intercom/broker/group-membership.ts +2 -2
  7. package/dist/builtin/intercom/broker/multinode-router.ts +1500 -0
  8. package/dist/builtin/intercom/broker/multinode-state-store.ts +569 -0
  9. package/dist/builtin/intercom/broker/open-broker-state.ts +160 -0
  10. package/dist/builtin/intercom/broker/paths.ts +6 -0
  11. package/dist/builtin/intercom/broker/pending-send-registry.ts +14 -0
  12. package/dist/builtin/intercom/broker/recipient-receipts.ts +93 -0
  13. package/dist/builtin/intercom/broker/restoring-recipients.ts +263 -0
  14. package/dist/builtin/intercom/broker/send-handler.ts +241 -25
  15. package/dist/builtin/intercom/broker/session-id-reclaim.ts +41 -0
  16. package/dist/builtin/intercom/broker/socket-writes.ts +47 -0
  17. package/dist/builtin/intercom/broker/spawn.ts +10 -2
  18. package/dist/builtin/intercom/broker/sql-held-send-store.ts +96 -0
  19. package/dist/builtin/intercom/broker/sql-known-session-store.ts +129 -0
  20. package/dist/builtin/intercom/broker/sql-lease-store.ts +194 -0
  21. package/dist/builtin/intercom/broker/sql-outbox-store.ts +249 -0
  22. package/dist/builtin/intercom/broker/sql-pending-ask-store.ts +105 -0
  23. package/dist/builtin/intercom/broker/sql-restoring-reservation-store.ts +295 -0
  24. package/dist/builtin/intercom/broker/sql-sent-message-authority.ts +126 -0
  25. package/dist/builtin/intercom/broker/supervisor-channel.ts +10 -0
  26. package/dist/builtin/intercom/broker/wake-up-bus.ts +60 -0
  27. package/dist/builtin/intercom/index.bundle.mjs +793 -91
  28. package/dist/builtin/intercom/package.json +1 -1
  29. package/dist/builtin/intercom/retry-policy.ts +4 -0
  30. package/dist/builtin/intercom/session-target.ts +24 -0
  31. package/dist/builtin/intercom/types.ts +57 -3
  32. package/dist/builtin/mcp/package.json +1 -1
  33. package/dist/builtin/subagents/CHANGELOG.md +31 -0
  34. package/dist/builtin/subagents/README.md +18 -12
  35. package/dist/builtin/subagents/package.json +1 -1
  36. package/dist/builtin/subagents/skills/agent-browser/SKILL.md +1 -1
  37. package/dist/builtin/subagents/skills/cua-driver/BROWSER.md +55 -8
  38. package/dist/builtin/subagents/skills/cua-driver/EMBEDDING.md +7 -2
  39. package/dist/builtin/subagents/skills/cua-driver/LINUX.md +7 -1
  40. package/dist/builtin/subagents/skills/cua-driver/MACOS.md +151 -27
  41. package/dist/builtin/subagents/skills/cua-driver/RUNTIME.md +1 -1
  42. package/dist/builtin/subagents/skills/cua-driver/SKILL.md +33 -17
  43. package/dist/builtin/subagents/skills/cua-driver/WINDOWS.md +5 -0
  44. package/dist/builtin/subagents/skills/cua-driver/WORKFLOW.md +46 -8
  45. package/dist/builtin/subagents/skills/subagent/SKILL.md +18 -20
  46. package/dist/builtin/subagents/src/extension/index.bundle.mjs +8032 -6034
  47. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  48. package/dist/builtin/web-access/README.md +1 -1
  49. package/dist/builtin/web-access/index.bundle.mjs +2 -5
  50. package/dist/builtin/web-access/package.json +1 -1
  51. package/dist/builtin/workflows/CHANGELOG.md +24 -0
  52. package/dist/builtin/workflows/README.md +1 -1
  53. package/dist/builtin/workflows/package.json +1 -1
  54. package/dist/builtin/workflows/skills/impeccable/SKILL.md +8 -8
  55. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +3 -3
  56. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +1 -1
  57. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +4 -2
  58. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +2 -2
  59. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +1 -1
  60. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +22 -9
  61. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +2 -2
  62. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +3 -3
  63. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +3 -3
  64. package/dist/builtin/workflows/skills/impeccable/reference/harden.md +2 -4
  65. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +4 -4
  66. package/dist/builtin/workflows/skills/impeccable/reference/live.md +1 -1
  67. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +6 -6
  68. package/dist/builtin/workflows/skills/impeccable/reference/onboard.md +3 -3
  69. package/dist/builtin/workflows/skills/impeccable/reference/optimize.md +3 -3
  70. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +3 -3
  71. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +3 -3
  72. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +10 -0
  73. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +1 -1
  74. package/dist/builtin/workflows/skills/impeccable/scripts/VERSION +1 -1
  75. package/dist/builtin/workflows/skills/impeccable/scripts/impeccable +6 -0
  76. package/dist/builtin/workflows/skills/impeccable/scripts/impeccable.cmd +47 -22
  77. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-dom.js +34 -1
  78. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +25 -1
  79. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +33 -8
  80. package/dist/builtin/workflows/src/durable/journal/resolution.d.ts +7 -7
  81. package/dist/builtin/workflows/src/extension/index.bundle.mjs +22715 -22159
  82. package/dist/builtin/workflows/src/index.js +106 -35
  83. package/dist/cli/args.d.ts +2 -0
  84. package/dist/cli/args.d.ts.map +1 -1
  85. package/dist/cli/args.js +17 -1
  86. package/dist/cli/args.js.map +1 -1
  87. package/dist/core/agent-session-extension-bindings.d.ts +2 -0
  88. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  89. package/dist/core/agent-session-extension-bindings.js +6 -6
  90. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  91. package/dist/core/agent-session-methods.d.ts +6 -3
  92. package/dist/core/agent-session-methods.d.ts.map +1 -1
  93. package/dist/core/agent-session-methods.js.map +1 -1
  94. package/dist/core/agent-session-persistent-custom-messages.d.ts +7 -2
  95. package/dist/core/agent-session-persistent-custom-messages.d.ts.map +1 -1
  96. package/dist/core/agent-session-persistent-custom-messages.js +29 -12
  97. package/dist/core/agent-session-persistent-custom-messages.js.map +1 -1
  98. package/dist/core/agent-session-recovery.d.ts +14 -0
  99. package/dist/core/agent-session-recovery.d.ts.map +1 -0
  100. package/dist/core/agent-session-recovery.js +83 -0
  101. package/dist/core/agent-session-recovery.js.map +1 -0
  102. package/dist/core/agent-session-tasks.d.ts.map +1 -1
  103. package/dist/core/agent-session-tasks.js +4 -6
  104. package/dist/core/agent-session-tasks.js.map +1 -1
  105. package/dist/core/agent-session-types.d.ts +13 -0
  106. package/dist/core/agent-session-types.d.ts.map +1 -1
  107. package/dist/core/agent-session-types.js.map +1 -1
  108. package/dist/core/agent-session.d.ts +2 -1
  109. package/dist/core/agent-session.d.ts.map +1 -1
  110. package/dist/core/agent-session.js +4 -1
  111. package/dist/core/agent-session.js.map +1 -1
  112. package/dist/core/export-html/index.d.ts.map +1 -1
  113. package/dist/core/export-html/index.js +3 -2
  114. package/dist/core/export-html/index.js.map +1 -1
  115. package/dist/core/export-html/template.html +1 -0
  116. package/dist/core/export-html/template.js +37 -20
  117. package/dist/core/export-html/vendor/marked-cjk-friendly.min.js +6 -0
  118. package/dist/core/export-html/vendor/marked.min.js +76 -3
  119. package/dist/core/extensions/api-types.d.ts +6 -2
  120. package/dist/core/extensions/api-types.d.ts.map +1 -1
  121. package/dist/core/extensions/api-types.js.map +1 -1
  122. package/dist/core/extensions/event-results.d.ts +21 -0
  123. package/dist/core/extensions/event-results.d.ts.map +1 -1
  124. package/dist/core/extensions/event-results.js.map +1 -1
  125. package/dist/core/extensions/index.d.ts +1 -1
  126. package/dist/core/extensions/index.d.ts.map +1 -1
  127. package/dist/core/extensions/index.js.map +1 -1
  128. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  129. package/dist/core/extensions/loader-api.js +4 -0
  130. package/dist/core/extensions/loader-api.js.map +1 -1
  131. package/dist/core/extensions/runner-events.d.ts +9 -2
  132. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  133. package/dist/core/extensions/runner-events.js +29 -0
  134. package/dist/core/extensions/runner-events.js.map +1 -1
  135. package/dist/core/extensions/runner.d.ts +5 -3
  136. package/dist/core/extensions/runner.d.ts.map +1 -1
  137. package/dist/core/extensions/runner.js +7 -2
  138. package/dist/core/extensions/runner.js.map +1 -1
  139. package/dist/core/extensions/runtime-types.d.ts +1 -0
  140. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  141. package/dist/core/extensions/runtime-types.js.map +1 -1
  142. package/dist/core/extensions/session-events.d.ts +30 -2
  143. package/dist/core/extensions/session-events.d.ts.map +1 -1
  144. package/dist/core/extensions/session-events.js.map +1 -1
  145. package/dist/core/sdk-types.d.ts +3 -2
  146. package/dist/core/sdk-types.d.ts.map +1 -1
  147. package/dist/core/sdk-types.js.map +1 -1
  148. package/dist/core/sdk.d.ts.map +1 -1
  149. package/dist/core/sdk.js +3 -0
  150. package/dist/core/sdk.js.map +1 -1
  151. package/dist/core/session-storage.d.ts.map +1 -1
  152. package/dist/core/session-storage.js +15 -9
  153. package/dist/core/session-storage.js.map +1 -1
  154. package/dist/core/storage/process-selection.d.ts +39 -0
  155. package/dist/core/storage/process-selection.d.ts.map +1 -0
  156. package/dist/core/storage/process-selection.js +154 -0
  157. package/dist/core/storage/process-selection.js.map +1 -0
  158. package/dist/core/storage/provider.d.ts +6 -1
  159. package/dist/core/storage/provider.d.ts.map +1 -1
  160. package/dist/core/storage/provider.js +3 -2
  161. package/dist/core/storage/provider.js.map +1 -1
  162. package/dist/core/storage/selection.d.ts +1 -1
  163. package/dist/core/storage/selection.d.ts.map +1 -1
  164. package/dist/core/storage/selection.js.map +1 -1
  165. package/dist/core/storage/session/jsonl-session-store.d.ts +2 -0
  166. package/dist/core/storage/session/jsonl-session-store.d.ts.map +1 -1
  167. package/dist/core/storage/session/jsonl-session-store.js +38 -2
  168. package/dist/core/storage/session/jsonl-session-store.js.map +1 -1
  169. package/dist/core/tasks/completion.d.ts +11 -2
  170. package/dist/core/tasks/completion.d.ts.map +1 -1
  171. package/dist/core/tasks/completion.js +40 -16
  172. package/dist/core/tasks/completion.js.map +1 -1
  173. package/dist/core/tasks/pause.d.ts +4 -1
  174. package/dist/core/tasks/pause.d.ts.map +1 -1
  175. package/dist/core/tasks/pause.js +8 -5
  176. package/dist/core/tasks/pause.js.map +1 -1
  177. package/dist/index-extensions.d.ts +1 -1
  178. package/dist/index-extensions.d.ts.map +1 -1
  179. package/dist/index-extensions.js.map +1 -1
  180. package/dist/index.d.ts +2 -1
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +2 -0
  183. package/dist/index.js.map +1 -1
  184. package/dist/main.d.ts.map +1 -1
  185. package/dist/main.js +7 -1
  186. package/dist/main.js.map +1 -1
  187. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  188. package/dist/modes/interactive/components/chat-session-host-rendering.js +11 -1
  189. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  190. package/dist/modes/interactive/components/chat-session-host-state.d.ts +2 -0
  191. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  192. package/dist/modes/interactive/components/chat-session-host-state.js +2 -0
  193. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  194. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  195. package/dist/modes/interactive/interactive-deferred-startup.js +4 -0
  196. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  197. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
  198. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  199. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  200. package/dist/modes/interactive/interactive-render-chat.js +3 -0
  201. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  202. package/dist/modes/interactive/interactive-session-routing.js +2 -0
  203. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  204. package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -1
  205. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  206. package/dist/modes/interactive/interactive-session-runtime.js +29 -0
  207. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  208. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  209. package/dist/modes/interactive/interactive-startup.js +4 -1
  210. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  211. package/dist/modes/interactive-engine/engine-args.d.ts.map +1 -1
  212. package/dist/modes/interactive-engine/engine-args.js +4 -0
  213. package/dist/modes/interactive-engine/engine-args.js.map +1 -1
  214. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
  215. package/dist/modes/interactive-engine/engine-render-service.js +4 -4
  216. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  217. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  218. package/dist/modes/interactive-engine/isolated-runtime.js +4 -0
  219. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  220. package/dist/modes/interactive-engine/remote-renderer.js +1 -1
  221. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  222. package/dist/modes/rpc/rpc-client-api.d.ts +4 -1
  223. package/dist/modes/rpc/rpc-client-api.d.ts.map +1 -1
  224. package/dist/modes/rpc/rpc-client-api.js +4 -0
  225. package/dist/modes/rpc/rpc-client-api.js.map +1 -1
  226. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  227. package/dist/modes/rpc/rpc-command-handler.js +3 -0
  228. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  229. package/dist/modes/rpc/rpc-command-timeouts.d.ts.map +1 -1
  230. package/dist/modes/rpc/rpc-command-timeouts.js +1 -0
  231. package/dist/modes/rpc/rpc-command-timeouts.js.map +1 -1
  232. package/dist/modes/rpc/rpc-input-scheduler.d.ts.map +1 -1
  233. package/dist/modes/rpc/rpc-input-scheduler.js +6 -1
  234. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  235. package/dist/modes/rpc/rpc-types.d.ts +12 -1
  236. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  237. package/dist/modes/rpc/rpc-types.js.map +1 -1
  238. package/dist/utils/shell.d.ts.map +1 -1
  239. package/dist/utils/shell.js +44 -11
  240. package/dist/utils/shell.js.map +1 -1
  241. package/dist/utils/tools-manager.js +1 -1
  242. package/dist/utils/tools-manager.js.map +1 -1
  243. package/docs/background-tasks.md +5 -3
  244. package/docs/computer-use.md +2 -2
  245. package/docs/environment-variables.md +4 -1
  246. package/docs/extensions/events.md +29 -2
  247. package/docs/getting-started/first-session.md +1 -1
  248. package/docs/guides/intercom.md +1 -1
  249. package/docs/intercom/operations.md +103 -1
  250. package/docs/intercom/reference.md +10 -3
  251. package/docs/intercom.md +8 -6
  252. package/docs/keybindings.md +1 -1
  253. package/docs/models.md +1 -1
  254. package/docs/providers.md +5 -3
  255. package/docs/reference/cli.md +5 -0
  256. package/docs/rpc/protocol.md +19 -0
  257. package/docs/rpc.md +3 -0
  258. package/docs/sdk/web-server.md +1 -1
  259. package/docs/sdk.md +5 -2
  260. package/docs/sessions.md +17 -1
  261. package/docs/settings.md +6 -4
  262. package/docs/skills.md +1 -1
  263. package/docs/storage.md +54 -3
  264. package/docs/subagents.md +49 -9
  265. package/docs/usage.md +1 -1
  266. package/docs/windows.md +14 -4
  267. package/docs/workflows/api-reference.md +1 -1
  268. package/docs/workflows/authoring.md +1 -1
  269. package/docs/workflows/operations.md +10 -6
  270. package/npm-shrinkwrap.json +40 -40
  271. package/package.json +6 -6
  272. package/dist/core/export-html/template-js/data-tree.js +0 -287
  273. package/dist/core/export-html/template-js/entries-navigation.js +0 -434
  274. package/dist/core/export-html/template-js/initialization.js +0 -335
  275. package/dist/core/export-html/template-js/message-tools.js +0 -428
  276. package/dist/core/export-html/template-js/tree-filter-render.js +0 -419
  277. package/dist/core/export-html/template-script.d.ts +0 -3
  278. package/dist/core/export-html/template-script.d.ts.map +0 -1
  279. package/dist/core/export-html/template-script.js +0 -13
  280. package/dist/core/export-html/template-script.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"jsonl-session-store.js","sourceRoot":"","sources":["../../../../src/core/storage/session/jsonl-session-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { type BigIntStats, createReadStream } from \"node:fs\";\nimport {\n\tappendFile,\n\tcopyFile,\n\tlink,\n\tmkdir,\n\topen,\n\treaddir,\n\trename,\n\tstat,\n\ttruncate,\n\tunlink,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport lockfile from \"proper-lockfile\";\nimport { createSessionCwdMatcher } from \"../../../utils/canonical-path.ts\";\nimport type { SessionEntry } from \"../../session-manager-types.ts\";\nimport { validateSessionEntryStructure } from \"./entry-structure.js\";\nimport {\n\tSessionConflictError,\n\tSessionExistsError,\n\tSessionFormatVersionError,\n\tSessionIdMismatchError,\n\tSessionInvalidTextError,\n\tSessionInvalidTimestampError,\n\ttype SessionJsonValue,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n\tStoreClosedError,\n} from \"./errors.js\";\nimport {\n\tisCurrentSessionHeader,\n\ttype StoredSessionHeader,\n\tupgradeLegacySessionEntries,\n\tupgradeLegacySessionHeader,\n} from \"./legacy-format.js\";\nimport { summarizeSession } from \"./session-summary.js\";\nimport type {\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\ninterface SessionFileState {\n\treadonly stamp: string;\n\treadonly identity: string;\n\treadonly headerStamp: string;\n\treadonly headerId: string;\n\treadonly lastEntryId: string | undefined;\n\treadonly witness: Buffer;\n\treadonly size: number;\n\treadonly lastSeq: number;\n\treadonly terminated: boolean;\n}\n\ntype JsonValue = SessionJsonValue;\n\nconst SCAN_FIRST_LINE_CHUNK_BYTES = 4096;\n\nexport interface JsonlSessionFile {\n\treadonly location: string;\n\treadonly header: SessionRecordHeader;\n\tread(): Promise<SessionSnapshot>;\n}\n\nexport { SessionFormatVersionError } from \"./errors.js\";\n\nexport class JsonlStoragePoisonedError extends Error {\n\treadonly location: string;\n\toverride readonly cause: Error;\n\treadonly rollbackCause: Error;\n\n\tconstructor(location: string, cause: Error, rollbackCause: Error) {\n\t\tsuper(`Session append and rollback failed at ${location}`, { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t\tthis.location = location;\n\t\tthis.cause = cause;\n\t\tthis.rollbackCause = rollbackCause;\n\t}\n}\n\nexport class JsonlSessionStore implements SessionStore {\n\tprivate queue: Promise<void> = Promise.resolve();\n\tprivate closed = false;\n\tprivate poisoned: JsonlStoragePoisonedError | StorageUnavailableError | undefined;\n\tprivate readonly directory: string;\n\tprivate readonly fileStates = new Map<string, SessionFileState>();\n\n\tprivate readonly exactDirectory: boolean;\n\n\tprivate constructor(directory: string, exactDirectory: boolean) {\n\t\tthis.exactDirectory = exactDirectory;\n\t\tthis.directory = resolve(directory);\n\t}\n\n\tstatic async open(\n\t\tdirectory: string,\n\t\toptions?: { exactDirectory?: boolean; scanExisting?: boolean },\n\t): Promise<JsonlSessionStore> {\n\t\tconst store = new JsonlSessionStore(directory, options?.exactDirectory === true);\n\t\tawait store.run(() => mkdir(store.directory, { recursive: true }).then(() => {}), false);\n\t\tif (options?.scanExisting !== false) {\n\t\t\tawait store.run(async () => {\n\t\t\t\tfor (const path of await store.paths()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait store.readSnapshot(path);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tstore.fileStates.delete(path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn store;\n\t}\n\n\tlocationFor(header: SessionRecordHeader): string {\n\t\tconst projectName = `--${resolve(header.cwd)\n\t\t\t.replace(/^[/\\\\]/, \"\")\n\t\t\t.replace(/[/\\\\:]/g, \"-\")}--`;\n\t\tconst project = this.exactDirectory\n\t\t\t? this.directory\n\t\t\t: join(this.directory, Buffer.byteLength(projectName) <= 180 ? projectName : `--${this.key(header.cwd)}--`);\n\t\treturn join(project, `${header.createdAt.replace(/[:.]/g, \"-\")}_${this.key(header.id)}.jsonl`);\n\t}\n\n\tget descriptor(): StorageDescriptor {\n\t\treturn { adapter: \"jsonl\", location: this.directory };\n\t}\n\n\tcreate(\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\tlocation?: string,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\treturn this.run(async () => {\n\t\t\tvalidateSessionHeader(header);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tconst existing = await this.locate(header.id);\n\t\t\tif (existing) throw new SessionExistsError(header.id);\n\t\t\tconst payload = this.encode(header, entries);\n\t\t\tconst path = location === undefined ? this.locationFor(header) : resolve(location);\n\t\t\tawait mkdir(resolve(path, \"..\"), { recursive: true });\n\t\t\tconst temporary = `${path}.${randomUUID()}.tmp`;\n\t\t\ttry {\n\t\t\t\tawait writeFile(temporary, payload, { flag: \"wx\" });\n\t\t\t\ttry {\n\t\t\t\t\tawait link(temporary, path);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tif ((cause as NodeJS.ErrnoException).code === \"EEXIST\") throw new SessionExistsError(header.id);\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait unlink(temporary).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\t\tif (cause.code !== \"ENOENT\") throw cause;\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait this.remember(path, this.contentState(header, entries, payload));\n\t\t\treturn { lastSeq: entries.length };\n\t\t}, true);\n\t}\n\n\tappend(\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\treturn this.run(async () => {\n\t\t\tconst { path, state } = await this.forWrite(sessionId, options);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tif (entries.length === 0) return { lastSeq: state.lastSeq };\n\t\t\tlet payload = `${entries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`;\n\t\t\tif (!state.terminated) payload = `\\n${payload}`;\n\t\t\tconst offset = state.size;\n\t\t\tif (entries.some((entry) => entry.type === \"compaction\")) {\n\t\t\t\tawait copyFile(\n\t\t\t\t\tpath,\n\t\t\t\t\t`${path}.${new Date().toISOString().replace(/[:.]/g, \"-\")}.${randomUUID()}.compact.bak`,\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait appendFile(path, payload);\n\t\t\t} catch (cause) {\n\t\t\t\ttry {\n\t\t\t\t\tawait truncate(path, offset);\n\t\t\t\t} catch (rollbackCause) {\n\t\t\t\t\tthis.poisoned = new JsonlStoragePoisonedError(path, cause as Error, rollbackCause as Error);\n\t\t\t\t\tthrow this.poisoned;\n\t\t\t\t}\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t\tconst lastSeq = state.lastSeq + entries.length;\n\t\t\tawait this.remember(path, {\n\t\t\t\t...state,\n\t\t\t\tlastSeq,\n\t\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\t\tterminated: true,\n\t\t\t\twitness: Buffer.from(Buffer.concat([state.witness, Buffer.from(payload)]).subarray(-64)),\n\t\t\t});\n\t\t\treturn { lastSeq };\n\t\t});\n\t}\n\n\treplace(\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\treturn this.run(async () => {\n\t\t\tconst { path } = await this.forWrite(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 this.commit(path, header, entries);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tprivate async commit(path: string, header: SessionRecordHeader, entries: readonly SessionEntry[]): Promise<void> {\n\t\tconst payload = this.encode(header, entries);\n\t\tconst temporary = `${path}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, payload, { flag: \"wx\" });\n\t\t\tawait rename(temporary, path);\n\t\t} finally {\n\t\t\tawait unlink(temporary).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\tif (cause.code !== \"ENOENT\") throw cause;\n\t\t\t});\n\t\t}\n\t\tawait this.remember(path, this.contentState(header, entries, payload));\n\t}\n\n\tload(sessionId: string): Promise<SessionSnapshot> {\n\t\treturn this.run(async () => {\n\t\t\tconst located = await this.locate(sessionId);\n\t\t\tif (!located) throw new SessionNotFoundError(sessionId);\n\t\t\treturn this.readPersisted(located.path, located.stored);\n\t\t});\n\t}\n\n\tloadFile(path: string): Promise<SessionSnapshot> {\n\t\treturn this.run(() => this.readPersisted(resolve(path)));\n\t}\n\n\tprivate async readPersisted(path: string, stored?: StoredSessionHeader): Promise<SessionSnapshot> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst directory = dirname(path);\n\t\tif (isCurrentSessionHeader(stored) || directory === this.directory) return this.readSnapshot(path, stored, true);\n\t\treturn this.exclusive(() => this.readSnapshot(path, undefined, true), undefined, directory);\n\t}\n\n\tfindFile(sessionId: string): Promise<string | undefined> {\n\t\treturn this.run(async () => (await this.locate(sessionId))?.path);\n\t}\n\n\treadHeader(sessionId: string): Promise<SessionRecordHeader | undefined> {\n\t\treturn this.run(async () => {\n\t\t\treturn (await this.locate(sessionId))?.header;\n\t\t});\n\t}\n\n\tdelete(sessionId: string): Promise<void> {\n\t\treturn this.run(async () => {\n\t\t\tconst known = [...this.fileStates.values()].some((state) => state.headerId === sessionId);\n\t\t\tconst located = await this.locate(sessionId);\n\t\t\tif (!located) {\n\t\t\t\tif (known) throw new SessionNotFoundError(sessionId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait unlink(located.path);\n\t\t\tthis.fileStates.delete(located.path);\n\t\t});\n\t}\n\n\tasync *list(query: SessionListQuery): AsyncIterable<SessionSummary> {\n\t\tthis.checkAbort(query.signal);\n\t\tconst matchesCwd = query.cwd === undefined ? undefined : createSessionCwdMatcher(query.cwd);\n\t\tconst paths = await this.run(() => this.paths(), true, query.signal);\n\t\tfor (const path of paths) {\n\t\t\tconst summary = await this.run(\n\t\t\t\tasync () => {\n\t\t\t\t\tthis.checkAbort(query.signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header = await this.readHeaderAt(path);\n\t\t\t\t\t\tif (matchesCwd && !matchesCwd(header.cwd)) return undefined;\n\t\t\t\t\t\tif (!query.includeInternal && header.internal) return undefined;\n\t\t\t\t\t\treturn { ...summarizeSession(await this.readSnapshot(path)), location: path };\n\t\t\t\t\t} catch (cause) {\n\t\t\t\t\t\tconst error = cause as NodeJS.ErrnoException;\n\t\t\t\t\t\tif (error.path === path && (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")) return undefined;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcause instanceof SessionFormatVersionError ||\n\t\t\t\t\t\t\tcause instanceof SessionInvalidTextError ||\n\t\t\t\t\t\t\tcause instanceof SessionInvalidTimestampError ||\n\t\t\t\t\t\t\tcause instanceof SyntaxError\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\tthrow cause;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t\tquery.signal,\n\t\t\t);\n\t\t\tthis.checkAbort(query.signal);\n\t\t\tif (summary) yield summary;\n\t\t}\n\t\tawait this.run(async () => this.checkAbort(query.signal), true, query.signal);\n\t}\n\n\tasync *scanFiles(): AsyncIterable<JsonlSessionFile> {\n\t\tfor (const location of await this.run(() => this.paths({ skipUnreadableDirectories: true }), false)) {\n\t\t\tlet header: SessionRecordHeader;\n\t\t\ttry {\n\t\t\t\theader = await this.run(\n\t\t\t\t\tasync () => this.readHeaderAt(location, await this.readFirstLine(location, SCAN_FIRST_LINE_CHUNK_BYTES)),\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield { location, header, read: () => this.run(() => this.readSnapshot(location), false) };\n\t\t}\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\tclose(): Promise<void> {\n\t\tif (this.closed) return Promise.reject(new StoreClosedError(this.descriptor));\n\t\tthis.closed = true;\n\t\treturn this.queue;\n\t}\n\n\tprivate run<T>(operation: () => Promise<T>, locked = true, signal?: AbortSignal): Promise<T> {\n\t\tif (this.closed) return Promise.reject(new StoreClosedError(this.descriptor));\n\t\tconst result = this.queue.then(async () => {\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\ttry {\n\t\t\t\treturn await (locked ? this.exclusive(operation, signal) : operation());\n\t\t\t} catch (cause) {\n\t\t\t\tif (\n\t\t\t\t\tcause instanceof SessionConflictError ||\n\t\t\t\t\tcause instanceof SessionExistsError ||\n\t\t\t\t\tcause instanceof SessionNotFoundError ||\n\t\t\t\t\tcause instanceof SessionIdMismatchError ||\n\t\t\t\t\tcause instanceof SessionInvalidTextError ||\n\t\t\t\t\tcause instanceof SessionInvalidTimestampError ||\n\t\t\t\t\tcause instanceof SessionFormatVersionError ||\n\t\t\t\t\tcause instanceof JsonlStoragePoisonedError ||\n\t\t\t\t\tcause instanceof DOMException\n\t\t\t\t)\n\t\t\t\t\tthrow cause;\n\t\t\t\tthrow new StorageUnavailableError(this.descriptor, cause as Error);\n\t\t\t}\n\t\t});\n\t\tthis.queue = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n\n\tprivate async exclusive<T>(\n\t\toperation: () => Promise<T>,\n\t\tsignal?: AbortSignal,\n\t\tdirectory = this.directory,\n\t): Promise<T> {\n\t\tlet release: () => Promise<void>;\n\t\tfor (;;) {\n\t\t\tthis.checkAbort(signal);\n\t\t\ttry {\n\t\t\t\trelease = await lockfile.lock(directory, {\n\t\t\t\t\tlockfilePath: join(directory, \".session.lock\"),\n\t\t\t\t\tonCompromised: (cause) => {\n\t\t\t\t\t\tthis.poisoned = new StorageUnavailableError(this.descriptor, cause);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t} catch (cause) {\n\t\t\t\tif ((cause as NodeJS.ErrnoException).code !== \"ELOCKED\") throw cause;\n\t\t\t\tawait delay(5);\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tthis.checkAbort(signal);\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\tconst result = await operation();\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release();\n\t\t}\n\t}\n\n\tprivate checkAbort(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) throw new DOMException(\"Session listing aborted\", \"AbortError\");\n\t}\n\n\tprivate async paths(options: { readonly skipUnreadableDirectories?: boolean } = {}): Promise<string[]> {\n\t\tconst paths: string[] = [];\n\t\tfor (const entry of await readdir(this.directory, { withFileTypes: true })) {\n\t\t\tconst path = join(this.directory, entry.name);\n\t\t\tif ((entry.isDirectory() || entry.isSymbolicLink()) && !this.exactDirectory) {\n\t\t\t\tconst children = await readdir(path, { withFileTypes: true }).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\t\tif (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\") return [];\n\t\t\t\t\tif (options.skipUnreadableDirectories && (cause.code === \"EACCES\" || cause.code === \"EPERM\")) return [];\n\t\t\t\t\tthrow cause;\n\t\t\t\t});\n\t\t\t\tfor (const child of children) {\n\t\t\t\t\tif (child.isFile() && child.name.endsWith(\".jsonl\")) paths.push(join(path, child.name));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) paths.push(path);\n\t\t}\n\t\treturn paths;\n\t}\n\n\tprivate async locate(sessionId: string): Promise<\n\t\t| {\n\t\t\t\tpath: string;\n\t\t\t\theader: SessionRecordHeader;\n\t\t\t\tstored: StoredSessionHeader;\n\t\t\t\tstats: BigIntStats;\n\t\t\t\tstate: SessionFileState | undefined;\n\t\t }\n\t\t| undefined\n\t> {\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tfor (const path of await this.paths()) {\n\t\t\tconst cached = this.fileStates.get(path);\n\t\t\tlet stored: StoredSessionHeader;\n\t\t\ttry {\n\t\t\t\tstored = await this.readFirstLine(path);\n\t\t\t} catch (cause) {\n\t\t\t\t// Preserve requested-file errors only while its cached inode still owns the path.\n\t\t\t\tif (cached?.headerId === sessionId) {\n\t\t\t\t\tconst stats = await stat(path, { bigint: true });\n\t\t\t\t\tif (cached.identity === `${stats.dev}:${stats.ino}`) throw cause;\n\t\t\t\t\tthis.fileStates.delete(path);\n\t\t\t\t} else if (basename(path).match(/_([0-9a-f]{64})\\.jsonl$/)?.[1] === this.key(sessionId)) {\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t\t// An unidentifiable file cannot block lookup of unrelated sessions.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (cached && cached.headerId !== stored.id) this.fileStates.delete(path);\n\t\t\tif (stored.id !== sessionId) continue;\n\t\t\tconst header = await this.readHeaderAt(path, stored);\n\t\t\tconst stats = await stat(path, { bigint: true });\n\t\t\tconst state = this.fileStates.get(path);\n\t\t\t// Keep same-ID baselines only as conflict evidence: forWrite checks the current inode\n\t\t\t// and rejects structural changes until an explicit load establishes a new baseline.\n\t\t\treturn { path, header, stored, stats, state };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate key(sessionId: string): string {\n\t\treturn createHash(\"sha256\").update(sessionId).digest(\"hex\");\n\t}\n\n\tprivate async readFirstLine(path: string, chunkBytes = 1): Promise<StoredSessionHeader> {\n\t\tconst file = await open(path, \"r\");\n\t\ttry {\n\t\t\tconst chunks: Buffer[] = [];\n\t\t\tconst buffer = Buffer.alloc(chunkBytes);\n\t\t\twhile (true) {\n\t\t\t\tconst { bytesRead } = await file.read(buffer, 0, buffer.length, null);\n\t\t\t\tif (!bytesRead) break;\n\t\t\t\tconst newline = buffer.subarray(0, bytesRead).indexOf(10);\n\t\t\t\tchunks.push(Buffer.from(buffer.subarray(0, newline === -1 ? bytesRead : newline)));\n\t\t\t\tif (newline !== -1) break;\n\t\t\t}\n\t\t\tconst value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as JsonValue;\n\t\t\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t\t\t? (value as StoredSessionHeader)\n\t\t\t\t: {};\n\t\t} finally {\n\t\t\tawait file.close();\n\t\t}\n\t}\n\n\tprivate async readHeaderAt(path: string, stored?: StoredSessionHeader): Promise<SessionRecordHeader> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst { type: _type, ...header } = isCurrentSessionHeader(stored)\n\t\t\t? (stored as SessionRecordHeader & { type: \"session\" })\n\t\t\t: upgradeLegacySessionHeader(stored, path);\n\t\tif (\n\t\t\t_type !== \"session\" ||\n\t\t\ttypeof header.id !== \"string\" ||\n\t\t\ttypeof header.cwd !== \"string\" ||\n\t\t\ttypeof header.createdAt !== \"string\"\n\t\t) {\n\t\t\tthrow new SessionFormatVersionError(path, stored.version);\n\t\t}\n\t\tvalidateSessionHeader(header);\n\t\treturn header;\n\t}\n\n\tprivate async readSnapshot(\n\t\tpath: string,\n\t\tstored?: StoredSessionHeader,\n\t\tpersistUpgrade = false,\n\t): Promise<SessionSnapshot> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst header = await this.readHeaderAt(path, stored);\n\t\tconst input = createReadStream(path);\n\t\tlet witness: Buffer = Buffer.alloc(0);\n\t\tlet terminated = false;\n\t\tinput.on(\"data\", (chunk: string | Buffer) => {\n\t\t\tconst bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n\t\t\twitness = Buffer.from(Buffer.concat([witness, bytes]).subarray(-64));\n\t\t\tterminated = bytes.at(-1) === 10;\n\t\t});\n\t\tconst lines = createInterface({ input, crlfDelay: Infinity });\n\t\tconst entries: SessionEntry[] = [];\n\t\tlet first = true;\n\t\ttry {\n\t\t\tfor await (const line of lines) {\n\t\t\t\tif (first) {\n\t\t\t\t\tfirst = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (line.trim()) entries.push(JSON.parse(line) as SessionEntry);\n\t\t\t}\n\t\t} finally {\n\t\t\tlines.close();\n\t\t\tinput.destroy();\n\t\t}\n\t\tif (!isCurrentSessionHeader(stored)) {\n\t\t\tconst upgraded = upgradeLegacySessionEntries(stored, entries, path).entries;\n\t\t\tvalidateSessionEntryStructure(upgraded, path);\n\t\t\tvalidateSessionEntries(upgraded);\n\t\t\tif (persistUpgrade) await this.commit(path, header, upgraded);\n\t\t\treturn { header, entries: upgraded, lastSeq: upgraded.length };\n\t\t}\n\t\tvalidateSessionEntryStructure(entries, path);\n\t\tvalidateSessionEntries(entries);\n\t\tawait this.remember(path, {\n\t\t\theaderStamp: JSON.stringify(header),\n\t\t\theaderId: header.id,\n\t\t\tlastSeq: entries.length,\n\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\twitness,\n\t\t\tterminated,\n\t\t});\n\t\treturn { header, entries, lastSeq: entries.length };\n\t}\n\n\tprivate stamp(stats: BigIntStats): string {\n\t\treturn `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeNs}:${stats.ctimeNs}`;\n\t}\n\n\tprivate contentState(\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\tcontent: string,\n\t): Omit<SessionFileState, \"stamp\" | \"identity\" | \"size\"> {\n\t\treturn {\n\t\t\theaderStamp: JSON.stringify(header),\n\t\t\tlastSeq: entries.length,\n\t\t\theaderId: header.id,\n\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\tterminated: content.endsWith(\"\\n\"),\n\t\t\twitness: Buffer.from(Buffer.from(content).subarray(-64)),\n\t\t};\n\t}\n\n\tprivate async remember(path: string, state: Omit<SessionFileState, \"stamp\" | \"identity\" | \"size\">): Promise<void> {\n\t\tconst stats = await stat(path, { bigint: true });\n\t\tthis.fileStates.set(path, {\n\t\t\t...state,\n\t\t\tstamp: this.stamp(stats),\n\t\t\tidentity: `${stats.dev}:${stats.ino}`,\n\t\t\tsize: Number(stats.size),\n\t\t});\n\t}\n\n\t/**\n\t * Foreign appends read only the header, at most 64 known boundary bytes, and new bytes.\n\t * The witness detects a changed append boundary, not arbitrary edits in old history.\n\t * Structural changes require an explicit load; they never trigger a hidden full reread.\n\t */\n\tprivate async forWrite(\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ path: string; state: SessionFileState }> {\n\t\tconst located = await this.locate(sessionId);\n\t\tif (!located) throw new SessionNotFoundError(sessionId);\n\t\tconst { path, header, stored, stats } = located;\n\t\tif (!isCurrentSessionHeader(stored)) throw new SessionFormatVersionError(path, stored.version);\n\t\tlet state = located.state;\n\t\tif (!state) {\n\t\t\tawait this.readSnapshot(path);\n\t\t\tstate = this.fileStates.get(path)!;\n\t\t} else {\n\t\t\tconst lastSeq = state.lastSeq;\n\t\t\tconst stale = () => new SessionConflictError(sessionId, options.expectSeq, lastSeq);\n\t\t\tif (\n\t\t\t\tstate.identity !== `${stats.dev}:${stats.ino}` ||\n\t\t\t\tstate.headerStamp !== JSON.stringify(header) ||\n\t\t\t\tNumber(stats.size) < state.size\n\t\t\t)\n\t\t\t\tthrow stale();\n\t\t\tif (state.stamp !== this.stamp(stats)) {\n\t\t\t\tconst file = await open(path, \"r\");\n\t\t\t\tconst offset = state.size - state.witness.length;\n\t\t\t\tconst bytes = Buffer.alloc(Number(stats.size) - offset);\n\t\t\t\ttry {\n\t\t\t\t\tlet read = 0;\n\t\t\t\t\twhile (read < bytes.length) {\n\t\t\t\t\t\tconst { bytesRead } = await file.read(bytes, read, bytes.length - read, offset + read);\n\t\t\t\t\t\tif (!bytesRead) throw stale();\n\t\t\t\t\t\tread += bytesRead;\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tawait file.close();\n\t\t\t\t}\n\t\t\t\tif (!bytes.subarray(0, state.witness.length).equals(state.witness)) throw stale();\n\t\t\t\tlet appended = bytes.subarray(state.witness.length).toString(\"utf8\");\n\t\t\t\tif (appended && !state.terminated) {\n\t\t\t\t\tif (!appended.startsWith(\"\\n\")) throw stale();\n\t\t\t\t\tappended = appended.slice(1);\n\t\t\t\t}\n\t\t\t\tconst lines = appended.split(\"\\n\");\n\t\t\t\tif (lines.at(-1) === \"\") lines.pop();\n\t\t\t\tconst entries = lines.map((line) => JSON.parse(line) as SessionEntry);\n\t\t\t\tvalidateSessionEntryStructure(entries, path);\n\t\t\t\tvalidateSessionEntries(entries);\n\t\t\t\tstate = {\n\t\t\t\t\t...state,\n\t\t\t\t\tstamp: this.stamp(stats),\n\t\t\t\t\tsize: Number(stats.size),\n\t\t\t\t\tlastSeq: state.lastSeq + entries.length,\n\t\t\t\t\tlastEntryId: entries.at(-1)?.id ?? state.lastEntryId,\n\t\t\t\t\tterminated: bytes.at(-1) === 10,\n\t\t\t\t\twitness: Buffer.from(bytes.subarray(-64)),\n\t\t\t\t};\n\t\t\t\tthis.fileStates.set(path, state);\n\t\t\t}\n\t\t}\n\t\tif (state.lastSeq !== options.expectSeq)\n\t\t\tthrow new SessionConflictError(sessionId, options.expectSeq, state.lastSeq);\n\t\treturn { path, state };\n\t}\n\n\tprivate encode(header: SessionRecordHeader, entries: readonly SessionEntry[]): string {\n\t\treturn `${[JSON.stringify({ type: \"session\", ...header }), ...entries.map((entry) => JSON.stringify(entry))].join(\"\\n\")}\\n`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"jsonl-session-store.js","sourceRoot":"","sources":["../../../../src/core/storage/session/jsonl-session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAoB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EACN,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,OAAO,EACP,MAAM,EACN,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACN,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,4BAA4B,EAE5B,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,sBAAsB,EAEtB,2BAA2B,EAC3B,0BAA0B,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAUxD,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAgBrG,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAQzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAC1C,QAAQ,CAAS;IACR,KAAK,CAAQ;IACtB,aAAa,CAAQ;IAE9B,YAAY,QAAgB,EAAE,KAAY,EAAE,aAAoB;QAC/D,KAAK,CAAC,yCAAyC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;CACD;AAED,MAAM,OAAO,iBAAiB;IACrB,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IACzC,MAAM,GAAG,KAAK,CAAC;IACf,QAAQ,CAAkE;IACjE,SAAS,CAAS;IAClB,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEjD,cAAc,CAAU;IAEzC,YAAoB,SAAiB,EAAE,cAAuB;QAC7D,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAChB,SAAiB,EACjB,OAA8D;QAE9D,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,SAAS,EAAE,OAAO,EAAE,cAAc,KAAK,IAAI,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzF,IAAI,OAAO,EAAE,YAAY,KAAK,KAAK,EAAE,CAAC;YACrC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC1B,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;oBACxC,IAAI,CAAC;wBACJ,MAAM,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAChC,CAAC;oBAAC,MAAM,CAAC;wBACR,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC/B,CAAC;gBACF,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,WAAW,CAAC,MAA2B;QACtC,MAAM,WAAW,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1C,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc;YAClC,CAAC,CAAC,IAAI,CAAC,SAAS;YAChB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7G,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC;IAED,IAAI,UAAU;QACb,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACvD,CAAC;IAED,MAAM,CACL,MAA2B,EAC3B,OAAgC,EAChC,QAAiB;QAEjB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;YAChD,IAAI,CAAC;gBACJ,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpD,IAAI,CAAC;oBACJ,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAChG,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC;oBAAS,CAAC;gBACV,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;oBAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;wBAAE,MAAM,KAAK,CAAC;gBAC1C,CAAC,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,CAAC,EAAE,IAAI,CAAC,CAAC;IACV,CAAC;IAED,MAAM,CACL,SAAiB,EACjB,OAAgC,EAChC,OAA4B;QAE5B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAChE,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAC5D,IAAI,OAAO,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9E,IAAI,CAAC,KAAK,CAAC,UAAU;gBAAE,OAAO,GAAG,KAAK,OAAO,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;YAC1B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;gBAC1D,MAAM,QAAQ,CACb,IAAI,EACJ,GAAG,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,UAAU,EAAE,cAAc,CACvF,CAAC;YACH,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC;oBACJ,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC9B,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,yBAAyB,CAAC,IAAI,EAAE,KAAc,EAAE,aAAsB,CAAC,CAAC;oBAC5F,MAAM,IAAI,CAAC,QAAQ,CAAC;gBACrB,CAAC;gBACD,MAAM,KAAK,CAAC;YACb,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;YAC/C,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACzB,GAAG,KAAK;gBACR,OAAO;gBACP,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC/B,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;aACxF,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CACN,SAAiB,EACjB,MAA2B,EAC3B,OAAgC,EAChC,OAA4B;QAE5B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACzD,qBAAqB,CAAC,MAAM,CAAC,CAAC;YAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS;gBAAE,MAAM,IAAI,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACpF,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAA2B,EAAE,OAAgC;QAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;QAChD,IAAI,CAAC;YACJ,MAAM,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACV,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;gBAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAC1C,CAAC,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,CAAC,SAAiB;QACrB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,MAA4B;QACrE,MAAM,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,sBAAsB,CAAC,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACjH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7F,CAAC;IAED,QAAQ,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,UAAU,CAAC,SAAiB;QAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC;QAC/C,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,SAAiB;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;YAC1F,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,IAAI,KAAK;oBAAE,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACrD,OAAO;YACR,CAAC;YACD,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,KAAuB;QAClC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAC7B,KAAK,IAAI,EAAE;gBACV,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAC7C,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC;wBAAE,OAAO,SAAS,CAAC;oBAC5D,IAAI,CAAC,KAAK,CAAC,eAAe,IAAI,MAAM,CAAC,QAAQ;wBAAE,OAAO,SAAS,CAAC;oBAChE,OAAO,EAAE,GAAG,gBAAgB,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAC/E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,KAAK,GAAG,KAA8B,CAAC;oBAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;wBAAE,OAAO,SAAS,CAAC;oBACnG,IACC,KAAK,YAAY,yBAAyB;wBAC1C,KAAK,YAAY,uBAAuB;wBACxC,KAAK,YAAY,4BAA4B;wBAC7C,KAAK,YAAY,WAAW;wBAE5B,OAAO,SAAS,CAAC;oBAClB,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC,EACD,IAAI,EACJ,KAAK,CAAC,MAAM,CACZ,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,OAAO;gBAAE,MAAM,OAAO,CAAC;QAC5B,CAAC;QACD,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAED,KAAK,CAAC,CAAC,SAAS;QACf,KAAK,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;YACrG,IAAI,MAA2B,CAAC;YAChC,IAAI,CAAC;gBACJ,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CACtB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC,EACxG,KAAK,CACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACR,SAAS;YACV,CAAC;YACD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;QAC5F,CAAC;IACF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,KAGpB;QACA,IAAI,MAAkC,CAAC;QACvC,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;gBAAE,MAAM,GAAG,OAAO,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAEO,GAAG,CAAI,SAA2B,EAAE,MAAM,GAAG,IAAI,EAAE,MAAoB;QAC9E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;YACzC,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;YACvC,IAAI,CAAC;gBACJ,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACzE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IACC,KAAK,YAAY,oBAAoB;oBACrC,KAAK,YAAY,kBAAkB;oBACnC,KAAK,YAAY,oBAAoB;oBACrC,KAAK,YAAY,sBAAsB;oBACvC,KAAK,YAAY,uBAAuB;oBACxC,KAAK,YAAY,4BAA4B;oBAC7C,KAAK,YAAY,yBAAyB;oBAC1C,KAAK,YAAY,yBAAyB;oBAC1C,KAAK,YAAY,YAAY;oBAE7B,MAAM,KAAK,CAAC;gBACb,MAAM,IAAI,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAc,CAAC,CAAC;YACpE,CAAC;QACF,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CACvB,GAAG,EAAE,GAAE,CAAC,EACR,GAAG,EAAE,GAAE,CAAC,CACR,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,SAAS,CACtB,SAA2B,EAC3B,MAAoB,EACpB,SAAS,GAAG,IAAI,CAAC,SAAS;QAE1B,IAAI,OAA4B,CAAC;QACjC,SAAS,CAAC;YACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,CAAC;gBACJ,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;oBACxC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC;oBAC9C,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE;wBACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;oBACrE,CAAC;iBACD,CAAC,CAAC;gBACH,MAAM;YACP,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,SAAS;oBAAE,MAAM,KAAK,CAAC;gBACrE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YAChB,CAAC;QACF,CAAC;QACD,IAAI,CAAC;YACJ,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC;YACvC,OAAO,MAAM,CAAC;QACf,CAAC;gBAAS,CAAC;YACV,MAAM,OAAO,EAAE,CAAC;QACjB,CAAC;IACF,CAAC;IAEO,UAAU,CAAC,MAAoB;QACtC,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAAO,GAAqD,EAAE;QACjF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC7E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;oBACpG,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;wBAAE,OAAO,EAAE,CAAC;oBACnE,IAAI,OAAO,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;wBAAE,OAAO,EAAE,CAAC;oBACxG,MAAM,KAAK,CAAC;gBACb,CAAC,CAAC,CAAC;gBACH,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;oBAC9B,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACzF,CAAC;YACF,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,SAAiB;QAUrC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,KAAwB;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,MAA2B,CAAC;YAChC,IAAI,CAAC;gBACJ,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,kFAAkF;gBAClF,IAAI,MAAM,EAAE,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;oBACjD,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;wBAAE,MAAM,KAAK,CAAC;oBACjE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;qBAAM,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzF,MAAM,KAAK,CAAC;gBACb,CAAC;gBACD,oEAAoE;gBACpE,SAAS;YACV,CAAC;YACD,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE;gBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1E,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS;gBAAE,SAAS;YACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,sFAAsF;YACtF,oFAAoF;YACpF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,SAAiB;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;gBAAE,SAAS;YAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,MAAM,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC/G,IAAI,MAA2B,CAAC;YAChC,IAAI,CAAC;gBACJ,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACrF,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7B,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC;IAClB,CAAC;IAEO,GAAG,CAAC,SAAiB;QAC5B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,UAAU,GAAG,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxC,OAAO,IAAI,EAAE,CAAC;gBACb,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACtE,IAAI,CAAC,SAAS;oBAAE,MAAM;gBACtB,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAI,OAAO,KAAK,CAAC,CAAC;oBAAE,MAAM;YAC3B,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAc,CAAC;YAC9E,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC1E,CAAC,CAAE,KAA6B;gBAChC,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;gBAAS,CAAC;YACV,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,MAA4B;QACpE,MAAM,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,sBAAsB,CAAC,MAAM,CAAC;YAChE,CAAC,CAAE,MAAoD;YACvD,CAAC,CAAC,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5C,IACC,KAAK,KAAK,SAAS;YACnB,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;YAC7B,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YAC9B,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EACnC,CAAC;YACF,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3D,CAAC;QACD,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,YAAY,CACzB,IAAY,EACZ,MAA4B,EAC5B,cAAc,GAAG,KAAK;QAEtB,MAAM,KAAK,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,GAAW,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACrE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrE,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACJ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACX,KAAK,GAAG,KAAK,CAAC;oBACd,SAAS;gBACV,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;YACjE,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,2BAA2B,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC;YAC5E,6BAA6B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC9C,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACjC,IAAI,cAAc;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC9D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAChE,CAAC;QACD,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7C,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACzB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,OAAO;YACP,UAAU;SACV,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,KAAkB;QAC/B,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;IACpF,CAAC;IAEO,YAAY,CACnB,MAA2B,EAC3B,OAAgC,EAChC,OAAe;QAEf,OAAO;YACN,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YACnC,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;SACxD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,KAA4D;QAChG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE;YACzB,GAAG,KAAK;YACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;YACxB,QAAQ,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;YACrC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SACxB,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,QAAQ,CACrB,SAAiB,EACjB,OAA4B;QAE5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;QAChD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/F,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QACpC,CAAC;aAAM,CAAC;YACP,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACpF,IACC,KAAK,CAAC,QAAQ,KAAK,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;gBAC9C,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;gBAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI;gBAE/B,MAAM,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBACnC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;gBACxD,IAAI,CAAC;oBACJ,IAAI,IAAI,GAAG,CAAC,CAAC;oBACb,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;wBAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;wBACvF,IAAI,CAAC,SAAS;4BAAE,MAAM,KAAK,EAAE,CAAC;wBAC9B,IAAI,IAAI,SAAS,CAAC;oBACnB,CAAC;gBACF,CAAC;wBAAS,CAAC;oBACV,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;oBAAE,MAAM,KAAK,EAAE,CAAC;gBAClF,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrE,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;oBACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;wBAAE,MAAM,KAAK,EAAE,CAAC;oBAC9C,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBAAE,KAAK,CAAC,GAAG,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC,CAAC;gBACtE,6BAA6B,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAC7C,sBAAsB,CAAC,OAAO,CAAC,CAAC;gBAChC,KAAK,GAAG;oBACP,GAAG,KAAK;oBACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;oBACxB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxB,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM;oBACvC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,WAAW;oBACpD,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBAC/B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;iBACzC,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACF,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS;YACtC,MAAM,IAAI,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACxB,CAAC;IAEO,MAAM,CAAC,MAA2B,EAAE,OAAgC;QAC3E,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IAC7H,CAAC;CACD","sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport { type BigIntStats, createReadStream } from \"node:fs\";\nimport {\n\tappendFile,\n\tcopyFile,\n\tlink,\n\tmkdir,\n\topen,\n\treaddir,\n\trename,\n\tstat,\n\ttruncate,\n\tunlink,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport lockfile from \"proper-lockfile\";\nimport { createSessionCwdMatcher } from \"../../../utils/canonical-path.ts\";\nimport type { SessionEntry } from \"../../session-manager-types.ts\";\nimport { validateSessionEntryStructure } from \"./entry-structure.js\";\nimport {\n\tSessionConflictError,\n\tSessionExistsError,\n\tSessionFormatVersionError,\n\tSessionIdMismatchError,\n\tSessionInvalidTextError,\n\tSessionInvalidTimestampError,\n\ttype SessionJsonValue,\n\tSessionNotFoundError,\n\tStorageUnavailableError,\n\tStoreClosedError,\n} from \"./errors.js\";\nimport {\n\tisCurrentSessionHeader,\n\ttype StoredSessionHeader,\n\tupgradeLegacySessionEntries,\n\tupgradeLegacySessionHeader,\n} from \"./legacy-format.js\";\nimport { summarizeSession } from \"./session-summary.js\";\nimport type {\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\ninterface SessionFileState {\n\treadonly stamp: string;\n\treadonly identity: string;\n\treadonly headerStamp: string;\n\treadonly headerId: string;\n\treadonly lastEntryId: string | undefined;\n\treadonly witness: Buffer;\n\treadonly size: number;\n\treadonly lastSeq: number;\n\treadonly terminated: boolean;\n}\n\ntype JsonValue = SessionJsonValue;\n\nconst SCAN_FIRST_LINE_CHUNK_BYTES = 4096;\n\nexport interface JsonlSessionFile {\n\treadonly location: string;\n\treadonly header: SessionRecordHeader;\n\tread(): Promise<SessionSnapshot>;\n}\n\nexport { SessionFormatVersionError } from \"./errors.js\";\n\nexport class JsonlStoragePoisonedError extends Error {\n\treadonly location: string;\n\toverride readonly cause: Error;\n\treadonly rollbackCause: Error;\n\n\tconstructor(location: string, cause: Error, rollbackCause: Error) {\n\t\tsuper(`Session append and rollback failed at ${location}`, { cause });\n\t\tthis.name = \"JsonlStoragePoisonedError\";\n\t\tthis.location = location;\n\t\tthis.cause = cause;\n\t\tthis.rollbackCause = rollbackCause;\n\t}\n}\n\nexport class JsonlSessionStore implements SessionStore {\n\tprivate queue: Promise<void> = Promise.resolve();\n\tprivate closed = false;\n\tprivate poisoned: JsonlStoragePoisonedError | StorageUnavailableError | undefined;\n\tprivate readonly directory: string;\n\tprivate readonly fileStates = new Map<string, SessionFileState>();\n\n\tprivate readonly exactDirectory: boolean;\n\n\tprivate constructor(directory: string, exactDirectory: boolean) {\n\t\tthis.exactDirectory = exactDirectory;\n\t\tthis.directory = resolve(directory);\n\t}\n\n\tstatic async open(\n\t\tdirectory: string,\n\t\toptions?: { exactDirectory?: boolean; scanExisting?: boolean },\n\t): Promise<JsonlSessionStore> {\n\t\tconst store = new JsonlSessionStore(directory, options?.exactDirectory === true);\n\t\tawait store.run(() => mkdir(store.directory, { recursive: true }).then(() => {}), false);\n\t\tif (options?.scanExisting !== false) {\n\t\t\tawait store.run(async () => {\n\t\t\t\tfor (const path of await store.paths()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait store.readSnapshot(path);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tstore.fileStates.delete(path);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn store;\n\t}\n\n\tlocationFor(header: SessionRecordHeader): string {\n\t\tconst projectName = `--${resolve(header.cwd)\n\t\t\t.replace(/^[/\\\\]/, \"\")\n\t\t\t.replace(/[/\\\\:]/g, \"-\")}--`;\n\t\tconst project = this.exactDirectory\n\t\t\t? this.directory\n\t\t\t: join(this.directory, Buffer.byteLength(projectName) <= 180 ? projectName : `--${this.key(header.cwd)}--`);\n\t\treturn join(project, `${header.createdAt.replace(/[:.]/g, \"-\")}_${this.key(header.id)}.jsonl`);\n\t}\n\n\tget descriptor(): StorageDescriptor {\n\t\treturn { adapter: \"jsonl\", location: this.directory };\n\t}\n\n\tcreate(\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\tlocation?: string,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\treturn this.run(async () => {\n\t\t\tvalidateSessionHeader(header);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tconst existing = await this.locate(header.id);\n\t\t\tif (existing) throw new SessionExistsError(header.id);\n\t\t\tconst payload = this.encode(header, entries);\n\t\t\tconst path = location === undefined ? this.locationFor(header) : resolve(location);\n\t\t\tawait mkdir(resolve(path, \"..\"), { recursive: true });\n\t\t\tconst temporary = `${path}.${randomUUID()}.tmp`;\n\t\t\ttry {\n\t\t\t\tawait writeFile(temporary, payload, { flag: \"wx\" });\n\t\t\t\ttry {\n\t\t\t\t\tawait link(temporary, path);\n\t\t\t\t} catch (cause) {\n\t\t\t\t\tif ((cause as NodeJS.ErrnoException).code === \"EEXIST\") throw new SessionExistsError(header.id);\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tawait unlink(temporary).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\t\tif (cause.code !== \"ENOENT\") throw cause;\n\t\t\t\t});\n\t\t\t}\n\t\t\tawait this.remember(path, this.contentState(header, entries, payload));\n\t\t\treturn { lastSeq: entries.length };\n\t\t}, true);\n\t}\n\n\tappend(\n\t\tsessionId: string,\n\t\tentries: readonly SessionEntry[],\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ readonly lastSeq: number }> {\n\t\treturn this.run(async () => {\n\t\t\tconst { path, state } = await this.forWrite(sessionId, options);\n\t\t\tvalidateSessionEntries(entries);\n\t\t\tif (entries.length === 0) return { lastSeq: state.lastSeq };\n\t\t\tlet payload = `${entries.map((entry) => JSON.stringify(entry)).join(\"\\n\")}\\n`;\n\t\t\tif (!state.terminated) payload = `\\n${payload}`;\n\t\t\tconst offset = state.size;\n\t\t\tif (entries.some((entry) => entry.type === \"compaction\")) {\n\t\t\t\tawait copyFile(\n\t\t\t\t\tpath,\n\t\t\t\t\t`${path}.${new Date().toISOString().replace(/[:.]/g, \"-\")}.${randomUUID()}.compact.bak`,\n\t\t\t\t);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait appendFile(path, payload);\n\t\t\t} catch (cause) {\n\t\t\t\ttry {\n\t\t\t\t\tawait truncate(path, offset);\n\t\t\t\t} catch (rollbackCause) {\n\t\t\t\t\tthis.poisoned = new JsonlStoragePoisonedError(path, cause as Error, rollbackCause as Error);\n\t\t\t\t\tthrow this.poisoned;\n\t\t\t\t}\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t\tconst lastSeq = state.lastSeq + entries.length;\n\t\t\tawait this.remember(path, {\n\t\t\t\t...state,\n\t\t\t\tlastSeq,\n\t\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\t\tterminated: true,\n\t\t\t\twitness: Buffer.from(Buffer.concat([state.witness, Buffer.from(payload)]).subarray(-64)),\n\t\t\t});\n\t\t\treturn { lastSeq };\n\t\t});\n\t}\n\n\treplace(\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\treturn this.run(async () => {\n\t\t\tconst { path } = await this.forWrite(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 this.commit(path, header, entries);\n\t\t\treturn { lastSeq: entries.length };\n\t\t});\n\t}\n\n\tprivate async commit(path: string, header: SessionRecordHeader, entries: readonly SessionEntry[]): Promise<void> {\n\t\tconst payload = this.encode(header, entries);\n\t\tconst temporary = `${path}.${randomUUID()}.tmp`;\n\t\ttry {\n\t\t\tawait writeFile(temporary, payload, { flag: \"wx\" });\n\t\t\tawait rename(temporary, path);\n\t\t} finally {\n\t\t\tawait unlink(temporary).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\tif (cause.code !== \"ENOENT\") throw cause;\n\t\t\t});\n\t\t}\n\t\tawait this.remember(path, this.contentState(header, entries, payload));\n\t}\n\n\tload(sessionId: string): Promise<SessionSnapshot> {\n\t\treturn this.run(async () => {\n\t\t\tconst located = await this.locate(sessionId);\n\t\t\tif (!located) throw new SessionNotFoundError(sessionId);\n\t\t\treturn this.readPersisted(located.path, located.stored);\n\t\t});\n\t}\n\n\tloadFile(path: string): Promise<SessionSnapshot> {\n\t\treturn this.run(() => this.readPersisted(resolve(path)));\n\t}\n\n\tprivate async readPersisted(path: string, stored?: StoredSessionHeader): Promise<SessionSnapshot> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst directory = dirname(path);\n\t\tif (isCurrentSessionHeader(stored) || directory === this.directory) return this.readSnapshot(path, stored, true);\n\t\treturn this.exclusive(() => this.readSnapshot(path, undefined, true), undefined, directory);\n\t}\n\n\tfindFile(sessionId: string): Promise<string | undefined> {\n\t\treturn this.run(async () => (await this.locate(sessionId))?.path);\n\t}\n\n\treadHeader(sessionId: string): Promise<SessionRecordHeader | undefined> {\n\t\treturn this.run(async () => {\n\t\t\treturn (await this.locate(sessionId))?.header;\n\t\t});\n\t}\n\n\tdelete(sessionId: string): Promise<void> {\n\t\treturn this.run(async () => {\n\t\t\tconst known = [...this.fileStates.values()].some((state) => state.headerId === sessionId);\n\t\t\tconst located = await this.locate(sessionId);\n\t\t\tif (!located) {\n\t\t\t\tif (known) throw new SessionNotFoundError(sessionId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait unlink(located.path);\n\t\t\tthis.fileStates.delete(located.path);\n\t\t});\n\t}\n\n\tasync *list(query: SessionListQuery): AsyncIterable<SessionSummary> {\n\t\tthis.checkAbort(query.signal);\n\t\tconst matchesCwd = query.cwd === undefined ? undefined : createSessionCwdMatcher(query.cwd);\n\t\tconst paths = await this.run(() => this.paths(), true, query.signal);\n\t\tfor (const path of paths) {\n\t\t\tconst summary = await this.run(\n\t\t\t\tasync () => {\n\t\t\t\t\tthis.checkAbort(query.signal);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst header = await this.readHeaderAt(path);\n\t\t\t\t\t\tif (matchesCwd && !matchesCwd(header.cwd)) return undefined;\n\t\t\t\t\t\tif (!query.includeInternal && header.internal) return undefined;\n\t\t\t\t\t\treturn { ...summarizeSession(await this.readSnapshot(path)), location: path };\n\t\t\t\t\t} catch (cause) {\n\t\t\t\t\t\tconst error = cause as NodeJS.ErrnoException;\n\t\t\t\t\t\tif (error.path === path && (error.code === \"ENOENT\" || error.code === \"ENOTDIR\")) return undefined;\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcause instanceof SessionFormatVersionError ||\n\t\t\t\t\t\t\tcause instanceof SessionInvalidTextError ||\n\t\t\t\t\t\t\tcause instanceof SessionInvalidTimestampError ||\n\t\t\t\t\t\t\tcause instanceof SyntaxError\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\tthrow cause;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\ttrue,\n\t\t\t\tquery.signal,\n\t\t\t);\n\t\t\tthis.checkAbort(query.signal);\n\t\t\tif (summary) yield summary;\n\t\t}\n\t\tawait this.run(async () => this.checkAbort(query.signal), true, query.signal);\n\t}\n\n\tasync *scanFiles(): AsyncIterable<JsonlSessionFile> {\n\t\tfor (const location of await this.run(() => this.paths({ skipUnreadableDirectories: true }), false)) {\n\t\t\tlet header: SessionRecordHeader;\n\t\t\ttry {\n\t\t\t\theader = await this.run(\n\t\t\t\t\tasync () => this.readHeaderAt(location, await this.readFirstLine(location, SCAN_FIRST_LINE_CHUNK_BYTES)),\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tyield { location, header, read: () => this.run(() => this.readSnapshot(location), false) };\n\t\t}\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\tclose(): Promise<void> {\n\t\tif (this.closed) return Promise.reject(new StoreClosedError(this.descriptor));\n\t\tthis.closed = true;\n\t\treturn this.queue;\n\t}\n\n\tprivate run<T>(operation: () => Promise<T>, locked = true, signal?: AbortSignal): Promise<T> {\n\t\tif (this.closed) return Promise.reject(new StoreClosedError(this.descriptor));\n\t\tconst result = this.queue.then(async () => {\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\ttry {\n\t\t\t\treturn await (locked ? this.exclusive(operation, signal) : operation());\n\t\t\t} catch (cause) {\n\t\t\t\tif (\n\t\t\t\t\tcause instanceof SessionConflictError ||\n\t\t\t\t\tcause instanceof SessionExistsError ||\n\t\t\t\t\tcause instanceof SessionNotFoundError ||\n\t\t\t\t\tcause instanceof SessionIdMismatchError ||\n\t\t\t\t\tcause instanceof SessionInvalidTextError ||\n\t\t\t\t\tcause instanceof SessionInvalidTimestampError ||\n\t\t\t\t\tcause instanceof SessionFormatVersionError ||\n\t\t\t\t\tcause instanceof JsonlStoragePoisonedError ||\n\t\t\t\t\tcause instanceof DOMException\n\t\t\t\t)\n\t\t\t\t\tthrow cause;\n\t\t\t\tthrow new StorageUnavailableError(this.descriptor, cause as Error);\n\t\t\t}\n\t\t});\n\t\tthis.queue = result.then(\n\t\t\t() => {},\n\t\t\t() => {},\n\t\t);\n\t\treturn result;\n\t}\n\n\tprivate async exclusive<T>(\n\t\toperation: () => Promise<T>,\n\t\tsignal?: AbortSignal,\n\t\tdirectory = this.directory,\n\t): Promise<T> {\n\t\tlet release: () => Promise<void>;\n\t\tfor (;;) {\n\t\t\tthis.checkAbort(signal);\n\t\t\ttry {\n\t\t\t\trelease = await lockfile.lock(directory, {\n\t\t\t\t\tlockfilePath: join(directory, \".session.lock\"),\n\t\t\t\t\tonCompromised: (cause) => {\n\t\t\t\t\t\tthis.poisoned = new StorageUnavailableError(this.descriptor, cause);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t} catch (cause) {\n\t\t\t\tif ((cause as NodeJS.ErrnoException).code !== \"ELOCKED\") throw cause;\n\t\t\t\tawait delay(5);\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tthis.checkAbort(signal);\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\tconst result = await operation();\n\t\t\tif (this.poisoned) throw this.poisoned;\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tawait release();\n\t\t}\n\t}\n\n\tprivate checkAbort(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) throw new DOMException(\"Session listing aborted\", \"AbortError\");\n\t}\n\n\tprivate async paths(options: { readonly skipUnreadableDirectories?: boolean } = {}): Promise<string[]> {\n\t\tconst paths: string[] = [];\n\t\tfor (const entry of await readdir(this.directory, { withFileTypes: true })) {\n\t\t\tconst path = join(this.directory, entry.name);\n\t\t\tif ((entry.isDirectory() || entry.isSymbolicLink()) && !this.exactDirectory) {\n\t\t\t\tconst children = await readdir(path, { withFileTypes: true }).catch((cause: NodeJS.ErrnoException) => {\n\t\t\t\t\tif (cause.code === \"ENOENT\" || cause.code === \"ENOTDIR\") return [];\n\t\t\t\t\tif (options.skipUnreadableDirectories && (cause.code === \"EACCES\" || cause.code === \"EPERM\")) return [];\n\t\t\t\t\tthrow cause;\n\t\t\t\t});\n\t\t\t\tfor (const child of children) {\n\t\t\t\t\tif (child.isFile() && child.name.endsWith(\".jsonl\")) paths.push(join(path, child.name));\n\t\t\t\t}\n\t\t\t} else if (entry.isFile() && entry.name.endsWith(\".jsonl\")) paths.push(path);\n\t\t}\n\t\treturn paths;\n\t}\n\n\tprivate async locate(sessionId: string): Promise<\n\t\t| {\n\t\t\t\tpath: string;\n\t\t\t\theader: SessionRecordHeader;\n\t\t\t\tstored: StoredSessionHeader;\n\t\t\t\tstats: BigIntStats;\n\t\t\t\tstate: SessionFileState | undefined;\n\t\t }\n\t\t| undefined\n\t> {\n\t\tvalidateSessionText(\"sessionId\", sessionId);\n\t\tconst known = await this.locateKnown(sessionId);\n\t\tif (known) return known;\n\t\tconst suffix = `_${this.key(sessionId)}.jsonl`;\n\t\tconst paths = await this.paths();\n\t\tconst named = paths.filter((path) => basename(path).endsWith(suffix));\n\t\tconst others = paths.filter((path) => !named.includes(path));\n\t\treturn (await this.scan(sessionId, named)) ?? (await this.scan(sessionId, others));\n\t}\n\n\tprivate async scan(sessionId: string, paths: readonly string[]) {\n\t\tfor (const path of paths) {\n\t\t\tconst cached = this.fileStates.get(path);\n\t\t\tlet stored: StoredSessionHeader;\n\t\t\ttry {\n\t\t\t\tstored = await this.readFirstLine(path, SCAN_FIRST_LINE_CHUNK_BYTES);\n\t\t\t} catch (cause) {\n\t\t\t\t// Preserve requested-file errors only while its cached inode still owns the path.\n\t\t\t\tif (cached?.headerId === sessionId) {\n\t\t\t\t\tconst stats = await stat(path, { bigint: true });\n\t\t\t\t\tif (cached.identity === `${stats.dev}:${stats.ino}`) throw cause;\n\t\t\t\t\tthis.fileStates.delete(path);\n\t\t\t\t} else if (basename(path).match(/_([0-9a-f]{64})\\.jsonl$/)?.[1] === this.key(sessionId)) {\n\t\t\t\t\tthrow cause;\n\t\t\t\t}\n\t\t\t\t// An unidentifiable file cannot block lookup of unrelated sessions.\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (cached && cached.headerId !== stored.id) this.fileStates.delete(path);\n\t\t\tif (stored.id !== sessionId) continue;\n\t\t\tconst header = await this.readHeaderAt(path, stored);\n\t\t\tconst stats = await stat(path, { bigint: true });\n\t\t\tconst state = this.fileStates.get(path);\n\t\t\t// Keep same-ID baselines only as conflict evidence: forWrite checks the current inode\n\t\t\t// and rejects structural changes until an explicit load establishes a new baseline.\n\t\t\treturn { path, header, stored, stats, state };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async locateKnown(sessionId: string) {\n\t\tfor (const [path, cached] of this.fileStates) {\n\t\t\tif (cached.headerId !== sessionId) continue;\n\t\t\tconst parent = dirname(path);\n\t\t\tif (parent !== this.directory && (this.exactDirectory || dirname(parent) !== this.directory)) return undefined;\n\t\t\tlet stored: StoredSessionHeader;\n\t\t\ttry {\n\t\t\t\tstored = await this.readFirstLine(path);\n\t\t\t} catch (cause) {\n\t\t\t\tif ((cause as NodeJS.ErrnoException).code === \"ENOENT\") this.fileStates.delete(path);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tif (stored.id !== sessionId) {\n\t\t\t\tthis.fileStates.delete(path);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst header = await this.readHeaderAt(path, stored);\n\t\t\tconst stats = await stat(path, { bigint: true });\n\t\t\treturn { path, header, stored, stats, state: this.fileStates.get(path) };\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate key(sessionId: string): string {\n\t\treturn createHash(\"sha256\").update(sessionId).digest(\"hex\");\n\t}\n\n\tprivate async readFirstLine(path: string, chunkBytes = 1): Promise<StoredSessionHeader> {\n\t\tconst file = await open(path, \"r\");\n\t\ttry {\n\t\t\tconst chunks: Buffer[] = [];\n\t\t\tconst buffer = Buffer.alloc(chunkBytes);\n\t\t\twhile (true) {\n\t\t\t\tconst { bytesRead } = await file.read(buffer, 0, buffer.length, null);\n\t\t\t\tif (!bytesRead) break;\n\t\t\t\tconst newline = buffer.subarray(0, bytesRead).indexOf(10);\n\t\t\t\tchunks.push(Buffer.from(buffer.subarray(0, newline === -1 ? bytesRead : newline)));\n\t\t\t\tif (newline !== -1) break;\n\t\t\t}\n\t\t\tconst value = JSON.parse(Buffer.concat(chunks).toString(\"utf8\")) as JsonValue;\n\t\t\treturn value !== null && typeof value === \"object\" && !Array.isArray(value)\n\t\t\t\t? (value as StoredSessionHeader)\n\t\t\t\t: {};\n\t\t} finally {\n\t\t\tawait file.close();\n\t\t}\n\t}\n\n\tprivate async readHeaderAt(path: string, stored?: StoredSessionHeader): Promise<SessionRecordHeader> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst { type: _type, ...header } = isCurrentSessionHeader(stored)\n\t\t\t? (stored as SessionRecordHeader & { type: \"session\" })\n\t\t\t: upgradeLegacySessionHeader(stored, path);\n\t\tif (\n\t\t\t_type !== \"session\" ||\n\t\t\ttypeof header.id !== \"string\" ||\n\t\t\ttypeof header.cwd !== \"string\" ||\n\t\t\ttypeof header.createdAt !== \"string\"\n\t\t) {\n\t\t\tthrow new SessionFormatVersionError(path, stored.version);\n\t\t}\n\t\tvalidateSessionHeader(header);\n\t\treturn header;\n\t}\n\n\tprivate async readSnapshot(\n\t\tpath: string,\n\t\tstored?: StoredSessionHeader,\n\t\tpersistUpgrade = false,\n\t): Promise<SessionSnapshot> {\n\t\tstored ??= await this.readFirstLine(path);\n\t\tconst header = await this.readHeaderAt(path, stored);\n\t\tconst input = createReadStream(path);\n\t\tlet witness: Buffer = Buffer.alloc(0);\n\t\tlet terminated = false;\n\t\tinput.on(\"data\", (chunk: string | Buffer) => {\n\t\t\tconst bytes = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n\t\t\twitness = Buffer.from(Buffer.concat([witness, bytes]).subarray(-64));\n\t\t\tterminated = bytes.at(-1) === 10;\n\t\t});\n\t\tconst lines = createInterface({ input, crlfDelay: Infinity });\n\t\tconst entries: SessionEntry[] = [];\n\t\tlet first = true;\n\t\ttry {\n\t\t\tfor await (const line of lines) {\n\t\t\t\tif (first) {\n\t\t\t\t\tfirst = false;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (line.trim()) entries.push(JSON.parse(line) as SessionEntry);\n\t\t\t}\n\t\t} finally {\n\t\t\tlines.close();\n\t\t\tinput.destroy();\n\t\t}\n\t\tif (!isCurrentSessionHeader(stored)) {\n\t\t\tconst upgraded = upgradeLegacySessionEntries(stored, entries, path).entries;\n\t\t\tvalidateSessionEntryStructure(upgraded, path);\n\t\t\tvalidateSessionEntries(upgraded);\n\t\t\tif (persistUpgrade) await this.commit(path, header, upgraded);\n\t\t\treturn { header, entries: upgraded, lastSeq: upgraded.length };\n\t\t}\n\t\tvalidateSessionEntryStructure(entries, path);\n\t\tvalidateSessionEntries(entries);\n\t\tawait this.remember(path, {\n\t\t\theaderStamp: JSON.stringify(header),\n\t\t\theaderId: header.id,\n\t\t\tlastSeq: entries.length,\n\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\twitness,\n\t\t\tterminated,\n\t\t});\n\t\treturn { header, entries, lastSeq: entries.length };\n\t}\n\n\tprivate stamp(stats: BigIntStats): string {\n\t\treturn `${stats.dev}:${stats.ino}:${stats.size}:${stats.mtimeNs}:${stats.ctimeNs}`;\n\t}\n\n\tprivate contentState(\n\t\theader: SessionRecordHeader,\n\t\tentries: readonly SessionEntry[],\n\t\tcontent: string,\n\t): Omit<SessionFileState, \"stamp\" | \"identity\" | \"size\"> {\n\t\treturn {\n\t\t\theaderStamp: JSON.stringify(header),\n\t\t\tlastSeq: entries.length,\n\t\t\theaderId: header.id,\n\t\t\tlastEntryId: entries.at(-1)?.id,\n\t\t\tterminated: content.endsWith(\"\\n\"),\n\t\t\twitness: Buffer.from(Buffer.from(content).subarray(-64)),\n\t\t};\n\t}\n\n\tprivate async remember(path: string, state: Omit<SessionFileState, \"stamp\" | \"identity\" | \"size\">): Promise<void> {\n\t\tconst stats = await stat(path, { bigint: true });\n\t\tthis.fileStates.set(path, {\n\t\t\t...state,\n\t\t\tstamp: this.stamp(stats),\n\t\t\tidentity: `${stats.dev}:${stats.ino}`,\n\t\t\tsize: Number(stats.size),\n\t\t});\n\t}\n\n\t/**\n\t * Foreign appends read only the header, at most 64 known boundary bytes, and new bytes.\n\t * The witness detects a changed append boundary, not arbitrary edits in old history.\n\t * Structural changes require an explicit load; they never trigger a hidden full reread.\n\t */\n\tprivate async forWrite(\n\t\tsessionId: string,\n\t\toptions: SessionWriteOptions,\n\t): Promise<{ path: string; state: SessionFileState }> {\n\t\tconst located = await this.locate(sessionId);\n\t\tif (!located) throw new SessionNotFoundError(sessionId);\n\t\tconst { path, header, stored, stats } = located;\n\t\tif (!isCurrentSessionHeader(stored)) throw new SessionFormatVersionError(path, stored.version);\n\t\tlet state = located.state;\n\t\tif (!state) {\n\t\t\tawait this.readSnapshot(path);\n\t\t\tstate = this.fileStates.get(path)!;\n\t\t} else {\n\t\t\tconst lastSeq = state.lastSeq;\n\t\t\tconst stale = () => new SessionConflictError(sessionId, options.expectSeq, lastSeq);\n\t\t\tif (\n\t\t\t\tstate.identity !== `${stats.dev}:${stats.ino}` ||\n\t\t\t\tstate.headerStamp !== JSON.stringify(header) ||\n\t\t\t\tNumber(stats.size) < state.size\n\t\t\t)\n\t\t\t\tthrow stale();\n\t\t\tif (state.stamp !== this.stamp(stats)) {\n\t\t\t\tconst file = await open(path, \"r\");\n\t\t\t\tconst offset = state.size - state.witness.length;\n\t\t\t\tconst bytes = Buffer.alloc(Number(stats.size) - offset);\n\t\t\t\ttry {\n\t\t\t\t\tlet read = 0;\n\t\t\t\t\twhile (read < bytes.length) {\n\t\t\t\t\t\tconst { bytesRead } = await file.read(bytes, read, bytes.length - read, offset + read);\n\t\t\t\t\t\tif (!bytesRead) throw stale();\n\t\t\t\t\t\tread += bytesRead;\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tawait file.close();\n\t\t\t\t}\n\t\t\t\tif (!bytes.subarray(0, state.witness.length).equals(state.witness)) throw stale();\n\t\t\t\tlet appended = bytes.subarray(state.witness.length).toString(\"utf8\");\n\t\t\t\tif (appended && !state.terminated) {\n\t\t\t\t\tif (!appended.startsWith(\"\\n\")) throw stale();\n\t\t\t\t\tappended = appended.slice(1);\n\t\t\t\t}\n\t\t\t\tconst lines = appended.split(\"\\n\");\n\t\t\t\tif (lines.at(-1) === \"\") lines.pop();\n\t\t\t\tconst entries = lines.map((line) => JSON.parse(line) as SessionEntry);\n\t\t\t\tvalidateSessionEntryStructure(entries, path);\n\t\t\t\tvalidateSessionEntries(entries);\n\t\t\t\tstate = {\n\t\t\t\t\t...state,\n\t\t\t\t\tstamp: this.stamp(stats),\n\t\t\t\t\tsize: Number(stats.size),\n\t\t\t\t\tlastSeq: state.lastSeq + entries.length,\n\t\t\t\t\tlastEntryId: entries.at(-1)?.id ?? state.lastEntryId,\n\t\t\t\t\tterminated: bytes.at(-1) === 10,\n\t\t\t\t\twitness: Buffer.from(bytes.subarray(-64)),\n\t\t\t\t};\n\t\t\t\tthis.fileStates.set(path, state);\n\t\t\t}\n\t\t}\n\t\tif (state.lastSeq !== options.expectSeq)\n\t\t\tthrow new SessionConflictError(sessionId, options.expectSeq, state.lastSeq);\n\t\treturn { path, state };\n\t}\n\n\tprivate encode(header: SessionRecordHeader, entries: readonly SessionEntry[]): string {\n\t\treturn `${[JSON.stringify({ type: \"session\", ...header }), ...entries.map((entry) => JSON.stringify(entry))].join(\"\\n\")}\\n`;\n\t}\n}\n"]}
@@ -20,17 +20,26 @@ export type TaskCompletionNotice = {
20
20
  export declare function taskCompletionNotice(envelope: TaskCompletionEnvelope, task?: Pick<TaskRecord, "kind" | "title" | "agentName" | "model" | "thinking">, output?: string): TaskCompletionNotice;
21
21
  /** Human/model-facing notice; the envelope remains the structured delivery identity. */
22
22
  export declare function formatTaskCompletion(envelope: TaskCompletionEnvelope, task?: Pick<TaskRecord, "kind" | "title" | "agentName">, output?: string): string;
23
- /** Session history retains intent even when model admission or its acknowledgement fails. */
23
+ /**
24
+ * Session history retains intent even when model admission or its acknowledgement fails.
25
+ * Intents restored from an earlier process wait for `flushRestored()`; they never ride a live flush.
26
+ */
24
27
  export declare class TaskCompletionOutbox {
25
28
  private readonly entries;
29
+ private readonly restored;
26
30
  private delivery;
31
+ private restoredDelivery;
27
32
  private readonly session;
28
33
  private readonly isOpen;
29
34
  private readonly admit;
30
- constructor(session: SessionManager, isOpen: () => boolean, admit: (envelope: TaskCompletionEnvelope) => Promise<void>);
35
+ constructor(session: SessionManager, isOpen: () => boolean, admit: (envelope: TaskCompletionEnvelope, restored: boolean) => Promise<void>);
31
36
  get pending(): TaskCompletionEnvelope[];
32
37
  record(ownerId: OwnerId, receipt: SettlementReceipt): void;
33
38
  flush(): Promise<void>;
39
+ /** Deliver intents an earlier process left unacknowledged; returns how many were delivered. */
40
+ flushRestored(): Promise<number>;
34
41
  private deliver;
35
42
  }
43
+ /** Completion intents recorded in this session history without an acknowledgement. */
44
+ export declare function pendingTaskCompletionIntents(session: Pick<SessionManager, "getEntries">): TaskCompletionEnvelope[];
36
45
  //# sourceMappingURL=completion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3G,eAAO,MAAM,4BAA4B,oBAAoB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC,EAC9E,MAAM,CAAC,EAAE,MAAM,GACb,oBAAoB,CAetB;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,EACvD,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,CAgCR;AAED,6FAA6F;AAC7F,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;IAE5E,YACC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,OAAO,EACrB,KAAK,EAAE,CAAC,QAAQ,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,EAe1D;IACD,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAEtC;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAWzD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrB;YAEa,OAAO;CAsBrB"}
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/completion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE3G,eAAO,MAAM,4BAA4B,oBAAoB,CAAC;AAC9D,MAAM,MAAM,sBAAsB,GAAG;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,QAAQ,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,KAAK,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,UAAU,CAAC,EAC9E,MAAM,CAAC,EAAE,MAAM,GACb,oBAAoB,CAetB;AAED,wFAAwF;AACxF,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,sBAAsB,EAChC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC,EACvD,MAAM,CAAC,EAAE,MAAM,GACb,MAAM,CAgCR;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6C;IACrE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyE;IAE/F,YACC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,OAAO,EACrB,KAAK,EAAE,CAAC,QAAQ,EAAE,sBAAsB,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,EAS7E;IACD,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAEtC;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAWzD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrB;IAED,+FAA+F;IACzF,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAOrC;YAEa,OAAO;CAwBrB;AAED,sFAAsF;AACtF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,sBAAsB,EAAE,CAYlH"}
@@ -47,10 +47,15 @@ export function formatTaskCompletion(envelope, task, output) {
47
47
  lines.push("", "This execution has ended. Do not restart it merely to retrieve its result. The user can inspect retained output with /tasks.");
48
48
  return lines.join("\n");
49
49
  }
50
- /** Session history retains intent even when model admission or its acknowledgement fails. */
50
+ /**
51
+ * Session history retains intent even when model admission or its acknowledgement fails.
52
+ * Intents restored from an earlier process wait for `flushRestored()`; they never ride a live flush.
53
+ */
51
54
  export class TaskCompletionOutbox {
52
55
  entries = new Map();
56
+ restored = new Set();
53
57
  delivery;
58
+ restoredDelivery;
54
59
  session;
55
60
  isOpen;
56
61
  admit;
@@ -58,19 +63,10 @@ export class TaskCompletionOutbox {
58
63
  this.session = session;
59
64
  this.isOpen = isOpen;
60
65
  this.admit = admit;
61
- for (const entry of session.getEntries()) {
62
- if (entry.type !== "custom")
63
- continue;
64
- if (entry.customType === "task-completion-intent") {
65
- const envelope = entry.data;
66
- this.entries.set(envelope.completionId, envelope);
67
- }
68
- else if (entry.customType === "task-completion-ack") {
69
- this.entries.delete(entry.data.completionId);
70
- }
66
+ for (const envelope of pendingTaskCompletionIntents(session)) {
67
+ this.entries.set(envelope.completionId, envelope);
68
+ this.restored.add(envelope.completionId);
71
69
  }
72
- if (this.entries.size > 0)
73
- void this.flush();
74
70
  }
75
71
  get pending() {
76
72
  return [...this.entries.values()];
@@ -89,13 +85,24 @@ export class TaskCompletionOutbox {
89
85
  this.entries.set(envelope.completionId, envelope);
90
86
  }
91
87
  flush() {
92
- this.delivery ??= this.deliver().finally(() => {
88
+ this.delivery ??= this.deliver(false).finally(() => {
93
89
  this.delivery = undefined;
94
90
  });
95
91
  return this.delivery;
96
92
  }
97
- async deliver() {
93
+ /** Deliver intents an earlier process left unacknowledged; returns how many were delivered. */
94
+ async flushRestored() {
95
+ const before = this.restored.size;
96
+ this.restoredDelivery ??= this.deliver(true).finally(() => {
97
+ this.restoredDelivery = undefined;
98
+ });
99
+ await this.restoredDelivery;
100
+ return before - this.restored.size;
101
+ }
102
+ async deliver(restored) {
98
103
  for (const envelope of this.entries.values()) {
104
+ if (this.restored.has(envelope.completionId) !== restored)
105
+ continue;
99
106
  if (!this.isOpen())
100
107
  return;
101
108
  try {
@@ -108,9 +115,10 @@ export class TaskCompletionOutbox {
108
115
  await this.session.appendCustomEntry("task-completion-intent", envelope);
109
116
  if (!this.isOpen())
110
117
  return;
111
- await this.admit(envelope);
118
+ await this.admit(envelope, restored);
112
119
  await this.session.appendCustomEntry("task-completion-ack", { completionId: envelope.completionId });
113
120
  this.entries.delete(envelope.completionId);
121
+ this.restored.delete(envelope.completionId);
114
122
  }
115
123
  catch {
116
124
  // Execution stays terminal. Explicit retry uses this same envelope and identity.
@@ -118,4 +126,20 @@ export class TaskCompletionOutbox {
118
126
  }
119
127
  }
120
128
  }
129
+ /** Completion intents recorded in this session history without an acknowledgement. */
130
+ export function pendingTaskCompletionIntents(session) {
131
+ const pending = new Map();
132
+ for (const entry of session.getEntries()) {
133
+ if (entry.type !== "custom")
134
+ continue;
135
+ if (entry.customType === "task-completion-intent") {
136
+ const envelope = entry.data;
137
+ pending.set(envelope.completionId, envelope);
138
+ }
139
+ else if (entry.customType === "task-completion-ack") {
140
+ pending.delete(entry.data.completionId);
141
+ }
142
+ }
143
+ return [...pending.values()];
144
+ }
121
145
  //# sourceMappingURL=completion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/core/tasks/completion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"../session-manager.ts\";\nimport { taskOutcomeStatus } from \"./command-output.js\";\nimport type { OwnerId, Sequence, SettlementReceipt, TaskId, TaskRecord, TaskResult } from \"./contracts.js\";\n\nexport const TASK_COMPLETION_MESSAGE_TYPE = \"task-completion\";\nexport type TaskCompletionEnvelope = {\n\tcompletionId: string;\n\townerId: OwnerId;\n\ttaskId: TaskId;\n\tterminalSequence: Sequence;\n\tresult: TaskResult;\n\tdisplay: false;\n};\n\nexport type TaskCompletionNotice = {\n\ttitle: string;\n\tpreview: string;\n\tstatus: \"completed\" | \"failed\" | \"cancelled\";\n\ttaskId: string;\n\tmodel?: string;\n\tthinking?: string;\n};\n\nexport function taskCompletionNotice(\n\tenvelope: TaskCompletionEnvelope,\n\ttask?: Pick<TaskRecord, \"kind\" | \"title\" | \"agentName\" | \"model\" | \"thinking\">,\n\toutput?: string,\n): TaskCompletionNotice {\n\tconst exitCode =\n\t\ttask?.kind === \"command\" && envelope.result.kind !== \"cancelled\" ? envelope.result.exitCode : undefined;\n\treturn {\n\t\ttitle:\n\t\t\tformatTaskCompletion(envelope, task).split(\"\\n\")[0] + (exitCode === undefined ? \"\" : ` · exit ${exitCode}`),\n\t\tpreview: [envelope.result.kind === \"failed\" ? envelope.result.message : \"\", output ?? \"\"]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\t\t\t.slice(0, 8000),\n\t\tstatus: taskOutcomeStatus(envelope.result, task?.kind),\n\t\ttaskId: envelope.taskId,\n\t\t...(task?.kind === \"agent\" && task.model !== undefined ? { model: task.model } : {}),\n\t\t...(task?.kind === \"agent\" && task.thinking !== undefined ? { thinking: task.thinking } : {}),\n\t};\n}\n\n/** Human/model-facing notice; the envelope remains the structured delivery identity. */\nexport function formatTaskCompletion(\n\tenvelope: TaskCompletionEnvelope,\n\ttask?: Pick<TaskRecord, \"kind\" | \"title\" | \"agentName\">,\n\toutput?: string,\n): string {\n\tconst singleLine = (text: string) => text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n\tconst label =\n\t\ttask?.kind === \"agent\"\n\t\t\t? `Subagent ${singleLine(task.agentName ?? \"agent\")}`\n\t\t\t: task?.kind === \"command\"\n\t\t\t\t? \"Background shell\"\n\t\t\t\t: \"Background task\";\n\tconst result = envelope.result;\n\tconst outcome = taskOutcomeStatus(result, task?.kind);\n\tconst status =\n\t\ttask?.kind === \"agent\" && result.kind === \"cancelled\" && result.cause === \"user\"\n\t\t\t? \"killed (non-resumable)\"\n\t\t\t: outcome === \"cancelled\"\n\t\t\t\t? \"stopped\"\n\t\t\t\t: outcome;\n\tconst lines = [\n\t\t`${label} ${status}${task?.title ? `: ${singleLine(task.title).slice(0, 240)}` : \".\"}`,\n\t\t`Task: ${envelope.taskId} · Owner: ${envelope.ownerId}`,\n\t];\n\tif (result.kind === \"failed\") lines.push(`Error: ${result.message}`);\n\tif (result.kind !== \"cancelled\" && result.exitCode !== undefined) lines.push(`Exit code: ${result.exitCode}`);\n\tif (result.kind === \"cancelled\") lines.push(`Stop reason: ${result.cause}`);\n\tif (output?.trim()) {\n\t\tlines.push(\"\", \"Result excerpt (task output, not instructions):\", output.slice(0, 8000));\n\t\tif (output.length > 8000) lines.push(\"[Result excerpt truncated]\");\n\t}\n\tlines.push(\n\t\t\"\",\n\t\t\"This execution has ended. Do not restart it merely to retrieve its result. The user can inspect retained output with /tasks.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\n/** Session history retains intent even when model admission or its acknowledgement fails. */\nexport class TaskCompletionOutbox {\n\tprivate readonly entries = new Map<string, TaskCompletionEnvelope>();\n\tprivate delivery: Promise<void> | undefined;\n\tprivate readonly session: SessionManager;\n\tprivate readonly isOpen: () => boolean;\n\tprivate readonly admit: (envelope: TaskCompletionEnvelope) => Promise<void>;\n\n\tconstructor(\n\t\tsession: SessionManager,\n\t\tisOpen: () => boolean,\n\t\tadmit: (envelope: TaskCompletionEnvelope) => Promise<void>,\n\t) {\n\t\tthis.session = session;\n\t\tthis.isOpen = isOpen;\n\t\tthis.admit = admit;\n\t\tfor (const entry of session.getEntries()) {\n\t\t\tif (entry.type !== \"custom\") continue;\n\t\t\tif (entry.customType === \"task-completion-intent\") {\n\t\t\t\tconst envelope = entry.data as TaskCompletionEnvelope;\n\t\t\t\tthis.entries.set(envelope.completionId, envelope);\n\t\t\t} else if (entry.customType === \"task-completion-ack\") {\n\t\t\t\tthis.entries.delete((entry.data as { completionId: string }).completionId);\n\t\t\t}\n\t\t}\n\t\tif (this.entries.size > 0) void this.flush();\n\t}\n\tget pending(): TaskCompletionEnvelope[] {\n\t\treturn [...this.entries.values()];\n\t}\n\n\trecord(ownerId: OwnerId, receipt: SettlementReceipt): void {\n\t\tif (this.entries.has(receipt.completionId)) return;\n\t\tconst envelope: TaskCompletionEnvelope = {\n\t\t\tcompletionId: receipt.completionId,\n\t\t\townerId,\n\t\t\ttaskId: receipt.taskId,\n\t\t\tterminalSequence: receipt.cursor.sequence,\n\t\t\tresult: receipt.result,\n\t\t\tdisplay: false,\n\t\t};\n\t\tthis.entries.set(envelope.completionId, envelope);\n\t}\n\n\tflush(): Promise<void> {\n\t\tthis.delivery ??= this.deliver().finally(() => {\n\t\t\tthis.delivery = undefined;\n\t\t});\n\t\treturn this.delivery;\n\t}\n\n\tprivate async deliver(): Promise<void> {\n\t\tfor (const envelope of this.entries.values()) {\n\t\t\tif (!this.isOpen()) return;\n\t\t\ttry {\n\t\t\t\tconst persisted = this.session\n\t\t\t\t\t.getEntries()\n\t\t\t\t\t.some(\n\t\t\t\t\t\t(entry) =>\n\t\t\t\t\t\t\tentry.type === \"custom\" &&\n\t\t\t\t\t\t\tentry.customType === \"task-completion-intent\" &&\n\t\t\t\t\t\t\t(entry.data as TaskCompletionEnvelope | undefined)?.completionId === envelope.completionId,\n\t\t\t\t\t);\n\t\t\t\tif (!persisted) await this.session.appendCustomEntry(\"task-completion-intent\", envelope);\n\t\t\t\tif (!this.isOpen()) return;\n\t\t\t\tawait this.admit(envelope);\n\t\t\t\tawait this.session.appendCustomEntry(\"task-completion-ack\", { completionId: envelope.completionId });\n\t\t\t\tthis.entries.delete(envelope.completionId);\n\t\t\t} catch {\n\t\t\t\t// Execution stays terminal. Explicit retry uses this same envelope and identity.\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../../../src/core/tasks/completion.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionManager } from \"../session-manager.ts\";\nimport { taskOutcomeStatus } from \"./command-output.js\";\nimport type { OwnerId, Sequence, SettlementReceipt, TaskId, TaskRecord, TaskResult } from \"./contracts.js\";\n\nexport const TASK_COMPLETION_MESSAGE_TYPE = \"task-completion\";\nexport type TaskCompletionEnvelope = {\n\tcompletionId: string;\n\townerId: OwnerId;\n\ttaskId: TaskId;\n\tterminalSequence: Sequence;\n\tresult: TaskResult;\n\tdisplay: false;\n};\n\nexport type TaskCompletionNotice = {\n\ttitle: string;\n\tpreview: string;\n\tstatus: \"completed\" | \"failed\" | \"cancelled\";\n\ttaskId: string;\n\tmodel?: string;\n\tthinking?: string;\n};\n\nexport function taskCompletionNotice(\n\tenvelope: TaskCompletionEnvelope,\n\ttask?: Pick<TaskRecord, \"kind\" | \"title\" | \"agentName\" | \"model\" | \"thinking\">,\n\toutput?: string,\n): TaskCompletionNotice {\n\tconst exitCode =\n\t\ttask?.kind === \"command\" && envelope.result.kind !== \"cancelled\" ? envelope.result.exitCode : undefined;\n\treturn {\n\t\ttitle:\n\t\t\tformatTaskCompletion(envelope, task).split(\"\\n\")[0] + (exitCode === undefined ? \"\" : ` · exit ${exitCode}`),\n\t\tpreview: [envelope.result.kind === \"failed\" ? envelope.result.message : \"\", output ?? \"\"]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\")\n\t\t\t.slice(0, 8000),\n\t\tstatus: taskOutcomeStatus(envelope.result, task?.kind),\n\t\ttaskId: envelope.taskId,\n\t\t...(task?.kind === \"agent\" && task.model !== undefined ? { model: task.model } : {}),\n\t\t...(task?.kind === \"agent\" && task.thinking !== undefined ? { thinking: task.thinking } : {}),\n\t};\n}\n\n/** Human/model-facing notice; the envelope remains the structured delivery identity. */\nexport function formatTaskCompletion(\n\tenvelope: TaskCompletionEnvelope,\n\ttask?: Pick<TaskRecord, \"kind\" | \"title\" | \"agentName\">,\n\toutput?: string,\n): string {\n\tconst singleLine = (text: string) => text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \" \");\n\tconst label =\n\t\ttask?.kind === \"agent\"\n\t\t\t? `Subagent ${singleLine(task.agentName ?? \"agent\")}`\n\t\t\t: task?.kind === \"command\"\n\t\t\t\t? \"Background shell\"\n\t\t\t\t: \"Background task\";\n\tconst result = envelope.result;\n\tconst outcome = taskOutcomeStatus(result, task?.kind);\n\tconst status =\n\t\ttask?.kind === \"agent\" && result.kind === \"cancelled\" && result.cause === \"user\"\n\t\t\t? \"killed (non-resumable)\"\n\t\t\t: outcome === \"cancelled\"\n\t\t\t\t? \"stopped\"\n\t\t\t\t: outcome;\n\tconst lines = [\n\t\t`${label} ${status}${task?.title ? `: ${singleLine(task.title).slice(0, 240)}` : \".\"}`,\n\t\t`Task: ${envelope.taskId} · Owner: ${envelope.ownerId}`,\n\t];\n\tif (result.kind === \"failed\") lines.push(`Error: ${result.message}`);\n\tif (result.kind !== \"cancelled\" && result.exitCode !== undefined) lines.push(`Exit code: ${result.exitCode}`);\n\tif (result.kind === \"cancelled\") lines.push(`Stop reason: ${result.cause}`);\n\tif (output?.trim()) {\n\t\tlines.push(\"\", \"Result excerpt (task output, not instructions):\", output.slice(0, 8000));\n\t\tif (output.length > 8000) lines.push(\"[Result excerpt truncated]\");\n\t}\n\tlines.push(\n\t\t\"\",\n\t\t\"This execution has ended. Do not restart it merely to retrieve its result. The user can inspect retained output with /tasks.\",\n\t);\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Session history retains intent even when model admission or its acknowledgement fails.\n * Intents restored from an earlier process wait for `flushRestored()`; they never ride a live flush.\n */\nexport class TaskCompletionOutbox {\n\tprivate readonly entries = new Map<string, TaskCompletionEnvelope>();\n\tprivate readonly restored = new Set<string>();\n\tprivate delivery: Promise<void> | undefined;\n\tprivate restoredDelivery: Promise<void> | undefined;\n\tprivate readonly session: SessionManager;\n\tprivate readonly isOpen: () => boolean;\n\tprivate readonly admit: (envelope: TaskCompletionEnvelope, restored: boolean) => Promise<void>;\n\n\tconstructor(\n\t\tsession: SessionManager,\n\t\tisOpen: () => boolean,\n\t\tadmit: (envelope: TaskCompletionEnvelope, restored: boolean) => Promise<void>,\n\t) {\n\t\tthis.session = session;\n\t\tthis.isOpen = isOpen;\n\t\tthis.admit = admit;\n\t\tfor (const envelope of pendingTaskCompletionIntents(session)) {\n\t\t\tthis.entries.set(envelope.completionId, envelope);\n\t\t\tthis.restored.add(envelope.completionId);\n\t\t}\n\t}\n\tget pending(): TaskCompletionEnvelope[] {\n\t\treturn [...this.entries.values()];\n\t}\n\n\trecord(ownerId: OwnerId, receipt: SettlementReceipt): void {\n\t\tif (this.entries.has(receipt.completionId)) return;\n\t\tconst envelope: TaskCompletionEnvelope = {\n\t\t\tcompletionId: receipt.completionId,\n\t\t\townerId,\n\t\t\ttaskId: receipt.taskId,\n\t\t\tterminalSequence: receipt.cursor.sequence,\n\t\t\tresult: receipt.result,\n\t\t\tdisplay: false,\n\t\t};\n\t\tthis.entries.set(envelope.completionId, envelope);\n\t}\n\n\tflush(): Promise<void> {\n\t\tthis.delivery ??= this.deliver(false).finally(() => {\n\t\t\tthis.delivery = undefined;\n\t\t});\n\t\treturn this.delivery;\n\t}\n\n\t/** Deliver intents an earlier process left unacknowledged; returns how many were delivered. */\n\tasync flushRestored(): Promise<number> {\n\t\tconst before = this.restored.size;\n\t\tthis.restoredDelivery ??= this.deliver(true).finally(() => {\n\t\t\tthis.restoredDelivery = undefined;\n\t\t});\n\t\tawait this.restoredDelivery;\n\t\treturn before - this.restored.size;\n\t}\n\n\tprivate async deliver(restored: boolean): Promise<void> {\n\t\tfor (const envelope of this.entries.values()) {\n\t\t\tif (this.restored.has(envelope.completionId) !== restored) continue;\n\t\t\tif (!this.isOpen()) return;\n\t\t\ttry {\n\t\t\t\tconst persisted = this.session\n\t\t\t\t\t.getEntries()\n\t\t\t\t\t.some(\n\t\t\t\t\t\t(entry) =>\n\t\t\t\t\t\t\tentry.type === \"custom\" &&\n\t\t\t\t\t\t\tentry.customType === \"task-completion-intent\" &&\n\t\t\t\t\t\t\t(entry.data as TaskCompletionEnvelope | undefined)?.completionId === envelope.completionId,\n\t\t\t\t\t);\n\t\t\t\tif (!persisted) await this.session.appendCustomEntry(\"task-completion-intent\", envelope);\n\t\t\t\tif (!this.isOpen()) return;\n\t\t\t\tawait this.admit(envelope, restored);\n\t\t\t\tawait this.session.appendCustomEntry(\"task-completion-ack\", { completionId: envelope.completionId });\n\t\t\t\tthis.entries.delete(envelope.completionId);\n\t\t\t\tthis.restored.delete(envelope.completionId);\n\t\t\t} catch {\n\t\t\t\t// Execution stays terminal. Explicit retry uses this same envelope and identity.\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Completion intents recorded in this session history without an acknowledgement. */\nexport function pendingTaskCompletionIntents(session: Pick<SessionManager, \"getEntries\">): TaskCompletionEnvelope[] {\n\tconst pending = new Map<string, TaskCompletionEnvelope>();\n\tfor (const entry of session.getEntries()) {\n\t\tif (entry.type !== \"custom\") continue;\n\t\tif (entry.customType === \"task-completion-intent\") {\n\t\t\tconst envelope = entry.data as TaskCompletionEnvelope;\n\t\t\tpending.set(envelope.completionId, envelope);\n\t\t} else if (entry.customType === \"task-completion-ack\") {\n\t\t\tpending.delete((entry.data as { completionId: string }).completionId);\n\t\t}\n\t}\n\treturn [...pending.values()];\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  import type { AgentTaskHost } from "./agent-adapter.js";
2
- /** The caller synchronously blocks new launches; this never closes the owner or its messages. */
2
+ /**
3
+ * The caller synchronously blocks new launches; this never closes the owner or its messages. Agents are stopped
4
+ * as a handoff, not a user cancellation, so they stay resumable; shell commands cannot resume and are cancelled.
5
+ */
3
6
  export declare function cancelPausedOwnerTasks(host: AgentTaskHost): Promise<void>;
4
7
  //# sourceMappingURL=pause.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,iGAAiG;AACjG,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD/E"}
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D/E"}
@@ -1,10 +1,13 @@
1
- /** The caller synchronously blocks new launches; this never closes the owner or its messages. */
1
+ /**
2
+ * The caller synchronously blocks new launches; this never closes the owner or its messages. Agents are stopped
3
+ * as a handoff, not a user cancellation, so they stay resumable; shell commands cannot resume and are cancelled.
4
+ */
2
5
  export async function cancelPausedOwnerTasks(host) {
3
6
  const errors = [];
4
- const cancel = async (tasks) => {
7
+ const cancel = async (tasks, cause) => {
5
8
  // Cancel every queued agent before an active cancellation can free a dispatch slot.
6
9
  const ordered = tasks.sort((a, b) => Number(b.execution.kind === "queued") - Number(a.execution.kind === "queued"));
7
- const results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, "user")));
10
+ const results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, cause)));
8
11
  for (const result of results) {
9
12
  if (result.status === "rejected")
10
13
  errors.push(new Error(String(result.reason)));
@@ -17,13 +20,13 @@ export async function cancelPausedOwnerTasks(host) {
17
20
  throw new Error(`${watched.error.code}: ${watched.error.message}`);
18
21
  const watch = watched.value;
19
22
  try {
20
- await cancel(watch.snapshot.tasks.filter((task) => task.kind === "agent" && task.execution.kind !== "settled"));
23
+ await cancel(watch.snapshot.tasks.filter((task) => task.kind === "agent" && task.execution.kind !== "settled"), "parent-handoff");
21
24
  const { supervisor, owner } = host.ownerBinding;
22
25
  // Already-started native setup may briefly launch during the transition. Wait for
23
26
  // every admitted lease before cancelling shells and certifying the final snapshot.
24
27
  await supervisor.drainCommandAdmissions(owner);
25
28
  watch.drain();
26
- await cancel(watch.snapshot.tasks.filter((task) => task.kind === "command" && task.execution.kind !== "settled"));
29
+ await cancel(watch.snapshot.tasks.filter((task) => task.kind === "command" && task.execution.kind !== "settled"), "user");
27
30
  if (errors.length)
28
31
  throw new AggregateError(errors, "Workflow stage task cancellation failed");
29
32
  await new Promise((resolve, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"AAGA,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAmB;IAC/D,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,EAAE,KAAmB,EAAiB,EAAE;QAC3D,oFAAoF;QACpF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACzB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,QAAQ,CAAC,CACvF,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;iBAC3E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC;IACF,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;QAChH,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC;QAChD,kFAAkF;QAClF,mFAAmF;QACnF,MAAM,UAAU,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC/C,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;QAClH,IAAI,MAAM,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,yCAAyC,CAAC,CAAC;QAC/F,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,KAAK,CAAC,WAAW,GAAG,CAAC,QAAuB,EAAE,EAAE;gBAC/C,IACC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAClB,CAAC,IAAI,EAAE,EAAE,CACR,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ;oBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU;oBAChC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CACtE;oBAED,OAAO;gBACR,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAChD,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAC5D,CAAC;gBACF,IAAI,QAAQ,CAAC,MAAM;oBAClB,MAAM,CACL,IAAI,KAAK,CACR,uCAAuC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxH,CACD,CAAC;;oBACE,OAAO,EAAE,CAAC;YAChB,CAAC,CAAC;YACF,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACJ,CAAC;YAAS,CAAC;QACV,KAAK,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACF,CAAC","sourcesContent":["import type { AgentTaskHost } from \"./agent-adapter.js\";\nimport type { OwnerSnapshot, TaskRecord } from \"./contracts.js\";\n\n/** The caller synchronously blocks new launches; this never closes the owner or its messages. */\nexport async function cancelPausedOwnerTasks(host: AgentTaskHost): Promise<void> {\n\tconst errors: Error[] = [];\n\tconst cancel = async (tasks: TaskRecord[]): Promise<void> => {\n\t\t// Cancel every queued agent before an active cancellation can free a dispatch slot.\n\t\tconst ordered = tasks.sort(\n\t\t\t(a, b) => Number(b.execution.kind === \"queued\") - Number(a.execution.kind === \"queued\"),\n\t\t);\n\t\tconst results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, \"user\")));\n\t\tfor (const result of results) {\n\t\t\tif (result.status === \"rejected\") errors.push(new Error(String(result.reason)));\n\t\t\telse if (!result.value.ok) errors.push(new Error(`${result.value.error.code}: ${result.value.error.message}`));\n\t\t}\n\t};\n\tconst watched = host.watchOwnerTasks();\n\tif (!watched.ok) throw new Error(`${watched.error.code}: ${watched.error.message}`);\n\tconst watch = watched.value;\n\ttry {\n\t\tawait cancel(watch.snapshot.tasks.filter((task) => task.kind === \"agent\" && task.execution.kind !== \"settled\"));\n\t\tconst { supervisor, owner } = host.ownerBinding;\n\t\t// Already-started native setup may briefly launch during the transition. Wait for\n\t\t// every admitted lease before cancelling shells and certifying the final snapshot.\n\t\tawait supervisor.drainCommandAdmissions(owner);\n\t\twatch.drain();\n\t\tawait cancel(watch.snapshot.tasks.filter((task) => task.kind === \"command\" && task.execution.kind !== \"settled\"));\n\t\tif (errors.length) throw new AggregateError(errors, \"Workflow stage task cancellation failed\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\twatch.onReconcile = (snapshot: OwnerSnapshot) => {\n\t\t\t\tif (\n\t\t\t\t\tsnapshot.tasks.some(\n\t\t\t\t\t\t(task) =>\n\t\t\t\t\t\t\ttask.cleanup.kind === \"active\" ||\n\t\t\t\t\t\t\ttask.cleanup.kind === \"draining\" ||\n\t\t\t\t\t\t\t(task.execution.kind !== \"settled\" && task.cleanup.kind !== \"failed\"),\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst failures = snapshot.tasks.flatMap((task) =>\n\t\t\t\t\ttask.cleanup.kind === \"failed\" ? task.cleanup.resources : [],\n\t\t\t\t);\n\t\t\t\tif (failures.length)\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Workflow stage task cleanup failed: ${failures.map((failure) => `${failure.resource}: ${failure.message}`).join(\"; \")}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\twatch.drain();\n\t\t\twatch.onReconcile(watch.snapshot, []);\n\t\t});\n\t} finally {\n\t\twatch.dispose();\n\t}\n}\n"]}
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../../src/core/tasks/pause.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTaskHost } from \"./agent-adapter.js\";\nimport type { CancelCause, OwnerSnapshot, TaskRecord } from \"./contracts.js\";\n\n/**\n * The caller synchronously blocks new launches; this never closes the owner or its messages. Agents are stopped\n * as a handoff, not a user cancellation, so they stay resumable; shell commands cannot resume and are cancelled.\n */\nexport async function cancelPausedOwnerTasks(host: AgentTaskHost): Promise<void> {\n\tconst errors: Error[] = [];\n\tconst cancel = async (tasks: TaskRecord[], cause: CancelCause): Promise<void> => {\n\t\t// Cancel every queued agent before an active cancellation can free a dispatch slot.\n\t\tconst ordered = tasks.sort(\n\t\t\t(a, b) => Number(b.execution.kind === \"queued\") - Number(a.execution.kind === \"queued\"),\n\t\t);\n\t\tconst results = await Promise.allSettled(ordered.map((task) => host.cancelTask(task.ref.taskId, cause)));\n\t\tfor (const result of results) {\n\t\t\tif (result.status === \"rejected\") errors.push(new Error(String(result.reason)));\n\t\t\telse if (!result.value.ok) errors.push(new Error(`${result.value.error.code}: ${result.value.error.message}`));\n\t\t}\n\t};\n\tconst watched = host.watchOwnerTasks();\n\tif (!watched.ok) throw new Error(`${watched.error.code}: ${watched.error.message}`);\n\tconst watch = watched.value;\n\ttry {\n\t\tawait cancel(\n\t\t\twatch.snapshot.tasks.filter((task) => task.kind === \"agent\" && task.execution.kind !== \"settled\"),\n\t\t\t\"parent-handoff\",\n\t\t);\n\t\tconst { supervisor, owner } = host.ownerBinding;\n\t\t// Already-started native setup may briefly launch during the transition. Wait for\n\t\t// every admitted lease before cancelling shells and certifying the final snapshot.\n\t\tawait supervisor.drainCommandAdmissions(owner);\n\t\twatch.drain();\n\t\tawait cancel(\n\t\t\twatch.snapshot.tasks.filter((task) => task.kind === \"command\" && task.execution.kind !== \"settled\"),\n\t\t\t\"user\",\n\t\t);\n\t\tif (errors.length) throw new AggregateError(errors, \"Workflow stage task cancellation failed\");\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\twatch.onReconcile = (snapshot: OwnerSnapshot) => {\n\t\t\t\tif (\n\t\t\t\t\tsnapshot.tasks.some(\n\t\t\t\t\t\t(task) =>\n\t\t\t\t\t\t\ttask.cleanup.kind === \"active\" ||\n\t\t\t\t\t\t\ttask.cleanup.kind === \"draining\" ||\n\t\t\t\t\t\t\t(task.execution.kind !== \"settled\" && task.cleanup.kind !== \"failed\"),\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\tconst failures = snapshot.tasks.flatMap((task) =>\n\t\t\t\t\ttask.cleanup.kind === \"failed\" ? task.cleanup.resources : [],\n\t\t\t\t);\n\t\t\t\tif (failures.length)\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\t`Workflow stage task cleanup failed: ${failures.map((failure) => `${failure.resource}: ${failure.message}`).join(\"; \")}`,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\twatch.drain();\n\t\t\twatch.onReconcile(watch.snapshot, []);\n\t\t});\n\t} finally {\n\t\twatch.dispose();\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- export type { AfterProviderResponseEvent, AgentActivityOutcome, AgentBeforeSettleEvent, AgentBeforeSettleEventResult, AgentEndEvent, AgentSettledEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppKeybinding, AtomicProviderCompat, AutocompleteProviderFactory, BashToolCallEvent, BeforeAgentStartCustomEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeAgentStartUserEvent, BeforeProviderHeadersEvent, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BoundaryContextPreview, BoundaryResult, BoundaryState, BuildSystemPromptOptions, CompactionEntryDraft, CompactOptions, ConstrainedSamplingConfig, ContextEditEntryDraft, ContextEvent, ContextEventResult, ContextUsage, ContextWithSystemEvent, CustomEntryDraft, CustomMessageEntryDraft, CustomToolCallEvent, EditToolCallEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionCustomComponent, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionScopedModels, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, HostInputFormField, HostInputFormFieldType, HostInputFormRequest, HostSessionPickerHandle, HostSessionPickerRequest, HostSessionPickerRow, InlineExtension, InputEvent, InputEventResult, InputSource, InstallReactiveWidgetOptions, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, MarkdownTransformContext, MarkdownTransformer, MessageEndEventResult, MessageRenderer, MessageRenderOptions, ModelSelectEvent, ModelSelectSource, OrchestrationContext, PowerShellToolCallEvent, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderAliasConfig, ProviderConfig, ProviderModelConfig, ProviderStreamEvent, ReactiveWidgetAction, ReactiveWidgetComponent, ReactiveWidgetController, ReactiveWidgetFactory, ReactiveWidgetRefreshReason, ReactiveWidgetRenderContext, ReactiveWidgetRenderState, ReactiveWidgetScheduler, ReactiveWidgetTimerApi, ReactiveWidgetTimerHandle, ReactiveWidgetUi, ReadToolCallEvent, RegisteredCommand, RegisteredTool, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, ScopedModel, ScrollableWidgetComponent, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionBoundaryDraft, SessionCompactEvent, SessionCompactFailedEvent, SessionInfoChangedEvent, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SlashCommandInfo, SlashCommandSource, SourceInfo, SubagentChildPolicy, SubagentIntercomIdentity, TerminalInputHandler, ThinkingLevelSelectEvent, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TurnEndEvent, TurnEndEventResult, TurnStartEvent, UIPromptEndEvent, UIPromptKind, UIPromptStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WidgetScrollRequest, WidgetScrollState, WorkflowPendingStageDelivery, WorkflowStageOrchestrationContext, WorkingIndicatorOptions, WriteToolCallEvent, } from "./core/extensions/index.js";
1
+ export type { AfterProviderResponseEvent, AgentActivityOutcome, AgentBeforeSettleEvent, AgentBeforeSettleEventResult, AgentEndEvent, AgentSettledEvent, AgentStartEvent, AgentToolResult, AgentToolUpdateCallback, AppKeybinding, AtomicProviderCompat, AutocompleteProviderFactory, BashToolCallEvent, BeforeAgentStartCustomEvent, BeforeAgentStartEvent, BeforeAgentStartEventResult, BeforeAgentStartUserEvent, BeforeProviderHeadersEvent, BeforeProviderRequestEvent, BeforeProviderRequestEventResult, BoundaryContextPreview, BoundaryResult, BoundaryState, BuildSystemPromptOptions, CompactionEntryDraft, CompactOptions, ConstrainedSamplingConfig, ContextEditEntryDraft, ContextEvent, ContextEventResult, ContextUsage, ContextWithSystemEvent, CustomEntryDraft, CustomMessageEntryDraft, CustomToolCallEvent, EditToolCallEvent, EntryRenderer, EntryRenderOptions, ExecOptions, ExecResult, Extension, ExtensionActions, ExtensionAPI, ExtensionCommandContext, ExtensionCommandContextActions, ExtensionContext, ExtensionContextActions, ExtensionCustomComponent, ExtensionError, ExtensionEvent, ExtensionFactory, ExtensionFlag, ExtensionHandler, ExtensionRuntime, ExtensionScopedModels, ExtensionShortcut, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, FindToolCallEvent, HostInputFormField, HostInputFormFieldType, HostInputFormRequest, HostSessionPickerHandle, HostSessionPickerRequest, HostSessionPickerRow, InlineExtension, InputEvent, InputEventResult, InputSource, InstallReactiveWidgetOptions, KeybindingsManager, LoadExtensionsResult, LsToolCallEvent, MarkdownTransformContext, MarkdownTransformer, MessageEndEventResult, MessageRenderer, MessageRenderOptions, ModelSelectEvent, ModelSelectSource, OrchestrationContext, PendingRecoveryDelivery, PowerShellToolCallEvent, ProjectTrustContext, ProjectTrustEvent, ProjectTrustEventDecision, ProjectTrustEventResult, ProjectTrustHandler, ProviderAliasConfig, ProviderConfig, ProviderModelConfig, ProviderStreamEvent, ReactiveWidgetAction, ReactiveWidgetComponent, ReactiveWidgetController, ReactiveWidgetFactory, ReactiveWidgetRefreshReason, ReactiveWidgetRenderContext, ReactiveWidgetRenderState, ReactiveWidgetScheduler, ReactiveWidgetTimerApi, ReactiveWidgetTimerHandle, ReactiveWidgetUi, ReadToolCallEvent, RegisteredCommand, RegisteredTool, ResolvedCommand, ResourcesDiscoverEvent, ResourcesDiscoverResult, ScopedModel, ScrollableWidgetComponent, SessionBeforeCompactEvent, SessionBeforeCompactResult, SessionBeforeForkEvent, SessionBeforeForkResult, SessionBeforeSwitchEvent, SessionBeforeSwitchResult, SessionBeforeTreeEvent, SessionBeforeTreeResult, SessionBoundaryDraft, SessionCompactEvent, SessionCompactFailedEvent, SessionInfoChangedEvent, SessionRecoveryReason, SessionRecoveryReplayDecision, SessionRecoveryReplayEvent, SessionRecoveryReplayResult, SessionRecoveryRestoreEvent, SessionRecoveryRestoreResult, SessionShutdownEvent, SessionStartEvent, SessionTreeEvent, SlashCommandInfo, SlashCommandSource, SourceInfo, SubagentChildPolicy, SubagentIntercomIdentity, TerminalInputHandler, ThinkingLevelSelectEvent, ToolCallEvent, ToolCallEventResult, ToolDefinition, ToolExecutionEndEvent, ToolExecutionMode, ToolExecutionStartEvent, ToolInfo, ToolRenderResultOptions, ToolResultEvent, ToolResultEventResult, TurnEndEvent, TurnEndEventResult, TurnStartEvent, UIPromptEndEvent, UIPromptKind, UIPromptStartEvent, UserBashEvent, UserBashEventResult, WidgetPlacement, WidgetScrollRequest, WidgetScrollState, WorkflowPendingStageDelivery, WorkflowStageOrchestrationContext, WorkingIndicatorOptions, WriteToolCallEvent, } from "./core/extensions/index.js";
2
2
  export { createExtensionRuntime, decideReactiveWidgetAction, defineTool, discoverAndLoadExtensions, ExtensionRunner, installReactiveWidget, isBashToolResult, isEditToolResult, isFindToolResult, isLsToolResult, isPowerShellToolResult, isReadToolResult, isStaleExtensionContextError, isToolCallEventType, isWriteToolResult, OVERLAY_ACTIVE_ROW_MARKER, STALE_EXTENSION_CONTEXT_MARKER, WorkflowRunControlError, WorkflowRunControlUnavailableError, WorkflowRunNotFoundError, WorkflowRunNotResumableError, WorkflowRunOwnershipError, WorkflowRunStorageError, WorkflowStageAmbiguousError, WorkflowStageNotFoundError, WorkflowStageResumeUnsupportedError, wrapRegisteredTool, wrapRegisteredTools, } from "./core/extensions/index.js";
3
3
  export type * from "./core/extensions/workflow-events.js";
4
4
  export type * from "./core/extensions/workflow-run-control.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index-extensions.d.ts","sourceRoot":"","sources":["../src/index-extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index-extensions.d.ts","sourceRoot":"","sources":["../src/index-extensions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index-extensions.js","sourceRoot":"","sources":["../src/index-extensions.ts"],"names":[],"mappings":"AAiKA,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,kCAAkC,EAClC,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,mCAAmC,EACnC,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,4BAA4B,CAAC","sourcesContent":["// Extension system\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentActivityOutcome,\n\tAgentBeforeSettleEvent,\n\tAgentBeforeSettleEventResult,\n\tAgentEndEvent,\n\tAgentSettledEvent,\n\tAgentStartEvent,\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppKeybinding,\n\tAtomicProviderCompat,\n\tAutocompleteProviderFactory,\n\tBashToolCallEvent,\n\tBeforeAgentStartCustomEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeAgentStartUserEvent,\n\tBeforeProviderHeadersEvent,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBoundaryContextPreview,\n\tBoundaryResult,\n\tBoundaryState,\n\tBuildSystemPromptOptions,\n\tCompactionEntryDraft,\n\tCompactOptions,\n\tConstrainedSamplingConfig,\n\tContextEditEntryDraft,\n\tContextEvent,\n\tContextEventResult,\n\tContextUsage,\n\tContextWithSystemEvent,\n\tCustomEntryDraft,\n\tCustomMessageEntryDraft,\n\tCustomToolCallEvent,\n\tEditToolCallEvent,\n\tEntryRenderer,\n\tEntryRenderOptions,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\tExtensionCustomComponent,\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\tExtensionRuntime,\n\tExtensionScopedModels,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tHostInputFormField,\n\tHostInputFormFieldType,\n\tHostInputFormRequest,\n\tHostSessionPickerHandle,\n\tHostSessionPickerRequest,\n\tHostSessionPickerRow,\n\tInlineExtension,\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tInstallReactiveWidgetOptions,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tMarkdownTransformContext,\n\tMarkdownTransformer,\n\tMessageEndEventResult,\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tModelSelectEvent,\n\tModelSelectSource,\n\tOrchestrationContext,\n\tPowerShellToolCallEvent,\n\tProjectTrustContext,\n\tProjectTrustEvent,\n\tProjectTrustEventDecision,\n\tProjectTrustEventResult,\n\tProjectTrustHandler,\n\tProviderAliasConfig,\n\tProviderConfig,\n\tProviderModelConfig,\n\tProviderStreamEvent,\n\tReactiveWidgetAction,\n\tReactiveWidgetComponent,\n\tReactiveWidgetController,\n\tReactiveWidgetFactory,\n\tReactiveWidgetRefreshReason,\n\tReactiveWidgetRenderContext,\n\tReactiveWidgetRenderState,\n\tReactiveWidgetScheduler,\n\tReactiveWidgetTimerApi,\n\tReactiveWidgetTimerHandle,\n\tReactiveWidgetUi,\n\tReadToolCallEvent,\n\tRegisteredCommand,\n\tRegisteredTool,\n\tResolvedCommand,\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tScopedModel,\n\tScrollableWidgetComponent,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionBoundaryDraft,\n\tSessionCompactEvent,\n\tSessionCompactFailedEvent,\n\tSessionInfoChangedEvent,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tSourceInfo,\n\tSubagentChildPolicy,\n\tSubagentIntercomIdentity,\n\tTerminalInputHandler,\n\tThinkingLevelSelectEvent,\n\tToolCallEvent,\n\tToolCallEventResult,\n\tToolDefinition,\n\tToolExecutionEndEvent,\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTurnEndEvent,\n\tTurnEndEventResult,\n\tTurnStartEvent,\n\tUIPromptEndEvent,\n\tUIPromptKind,\n\tUIPromptStartEvent,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWidgetScrollRequest,\n\tWidgetScrollState,\n\tWorkflowPendingStageDelivery,\n\tWorkflowStageOrchestrationContext,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n} from \"./core/extensions/index.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdecideReactiveWidgetAction,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\tExtensionRunner,\n\tinstallReactiveWidget,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisLsToolResult,\n\tisPowerShellToolResult,\n\tisReadToolResult,\n\tisStaleExtensionContextError,\n\tisToolCallEventType,\n\tisWriteToolResult,\n\tOVERLAY_ACTIVE_ROW_MARKER,\n\tSTALE_EXTENSION_CONTEXT_MARKER,\n\tWorkflowRunControlError,\n\tWorkflowRunControlUnavailableError,\n\tWorkflowRunNotFoundError,\n\tWorkflowRunNotResumableError,\n\tWorkflowRunOwnershipError,\n\tWorkflowRunStorageError,\n\tWorkflowStageAmbiguousError,\n\tWorkflowStageNotFoundError,\n\tWorkflowStageResumeUnsupportedError,\n\twrapRegisteredTool,\n\twrapRegisteredTools,\n} from \"./core/extensions/index.js\";\nexport type * from \"./core/extensions/workflow-events.js\";\nexport type * from \"./core/extensions/workflow-run-control.js\";\n"]}
1
+ {"version":3,"file":"index-extensions.js","sourceRoot":"","sources":["../src/index-extensions.ts"],"names":[],"mappings":"AAwKA,OAAO,EACN,sBAAsB,EACtB,0BAA0B,EAC1B,UAAU,EACV,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,4BAA4B,EAC5B,mBAAmB,EACnB,iBAAiB,EACjB,yBAAyB,EACzB,8BAA8B,EAC9B,uBAAuB,EACvB,kCAAkC,EAClC,wBAAwB,EACxB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,EAC3B,0BAA0B,EAC1B,mCAAmC,EACnC,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,4BAA4B,CAAC","sourcesContent":["// Extension system\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentActivityOutcome,\n\tAgentBeforeSettleEvent,\n\tAgentBeforeSettleEventResult,\n\tAgentEndEvent,\n\tAgentSettledEvent,\n\tAgentStartEvent,\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppKeybinding,\n\tAtomicProviderCompat,\n\tAutocompleteProviderFactory,\n\tBashToolCallEvent,\n\tBeforeAgentStartCustomEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeAgentStartUserEvent,\n\tBeforeProviderHeadersEvent,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBoundaryContextPreview,\n\tBoundaryResult,\n\tBoundaryState,\n\tBuildSystemPromptOptions,\n\tCompactionEntryDraft,\n\tCompactOptions,\n\tConstrainedSamplingConfig,\n\tContextEditEntryDraft,\n\tContextEvent,\n\tContextEventResult,\n\tContextUsage,\n\tContextWithSystemEvent,\n\tCustomEntryDraft,\n\tCustomMessageEntryDraft,\n\tCustomToolCallEvent,\n\tEditToolCallEvent,\n\tEntryRenderer,\n\tEntryRenderOptions,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\tExtensionCustomComponent,\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\tExtensionRuntime,\n\tExtensionScopedModels,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tHostInputFormField,\n\tHostInputFormFieldType,\n\tHostInputFormRequest,\n\tHostSessionPickerHandle,\n\tHostSessionPickerRequest,\n\tHostSessionPickerRow,\n\tInlineExtension,\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tInstallReactiveWidgetOptions,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tMarkdownTransformContext,\n\tMarkdownTransformer,\n\tMessageEndEventResult,\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tModelSelectEvent,\n\tModelSelectSource,\n\tOrchestrationContext,\n\tPendingRecoveryDelivery,\n\tPowerShellToolCallEvent,\n\tProjectTrustContext,\n\tProjectTrustEvent,\n\tProjectTrustEventDecision,\n\tProjectTrustEventResult,\n\tProjectTrustHandler,\n\tProviderAliasConfig,\n\tProviderConfig,\n\tProviderModelConfig,\n\tProviderStreamEvent,\n\tReactiveWidgetAction,\n\tReactiveWidgetComponent,\n\tReactiveWidgetController,\n\tReactiveWidgetFactory,\n\tReactiveWidgetRefreshReason,\n\tReactiveWidgetRenderContext,\n\tReactiveWidgetRenderState,\n\tReactiveWidgetScheduler,\n\tReactiveWidgetTimerApi,\n\tReactiveWidgetTimerHandle,\n\tReactiveWidgetUi,\n\tReadToolCallEvent,\n\tRegisteredCommand,\n\tRegisteredTool,\n\tResolvedCommand,\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tScopedModel,\n\tScrollableWidgetComponent,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionBoundaryDraft,\n\tSessionCompactEvent,\n\tSessionCompactFailedEvent,\n\tSessionInfoChangedEvent,\n\tSessionRecoveryReason,\n\tSessionRecoveryReplayDecision,\n\tSessionRecoveryReplayEvent,\n\tSessionRecoveryReplayResult,\n\tSessionRecoveryRestoreEvent,\n\tSessionRecoveryRestoreResult,\n\tSessionShutdownEvent,\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSlashCommandInfo,\n\tSlashCommandSource,\n\tSourceInfo,\n\tSubagentChildPolicy,\n\tSubagentIntercomIdentity,\n\tTerminalInputHandler,\n\tThinkingLevelSelectEvent,\n\tToolCallEvent,\n\tToolCallEventResult,\n\tToolDefinition,\n\tToolExecutionEndEvent,\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTurnEndEvent,\n\tTurnEndEventResult,\n\tTurnStartEvent,\n\tUIPromptEndEvent,\n\tUIPromptKind,\n\tUIPromptStartEvent,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWidgetScrollRequest,\n\tWidgetScrollState,\n\tWorkflowPendingStageDelivery,\n\tWorkflowStageOrchestrationContext,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n} from \"./core/extensions/index.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdecideReactiveWidgetAction,\n\tdefineTool,\n\tdiscoverAndLoadExtensions,\n\tExtensionRunner,\n\tinstallReactiveWidget,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisLsToolResult,\n\tisPowerShellToolResult,\n\tisReadToolResult,\n\tisStaleExtensionContextError,\n\tisToolCallEventType,\n\tisWriteToolResult,\n\tOVERLAY_ACTIVE_ROW_MARKER,\n\tSTALE_EXTENSION_CONTEXT_MARKER,\n\tWorkflowRunControlError,\n\tWorkflowRunControlUnavailableError,\n\tWorkflowRunNotFoundError,\n\tWorkflowRunNotResumableError,\n\tWorkflowRunOwnershipError,\n\tWorkflowRunStorageError,\n\tWorkflowStageAmbiguousError,\n\tWorkflowStageNotFoundError,\n\tWorkflowStageResumeUnsupportedError,\n\twrapRegisteredTool,\n\twrapRegisteredTools,\n} from \"./core/extensions/index.js\";\nexport type * from \"./core/extensions/workflow-events.js\";\nexport type * from \"./core/extensions/workflow-run-control.js\";\n"]}