@caupulican/pi-adaptative 0.94.0 → 0.95.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +32 -13
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +7 -4
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +173 -293
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +247 -392
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts +52 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.d.ts.map +1 -0
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js +118 -0
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.js.map +1 -0
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/launch-profile.ts +169 -0
  13. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/builder-validator.json +1 -1
  14. package/dist/bundled-resources/extensions/tmux-agent-manager/templates/provider-prompt-smoke.json +1 -1
  15. package/dist/bundled-resources/skills/pi-harness-learning/SKILL.md +13 -7
  16. package/dist/bundled-resources/skills/worker-profile-writer/SKILL.md +11 -11
  17. package/dist/core/agent-paths.d.ts +2 -0
  18. package/dist/core/agent-paths.d.ts.map +1 -1
  19. package/dist/core/agent-paths.js +7 -0
  20. package/dist/core/agent-paths.js.map +1 -1
  21. package/dist/core/agent-session.d.ts +11 -41
  22. package/dist/core/agent-session.d.ts.map +1 -1
  23. package/dist/core/agent-session.js +98 -161
  24. package/dist/core/agent-session.js.map +1 -1
  25. package/dist/core/autonomy/envelope-enforcement.d.ts +6 -1
  26. package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
  27. package/dist/core/autonomy/envelope-enforcement.js +26 -25
  28. package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
  29. package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
  30. package/dist/core/autonomy/lane-private-paths.js +2 -1
  31. package/dist/core/autonomy/lane-private-paths.js.map +1 -1
  32. package/dist/core/autonomy/lane-tool-surface.d.ts +8 -8
  33. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  34. package/dist/core/autonomy/lane-tool-surface.js +45 -30
  35. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  36. package/dist/core/autonomy/worker-session-private-scope.d.ts +12 -0
  37. package/dist/core/autonomy/worker-session-private-scope.d.ts.map +1 -0
  38. package/dist/core/autonomy/worker-session-private-scope.js +42 -0
  39. package/dist/core/autonomy/worker-session-private-scope.js.map +1 -0
  40. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts +65 -0
  41. package/dist/core/autonomy/worker-tool-adapter-registry.d.ts.map +1 -0
  42. package/dist/core/autonomy/worker-tool-adapter-registry.js +145 -0
  43. package/dist/core/autonomy/worker-tool-adapter-registry.js.map +1 -0
  44. package/dist/core/background-lane-controller.d.ts +9 -1
  45. package/dist/core/background-lane-controller.d.ts.map +1 -1
  46. package/dist/core/background-lane-controller.js +76 -6
  47. package/dist/core/background-lane-controller.js.map +1 -1
  48. package/dist/core/background-tool-task-controller.d.ts +23 -2
  49. package/dist/core/background-tool-task-controller.d.ts.map +1 -1
  50. package/dist/core/background-tool-task-controller.js +132 -17
  51. package/dist/core/background-tool-task-controller.js.map +1 -1
  52. package/dist/core/context/long-term-memory-trigger.d.ts +3 -1
  53. package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
  54. package/dist/core/context/long-term-memory-trigger.js +1 -1
  55. package/dist/core/context/long-term-memory-trigger.js.map +1 -1
  56. package/dist/core/context/okf-memory-provider.d.ts +3 -0
  57. package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
  58. package/dist/core/context/okf-memory-provider.js +66 -31
  59. package/dist/core/context/okf-memory-provider.js.map +1 -1
  60. package/dist/core/context/okf-memory.d.ts +18 -1
  61. package/dist/core/context/okf-memory.d.ts.map +1 -1
  62. package/dist/core/context/okf-memory.js +48 -0
  63. package/dist/core/context/okf-memory.js.map +1 -1
  64. package/dist/core/cost-guard-controller.d.ts +37 -0
  65. package/dist/core/cost-guard-controller.d.ts.map +1 -0
  66. package/dist/core/cost-guard-controller.js +71 -0
  67. package/dist/core/cost-guard-controller.js.map +1 -0
  68. package/dist/core/cost-guard.d.ts +9 -4
  69. package/dist/core/cost-guard.d.ts.map +1 -1
  70. package/dist/core/cost-guard.js +7 -3
  71. package/dist/core/cost-guard.js.map +1 -1
  72. package/dist/core/delegation/worker-agent-control.d.ts +4 -0
  73. package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
  74. package/dist/core/delegation/worker-agent-control.js.map +1 -1
  75. package/dist/core/delegation/worker-attempt-executor.d.ts +1 -1
  76. package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
  77. package/dist/core/delegation/worker-attempt-executor.js +0 -1
  78. package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
  79. package/dist/core/delegation/worker-authority-resolver.d.ts +16 -3
  80. package/dist/core/delegation/worker-authority-resolver.d.ts.map +1 -1
  81. package/dist/core/delegation/worker-authority-resolver.js +114 -55
  82. package/dist/core/delegation/worker-authority-resolver.js.map +1 -1
  83. package/dist/core/delegation/worker-claim.d.ts +1 -2
  84. package/dist/core/delegation/worker-claim.d.ts.map +1 -1
  85. package/dist/core/delegation/worker-claim.js.map +1 -1
  86. package/dist/core/delegation/worker-delegation-controller.d.ts +19 -6
  87. package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
  88. package/dist/core/delegation/worker-delegation-controller.js +125 -40
  89. package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
  90. package/dist/core/delegation/worker-delegation-request.d.ts +3 -3
  91. package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
  92. package/dist/core/delegation/worker-delegation-request.js +13 -19
  93. package/dist/core/delegation/worker-delegation-request.js.map +1 -1
  94. package/dist/core/delegation/worker-execution-policy.d.ts +3 -2
  95. package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
  96. package/dist/core/delegation/worker-execution-policy.js +54 -39
  97. package/dist/core/delegation/worker-execution-policy.js.map +1 -1
  98. package/dist/core/delegation/worker-fleet-limits.d.ts +3 -3
  99. package/dist/core/delegation/worker-fleet-limits.d.ts.map +1 -1
  100. package/dist/core/delegation/worker-fleet-limits.js +7 -7
  101. package/dist/core/delegation/worker-fleet-limits.js.map +1 -1
  102. package/dist/core/delegation/worker-machine-scope.d.ts +12 -0
  103. package/dist/core/delegation/worker-machine-scope.d.ts.map +1 -0
  104. package/dist/core/delegation/worker-machine-scope.js +38 -0
  105. package/dist/core/delegation/worker-machine-scope.js.map +1 -0
  106. package/dist/core/delegation/worker-notification-coordinator.d.ts +10 -0
  107. package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
  108. package/dist/core/delegation/worker-notification-coordinator.js +69 -3
  109. package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
  110. package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
  111. package/dist/core/delegation/worker-recovery-coordinator.js +6 -1
  112. package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
  113. package/dist/core/delegation/worker-runner.d.ts +5 -7
  114. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  115. package/dist/core/delegation/worker-runner.js +1 -4
  116. package/dist/core/delegation/worker-runner.js.map +1 -1
  117. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts +3 -2
  118. package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
  119. package/dist/core/delegation/worker-write-reservation-coordinator.js +50 -25
  120. package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
  121. package/dist/core/durable-custom-message-turn-controller.d.ts +6 -0
  122. package/dist/core/durable-custom-message-turn-controller.d.ts.map +1 -1
  123. package/dist/core/durable-custom-message-turn-controller.js +38 -15
  124. package/dist/core/durable-custom-message-turn-controller.js.map +1 -1
  125. package/dist/core/extension-binding-controller.d.ts +5 -1
  126. package/dist/core/extension-binding-controller.d.ts.map +1 -1
  127. package/dist/core/extension-binding-controller.js +15 -0
  128. package/dist/core/extension-binding-controller.js.map +1 -1
  129. package/dist/core/extensions/factory-runtime.d.ts.map +1 -1
  130. package/dist/core/extensions/factory-runtime.js +5 -0
  131. package/dist/core/extensions/factory-runtime.js.map +1 -1
  132. package/dist/core/extensions/runner.d.ts.map +1 -1
  133. package/dist/core/extensions/runner.js +1 -0
  134. package/dist/core/extensions/runner.js.map +1 -1
  135. package/dist/core/extensions/types.d.ts +8 -4
  136. package/dist/core/extensions/types.d.ts.map +1 -1
  137. package/dist/core/extensions/types.js.map +1 -1
  138. package/dist/core/foreground-terminal-handoff-controller.d.ts +31 -0
  139. package/dist/core/foreground-terminal-handoff-controller.d.ts.map +1 -1
  140. package/dist/core/foreground-terminal-handoff-controller.js +239 -55
  141. package/dist/core/foreground-terminal-handoff-controller.js.map +1 -1
  142. package/dist/core/goals/goal-session-controller.d.ts +2 -0
  143. package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
  144. package/dist/core/goals/goal-session-controller.js +8 -0
  145. package/dist/core/goals/goal-session-controller.js.map +1 -1
  146. package/dist/core/goals/goal-tool-core.d.ts +5 -4
  147. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  148. package/dist/core/goals/goal-tool-core.js +23 -19
  149. package/dist/core/goals/goal-tool-core.js.map +1 -1
  150. package/dist/core/learning/auto-learn-settings.d.ts +84 -0
  151. package/dist/core/learning/auto-learn-settings.d.ts.map +1 -0
  152. package/dist/core/learning/auto-learn-settings.js +66 -0
  153. package/dist/core/learning/auto-learn-settings.js.map +1 -0
  154. package/dist/core/learning/learning-audit.d.ts +5 -1
  155. package/dist/core/learning/learning-audit.d.ts.map +1 -1
  156. package/dist/core/learning/learning-audit.js +32 -1
  157. package/dist/core/learning/learning-audit.js.map +1 -1
  158. package/dist/core/learning/reflection-engine.d.ts +24 -0
  159. package/dist/core/learning/reflection-engine.d.ts.map +1 -1
  160. package/dist/core/learning/reflection-engine.js +104 -8
  161. package/dist/core/learning/reflection-engine.js.map +1 -1
  162. package/dist/core/local-prefix-warm-controller.d.ts +24 -0
  163. package/dist/core/local-prefix-warm-controller.d.ts.map +1 -0
  164. package/dist/core/local-prefix-warm-controller.js +79 -0
  165. package/dist/core/local-prefix-warm-controller.js.map +1 -0
  166. package/dist/core/memory/okf-project-memory-store.d.ts +28 -0
  167. package/dist/core/memory/okf-project-memory-store.d.ts.map +1 -0
  168. package/dist/core/memory/okf-project-memory-store.js +111 -0
  169. package/dist/core/memory/okf-project-memory-store.js.map +1 -0
  170. package/dist/core/memory/providers/file-store.d.ts +44 -1
  171. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  172. package/dist/core/memory/providers/file-store.js +341 -24
  173. package/dist/core/memory/providers/file-store.js.map +1 -1
  174. package/dist/core/memory/worker-memory-tools.d.ts +5 -0
  175. package/dist/core/memory/worker-memory-tools.d.ts.map +1 -0
  176. package/dist/core/memory/worker-memory-tools.js +5 -0
  177. package/dist/core/memory/worker-memory-tools.js.map +1 -0
  178. package/dist/core/memory-controller.d.ts +10 -1
  179. package/dist/core/memory-controller.d.ts.map +1 -1
  180. package/dist/core/memory-controller.js +72 -8
  181. package/dist/core/memory-controller.js.map +1 -1
  182. package/dist/core/model-capability.d.ts +7 -0
  183. package/dist/core/model-capability.d.ts.map +1 -1
  184. package/dist/core/model-capability.js +12 -0
  185. package/dist/core/model-capability.js.map +1 -1
  186. package/dist/core/model-registry.d.ts.map +1 -1
  187. package/dist/core/model-registry.js +2 -10
  188. package/dist/core/model-registry.js.map +1 -1
  189. package/dist/core/model-router-controller.d.ts +3 -2
  190. package/dist/core/model-router-controller.d.ts.map +1 -1
  191. package/dist/core/model-router-controller.js +3 -2
  192. package/dist/core/model-router-controller.js.map +1 -1
  193. package/dist/core/orchestration/contracts.d.ts +16 -12
  194. package/dist/core/orchestration/contracts.d.ts.map +1 -1
  195. package/dist/core/orchestration/contracts.js +2 -2
  196. package/dist/core/orchestration/contracts.js.map +1 -1
  197. package/dist/core/orchestration/lane-tool-manifests.d.ts +2 -2
  198. package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
  199. package/dist/core/orchestration/lane-tool-manifests.js +6 -1
  200. package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
  201. package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
  202. package/dist/core/orchestration/profile-registry.js +14 -0
  203. package/dist/core/orchestration/profile-registry.js.map +1 -1
  204. package/dist/core/orchestration/task-profile-writer.d.ts +7 -4
  205. package/dist/core/orchestration/task-profile-writer.d.ts.map +1 -1
  206. package/dist/core/orchestration/task-profile-writer.js +71 -59
  207. package/dist/core/orchestration/task-profile-writer.js.map +1 -1
  208. package/dist/core/orchestration/thinking-level-schema.d.ts +7 -0
  209. package/dist/core/orchestration/thinking-level-schema.d.ts.map +1 -0
  210. package/dist/core/orchestration/thinking-level-schema.js +19 -0
  211. package/dist/core/orchestration/thinking-level-schema.js.map +1 -0
  212. package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
  213. package/dist/core/orchestration/worker-execution-contract.js +12 -5
  214. package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
  215. package/dist/core/provider-prompt-contracts.d.ts +1 -4
  216. package/dist/core/provider-prompt-contracts.d.ts.map +1 -1
  217. package/dist/core/provider-prompt-contracts.js +13 -29
  218. package/dist/core/provider-prompt-contracts.js.map +1 -1
  219. package/dist/core/provider-request-context-controller.d.ts +2 -0
  220. package/dist/core/provider-request-context-controller.d.ts.map +1 -1
  221. package/dist/core/provider-request-context-controller.js +10 -3
  222. package/dist/core/provider-request-context-controller.js.map +1 -1
  223. package/dist/core/reflection-controller.d.ts +63 -27
  224. package/dist/core/reflection-controller.d.ts.map +1 -1
  225. package/dist/core/reflection-controller.js +300 -132
  226. package/dist/core/reflection-controller.js.map +1 -1
  227. package/dist/core/runtime-builder.d.ts +1 -0
  228. package/dist/core/runtime-builder.d.ts.map +1 -1
  229. package/dist/core/runtime-builder.js +25 -14
  230. package/dist/core/runtime-builder.js.map +1 -1
  231. package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
  232. package/dist/core/secrets/credential-exposure-guard.js +55 -10
  233. package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
  234. package/dist/core/session-role.d.ts +6 -8
  235. package/dist/core/session-role.d.ts.map +1 -1
  236. package/dist/core/session-role.js +8 -18
  237. package/dist/core/session-role.js.map +1 -1
  238. package/dist/core/settings-manager.d.ts +13 -16
  239. package/dist/core/settings-manager.d.ts.map +1 -1
  240. package/dist/core/settings-manager.js +53 -50
  241. package/dist/core/settings-manager.js.map +1 -1
  242. package/dist/core/skill-vault.d.ts +15 -0
  243. package/dist/core/skill-vault.d.ts.map +1 -1
  244. package/dist/core/skill-vault.js +79 -45
  245. package/dist/core/skill-vault.js.map +1 -1
  246. package/dist/core/skills.d.ts +3 -0
  247. package/dist/core/skills.d.ts.map +1 -1
  248. package/dist/core/skills.js +6 -6
  249. package/dist/core/skills.js.map +1 -1
  250. package/dist/core/system-prompt-builder.d.ts +2 -0
  251. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  252. package/dist/core/system-prompt-builder.js +52 -12
  253. package/dist/core/system-prompt-builder.js.map +1 -1
  254. package/dist/core/system-prompt.js +1 -1
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/tool-capability-policy.d.ts +3 -0
  257. package/dist/core/tool-capability-policy.d.ts.map +1 -1
  258. package/dist/core/tool-capability-policy.js +13 -2
  259. package/dist/core/tool-capability-policy.js.map +1 -1
  260. package/dist/core/toolkit/script-runner.d.ts +2 -1
  261. package/dist/core/toolkit/script-runner.d.ts.map +1 -1
  262. package/dist/core/toolkit/script-runner.js +10 -2
  263. package/dist/core/toolkit/script-runner.js.map +1 -1
  264. package/dist/core/tools/delegate-status.d.ts +3 -1
  265. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  266. package/dist/core/tools/delegate-status.js +5 -1
  267. package/dist/core/tools/delegate-status.js.map +1 -1
  268. package/dist/core/tools/delegate.d.ts +4 -13
  269. package/dist/core/tools/delegate.d.ts.map +1 -1
  270. package/dist/core/tools/delegate.js +173 -73
  271. package/dist/core/tools/delegate.js.map +1 -1
  272. package/dist/core/tools/goal.d.ts +3 -4
  273. package/dist/core/tools/goal.d.ts.map +1 -1
  274. package/dist/core/tools/goal.js +24 -7
  275. package/dist/core/tools/goal.js.map +1 -1
  276. package/dist/core/tools/profile-writer.d.ts +2 -8
  277. package/dist/core/tools/profile-writer.d.ts.map +1 -1
  278. package/dist/core/tools/profile-writer.js +6 -18
  279. package/dist/core/tools/profile-writer.js.map +1 -1
  280. package/dist/core/tools/run-toolkit-script.d.ts +1 -1
  281. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  282. package/dist/core/tools/run-toolkit-script.js +2 -2
  283. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  284. package/dist/core/tools/skill-audit.d.ts +28 -1
  285. package/dist/core/tools/skill-audit.d.ts.map +1 -1
  286. package/dist/core/tools/skill-audit.js +56 -12
  287. package/dist/core/tools/skill-audit.js.map +1 -1
  288. package/dist/core/tools/skill.d.ts +12 -1
  289. package/dist/core/tools/skill.d.ts.map +1 -1
  290. package/dist/core/tools/skill.js +52 -0
  291. package/dist/core/tools/skill.js.map +1 -1
  292. package/dist/core/tools/skillify.d.ts.map +1 -1
  293. package/dist/core/tools/skillify.js +16 -7
  294. package/dist/core/tools/skillify.js.map +1 -1
  295. package/dist/core/tools/task-steps.js +1 -1
  296. package/dist/core/tools/task-steps.js.map +1 -1
  297. package/dist/core/tools/tmux-dispatch.d.ts +4 -16
  298. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
  299. package/dist/core/tools/tmux-dispatch.js +5 -20
  300. package/dist/core/tools/tmux-dispatch.js.map +1 -1
  301. package/dist/core/tools/tool-task.d.ts +1 -0
  302. package/dist/core/tools/tool-task.d.ts.map +1 -1
  303. package/dist/core/tools/tool-task.js +13 -8
  304. package/dist/core/tools/tool-task.js.map +1 -1
  305. package/dist/core/util/atomic-file.d.ts +2 -0
  306. package/dist/core/util/atomic-file.d.ts.map +1 -1
  307. package/dist/core/util/atomic-file.js +4 -0
  308. package/dist/core/util/atomic-file.js.map +1 -1
  309. package/dist/core/worktree-sync/codes.d.ts +1 -2
  310. package/dist/core/worktree-sync/codes.d.ts.map +1 -1
  311. package/dist/core/worktree-sync/codes.js +1 -2
  312. package/dist/core/worktree-sync/codes.js.map +1 -1
  313. package/dist/core/worktree-sync/lane-gate.d.ts +4 -8
  314. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
  315. package/dist/core/worktree-sync/lane-gate.js +5 -51
  316. package/dist/core/worktree-sync/lane-gate.js.map +1 -1
  317. package/dist/index.d.ts +5 -0
  318. package/dist/index.d.ts.map +1 -1
  319. package/dist/index.js +7 -0
  320. package/dist/index.js.map +1 -1
  321. package/dist/modes/interactive/auto-learn-controller.d.ts +6 -7
  322. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  323. package/dist/modes/interactive/auto-learn-controller.js +32 -207
  324. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  325. package/dist/modes/interactive/autonomy-commands.js +2 -2
  326. package/dist/modes/interactive/autonomy-commands.js.map +1 -1
  327. package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
  328. package/dist/modes/interactive/components/activity-lane.js +12 -23
  329. package/dist/modes/interactive/components/activity-lane.js.map +1 -1
  330. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/custom-message.js +142 -1
  332. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  333. package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
  334. package/dist/modes/interactive/components/fitness-role-selector.js +2 -2
  335. package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
  336. package/dist/modes/interactive/components/footer.js +1 -1
  337. package/dist/modes/interactive/components/footer.js.map +1 -1
  338. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  339. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  340. package/dist/modes/interactive/components/settings-selector.js +150 -73
  341. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  342. package/dist/modes/interactive/report-commands.d.ts.map +1 -1
  343. package/dist/modes/interactive/report-commands.js +8 -4
  344. package/dist/modes/interactive/report-commands.js.map +1 -1
  345. package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
  346. package/dist/modes/interactive/settings-selector-flow.js +10 -0
  347. package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
  348. package/docs/extensions.md +8 -0
  349. package/docs/harness-architecture.md +28 -32
  350. package/docs/index.md +1 -1
  351. package/docs/process-matrix.md +8 -6
  352. package/docs/resources.md +1 -1
  353. package/docs/settings.md +61 -51
  354. package/docs/tmux-agent-manager.md +47 -40
  355. package/docs/usage.md +1 -1
  356. package/docs/worker-profiles.md +8 -6
  357. package/docs/worktree-sync.md +26 -20
  358. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  359. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  360. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  361. package/examples/extensions/sandbox/package-lock.json +2 -2
  362. package/examples/extensions/sandbox/package.json +1 -1
  363. package/examples/extensions/with-deps/package-lock.json +2 -2
  364. package/examples/extensions/with-deps/package.json +1 -1
  365. package/npm-shrinkwrap.json +12 -12
  366. package/package.json +4 -4
  367. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +0 -133
  368. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +0 -1
  369. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +0 -199
  370. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +0 -1
  371. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +0 -312
