@astralyn/pi 1.4.6 → 1.4.8

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 (253) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/bundle/chunks/{chunk-EYKC6ESU.js → chunk-5VIOGR76.js} +1 -1
  3. package/dist/bundle/chunks/{chunk-KDO6L76C.js → chunk-FODCTZXW.js} +4 -4
  4. package/dist/bundle/chunks/{chunk-RBTJBQWX.js → chunk-I2COK45I.js} +136 -137
  5. package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
  7. package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
  8. package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
  9. package/dist/bundle/chunks/{execute-5ZQUS52M.js → execute-4CWRNHPO.js} +1 -1
  10. package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
  11. package/dist/bundle/chunks/{virtual-modules-KCQU7LOC.js → virtual-modules-BBLD7YLS.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/index.js +1 -1
  14. package/dist/bundle/rpc-entry.js +1 -1
  15. package/dist/core/agent-session.d.ts +0 -3
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +0 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/index.d.ts +1 -1
  20. package/dist/core/extensions/index.d.ts.map +1 -1
  21. package/dist/core/extensions/index.js.map +1 -1
  22. package/dist/core/package-manager.d.ts +3 -1
  23. package/dist/core/package-manager.d.ts.map +1 -1
  24. package/dist/core/package-manager.js +10 -0
  25. package/dist/core/package-manager.js.map +1 -1
  26. package/dist/core/resource-loader.d.ts +2 -0
  27. package/dist/core/resource-loader.d.ts.map +1 -1
  28. package/dist/core/resource-loader.js +17 -4
  29. package/dist/core/resource-loader.js.map +1 -1
  30. package/dist/core/settings-manager.d.ts +4 -2
  31. package/dist/core/settings-manager.d.ts.map +1 -1
  32. package/dist/core/settings-manager.js +11 -0
  33. package/dist/core/settings-manager.js.map +1 -1
  34. package/dist/core/settings-schema.d.ts +7 -0
  35. package/dist/core/settings-schema.d.ts.map +1 -1
  36. package/dist/core/settings-schema.js +6 -0
  37. package/dist/core/settings-schema.js.map +1 -1
  38. package/dist/core/skill-invocation.d.ts +46 -0
  39. package/dist/core/skill-invocation.d.ts.map +1 -0
  40. package/dist/core/skill-invocation.js +128 -0
  41. package/dist/core/skill-invocation.js.map +1 -0
  42. package/dist/core/skills.d.ts +10 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +23 -0
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/tasks/delivery.d.ts +11 -4
  47. package/dist/core/tasks/delivery.d.ts.map +1 -1
  48. package/dist/core/tasks/delivery.js +9 -9
  49. package/dist/core/tasks/delivery.js.map +1 -1
  50. package/dist/core/tasks/execution.d.ts +10 -3
  51. package/dist/core/tasks/execution.d.ts.map +1 -1
  52. package/dist/core/tasks/execution.js +72 -52
  53. package/dist/core/tasks/execution.js.map +1 -1
  54. package/dist/core/tasks/format.d.ts +0 -2
  55. package/dist/core/tasks/format.d.ts.map +1 -1
  56. package/dist/core/tasks/format.js +1 -16
  57. package/dist/core/tasks/format.js.map +1 -1
  58. package/dist/core/tasks/limits.d.ts +12 -1
  59. package/dist/core/tasks/limits.d.ts.map +1 -1
  60. package/dist/core/tasks/limits.js +20 -1
  61. package/dist/core/tasks/limits.js.map +1 -1
  62. package/dist/core/tasks/output.d.ts +6 -12
  63. package/dist/core/tasks/output.d.ts.map +1 -1
  64. package/dist/core/tasks/output.js +35 -32
  65. package/dist/core/tasks/output.js.map +1 -1
  66. package/dist/core/tasks/record.d.ts +45 -0
  67. package/dist/core/tasks/record.d.ts.map +1 -0
  68. package/dist/core/tasks/record.js +80 -0
  69. package/dist/core/tasks/record.js.map +1 -0
  70. package/dist/core/tasks/runtime.d.ts +14 -14
  71. package/dist/core/tasks/runtime.d.ts.map +1 -1
  72. package/dist/core/tasks/runtime.js +111 -93
  73. package/dist/core/tasks/runtime.js.map +1 -1
  74. package/dist/core/tasks/session.d.ts +0 -1
  75. package/dist/core/tasks/session.d.ts.map +1 -1
  76. package/dist/core/tasks/session.js +7 -8
  77. package/dist/core/tasks/session.js.map +1 -1
  78. package/dist/core/tasks/store.d.ts +18 -25
  79. package/dist/core/tasks/store.d.ts.map +1 -1
  80. package/dist/core/tasks/store.js +42 -40
  81. package/dist/core/tasks/store.js.map +1 -1
  82. package/dist/core/tasks/types.d.ts +96 -17
  83. package/dist/core/tasks/types.d.ts.map +1 -1
  84. package/dist/core/tasks/types.js.map +1 -1
  85. package/dist/core/tools/shell-execution.d.ts +8 -7
  86. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  87. package/dist/core/tools/shell-execution.js +18 -26
  88. package/dist/core/tools/shell-execution.js.map +1 -1
  89. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  90. package/dist/core/tools/shell-tool.js +31 -29
  91. package/dist/core/tools/shell-tool.js.map +1 -1
  92. package/dist/core/usage-totals.d.ts +3 -0
  93. package/dist/core/usage-totals.d.ts.map +1 -1
  94. package/dist/core/usage-totals.js +15 -0
  95. package/dist/core/usage-totals.js.map +1 -1
  96. package/dist/extensions/agent/progress.d.ts.map +1 -1
  97. package/dist/extensions/agent/progress.js +1 -11
  98. package/dist/extensions/agent/progress.js.map +1 -1
  99. package/dist/extensions/agent/settings-host.d.ts +33 -0
  100. package/dist/extensions/agent/settings-host.d.ts.map +1 -0
  101. package/dist/extensions/agent/settings-host.js +75 -0
  102. package/dist/extensions/agent/settings-host.js.map +1 -0
  103. package/dist/extensions/agent/settings.d.ts.map +1 -1
  104. package/dist/extensions/agent/settings.js +18 -7
  105. package/dist/extensions/agent/settings.js.map +1 -1
  106. package/dist/extensions/agent/tool.d.ts.map +1 -1
  107. package/dist/extensions/agent/tool.js +9 -5
  108. package/dist/extensions/agent/tool.js.map +1 -1
  109. package/dist/extensions/agent/worker.d.ts.map +1 -1
  110. package/dist/extensions/agent/worker.js +3 -5
  111. package/dist/extensions/agent/worker.js.map +1 -1
  112. package/dist/extensions/btw/agent.d.ts +1 -1
  113. package/dist/extensions/btw/agent.d.ts.map +1 -1
  114. package/dist/extensions/btw/agent.js +3 -20
  115. package/dist/extensions/btw/agent.js.map +1 -1
  116. package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
  117. package/dist/extensions/cached-compaction/index.js +3 -22
  118. package/dist/extensions/cached-compaction/index.js.map +1 -1
  119. package/dist/extensions/cached-compaction/render.d.ts +1 -0
  120. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  121. package/dist/extensions/cached-compaction/render.js +42 -14
  122. package/dist/extensions/cached-compaction/render.js.map +1 -1
  123. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  124. package/dist/extensions/deepwiki/client.js +6 -78
  125. package/dist/extensions/deepwiki/client.js.map +1 -1
  126. package/dist/extensions/deepwiki/transport.d.ts +3 -0
  127. package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
  128. package/dist/extensions/deepwiki/transport.js +96 -0
  129. package/dist/extensions/deepwiki/transport.js.map +1 -0
  130. package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
  131. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  132. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  133. package/dist/extensions/provider/ui/compat.d.ts +3 -3
  134. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  135. package/dist/extensions/provider/ui/compat.js.map +1 -1
  136. package/dist/extensions/provider/ui/controls.d.ts +2 -2
  137. package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
  138. package/dist/extensions/provider/ui/controls.js.map +1 -1
  139. package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
  140. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
  141. package/dist/extensions/provider/ui/dialogs.js.map +1 -1
  142. package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
  143. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  144. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  145. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  146. package/dist/extensions/provider/ui/editor.js +1 -3
  147. package/dist/extensions/provider/ui/editor.js.map +1 -1
  148. package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
  149. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  150. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  151. package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
  152. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  153. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  154. package/dist/extensions/provider/ui/model-options.d.ts +6 -6
  155. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  156. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  157. package/dist/extensions/provider/ui/pane.d.ts +21 -12
  158. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  159. package/dist/extensions/provider/ui/pane.js.map +1 -1
  160. package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
  161. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  162. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  163. package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
  164. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  165. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  166. package/dist/extensions/run-summary/format.js +1 -1
  167. package/dist/extensions/run-summary/format.js.map +1 -1
  168. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  169. package/dist/extensions/statusline/usage.js +2 -6
  170. package/dist/extensions/statusline/usage.js.map +1 -1
  171. package/dist/extensions/tasks/tool/actions.d.ts +1 -1
  172. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  173. package/dist/extensions/tasks/tool/actions.js +49 -106
  174. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  175. package/dist/extensions/tasks/tool/constants.d.ts +1 -6
  176. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  177. package/dist/extensions/tasks/tool/constants.js +1 -6
  178. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  179. package/dist/extensions/tasks/tool/schema.d.ts +0 -3
  180. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  181. package/dist/extensions/tasks/tool/schema.js +4 -13
  182. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  183. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  184. package/dist/extensions/tasks/tool.js +2 -2
  185. package/dist/extensions/tasks/tool.js.map +1 -1
  186. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  187. package/dist/extensions/tasks/ui/completion-render.js +31 -33
  188. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  189. package/dist/extensions/tasks/ui/layout.d.ts +7 -7
  190. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  191. package/dist/extensions/tasks/ui/layout.js +17 -19
  192. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  193. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  194. package/dist/extensions/tasks/ui/list.js +2 -3
  195. package/dist/extensions/tasks/ui/list.js.map +1 -1
  196. package/dist/extensions/tasks/ui/manager.d.ts +16 -7
  197. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  198. package/dist/extensions/tasks/ui/manager.js +163 -131
  199. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  200. package/dist/extensions/tasks/ui/model.d.ts +25 -0
  201. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  202. package/dist/extensions/tasks/ui/model.js +4 -0
  203. package/dist/extensions/tasks/ui/model.js.map +1 -1
  204. package/dist/extensions/tasks/ui/render.d.ts +1 -1
  205. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  206. package/dist/extensions/tasks/ui/render.js +11 -7
  207. package/dist/extensions/tasks/ui/render.js.map +1 -1
  208. package/dist/extensions/tasks/ui/status.d.ts +15 -0
  209. package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
  210. package/dist/extensions/tasks/ui/status.js +16 -0
  211. package/dist/extensions/tasks/ui/status.js.map +1 -0
  212. package/dist/index.d.ts +1 -1
  213. package/dist/index.d.ts.map +1 -1
  214. package/dist/index.js.map +1 -1
  215. package/dist/modes/interactive/components/config-selector.d.ts +17 -2
  216. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  217. package/dist/modes/interactive/components/config-selector.js +199 -18
  218. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  219. package/dist/modes/interactive/components/status-marker.d.ts +2 -1
  220. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  221. package/dist/modes/interactive/components/status-marker.js +0 -1
  222. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  223. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  224. package/dist/modes/interactive/interactive-mode.js +7 -1
  225. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  226. package/dist/utils/duration.d.ts +3 -0
  227. package/dist/utils/duration.d.ts.map +1 -0
  228. package/dist/utils/duration.js +17 -0
  229. package/dist/utils/duration.js.map +1 -0
  230. package/dist/utils/number.d.ts +3 -0
  231. package/dist/utils/number.d.ts.map +1 -0
  232. package/dist/utils/number.js +5 -0
  233. package/dist/utils/number.js.map +1 -0
  234. package/docs/bundled/extensions/agent.md +3 -3
  235. package/docs/bundled/extensions/cached-compaction.md +13 -4
  236. package/docs/bundled/extensions/deepwiki.md +3 -1
  237. package/docs/extensions.md +5 -5
  238. package/docs/packages.md +5 -3
  239. package/docs/sdk.md +1 -1
  240. package/docs/session-format.md +1 -1
  241. package/docs/settings.md +11 -0
  242. package/docs/skills.md +23 -0
  243. package/npm-shrinkwrap.json +2 -2
  244. package/package.json +1 -1
  245. package/schemas/settings.schema.json +36 -0
  246. package/dist/extensions/deepwiki/http.d.ts +0 -13
  247. package/dist/extensions/deepwiki/http.d.ts.map +0 -1
  248. package/dist/extensions/deepwiki/http.js +0 -88
  249. package/dist/extensions/deepwiki/http.js.map +0 -1
  250. package/dist/extensions/tasks/ui/task-view.d.ts +0 -8
  251. package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
  252. package/dist/extensions/tasks/ui/task-view.js +0 -13
  253. package/dist/extensions/tasks/ui/task-view.js.map +0 -1
@@ -27,9 +27,6 @@ export class TaskSession {
27
27
  get service() {
28
28
  return this._service;
29
29
  }
30
- get waitInterruptSignal() {
31
- return this.waitInterrupt.signal;
32
- }
33
30
  /** End only current task waits; the next wait observes a fresh signal. */
34
31
  interruptWaits() {
35
32
  const previous = this.waitInterrupt;
@@ -85,17 +82,19 @@ export class TaskSession {
85
82
  const generation = ++this.generation;
86
83
  const sessionId = manager.getSessionId();
87
84
  const sessionFile = manager.getSessionFile();
88
- const waitInterruptSignal = () => this.waitInterruptSignal;
85
+ const interrupts = () => this.waitInterrupt.signal;
89
86
  const service = new TaskRuntime({
90
87
  enabled: this.enabled,
91
88
  backgroundAllowed,
92
89
  session: {
93
- get waitInterruptSignal() {
94
- return waitInterruptSignal();
95
- },
96
- prepareWait: (toolCallId, taskId) => this.delivery.prepareWait(toolCallId, taskId),
97
90
  stoppedByTreeNavigation: (targetId) => this.stoppedByTreeNavigation(targetId, service),
98
91
  },
92
+ waits: {
93
+ get interruptSignal() {
94
+ return interrupts();
95
+ },
96
+ bind: (toolCallId, taskId) => this.delivery.bindWait(service, toolCallId, taskId),
97
+ },
99
98
  anchor: () => manager.getLeafId(),
100
99
  onCleanupError: (message) => this.warn("task_cleanup", message),
101
100
  onSettled: (task, usage) => {
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/tasks/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { AgentMessage, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { SessionEntry, SessionManager } from \"../session-manager.ts\";\nimport { truncateHead } from \"../tools/truncate.ts\";\nimport { getTaskUsageRecord } from \"../usage-totals.ts\";\nimport { TASK_RECORD_TYPE, TASK_SNAPSHOT_VERSION } from \"./codec.ts\";\nimport { TaskDelivery } from \"./delivery.ts\";\nimport { TaskContextReminder } from \"./reminder.ts\";\nimport { TaskRuntime } from \"./runtime.ts\";\nimport type { TaskSnapshot } from \"./types.ts\";\n\ninterface TaskSessionOptions {\n\tmanager: SessionManager;\n\tbackgroundAllowed?: boolean;\n\t/** The main session owns input queues, preflight and idle state. */\n\tcanDeliver(): boolean;\n\t/**\n\t * Start a completion turn, or enqueue the message and return waitForPersistence().\n\t * The host owns input routing; this adapter owns the queued delivery's lifetime.\n\t */\n\tdeliver(message: CustomMessage, waitForPersistence: () => Promise<void>): Promise<void>;\n\tonEntry(entry: SessionEntry): void;\n\tonError(event: string, message: string): void;\n}\n\nexport interface QuarantinedTaskSettlement {\n\tsessionId: string;\n\tgeneration: number;\n\ttask: TaskSnapshot;\n\tusage?: Usage;\n}\n\n/** Session persistence and completion delivery; execution supervision stays in TaskRuntime. */\nexport class TaskSession {\n\tprivate readonly options: TaskSessionOptions;\n\tprivate _service: TaskRuntime;\n\tprivate enabled = false;\n\tprivate disposed = false;\n\tprivate generation = 0;\n\tprivate waitInterrupt = new AbortController();\n\tprivate readonly contextReminder = new TaskContextReminder();\n\treadonly delivery: TaskDelivery;\n\tprivate readonly quarantine: QuarantinedTaskSettlement[] = [];\n\n\tconstructor(options: TaskSessionOptions) {\n\t\tthis.options = options;\n\t\tthis.delivery = new TaskDelivery({\n\t\t\tservice: () => this.service,\n\t\t\tcanDeliver: options.canDeliver,\n\t\t\tdeliver: options.deliver,\n\t\t\twarn: (event, message) => this.warn(event, message),\n\t\t});\n\t\tthis._service = this.createService();\n\t}\n\n\tget service(): TaskRuntime {\n\t\treturn this._service;\n\t}\n\n\tget waitInterruptSignal(): AbortSignal {\n\t\treturn this.waitInterrupt.signal;\n\t}\n\n\t/** End only current task waits; the next wait observes a fresh signal. */\n\tinterruptWaits(): void {\n\t\tconst previous = this.waitInterrupt;\n\t\tthis.waitInterrupt = new AbortController();\n\t\tprevious.abort();\n\t}\n\n\tnoteCompaction(): void {\n\t\tthis.contextReminder.compacted();\n\t}\n\n\tprojectContextReminder(messages: AgentMessage[]): AgentMessage[] {\n\t\treturn this.contextReminder.project(this.service, messages);\n\t}\n\n\tnoteAssistantCompleted(): void {\n\t\tthis.contextReminder.assistantCompleted();\n\t}\n\n\tget quarantinedSettlements(): readonly QuarantinedTaskSettlement[] {\n\t\treturn structuredClone(this.quarantine);\n\t}\n\n\tsetEnabled(enabled: boolean): void {\n\t\tthis.enabled = enabled && this.options.backgroundAllowed !== false;\n\t\tthis.service.setEnabled(this.enabled);\n\t}\n\n\t/**\n\t * Running tasks that navigating to `targetId` would cancel, since results are saved on their\n\t * launch branch. Mirrors navigateTree's destination: selecting a user or custom message moves\n\t * the leaf to its parent.\n\t */\n\tstoppedByTreeNavigation(targetId: string, service = this.service): TaskSnapshot[] {\n\t\tconst target = this.options.manager.getEntry(targetId);\n\t\tif (!target) return [];\n\t\tconst leafId =\n\t\t\t(target.type === \"message\" && target.message.role === \"user\") || target.type === \"custom_message\"\n\t\t\t\t? target.parentId\n\t\t\t\t: targetId;\n\t\treturn service.activeOutsideBranch(this.branchIds(leafId));\n\t}\n\n\t/** Cancel running tasks launched outside the branch ending at `leafId`. */\n\tcancelOutsideBranch(leafId: string | null): Promise<void> {\n\t\treturn this.service.cancelOutsideBranch(this.branchIds(leafId));\n\t}\n\n\tprivate branchIds(leafId: string | null): Set<string> {\n\t\treturn new Set(leafId === null ? [] : this.options.manager.getBranch(leafId).map((entry) => entry.id));\n\t}\n\n\t/** Called after the old service's bounded shutdown, while lifecycle delivery is paused. */\n\treplaceService(): void {\n\t\tthis.contextReminder.reset();\n\t\tthis.service.close();\n\t\tthis._service = this.createService();\n\t\tthis.delivery.retry();\n\t}\n\n\tprivate createService(): TaskRuntime {\n\t\tconst { manager, backgroundAllowed } = this.options;\n\t\tconst generation = ++this.generation;\n\t\tconst sessionId = manager.getSessionId();\n\t\tconst sessionFile = manager.getSessionFile();\n\t\tconst waitInterruptSignal = () => this.waitInterruptSignal;\n\t\tconst service: TaskRuntime = new TaskRuntime({\n\t\t\tenabled: this.enabled,\n\t\t\tbackgroundAllowed,\n\t\t\tsession: {\n\t\t\t\tget waitInterruptSignal() {\n\t\t\t\t\treturn waitInterruptSignal();\n\t\t\t\t},\n\t\t\t\tprepareWait: (toolCallId, taskId) => this.delivery.prepareWait(toolCallId, taskId),\n\t\t\t\tstoppedByTreeNavigation: (targetId): TaskSnapshot[] => this.stoppedByTreeNavigation(targetId, service),\n\t\t\t},\n\t\t\tanchor: () => manager.getLeafId(),\n\t\t\tonCleanupError: (message) => this.warn(\"task_cleanup\", message),\n\t\t\tonSettled: (task, usage) => {\n\t\t\t\tconst onBranch =\n\t\t\t\t\tmanager.getSessionId() === sessionId &&\n\t\t\t\t\t(task.anchorId === null || manager.getBranch().some((entry) => entry.id === task.anchorId));\n\t\t\t\tif (this.disposed || this.service !== service || !onBranch) {\n\t\t\t\t\tthis.quarantineSettlement({ sessionId, generation, task, usage }, sessionFile);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.persistSettlement(task, usage);\n\t\t\t},\n\t\t});\n\t\tthis.restoreHistory(service);\n\t\tservice.subscribe(() => this.delivery.schedule());\n\t\treturn service;\n\t}\n\n\trestoreHistory(service = this.service): void {\n\t\tconst records: unknown[] = [];\n\t\tconst toolResults = new Map<string, AgentToolResult<unknown>[\"content\"]>();\n\t\tfor (const entry of this.options.manager.getBranch()) {\n\t\t\tif (entry.type === \"custom\" && entry.customType === TASK_RECORD_TYPE) records.push(entry.data);\n\t\t\telse if (entry.type === \"message\" && entry.message.role === \"toolResult\")\n\t\t\t\ttoolResults.set(entry.message.toolCallId, entry.message.content);\n\t\t}\n\t\tservice.restoreHistory(records, toolResults);\n\t}\n\n\tprivate quarantineSettlement(record: QuarantinedTaskSettlement, sessionFile: string | undefined): void {\n\t\t// Never move the active leaf to append late usage: JSONL's last entry also\n\t\t// selects its resumed branch. The sidecar is diagnostic evidence only.\n\t\tthis.quarantine.push(structuredClone(record));\n\t\tif (this.quarantine.length > 32) this.quarantine.shift();\n\t\tlet persistence =\n\t\t\t\"Not persisted: only the latest 32 snapshots are retained in quarantinedTaskSettlements; late usage is not accounted in session totals.\";\n\t\tif (sessionFile) {\n\t\t\ttry {\n\t\t\t\tmkdirSync(dirname(sessionFile), { recursive: true });\n\t\t\t\tappendFileSync(`${sessionFile}.tasks-late.jsonl`, `${JSON.stringify({ version: 1, ...record })}\\n`);\n\t\t\t\tpersistence = `Saved diagnostic sidecar: ${sessionFile}.tasks-late.jsonl (not included in normal session totals).`;\n\t\t\t} catch {\n\t\t\t\tpersistence = `Sidecar write failed. ${persistence}`;\n\t\t\t}\n\t\t}\n\t\tthis.warn(\n\t\t\t\"task_settlement_quarantined\",\n\t\t\t`Late background settlement ${record.task.id} was quarantined. ${persistence}`,\n\t\t);\n\t}\n\n\t/** One entry per settlement: the bounded terminal snapshot and its first usage settlement. */\n\tprivate persistSettlement(task: TaskSnapshot, usage: Usage | undefined): void {\n\t\tconst manager = this.options.manager;\n\t\tconst accounted = usage && manager.getEntries().some((entry) => getTaskUsageRecord(entry)?.taskId === task.id);\n\t\t// A foreground result is the tool result the transcript already saves; restoration reads it from there.\n\t\tconst { result: _result, ...metadata } = task;\n\t\tconst saved = task.mode === \"foreground\" ? metadata : task;\n\t\tconst data = JSON.parse(\n\t\t\tJSON.stringify({ version: TASK_SNAPSHOT_VERSION, task: saved, ...(usage && !accounted ? { usage } : {}) }),\n\t\t);\n\t\tconst entry = manager.getEntry(manager.appendCustomEntry(TASK_RECORD_TYPE, data));\n\t\tif (!entry) return;\n\t\ttry {\n\t\t\tthis.options.onEntry(entry);\n\t\t} catch {\n\t\t\t// Observers cannot interrupt settlement or result publication.\n\t\t}\n\t}\n\n\tprivate warn(event: string, message: string): void {\n\t\ttry {\n\t\t\tthis.options.onError(event, truncateHead(message, { maxBytes: 4096, maxLines: 32 }).content);\n\t\t} catch {\n\t\t\t// Diagnostics cannot reject settlement, cleanup or scheduled callbacks.\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.contextReminder.reset();\n\t\tthis.interruptWaits();\n\t\tthis.service.close();\n\t\tthis.delivery.dispose();\n\t}\n}\n"]}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/tasks/session.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { AgentMessage, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport type { SessionEntry, SessionManager } from \"../session-manager.ts\";\nimport { truncateHead } from \"../tools/truncate.ts\";\nimport { getTaskUsageRecord } from \"../usage-totals.ts\";\nimport { TASK_RECORD_TYPE, TASK_SNAPSHOT_VERSION } from \"./codec.ts\";\nimport { TaskDelivery } from \"./delivery.ts\";\nimport { TaskContextReminder } from \"./reminder.ts\";\nimport { TaskRuntime } from \"./runtime.ts\";\nimport type { TaskSnapshot } from \"./types.ts\";\n\ninterface TaskSessionOptions {\n\tmanager: SessionManager;\n\tbackgroundAllowed?: boolean;\n\t/** The main session owns input queues, preflight and idle state. */\n\tcanDeliver(): boolean;\n\t/**\n\t * Start a completion turn, or enqueue the message and return waitForPersistence().\n\t * The host owns input routing; this adapter owns the queued delivery's lifetime.\n\t */\n\tdeliver(message: CustomMessage, waitForPersistence: () => Promise<void>): Promise<void>;\n\tonEntry(entry: SessionEntry): void;\n\tonError(event: string, message: string): void;\n}\n\nexport interface QuarantinedTaskSettlement {\n\tsessionId: string;\n\tgeneration: number;\n\ttask: TaskSnapshot;\n\tusage?: Usage;\n}\n\n/** Session persistence and completion delivery; execution supervision stays in TaskRuntime. */\nexport class TaskSession {\n\tprivate readonly options: TaskSessionOptions;\n\tprivate _service: TaskRuntime;\n\tprivate enabled = false;\n\tprivate disposed = false;\n\tprivate generation = 0;\n\tprivate waitInterrupt = new AbortController();\n\tprivate readonly contextReminder = new TaskContextReminder();\n\treadonly delivery: TaskDelivery;\n\tprivate readonly quarantine: QuarantinedTaskSettlement[] = [];\n\n\tconstructor(options: TaskSessionOptions) {\n\t\tthis.options = options;\n\t\tthis.delivery = new TaskDelivery({\n\t\t\tservice: () => this.service,\n\t\t\tcanDeliver: options.canDeliver,\n\t\t\tdeliver: options.deliver,\n\t\t\twarn: (event, message) => this.warn(event, message),\n\t\t});\n\t\tthis._service = this.createService();\n\t}\n\n\tget service(): TaskRuntime {\n\t\treturn this._service;\n\t}\n\n\t/** End only current task waits; the next wait observes a fresh signal. */\n\tinterruptWaits(): void {\n\t\tconst previous = this.waitInterrupt;\n\t\tthis.waitInterrupt = new AbortController();\n\t\tprevious.abort();\n\t}\n\n\tnoteCompaction(): void {\n\t\tthis.contextReminder.compacted();\n\t}\n\n\tprojectContextReminder(messages: AgentMessage[]): AgentMessage[] {\n\t\treturn this.contextReminder.project(this.service, messages);\n\t}\n\n\tnoteAssistantCompleted(): void {\n\t\tthis.contextReminder.assistantCompleted();\n\t}\n\n\tget quarantinedSettlements(): readonly QuarantinedTaskSettlement[] {\n\t\treturn structuredClone(this.quarantine);\n\t}\n\n\tsetEnabled(enabled: boolean): void {\n\t\tthis.enabled = enabled && this.options.backgroundAllowed !== false;\n\t\tthis.service.setEnabled(this.enabled);\n\t}\n\n\t/**\n\t * Running tasks that navigating to `targetId` would cancel, since results are saved on their\n\t * launch branch. Mirrors navigateTree's destination: selecting a user or custom message moves\n\t * the leaf to its parent.\n\t */\n\tstoppedByTreeNavigation(targetId: string, service = this.service): TaskSnapshot[] {\n\t\tconst target = this.options.manager.getEntry(targetId);\n\t\tif (!target) return [];\n\t\tconst leafId =\n\t\t\t(target.type === \"message\" && target.message.role === \"user\") || target.type === \"custom_message\"\n\t\t\t\t? target.parentId\n\t\t\t\t: targetId;\n\t\treturn service.activeOutsideBranch(this.branchIds(leafId));\n\t}\n\n\t/** Cancel running tasks launched outside the branch ending at `leafId`. */\n\tcancelOutsideBranch(leafId: string | null): Promise<void> {\n\t\treturn this.service.cancelOutsideBranch(this.branchIds(leafId));\n\t}\n\n\tprivate branchIds(leafId: string | null): Set<string> {\n\t\treturn new Set(leafId === null ? [] : this.options.manager.getBranch(leafId).map((entry) => entry.id));\n\t}\n\n\t/** Called after the old service's bounded shutdown, while lifecycle delivery is paused. */\n\treplaceService(): void {\n\t\tthis.contextReminder.reset();\n\t\tthis.service.close();\n\t\tthis._service = this.createService();\n\t\tthis.delivery.retry();\n\t}\n\n\tprivate createService(): TaskRuntime {\n\t\tconst { manager, backgroundAllowed } = this.options;\n\t\tconst generation = ++this.generation;\n\t\tconst sessionId = manager.getSessionId();\n\t\tconst sessionFile = manager.getSessionFile();\n\t\tconst interrupts = () => this.waitInterrupt.signal;\n\t\tconst service: TaskRuntime = new TaskRuntime({\n\t\t\tenabled: this.enabled,\n\t\t\tbackgroundAllowed,\n\t\t\tsession: {\n\t\t\t\tstoppedByTreeNavigation: (targetId): TaskSnapshot[] => this.stoppedByTreeNavigation(targetId, service),\n\t\t\t},\n\t\t\twaits: {\n\t\t\t\tget interruptSignal() {\n\t\t\t\t\treturn interrupts();\n\t\t\t\t},\n\t\t\t\tbind: (toolCallId, taskId) => this.delivery.bindWait(service, toolCallId, taskId),\n\t\t\t},\n\t\t\tanchor: () => manager.getLeafId(),\n\t\t\tonCleanupError: (message) => this.warn(\"task_cleanup\", message),\n\t\t\tonSettled: (task, usage) => {\n\t\t\t\tconst onBranch =\n\t\t\t\t\tmanager.getSessionId() === sessionId &&\n\t\t\t\t\t(task.anchorId === null || manager.getBranch().some((entry) => entry.id === task.anchorId));\n\t\t\t\tif (this.disposed || this.service !== service || !onBranch) {\n\t\t\t\t\tthis.quarantineSettlement({ sessionId, generation, task, usage }, sessionFile);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.persistSettlement(task, usage);\n\t\t\t},\n\t\t});\n\t\tthis.restoreHistory(service);\n\t\tservice.subscribe(() => this.delivery.schedule());\n\t\treturn service;\n\t}\n\n\trestoreHistory(service = this.service): void {\n\t\tconst records: unknown[] = [];\n\t\tconst toolResults = new Map<string, AgentToolResult<unknown>[\"content\"]>();\n\t\tfor (const entry of this.options.manager.getBranch()) {\n\t\t\tif (entry.type === \"custom\" && entry.customType === TASK_RECORD_TYPE) records.push(entry.data);\n\t\t\telse if (entry.type === \"message\" && entry.message.role === \"toolResult\")\n\t\t\t\ttoolResults.set(entry.message.toolCallId, entry.message.content);\n\t\t}\n\t\tservice.restoreHistory(records, toolResults);\n\t}\n\n\tprivate quarantineSettlement(record: QuarantinedTaskSettlement, sessionFile: string | undefined): void {\n\t\t// Never move the active leaf to append late usage: JSONL's last entry also\n\t\t// selects its resumed branch. The sidecar is diagnostic evidence only.\n\t\tthis.quarantine.push(structuredClone(record));\n\t\tif (this.quarantine.length > 32) this.quarantine.shift();\n\t\tlet persistence =\n\t\t\t\"Not persisted: only the latest 32 snapshots are retained in quarantinedTaskSettlements; late usage is not accounted in session totals.\";\n\t\tif (sessionFile) {\n\t\t\ttry {\n\t\t\t\tmkdirSync(dirname(sessionFile), { recursive: true });\n\t\t\t\tappendFileSync(`${sessionFile}.tasks-late.jsonl`, `${JSON.stringify({ version: 1, ...record })}\\n`);\n\t\t\t\tpersistence = `Saved diagnostic sidecar: ${sessionFile}.tasks-late.jsonl (not included in normal session totals).`;\n\t\t\t} catch {\n\t\t\t\tpersistence = `Sidecar write failed. ${persistence}`;\n\t\t\t}\n\t\t}\n\t\tthis.warn(\n\t\t\t\"task_settlement_quarantined\",\n\t\t\t`Late background settlement ${record.task.id} was quarantined. ${persistence}`,\n\t\t);\n\t}\n\n\t/** One entry per settlement: the bounded terminal snapshot and its first usage settlement. */\n\tprivate persistSettlement(task: TaskSnapshot, usage: Usage | undefined): void {\n\t\tconst manager = this.options.manager;\n\t\tconst accounted = usage && manager.getEntries().some((entry) => getTaskUsageRecord(entry)?.taskId === task.id);\n\t\t// A foreground result is the tool result the transcript already saves; restoration reads it from there.\n\t\tconst { result: _result, ...metadata } = task;\n\t\tconst saved = task.mode === \"foreground\" ? metadata : task;\n\t\tconst data = JSON.parse(\n\t\t\tJSON.stringify({ version: TASK_SNAPSHOT_VERSION, task: saved, ...(usage && !accounted ? { usage } : {}) }),\n\t\t);\n\t\tconst entry = manager.getEntry(manager.appendCustomEntry(TASK_RECORD_TYPE, data));\n\t\tif (!entry) return;\n\t\ttry {\n\t\t\tthis.options.onEntry(entry);\n\t\t} catch {\n\t\t\t// Observers cannot interrupt settlement or result publication.\n\t\t}\n\t}\n\n\tprivate warn(event: string, message: string): void {\n\t\ttry {\n\t\t\tthis.options.onError(event, truncateHead(message, { maxBytes: 4096, maxLines: 32 }).content);\n\t\t} catch {\n\t\t\t// Diagnostics cannot reject settlement, cleanup or scheduled callbacks.\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.contextReminder.reset();\n\t\tthis.interruptWaits();\n\t\tthis.service.close();\n\t\tthis.delivery.dispose();\n\t}\n}\n"]}
@@ -1,38 +1,31 @@
1
1
  import type { AgentToolResult } from "@earendil-works/pi-agent-core";
2
- import type { TaskSnapshot } from "./types.ts";
3
- export interface TaskRecord {
4
- /** The runtime's working copy. Call changed() after every mutation. */
5
- task: TaskSnapshot;
6
- settled: boolean;
7
- /** Whether the launch anchor is on the selected branch. */
8
- visible: boolean;
9
- /**
10
- * none: running, or answered inline by its tool call; pending: a settled handoff
11
- * awaiting automatic delivery; claimed: handed to the host; delivered: acknowledged.
12
- */
13
- delivery: "none" | "pending" | "claimed" | "delivered";
14
- pins: number;
15
- deliveryHolds: number;
16
- cleanup?: () => void | Promise<void>;
17
- readError?: string;
18
- waiters: Set<() => void>;
19
- /** Frozen snapshot shared by readers until the task changes. */
20
- snapshot?: TaskSnapshot;
21
- }
2
+ import { TaskRecord } from "./record.ts";
22
3
  export declare const EXPIRED_OUTPUT = "Output has expired: the managed log was released; showing the stored result.";
23
- /** Readers share one frozen copy, so polling and status rendering never clone unchanged output. */
24
- export declare function snapshotOf(record: TaskRecord): TaskSnapshot;
25
- export declare function changed(record: TaskRecord): void;
26
4
  /** Retained snapshots and output leases. This store never owns executable handles. */
27
5
  export declare class TaskStore {
28
- readonly records: Map<string, TaskRecord>;
29
- readonly cleanups: Set<Promise<void>>;
6
+ private readonly records;
7
+ private readonly cleanups;
30
8
  private readonly maxHistory;
31
9
  private readonly maxRetained;
32
10
  private readonly isClosed;
33
11
  private readonly onCleanupError?;
34
12
  constructor(maxHistory: number, maxRetained: number, isClosed: () => boolean, onCleanupError?: (message: string) => void);
35
13
  private get closed();
14
+ get(id: string): TaskRecord | undefined;
15
+ /** Records whose ID, or whose ID without its kind prefix, starts with `prefix`. */
16
+ match(prefix: string): TaskRecord[];
17
+ add(record: TaskRecord): void;
18
+ all(): TaskRecord[];
19
+ /** Records whose execution has not settled, queued or running. */
20
+ unsettled(): TaskRecord[];
21
+ /** Records on the selected branch. */
22
+ visible(): TaskRecord[];
23
+ /** Settled handoffs eligible for automatic delivery. */
24
+ deliverable(): TaskRecord[];
25
+ /** Records plus output cleanups still running; admission bounds this. */
26
+ retainedCount(): number;
27
+ /** Settles once every output cleanup started so far has finished. */
28
+ cleanupsDone(): Promise<unknown>;
36
29
  /**
37
30
  * Foreground records save no output of their own: their tool result already holds it,
38
31
  * so `toolResults` maps each tool call ID on the branch to that content.
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,UAAU;IAC1B,uEAAuE;IACvE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACzB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,eAAO,MAAM,cAAc,iFAAiF,CAAC;AAU7G,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAG3D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAEhD;AAoBD,sFAAsF;AACtF,qBAAa,SAAS;IACrB,QAAQ,CAAC,OAAO,0BAAiC;IACjD,QAAQ,CAAC,QAAQ,qBAA4B;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA4B;gBAE3D,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,OAAO,EACvB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAO3C,OAAO,KAAK,MAAM,GAEjB;IAED;;;OAGG;IACH,cAAc,CACb,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAa,GAC/E,IAAI;IAwDP,OAAO,CAAC,aAAa;IAqBrB,0FAA0F;IAC1F,OAAO,CAAC,cAAc;IAMtB,IAAI,IAAI,IAAI;CAoBZ"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,eAAO,MAAM,cAAc,iFAAiF,CAAC;AAY7G,sFAAsF;AACtF,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA4B;gBAE3D,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,OAAO,EACvB,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAO3C,OAAO,KAAK,MAAM,GAEjB;IAED,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,mFAAmF;IACnF,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE;IAMnC,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI7B,GAAG,IAAI,UAAU,EAAE;IAInB,kEAAkE;IAClE,SAAS,IAAI,UAAU,EAAE;IAIzB,sCAAsC;IACtC,OAAO,IAAI,UAAU,EAAE;IAIvB,wDAAwD;IACxD,WAAW,IAAI,UAAU,EAAE;IAI3B,yEAAyE;IACzE,aAAa,IAAI,MAAM;IAIvB,qEAAqE;IACrE,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;OAGG;IACH,cAAc,CACb,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAa,GAC/E,IAAI;IA+CP,OAAO,CAAC,aAAa;IAsBrB,0FAA0F;IAC1F,OAAO,CAAC,cAAc;IAItB,IAAI,IAAI,IAAI;CAoBZ"}
@@ -1,30 +1,7 @@
1
1
  import { readVersionedTask } from "./codec.js";
2
- import { boundText, resultText } from "./output.js";
2
+ import { errorText, resultText } from "./output.js";
3
+ import { TaskRecord } from "./record.js";
3
4
  export const EXPIRED_OUTPUT = "Output has expired: the managed log was released; showing the stored result.";
4
- function freeze(value) {
5
- if (value !== null && typeof value === "object" && !Object.isFrozen(value)) {
6
- for (const child of Object.values(value))
7
- freeze(child);
8
- Object.freeze(value);
9
- }
10
- return value;
11
- }
12
- /** Readers share one frozen copy, so polling and status rendering never clone unchanged output. */
13
- export function snapshotOf(record) {
14
- record.snapshot ??= freeze(structuredClone(record.task));
15
- return record.snapshot;
16
- }
17
- export function changed(record) {
18
- record.snapshot = undefined;
19
- }
20
- function errorText(error) {
21
- try {
22
- return boundText(error instanceof Error ? error.message : String(error), 4096);
23
- }
24
- catch {
25
- return "Task cleanup failed";
26
- }
27
- }
28
5
  function oldestTask(tasks) {
29
6
  let oldest;
30
7
  for (const task of tasks) {
@@ -47,6 +24,39 @@ export class TaskStore {
47
24
  get closed() {
48
25
  return this.isClosed();
49
26
  }
27
+ get(id) {
28
+ return this.records.get(id);
29
+ }
30
+ /** Records whose ID, or whose ID without its kind prefix, starts with `prefix`. */
31
+ match(prefix) {
32
+ return this.all().filter(({ task }) => task.id.startsWith(prefix) || task.id.slice(task.kind.length + 1).startsWith(prefix));
33
+ }
34
+ add(record) {
35
+ this.records.set(record.task.id, record);
36
+ }
37
+ all() {
38
+ return [...this.records.values()];
39
+ }
40
+ /** Records whose execution has not settled, queued or running. */
41
+ unsettled() {
42
+ return this.all().filter((record) => !record.settled);
43
+ }
44
+ /** Records on the selected branch. */
45
+ visible() {
46
+ return this.all().filter((record) => record.visible);
47
+ }
48
+ /** Settled handoffs eligible for automatic delivery. */
49
+ deliverable() {
50
+ return this.all().filter((record) => record.deliverable);
51
+ }
52
+ /** Records plus output cleanups still running; admission bounds this. */
53
+ retainedCount() {
54
+ return this.records.size + this.cleanups.size;
55
+ }
56
+ /** Settles once every output cleanup started so far has finished. */
57
+ cleanupsDone() {
58
+ return Promise.all(this.cleanups);
59
+ }
50
60
  /**
51
61
  * Foreground records save no output of their own: their tool result already holds it,
52
62
  * so `toolResults` maps each tool call ID on the branch to that content.
@@ -59,7 +69,7 @@ export class TaskStore {
59
69
  const foreground = history.filter((record) => isForeground(record.task)).length;
60
70
  const foregroundCapacity = Math.max(0, this.maxHistory - foreground);
61
71
  const backgroundCapacity = Math.max(0, this.maxHistory - (history.length - foreground));
62
- const capacity = Math.max(0, Math.min(foregroundCapacity + backgroundCapacity, this.maxRetained - this.records.size - this.cleanups.size));
72
+ const capacity = Math.max(0, Math.min(foregroundCapacity + backgroundCapacity, this.maxRetained - this.retainedCount()));
63
73
  const newest = new Map();
64
74
  for (const value of records) {
65
75
  const task = readVersionedTask(value);
@@ -99,16 +109,7 @@ export class TaskStore {
99
109
  // Logs never outlive the runtime that wrote them.
100
110
  const expired = task.outputPath !== undefined;
101
111
  task.outputPath = undefined;
102
- this.records.set(task.id, {
103
- task,
104
- settled: true,
105
- visible: true,
106
- delivery: "delivered",
107
- pins: 0,
108
- deliveryHolds: 0,
109
- waiters: new Set(),
110
- readError: expired ? EXPIRED_OUTPUT : undefined,
111
- });
112
+ this.add(TaskRecord.restored(task, expired ? EXPIRED_OUTPUT : undefined));
112
113
  }
113
114
  }
114
115
  cleanupOutput(record) {
@@ -117,14 +118,15 @@ export class TaskStore {
117
118
  const cleanup = record.cleanup;
118
119
  record.cleanup = undefined;
119
120
  // Snapshots retain final bounded text; expired files are never needed to render history.
120
- record.task.outputPath = undefined;
121
- changed(record);
121
+ record.update((task) => {
122
+ task.outputPath = undefined;
123
+ });
122
124
  record.readError = EXPIRED_OUTPUT;
123
125
  const pending = Promise.resolve()
124
126
  .then(cleanup)
125
127
  .catch((error) => {
126
128
  try {
127
- this.onCleanupError?.(errorText(error));
129
+ this.onCleanupError?.(errorText(error, "Task cleanup failed"));
128
130
  }
129
131
  catch {
130
132
  /* Cleanup/reporting is best effort, never an unhandled rejection. */
@@ -135,7 +137,7 @@ export class TaskStore {
135
137
  }
136
138
  /** Pending delivery, active reads and pins have their own bounded retention allowance. */
137
139
  historyRecords() {
138
- return [...this.records.values()].filter((record) => record.settled && record.delivery === "delivered" && !record.pins && !record.waiters.size);
140
+ return this.all().filter((record) => record.inHistory);
139
141
  }
140
142
  trim() {
141
143
  if (this.closed) {
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/tasks/store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { readVersionedTask } from \"./codec.ts\";\nimport { boundText, resultText } from \"./output.ts\";\nimport type { TaskSnapshot } from \"./types.ts\";\n\nexport interface TaskRecord {\n\t/** The runtime's working copy. Call changed() after every mutation. */\n\ttask: TaskSnapshot;\n\tsettled: boolean;\n\t/** Whether the launch anchor is on the selected branch. */\n\tvisible: boolean;\n\t/**\n\t * none: running, or answered inline by its tool call; pending: a settled handoff\n\t * awaiting automatic delivery; claimed: handed to the host; delivered: acknowledged.\n\t */\n\tdelivery: \"none\" | \"pending\" | \"claimed\" | \"delivered\";\n\tpins: number;\n\tdeliveryHolds: number;\n\tcleanup?: () => void | Promise<void>;\n\treadError?: string;\n\twaiters: Set<() => void>;\n\t/** Frozen snapshot shared by readers until the task changes. */\n\tsnapshot?: TaskSnapshot;\n}\n\nexport const EXPIRED_OUTPUT = \"Output has expired: the managed log was released; showing the stored result.\";\n\nfunction freeze<T>(value: T): T {\n\tif (value !== null && typeof value === \"object\" && !Object.isFrozen(value)) {\n\t\tfor (const child of Object.values(value)) freeze(child);\n\t\tObject.freeze(value);\n\t}\n\treturn value;\n}\n\n/** Readers share one frozen copy, so polling and status rendering never clone unchanged output. */\nexport function snapshotOf(record: TaskRecord): TaskSnapshot {\n\trecord.snapshot ??= freeze(structuredClone(record.task));\n\treturn record.snapshot;\n}\n\nexport function changed(record: TaskRecord): void {\n\trecord.snapshot = undefined;\n}\n\nfunction errorText(error: unknown): string {\n\ttry {\n\t\treturn boundText(error instanceof Error ? error.message : String(error), 4096);\n\t} catch {\n\t\treturn \"Task cleanup failed\";\n\t}\n}\n\nfunction oldestTask(tasks: Iterable<TaskSnapshot>): TaskSnapshot | undefined {\n\tlet oldest: TaskSnapshot | undefined;\n\tfor (const task of tasks) {\n\t\tif (!oldest || task.endedAt! < oldest.endedAt!) oldest = task;\n\t}\n\treturn oldest;\n}\n\nconst isForeground = (task: TaskSnapshot) => task.mode === \"foreground\";\n\n/** Retained snapshots and output leases. This store never owns executable handles. */\nexport class TaskStore {\n\treadonly records = new Map<string, TaskRecord>();\n\treadonly cleanups = new Set<Promise<void>>();\n\tprivate readonly maxHistory: number;\n\tprivate readonly maxRetained: number;\n\tprivate readonly isClosed: () => boolean;\n\tprivate readonly onCleanupError?: (message: string) => void;\n\tconstructor(\n\t\tmaxHistory: number,\n\t\tmaxRetained: number,\n\t\tisClosed: () => boolean,\n\t\tonCleanupError?: (message: string) => void,\n\t) {\n\t\tthis.maxHistory = maxHistory;\n\t\tthis.maxRetained = maxRetained;\n\t\tthis.isClosed = isClosed;\n\t\tthis.onCleanupError = onCleanupError;\n\t}\n\tprivate get closed(): boolean {\n\t\treturn this.isClosed();\n\t}\n\n\t/**\n\t * Foreground records save no output of their own: their tool result already holds it,\n\t * so `toolResults` maps each tool call ID on the branch to that content.\n\t */\n\trestoreHistory(\n\t\trecords: readonly unknown[],\n\t\ttoolResults: ReadonlyMap<string, AgentToolResult<unknown>[\"content\"]> = new Map(),\n\t): void {\n\t\tif (this.closed) return;\n\t\t// Restoration must not evict runtime-owned records or run their cleanup callbacks.\n\t\tconst history = this.historyRecords();\n\t\tconst foreground = history.filter((record) => isForeground(record.task)).length;\n\t\tconst foregroundCapacity = Math.max(0, this.maxHistory - foreground);\n\t\tconst backgroundCapacity = Math.max(0, this.maxHistory - (history.length - foreground));\n\t\tconst capacity = Math.max(\n\t\t\t0,\n\t\t\tMath.min(foregroundCapacity + backgroundCapacity, this.maxRetained - this.records.size - this.cleanups.size),\n\t\t);\n\t\tconst newest = new Map<string, TaskSnapshot>();\n\t\tfor (const value of records) {\n\t\t\tconst task = readVersionedTask(value);\n\t\t\tif (!task) continue;\n\t\t\tconst existing = this.records.get(task.id);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.settled) existing.visible = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (capacity === 0) continue;\n\t\t\tconst previous = newest.get(task.id);\n\t\t\tif (previous && previous.endedAt! > task.endedAt!) continue;\n\t\t\tnewest.delete(task.id);\n\t\t\tconst inline = isForeground(task);\n\t\t\tconst limit = inline ? foregroundCapacity : backgroundCapacity;\n\t\t\tif (limit === 0) continue;\n\t\t\tnewest.set(task.id, task);\n\t\t\tconst group = [...newest.values()].filter((candidate) => isForeground(candidate) === inline);\n\t\t\tif (group.length > limit) newest.delete(oldestTask(group)!.id);\n\t\t\tif (newest.size > capacity) {\n\t\t\t\t// Protected runtime records can leave less room than both histories allow.\n\t\t\t\t// Restore background results before foreground ones, which the transcript shows.\n\t\t\t\tconst inlineTasks = [...newest.values()].filter(isForeground);\n\t\t\t\tnewest.delete(oldestTask(inlineTasks.length ? inlineTasks : newest.values())!.id);\n\t\t\t}\n\t\t}\n\t\tfor (const task of [...newest.values()].sort((a, b) => a.endedAt! - b.endedAt!)) {\n\t\t\tconst content = toolResults.get(task.toolCallId);\n\t\t\tif (!task.result && content) task.result = resultText({ content, details: undefined });\n\t\t\t// Logs never outlive the runtime that wrote them.\n\t\t\tconst expired = task.outputPath !== undefined;\n\t\t\ttask.outputPath = undefined;\n\t\t\tthis.records.set(task.id, {\n\t\t\t\ttask,\n\t\t\t\tsettled: true,\n\t\t\t\tvisible: true,\n\t\t\t\tdelivery: \"delivered\",\n\t\t\t\tpins: 0,\n\t\t\t\tdeliveryHolds: 0,\n\t\t\t\twaiters: new Set(),\n\t\t\t\treadError: expired ? EXPIRED_OUTPUT : undefined,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate cleanupOutput(record: TaskRecord): void {\n\t\tif (!record.settled || record.pins || record.waiters.size || !record.cleanup) return;\n\t\tconst cleanup = record.cleanup;\n\t\trecord.cleanup = undefined;\n\t\t// Snapshots retain final bounded text; expired files are never needed to render history.\n\t\trecord.task.outputPath = undefined;\n\t\tchanged(record);\n\t\trecord.readError = EXPIRED_OUTPUT;\n\t\tconst pending = Promise.resolve()\n\t\t\t.then(cleanup)\n\t\t\t.catch((error: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.onCleanupError?.(errorText(error));\n\t\t\t\t} catch {\n\t\t\t\t\t/* Cleanup/reporting is best effort, never an unhandled rejection. */\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => this.cleanups.delete(pending));\n\t\tthis.cleanups.add(pending);\n\t}\n\n\t/** Pending delivery, active reads and pins have their own bounded retention allowance. */\n\tprivate historyRecords(): TaskRecord[] {\n\t\treturn [...this.records.values()].filter(\n\t\t\t(record) => record.settled && record.delivery === \"delivered\" && !record.pins && !record.waiters.size,\n\t\t);\n\t}\n\n\ttrim(): void {\n\t\tif (this.closed) {\n\t\t\tfor (const record of this.records.values()) this.cleanupOutput(record);\n\t\t\treturn;\n\t\t}\n\t\t// Undelivered notifications and claims are never evicted. Admission bounds all retention.\n\t\tconst history = this.historyRecords();\n\t\t// Delivered history can be restored from branch snapshots; hidden rows must\n\t\t// not occupy the current branch's history budget. Pending results stay owned.\n\t\tconst expired = history.filter((record) => !record.visible);\n\t\tfor (const inline of [false, true]) {\n\t\t\tconst group = history.filter((record) => record.visible && isForeground(record.task) === inline);\n\t\t\tgroup.sort((left, right) => (left.task.endedAt ?? 0) - (right.task.endedAt ?? 0));\n\t\t\texpired.push(...group.slice(0, Math.max(0, group.length - this.maxHistory)));\n\t\t}\n\t\tfor (const record of expired) {\n\t\t\tthis.records.delete(record.task.id);\n\t\t\tthis.cleanupOutput(record);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/tasks/store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { readVersionedTask } from \"./codec.ts\";\nimport { errorText, resultText } from \"./output.ts\";\nimport { TaskRecord } from \"./record.ts\";\nimport type { TaskSnapshot } from \"./types.ts\";\n\nexport const EXPIRED_OUTPUT = \"Output has expired: the managed log was released; showing the stored result.\";\n\nfunction oldestTask(tasks: Iterable<TaskSnapshot>): TaskSnapshot | undefined {\n\tlet oldest: TaskSnapshot | undefined;\n\tfor (const task of tasks) {\n\t\tif (!oldest || task.endedAt! < oldest.endedAt!) oldest = task;\n\t}\n\treturn oldest;\n}\n\nconst isForeground = (task: TaskSnapshot) => task.mode === \"foreground\";\n\n/** Retained snapshots and output leases. This store never owns executable handles. */\nexport class TaskStore {\n\tprivate readonly records = new Map<string, TaskRecord>();\n\tprivate readonly cleanups = new Set<Promise<void>>();\n\tprivate readonly maxHistory: number;\n\tprivate readonly maxRetained: number;\n\tprivate readonly isClosed: () => boolean;\n\tprivate readonly onCleanupError?: (message: string) => void;\n\tconstructor(\n\t\tmaxHistory: number,\n\t\tmaxRetained: number,\n\t\tisClosed: () => boolean,\n\t\tonCleanupError?: (message: string) => void,\n\t) {\n\t\tthis.maxHistory = maxHistory;\n\t\tthis.maxRetained = maxRetained;\n\t\tthis.isClosed = isClosed;\n\t\tthis.onCleanupError = onCleanupError;\n\t}\n\tprivate get closed(): boolean {\n\t\treturn this.isClosed();\n\t}\n\n\tget(id: string): TaskRecord | undefined {\n\t\treturn this.records.get(id);\n\t}\n\n\t/** Records whose ID, or whose ID without its kind prefix, starts with `prefix`. */\n\tmatch(prefix: string): TaskRecord[] {\n\t\treturn this.all().filter(\n\t\t\t({ task }) => task.id.startsWith(prefix) || task.id.slice(task.kind.length + 1).startsWith(prefix),\n\t\t);\n\t}\n\n\tadd(record: TaskRecord): void {\n\t\tthis.records.set(record.task.id, record);\n\t}\n\n\tall(): TaskRecord[] {\n\t\treturn [...this.records.values()];\n\t}\n\n\t/** Records whose execution has not settled, queued or running. */\n\tunsettled(): TaskRecord[] {\n\t\treturn this.all().filter((record) => !record.settled);\n\t}\n\n\t/** Records on the selected branch. */\n\tvisible(): TaskRecord[] {\n\t\treturn this.all().filter((record) => record.visible);\n\t}\n\n\t/** Settled handoffs eligible for automatic delivery. */\n\tdeliverable(): TaskRecord[] {\n\t\treturn this.all().filter((record) => record.deliverable);\n\t}\n\n\t/** Records plus output cleanups still running; admission bounds this. */\n\tretainedCount(): number {\n\t\treturn this.records.size + this.cleanups.size;\n\t}\n\n\t/** Settles once every output cleanup started so far has finished. */\n\tcleanupsDone(): Promise<unknown> {\n\t\treturn Promise.all(this.cleanups);\n\t}\n\n\t/**\n\t * Foreground records save no output of their own: their tool result already holds it,\n\t * so `toolResults` maps each tool call ID on the branch to that content.\n\t */\n\trestoreHistory(\n\t\trecords: readonly unknown[],\n\t\ttoolResults: ReadonlyMap<string, AgentToolResult<unknown>[\"content\"]> = new Map(),\n\t): void {\n\t\tif (this.closed) return;\n\t\t// Restoration must not evict runtime-owned records or run their cleanup callbacks.\n\t\tconst history = this.historyRecords();\n\t\tconst foreground = history.filter((record) => isForeground(record.task)).length;\n\t\tconst foregroundCapacity = Math.max(0, this.maxHistory - foreground);\n\t\tconst backgroundCapacity = Math.max(0, this.maxHistory - (history.length - foreground));\n\t\tconst capacity = Math.max(\n\t\t\t0,\n\t\t\tMath.min(foregroundCapacity + backgroundCapacity, this.maxRetained - this.retainedCount()),\n\t\t);\n\t\tconst newest = new Map<string, TaskSnapshot>();\n\t\tfor (const value of records) {\n\t\t\tconst task = readVersionedTask(value);\n\t\t\tif (!task) continue;\n\t\t\tconst existing = this.records.get(task.id);\n\t\t\tif (existing) {\n\t\t\t\tif (existing.settled) existing.visible = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (capacity === 0) continue;\n\t\t\tconst previous = newest.get(task.id);\n\t\t\tif (previous && previous.endedAt! > task.endedAt!) continue;\n\t\t\tnewest.delete(task.id);\n\t\t\tconst inline = isForeground(task);\n\t\t\tconst limit = inline ? foregroundCapacity : backgroundCapacity;\n\t\t\tif (limit === 0) continue;\n\t\t\tnewest.set(task.id, task);\n\t\t\tconst group = [...newest.values()].filter((candidate) => isForeground(candidate) === inline);\n\t\t\tif (group.length > limit) newest.delete(oldestTask(group)!.id);\n\t\t\tif (newest.size > capacity) {\n\t\t\t\t// Protected runtime records can leave less room than both histories allow.\n\t\t\t\t// Restore background results before foreground ones, which the transcript shows.\n\t\t\t\tconst inlineTasks = [...newest.values()].filter(isForeground);\n\t\t\t\tnewest.delete(oldestTask(inlineTasks.length ? inlineTasks : newest.values())!.id);\n\t\t\t}\n\t\t}\n\t\tfor (const task of [...newest.values()].sort((a, b) => a.endedAt! - b.endedAt!)) {\n\t\t\tconst content = toolResults.get(task.toolCallId);\n\t\t\tif (!task.result && content) task.result = resultText({ content, details: undefined });\n\t\t\t// Logs never outlive the runtime that wrote them.\n\t\t\tconst expired = task.outputPath !== undefined;\n\t\t\ttask.outputPath = undefined;\n\t\t\tthis.add(TaskRecord.restored(task, expired ? EXPIRED_OUTPUT : undefined));\n\t\t}\n\t}\n\n\tprivate cleanupOutput(record: TaskRecord): void {\n\t\tif (!record.settled || record.pins || record.waiters.size || !record.cleanup) return;\n\t\tconst cleanup = record.cleanup;\n\t\trecord.cleanup = undefined;\n\t\t// Snapshots retain final bounded text; expired files are never needed to render history.\n\t\trecord.update((task) => {\n\t\t\ttask.outputPath = undefined;\n\t\t});\n\t\trecord.readError = EXPIRED_OUTPUT;\n\t\tconst pending = Promise.resolve()\n\t\t\t.then(cleanup)\n\t\t\t.catch((error: unknown) => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.onCleanupError?.(errorText(error, \"Task cleanup failed\"));\n\t\t\t\t} catch {\n\t\t\t\t\t/* Cleanup/reporting is best effort, never an unhandled rejection. */\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => this.cleanups.delete(pending));\n\t\tthis.cleanups.add(pending);\n\t}\n\n\t/** Pending delivery, active reads and pins have their own bounded retention allowance. */\n\tprivate historyRecords(): TaskRecord[] {\n\t\treturn this.all().filter((record) => record.inHistory);\n\t}\n\n\ttrim(): void {\n\t\tif (this.closed) {\n\t\t\tfor (const record of this.records.values()) this.cleanupOutput(record);\n\t\t\treturn;\n\t\t}\n\t\t// Undelivered notifications and claims are never evicted. Admission bounds all retention.\n\t\tconst history = this.historyRecords();\n\t\t// Delivered history can be restored from branch snapshots; hidden rows must\n\t\t// not occupy the current branch's history budget. Pending results stay owned.\n\t\tconst expired = history.filter((record) => !record.visible);\n\t\tfor (const inline of [false, true]) {\n\t\t\tconst group = history.filter((record) => record.visible && isForeground(record.task) === inline);\n\t\t\tgroup.sort((left, right) => (left.task.endedAt ?? 0) - (right.task.endedAt ?? 0));\n\t\t\texpired.push(...group.slice(0, Math.max(0, group.length - this.maxHistory)));\n\t\t}\n\t\tfor (const record of expired) {\n\t\t\tthis.records.delete(record.task.id);\n\t\t\tthis.cleanupOutput(record);\n\t\t}\n\t}\n}\n"]}
@@ -115,6 +115,15 @@ export type TaskToolOutcome<T> = {
115
115
  kind: "background";
116
116
  task: TaskSnapshot;
117
117
  };
118
+ /** Which slice of a task's output to read. Defaults to the last 8 KiB. */
119
+ export interface TaskReadOptions {
120
+ /** `tail` (default) reads the end of the output, `head` its start. */
121
+ mode?: "head" | "tail";
122
+ /** Maximum bytes to return, bounded by the runtime. */
123
+ bytes?: number;
124
+ /** Only output written after this byte offset; takes precedence over `mode`. */
125
+ sinceBytes?: number;
126
+ }
118
127
  export interface TaskRead {
119
128
  task: TaskSnapshot;
120
129
  text: string;
@@ -126,13 +135,81 @@ export interface TaskRead {
126
135
  }
127
136
  /** Optional host integration for products built on the execution runtime. */
128
137
  export interface TasksSessionContext {
129
- /** Ends only management-tool waits when new steering arrives. */
130
- readonly waitInterruptSignal?: AbortSignal;
131
- /** Hold a settled result until the wait's tool result has been persisted. */
132
- prepareWait(toolCallId: string, taskId: string): void;
133
138
  /** Running tasks that navigating to `targetId` would cancel on this session branch. */
134
139
  stoppedByTreeNavigation(targetId: string): TaskSnapshot[];
135
140
  }
141
+ /** How a wait ended. `closed` means the host shut down, so execution state is unconfirmed. */
142
+ export type TaskWaitOutcome = "settled" | "interrupted" | "timed_out" | "closed";
143
+ interface TaskObservationOptions {
144
+ /** Defaults to 20 seconds and is bounded by the runtime. A timeout never cancels execution. */
145
+ timeoutMs?: number;
146
+ /** Rejects the wait with the signal's reason; execution continues. */
147
+ signal?: AbortSignal;
148
+ /**
149
+ * The tool call whose result carries this observation to the model. With a session host, a
150
+ * settled background task stays out of automatic notifications until that result is persisted.
151
+ * Without it, or in a standalone runtime, the wait is purely observational.
152
+ */
153
+ toolCallId?: string;
154
+ }
155
+ export interface TaskWaitOptions extends TaskObservationOptions {
156
+ /** Read output while delivery is still held; skipped when steering interrupted the wait. */
157
+ read?: Pick<TaskReadOptions, "bytes" | "sinceBytes">;
158
+ }
159
+ export interface TaskWaitResult {
160
+ outcome: TaskWaitOutcome;
161
+ waitedMs: number;
162
+ /** The task when the wait ended, before `read` was taken. */
163
+ task: TaskSnapshot;
164
+ read?: TaskRead;
165
+ }
166
+ export interface TaskWaitAnyOptions extends TaskObservationOptions {
167
+ /** Read the settled task's output while delivery is still held. */
168
+ read?: Pick<TaskReadOptions, "bytes">;
169
+ }
170
+ export interface TaskWaitAnyResult {
171
+ /** `no_tasks`: no background task was running at call time, so nothing was observed. */
172
+ outcome: TaskWaitOutcome | "no_tasks";
173
+ waitedMs: number;
174
+ /** The first cohort member to settle; present only for `settled`. */
175
+ task?: TaskSnapshot;
176
+ read?: TaskRead;
177
+ /** Cohort members still running when the wait ended. */
178
+ running: TaskSnapshot[];
179
+ }
180
+ /**
181
+ * Host hooks that make waits part of a durable session. TaskSession supplies them; products
182
+ * embedding a bare TaskRuntime omit them and keep waits observational.
183
+ */
184
+ export interface TaskWaitHost {
185
+ /** Current steering signal. Aborting it ends management waits only, never execution. */
186
+ readonly interruptSignal: AbortSignal;
187
+ /**
188
+ * A wait observed a settled background task and its `toolCallId` is known. Called while the
189
+ * runtime still holds delivery; the host takes over until that tool result persists.
190
+ */
191
+ bind(toolCallId: string, taskId: string): void;
192
+ }
193
+ /**
194
+ * What TaskDelivery consumes from the runtime. The runtime keeps only the per-record facts that
195
+ * retention and admission need (a settled handoff is undelivered, claimed or delivered, and a
196
+ * record under a hold is never a candidate); pausing, failure tracking, the in-flight delivery
197
+ * and wait receipts belong to TaskDelivery.
198
+ */
199
+ export interface TaskDeliveryLedger {
200
+ readonly enabled: boolean;
201
+ list(): TaskSnapshot[];
202
+ /** Settled handoffs eligible for automatic delivery: visible, unclaimed, unobserved and unheld. */
203
+ pendingNotifications(): TaskSnapshot[];
204
+ /** Take a pending notification; false when it is no longer a candidate. */
205
+ claimNotification(id: string): boolean;
206
+ /** Return a claimed notification to pending after a failed delivery. */
207
+ releaseNotification(id: string): void;
208
+ /** Acknowledge a persisted delivery or wait result. */
209
+ markDelivered(id: string): void;
210
+ /** Keep a record out of automatic delivery, and its output retained, until released. */
211
+ holdDelivery(id: string): () => void;
212
+ }
136
213
  /** Session-bound public capability. Captured instances close on runtime replacement. */
137
214
  export interface TasksContext {
138
215
  readonly enabled: boolean;
@@ -142,18 +219,19 @@ export interface TasksContext {
142
219
  execute<T>(execution: TaskExecution<T>): Promise<TaskToolOutcome<T>>;
143
220
  list(): TaskSnapshot[];
144
221
  get(id: string): TaskSnapshot;
145
- read(id: string, options?: {
146
- mode?: "head" | "tail";
147
- bytes?: number;
148
- sinceBytes?: number;
149
- }): Promise<TaskRead>;
150
- /** Observation only: terminal delivery is acknowledged by the host via markDelivered after result persistence. */
151
- wait(id: string, timeoutMs?: number, signal?: AbortSignal, interruptSignal?: AbortSignal): Promise<TaskSnapshot>;
222
+ read(id: string, options?: TaskReadOptions): Promise<TaskRead>;
152
223
  /**
153
- * Observe the first task running at call time to settle. Returns undefined when there is
154
- * no such task, the window ends, or interruptSignal fires. Tasks started later are excluded.
224
+ * Observe one task. With `toolCallId` in a session host, the whole observation (wait, read,
225
+ * receipt) is atomic with respect to automatic delivery; a standalone runtime never
226
+ * acknowledges delivery. Rejects with `TaskLookupError` for an unknown or ambiguous id.
155
227
  */
156
- waitAny(timeoutMs?: number, signal?: AbortSignal, interruptSignal?: AbortSignal): Promise<TaskSnapshot | undefined>;
228
+ wait(id: string, options?: TaskWaitOptions): Promise<TaskWaitResult>;
229
+ /**
230
+ * Observe the first task running at call time to settle. Tasks started later are excluded,
231
+ * and `no_tasks` is returned for an empty cohort. Delivery holds cover the whole cohort until
232
+ * the observation completes; members other than the winner then resume ordinary notification.
233
+ */
234
+ waitAny(options?: TaskWaitAnyOptions): Promise<TaskWaitAnyResult>;
157
235
  kill(id: string): boolean;
158
236
  /**
159
237
  * Move running foreground executions to the background while background slots remain;
@@ -167,14 +245,14 @@ export interface TasksContext {
167
245
  subscribe(listener: () => void): () => void;
168
246
  /** Keep retained output available without delaying completion delivery. */
169
247
  retain(id: string): () => void;
170
- /** Hold automatic delivery while preparing a result for the host to persist. */
171
- holdDelivery(id: string): () => void;
172
248
  }
173
249
  export interface TaskRuntimeOptions {
174
250
  enabled?: boolean;
175
251
  backgroundAllowed?: boolean;
176
- /** Durable host integration; standalone runtimes leave waits observational. */
252
+ /** Branch-impact queries for a durable host; standalone runtimes omit it. */
177
253
  session?: TasksSessionContext;
254
+ /** Wait receipts and steering interruption for a durable host; standalone runtimes leave waits observational. */
255
+ waits?: TaskWaitHost;
178
256
  anchor?: () => string | null;
179
257
  /** Admission limit for unsettled background tasks; foreground work is bounded by its caller. */
180
258
  maxBackground?: number;
@@ -198,4 +276,5 @@ export declare class TaskLookupError extends Error {
198
276
  readonly matches: TaskSnapshot[];
199
277
  constructor(kind: "unknown" | "ambiguous", matches: TaskSnapshot[]);
200
278
  }
279
+ export {};
201
280
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/types.ts"],"names":[],"mappings":"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"}