@@ -1 +1 @@
1
- {"version":3,"file":"background-tool-task-controller.js","sourceRoot":"","sources":["../../src/core/background-tool-task-controller.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tBackgroundToolCallCompletion,\n\tBackgroundToolCallContext,\n\tBackgroundToolCallHandoff,\n} from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport { formatArtifactNotice, packToolOutput } from \"./context/tool-output-packer.ts\";\nimport { hasOnlyKeys, isPlainRecord } from \"./util/value-guards.ts\";\n\nexport const DEFAULT_BACKGROUND_TOOL_CALL_AFTER_MS = 15_000;\nexport const DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS = 30_000;\nexport const BACKGROUND_TOOL_TASK_CUSTOM_TYPE = \"background_tool_task\";\n\nconst MAX_RETAINED_TERMINAL_TASKS = 64;\nconst MAX_INLINE_OUTPUT_BYTES = 32 * 1024;\nconst MAX_INLINE_OUTPUT_LINES = 400;\nconst MAX_SUMMARY_CHARS = 200;\nconst MAX_TERMINAL_HANDOFF_RECORDS = 8;\nconst TASK_ID_PATTERN = /^tool-task-([1-9]\\d*)$/;\nconst RECORD_KEYS = [\n\t\"sessionId\",\n\t\"taskId\",\n\t\"toolCallId\",\n\t\"toolName\",\n\t\"status\",\n\t\"startedAt\",\n\t\"completedAt\",\n\t\"elapsedBeforeHandoffMs\",\n\t\"summary\",\n\t\"output\",\n\t\"artifactId\",\n\t\"usage\",\n\t\"cancellationRequested\",\n] as const;\n\nexport type BackgroundToolTaskStatus = \"running\" | \"completed\" | \"failed\" | \"canceled\";\n\nexport type BackgroundToolTaskRef = Pick<BackgroundToolTaskRecord, \"taskId\" | \"toolCallId\" | \"status\">;\n\n/** Match a goal/task_steps evidence uri to a session background tool task by task id or toolCallId. */\nexport function findBackgroundToolTask<T extends BackgroundToolTaskRef>(\n\trecords: readonly T[],\n\turi: string,\n): T | undefined {\n\tconst id = uri.trim();\n\tif (!id) return undefined;\n\treturn records.find((record) => record.taskId === id || record.toolCallId === id);\n}\n\n/** True only when the cited background task finished successfully. Undefined when no task matches. */\nexport function isCompletedBackgroundToolEvidence(\n\trecords: readonly BackgroundToolTaskRef[],\n\turi: string,\n): boolean | undefined {\n\tconst task = findBackgroundToolTask(records, uri);\n\tif (!task) return undefined;\n\treturn task.status === \"completed\";\n}\n\nexport function collectCitedRunningToolTaskIds(args: {\n\trecords: readonly BackgroundToolTaskRef[];\n\turis: readonly string[];\n}): string[] {\n\tconst running = new Set<string>();\n\tfor (const uri of args.uris) {\n\t\tconst task = findBackgroundToolTask(args.records, uri);\n\t\tif (task?.status === \"running\") running.add(task.taskId);\n\t}\n\treturn [...running];\n}\n\nexport interface BackgroundToolTaskRecord {\n\tsessionId: string;\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tstatus: BackgroundToolTaskStatus;\n\tstartedAt: string;\n\tcompletedAt?: string;\n\telapsedBeforeHandoffMs: number;\n\tsummary: string;\n\toutput: string;\n\tartifactId?: string;\n\tusage?: Usage;\n\tcancellationRequested?: boolean;\n}\n\nexport interface BackgroundToolTaskLiveView {\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdescription: string;\n}\n\nexport interface BackgroundToolTerminalMessage {\n\tcustomType: \"background-tool-completion\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: {\n\t\trecords: Array<{\n\t\t\ttaskId: string;\n\t\t\tstatus: BackgroundToolTaskStatus;\n\t\t\ttoolName: string;\n\t\t\tartifactId?: string;\n\t\t}>;\n\t};\n}\n\nexport interface BackgroundToolTaskControllerDeps {\n\tgetSessionId(): string;\n\t/** Current session followed by the authoritative fork ancestry whose branch records remain visible. */\n\tgetSessionLineageIds?(): readonly string[];\n\tgetArtifactStore(): ArtifactStore | undefined;\n\t/** Durable task records on the active branch, newest first, without rebuilding full model context. */\n\tloadPersistedRecordsNewestFirst?(): readonly unknown[];\n\tpersist(record: BackgroundToolTaskRecord): void;\n\tnotifyTerminal(records: readonly BackgroundToolTaskRecord[], options: { wakeParent: boolean }): Promise<void> | void;\n\tonLiveTasksChanged?(tasks: readonly BackgroundToolTaskLiveView[]): void;\n\trecordUsage?(taskId: string, usage: Usage): void;\n\tonError?(message: string, error: unknown): void;\n\tnow?(): Date;\n\t/** Event-wait watchdog; completion still arrives through the terminal handoff after this bound. */\n\twaitTimeoutMs?: number;\n}\n\ninterface BackgroundToolTaskState {\n\trecord: BackgroundToolTaskRecord;\n\tcancel: () => void;\n\tcancellationRequested: boolean;\n\twaitingConsumers: number;\n\tterminal: Promise<BackgroundToolTaskRecord>;\n\tresolveTerminal: (record: BackgroundToolTaskRecord) => void;\n\tartifactHolderId: string;\n}\n\n/** Read only task records on the active branch without allocating or hydrating the full branch context. */\nexport function loadBackgroundToolTaskRecordsNewestFirst(\n\tsessionManager: Pick<SessionManager, \"getLatestCustomEntryOnBranch\">,\n): unknown[] {\n\tconst records: unknown[] = [];\n\tlet fromId: string | undefined;\n\tfor (;;) {\n\t\tconst entry = sessionManager.getLatestCustomEntryOnBranch(BACKGROUND_TOOL_TASK_CUSTOM_TYPE, fromId);\n\t\tif (!entry) return records;\n\t\trecords.push(entry.data);\n\t\tif (entry.parentId === null) return records;\n\t\tfromId = entry.parentId;\n\t}\n}\n\nexport function createBackgroundToolTerminalMessage(\n\trecords: readonly BackgroundToolTaskRecord[],\n): BackgroundToolTerminalMessage {\n\tif (records.length === 0) throw new TypeError(\"Background tool terminal handoff requires at least one record\");\n\tconst included = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS);\n\tconst omitted = records.length - included.length;\n\treturn {\n\t\tcustomType: \"background-tool-completion\",\n\t\tcontent: [\n\t\t\t\"Background tool terminal handoff:\",\n\t\t\t...included.map((record) => `- ${record.taskId}: ${record.status} tool=${record.toolName}`),\n\t\t\t...(omitted > 0 ? [`- ${omitted} additional terminal tool task(s) omitted.`] : []),\n\t\t\t\"Parent woke. Need result: tool_task action=wait once; never poll.\",\n\t\t].join(\"\\n\"),\n\t\tdisplay: true,\n\t\tdetails: {\n\t\t\trecords: included.map((record) => ({\n\t\t\t\ttaskId: record.taskId,\n\t\t\t\tstatus: record.status,\n\t\t\t\ttoolName: record.toolName,\n\t\t\t\t...(record.artifactId ? { artifactId: record.artifactId } : {}),\n\t\t\t})),\n\t\t},\n\t};\n}\n\nfunction renderCompletionOutput(completion: BackgroundToolCallCompletion): string {\n\tconst blocks = completion.result.content.map((block) =>\n\t\tblock.type === \"text\" ? block.text : \"[Image output retained outside the foreground transcript]\",\n\t);\n\treturn blocks.join(\"\\n\") || \"Tool completed without text output.\";\n}\n\nfunction oneLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction summaryFor(status: BackgroundToolTaskStatus, toolName: string, output: string): string {\n\tconst prefix = `${toolName} ${status}`;\n\tconst firstLine = oneLine(output);\n\tif (!firstLine) return prefix;\n\tconst remaining = Math.max(0, MAX_SUMMARY_CHARS - prefix.length - 2);\n\treturn `${prefix}: ${firstLine.slice(0, remaining)}`;\n}\n\nfunction taskNumber(taskId: string): number | undefined {\n\tconst match = TASK_ID_PATTERN.exec(taskId);\n\tif (!match) return undefined;\n\tconst value = Number(match[1]);\n\treturn Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\nfunction cloneUsage(value: unknown): Usage | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst cost = value.cost;\n\tif (!isPlainRecord(cost)) return undefined;\n\tconst fields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"totalTokens\"] as const;\n\tconst costFields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const;\n\tif (\n\t\tfields.some((field) => typeof value[field] !== \"number\" || !Number.isFinite(value[field])) ||\n\t\tcostFields.some((field) => typeof cost[field] !== \"number\" || !Number.isFinite(cost[field]))\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tinput: value.input as number,\n\t\toutput: value.output as number,\n\t\tcacheRead: value.cacheRead as number,\n\t\tcacheWrite: value.cacheWrite as number,\n\t\ttotalTokens: value.totalTokens as number,\n\t\tcost: {\n\t\t\tinput: cost.input as number,\n\t\t\toutput: cost.output as number,\n\t\t\tcacheRead: cost.cacheRead as number,\n\t\t\tcacheWrite: cost.cacheWrite as number,\n\t\t\ttotal: cost.total as number,\n\t\t},\n\t};\n}\n\nfunction decodeRecord(value: unknown, sessionIds: ReadonlySet<string>): BackgroundToolTaskRecord | undefined {\n\tif (!isPlainRecord(value) || !hasOnlyKeys(value, RECORD_KEYS)) return undefined;\n\tif (\n\t\ttypeof value.sessionId !== \"string\" ||\n\t\tvalue.sessionId.length === 0 ||\n\t\t!sessionIds.has(value.sessionId) ||\n\t\ttypeof value.taskId !== \"string\" ||\n\t\ttaskNumber(value.taskId) === undefined ||\n\t\ttypeof value.toolCallId !== \"string\" ||\n\t\tvalue.toolCallId.length === 0 ||\n\t\ttypeof value.toolName !== \"string\" ||\n\t\tvalue.toolName.length === 0 ||\n\t\t(value.status !== \"running\" &&\n\t\t\tvalue.status !== \"completed\" &&\n\t\t\tvalue.status !== \"failed\" &&\n\t\t\tvalue.status !== \"canceled\") ||\n\t\ttypeof value.startedAt !== \"string\" ||\n\t\t!Number.isFinite(Date.parse(value.startedAt)) ||\n\t\t(value.completedAt !== undefined &&\n\t\t\t(typeof value.completedAt !== \"string\" || !Number.isFinite(Date.parse(value.completedAt)))) ||\n\t\t(value.status !== \"running\" && value.completedAt === undefined) ||\n\t\ttypeof value.elapsedBeforeHandoffMs !== \"number\" ||\n\t\t!Number.isFinite(value.elapsedBeforeHandoffMs) ||\n\t\tvalue.elapsedBeforeHandoffMs < 0 ||\n\t\ttypeof value.summary !== \"string\" ||\n\t\ttypeof value.output !== \"string\" ||\n\t\t(value.artifactId !== undefined &&\n\t\t\t(typeof value.artifactId !== \"string\" || !/^[0-9a-f]{1,64}$/.test(value.artifactId))) ||\n\t\t(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== \"boolean\")\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = value.usage === undefined ? undefined : cloneUsage(value.usage);\n\tif (value.usage !== undefined && !usage) return undefined;\n\treturn {\n\t\tsessionId: value.sessionId,\n\t\ttaskId: value.taskId,\n\t\ttoolCallId: value.toolCallId,\n\t\ttoolName: value.toolName,\n\t\tstatus: value.status,\n\t\tstartedAt: value.startedAt,\n\t\t...(value.completedAt ? { completedAt: value.completedAt } : {}),\n\t\telapsedBeforeHandoffMs: value.elapsedBeforeHandoffMs,\n\t\tsummary: value.summary,\n\t\toutput: value.output,\n\t\t...(value.artifactId ? { artifactId: value.artifactId } : {}),\n\t\t...(usage ? { usage } : {}),\n\t\t...(value.cancellationRequested !== undefined ? { cancellationRequested: value.cancellationRequested } : {}),\n\t};\n}\n\n/**\n * Session-owned registry for foreground tool calls transferred into background execution.\n * It emits edge records for durability and a replace-style live-task signal for UI consumers.\n */\nexport class BackgroundToolTaskController {\n\tprivate readonly deps: BackgroundToolTaskControllerDeps;\n\tprivate readonly tasks = new Map<string, BackgroundToolTaskState>();\n\tprivate readonly handoffRequests = new Map<string, Set<() => void>>();\n\tprivate readonly queuedNotifications: Array<{ record: BackgroundToolTaskRecord; wakeParent: boolean }> = [];\n\tprivate notificationDrain: Promise<void> | undefined;\n\tprivate readonly waitTimeoutMs: number;\n\tprivate nextTaskId = 1;\n\tprivate disposed = false;\n\n\tconstructor(deps: BackgroundToolTaskControllerDeps) {\n\t\tthis.deps = deps;\n\t\tthis.waitTimeoutMs = deps.waitTimeoutMs ?? DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS;\n\t\tif (!Number.isSafeInteger(this.waitTimeoutMs) || this.waitTimeoutMs < 1) {\n\t\t\tthrow new TypeError(\"Background tool task wait timeout must be a positive safe integer.\");\n\t\t}\n\t\tthis.restorePersistedTasks();\n\t}\n\n\thandoff(context: BackgroundToolCallContext): BackgroundToolCallHandoff | undefined {\n\t\tif (this.disposed || context.toolCall.name === \"tool_task\") return undefined;\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst taskId = `tool-task-${this.nextTaskId++}`;\n\t\tconst startedAt = this.now().toISOString();\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\tsessionId,\n\t\t\ttaskId,\n\t\t\ttoolCallId: context.toolCall.id,\n\t\t\ttoolName: context.toolCall.name,\n\t\t\tstatus: \"running\",\n\t\t\tstartedAt,\n\t\t\telapsedBeforeHandoffMs: context.elapsedMs,\n\t\t\tsummary: `${context.toolCall.name} running in the background`,\n\t\t\toutput: \"\",\n\t\t};\n\t\tconst state = this.createState(record, context.cancel);\n\t\tthis.tasks.set(taskId, state);\n\t\tif (!this.persist(record)) {\n\t\t\tthis.tasks.delete(taskId);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.emitLiveTasks();\n\t\tcontext.completion.then(\n\t\t\t(completion) => this.settle(state, completion),\n\t\t\t(error) => this.settleRejected(state, error),\n\t\t);\n\n\t\treturn {\n\t\t\tresult: {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: [\n\t\t\t\t\t\t\t`Tool ${context.toolCall.name} exceeded ${Math.max(1, Math.round(context.elapsedMs / 1000))}s; running as session task ${taskId}.`,\n\t\t\t\t\t\t\t\"Continue independent work. Dependency: tool_task action=wait once with taskId; event-driven, never poll.\",\n\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { sessionId, taskId, status: \"running\" as const },\n\t\t\t},\n\t\t};\n\t}\n\n\tlist(): BackgroundToolTaskRecord[] {\n\t\treturn [...this.tasks.values()].map((state) => ({ ...state.record }));\n\t}\n\n\twait(taskId: string, signal?: AbortSignal): Promise<BackgroundToolTaskRecord> {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state) return Promise.reject(new Error(`Unknown background tool task: ${taskId}`));\n\t\tif (state.record.status !== \"running\") return Promise.resolve({ ...state.record });\n\t\tif (signal?.aborted) return Promise.resolve({ ...state.record });\n\t\tstate.waitingConsumers++;\n\t\tlet waiting = true;\n\t\tconst releaseWaiter = (): void => {\n\t\t\tif (!waiting) return;\n\t\t\twaiting = false;\n\t\t\tstate.waitingConsumers--;\n\t\t};\n\t\treturn new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finishWait = (record: BackgroundToolTaskRecord): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(watchdog);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treleaseWaiter();\n\t\t\t\tresolve({ ...record });\n\t\t\t};\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tfinishWait(state.record);\n\t\t\t};\n\t\t\tconst watchdog = setTimeout(() => finishWait(state.record), this.waitTimeoutMs);\n\t\t\twatchdog.unref?.();\n\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tstate.terminal.then(finishWait);\n\t\t});\n\t}\n\n\tcancel(taskId: string): boolean {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state || state.record.status !== \"running\") return false;\n\t\tstate.cancellationRequested = true;\n\t\tstate.record = { ...state.record, cancellationRequested: true };\n\t\ttry {\n\t\t\tstate.cancel();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${taskId}`, error);\n\t\t}\n\t\treturn true;\n\t}\n\n\tsubscribeHandoffRequest(toolCallId: string, request: () => void): () => void {\n\t\tif (this.disposed) return () => {};\n\t\tconst requests = this.handoffRequests.get(toolCallId) ?? new Set<() => void>();\n\t\trequests.add(request);\n\t\tthis.handoffRequests.set(toolCallId, requests);\n\t\treturn () => {\n\t\t\trequests.delete(request);\n\t\t\tif (requests.size === 0) this.handoffRequests.delete(toolCallId);\n\t\t};\n\t}\n\n\trequestHandoff(toolCallId?: string): number {\n\t\tif (this.disposed) return 0;\n\t\tconst requested = toolCallId\n\t\t\t? [...(this.handoffRequests.get(toolCallId) ?? [])]\n\t\t\t: [...this.handoffRequests.values()].flatMap((requests) => [...requests]);\n\t\tfor (const request of requested) request();\n\t\treturn requested.length;\n\t}\n\n\tasync waitForNotifications(): Promise<void> {\n\t\t// A just-resolved tool completion settles through its promise continuation before it can enqueue\n\t\t// the notification drain. Yield once so this event-driven barrier observes that enqueue.\n\t\tawait Promise.resolve();\n\t\tfor (;;) {\n\t\t\tconst drain = this.notificationDrain;\n\t\t\tif (!drain) return;\n\t\t\tawait drain;\n\t\t\tif (!this.notificationDrain && this.queuedNotifications.length === 0) return;\n\t\t}\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.handoffRequests.clear();\n\t\t\tfor (const state of this.tasks.values()) {\n\t\t\t\tif (state.record.status !== \"running\") continue;\n\t\t\t\tstate.cancellationRequested = true;\n\t\t\t\ttry {\n\t\t\t\t\tstate.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${state.record.taskId}`, error);\n\t\t\t\t}\n\t\t\t\tthis.finishState(\n\t\t\t\t\tstate,\n\t\t\t\t\t\"canceled\",\n\t\t\t\t\t\"Session ended before the background tool completed.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.waitForNotifications();\n\t}\n\n\tprivate settle(state: BackgroundToolTaskState, completion: BackgroundToolCallCompletion): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : completion.isError ? \"failed\" : \"completed\";\n\t\tconst output = renderCompletionOutput(completion);\n\t\tthis.finishState(state, status, output, completion.result.usage, true);\n\t}\n\n\tprivate settleRejected(state: BackgroundToolTaskState, error: unknown): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : \"failed\";\n\t\tconst output = error instanceof Error ? error.message : String(error);\n\t\tthis.finishState(state, status, output, undefined, true);\n\t}\n\n\tprivate restorePersistedTasks(): void {\n\t\tconst load = this.deps.loadPersistedRecordsNewestFirst;\n\t\tif (!load) return;\n\t\tlet values: readonly unknown[];\n\t\ttry {\n\t\t\tvalues = load();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to load persisted background tool tasks\", error);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst sessionIds = new Set(this.deps.getSessionLineageIds?.() ?? [sessionId]);\n\t\tsessionIds.add(sessionId);\n\t\tconst seenTaskIds = new Set<string>();\n\t\tconst latestRecords: BackgroundToolTaskRecord[] = [];\n\t\tlet highestTaskNumber = 0;\n\t\tfor (const value of values) {\n\t\t\tif (\n\t\t\t\t!isPlainRecord(value) ||\n\t\t\t\ttypeof value.sessionId !== \"string\" ||\n\t\t\t\t!sessionIds.has(value.sessionId) ||\n\t\t\t\ttypeof value.taskId !== \"string\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst numericTaskId = taskNumber(value.taskId);\n\t\t\tif (numericTaskId === undefined) continue;\n\t\t\thighestTaskNumber = Math.max(highestTaskNumber, numericTaskId);\n\t\t\tif (seenTaskIds.has(value.taskId)) continue;\n\t\t\tseenTaskIds.add(value.taskId);\n\t\t\tconst record = decodeRecord(value, sessionIds);\n\t\t\tif (record) latestRecords.push(record);\n\t\t}\n\t\tthis.nextTaskId = highestTaskNumber + 1;\n\t\tlatestRecords.sort((left, right) => taskNumber(left.taskId)! - taskNumber(right.taskId)!);\n\t\tfor (const record of latestRecords) {\n\t\t\tconst state = this.createState(record, () => {});\n\t\t\tthis.tasks.set(record.taskId, state);\n\t\t\tif (record.status !== \"running\") {\n\t\t\t\tstate.resolveTerminal(record);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.finishState(\n\t\t\t\tstate,\n\t\t\t\t\"failed\",\n\t\t\t\t\"The session resumed after the owning process ended; the original tool completion is unavailable.\",\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tthis.pruneTerminalTasks();\n\t\tthis.emitLiveTasks();\n\t}\n\n\tprivate createState(record: BackgroundToolTaskRecord, cancel: () => void): BackgroundToolTaskState {\n\t\tlet resolveTerminal: ((terminalRecord: BackgroundToolTaskRecord) => void) | undefined;\n\t\tconst terminal = new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tresolveTerminal = resolve;\n\t\t});\n\t\treturn {\n\t\t\trecord: { ...record },\n\t\t\tcancel,\n\t\t\tcancellationRequested: record.cancellationRequested ?? false,\n\t\t\twaitingConsumers: 0,\n\t\t\tterminal,\n\t\t\tresolveTerminal: resolveTerminal!,\n\t\t\tartifactHolderId: `background-tool-task:${record.sessionId}:${record.taskId}`,\n\t\t};\n\t}\n\n\tprivate finishState(\n\t\tstate: BackgroundToolTaskState,\n\t\tstatus: Exclude<BackgroundToolTaskStatus, \"running\">,\n\t\trawOutput: string,\n\t\tusage: Usage | undefined,\n\t\tnotify: boolean,\n\t): void {\n\t\tconst packed = packToolOutput(\n\t\t\t{\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\trawContent: rawOutput,\n\t\t\t\tsessionEntryId: state.record.taskId,\n\t\t\t\tcreatedAtTurn: 0,\n\t\t\t\treproducible: false,\n\t\t\t\ttruncation: { maxBytes: MAX_INLINE_OUTPUT_BYTES, maxLines: MAX_INLINE_OUTPUT_LINES },\n\t\t\t},\n\t\t\tthis.deps.getArtifactStore(),\n\t\t\tstate.artifactHolderId,\n\t\t);\n\t\tconst output = packed.artifactId\n\t\t\t? `${packed.content}\\n\\n[${formatArtifactNotice(packed.artifactId)}]`\n\t\t\t: packed.content;\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\t...state.record,\n\t\t\tstatus,\n\t\t\tcompletedAt: this.now().toISOString(),\n\t\t\tsummary: summaryFor(status, state.record.toolName, output),\n\t\t\toutput,\n\t\t\t...(packed.artifactId ? { artifactId: packed.artifactId } : {}),\n\t\t\t...(usage ? { usage } : {}),\n\t\t\t...(state.cancellationRequested ? { cancellationRequested: true } : {}),\n\t\t};\n\t\tstate.record = record;\n\t\tthis.persist(record);\n\t\tif (usage) this.deps.recordUsage?.(record.taskId, usage);\n\t\tstate.resolveTerminal(record);\n\t\tthis.emitLiveTasks();\n\t\tthis.pruneTerminalTasks();\n\t\tif (notify) this.notify(record, state.waitingConsumers === 0);\n\t}\n\n\tprivate persist(record: BackgroundToolTaskRecord): boolean {\n\t\ttry {\n\t\t\tthis.deps.persist({ ...record });\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to persist background tool task ${record.taskId}`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate notify(record: BackgroundToolTaskRecord, wakeParent: boolean): void {\n\t\tthis.queuedNotifications.push({ record: { ...record }, wakeParent });\n\t\tthis.scheduleNotificationDrain();\n\t}\n\n\tprivate scheduleNotificationDrain(): void {\n\t\tif (this.notificationDrain) return;\n\t\tthis.notificationDrain = this.drainNotifications().finally(() => {\n\t\t\tthis.notificationDrain = undefined;\n\t\t\tif (this.queuedNotifications.length > 0) this.scheduleNotificationDrain();\n\t\t});\n\t}\n\n\tprivate async drainNotifications(): Promise<void> {\n\t\t// Allow completions released by the same event to reach this queue before forming the batch.\n\t\tawait Promise.resolve();\n\t\twhile (this.queuedNotifications.length > 0) {\n\t\t\tawait Promise.resolve();\n\t\t\tconst batch = this.queuedNotifications.splice(0);\n\t\t\tconst records = batch.map((notification) => notification.record);\n\t\t\ttry {\n\t\t\t\tawait this.deps.notifyTerminal(records, {\n\t\t\t\t\twakeParent: batch.some((notification) => notification.wakeParent),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconst includedIds = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS).map((record) => record.taskId);\n\t\t\t\tconst omitted = records.length - includedIds.length;\n\t\t\t\tconst suffix = omitted > 0 ? ` (+${omitted} more)` : \"\";\n\t\t\t\tthis.deps.onError?.(\n\t\t\t\t\t`Failed to notify terminal background tool task batch ${includedIds.join(\", \")}${suffix}`,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emitLiveTasks(): void {\n\t\tconst tasks = [...this.tasks.values()]\n\t\t\t.filter((state) => state.record.status === \"running\")\n\t\t\t.map((state) => ({\n\t\t\t\ttaskId: state.record.taskId,\n\t\t\t\ttoolCallId: state.record.toolCallId,\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\tdescription: state.record.summary,\n\t\t\t}));\n\t\ttry {\n\t\t\tthis.deps.onLiveTasksChanged?.(tasks);\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to emit background tool task level signal\", error);\n\t\t}\n\t}\n\n\tprivate pruneTerminalTasks(): void {\n\t\tconst terminal = [...this.tasks.values()].filter((state) => state.record.status !== \"running\");\n\t\tfor (const state of terminal.slice(0, Math.max(0, terminal.length - MAX_RETAINED_TERMINAL_TASKS))) {\n\t\t\tthis.tasks.delete(state.record.taskId);\n\t\t\tif (!state.record.artifactId) continue;\n\t\t\tconst store = this.deps.getArtifactStore();\n\t\t\tstore?.removeReference(state.record.artifactId, state.artifactHolderId);\n\t\t\tstore?.cleanup();\n\t\t}\n\t}\n\n\tprivate now(): Date {\n\t\treturn this.deps.now?.() ?? new Date();\n\t}\n}\n"]}
1
+ {"version":3,"file":"background-tool-task-controller.js","sourceRoot":"","sources":["../../src/core/background-tool-task-controller.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,CAAC,MAAM,qCAAqC,GAAG,MAAM,CAAC;AAC5D,MAAM,CAAC,MAAM,4CAA4C,GAAG,MAAM,CAAC;AACnE,MAAM,CAAC,MAAM,gCAAgC,GAAG,sBAAsB,CAAC;AAEvE,MAAM,2BAA2B,GAAG,EAAE,CAAC;AACvC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC1C,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,4BAA4B,GAAG,CAAC,CAAC;AACvC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACjD,MAAM,WAAW,GAAG;IACnB,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,aAAa;IACb,wBAAwB;IACxB,SAAS;IACT,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,uBAAuB;IACvB,kBAAkB;CACT,CAAC;AAOX,uGAAuG;AACvG,MAAM,UAAU,sBAAsB,CACrC,OAAqB,EACrB,GAAW;IAEX,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,iCAAiC,CAChD,OAAyC,EACzC,GAAW;IAEX,MAAM,IAAI,GAAG,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAG9C;IACA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACrB,CAAC;AA0ED,2GAA2G;AAC3G,MAAM,UAAU,wCAAwC,CACvD,cAAoE;IAEpE,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,IAAI,MAA0B,CAAC;IAC/B,SAAS,CAAC;QACT,MAAM,KAAK,GAAG,cAAc,CAAC,4BAA4B,CAAC,gCAAgC,EAAE,MAAM,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QAC5C,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mCAAmC,CAClD,OAA4C,EAC5C,OAAkC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,+DAA+D,CAAC,CAAC;IAC/G,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IACjD,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC;IAC/C,OAAO;QACN,UAAU,EAAE,4BAA4B;QACxC,OAAO,EAAE;YACR,mCAAmC;YACnC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC3F,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,4CAA4C,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,UAAU;gBACb,CAAC,CAAC,CAAC,mEAAmE,CAAC;gBACvE,CAAC,CAAC,CAAC,iGAAiG,CAAC,CAAC;SACvG,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,IAAI;QACb,OAAO,EAAE;YACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAClC,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;SACH;KACD,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAwC;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,2DAA2D,CAChG,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qCAAqC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC7B,OAAO,KAAK;SACV,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,UAAU,CAAC,MAAgC,EAAE,QAAgB,EAAE,MAAc;IACrF,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IACjC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACrE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,CAAU,CAAC;IACtF,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAU,CAAC;IACpF,IACC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAC3F,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO;QACN,KAAK,EAAE,KAAK,CAAC,KAAe;QAC5B,MAAM,EAAE,KAAK,CAAC,MAAgB;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAmB;QACpC,UAAU,EAAE,KAAK,CAAC,UAAoB;QACtC,WAAW,EAAE,KAAK,CAAC,WAAqB;QACxC,IAAI,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,KAAe;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAgB;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAmB;YACnC,UAAU,EAAE,IAAI,CAAC,UAAoB;YACrC,KAAK,EAAE,IAAI,CAAC,KAAe;SAC3B;KACD,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,UAA+B;IACpE,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,IACC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAC5B,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;QAChC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS;QACtC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAC7B,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;QAClC,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC3B,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS;YAC1B,KAAK,CAAC,MAAM,KAAK,WAAW;YAC5B,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC;QAC7B,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS;YAC/B,CAAC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5F,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC;QAC/D,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAC/F,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ;QAChD,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAC9C,KAAK,CAAC,sBAAsB,GAAG,CAAC;QAChC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS;YAC9B,CAAC,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACtF,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAAC;QAC/F,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS;YACpC,KAAK,CAAC,gBAAgB,KAAK,SAAS;YACpC,KAAK,CAAC,gBAAgB,KAAK,WAAW,CAAC,EACvC,CAAC;QACF,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC1D,OAAO;QACN,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,GAAG,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7F,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,4BAA4B;IAexC,YAAY,IAAsC;QAbjC,UAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;QACnD,oBAAe,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,wBAAmB,GAAqE,EAAE,CAAC;QAC3F,8BAAyB,GAAG,IAAI,GAAG,EAA4B,CAAC;QAKzE,2BAAsB,GAAG,CAAC,CAAC;QAE3B,eAAU,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,KAAK,CAAC;QAGxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,4CAA4C,CAAC;QACxF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,SAAS,CAAC,oEAAoE,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,OAAkC;QACzC,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,SAAS,CAAC;QAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,aAAa,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;QACvC,MAAM,MAAM,GAA6B;YACxC,SAAS;YACT,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC/B,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC/B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,EAAE,SAAS;YACjB,SAAS;YACT,sBAAsB,EAAE,OAAO,CAAC,SAAS;YACzC,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,4BAA4B;YAC7D,MAAM,EAAE,EAAE;SACV,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,CAAC,UAAU,CAAC,IAAI,CACtB,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,EAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAC5C,CAAC;QAEF,OAAO;YACN,MAAM,EAAE;gBACP,OAAO,EAAE;oBACR;wBACC,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACL,QAAQ,OAAO,CAAC,QAAQ,CAAC,IAAI,aAAa,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,8BAA8B,MAAM,GAAG;4BAClI,0GAA0G;yBAC1G,CAAC,IAAI,CAAC,IAAI,CAAC;qBACZ;iBACD;gBACD,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAkB,EAAE;aAC1D;SACD,CAAC;IACH,CAAC;IAED,IAAI;QACH,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,uFAAuF;IACvF,OAAO,CAAC,OAAoC;QAC3C,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9D,MAAM,MAAM,GAAG,GAAG;YACjB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACrC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAoB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,EAAE,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,gBAAgB,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM,aAAa,GAAG,GAAS,EAAE;YAChC,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,GAAG,KAAK,CAAC;YAChB,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC;QACF,OAAO,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,MAAM,UAAU,GAAG,CAAC,MAAgC,EAAQ,EAAE;gBAC7D,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACvB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,aAAa,EAAE,CAAC;gBAChB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC1D,OAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC,CAAC;YACF,MAAM,OAAO,GAAG,GAAS,EAAE;gBAC1B,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC,CAAC;YACF,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAChF,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;YACnB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAAc;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC9D,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;QACnC,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,CAAC;YACJ,KAAK,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,yCAAyC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uBAAuB,CAAC,UAAkB,EAAE,OAAmB;QAC9D,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,GAAG,EAAc,CAAC;QAC/E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,GAAG,EAAE;YACX,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAClE,CAAC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,UAAmB;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,UAAU;YAC3B,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC3E,KAAK,MAAM,OAAO,IAAI,SAAS;YAAE,OAAO,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,oBAAoB;QACzB,iGAAiG;QACjG,yFAAyF;QACzF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,SAAS,CAAC;YACT,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,CAAC;gBACZ,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,CAAC;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,KAAK,CAAC;gBACZ,SAAS;YACV,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClC,CAAC;IACF,CAAC;IAED,KAAK,CAAC,QAAQ;QACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,SAAS;gBAChD,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;gBACnC,IAAI,CAAC;oBACJ,KAAK,CAAC,MAAM,EAAE,CAAC;gBAChB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,yCAAyC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC5F,CAAC;gBACD,IAAI,CAAC,WAAW,CACf,KAAK,EACL,UAAU,EACV,qDAAqD,EACrD,SAAS,EACT,KAAK,CACL,CAAC;YACH,CAAC;QACF,CAAC;QACD,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnC,CAAC;IAEO,MAAM,CAAC,KAA8B,EAAE,UAAwC;QACtF,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;QACtG,MAAM,MAAM,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAEO,cAAc,CAAC,KAA8B,EAAE,KAAc;QACpE,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnE,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEO,qBAAqB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC;QACvD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACJ,MAAM,GAAG,IAAI,EAAE,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;YAC7E,OAAO;QACR,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9E,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,aAAa,GAA+B,EAAE,CAAC;QACrD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC5B,IACC,CAAC,aAAa,CAAC,KAAK,CAAC;gBACrB,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;gBACnC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;gBAChC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAC/B,CAAC;gBACF,SAAS;YACV,CAAC;YACD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,aAAa,KAAK,SAAS;gBAAE,SAAS;YAC1C,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;YAC/D,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC5C,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YAC/C,IAAI,MAAM;gBAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,iBAAiB,GAAG,CAAC,CAAC;QACxC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAE,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC;QAC1F,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;oBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACrE,SAAS;YACV,CAAC;YACD,IAAI,CAAC,WAAW,CACf,KAAK,EACL,QAAQ,EACR,kGAAkG,EAClG,SAAS,EACT,KAAK,CACL,CAAC;QACH,CAAC;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;IACtB,CAAC;IAEO,WAAW,CAAC,MAAgC,EAAE,MAAkB;QACvE,IAAI,eAAiF,CAAC;QACtF,MAAM,QAAQ,GAAG,IAAI,OAAO,CAA2B,CAAC,OAAO,EAAE,EAAE;YAClE,eAAe,GAAG,OAAO,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO;YACN,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;YACrB,MAAM;YACN,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,IAAI,KAAK;YAC5D,gBAAgB,EAAE,CAAC;YACnB,QAAQ;YACR,eAAe,EAAE,eAAgB;YACjC,gBAAgB,EAAE,wBAAwB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE;SAC7E,CAAC;IACH,CAAC;IAEO,WAAW,CAClB,KAA8B,EAC9B,MAAoD,EACpD,SAAiB,EACjB,KAAwB,EACxB,MAAe;QAEf,MAAM,MAAM,GAAG,cAAc,CAC5B;YACC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC/B,UAAU,EAAE,SAAS;YACrB,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YACnC,aAAa,EAAE,CAAC;YAChB,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,uBAAuB,EAAE;SACpF,EACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAC5B,KAAK,CAAC,gBAAgB,CACtB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU;YAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,QAAQ,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG;YACrE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAClB,MAAM,MAAM,GAA6B;YACxC,GAAG,KAAK,CAAC,MAAM;YACf,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC1D,MAAM;YACN,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvE,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;SAClD,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,cAAc,GAAG,SAAS;YAC/B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC;gBACA,GAAG,MAAM;gBACT,MAAM,EAAE,QAAiB;gBACzB,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,iDAAiD;gBAC5E,MAAM,EAAE,yEAAyE;aACjF,CAAC;QACJ,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC;QAC9B,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;IAEO,OAAO,CAAC,MAAgC;QAC/C,IAAI,CAAC;YACJ,MAAM,aAAa,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;YACpC,OAAO,aAAa,CAAC,UAAU,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,0CAA0C,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;YACtF,OAAO,KAAK,CAAC;QACd,CAAC;IACF,CAAC;IAEO,MAAM,CAAC,MAAgC,EAAE,UAAmB;QACnE,MAAM,kBAAkB,GAAG;YAC1B,GAAG,MAAM;YACT,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC;QACF,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC;IAEO,yBAAyB,CAAC,MAAgC;QACjE,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;YAAE,OAAO;QAClD,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,WAAoB,EAAE,CAAC;QACxE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW;gBAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACxF,CAAC;IACF,CAAC;IAEO,YAAY,CAAC,KAA8B;QAClD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QACzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QAC/C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACrD,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC9F,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAChC,CAAC;QACF,CAAC;IACF,CAAC;IAEO,yBAAyB;QAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACnF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/D,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACnC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB;gBAAE,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAC3G,CAAC,CAAC,CAAC;IACJ,CAAC;IAEO,yBAAyB;QAChC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACzD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrF,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,2BAA2B,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChE,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAC;YAC9C,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;YAC1C,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;YAC7C,OAAO,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,yBAAyB,EAAE,CAAC;QAClC,CAAC,EAAE,OAAO,CAAC,CAAC;QACZ,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,EAAE,CAAC;IACvC,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC/B,6FAA6F;QAC7F,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,CAAC;gBACJ,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;oBACvC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC;iBACjE,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,oFAAoF;gBACpF,uFAAuF;gBACvF,4EAA4E;gBAC5E,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;gBAC3C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClG,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;gBACpD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,IAAI,CAAC;oBACJ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAClB,wDAAwD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,EAAE,EACzF,KAAK,CACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACR,2DAA2D;gBAC5D,CAAC;gBACD,IAAI,CAAC,yBAAyB,EAAE,CAAC;gBACjC,OAAO;YACR,CAAC;YACD,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;YAChC,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;IACF,CAAC;IAEO,aAAa;QACpB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;aACpC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;aACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU;YACnC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC/B,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;SACjC,CAAC,CAAC,CAAC;QACL,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACF,CAAC;IAEO,kBAAkB;QACzB,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;QAC/F,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,2BAA2B,CAAC,CAAC,EAAE,CAAC;YACnG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU;gBAAE,SAAS;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3C,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACxE,KAAK,EAAE,OAAO,EAAE,CAAC;QAClB,CAAC;IACF,CAAC;IAEO,GAAG;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;IACxC,CAAC;CACD","sourcesContent":["import type {\n\tBackgroundToolCallCompletion,\n\tBackgroundToolCallContext,\n\tBackgroundToolCallHandoff,\n} from \"@caupulican/pi-agent-core\";\nimport type { SessionManager } from \"@caupulican/pi-agent-core/node\";\nimport type { Usage } from \"@caupulican/pi-ai\";\nimport type { ArtifactStore } from \"./context/context-artifacts.ts\";\nimport { formatArtifactNotice, packToolOutput } from \"./context/tool-output-packer.ts\";\nimport { hasOnlyKeys, isPlainRecord } from \"./util/value-guards.ts\";\n\nexport const DEFAULT_BACKGROUND_TOOL_CALL_AFTER_MS = 15_000;\nexport const DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS = 30_000;\nexport const BACKGROUND_TOOL_TASK_CUSTOM_TYPE = \"background_tool_task\";\n\nconst MAX_RETAINED_TERMINAL_TASKS = 64;\nconst MAX_INLINE_OUTPUT_BYTES = 32 * 1024;\nconst MAX_INLINE_OUTPUT_LINES = 400;\nconst MAX_SUMMARY_CHARS = 200;\nconst MAX_TERMINAL_HANDOFF_RECORDS = 8;\nconst TASK_ID_PATTERN = /^tool-task-([1-9]\\d*)$/;\nconst RECORD_KEYS = [\n\t\"sessionId\",\n\t\"taskId\",\n\t\"toolCallId\",\n\t\"toolName\",\n\t\"goalId\",\n\t\"status\",\n\t\"startedAt\",\n\t\"completedAt\",\n\t\"elapsedBeforeHandoffMs\",\n\t\"summary\",\n\t\"output\",\n\t\"artifactId\",\n\t\"usage\",\n\t\"cancellationRequested\",\n\t\"terminalDelivery\",\n] as const;\n\nexport type BackgroundToolTaskStatus = \"running\" | \"completed\" | \"failed\" | \"canceled\";\nexport type BackgroundToolTerminalDelivery = \"pending\" | \"delivered\";\n\nexport type BackgroundToolTaskRef = Pick<BackgroundToolTaskRecord, \"taskId\" | \"toolCallId\" | \"goalId\" | \"status\">;\n\n/** Match a goal/task_steps evidence uri to a session background tool task by task id or toolCallId. */\nexport function findBackgroundToolTask<T extends BackgroundToolTaskRef>(\n\trecords: readonly T[],\n\turi: string,\n): T | undefined {\n\tconst id = uri.trim();\n\tif (!id) return undefined;\n\treturn records.find((record) => record.taskId === id || record.toolCallId === id);\n}\n\n/** True only when the cited background task finished successfully. Undefined when no task matches. */\nexport function isCompletedBackgroundToolEvidence(\n\trecords: readonly BackgroundToolTaskRef[],\n\turi: string,\n): boolean | undefined {\n\tconst task = findBackgroundToolTask(records, uri);\n\tif (!task) return undefined;\n\treturn task.status === \"completed\";\n}\n\nexport function collectCitedRunningToolTaskIds(args: {\n\trecords: readonly BackgroundToolTaskRef[];\n\turis: readonly string[];\n}): string[] {\n\tconst running = new Set<string>();\n\tfor (const uri of args.uris) {\n\t\tconst task = findBackgroundToolTask(args.records, uri);\n\t\tif (task?.status === \"running\") running.add(task.taskId);\n\t}\n\treturn [...running];\n}\n\nexport interface BackgroundToolTaskRecord {\n\tsessionId: string;\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\t/** Goal execution that owned the foreground tool call when it was handed off. */\n\tgoalId?: string;\n\tstatus: BackgroundToolTaskStatus;\n\tstartedAt: string;\n\tcompletedAt?: string;\n\telapsedBeforeHandoffMs: number;\n\tsummary: string;\n\toutput: string;\n\tartifactId?: string;\n\tusage?: Usage;\n\tcancellationRequested?: boolean;\n\t/** Durable terminal handoff state. Undefined on legacy records, which are treated as delivered. */\n\tterminalDelivery?: BackgroundToolTerminalDelivery;\n\t/** Runtime-only receipt; never serialized into the durable task record. */\n\tobservedAt?: string;\n}\n\nexport interface BackgroundToolTaskLiveView {\n\ttaskId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\tdescription: string;\n}\n\nexport interface BackgroundToolTerminalMessage {\n\tcustomType: \"background-tool-completion\";\n\tcontent: string;\n\tdisplay: true;\n\tdetails: {\n\t\trecords: Array<{\n\t\t\ttaskId: string;\n\t\t\tstatus: BackgroundToolTaskStatus;\n\t\t\ttoolName: string;\n\t\t\tartifactId?: string;\n\t\t}>;\n\t};\n}\n\nexport interface BackgroundToolTaskControllerDeps {\n\tgetSessionId(): string;\n\t/** Authoritative goal execution attribution at the tool handoff boundary. */\n\tgetGoalId?(): string | undefined;\n\t/** Current session followed by the authoritative fork ancestry whose branch records remain visible. */\n\tgetSessionLineageIds?(): readonly string[];\n\tgetArtifactStore(): ArtifactStore | undefined;\n\t/** Durable task records on the active branch, newest first, without rebuilding full model context. */\n\tloadPersistedRecordsNewestFirst?(): readonly unknown[];\n\tpersist(record: BackgroundToolTaskRecord): void;\n\tnotifyTerminal(records: readonly BackgroundToolTaskRecord[], options: { wakeParent: boolean }): Promise<void> | void;\n\tonLiveTasksChanged?(tasks: readonly BackgroundToolTaskLiveView[]): void;\n\trecordUsage?(taskId: string, usage: Usage): void;\n\tonError?(message: string, error: unknown): void;\n\tnow?(): Date;\n\t/** Event-wait watchdog; completion still arrives through the terminal handoff after this bound. */\n\twaitTimeoutMs?: number;\n}\n\ninterface BackgroundToolTaskState {\n\trecord: BackgroundToolTaskRecord;\n\tcancel: () => void;\n\tcancellationRequested: boolean;\n\twaitingConsumers: number;\n\tterminal: Promise<BackgroundToolTaskRecord>;\n\tresolveTerminal: (record: BackgroundToolTaskRecord) => void;\n\tartifactHolderId: string;\n}\n\n/** Read only task records on the active branch without allocating or hydrating the full branch context. */\nexport function loadBackgroundToolTaskRecordsNewestFirst(\n\tsessionManager: Pick<SessionManager, \"getLatestCustomEntryOnBranch\">,\n): unknown[] {\n\tconst records: unknown[] = [];\n\tlet fromId: string | undefined;\n\tfor (;;) {\n\t\tconst entry = sessionManager.getLatestCustomEntryOnBranch(BACKGROUND_TOOL_TASK_CUSTOM_TYPE, fromId);\n\t\tif (!entry) return records;\n\t\trecords.push(entry.data);\n\t\tif (entry.parentId === null) return records;\n\t\tfromId = entry.parentId;\n\t}\n}\n\nexport function createBackgroundToolTerminalMessage(\n\trecords: readonly BackgroundToolTaskRecord[],\n\toptions?: { wakeParent?: boolean },\n): BackgroundToolTerminalMessage {\n\tif (records.length === 0) throw new TypeError(\"Background tool terminal handoff requires at least one record\");\n\tconst included = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS);\n\tconst omitted = records.length - included.length;\n\tconst wakeParent = options?.wakeParent ?? true;\n\treturn {\n\t\tcustomType: \"background-tool-completion\",\n\t\tcontent: [\n\t\t\t\"Background tool terminal handoff:\",\n\t\t\t...included.map((record) => `- ${record.taskId}: ${record.status} tool=${record.toolName}`),\n\t\t\t...(omitted > 0 ? [`- ${omitted} additional terminal tool task(s) omitted.`] : []),\n\t\t\t...(wakeParent\n\t\t\t\t? [\"Parent woke. Need result: tool_task action=wait once; never poll.\"]\n\t\t\t\t: [\"Parent was not woken because the owning goal is no longer active. Wait for explicit user input.\"]),\n\t\t].join(\"\\n\"),\n\t\tdisplay: true,\n\t\tdetails: {\n\t\t\trecords: included.map((record) => ({\n\t\t\t\ttaskId: record.taskId,\n\t\t\t\tstatus: record.status,\n\t\t\t\ttoolName: record.toolName,\n\t\t\t\t...(record.artifactId ? { artifactId: record.artifactId } : {}),\n\t\t\t})),\n\t\t},\n\t};\n}\n\nfunction renderCompletionOutput(completion: BackgroundToolCallCompletion): string {\n\tconst blocks = completion.result.content.map((block) =>\n\t\tblock.type === \"text\" ? block.text : \"[Image output retained outside the foreground transcript]\",\n\t);\n\treturn blocks.join(\"\\n\") || \"Tool completed without text output.\";\n}\n\nfunction oneLine(value: string): string {\n\treturn value\n\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction summaryFor(status: BackgroundToolTaskStatus, toolName: string, output: string): string {\n\tconst prefix = `${toolName} ${status}`;\n\tconst firstLine = oneLine(output);\n\tif (!firstLine) return prefix;\n\tconst remaining = Math.max(0, MAX_SUMMARY_CHARS - prefix.length - 2);\n\treturn `${prefix}: ${firstLine.slice(0, remaining)}`;\n}\n\nfunction taskNumber(taskId: string): number | undefined {\n\tconst match = TASK_ID_PATTERN.exec(taskId);\n\tif (!match) return undefined;\n\tconst value = Number(match[1]);\n\treturn Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\nfunction cloneUsage(value: unknown): Usage | undefined {\n\tif (!isPlainRecord(value)) return undefined;\n\tconst cost = value.cost;\n\tif (!isPlainRecord(cost)) return undefined;\n\tconst fields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"totalTokens\"] as const;\n\tconst costFields = [\"input\", \"output\", \"cacheRead\", \"cacheWrite\", \"total\"] as const;\n\tif (\n\t\tfields.some((field) => typeof value[field] !== \"number\" || !Number.isFinite(value[field])) ||\n\t\tcostFields.some((field) => typeof cost[field] !== \"number\" || !Number.isFinite(cost[field]))\n\t) {\n\t\treturn undefined;\n\t}\n\treturn {\n\t\tinput: value.input as number,\n\t\toutput: value.output as number,\n\t\tcacheRead: value.cacheRead as number,\n\t\tcacheWrite: value.cacheWrite as number,\n\t\ttotalTokens: value.totalTokens as number,\n\t\tcost: {\n\t\t\tinput: cost.input as number,\n\t\t\toutput: cost.output as number,\n\t\t\tcacheRead: cost.cacheRead as number,\n\t\t\tcacheWrite: cost.cacheWrite as number,\n\t\t\ttotal: cost.total as number,\n\t\t},\n\t};\n}\n\nfunction decodeRecord(value: unknown, sessionIds: ReadonlySet<string>): BackgroundToolTaskRecord | undefined {\n\tif (!isPlainRecord(value) || !hasOnlyKeys(value, RECORD_KEYS)) return undefined;\n\tif (\n\t\ttypeof value.sessionId !== \"string\" ||\n\t\tvalue.sessionId.length === 0 ||\n\t\t!sessionIds.has(value.sessionId) ||\n\t\ttypeof value.taskId !== \"string\" ||\n\t\ttaskNumber(value.taskId) === undefined ||\n\t\ttypeof value.toolCallId !== \"string\" ||\n\t\tvalue.toolCallId.length === 0 ||\n\t\ttypeof value.toolName !== \"string\" ||\n\t\tvalue.toolName.length === 0 ||\n\t\t(value.status !== \"running\" &&\n\t\t\tvalue.status !== \"completed\" &&\n\t\t\tvalue.status !== \"failed\" &&\n\t\t\tvalue.status !== \"canceled\") ||\n\t\ttypeof value.startedAt !== \"string\" ||\n\t\t!Number.isFinite(Date.parse(value.startedAt)) ||\n\t\t(value.completedAt !== undefined &&\n\t\t\t(typeof value.completedAt !== \"string\" || !Number.isFinite(Date.parse(value.completedAt)))) ||\n\t\t(value.status !== \"running\" && value.completedAt === undefined) ||\n\t\t(value.goalId !== undefined && (typeof value.goalId !== \"string\" || value.goalId.length === 0)) ||\n\t\ttypeof value.elapsedBeforeHandoffMs !== \"number\" ||\n\t\t!Number.isFinite(value.elapsedBeforeHandoffMs) ||\n\t\tvalue.elapsedBeforeHandoffMs < 0 ||\n\t\ttypeof value.summary !== \"string\" ||\n\t\ttypeof value.output !== \"string\" ||\n\t\t(value.artifactId !== undefined &&\n\t\t\t(typeof value.artifactId !== \"string\" || !/^[0-9a-f]{1,64}$/.test(value.artifactId))) ||\n\t\t(value.cancellationRequested !== undefined && typeof value.cancellationRequested !== \"boolean\") ||\n\t\t(value.terminalDelivery !== undefined &&\n\t\t\tvalue.terminalDelivery !== \"pending\" &&\n\t\t\tvalue.terminalDelivery !== \"delivered\")\n\t) {\n\t\treturn undefined;\n\t}\n\tconst usage = value.usage === undefined ? undefined : cloneUsage(value.usage);\n\tif (value.usage !== undefined && !usage) return undefined;\n\treturn {\n\t\tsessionId: value.sessionId,\n\t\ttaskId: value.taskId,\n\t\ttoolCallId: value.toolCallId,\n\t\ttoolName: value.toolName,\n\t\t...(value.goalId ? { goalId: value.goalId } : {}),\n\t\tstatus: value.status,\n\t\tstartedAt: value.startedAt,\n\t\t...(value.completedAt ? { completedAt: value.completedAt } : {}),\n\t\telapsedBeforeHandoffMs: value.elapsedBeforeHandoffMs,\n\t\tsummary: value.summary,\n\t\toutput: value.output,\n\t\t...(value.artifactId ? { artifactId: value.artifactId } : {}),\n\t\t...(usage ? { usage } : {}),\n\t\t...(value.cancellationRequested !== undefined ? { cancellationRequested: value.cancellationRequested } : {}),\n\t\t...(value.terminalDelivery !== undefined ? { terminalDelivery: value.terminalDelivery } : {}),\n\t};\n}\n\n/**\n * Session-owned registry for foreground tool calls transferred into background execution.\n * It emits edge records for durability and a replace-style live-task signal for UI consumers.\n */\nexport class BackgroundToolTaskController {\n\tprivate readonly deps: BackgroundToolTaskControllerDeps;\n\tprivate readonly tasks = new Map<string, BackgroundToolTaskState>();\n\tprivate readonly handoffRequests = new Map<string, Set<() => void>>();\n\tprivate readonly queuedNotifications: Array<{ record: BackgroundToolTaskRecord; wakeParent: boolean }> = [];\n\tprivate readonly activeNotificationRecords = new Set<BackgroundToolTaskRecord>();\n\tprivate notificationDrain: Promise<void> | undefined;\n\tprivate notificationRetryTimer: ReturnType<typeof setTimeout> | undefined;\n\tprivate notificationRetryCompletion: Promise<void> | undefined;\n\tprivate resolveNotificationRetry: (() => void) | undefined;\n\tprivate notificationRetryCount = 0;\n\tprivate readonly waitTimeoutMs: number;\n\tprivate nextTaskId = 1;\n\tprivate disposed = false;\n\n\tconstructor(deps: BackgroundToolTaskControllerDeps) {\n\t\tthis.deps = deps;\n\t\tthis.waitTimeoutMs = deps.waitTimeoutMs ?? DEFAULT_BACKGROUND_TOOL_TASK_WAIT_TIMEOUT_MS;\n\t\tif (!Number.isSafeInteger(this.waitTimeoutMs) || this.waitTimeoutMs < 1) {\n\t\t\tthrow new TypeError(\"Background tool task wait timeout must be a positive safe integer.\");\n\t\t}\n\t\tthis.restorePersistedTasks();\n\t}\n\n\thandoff(context: BackgroundToolCallContext): BackgroundToolCallHandoff | undefined {\n\t\tif (this.disposed || context.toolCall.name === \"tool_task\") return undefined;\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst taskId = `tool-task-${this.nextTaskId++}`;\n\t\tconst startedAt = this.now().toISOString();\n\t\tconst goalId = this.deps.getGoalId?.();\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\tsessionId,\n\t\t\ttaskId,\n\t\t\ttoolCallId: context.toolCall.id,\n\t\t\ttoolName: context.toolCall.name,\n\t\t\t...(goalId ? { goalId } : {}),\n\t\t\tstatus: \"running\",\n\t\t\tstartedAt,\n\t\t\telapsedBeforeHandoffMs: context.elapsedMs,\n\t\t\tsummary: `${context.toolCall.name} running in the background`,\n\t\t\toutput: \"\",\n\t\t};\n\t\tconst state = this.createState(record, context.cancel);\n\t\tthis.tasks.set(taskId, state);\n\t\tif (!this.persist(record)) {\n\t\t\tthis.tasks.delete(taskId);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis.emitLiveTasks();\n\t\tcontext.completion.then(\n\t\t\t(completion) => this.settle(state, completion),\n\t\t\t(error) => this.settleRejected(state, error),\n\t\t);\n\n\t\treturn {\n\t\t\tresult: {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: [\n\t\t\t\t\t\t\t`Tool ${context.toolCall.name} exceeded ${Math.max(1, Math.round(context.elapsedMs / 1000))}s; running as session task ${taskId}.`,\n\t\t\t\t\t\t\t\"Continue independent work. Dependency: tool_task action=wait once with taskId; event-driven, never poll.\",\n\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { sessionId, taskId, status: \"running\" as const },\n\t\t\t},\n\t\t};\n\t}\n\n\tlist(): BackgroundToolTaskRecord[] {\n\t\treturn [...this.tasks.values()].map((state) => ({ ...state.record }));\n\t}\n\n\t/** Model-facing read that consumes terminal delivery without approving its outcome. */\n\tobserve(taskIds?: string | readonly string[]): BackgroundToolTaskRecord[] {\n\t\tconst ids = typeof taskIds === \"string\" ? [taskIds] : taskIds;\n\t\tconst states = ids\n\t\t\t? ids.flatMap((taskId) => {\n\t\t\t\t\tconst state = this.tasks.get(taskId);\n\t\t\t\t\treturn state === undefined ? [] : [state];\n\t\t\t\t})\n\t\t\t: [...this.tasks.values()];\n\t\tfor (const state of states) this.observeState(state);\n\t\treturn states.map((state) => ({ ...state.record }));\n\t}\n\n\twait(taskId: string, signal?: AbortSignal): Promise<BackgroundToolTaskRecord> {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state) return Promise.reject(new Error(`Unknown background tool task: ${taskId}`));\n\t\tif (state.record.status !== \"running\") {\n\t\t\tthis.observeState(state);\n\t\t\treturn Promise.resolve({ ...state.record });\n\t\t}\n\t\tif (signal?.aborted) return Promise.resolve({ ...state.record });\n\t\tstate.waitingConsumers++;\n\t\tlet waiting = true;\n\t\tconst releaseWaiter = (): void => {\n\t\t\tif (!waiting) return;\n\t\t\twaiting = false;\n\t\t\tstate.waitingConsumers--;\n\t\t};\n\t\treturn new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tlet settled = false;\n\t\t\tconst finishWait = (record: BackgroundToolTaskRecord): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(watchdog);\n\t\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\treleaseWaiter();\n\t\t\t\tif (record.status !== \"running\") this.observeState(state);\n\t\t\t\tresolve({ ...state.record });\n\t\t\t};\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tfinishWait(state.record);\n\t\t\t};\n\t\t\tconst watchdog = setTimeout(() => finishWait(state.record), this.waitTimeoutMs);\n\t\t\twatchdog.unref?.();\n\t\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tstate.terminal.then(finishWait);\n\t\t});\n\t}\n\n\tcancel(taskId: string): boolean {\n\t\tconst state = this.tasks.get(taskId);\n\t\tif (!state || state.record.status !== \"running\") return false;\n\t\tstate.cancellationRequested = true;\n\t\tstate.record = { ...state.record, cancellationRequested: true };\n\t\ttry {\n\t\t\tstate.cancel();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${taskId}`, error);\n\t\t}\n\t\treturn true;\n\t}\n\n\tsubscribeHandoffRequest(toolCallId: string, request: () => void): () => void {\n\t\tif (this.disposed) return () => {};\n\t\tconst requests = this.handoffRequests.get(toolCallId) ?? new Set<() => void>();\n\t\trequests.add(request);\n\t\tthis.handoffRequests.set(toolCallId, requests);\n\t\treturn () => {\n\t\t\trequests.delete(request);\n\t\t\tif (requests.size === 0) this.handoffRequests.delete(toolCallId);\n\t\t};\n\t}\n\n\trequestHandoff(toolCallId?: string): number {\n\t\tif (this.disposed) return 0;\n\t\tconst requested = toolCallId\n\t\t\t? [...(this.handoffRequests.get(toolCallId) ?? [])]\n\t\t\t: [...this.handoffRequests.values()].flatMap((requests) => [...requests]);\n\t\tfor (const request of requested) request();\n\t\treturn requested.length;\n\t}\n\n\tasync waitForNotifications(): Promise<void> {\n\t\t// A just-resolved tool completion settles through its promise continuation before it can enqueue\n\t\t// the notification drain. Yield once so this event-driven barrier observes that enqueue.\n\t\tawait Promise.resolve();\n\t\tfor (;;) {\n\t\t\tconst drain = this.notificationDrain;\n\t\t\tif (drain) {\n\t\t\t\tawait drain;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.queuedNotifications.length === 0) return;\n\t\t\tconst retry = this.notificationRetryCompletion;\n\t\t\tif (retry) {\n\t\t\t\tawait retry;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (this.disposed) return;\n\t\t\tthis.scheduleNotificationDrain();\n\t\t}\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\tif (!this.disposed) {\n\t\t\tthis.disposed = true;\n\t\t\tthis.handoffRequests.clear();\n\t\t\tfor (const state of this.tasks.values()) {\n\t\t\t\tif (state.record.status !== \"running\") continue;\n\t\t\t\tstate.cancellationRequested = true;\n\t\t\t\ttry {\n\t\t\t\t\tstate.cancel();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.deps.onError?.(`Failed to cancel background tool task ${state.record.taskId}`, error);\n\t\t\t\t}\n\t\t\t\tthis.finishState(\n\t\t\t\t\tstate,\n\t\t\t\t\t\"canceled\",\n\t\t\t\t\t\"Session ended before the background tool completed.\",\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tawait this.waitForNotifications();\n\t}\n\n\tprivate settle(state: BackgroundToolTaskState, completion: BackgroundToolCallCompletion): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : completion.isError ? \"failed\" : \"completed\";\n\t\tconst output = renderCompletionOutput(completion);\n\t\tthis.finishState(state, status, output, completion.result.usage, true);\n\t}\n\n\tprivate settleRejected(state: BackgroundToolTaskState, error: unknown): void {\n\t\tif (state.record.status !== \"running\") return;\n\t\tconst status = state.cancellationRequested ? \"canceled\" : \"failed\";\n\t\tconst output = error instanceof Error ? error.message : String(error);\n\t\tthis.finishState(state, status, output, undefined, true);\n\t}\n\n\tprivate restorePersistedTasks(): void {\n\t\tconst load = this.deps.loadPersistedRecordsNewestFirst;\n\t\tif (!load) return;\n\t\tlet values: readonly unknown[];\n\t\ttry {\n\t\t\tvalues = load();\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to load persisted background tool tasks\", error);\n\t\t\treturn;\n\t\t}\n\t\tconst sessionId = this.deps.getSessionId();\n\t\tconst sessionIds = new Set(this.deps.getSessionLineageIds?.() ?? [sessionId]);\n\t\tsessionIds.add(sessionId);\n\t\tconst seenTaskIds = new Set<string>();\n\t\tconst latestRecords: BackgroundToolTaskRecord[] = [];\n\t\tlet highestTaskNumber = 0;\n\t\tfor (const value of values) {\n\t\t\tif (\n\t\t\t\t!isPlainRecord(value) ||\n\t\t\t\ttypeof value.sessionId !== \"string\" ||\n\t\t\t\t!sessionIds.has(value.sessionId) ||\n\t\t\t\ttypeof value.taskId !== \"string\"\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst numericTaskId = taskNumber(value.taskId);\n\t\t\tif (numericTaskId === undefined) continue;\n\t\t\thighestTaskNumber = Math.max(highestTaskNumber, numericTaskId);\n\t\t\tif (seenTaskIds.has(value.taskId)) continue;\n\t\t\tseenTaskIds.add(value.taskId);\n\t\t\tconst record = decodeRecord(value, sessionIds);\n\t\t\tif (record) latestRecords.push(record);\n\t\t}\n\t\tthis.nextTaskId = highestTaskNumber + 1;\n\t\tlatestRecords.sort((left, right) => taskNumber(left.taskId)! - taskNumber(right.taskId)!);\n\t\tfor (const record of latestRecords) {\n\t\t\tconst state = this.createState(record, () => {});\n\t\t\tthis.tasks.set(record.taskId, state);\n\t\t\tif (record.status !== \"running\") {\n\t\t\t\tstate.resolveTerminal(record);\n\t\t\t\tif (record.terminalDelivery === \"pending\") this.notify(record, true);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.finishState(\n\t\t\t\tstate,\n\t\t\t\t\"failed\",\n\t\t\t\t\"The session resumed after the owning process ended; the original tool completion is unavailable.\",\n\t\t\t\tundefined,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t}\n\t\tthis.pruneTerminalTasks();\n\t\tthis.emitLiveTasks();\n\t}\n\n\tprivate createState(record: BackgroundToolTaskRecord, cancel: () => void): BackgroundToolTaskState {\n\t\tlet resolveTerminal: ((terminalRecord: BackgroundToolTaskRecord) => void) | undefined;\n\t\tconst terminal = new Promise<BackgroundToolTaskRecord>((resolve) => {\n\t\t\tresolveTerminal = resolve;\n\t\t});\n\t\treturn {\n\t\t\trecord: { ...record },\n\t\t\tcancel,\n\t\t\tcancellationRequested: record.cancellationRequested ?? false,\n\t\t\twaitingConsumers: 0,\n\t\t\tterminal,\n\t\t\tresolveTerminal: resolveTerminal!,\n\t\t\tartifactHolderId: `background-tool-task:${record.sessionId}:${record.taskId}`,\n\t\t};\n\t}\n\n\tprivate finishState(\n\t\tstate: BackgroundToolTaskState,\n\t\tstatus: Exclude<BackgroundToolTaskStatus, \"running\">,\n\t\trawOutput: string,\n\t\tusage: Usage | undefined,\n\t\tnotify: boolean,\n\t): void {\n\t\tconst packed = packToolOutput(\n\t\t\t{\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\trawContent: rawOutput,\n\t\t\t\tsessionEntryId: state.record.taskId,\n\t\t\t\tcreatedAtTurn: 0,\n\t\t\t\treproducible: false,\n\t\t\t\ttruncation: { maxBytes: MAX_INLINE_OUTPUT_BYTES, maxLines: MAX_INLINE_OUTPUT_LINES },\n\t\t\t},\n\t\t\tthis.deps.getArtifactStore(),\n\t\t\tstate.artifactHolderId,\n\t\t);\n\t\tconst output = packed.artifactId\n\t\t\t? `${packed.content}\\n\\n[${formatArtifactNotice(packed.artifactId)}]`\n\t\t\t: packed.content;\n\t\tconst record: BackgroundToolTaskRecord = {\n\t\t\t...state.record,\n\t\t\tstatus,\n\t\t\tcompletedAt: this.now().toISOString(),\n\t\t\tsummary: summaryFor(status, state.record.toolName, output),\n\t\t\toutput,\n\t\t\t...(packed.artifactId ? { artifactId: packed.artifactId } : {}),\n\t\t\t...(usage ? { usage } : {}),\n\t\t\t...(state.cancellationRequested ? { cancellationRequested: true } : {}),\n\t\t\tterminalDelivery: notify ? \"pending\" : \"delivered\",\n\t\t};\n\t\tconst persisted = this.persist(record);\n\t\tconst terminalRecord = persisted\n\t\t\t? record\n\t\t\t: {\n\t\t\t\t\t...record,\n\t\t\t\t\tstatus: \"failed\" as const,\n\t\t\t\t\tsummary: `${record.toolName} failed: terminal result could not be persisted`,\n\t\t\t\t\toutput: \"Background tool result could not be persisted; treat it as unavailable.\",\n\t\t\t\t};\n\t\tstate.record = terminalRecord;\n\t\tif (usage) this.deps.recordUsage?.(record.taskId, usage);\n\t\tstate.resolveTerminal(terminalRecord);\n\t\tthis.emitLiveTasks();\n\t\tthis.pruneTerminalTasks();\n\t\tif (notify) this.notify(terminalRecord, state.waitingConsumers === 0);\n\t}\n\n\tprivate persist(record: BackgroundToolTaskRecord): boolean {\n\t\ttry {\n\t\t\tconst durableRecord = { ...record };\n\t\t\tdelete durableRecord.observedAt;\n\t\t\tthis.deps.persist(durableRecord);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(`Failed to persist background tool task ${record.taskId}`, error);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate notify(record: BackgroundToolTaskRecord, wakeParent: boolean): void {\n\t\tconst notificationRecord = {\n\t\t\t...record,\n\t\t\t...(!wakeParent && !record.observedAt ? { observedAt: this.now().toISOString() } : {}),\n\t\t};\n\t\tthis.activeNotificationRecords.add(notificationRecord);\n\t\tthis.queuedNotifications.push({ record: notificationRecord, wakeParent });\n\t\tthis.scheduleNotificationDrain();\n\t}\n\n\tprivate markNotificationDelivered(record: BackgroundToolTaskRecord): void {\n\t\tif (record.terminalDelivery !== \"pending\") return;\n\t\tconst delivered = { ...record, terminalDelivery: \"delivered\" as const };\n\t\tif (this.persist(delivered)) {\n\t\t\tconst state = this.tasks.get(record.taskId);\n\t\t\tif (state && state.record.completedAt === record.completedAt) state.record = delivered;\n\t\t}\n\t}\n\n\tprivate observeState(state: BackgroundToolTaskState): void {\n\t\tif (state.record.status === \"running\" || state.record.observedAt) return;\n\t\tconst observedAt = this.now().toISOString();\n\t\tstate.record = { ...state.record, observedAt };\n\t\tfor (const record of this.activeNotificationRecords) {\n\t\t\tif (record.taskId === state.record.taskId && record.completedAt === state.record.completedAt) {\n\t\t\t\trecord.observedAt = observedAt;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate scheduleNotificationDrain(): void {\n\t\tif (this.disposed || this.notificationDrain || this.notificationRetryTimer) return;\n\t\tthis.notificationDrain = this.drainNotifications().finally(() => {\n\t\t\tthis.notificationDrain = undefined;\n\t\t\tif (this.queuedNotifications.length > 0 && !this.notificationRetryTimer) this.scheduleNotificationDrain();\n\t\t});\n\t}\n\n\tprivate scheduleNotificationRetry(): void {\n\t\tif (this.disposed || this.notificationRetryTimer) return;\n\t\tconst delayMs = Math.min(100 * 2 ** Math.min(this.notificationRetryCount, 5), 5_000);\n\t\tthis.notificationRetryCount++;\n\t\tthis.notificationRetryCompletion = new Promise<void>((resolve) => {\n\t\t\tthis.resolveNotificationRetry = resolve;\n\t\t});\n\t\tthis.notificationRetryTimer = setTimeout(() => {\n\t\t\tthis.notificationRetryTimer = undefined;\n\t\t\tconst resolve = this.resolveNotificationRetry;\n\t\t\tthis.resolveNotificationRetry = undefined;\n\t\t\tthis.notificationRetryCompletion = undefined;\n\t\t\tresolve?.();\n\t\t\tthis.scheduleNotificationDrain();\n\t\t}, delayMs);\n\t\tthis.notificationRetryTimer.unref?.();\n\t}\n\n\tprivate async drainNotifications(): Promise<void> {\n\t\t// Allow completions released by the same event to reach this queue before forming the batch.\n\t\tawait Promise.resolve();\n\t\twhile (this.queuedNotifications.length > 0) {\n\t\t\tawait Promise.resolve();\n\t\t\tconst batch = this.queuedNotifications.splice(0);\n\t\t\tconst records = batch.map((notification) => notification.record);\n\t\t\ttry {\n\t\t\t\tawait this.deps.notifyTerminal(records, {\n\t\t\t\t\twakeParent: batch.some((notification) => notification.wakeParent),\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\t// A rejected handoff is not a delivery receipt. Put the exact records back ahead of\n\t\t\t\t// newer completions and retry on an event-driven backoff; persistence already contains\n\t\t\t\t// the terminal, so a transient notifier failure must not make it disappear.\n\t\t\t\tthis.queuedNotifications.unshift(...batch);\n\t\t\t\tconst includedIds = records.slice(0, MAX_TERMINAL_HANDOFF_RECORDS).map((record) => record.taskId);\n\t\t\t\tconst omitted = records.length - includedIds.length;\n\t\t\t\tconst suffix = omitted > 0 ? ` (+${omitted} more)` : \"\";\n\t\t\t\ttry {\n\t\t\t\t\tthis.deps.onError?.(\n\t\t\t\t\t\t`Failed to notify terminal background tool task batch ${includedIds.join(\", \")}${suffix}`,\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Diagnostics cannot consume the pending terminal handoff.\n\t\t\t\t}\n\t\t\t\tthis.scheduleNotificationRetry();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.notificationRetryCount = 0;\n\t\t\tfor (const record of records) this.markNotificationDelivered(record);\n\t\t\tfor (const record of records) {\n\t\t\t\tthis.activeNotificationRecords.delete(record);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emitLiveTasks(): void {\n\t\tconst tasks = [...this.tasks.values()]\n\t\t\t.filter((state) => state.record.status === \"running\")\n\t\t\t.map((state) => ({\n\t\t\t\ttaskId: state.record.taskId,\n\t\t\t\ttoolCallId: state.record.toolCallId,\n\t\t\t\ttoolName: state.record.toolName,\n\t\t\t\tdescription: state.record.summary,\n\t\t\t}));\n\t\ttry {\n\t\t\tthis.deps.onLiveTasksChanged?.(tasks);\n\t\t} catch (error) {\n\t\t\tthis.deps.onError?.(\"Failed to emit background tool task level signal\", error);\n\t\t}\n\t}\n\n\tprivate pruneTerminalTasks(): void {\n\t\tconst terminal = [...this.tasks.values()].filter((state) => state.record.status !== \"running\");\n\t\tfor (const state of terminal.slice(0, Math.max(0, terminal.length - MAX_RETAINED_TERMINAL_TASKS))) {\n\t\t\tthis.tasks.delete(state.record.taskId);\n\t\t\tif (!state.record.artifactId) continue;\n\t\t\tconst store = this.deps.getArtifactStore();\n\t\t\tstore?.removeReference(state.record.artifactId, state.artifactHolderId);\n\t\t\tstore?.cleanup();\n\t\t}\n\t}\n\n\tprivate now(): Date {\n\t\treturn this.deps.now?.() ?? new Date();\n\t}\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { type GoalState } from "../goals/goal-state.ts";
2
2
  import type { MemoryPromptBudget } from "./memory-prompt-budget.ts";
3
- export type LongTermMemoryTriggerReason = "explicit_recall" | "goal_continuation_missing_context" | "user_or_project_preference" | "durable_identifier" | "missing_background" | "short_or_grounded_turn" | "budget_disabled" | "secret_like_query";
3
+ export type LongTermMemoryTriggerReason = "explicit_recall" | "goal_continuation_missing_context" | "user_or_project_preference" | "durable_identifier" | "missing_background" | "proactive_local_turn" | "short_or_grounded_turn" | "budget_disabled" | "secret_like_query";
4
4
  export interface LongTermMemoryTriggerInput {
5
5
  latestUserText: string;
6
6
  goalState?: GoalState;
@@ -10,6 +10,8 @@ export interface LongTermMemoryTriggerInput {
10
10
  export interface LongTermMemoryTriggerDecision {
11
11
  shouldQuery: boolean;
12
12
  reason: LongTermMemoryTriggerReason;
13
+ /** External providers remain demand-gated even when local OKF retrieval is proactive. */
14
+ shouldQueryExternal?: boolean;
13
15
  }
14
16
  export declare function shouldQueryLongTermMemory(input: LongTermMemoryTriggerInput): LongTermMemoryTriggerDecision;
15
17
  //# sourceMappingURL=long-term-memory-trigger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"long-term-memory-trigger.d.ts","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,MAAM,2BAA2B,GACpC,iBAAiB,GACjB,mCAAmC,GACnC,4BAA4B,GAC5B,oBAAoB,GACpB,oBAAoB,GACpB,wBAAwB,GACxB,iBAAiB,GACjB,mBAAmB,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,2BAA2B,CAAC;CACpC;AAkBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,0BAA0B,GAAG,6BAA6B,CAyB1G"}
1
+ {"version":3,"file":"long-term-memory-trigger.d.ts","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,MAAM,2BAA2B,GACpC,iBAAiB,GACjB,mCAAmC,GACnC,4BAA4B,GAC5B,oBAAoB,GACpB,oBAAoB,GACpB,sBAAsB,GACtB,wBAAwB,GACxB,iBAAiB,GACjB,mBAAmB,CAAC;AAEvB,MAAM,WAAW,0BAA0B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,2BAA2B,CAAC;IACpC,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAkBD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,0BAA0B,GAAG,6BAA6B,CAyB1G"}
@@ -35,6 +35,6 @@ export function shouldQueryLongTermMemory(input) {
35
35
  if ((input.currentWorkCandidateCount ?? 0) > 0 && input.budget?.compact) {
36
36
  return { shouldQuery: false, reason: "short_or_grounded_turn" };
37
37
  }
38
- return { shouldQuery: false, reason: "short_or_grounded_turn" };
38
+ return { shouldQuery: true, reason: "proactive_local_turn", shouldQueryExternal: false };
39
39
  }
40
40
  //# sourceMappingURL=long-term-memory-trigger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"long-term-memory-trigger.js","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAwBxE,MAAM,kBAAkB,GAAG,6EAA6E,CAAC;AACzG,MAAM,aAAa,GAClB,qHAAqH,CAAC;AACvH,MAAM,aAAa,GAClB,yGAAyG,CAAC;AAC3G,MAAM,qBAAqB,GAAG,iFAAiF,CAAC;AAEhH,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,CACN,IAAI;SACF,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAiC;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClH,IAAI,uBAAuB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAE9F,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC3F,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACjG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACzF,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAEjG,MAAM,UAAU,GACf,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,IACC,UAAU,KAAK,SAAS;QACxB,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,EAC3E,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACxF,IAAI,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACzE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;AACjE,CAAC","sourcesContent":["import { type GoalState, isGoalExecutionActive } from \"../goals/goal-state.ts\";\nimport type { MemoryPromptBudget } from \"./memory-prompt-budget.ts\";\nimport { hasSecretLikeMemoryText } from \"./memory-provider-contract.ts\";\n\nexport type LongTermMemoryTriggerReason =\n\t| \"explicit_recall\"\n\t| \"goal_continuation_missing_context\"\n\t| \"user_or_project_preference\"\n\t| \"durable_identifier\"\n\t| \"missing_background\"\n\t| \"short_or_grounded_turn\"\n\t| \"budget_disabled\"\n\t| \"secret_like_query\";\n\nexport interface LongTermMemoryTriggerInput {\n\tlatestUserText: string;\n\tgoalState?: GoalState;\n\tbudget?: MemoryPromptBudget;\n\tcurrentWorkCandidateCount?: number;\n}\n\nexport interface LongTermMemoryTriggerDecision {\n\tshouldQuery: boolean;\n\treason: LongTermMemoryTriggerReason;\n}\n\nconst EXPLICIT_RECALL_RE = /\\b(recall|remember|memory|memories|resume|previous|prior|before|history)\\b/i;\nconst PREFERENCE_RE =\n\t/\\b(preferences?|prefers?|rules?|instructions?|policy|how should|how do you usually|project context|user context)\\b/i;\nconst DURABLE_ID_RE =\n\t/\\b(?:goal-[a-z0-9-]+|[A-Z]+-\\d+|#[0-9]+|[a-f0-9]{8,40}|build\\s*#?\\d+|artifact|trello|jenkins|branch)\\b/i;\nconst MISSING_BACKGROUND_RE = /\\b(context|background|what did|where were|what was|remind me|familiar|ready)\\b/i;\n\nfunction substantial(text: string): boolean {\n\treturn (\n\t\ttext\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.filter((word) => word.length >= 3).length >= 3\n\t);\n}\n\nexport function shouldQueryLongTermMemory(input: LongTermMemoryTriggerInput): LongTermMemoryTriggerDecision {\n\tconst text = input.latestUserText.trim();\n\tif (input.budget !== undefined && !input.budget.enabled) return { shouldQuery: false, reason: \"budget_disabled\" };\n\tif (hasSecretLikeMemoryText(text)) return { shouldQuery: false, reason: \"secret_like_query\" };\n\n\tif (EXPLICIT_RECALL_RE.test(text)) return { shouldQuery: true, reason: \"explicit_recall\" };\n\tif (PREFERENCE_RE.test(text)) return { shouldQuery: true, reason: \"user_or_project_preference\" };\n\tif (DURABLE_ID_RE.test(text)) return { shouldQuery: true, reason: \"durable_identifier\" };\n\tif (MISSING_BACKGROUND_RE.test(text)) return { shouldQuery: true, reason: \"missing_background\" };\n\n\tconst activeGoal =\n\t\tinput.goalState !== undefined && isGoalExecutionActive(input.goalState.status) ? input.goalState : undefined;\n\tif (\n\t\tactiveGoal !== undefined &&\n\t\ttext.length === 0 &&\n\t\tactiveGoal.requirements.some((requirement) => requirement.status === \"open\")\n\t) {\n\t\treturn { shouldQuery: true, reason: \"goal_continuation_missing_context\" };\n\t}\n\n\tif (!substantial(text)) return { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\tif ((input.currentWorkCandidateCount ?? 0) > 0 && input.budget?.compact) {\n\t\treturn { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\t}\n\treturn { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n}\n"]}
1
+ {"version":3,"file":"long-term-memory-trigger.js","sourceRoot":"","sources":["../../../src/core/context/long-term-memory-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AA2BxE,MAAM,kBAAkB,GAAG,6EAA6E,CAAC;AACzG,MAAM,aAAa,GAClB,qHAAqH,CAAC;AACvH,MAAM,aAAa,GAClB,yGAAyG,CAAC;AAC3G,MAAM,qBAAqB,GAAG,iFAAiF,CAAC;AAEhH,SAAS,WAAW,CAAC,IAAY;IAChC,OAAO,CACN,IAAI;SACF,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAChD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAiC;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAClH,IAAI,uBAAuB,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAE9F,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC3F,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACjG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACzF,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAEjG,MAAM,UAAU,GACf,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,IACC,UAAU,KAAK,SAAS;QACxB,IAAI,CAAC,MAAM,KAAK,CAAC;QACjB,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,EAC3E,CAAC;QACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,mCAAmC,EAAE,CAAC;IAC3E,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACxF,IAAI,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACzE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;AAC1F,CAAC","sourcesContent":["import { type GoalState, isGoalExecutionActive } from \"../goals/goal-state.ts\";\nimport type { MemoryPromptBudget } from \"./memory-prompt-budget.ts\";\nimport { hasSecretLikeMemoryText } from \"./memory-provider-contract.ts\";\n\nexport type LongTermMemoryTriggerReason =\n\t| \"explicit_recall\"\n\t| \"goal_continuation_missing_context\"\n\t| \"user_or_project_preference\"\n\t| \"durable_identifier\"\n\t| \"missing_background\"\n\t| \"proactive_local_turn\"\n\t| \"short_or_grounded_turn\"\n\t| \"budget_disabled\"\n\t| \"secret_like_query\";\n\nexport interface LongTermMemoryTriggerInput {\n\tlatestUserText: string;\n\tgoalState?: GoalState;\n\tbudget?: MemoryPromptBudget;\n\tcurrentWorkCandidateCount?: number;\n}\n\nexport interface LongTermMemoryTriggerDecision {\n\tshouldQuery: boolean;\n\treason: LongTermMemoryTriggerReason;\n\t/** External providers remain demand-gated even when local OKF retrieval is proactive. */\n\tshouldQueryExternal?: boolean;\n}\n\nconst EXPLICIT_RECALL_RE = /\\b(recall|remember|memory|memories|resume|previous|prior|before|history)\\b/i;\nconst PREFERENCE_RE =\n\t/\\b(preferences?|prefers?|rules?|instructions?|policy|how should|how do you usually|project context|user context)\\b/i;\nconst DURABLE_ID_RE =\n\t/\\b(?:goal-[a-z0-9-]+|[A-Z]+-\\d+|#[0-9]+|[a-f0-9]{8,40}|build\\s*#?\\d+|artifact|trello|jenkins|branch)\\b/i;\nconst MISSING_BACKGROUND_RE = /\\b(context|background|what did|where were|what was|remind me|familiar|ready)\\b/i;\n\nfunction substantial(text: string): boolean {\n\treturn (\n\t\ttext\n\t\t\t.trim()\n\t\t\t.split(/\\s+/)\n\t\t\t.filter((word) => word.length >= 3).length >= 3\n\t);\n}\n\nexport function shouldQueryLongTermMemory(input: LongTermMemoryTriggerInput): LongTermMemoryTriggerDecision {\n\tconst text = input.latestUserText.trim();\n\tif (input.budget !== undefined && !input.budget.enabled) return { shouldQuery: false, reason: \"budget_disabled\" };\n\tif (hasSecretLikeMemoryText(text)) return { shouldQuery: false, reason: \"secret_like_query\" };\n\n\tif (EXPLICIT_RECALL_RE.test(text)) return { shouldQuery: true, reason: \"explicit_recall\" };\n\tif (PREFERENCE_RE.test(text)) return { shouldQuery: true, reason: \"user_or_project_preference\" };\n\tif (DURABLE_ID_RE.test(text)) return { shouldQuery: true, reason: \"durable_identifier\" };\n\tif (MISSING_BACKGROUND_RE.test(text)) return { shouldQuery: true, reason: \"missing_background\" };\n\n\tconst activeGoal =\n\t\tinput.goalState !== undefined && isGoalExecutionActive(input.goalState.status) ? input.goalState : undefined;\n\tif (\n\t\tactiveGoal !== undefined &&\n\t\ttext.length === 0 &&\n\t\tactiveGoal.requirements.some((requirement) => requirement.status === \"open\")\n\t) {\n\t\treturn { shouldQuery: true, reason: \"goal_continuation_missing_context\" };\n\t}\n\n\tif (!substantial(text)) return { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\tif ((input.currentWorkCandidateCount ?? 0) > 0 && input.budget?.compact) {\n\t\treturn { shouldQuery: false, reason: \"short_or_grounded_turn\" };\n\t}\n\treturn { shouldQuery: true, reason: \"proactive_local_turn\", shouldQueryExternal: false };\n}\n"]}
@@ -6,6 +6,9 @@ export interface OkfMemoryProviderOptions {
6
6
  providerId?: string;
7
7
  maxFileBytes?: number;
8
8
  maxDocuments?: number;
9
+ /** Current workspace identity. When set, foreign project-scoped records are excluded. */
10
+ projectId?: string;
11
+ projectRoot?: string;
9
12
  }
10
13
  export interface OkfMemoryLoadEntry {
11
14
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"okf-memory-provider.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAEX,cAAc,EACd,cAAc,EAKd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE;AA8DD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,mBAAmB,CAkC1F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,cAAc,CA0BzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW,EAAE,CAI9E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAIhF"}
1
+ {"version":3,"file":"okf-memory-provider.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAEX,cAAc,EACd,cAAc,EAKd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAG5B,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,wBAAwB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,uBAAuB,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,mBAAmB,EAAE,CAAA;KAAE,CAAC,CAAC;CACzE;AAmGD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,GAAG,mBAAmB,CA2B1F;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,cAAc,CA0BzF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW,EAAE,CAI9E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,EAAE,CAIhF"}
@@ -1,9 +1,13 @@
1
- import { readdirSync, readFileSync, statSync } from "node:fs";
1
+ import { lstatSync, opendirSync } from "node:fs";
2
2
  import { join, relative } from "node:path";
3
+ import { isPathWithinScope } from "../autonomy/path-scope.js";
4
+ import { readBoundedTextFileSync } from "../util/bounded-file.js";
3
5
  import { fetchLocalMemoryItem, searchLocalMemoryItems, tokenOverlapScore } from "./local-memory-search.js";
4
6
  import { PI_OKF_PROVIDER_ID, parseOkfMemoryDocument, } from "./okf-memory.js";
5
7
  const DEFAULT_MAX_FILE_BYTES = 512_000;
6
8
  const DEFAULT_MAX_DOCUMENTS = 1_000;
9
+ const MAX_DIRECTORY_ENTRIES = 4_096;
10
+ const MAX_DIRECTORIES = 256;
7
11
  const OKF_EXTENSIONS = [".okf.md", ".okf", ".md"];
8
12
  const OKF_PROVIDER_CAPABILITIES = {
9
13
  search: true,
@@ -23,38 +27,77 @@ function isOkfPath(path) {
23
27
  function walkFiles(rootDir, maxDocuments) {
24
28
  const files = [];
25
29
  const pending = [rootDir];
26
- while (pending.length > 0 && files.length < maxDocuments) {
30
+ let visitedDirectories = 0;
31
+ try {
32
+ const root = lstatSync(rootDir);
33
+ if (!root.isDirectory() || root.isSymbolicLink())
34
+ return files;
35
+ }
36
+ catch {
37
+ return files;
38
+ }
39
+ while (pending.length > 0 && files.length < maxDocuments && visitedDirectories < MAX_DIRECTORIES) {
27
40
  const dir = pending.pop();
28
41
  if (dir === undefined)
29
42
  continue;
30
- let entries;
43
+ visitedDirectories += 1;
44
+ let directory;
31
45
  try {
32
- entries = readdirSync(dir).sort();
46
+ directory = opendirSync(dir);
33
47
  }
34
48
  catch {
35
49
  continue;
36
50
  }
37
- for (const entry of entries) {
38
- const path = join(dir, entry);
39
- let stat;
40
- try {
41
- stat = statSync(path);
42
- }
43
- catch {
44
- continue;
45
- }
46
- if (stat.isDirectory()) {
47
- pending.push(path);
48
- }
49
- else if (stat.isFile() && isOkfPath(path)) {
50
- files.push(path);
51
- if (files.length >= maxDocuments)
51
+ try {
52
+ const entries = [];
53
+ for (let entry = directory.readSync(); entry; entry = directory.readSync()) {
54
+ if (entries.length >= MAX_DIRECTORY_ENTRIES)
52
55
  break;
56
+ if (entry.isSymbolicLink())
57
+ continue;
58
+ entries.push({ name: entry.name, directory: entry.isDirectory(), file: entry.isFile() });
53
59
  }
60
+ entries.sort((left, right) => left.name.localeCompare(right.name));
61
+ for (const entry of entries) {
62
+ const path = join(dir, entry.name);
63
+ if (entry.directory)
64
+ pending.push(path);
65
+ else if (entry.file && isOkfPath(path)) {
66
+ files.push(path);
67
+ if (files.length >= maxDocuments)
68
+ break;
69
+ }
70
+ }
71
+ }
72
+ finally {
73
+ directory.closeSync();
54
74
  }
55
75
  }
56
76
  return files;
57
77
  }
78
+ function isPortableAbsolutePath(value) {
79
+ return value.startsWith("/") || /^[a-zA-Z]:[\\/]/.test(value) || value.startsWith("\\\\");
80
+ }
81
+ function belongsToSelectedProject(entry, options) {
82
+ const item = entry.parsed.item;
83
+ if (item === undefined)
84
+ return false;
85
+ if (options.projectId === undefined)
86
+ return true;
87
+ if (item.scope === "user" || item.scope === "global")
88
+ return true;
89
+ if (item.scope !== "project")
90
+ return false;
91
+ if (entry.parsed.projectId !== undefined)
92
+ return entry.parsed.projectId === options.projectId.toLowerCase();
93
+ const normalizedRelativePath = entry.relativePath.replaceAll("\\", "/");
94
+ if (normalizedRelativePath.startsWith(`projects/${options.projectId.toLowerCase()}/`))
95
+ return true;
96
+ const projectRoot = options.projectRoot;
97
+ if (projectRoot === undefined)
98
+ return false;
99
+ return item.evidenceRefs.some((ref) => ref.type === "external" && isPortableAbsolutePath(ref.id) && isPathWithinScope(ref.id, projectRoot));
100
+ }
58
101
  function scoreItem(queryTokens, item) {
59
102
  return tokenOverlapScore(queryTokens, [item.title, item.summary, item.content]);
60
103
  }
@@ -68,18 +111,9 @@ export function loadOkfMemoryBundle(options) {
68
111
  const entries = [];
69
112
  const diagnostics = [];
70
113
  for (const path of walkFiles(options.rootDir, maxDocuments)) {
71
- let stat;
72
- try {
73
- stat = statSync(path);
74
- }
75
- catch {
76
- continue;
77
- }
78
- if (stat.size > maxFileBytes)
79
- continue;
80
114
  let content;
81
115
  try {
82
- content = readFileSync(path, "utf8");
116
+ content = readBoundedTextFileSync(path, maxFileBytes, "OKF memory document");
83
117
  }
84
118
  catch {
85
119
  continue;
@@ -92,8 +126,9 @@ export function loadOkfMemoryBundle(options) {
92
126
  });
93
127
  if (parsed.diagnostics.length > 0)
94
128
  diagnostics.push({ path, diagnostics: parsed.diagnostics });
95
- if (parsed.item !== undefined)
96
- entries.push({ path, relativePath, parsed });
129
+ const entry = { path, relativePath, parsed };
130
+ if (parsed.item !== undefined && belongsToSelectedProject(entry, options))
131
+ entries.push(entry);
97
132
  }
98
133
  return { entries, diagnostics };
99
134
  }
@@ -1 +1 @@
1
- {"version":3,"file":"okf-memory-provider.js","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, readFileSync, type Stats, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport type { MemoryScope } from \"./context-item.ts\";\nimport { fetchLocalMemoryItem, searchLocalMemoryItems, tokenOverlapScore } from \"./local-memory-search.ts\";\nimport type {\n\tMemoryItem,\n\tMemoryItemKind,\n\tMemoryProvider,\n\tMemoryProviderCapabilities,\n\tMemoryRef,\n\tMemorySearchRequest,\n\tMemorySearchResult,\n} from \"./memory-provider-contract.ts\";\nimport {\n\ttype OkfMemoryDiagnostic,\n\ttype ParsedOkfMemoryDocument,\n\tPI_OKF_PROVIDER_ID,\n\tparseOkfMemoryDocument,\n} from \"./okf-memory.ts\";\n\nexport interface OkfMemoryProviderOptions {\n\trootDir: string;\n\tproviderId?: string;\n\tmaxFileBytes?: number;\n\tmaxDocuments?: number;\n}\n\nexport interface OkfMemoryLoadEntry {\n\tpath: string;\n\trelativePath: string;\n\tparsed: ParsedOkfMemoryDocument;\n}\n\nexport interface OkfMemoryLoadReport {\n\tentries: OkfMemoryLoadEntry[];\n\tdiagnostics: Array<{ path: string; diagnostics: OkfMemoryDiagnostic[] }>;\n}\n\nconst DEFAULT_MAX_FILE_BYTES = 512_000;\nconst DEFAULT_MAX_DOCUMENTS = 1_000;\nconst OKF_EXTENSIONS = [\".okf.md\", \".okf\", \".md\"];\n\nconst OKF_PROVIDER_CAPABILITIES: MemoryProviderCapabilities = {\n\tsearch: true,\n\tfetch: true,\n\twrite: false,\n\tdelete: false,\n\tshortTerm: false,\n\tlongTerm: true,\n\tgraph: false,\n\tcitations: true,\n\tscopes: [\"session\", \"project\", \"user\", \"global\"],\n\tlocalOnly: true,\n};\n\nfunction isOkfPath(path: string): boolean {\n\treturn OKF_EXTENSIONS.some((extension) => path.endsWith(extension));\n}\n\nfunction walkFiles(rootDir: string, maxDocuments: number): string[] {\n\tconst files: string[] = [];\n\tconst pending = [rootDir];\n\twhile (pending.length > 0 && files.length < maxDocuments) {\n\t\tconst dir = pending.pop();\n\t\tif (dir === undefined) continue;\n\t\tlet entries: string[];\n\t\ttry {\n\t\t\tentries = readdirSync(dir).sort();\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const entry of entries) {\n\t\t\tconst path = join(dir, entry);\n\t\t\tlet stat: Stats;\n\t\t\ttry {\n\t\t\t\tstat = statSync(path);\n\t\t\t} catch {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (stat.isDirectory()) {\n\t\t\t\tpending.push(path);\n\t\t\t} else if (stat.isFile() && isOkfPath(path)) {\n\t\t\t\tfiles.push(path);\n\t\t\t\tif (files.length >= maxDocuments) break;\n\t\t\t}\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction scoreItem(queryTokens: ReadonlySet<string>, item: MemoryItem): number {\n\treturn tokenOverlapScore(queryTokens, [item.title, item.summary, item.content]);\n}\n\nfunction reasonForMatch(score: number, item: MemoryItem): string {\n\treturn `local OKF match score ${score.toFixed(3)} for ${item.providerId}/${item.scope}/${item.kind}`;\n}\n\nexport function loadOkfMemoryBundle(options: OkfMemoryProviderOptions): OkfMemoryLoadReport {\n\tconst providerId = options.providerId ?? PI_OKF_PROVIDER_ID;\n\tconst maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;\n\tconst maxDocuments = options.maxDocuments ?? DEFAULT_MAX_DOCUMENTS;\n\tconst entries: OkfMemoryLoadEntry[] = [];\n\tconst diagnostics: Array<{ path: string; diagnostics: OkfMemoryDiagnostic[] }> = [];\n\n\tfor (const path of walkFiles(options.rootDir, maxDocuments)) {\n\t\tlet stat: Stats;\n\t\ttry {\n\t\t\tstat = statSync(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.size > maxFileBytes) continue;\n\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = readFileSync(path, \"utf8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst relativePath = relative(options.rootDir, path);\n\t\tconst parsed = parseOkfMemoryDocument(content, {\n\t\t\tproviderId,\n\t\t\turi: `okf:${relativePath}`,\n\t\t\tfallbackId: relativePath,\n\t\t});\n\t\tif (parsed.diagnostics.length > 0) diagnostics.push({ path, diagnostics: parsed.diagnostics });\n\t\tif (parsed.item !== undefined) entries.push({ path, relativePath, parsed });\n\t}\n\n\treturn { entries, diagnostics };\n}\n\nexport function createOkfMemoryProvider(options: OkfMemoryProviderOptions): MemoryProvider {\n\tlet cachedReport: OkfMemoryLoadReport | undefined;\n\n\tfunction report(): OkfMemoryLoadReport {\n\t\tcachedReport ??= loadOkfMemoryBundle(options);\n\t\treturn cachedReport;\n\t}\n\n\tfunction items(): MemoryItem[] {\n\t\treturn report().entries.flatMap((entry) => (entry.parsed.item === undefined ? [] : [entry.parsed.item]));\n\t}\n\n\treturn {\n\t\tid: options.providerId ?? PI_OKF_PROVIDER_ID,\n\t\tlabel: \"Pi OKF Memory\",\n\t\tsource: \"pi_native\",\n\t\tcapabilities: OKF_PROVIDER_CAPABILITIES,\n\n\t\tasync search(request: MemorySearchRequest): Promise<MemorySearchResult[]> {\n\t\t\treturn searchLocalMemoryItems(items(), request, { score: scoreItem, reason: reasonForMatch });\n\t\t},\n\n\t\tasync fetch(ref: MemoryRef): Promise<MemoryItem | undefined> {\n\t\t\treturn fetchLocalMemoryItem(items(), options.providerId ?? PI_OKF_PROVIDER_ID, ref);\n\t\t},\n\t};\n}\n\nexport function listOkfMemoryScopes(report: OkfMemoryLoadReport): MemoryScope[] {\n\treturn Array.from(\n\t\tnew Set(report.entries.flatMap((entry) => (entry.parsed.item ? [entry.parsed.item.scope] : []))),\n\t).sort();\n}\n\nexport function listOkfMemoryKinds(report: OkfMemoryLoadReport): MemoryItemKind[] {\n\treturn Array.from(\n\t\tnew Set(report.entries.flatMap((entry) => (entry.parsed.item ? [entry.parsed.item.kind] : []))),\n\t).sort();\n}\n"]}
1
+ {"version":3,"file":"okf-memory-provider.js","sourceRoot":"","sources":["../../../src/core/context/okf-memory-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstatSync, opendirSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport { isPathWithinScope } from \"../autonomy/path-scope.ts\";\nimport { readBoundedTextFileSync } from \"../util/bounded-file.ts\";\nimport type { MemoryScope } from \"./context-item.ts\";\nimport { fetchLocalMemoryItem, searchLocalMemoryItems, tokenOverlapScore } from \"./local-memory-search.ts\";\nimport type {\n\tMemoryItem,\n\tMemoryItemKind,\n\tMemoryProvider,\n\tMemoryProviderCapabilities,\n\tMemoryRef,\n\tMemorySearchRequest,\n\tMemorySearchResult,\n} from \"./memory-provider-contract.ts\";\nimport {\n\ttype OkfMemoryDiagnostic,\n\ttype ParsedOkfMemoryDocument,\n\tPI_OKF_PROVIDER_ID,\n\tparseOkfMemoryDocument,\n} from \"./okf-memory.ts\";\n\nexport interface OkfMemoryProviderOptions {\n\trootDir: string;\n\tproviderId?: string;\n\tmaxFileBytes?: number;\n\tmaxDocuments?: number;\n\t/** Current workspace identity. When set, foreign project-scoped records are excluded. */\n\tprojectId?: string;\n\tprojectRoot?: string;\n}\n\nexport interface OkfMemoryLoadEntry {\n\tpath: string;\n\trelativePath: string;\n\tparsed: ParsedOkfMemoryDocument;\n}\n\nexport interface OkfMemoryLoadReport {\n\tentries: OkfMemoryLoadEntry[];\n\tdiagnostics: Array<{ path: string; diagnostics: OkfMemoryDiagnostic[] }>;\n}\n\nconst DEFAULT_MAX_FILE_BYTES = 512_000;\nconst DEFAULT_MAX_DOCUMENTS = 1_000;\nconst MAX_DIRECTORY_ENTRIES = 4_096;\nconst MAX_DIRECTORIES = 256;\nconst OKF_EXTENSIONS = [\".okf.md\", \".okf\", \".md\"];\n\nconst OKF_PROVIDER_CAPABILITIES: MemoryProviderCapabilities = {\n\tsearch: true,\n\tfetch: true,\n\twrite: false,\n\tdelete: false,\n\tshortTerm: false,\n\tlongTerm: true,\n\tgraph: false,\n\tcitations: true,\n\tscopes: [\"session\", \"project\", \"user\", \"global\"],\n\tlocalOnly: true,\n};\n\nfunction isOkfPath(path: string): boolean {\n\treturn OKF_EXTENSIONS.some((extension) => path.endsWith(extension));\n}\n\nfunction walkFiles(rootDir: string, maxDocuments: number): string[] {\n\tconst files: string[] = [];\n\tconst pending = [rootDir];\n\tlet visitedDirectories = 0;\n\ttry {\n\t\tconst root = lstatSync(rootDir);\n\t\tif (!root.isDirectory() || root.isSymbolicLink()) return files;\n\t} catch {\n\t\treturn files;\n\t}\n\twhile (pending.length > 0 && files.length < maxDocuments && visitedDirectories < MAX_DIRECTORIES) {\n\t\tconst dir = pending.pop();\n\t\tif (dir === undefined) continue;\n\t\tvisitedDirectories += 1;\n\t\tlet directory: ReturnType<typeof opendirSync>;\n\t\ttry {\n\t\t\tdirectory = opendirSync(dir);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst entries: Array<{ name: string; directory: boolean; file: boolean }> = [];\n\t\t\tfor (let entry = directory.readSync(); entry; entry = directory.readSync()) {\n\t\t\t\tif (entries.length >= MAX_DIRECTORY_ENTRIES) break;\n\t\t\t\tif (entry.isSymbolicLink()) continue;\n\t\t\t\tentries.push({ name: entry.name, directory: entry.isDirectory(), file: entry.isFile() });\n\t\t\t}\n\t\t\tentries.sort((left, right) => left.name.localeCompare(right.name));\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst path = join(dir, entry.name);\n\t\t\t\tif (entry.directory) pending.push(path);\n\t\t\t\telse if (entry.file && isOkfPath(path)) {\n\t\t\t\t\tfiles.push(path);\n\t\t\t\t\tif (files.length >= maxDocuments) break;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tdirectory.closeSync();\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction isPortableAbsolutePath(value: string): boolean {\n\treturn value.startsWith(\"/\") || /^[a-zA-Z]:[\\\\/]/.test(value) || value.startsWith(\"\\\\\\\\\");\n}\n\nfunction belongsToSelectedProject(\n\tentry: OkfMemoryLoadEntry,\n\toptions: Pick<OkfMemoryProviderOptions, \"projectId\" | \"projectRoot\">,\n): boolean {\n\tconst item = entry.parsed.item;\n\tif (item === undefined) return false;\n\tif (options.projectId === undefined) return true;\n\tif (item.scope === \"user\" || item.scope === \"global\") return true;\n\tif (item.scope !== \"project\") return false;\n\tif (entry.parsed.projectId !== undefined) return entry.parsed.projectId === options.projectId.toLowerCase();\n\tconst normalizedRelativePath = entry.relativePath.replaceAll(\"\\\\\", \"/\");\n\tif (normalizedRelativePath.startsWith(`projects/${options.projectId.toLowerCase()}/`)) return true;\n\tconst projectRoot = options.projectRoot;\n\tif (projectRoot === undefined) return false;\n\treturn item.evidenceRefs.some(\n\t\t(ref) => ref.type === \"external\" && isPortableAbsolutePath(ref.id) && isPathWithinScope(ref.id, projectRoot),\n\t);\n}\n\nfunction scoreItem(queryTokens: ReadonlySet<string>, item: MemoryItem): number {\n\treturn tokenOverlapScore(queryTokens, [item.title, item.summary, item.content]);\n}\n\nfunction reasonForMatch(score: number, item: MemoryItem): string {\n\treturn `local OKF match score ${score.toFixed(3)} for ${item.providerId}/${item.scope}/${item.kind}`;\n}\n\nexport function loadOkfMemoryBundle(options: OkfMemoryProviderOptions): OkfMemoryLoadReport {\n\tconst providerId = options.providerId ?? PI_OKF_PROVIDER_ID;\n\tconst maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;\n\tconst maxDocuments = options.maxDocuments ?? DEFAULT_MAX_DOCUMENTS;\n\tconst entries: OkfMemoryLoadEntry[] = [];\n\tconst diagnostics: Array<{ path: string; diagnostics: OkfMemoryDiagnostic[] }> = [];\n\n\tfor (const path of walkFiles(options.rootDir, maxDocuments)) {\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = readBoundedTextFileSync(path, maxFileBytes, \"OKF memory document\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst relativePath = relative(options.rootDir, path);\n\t\tconst parsed = parseOkfMemoryDocument(content, {\n\t\t\tproviderId,\n\t\t\turi: `okf:${relativePath}`,\n\t\t\tfallbackId: relativePath,\n\t\t});\n\t\tif (parsed.diagnostics.length > 0) diagnostics.push({ path, diagnostics: parsed.diagnostics });\n\t\tconst entry = { path, relativePath, parsed };\n\t\tif (parsed.item !== undefined && belongsToSelectedProject(entry, options)) entries.push(entry);\n\t}\n\n\treturn { entries, diagnostics };\n}\n\nexport function createOkfMemoryProvider(options: OkfMemoryProviderOptions): MemoryProvider {\n\tlet cachedReport: OkfMemoryLoadReport | undefined;\n\n\tfunction report(): OkfMemoryLoadReport {\n\t\tcachedReport ??= loadOkfMemoryBundle(options);\n\t\treturn cachedReport;\n\t}\n\n\tfunction items(): MemoryItem[] {\n\t\treturn report().entries.flatMap((entry) => (entry.parsed.item === undefined ? [] : [entry.parsed.item]));\n\t}\n\n\treturn {\n\t\tid: options.providerId ?? PI_OKF_PROVIDER_ID,\n\t\tlabel: \"Pi OKF Memory\",\n\t\tsource: \"pi_native\",\n\t\tcapabilities: OKF_PROVIDER_CAPABILITIES,\n\n\t\tasync search(request: MemorySearchRequest): Promise<MemorySearchResult[]> {\n\t\t\treturn searchLocalMemoryItems(items(), request, { score: scoreItem, reason: reasonForMatch });\n\t\t},\n\n\t\tasync fetch(ref: MemoryRef): Promise<MemoryItem | undefined> {\n\t\t\treturn fetchLocalMemoryItem(items(), options.providerId ?? PI_OKF_PROVIDER_ID, ref);\n\t\t},\n\t};\n}\n\nexport function listOkfMemoryScopes(report: OkfMemoryLoadReport): MemoryScope[] {\n\treturn Array.from(\n\t\tnew Set(report.entries.flatMap((entry) => (entry.parsed.item ? [entry.parsed.item.scope] : []))),\n\t).sort();\n}\n\nexport function listOkfMemoryKinds(report: OkfMemoryLoadReport): MemoryItemKind[] {\n\treturn Array.from(\n\t\tnew Set(report.entries.flatMap((entry) => (entry.parsed.item ? [entry.parsed.item.kind] : []))),\n\t).sort();\n}\n"]}
@@ -4,7 +4,16 @@ export declare const PI_OKF_PROVIDER_ID = "pi-okf";
4
4
  export declare const PI_OKF_AUTHORITY = "durable_memory";
5
5
  export declare const PI_OKF_TYPES: readonly ["Design Decision", "Architecture Concept", "Project Rule Candidate", "Implementation Note", "Debugging Finding", "Invalidated Assumption", "Tooling Playbook", "External Reference", "User Preference", "Capability Doc"];
6
6
  export type PiOkfType = (typeof PI_OKF_TYPES)[number];
7
- export type OkfMemoryDiagnosticCode = "missing_frontmatter" | "invalid_frontmatter" | "invalid_yaml" | "missing_type" | "unknown_type" | "missing_title" | "missing_description" | "missing_pi" | "invalid_scope" | "invalid_authority" | "invalid_evidence_refs";
7
+ export declare const OKF_MEMORY_LIMITS: Readonly<{
8
+ titleChars: 160;
9
+ descriptionChars: 600;
10
+ bodyChars: 8000;
11
+ tagCount: 16;
12
+ tagChars: 80;
13
+ evidenceRefCount: 24;
14
+ evidenceRefChars: 600;
15
+ }>;
16
+ export type OkfMemoryDiagnosticCode = "missing_frontmatter" | "invalid_frontmatter" | "invalid_yaml" | "missing_type" | "unknown_type" | "missing_title" | "missing_description" | "missing_pi" | "invalid_scope" | "invalid_authority" | "invalid_project_id" | "invalid_evidence_refs";
8
17
  export interface OkfMemoryDiagnostic {
9
18
  code: OkfMemoryDiagnosticCode;
10
19
  message: string;
@@ -18,6 +27,7 @@ export interface ParsedOkfMemoryDocument {
18
27
  item?: MemoryItem;
19
28
  body: string;
20
29
  diagnostics: OkfMemoryDiagnostic[];
30
+ projectId?: string;
21
31
  }
22
32
  export interface OkfMemoryDocumentInput {
23
33
  type: PiOkfType;
@@ -28,7 +38,14 @@ export interface OkfMemoryDocumentInput {
28
38
  tags?: string[];
29
39
  timestamp?: string;
30
40
  evidenceRefs?: string[];
41
+ /** Stable project identity for project-scoped managed records. */
42
+ projectId?: string;
31
43
  }
44
+ /** One bounded validation path shared by reflection parsing and the durable OKF writer. */
45
+ export declare function validateOkfMemoryDocumentInput(input: OkfMemoryDocumentInput, options?: {
46
+ projectOnly?: boolean;
47
+ requireEvidence?: boolean;
48
+ }): string[];
32
49
  export interface OkfProjectRulePromotionRequest {
33
50
  item: MemoryItem;
34
51
  approvalId?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"okf-memory.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAEX,UAAU,EAGV,kBAAkB,EAClB,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,eAAO,MAAM,YAAY,YACxB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,CACP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAChC,qBAAqB,GACrB,qBAAqB,GACrB,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,uBAAuB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,gCAAgC,GACzC,4BAA4B,GAC5B,sCAAsC,GACtC,6BAA6B,CAAC;AA8DjC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,uBAAuB,CA6EpH;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAc7E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAYhG;AAED,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,8BAA8B,GACrC,gCAAgC,EAAE,CAQpC"}
1
+ {"version":3,"file":"okf-memory.d.ts","sourceRoot":"","sources":["../../../src/core/context/okf-memory.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAEX,UAAU,EAGV,kBAAkB,EAClB,MAAM,+BAA+B,CAAC;AAEvC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,eAAO,MAAM,YAAY,YACxB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,CACP,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,eAAO,MAAM,iBAAiB;;;;;;;;EAQ5B,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAChC,qBAAqB,GACrB,qBAAqB,GACrB,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,qBAAqB,GACrB,YAAY,GACZ,eAAe,GACf,mBAAmB,GACnB,oBAAoB,GACpB,uBAAuB,CAAC;AAE3B,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2FAA2F;AAC3F,wBAAgB,8BAA8B,CAC7C,KAAK,EAAE,sBAAsB,EAC7B,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAChE,MAAM,EAAE,CAuBV;AAED,MAAM,WAAW,8BAA8B;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,MAAM,gCAAgC,GACzC,4BAA4B,GAC5B,sCAAsC,GACtC,6BAA6B,CAAC;AA8DjC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,uBAAuB,CAkFpH;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAe7E;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAYhG;AAED,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,8BAA8B,GACrC,gCAAgC,EAAE,CAQpC"}