@phuetz/code-buddy 1.6.0 → 2.0.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 (2247) hide show
  1. package/LICENSE +90 -21
  2. package/README.md +145 -349
  3. package/codebuddy-runtime.json +24 -0
  4. package/dist/advanced/session-replay.js +3 -2
  5. package/dist/agent/agent-state.d.ts +4 -1
  6. package/dist/agent/agent-state.js +9 -3
  7. package/dist/agent/architect-mode.js +1 -1
  8. package/dist/agent/autonomous/agentic-coding-contract.d.ts +28 -28
  9. package/dist/agent/autonomous/agentic-coding-runner.d.ts +14 -4
  10. package/dist/agent/autonomous/agentic-coding-runner.js +176 -27
  11. package/dist/agent/autonomous/checkpoint-manager.js +3 -12
  12. package/dist/agent/autonomous/codex-autonomy-directive.d.ts +10 -0
  13. package/dist/agent/autonomous/codex-autonomy-directive.js +25 -0
  14. package/dist/agent/autonomous/edit-proposal-producer.js +2 -2
  15. package/dist/agent/autonomous/fleet-task-types.d.ts +2 -2
  16. package/dist/agent/autonomous/fleet-task-types.js +2 -2
  17. package/dist/agent/autonomous/fleet-tick-handler.d.ts +3 -3
  18. package/dist/agent/autonomous/fleet-tick-handler.js +14 -8
  19. package/dist/agent/autonomous/recursive-improvement.d.ts +23 -0
  20. package/dist/agent/autonomous/recursive-improvement.js +114 -0
  21. package/dist/agent/autonomous/verification-loop.js +4 -2
  22. package/dist/agent/codebuddy-agent.d.ts +93 -6
  23. package/dist/agent/codebuddy-agent.js +452 -58
  24. package/dist/agent/council-lesson-proposer.d.ts +80 -13
  25. package/dist/agent/council-lesson-proposer.js +201 -43
  26. package/dist/agent/deep-research-ckg.d.ts +176 -0
  27. package/dist/agent/deep-research-ckg.js +250 -0
  28. package/dist/agent/deep-research-storm.d.ts +222 -0
  29. package/dist/agent/deep-research-storm.js +689 -0
  30. package/dist/agent/deep-research.d.ts +329 -0
  31. package/dist/agent/deep-research.js +994 -0
  32. package/dist/agent/delegation/thread-delegation.d.ts +80 -0
  33. package/dist/agent/delegation/thread-delegation.js +472 -0
  34. package/dist/agent/delegation/thread-task-runner.d.ts +37 -0
  35. package/dist/agent/delegation/thread-task-runner.js +89 -0
  36. package/dist/agent/dev-loop/dev-loop.d.ts +120 -0
  37. package/dist/agent/dev-loop/dev-loop.js +404 -0
  38. package/dist/agent/dev-loop/structural-gate.d.ts +32 -0
  39. package/dist/agent/dev-loop/structural-gate.js +120 -0
  40. package/dist/agent/execution/agent-executor.d.ts +52 -31
  41. package/dist/agent/execution/agent-executor.js +1520 -547
  42. package/dist/agent/execution/context-pipeline.d.ts +54 -6
  43. package/dist/agent/execution/context-pipeline.js +285 -88
  44. package/dist/agent/execution/incremental-token-counter.d.ts +15 -0
  45. package/dist/agent/execution/incremental-token-counter.js +36 -0
  46. package/dist/agent/execution/ordered-tool-executor.d.ts +14 -0
  47. package/dist/agent/execution/ordered-tool-executor.js +54 -0
  48. package/dist/agent/execution/post-tool-handlers.d.ts +1 -1
  49. package/dist/agent/execution/post-tool-handlers.js +2 -2
  50. package/dist/agent/execution/query-classifier.d.ts +2 -0
  51. package/dist/agent/execution/query-classifier.js +2 -0
  52. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  53. package/dist/agent/execution/tool-selection-strategy.d.ts +20 -0
  54. package/dist/agent/execution/tool-selection-strategy.js +145 -23
  55. package/dist/agent/facades/message-history-manager.d.ts +1 -1
  56. package/dist/agent/facades/message-history-manager.js +1 -1
  57. package/dist/agent/facades/model-routing-facade.d.ts +31 -1
  58. package/dist/agent/facades/model-routing-facade.js +86 -2
  59. package/dist/agent/facades/session-facade.d.ts +10 -2
  60. package/dist/agent/facades/session-facade.js +59 -1
  61. package/dist/agent/film/film-producer.d.ts +98 -0
  62. package/dist/agent/film/film-producer.js +289 -0
  63. package/dist/agent/film/scene-planner.d.ts +38 -0
  64. package/dist/agent/film/scene-planner.js +93 -0
  65. package/dist/agent/film/trailer-planner.d.ts +23 -0
  66. package/dist/agent/film/trailer-planner.js +242 -0
  67. package/dist/agent/film/video-studio.d.ts +72 -0
  68. package/dist/agent/film/video-studio.js +249 -0
  69. package/dist/agent/flow/planning-flow.d.ts +3 -0
  70. package/dist/agent/flow/planning-flow.js +70 -8
  71. package/dist/agent/hermes-claw-migrate.d.ts +62 -0
  72. package/dist/agent/hermes-claw-migrate.js +189 -15
  73. package/dist/agent/hermes-memory-providers.js +3 -3
  74. package/dist/agent/hermes-parity-manifest.js +69 -15
  75. package/dist/agent/infrastructure/agent-infrastructure.d.ts +1 -0
  76. package/dist/agent/infrastructure/agent-infrastructure.js +1 -1
  77. package/dist/agent/isolation/agent-workspace.js +5 -2
  78. package/dist/agent/learning/skill-background-writes.js +9 -4
  79. package/dist/agent/learning-agent.js +4 -4
  80. package/dist/agent/learning-background-writes.js +9 -5
  81. package/dist/agent/lesson-candidate-queue.d.ts +4 -0
  82. package/dist/agent/lesson-candidate-queue.js +9 -3
  83. package/dist/agent/lesson-provenance.js +9 -3
  84. package/dist/agent/lessons-tracker.d.ts +68 -1
  85. package/dist/agent/lessons-tracker.js +218 -36
  86. package/dist/agent/loop-detection-service.d.ts +56 -0
  87. package/dist/agent/loop-detection-service.js +207 -0
  88. package/dist/agent/middleware/auto-observation.d.ts +2 -0
  89. package/dist/agent/middleware/auto-observation.js +4 -2
  90. package/dist/agent/middleware/auto-repair-middleware.d.ts +2 -0
  91. package/dist/agent/middleware/auto-repair-middleware.js +27 -4
  92. package/dist/agent/middleware/changed-files.d.ts +19 -0
  93. package/dist/agent/middleware/changed-files.js +113 -0
  94. package/dist/agent/middleware/cost-limit.d.ts +0 -2
  95. package/dist/agent/middleware/cost-limit.js +0 -3
  96. package/dist/agent/middleware/index.d.ts +2 -0
  97. package/dist/agent/middleware/index.js +1 -0
  98. package/dist/agent/middleware/pipeline.d.ts +9 -0
  99. package/dist/agent/middleware/pipeline.js +18 -0
  100. package/dist/agent/middleware/plan-completion-audit.d.ts +76 -0
  101. package/dist/agent/middleware/plan-completion-audit.js +157 -0
  102. package/dist/agent/middleware/quality-gate-middleware.d.ts +43 -1
  103. package/dist/agent/middleware/quality-gate-middleware.js +198 -40
  104. package/dist/agent/middleware/types.d.ts +6 -0
  105. package/dist/agent/middleware/verification-enforcement.d.ts +10 -3
  106. package/dist/agent/middleware/verification-enforcement.js +43 -13
  107. package/dist/agent/middleware/workflow-guard.js +7 -0
  108. package/dist/agent/model-benchmark.js +11 -17
  109. package/dist/agent/model-tier.d.ts +2 -2
  110. package/dist/agent/model-tier.js +10 -7
  111. package/dist/agent/multi-agent/agent-memory-integration.js +3 -2
  112. package/dist/agent/multi-agent/base-agent.d.ts +12 -1
  113. package/dist/agent/multi-agent/base-agent.js +58 -10
  114. package/dist/agent/multi-agent/enhanced-coordination.js +1 -0
  115. package/dist/agent/multi-agent/metrics-persistence.js +28 -14
  116. package/dist/agent/multi-agent/multi-agent-system.d.ts +5 -0
  117. package/dist/agent/multi-agent/multi-agent-system.js +81 -4
  118. package/dist/agent/multi-agent/session-fleet-bridge.js +2 -1
  119. package/dist/agent/multi-agent/session-registry.js +9 -3
  120. package/dist/agent/multi-agent/team-manager.d.ts +11 -0
  121. package/dist/agent/multi-agent/team-manager.js +94 -5
  122. package/dist/agent/multi-agent/types.d.ts +10 -1
  123. package/dist/agent/multi-agent/workflow-multi-persistence.js +16 -8
  124. package/dist/agent/multi-agent/workflow-persistence.js +9 -6
  125. package/dist/agent/observer/trigger-registry.js +3 -5
  126. package/dist/agent/operating-modes.d.ts +3 -0
  127. package/dist/agent/operating-modes.js +15 -22
  128. package/dist/agent/pipelines.d.ts +2 -4
  129. package/dist/agent/pipelines.js +1 -1
  130. package/dist/agent/plan-mode.js +1 -1
  131. package/dist/agent/prompt-suggestions.js +2 -1
  132. package/dist/agent/prompt-tool-observation.d.ts +55 -0
  133. package/dist/agent/prompt-tool-observation.js +165 -0
  134. package/dist/agent/reasoning/tree-of-thought.js +1 -1
  135. package/dist/agent/repair/repair-engine.js +1 -1
  136. package/dist/agent/repo-profiler.d.ts +12 -1
  137. package/dist/agent/repo-profiler.js +21 -15
  138. package/dist/agent/repo-profiling/cache.js +6 -9
  139. package/dist/agent/research-worker-provider.d.ts +38 -0
  140. package/dist/agent/research-worker-provider.js +30 -0
  141. package/dist/agent/science/experiment-decision.d.ts +48 -0
  142. package/dist/agent/science/experiment-decision.js +65 -0
  143. package/dist/agent/science/experiment-empirical-gate.d.ts +83 -0
  144. package/dist/agent/science/experiment-empirical-gate.js +156 -0
  145. package/dist/agent/science/experiment-fitness.d.ts +112 -0
  146. package/dist/agent/science/experiment-fitness.js +188 -0
  147. package/dist/agent/science/experiment-loop.d.ts +196 -0
  148. package/dist/agent/science/experiment-loop.js +765 -0
  149. package/dist/agent/science/experiment-orchestrator.d.ts +203 -0
  150. package/dist/agent/science/experiment-orchestrator.js +454 -0
  151. package/dist/agent/science/experiment-sandbox-backends.d.ts +56 -0
  152. package/dist/agent/science/experiment-sandbox-backends.js +201 -0
  153. package/dist/agent/science/experiment-sandbox.d.ts +105 -0
  154. package/dist/agent/science/experiment-sandbox.js +196 -0
  155. package/dist/agent/science/experiment-variant-store.d.ts +108 -0
  156. package/dist/agent/science/experiment-variant-store.js +156 -0
  157. package/dist/agent/science/human-gate.d.ts +31 -0
  158. package/dist/agent/science/human-gate.js +32 -0
  159. package/dist/agent/self-improvement/authored-artifact-gate.js +28 -3
  160. package/dist/agent/self-improvement/authored-tool-runtime.d.ts +4 -2
  161. package/dist/agent/self-improvement/authored-tool-runtime.js +8 -3
  162. package/dist/agent/self-improvement/authored-tool-store.js +3 -2
  163. package/dist/agent/self-improvement/capability-benchmark.js +89 -2
  164. package/dist/agent/self-improvement/continuous-benchmark.d.ts +105 -0
  165. package/dist/agent/self-improvement/continuous-benchmark.js +355 -0
  166. package/dist/agent/self-improvement/delegation-facts.d.ts +105 -0
  167. package/dist/agent/self-improvement/delegation-facts.js +483 -0
  168. package/dist/agent/self-improvement/digest-sources.d.ts +56 -0
  169. package/dist/agent/self-improvement/digest-sources.js +294 -0
  170. package/dist/agent/self-improvement/digest.d.ts +169 -0
  171. package/dist/agent/self-improvement/digest.js +543 -0
  172. package/dist/agent/self-improvement/engine.d.ts +11 -6
  173. package/dist/agent/self-improvement/engine.js +13 -7
  174. package/dist/agent/self-improvement/evolution/ast-novelty.d.ts +20 -0
  175. package/dist/agent/self-improvement/evolution/ast-novelty.js +81 -0
  176. package/dist/agent/self-improvement/evolution/code-variant-store.d.ts +101 -0
  177. package/dist/agent/self-improvement/evolution/code-variant-store.js +229 -0
  178. package/dist/agent/self-improvement/evolution/evolution-engine.d.ts +199 -0
  179. package/dist/agent/self-improvement/evolution/evolution-engine.js +503 -0
  180. package/dist/agent/self-improvement/evolution/feature-map.d.ts +24 -0
  181. package/dist/agent/self-improvement/evolution/feature-map.js +88 -0
  182. package/dist/agent/self-improvement/evolution/model-bandit.d.ts +57 -0
  183. package/dist/agent/self-improvement/evolution/model-bandit.js +98 -0
  184. package/dist/agent/self-improvement/evolution/protected-paths.d.ts +31 -0
  185. package/dist/agent/self-improvement/evolution/protected-paths.js +105 -0
  186. package/dist/agent/self-improvement/evolution/research-weakness-source.d.ts +56 -0
  187. package/dist/agent/self-improvement/evolution/research-weakness-source.js +161 -0
  188. package/dist/agent/self-improvement/evolution/scrub-env.d.ts +22 -0
  189. package/dist/agent/self-improvement/evolution/scrub-env.js +40 -0
  190. package/dist/agent/self-improvement/evolution/variant-fitness.d.ts +86 -0
  191. package/dist/agent/self-improvement/evolution/variant-fitness.js +217 -0
  192. package/dist/agent/self-improvement/evolution/variant-planner.d.ts +41 -0
  193. package/dist/agent/self-improvement/evolution/variant-planner.js +156 -0
  194. package/dist/agent/self-improvement/evolution/weakness-selector.d.ts +38 -0
  195. package/dist/agent/self-improvement/evolution/weakness-selector.js +108 -0
  196. package/dist/agent/self-improvement/evolution/worktree-scorer.d.ts +44 -0
  197. package/dist/agent/self-improvement/evolution/worktree-scorer.js +99 -0
  198. package/dist/agent/self-improvement/evolutionary-archive.js +3 -2
  199. package/dist/agent/self-improvement/experience-source.d.ts +60 -7
  200. package/dist/agent/self-improvement/experience-source.js +78 -8
  201. package/dist/agent/self-improvement/index.d.ts +1 -0
  202. package/dist/agent/self-improvement/index.js +6 -3
  203. package/dist/agent/self-improvement/learning-store.d.ts +16 -0
  204. package/dist/agent/self-improvement/learning-store.js +83 -3
  205. package/dist/agent/self-improvement/llm-drafter.d.ts +3 -1
  206. package/dist/agent/self-improvement/llm-drafter.js +20 -2
  207. package/dist/agent/self-improvement/llm-tool-proposer.js +1 -1
  208. package/dist/agent/self-improvement/proposal-store.d.ts +46 -0
  209. package/dist/agent/self-improvement/proposal-store.js +87 -0
  210. package/dist/agent/self-improvement/proposer.d.ts +1 -1
  211. package/dist/agent/self-improvement/proposer.js +94 -2
  212. package/dist/agent/self-improvement/rule-store.js +5 -4
  213. package/dist/agent/self-improvement/sandbox-scorer.d.ts +1 -1
  214. package/dist/agent/self-improvement/sandbox-scorer.js +8 -4
  215. package/dist/agent/self-improvement/self-knowledge.d.ts +1 -1
  216. package/dist/agent/self-improvement/self-knowledge.js +8 -8
  217. package/dist/agent/self-improvement/skill-benchmark.js +27 -0
  218. package/dist/agent/self-improvement/skill-consolidator.js +16 -0
  219. package/dist/agent/self-improvement/skill-engine.d.ts +7 -0
  220. package/dist/agent/self-improvement/skill-engine.js +54 -28
  221. package/dist/agent/self-improvement/skill-gate.d.ts +4 -4
  222. package/dist/agent/self-improvement/skill-gate.js +38 -20
  223. package/dist/agent/self-improvement/skill-mutator.d.ts +20 -1
  224. package/dist/agent/self-improvement/skill-mutator.js +138 -19
  225. package/dist/agent/self-improvement/skill-proposer.js +2 -1
  226. package/dist/agent/self-improvement/skill-types.d.ts +4 -0
  227. package/dist/agent/self-improvement/strategy-engine.d.ts +54 -0
  228. package/dist/agent/self-improvement/strategy-engine.js +104 -0
  229. package/dist/agent/self-improvement/strategy-gate.d.ts +49 -0
  230. package/dist/agent/self-improvement/strategy-gate.js +243 -0
  231. package/dist/agent/self-improvement/strategy-live.d.ts +39 -0
  232. package/dist/agent/self-improvement/strategy-live.js +114 -0
  233. package/dist/agent/self-improvement/strategy-proposer.d.ts +30 -0
  234. package/dist/agent/self-improvement/strategy-proposer.js +114 -0
  235. package/dist/agent/self-improvement/strategy-replay.d.ts +40 -0
  236. package/dist/agent/self-improvement/strategy-replay.js +150 -0
  237. package/dist/agent/self-improvement/strategy-runtime.d.ts +43 -0
  238. package/dist/agent/self-improvement/strategy-runtime.js +56 -0
  239. package/dist/agent/self-improvement/strategy-store.d.ts +38 -0
  240. package/dist/agent/self-improvement/strategy-store.js +139 -0
  241. package/dist/agent/self-improvement/strategy-types.d.ts +229 -0
  242. package/dist/agent/self-improvement/strategy-types.js +90 -0
  243. package/dist/agent/self-improvement/tool-benchmark.js +164 -8
  244. package/dist/agent/self-improvement/tool-engine.d.ts +12 -3
  245. package/dist/agent/self-improvement/tool-engine.js +59 -31
  246. package/dist/agent/self-improvement/tool-gate.d.ts +2 -0
  247. package/dist/agent/self-improvement/tool-gate.js +26 -0
  248. package/dist/agent/self-improvement/tool-skill-mutator.d.ts +1 -1
  249. package/dist/agent/self-improvement/tool-skill-mutator.js +20 -2
  250. package/dist/agent/self-improvement/tool-types.d.ts +5 -3
  251. package/dist/agent/self-improvement/types.d.ts +7 -3
  252. package/dist/agent/session-end-flush.js +2 -1
  253. package/dist/agent/specialized/agent-registry.d.ts +1 -0
  254. package/dist/agent/specialized/agent-registry.js +118 -0
  255. package/dist/agent/specialized/excel-agent.js +15 -1
  256. package/dist/agent/specialized/index.d.ts +1 -0
  257. package/dist/agent/specialized/index.js +2 -0
  258. package/dist/agent/specialized/pdf-agent.js +4 -2
  259. package/dist/agent/specialized/swe-agent-adapter.js +8 -0
  260. package/dist/agent/specialized/swe-agent.d.ts +16 -1
  261. package/dist/agent/specialized/swe-agent.js +75 -7
  262. package/dist/agent/specialized/types.d.ts +31 -1
  263. package/dist/agent/specialized/types.js +26 -0
  264. package/dist/agent/specialized/verifier-agent.d.ts +53 -0
  265. package/dist/agent/specialized/verifier-agent.js +342 -0
  266. package/dist/agent/streaming/message-reducer.js +73 -19
  267. package/dist/agent/streaming/streaming-handler.d.ts +24 -0
  268. package/dist/agent/streaming/streaming-handler.js +136 -1
  269. package/dist/agent/subagents.d.ts +10 -4
  270. package/dist/agent/subagents.js +39 -6
  271. package/dist/agent/thinking/extended-thinking.js +1 -1
  272. package/dist/agent/todo-tracker.js +5 -4
  273. package/dist/agent/tool-executor.d.ts +10 -1
  274. package/dist/agent/tool-executor.js +29 -0
  275. package/dist/agent/tool-handler.d.ts +49 -2
  276. package/dist/agent/tool-handler.js +738 -181
  277. package/dist/agent/types.d.ts +3 -5
  278. package/dist/agent/wide-research-checkpoint.d.ts +77 -0
  279. package/dist/agent/wide-research-checkpoint.js +361 -0
  280. package/dist/agent/wide-research-files.d.ts +11 -0
  281. package/dist/agent/wide-research-files.js +189 -0
  282. package/dist/agent/wide-research.d.ts +148 -3
  283. package/dist/agent/wide-research.js +833 -56
  284. package/dist/analytics/code-evolution.js +20 -15
  285. package/dist/analytics/complexity-analyzer.js +2 -2
  286. package/dist/analytics/cost-report.d.ts +71 -0
  287. package/dist/analytics/cost-report.js +724 -0
  288. package/dist/analytics/dashboard.js +8 -7
  289. package/dist/analytics/index.d.ts +2 -0
  290. package/dist/analytics/index.js +2 -0
  291. package/dist/analytics/repo-explainer-collector.d.ts +13 -0
  292. package/dist/analytics/repo-explainer-collector.js +351 -0
  293. package/dist/analytics/repo-explainer.d.ts +224 -0
  294. package/dist/analytics/repo-explainer.js +605 -0
  295. package/dist/analytics/roi-tracker.js +11 -9
  296. package/dist/api/webhooks.js +9 -14
  297. package/dist/app/application-factory.d.ts +1 -1
  298. package/dist/app/application-factory.js +6 -5
  299. package/dist/auth/profile-manager.js +8 -4
  300. package/dist/avatar/avatar-event-bus.d.ts +16 -0
  301. package/dist/avatar/avatar-event-bus.js +53 -0
  302. package/dist/avatar/avatar-gateway-bridge.d.ts +26 -0
  303. package/dist/avatar/avatar-gateway-bridge.js +54 -0
  304. package/dist/avatar/avatar-protocol.d.ts +133 -0
  305. package/dist/avatar/avatar-protocol.js +241 -0
  306. package/dist/avatar/avatar-renderer-registry.d.ts +56 -0
  307. package/dist/avatar/avatar-renderer-registry.js +191 -0
  308. package/dist/avatar/avatar-renderer-simulator.d.ts +31 -0
  309. package/dist/avatar/avatar-renderer-simulator.js +160 -0
  310. package/dist/browser-automation/browser-manager.d.ts +15 -1
  311. package/dist/browser-automation/browser-manager.js +101 -0
  312. package/dist/browser-automation/browser-operator-executor.d.ts +89 -7
  313. package/dist/browser-automation/browser-operator-executor.js +1280 -58
  314. package/dist/browser-automation/browser-operator-runtime.d.ts +87 -0
  315. package/dist/browser-automation/browser-operator-runtime.js +441 -0
  316. package/dist/browser-automation/browser-operator-session.js +4 -3
  317. package/dist/browser-automation/browser-tool.d.ts +17 -2
  318. package/dist/browser-automation/browser-tool.js +101 -39
  319. package/dist/browser-automation/internet-scout-plan.d.ts +1 -0
  320. package/dist/browser-automation/internet-scout-plan.js +17 -0
  321. package/dist/browser-automation/profile-manager.js +5 -3
  322. package/dist/browser-automation/types.d.ts +25 -0
  323. package/dist/cache/advanced-lru-cache.js +4 -4
  324. package/dist/cache/cache-manager.js +9 -10
  325. package/dist/cache/embedding-cache.js +6 -5
  326. package/dist/cache/llm-response-cache.js +3 -4
  327. package/dist/capture/screen-recorder.d.ts +2 -0
  328. package/dist/capture/screen-recorder.js +6 -4
  329. package/dist/capture/screen-watcher.d.ts +6 -3
  330. package/dist/capture/screen-watcher.js +86 -9
  331. package/dist/channels/channel-cognitive-port.d.ts +46 -0
  332. package/dist/channels/channel-cognitive-port.js +182 -0
  333. package/dist/channels/channel-model-override.d.ts +47 -0
  334. package/dist/channels/channel-model-override.js +62 -0
  335. package/dist/channels/companion-channel-profile.d.ts +68 -0
  336. package/dist/channels/companion-channel-profile.js +142 -0
  337. package/dist/channels/companion-channel-turn.d.ts +30 -0
  338. package/dist/channels/companion-channel-turn.js +38 -0
  339. package/dist/channels/core.d.ts +37 -3
  340. package/dist/channels/core.js +63 -6
  341. package/dist/channels/discord/client.js +34 -14
  342. package/dist/channels/dm-pairing.d.ts +18 -4
  343. package/dist/channels/dm-pairing.js +199 -33
  344. package/dist/channels/gateway-lifecycle.d.ts +2 -0
  345. package/dist/channels/gateway-lifecycle.js +1 -0
  346. package/dist/channels/identity-links.d.ts +19 -1
  347. package/dist/channels/identity-links.js +68 -12
  348. package/dist/channels/matrix/index.js +6 -2
  349. package/dist/channels/pro/pro-features.js +17 -0
  350. package/dist/channels/pro/run-tracker.js +9 -4
  351. package/dist/channels/pro/scoped-auth.js +10 -8
  352. package/dist/channels/provider-failure-speech.d.ts +28 -0
  353. package/dist/channels/provider-failure-speech.js +128 -0
  354. package/dist/channels/reconnection-manager.d.ts +2 -0
  355. package/dist/channels/reconnection-manager.js +7 -2
  356. package/dist/channels/resolve-channel-secret.d.ts +43 -0
  357. package/dist/channels/resolve-channel-secret.js +82 -0
  358. package/dist/channels/slack/block-builder.d.ts +12 -0
  359. package/dist/channels/slack/block-builder.js +70 -2
  360. package/dist/channels/slack/client.js +62 -15
  361. package/dist/channels/slack/types.d.ts +20 -1
  362. package/dist/channels/telegram/client.d.ts +36 -3
  363. package/dist/channels/telegram/client.js +438 -84
  364. package/dist/channels/telegram/types.d.ts +2 -0
  365. package/dist/channels/webhook-server.js +8 -1
  366. package/dist/channels/whatsapp/index.js +2 -1
  367. package/dist/checkpoints/ghost-snapshot.js +15 -9
  368. package/dist/checkpoints/persistent-checkpoint-manager.js +15 -8
  369. package/dist/cli/command-routing.d.ts +22 -0
  370. package/dist/cli/command-routing.js +54 -0
  371. package/dist/cli/first-run.d.ts +17 -0
  372. package/dist/cli/first-run.js +40 -0
  373. package/dist/cli/headless-options.d.ts +22 -0
  374. package/dist/cli/headless-options.js +112 -0
  375. package/dist/cli/headless-prompt-progress.d.ts +22 -0
  376. package/dist/cli/headless-prompt-progress.js +35 -0
  377. package/dist/cli/headless.js +2 -2
  378. package/dist/cli/listen-port.d.ts +8 -0
  379. package/dist/cli/listen-port.js +20 -0
  380. package/dist/cli/permission-mode-option.d.ts +14 -0
  381. package/dist/cli/permission-mode-option.js +64 -0
  382. package/dist/cli/requested-profile.d.ts +15 -0
  383. package/dist/cli/requested-profile.js +27 -0
  384. package/dist/cli/unknown-option-hint.d.ts +16 -0
  385. package/dist/cli/unknown-option-hint.js +116 -0
  386. package/dist/cli/voice-command.d.ts +32 -0
  387. package/dist/cli/voice-command.js +96 -0
  388. package/dist/codebuddy/abort-signal.d.ts +7 -0
  389. package/dist/codebuddy/abort-signal.js +31 -0
  390. package/dist/codebuddy/client.d.ts +68 -0
  391. package/dist/codebuddy/client.js +460 -11
  392. package/dist/codebuddy/fleet-tool-defs.js +5 -0
  393. package/dist/codebuddy/llm-retry.d.ts +24 -0
  394. package/dist/codebuddy/llm-retry.js +124 -0
  395. package/dist/codebuddy/provider-error-classifier.d.ts +86 -0
  396. package/dist/codebuddy/provider-error-classifier.js +410 -0
  397. package/dist/codebuddy/provider-failover-error.d.ts +16 -0
  398. package/dist/codebuddy/provider-failover-error.js +50 -0
  399. package/dist/codebuddy/provider-failover-kind.d.ts +15 -0
  400. package/dist/codebuddy/provider-failover-kind.js +172 -0
  401. package/dist/codebuddy/provider-handoff.d.ts +35 -0
  402. package/dist/codebuddy/provider-handoff.js +294 -0
  403. package/dist/codebuddy/providers/ollama-native-transport.d.ts +130 -0
  404. package/dist/codebuddy/providers/ollama-native-transport.js +387 -0
  405. package/dist/codebuddy/providers/provider-agy-cli.d.ts +29 -0
  406. package/dist/codebuddy/providers/provider-agy-cli.js +264 -0
  407. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +59 -7
  408. package/dist/codebuddy/providers/provider-chatgpt-responses.js +519 -164
  409. package/dist/codebuddy/providers/provider-gemini-cli.js +95 -13
  410. package/dist/codebuddy/providers/provider-gemini-native.d.ts +2 -0
  411. package/dist/codebuddy/providers/provider-gemini-native.js +199 -86
  412. package/dist/codebuddy/providers/provider-openai-compat.d.ts +82 -0
  413. package/dist/codebuddy/providers/provider-openai-compat.js +469 -45
  414. package/dist/codebuddy/stream-retry.d.ts +21 -8
  415. package/dist/codebuddy/stream-retry.js +44 -40
  416. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +4 -0
  417. package/dist/codebuddy/tool-definitions/advanced-tools.js +188 -0
  418. package/dist/codebuddy/tool-definitions/agent-tools.d.ts +5 -0
  419. package/dist/codebuddy/tool-definitions/agent-tools.js +195 -7
  420. package/dist/codebuddy/tool-definitions/browser-tools.d.ts +1 -0
  421. package/dist/codebuddy/tool-definitions/browser-tools.js +65 -1
  422. package/dist/codebuddy/tool-definitions/code-exec-tools.d.ts +8 -0
  423. package/dist/codebuddy/tool-definitions/code-exec-tools.js +29 -0
  424. package/dist/codebuddy/tool-definitions/code-explorer-tools.js +4 -0
  425. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.d.ts +3 -0
  426. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.js +37 -0
  427. package/dist/codebuddy/tool-definitions/core-tools.d.ts +2 -0
  428. package/dist/codebuddy/tool-definitions/core-tools.js +58 -2
  429. package/dist/codebuddy/tool-definitions/delegate-agent-tools.d.ts +11 -0
  430. package/dist/codebuddy/tool-definitions/delegate-agent-tools.js +50 -0
  431. package/dist/codebuddy/tool-definitions/design-tools.d.ts +6 -0
  432. package/dist/codebuddy/tool-definitions/design-tools.js +35 -0
  433. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.d.ts +1 -0
  434. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.js +23 -1
  435. package/dist/codebuddy/tool-definitions/index.d.ts +16 -7
  436. package/dist/codebuddy/tool-definitions/index.js +27 -8
  437. package/dist/codebuddy/tool-definitions/lsp-tools.d.ts +7 -1
  438. package/dist/codebuddy/tool-definitions/lsp-tools.js +104 -1
  439. package/dist/codebuddy/tool-definitions/meeting-tools.d.ts +4 -0
  440. package/dist/codebuddy/tool-definitions/meeting-tools.js +32 -0
  441. package/dist/codebuddy/tool-definitions/moa-tools.js +7 -2
  442. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +14 -0
  443. package/dist/codebuddy/tool-definitions/multimodal-tools.js +615 -3
  444. package/dist/codebuddy/tool-definitions/research-tools.d.ts +20 -0
  445. package/dist/codebuddy/tool-definitions/research-tools.js +98 -0
  446. package/dist/codebuddy/tool-definitions/self-describe-tools.d.ts +4 -0
  447. package/dist/codebuddy/tool-definitions/self-describe-tools.js +28 -0
  448. package/dist/codebuddy/tool-definitions/self-evolution-tools.d.ts +4 -0
  449. package/dist/codebuddy/tool-definitions/self-evolution-tools.js +31 -0
  450. package/dist/codebuddy/tool-definitions/verify-tools.d.ts +14 -0
  451. package/dist/codebuddy/tool-definitions/verify-tools.js +36 -0
  452. package/dist/codebuddy/tool-definitions/web-tools.d.ts +4 -0
  453. package/dist/codebuddy/tool-definitions/web-tools.js +135 -0
  454. package/dist/codebuddy/tool-definitions/workspace-tools.d.ts +4 -0
  455. package/dist/codebuddy/tool-definitions/workspace-tools.js +43 -0
  456. package/dist/codebuddy/tools.d.ts +15 -17
  457. package/dist/codebuddy/tools.js +235 -55
  458. package/dist/cognition/budget-reservations.d.ts +27 -0
  459. package/dist/cognition/budget-reservations.js +70 -0
  460. package/dist/cognition/cognitive-bus-client.d.ts +94 -0
  461. package/dist/cognition/cognitive-bus-client.js +724 -0
  462. package/dist/cognition/cognitive-hub.d.ts +93 -0
  463. package/dist/cognition/cognitive-hub.js +366 -0
  464. package/dist/cognition/cognitive-mesh.d.ts +38 -0
  465. package/dist/cognition/cognitive-mesh.js +263 -0
  466. package/dist/cognition/cognitive-port.d.ts +35 -0
  467. package/dist/cognition/cognitive-port.js +80 -0
  468. package/dist/cognition/cognitive-wire-contract.d.ts +1542 -0
  469. package/dist/cognition/cognitive-wire-contract.js +164 -0
  470. package/dist/cognition/context-renderer.d.ts +52 -0
  471. package/dist/cognition/context-renderer.js +227 -0
  472. package/dist/cognition/global-workspace.d.ts +39 -0
  473. package/dist/cognition/global-workspace.js +181 -0
  474. package/dist/cognition/index.d.ts +9 -0
  475. package/dist/cognition/index.js +10 -0
  476. package/dist/cognition/llm-specialist.d.ts +40 -0
  477. package/dist/cognition/llm-specialist.js +93 -0
  478. package/dist/cognition/sensory-workspace.d.ts +57 -0
  479. package/dist/cognition/sensory-workspace.js +346 -0
  480. package/dist/cognition/types.d.ts +93 -0
  481. package/dist/cognition/types.js +7 -0
  482. package/dist/cognition/voice-specialists.d.ts +21 -0
  483. package/dist/cognition/voice-specialists.js +89 -0
  484. package/dist/cognition/world-model.d.ts +95 -0
  485. package/dist/cognition/world-model.js +228 -0
  486. package/dist/collaboration/ai-colab-manager.js +12 -13
  487. package/dist/collaboration/team-session.js +25 -11
  488. package/dist/commands/apply-permission-mode.d.ts +27 -0
  489. package/dist/commands/apply-permission-mode.js +35 -0
  490. package/dist/commands/assistant.d.ts +3 -0
  491. package/dist/commands/assistant.js +1022 -0
  492. package/dist/commands/campaign.d.ts +6 -0
  493. package/dist/commands/campaign.js +140 -0
  494. package/dist/commands/capsule.d.ts +2 -0
  495. package/dist/commands/capsule.js +104 -0
  496. package/dist/commands/changelog.d.ts +29 -0
  497. package/dist/commands/changelog.js +283 -0
  498. package/dist/commands/cli/acp-command.js +4 -1
  499. package/dist/commands/cli/backup-command.d.ts +9 -0
  500. package/dist/commands/cli/backup-command.js +47 -0
  501. package/dist/commands/cli/evolve-command.d.ts +26 -0
  502. package/dist/commands/cli/evolve-command.js +259 -0
  503. package/dist/commands/cli/fleet-commands.js +105 -0
  504. package/dist/commands/cli/improve-command.d.ts +2 -1
  505. package/dist/commands/cli/improve-command.js +309 -20
  506. package/dist/commands/cli/native-engine-commands.js +405 -28
  507. package/dist/commands/cli/sensory-command.d.ts +8 -0
  508. package/dist/commands/cli/sensory-command.js +27 -0
  509. package/dist/commands/cli/speak-command.js +87 -24
  510. package/dist/commands/cli/tools-commands.js +68 -36
  511. package/dist/commands/cli/utility-commands.js +34 -9
  512. package/dist/commands/client-dispatcher.d.ts +1 -0
  513. package/dist/commands/client-dispatcher.js +40 -21
  514. package/dist/commands/compress.js +3 -0
  515. package/dist/commands/cost.d.ts +33 -0
  516. package/dist/commands/cost.js +342 -0
  517. package/dist/commands/council-scoreboard.d.ts +8 -0
  518. package/dist/commands/council-scoreboard.js +68 -0
  519. package/dist/commands/council.d.ts +16 -24
  520. package/dist/commands/council.js +247 -255
  521. package/dist/commands/curator-cli.d.ts +14 -0
  522. package/dist/commands/curator-cli.js +57 -0
  523. package/dist/commands/delegate.js +82 -25
  524. package/dist/commands/dev/golden-path.d.ts +71 -0
  525. package/dist/commands/dev/golden-path.js +317 -0
  526. package/dist/commands/dev/index.d.ts +3 -0
  527. package/dist/commands/dev/index.js +151 -119
  528. package/dist/commands/dev/issue-pipeline.js +7 -7
  529. package/dist/commands/dev/workflows.d.ts +2 -0
  530. package/dist/commands/dev/workflows.js +39 -6
  531. package/dist/commands/enhanced-command-handler.d.ts +3 -0
  532. package/dist/commands/enhanced-command-handler.js +29 -12
  533. package/dist/commands/exchange.d.ts +2 -0
  534. package/dist/commands/exchange.js +193 -0
  535. package/dist/commands/explain.d.ts +12 -0
  536. package/dist/commands/explain.js +135 -0
  537. package/dist/commands/film.d.ts +18 -0
  538. package/dist/commands/film.js +239 -0
  539. package/dist/commands/flow.js +15 -5
  540. package/dist/commands/forge.d.ts +2 -0
  541. package/dist/commands/forge.js +102 -0
  542. package/dist/commands/goal-cli.d.ts +3 -0
  543. package/dist/commands/goal-cli.js +9 -4
  544. package/dist/commands/gpu-worker.d.ts +14 -0
  545. package/dist/commands/gpu-worker.js +135 -0
  546. package/dist/commands/handlers/agents-handler.d.ts +11 -2
  547. package/dist/commands/handlers/agents-handler.js +79 -13
  548. package/dist/commands/handlers/auth-handlers.js +12 -5
  549. package/dist/commands/handlers/backup-handlers.d.ts +40 -0
  550. package/dist/commands/handlers/backup-handlers.js +784 -57
  551. package/dist/commands/handlers/batch-handlers.d.ts +72 -2
  552. package/dist/commands/handlers/batch-handlers.js +443 -37
  553. package/dist/commands/handlers/branch-handlers.d.ts +1 -0
  554. package/dist/commands/handlers/channel-handlers.d.ts +7 -2
  555. package/dist/commands/handlers/channel-handlers.js +1705 -103
  556. package/dist/commands/handlers/companion-handler.js +130 -9
  557. package/dist/commands/handlers/daily-reset-handler.d.ts +1 -1
  558. package/dist/commands/handlers/daily-reset-handler.js +1 -1
  559. package/dist/commands/handlers/deepthink-handler.d.ts +2 -0
  560. package/dist/commands/handlers/deepthink-handler.js +49 -0
  561. package/dist/commands/handlers/extra-handlers.js +23 -24
  562. package/dist/commands/handlers/fleet-handler.d.ts +3 -4
  563. package/dist/commands/handlers/fleet-handler.js +82 -35
  564. package/dist/commands/handlers/goal-handler.d.ts +13 -0
  565. package/dist/commands/handlers/goal-handler.js +26 -7
  566. package/dist/commands/handlers/grill-me-handler.d.ts +2 -0
  567. package/dist/commands/handlers/grill-me-handler.js +41 -0
  568. package/dist/commands/handlers/heartbeat-handler.d.ts +2 -2
  569. package/dist/commands/handlers/heartbeat-handler.js +2 -2
  570. package/dist/commands/handlers/index.d.ts +3 -2
  571. package/dist/commands/handlers/index.js +4 -2
  572. package/dist/commands/handlers/memory-handlers.js +40 -0
  573. package/dist/commands/handlers/permissions-handlers.js +3 -2
  574. package/dist/commands/handlers/pr-handlers.js +15 -17
  575. package/dist/commands/handlers/security-handlers.d.ts +1 -1
  576. package/dist/commands/handlers/security-handlers.js +3 -3
  577. package/dist/commands/handlers/slash-session-handlers.d.ts +9 -0
  578. package/dist/commands/handlers/slash-session-handlers.js +134 -0
  579. package/dist/commands/handlers/swarm-handler.js +41 -2
  580. package/dist/commands/handlers/team-handlers.d.ts +28 -1
  581. package/dist/commands/handlers/team-handlers.js +243 -2
  582. package/dist/commands/handlers/think-handlers.js +2 -1
  583. package/dist/commands/handlers/vibe-handlers.js +8 -1
  584. package/dist/commands/handlers/worktree-handlers.js +23 -12
  585. package/dist/commands/headless-slash.d.ts +9 -0
  586. package/dist/commands/headless-slash.js +41 -3
  587. package/dist/commands/import.d.ts +34 -0
  588. package/dist/commands/import.js +478 -0
  589. package/dist/commands/index.d.ts +0 -1
  590. package/dist/commands/index.js +0 -1
  591. package/dist/commands/influencer.d.ts +2 -0
  592. package/dist/commands/influencer.js +87 -0
  593. package/dist/commands/intent.d.ts +6 -0
  594. package/dist/commands/intent.js +131 -0
  595. package/dist/commands/intents.d.ts +10 -0
  596. package/dist/commands/intents.js +163 -0
  597. package/dist/commands/lessons.js +91 -0
  598. package/dist/commands/llm-provider-resolution.d.ts +20 -0
  599. package/dist/commands/llm-provider-resolution.js +74 -13
  600. package/dist/commands/login-prerequisites.d.ts +11 -0
  601. package/dist/commands/login-prerequisites.js +23 -0
  602. package/dist/commands/loop-cli.d.ts +31 -0
  603. package/dist/commands/loop-cli.js +189 -0
  604. package/dist/commands/lora.d.ts +6 -0
  605. package/dist/commands/lora.js +445 -0
  606. package/dist/commands/maison-food.d.ts +10 -0
  607. package/dist/commands/maison-food.js +485 -0
  608. package/dist/commands/maison.d.ts +17 -0
  609. package/dist/commands/maison.js +236 -0
  610. package/dist/commands/mcp.d.ts +6 -0
  611. package/dist/commands/mcp.js +236 -7
  612. package/dist/commands/meeting.d.ts +8 -0
  613. package/dist/commands/meeting.js +31 -0
  614. package/dist/commands/pairing.js +7 -8
  615. package/dist/commands/papers/ask.d.ts +47 -0
  616. package/dist/commands/papers/ask.js +105 -0
  617. package/dist/commands/papers/index.d.ts +19 -0
  618. package/dist/commands/papers/index.js +54 -0
  619. package/dist/commands/provider.d.ts +9 -0
  620. package/dist/commands/provider.js +178 -10
  621. package/dist/commands/replay.d.ts +11 -0
  622. package/dist/commands/replay.js +131 -0
  623. package/dist/commands/research/deep.d.ts +66 -0
  624. package/dist/commands/research/deep.js +236 -0
  625. package/dist/commands/research/discover-searxng.d.ts +25 -0
  626. package/dist/commands/research/discover-searxng.js +62 -0
  627. package/dist/commands/research/index.d.ts +24 -2
  628. package/dist/commands/research/index.js +456 -79
  629. package/dist/commands/research/knowledge-ingest.d.ts +170 -0
  630. package/dist/commands/research/knowledge-ingest.js +449 -0
  631. package/dist/commands/research/wire-research-worker.d.ts +9 -0
  632. package/dist/commands/research/wire-research-worker.js +18 -0
  633. package/dist/commands/run-cli/index.d.ts +3 -1
  634. package/dist/commands/run-cli/index.js +53 -2
  635. package/dist/commands/science/deps.d.ts +95 -0
  636. package/dist/commands/science/deps.js +343 -0
  637. package/dist/commands/science/index.d.ts +31 -0
  638. package/dist/commands/science/index.js +285 -0
  639. package/dist/commands/science/loop-option.d.ts +40 -0
  640. package/dist/commands/science/loop-option.js +91 -0
  641. package/dist/commands/science/sandbox-option.d.ts +44 -0
  642. package/dist/commands/science/sandbox-option.js +42 -0
  643. package/dist/commands/scrape.d.ts +18 -0
  644. package/dist/commands/scrape.js +159 -0
  645. package/dist/commands/self.d.ts +9 -0
  646. package/dist/commands/self.js +56 -0
  647. package/dist/commands/shadow.d.ts +3 -0
  648. package/dist/commands/shadow.js +72 -0
  649. package/dist/commands/share.d.ts +13 -0
  650. package/dist/commands/share.js +71 -0
  651. package/dist/commands/shell-prefix.d.ts +4 -22
  652. package/dist/commands/shell-prefix.js +11 -73
  653. package/dist/commands/skills-cli/index.d.ts +2 -0
  654. package/dist/commands/skills-cli/index.js +190 -15
  655. package/dist/commands/slash/builtin-commands.js +41 -21
  656. package/dist/commands/slash-commands.js +4 -1
  657. package/dist/commands/token.d.ts +80 -0
  658. package/dist/commands/token.js +319 -0
  659. package/dist/commands/try.d.ts +72 -0
  660. package/dist/commands/try.js +357 -0
  661. package/dist/commands/update.d.ts +14 -1
  662. package/dist/commands/update.js +97 -15
  663. package/dist/commands/vision-train.d.ts +15 -0
  664. package/dist/commands/vision-train.js +214 -0
  665. package/dist/commands/whoami-status.d.ts +17 -0
  666. package/dist/commands/whoami-status.js +34 -0
  667. package/dist/commands/widgets.d.ts +2 -0
  668. package/dist/commands/widgets.js +179 -0
  669. package/dist/commands/ws.d.ts +7 -0
  670. package/dist/commands/ws.js +100 -0
  671. package/dist/companion/assistant-config.d.ts +79 -0
  672. package/dist/companion/assistant-config.js +1148 -0
  673. package/dist/companion/attached-image-grounding.d.ts +29 -0
  674. package/dist/companion/attached-image-grounding.js +285 -0
  675. package/dist/companion/away-mode.d.ts +80 -0
  676. package/dist/companion/away-mode.js +269 -0
  677. package/dist/companion/camera-share.d.ts +65 -0
  678. package/dist/companion/camera-share.js +321 -0
  679. package/dist/companion/camera.d.ts +8 -0
  680. package/dist/companion/camera.js +57 -31
  681. package/dist/companion/cards.js +7 -10
  682. package/dist/companion/check-in.js +23 -8
  683. package/dist/companion/companion-doctor.d.ts +58 -0
  684. package/dist/companion/companion-doctor.js +194 -0
  685. package/dist/companion/companion-history.d.ts +23 -0
  686. package/dist/companion/companion-history.js +22 -0
  687. package/dist/companion/companion-mode.d.ts +77 -1
  688. package/dist/companion/companion-mode.js +916 -6
  689. package/dist/companion/companion-photo-intake.d.ts +40 -0
  690. package/dist/companion/companion-photo-intake.js +112 -0
  691. package/dist/companion/companion-photo.d.ts +144 -0
  692. package/dist/companion/companion-photo.js +318 -0
  693. package/dist/companion/companion-turn.d.ts +88 -0
  694. package/dist/companion/companion-turn.js +223 -0
  695. package/dist/companion/companion-voice-character.d.ts +62 -0
  696. package/dist/companion/companion-voice-character.js +148 -0
  697. package/dist/companion/competitive-radar.js +14 -13
  698. package/dist/companion/continuity.d.ts +62 -0
  699. package/dist/companion/continuity.js +284 -0
  700. package/dist/companion/conversation-improvement-loop.d.ts +61 -0
  701. package/dist/companion/conversation-improvement-loop.js +317 -0
  702. package/dist/companion/conversation-quality-insights.d.ts +56 -0
  703. package/dist/companion/conversation-quality-insights.js +161 -0
  704. package/dist/companion/cooking-timer-runner.d.ts +20 -0
  705. package/dist/companion/cooking-timer-runner.js +98 -0
  706. package/dist/companion/core-adapter.d.ts +60 -0
  707. package/dist/companion/core-adapter.js +111 -0
  708. package/dist/companion/crisis-safety.d.ts +52 -0
  709. package/dist/companion/crisis-safety.js +150 -0
  710. package/dist/companion/daily-interaction-budget.d.ts +34 -0
  711. package/dist/companion/daily-interaction-budget.js +260 -0
  712. package/dist/companion/dialogue-percepts.d.ts +16 -0
  713. package/dist/companion/dialogue-percepts.js +50 -0
  714. package/dist/companion/event-followups.d.ts +58 -0
  715. package/dist/companion/event-followups.js +213 -0
  716. package/dist/companion/fashion-scene-catalog.d.ts +29 -0
  717. package/dist/companion/fashion-scene-catalog.js +141 -0
  718. package/dist/companion/gateway-inbox.js +25 -13
  719. package/dist/companion/gateway.d.ts +1 -0
  720. package/dist/companion/gateway.js +37 -17
  721. package/dist/companion/home-interaction-policy.d.ts +31 -0
  722. package/dist/companion/home-interaction-policy.js +89 -0
  723. package/dist/companion/household-time.d.ts +9 -0
  724. package/dist/companion/household-time.js +15 -0
  725. package/dist/companion/idle-loop.d.ts +53 -0
  726. package/dist/companion/idle-loop.js +254 -0
  727. package/dist/companion/impulses.js +148 -23
  728. package/dist/companion/inner-life.d.ts +60 -0
  729. package/dist/companion/inner-life.js +112 -0
  730. package/dist/companion/jokes.d.ts +21 -0
  731. package/dist/companion/jokes.js +175 -0
  732. package/dist/companion/lisa-selfie-cache.d.ts +36 -0
  733. package/dist/companion/lisa-selfie-cache.js +123 -0
  734. package/dist/companion/lisa-selfie-ingest.d.ts +36 -0
  735. package/dist/companion/lisa-selfie-ingest.js +205 -0
  736. package/dist/companion/lisa-selfie-refill.d.ts +32 -0
  737. package/dist/companion/lisa-selfie-refill.js +121 -0
  738. package/dist/companion/lisa-selfie-router.d.ts +40 -0
  739. package/dist/companion/lisa-selfie-router.js +156 -0
  740. package/dist/companion/lisa-selfie.d.ts +97 -0
  741. package/dist/companion/lisa-selfie.js +542 -0
  742. package/dist/companion/maison-voice-actions.d.ts +34 -0
  743. package/dist/companion/maison-voice-actions.js +192 -0
  744. package/dist/companion/migration.d.ts +63 -0
  745. package/dist/companion/migration.js +270 -0
  746. package/dist/companion/mission-board.js +7 -10
  747. package/dist/companion/mission-runner.js +2 -3
  748. package/dist/companion/mobile-conversation-log.d.ts +19 -0
  749. package/dist/companion/mobile-conversation-log.js +157 -0
  750. package/dist/companion/mobile-history.d.ts +34 -0
  751. package/dist/companion/mobile-history.js +123 -0
  752. package/dist/companion/mysoulmate-image-prompts.d.ts +26 -0
  753. package/dist/companion/mysoulmate-image-prompts.js +278 -0
  754. package/dist/companion/orchestrator.d.ts +32 -0
  755. package/dist/companion/orchestrator.js +49 -0
  756. package/dist/companion/percepts.d.ts +70 -0
  757. package/dist/companion/percepts.js +251 -18
  758. package/dist/companion/personas/copine.d.ts +8 -0
  759. package/dist/companion/personas/copine.js +195 -0
  760. package/dist/companion/personas/index.d.ts +19 -0
  761. package/dist/companion/personas/index.js +33 -0
  762. package/dist/companion/personas/types.d.ts +34 -0
  763. package/dist/companion/personas/types.js +8 -0
  764. package/dist/companion/photo-memory-fr.d.ts +36 -0
  765. package/dist/companion/photo-memory-fr.js +291 -0
  766. package/dist/companion/prefetch-config.d.ts +38 -0
  767. package/dist/companion/prefetch-config.js +119 -0
  768. package/dist/companion/prefetch-engine.d.ts +87 -0
  769. package/dist/companion/prefetch-engine.js +513 -0
  770. package/dist/companion/presence-loop.d.ts +85 -0
  771. package/dist/companion/presence-loop.js +297 -0
  772. package/dist/companion/privacy.js +3 -2
  773. package/dist/companion/proactive-engine.d.ts +97 -0
  774. package/dist/companion/proactive-engine.js +447 -0
  775. package/dist/companion/recent-said.d.ts +30 -0
  776. package/dist/companion/recent-said.js +98 -0
  777. package/dist/companion/relational-benchmark-scenarios.d.ts +191 -0
  778. package/dist/companion/relational-benchmark-scenarios.js +227 -0
  779. package/dist/companion/relational-context.d.ts +71 -0
  780. package/dist/companion/relational-context.js +302 -0
  781. package/dist/companion/relational-episode-evaluator.d.ts +117 -0
  782. package/dist/companion/relational-episode-evaluator.js +453 -0
  783. package/dist/companion/relationship-evolution.d.ts +2 -0
  784. package/dist/companion/relationship-evolution.js +30 -0
  785. package/dist/companion/relationship-state.d.ts +106 -0
  786. package/dist/companion/relationship-state.js +293 -0
  787. package/dist/companion/reminder-runner.d.ts +33 -0
  788. package/dist/companion/reminder-runner.js +183 -0
  789. package/dist/companion/reminders.d.ts +228 -0
  790. package/dist/companion/reminders.js +906 -0
  791. package/dist/companion/reply-augment.d.ts +87 -0
  792. package/dist/companion/reply-augment.js +464 -0
  793. package/dist/companion/safety-ledger.js +19 -12
  794. package/dist/companion/self-evaluation.js +22 -23
  795. package/dist/companion/shared-photo-memory.d.ts +65 -0
  796. package/dist/companion/shared-photo-memory.js +145 -0
  797. package/dist/companion/shared-photos.d.ts +88 -0
  798. package/dist/companion/shared-photos.js +321 -0
  799. package/dist/companion/signature-locations.d.ts +16 -0
  800. package/dist/companion/signature-locations.js +108 -0
  801. package/dist/companion/skill-curator.d.ts +9 -0
  802. package/dist/companion/skill-curator.js +147 -58
  803. package/dist/companion/untrusted-text.d.ts +22 -0
  804. package/dist/companion/untrusted-text.js +47 -0
  805. package/dist/companion/user-name.d.ts +18 -0
  806. package/dist/companion/user-name.js +22 -0
  807. package/dist/companion/visual-consent.d.ts +40 -0
  808. package/dist/companion/visual-consent.js +98 -0
  809. package/dist/companion/visual-grounding.d.ts +83 -0
  810. package/dist/companion/visual-grounding.js +474 -0
  811. package/dist/companion/voice-callbacks.d.ts +9 -0
  812. package/dist/companion/voice-callbacks.js +84 -0
  813. package/dist/companion/voice-guidance.d.ts +23 -0
  814. package/dist/companion/voice-guidance.js +85 -0
  815. package/dist/companion/voice-improvement-loop.d.ts +53 -0
  816. package/dist/companion/voice-improvement-loop.js +279 -0
  817. package/dist/companion/voice-incident-repair.d.ts +41 -0
  818. package/dist/companion/voice-incident-repair.js +214 -0
  819. package/dist/config/constants.d.ts +41 -0
  820. package/dist/config/constants.js +14 -0
  821. package/dist/config/env-schema.d.ts +2 -0
  822. package/dist/config/env-schema.js +714 -5
  823. package/dist/config/feature-flags.js +8 -12
  824. package/dist/config/feature-surface.d.ts +12 -0
  825. package/dist/config/feature-surface.js +86 -0
  826. package/dist/config/headless-local-prompt.d.ts +9 -0
  827. package/dist/config/headless-local-prompt.js +39 -0
  828. package/dist/config/local-runtime-context.d.ts +41 -0
  829. package/dist/config/local-runtime-context.js +430 -0
  830. package/dist/config/model-registry.js +4 -0
  831. package/dist/config/model-strengths.d.ts +14 -0
  832. package/dist/config/model-strengths.js +15 -0
  833. package/dist/config/model-tools.d.ts +56 -0
  834. package/dist/config/model-tools.js +819 -21
  835. package/dist/config/secret-ref.d.ts +22 -3
  836. package/dist/config/secret-ref.js +103 -41
  837. package/dist/config/toml-config.d.ts +20 -4
  838. package/dist/config/toml-config.js +40 -2
  839. package/dist/context/auto-compact-threshold.d.ts +1 -1
  840. package/dist/context/auto-compact-threshold.js +1 -1
  841. package/dist/context/codebase-map.js +9 -4
  842. package/dist/context/codebase-rag/codebase-rag.js +7 -6
  843. package/dist/context/codebase-rag/hnsw-store.js +9 -4
  844. package/dist/context/codebase-rag/vector-store.js +4 -4
  845. package/dist/context/compaction/parallel-summarizer.js +1 -0
  846. package/dist/context/compression.js +25 -29
  847. package/dist/context/context-manager-v2.d.ts +95 -7
  848. package/dist/context/context-manager-v2.js +442 -89
  849. package/dist/context/context-manager-v3.d.ts +4 -0
  850. package/dist/context/context-manager-v3.js +68 -9
  851. package/dist/context/cross-encoder-reranker.js +8 -3
  852. package/dist/context/default-context-engine.js +1 -1
  853. package/dist/context/enhanced-compression.d.ts +26 -2
  854. package/dist/context/enhanced-compression.js +81 -30
  855. package/dist/context/file-mentions.d.ts +46 -0
  856. package/dist/context/file-mentions.js +245 -0
  857. package/dist/context/importance-scorer.js +4 -3
  858. package/dist/context/jit-context.d.ts +7 -0
  859. package/dist/context/jit-context.js +22 -4
  860. package/dist/context/lm-resizer-compressor.d.ts +102 -0
  861. package/dist/context/lm-resizer-compressor.js +593 -0
  862. package/dist/context/precompaction-flush.js +1 -1
  863. package/dist/context/restorable-compression.d.ts +59 -14
  864. package/dist/context/restorable-compression.js +310 -60
  865. package/dist/context/segment-archive.d.ts +36 -0
  866. package/dist/context/segment-archive.js +220 -0
  867. package/dist/context/smart-compaction.d.ts +7 -0
  868. package/dist/context/smart-compaction.js +84 -15
  869. package/dist/context/token-counter.d.ts +6 -0
  870. package/dist/context/token-counter.js +41 -0
  871. package/dist/context/token-juice.d.ts +72 -0
  872. package/dist/context/token-juice.js +220 -0
  873. package/dist/context/tool-observation-optimizer.d.ts +90 -0
  874. package/dist/context/tool-observation-optimizer.js +231 -0
  875. package/dist/context/tool-pair-preserver.d.ts +1 -1
  876. package/dist/context/tool-pair-preserver.js +1 -1
  877. package/dist/context/transcript-repair.d.ts +16 -3
  878. package/dist/context/transcript-repair.js +72 -35
  879. package/dist/context/types.d.ts +2 -0
  880. package/dist/conversation/argument-obligations.d.ts +65 -0
  881. package/dist/conversation/argument-obligations.js +157 -0
  882. package/dist/conversation/companion-model-routing.d.ts +121 -0
  883. package/dist/conversation/companion-model-routing.js +810 -0
  884. package/dist/conversation/conversation-benchmark.d.ts +143 -0
  885. package/dist/conversation/conversation-benchmark.js +766 -0
  886. package/dist/conversation/conversation-blind-comparison.d.ts +135 -0
  887. package/dist/conversation/conversation-blind-comparison.js +451 -0
  888. package/dist/conversation/conversation-evaluator.d.ts +56 -0
  889. package/dist/conversation/conversation-evaluator.js +335 -0
  890. package/dist/conversation/conversation-orchestrator.d.ts +32 -0
  891. package/dist/conversation/conversation-orchestrator.js +59 -0
  892. package/dist/conversation/conversation-pilot-corpus.d.ts +33 -0
  893. package/dist/conversation/conversation-pilot-corpus.js +313 -0
  894. package/dist/conversation/conversation-quality.d.ts +31 -0
  895. package/dist/conversation/conversation-quality.js +280 -0
  896. package/dist/conversation/conversation-state.d.ts +23 -0
  897. package/dist/conversation/conversation-state.js +117 -0
  898. package/dist/conversation/cross-channel-bridge.d.ts +127 -0
  899. package/dist/conversation/cross-channel-bridge.js +785 -0
  900. package/dist/conversation/deliberation-thread.d.ts +18 -0
  901. package/dist/conversation/deliberation-thread.js +303 -0
  902. package/dist/conversation/dialogue-act.d.ts +11 -0
  903. package/dist/conversation/dialogue-act.js +132 -0
  904. package/dist/conversation/discourse-planner.d.ts +3 -0
  905. package/dist/conversation/discourse-planner.js +141 -0
  906. package/dist/conversation/fresh-context.d.ts +54 -0
  907. package/dist/conversation/fresh-context.js +258 -0
  908. package/dist/conversation/prefetched-turn-context.d.ts +45 -0
  909. package/dist/conversation/prefetched-turn-context.js +209 -0
  910. package/dist/conversation/relationship-safety.d.ts +37 -0
  911. package/dist/conversation/relationship-safety.js +407 -0
  912. package/dist/conversation/semantic-response-gate.d.ts +262 -0
  913. package/dist/conversation/semantic-response-gate.js +656 -0
  914. package/dist/conversation/semantic-response-runtime.d.ts +79 -0
  915. package/dist/conversation/semantic-response-runtime.js +419 -0
  916. package/dist/conversation/shared-relationship-state.d.ts +60 -0
  917. package/dist/conversation/shared-relationship-state.js +262 -0
  918. package/dist/conversation/types.d.ts +77 -0
  919. package/dist/conversation/types.js +3 -0
  920. package/dist/conversation/voice-continuity.d.ts +13 -0
  921. package/dist/conversation/voice-continuity.js +48 -0
  922. package/dist/council/conductor.d.ts +26 -0
  923. package/dist/council/conductor.js +292 -0
  924. package/dist/council/council-engine.d.ts +29 -0
  925. package/dist/council/council-engine.js +458 -0
  926. package/dist/council/deliberation-health.d.ts +58 -0
  927. package/dist/council/deliberation-health.js +108 -0
  928. package/dist/council/judge.d.ts +69 -0
  929. package/dist/council/judge.js +183 -0
  930. package/dist/council/peers.d.ts +19 -0
  931. package/dist/council/peers.js +47 -0
  932. package/dist/council/signals.d.ts +26 -0
  933. package/dist/council/signals.js +156 -0
  934. package/dist/council/task-types.d.ts +16 -0
  935. package/dist/council/task-types.js +58 -0
  936. package/dist/council/triage.d.ts +48 -0
  937. package/dist/council/triage.js +228 -0
  938. package/dist/council/types.d.ts +292 -0
  939. package/dist/council/types.js +20 -0
  940. package/dist/council/with-timeout.d.ts +10 -0
  941. package/dist/council/with-timeout.js +29 -0
  942. package/dist/curator/curator.d.ts +79 -0
  943. package/dist/curator/curator.js +317 -0
  944. package/dist/daemon/agent-task-executor.js +51 -0
  945. package/dist/daemon/autonomous-daemon.d.ts +2 -0
  946. package/dist/daemon/autonomous-daemon.js +4 -1
  947. package/dist/daemon/autonomous-loop.d.ts +9 -0
  948. package/dist/daemon/autonomous-loop.js +57 -1
  949. package/dist/daemon/autonomy-bench-candidates.d.ts +33 -0
  950. package/dist/daemon/autonomy-bench-candidates.js +68 -0
  951. package/dist/daemon/autonomy-briefing.d.ts +112 -0
  952. package/dist/daemon/autonomy-briefing.js +359 -0
  953. package/dist/daemon/autonomy-run-journal.d.ts +20 -0
  954. package/dist/daemon/autonomy-run-journal.js +41 -0
  955. package/dist/daemon/daily-reset.d.ts +2 -2
  956. package/dist/daemon/daily-reset.js +16 -15
  957. package/dist/daemon/ollama-task-executor.js +9 -1
  958. package/dist/database/database-manager.d.ts +1 -1
  959. package/dist/database/database-manager.js +6 -4
  960. package/dist/database/optional-sqlite.d.ts +20 -0
  961. package/dist/database/optional-sqlite.js +101 -0
  962. package/dist/design/design-system-registry.d.ts +21 -0
  963. package/dist/design/design-system-registry.js +106 -0
  964. package/dist/desktop/codebuddy-engine-adapter.d.ts +34 -0
  965. package/dist/desktop/codebuddy-engine-adapter.js +306 -21
  966. package/dist/desktop/electron-launch-args.d.ts +7 -0
  967. package/dist/desktop/electron-launch-args.js +13 -0
  968. package/dist/desktop/engine-adapter.d.ts +6 -0
  969. package/dist/desktop/launcher.js +2 -1
  970. package/dist/desktop/permission-bridge.d.ts +12 -1
  971. package/dist/desktop/permission-bridge.js +12 -5
  972. package/dist/desktop-automation/omniparser-runner.d.ts +1 -0
  973. package/dist/desktop-automation/omniparser-runner.js +12 -1
  974. package/dist/desktop-automation/smart-snapshot.js +7 -0
  975. package/dist/desktop-automation/windows-native-provider.js +1 -1
  976. package/dist/doctor/assistant-runtime.d.ts +90 -0
  977. package/dist/doctor/assistant-runtime.js +472 -0
  978. package/dist/doctor/env-sanity.d.ts +17 -0
  979. package/dist/doctor/env-sanity.js +74 -0
  980. package/dist/doctor/index.d.ts +37 -0
  981. package/dist/doctor/index.js +389 -37
  982. package/dist/doctor/llm-key-check.d.ts +17 -0
  983. package/dist/doctor/llm-key-check.js +100 -0
  984. package/dist/doctor/ollama-model-selection.d.ts +16 -0
  985. package/dist/doctor/ollama-model-selection.js +55 -0
  986. package/dist/embeddings/embedding-provider.d.ts +1 -0
  987. package/dist/embeddings/embedding-provider.js +21 -9
  988. package/dist/errors/crash-recovery.js +6 -4
  989. package/dist/events/index.d.ts +1 -1
  990. package/dist/events/types.d.ts +44 -0
  991. package/dist/export/repo-explanation.d.ts +10 -0
  992. package/dist/export/repo-explanation.js +334 -0
  993. package/dist/export/session-share.d.ts +34 -0
  994. package/dist/export/session-share.js +687 -0
  995. package/dist/fleet/autonomous-tick-broadcaster.d.ts +1 -1
  996. package/dist/fleet/capability-registry.d.ts +9 -0
  997. package/dist/fleet/capability-registry.js +268 -56
  998. package/dist/fleet/colab-store.d.ts +3 -4
  999. package/dist/fleet/colab-store.js +6 -26
  1000. package/dist/fleet/compatible-model.d.ts +39 -0
  1001. package/dist/fleet/compatible-model.js +148 -0
  1002. package/dist/fleet/consolidation/collecte.d.ts +31 -0
  1003. package/dist/fleet/consolidation/collecte.js +86 -0
  1004. package/dist/fleet/consolidation/digest-texte.d.ts +11 -0
  1005. package/dist/fleet/consolidation/digest-texte.js +52 -0
  1006. package/dist/fleet/consolidation/thalamus.d.ts +35 -0
  1007. package/dist/fleet/consolidation/thalamus.js +151 -0
  1008. package/dist/fleet/consolidation/types.d.ts +66 -0
  1009. package/dist/fleet/consolidation/types.js +22 -0
  1010. package/dist/fleet/cost-tracker.d.ts +11 -0
  1011. package/dist/fleet/cost-tracker.js +64 -17
  1012. package/dist/fleet/fleet-cost-cap.d.ts +36 -0
  1013. package/dist/fleet/fleet-cost-cap.js +175 -0
  1014. package/dist/fleet/fleet-http-surface.d.ts +24 -0
  1015. package/dist/fleet/fleet-http-surface.js +72 -0
  1016. package/dist/fleet/fleet-listener.d.ts +1 -1
  1017. package/dist/fleet/fleet-listener.js +4 -0
  1018. package/dist/fleet/model-capability-heuristics.d.ts +31 -0
  1019. package/dist/fleet/model-capability-heuristics.js +49 -0
  1020. package/dist/fleet/model-inventory.d.ts +46 -0
  1021. package/dist/fleet/model-inventory.js +242 -0
  1022. package/dist/fleet/model-scoreboard.d.ts +118 -13
  1023. package/dist/fleet/model-scoreboard.js +339 -27
  1024. package/dist/fleet/model-selector.d.ts +83 -0
  1025. package/dist/fleet/model-selector.js +218 -0
  1026. package/dist/fleet/peer-chat-bridge.d.ts +9 -2
  1027. package/dist/fleet/peer-chat-bridge.js +133 -19
  1028. package/dist/fleet/peer-chat-client-factory.d.ts +28 -2
  1029. package/dist/fleet/peer-chat-client-factory.js +195 -22
  1030. package/dist/fleet/peer-ckg-bridge.d.ts +67 -0
  1031. package/dist/fleet/peer-ckg-bridge.js +467 -0
  1032. package/dist/fleet/peer-mission-exchange-bridge.d.ts +8 -0
  1033. package/dist/fleet/peer-mission-exchange-bridge.js +127 -0
  1034. package/dist/fleet/peer-session-bridge.d.ts +7 -1
  1035. package/dist/fleet/peer-session-bridge.js +98 -17
  1036. package/dist/fleet/peer-session-store.d.ts +2 -0
  1037. package/dist/fleet/peer-session-store.js +6 -5
  1038. package/dist/fleet/peer-text-sanitizer.d.ts +59 -0
  1039. package/dist/fleet/peer-text-sanitizer.js +99 -0
  1040. package/dist/fleet/peer-tool-bridge.js +38 -10
  1041. package/dist/fleet/privacy-lint.js +80 -8
  1042. package/dist/fleet/saga-store.d.ts +25 -1
  1043. package/dist/fleet/saga-store.js +34 -6
  1044. package/dist/fleet/task-router.d.ts +17 -1
  1045. package/dist/fleet/task-router.js +65 -20
  1046. package/dist/fleet/types.d.ts +9 -5
  1047. package/dist/gateway/device-pairing.js +5 -11
  1048. package/dist/gateway/ws-transport.d.ts +1 -5
  1049. package/dist/gateway/ws-transport.js +2 -22
  1050. package/dist/git/changelog.d.ts +36 -0
  1051. package/dist/git/changelog.js +109 -0
  1052. package/dist/git/worktree-sessions.js +1 -1
  1053. package/dist/goals/counterfactual-forge.d.ts +70 -0
  1054. package/dist/goals/counterfactual-forge.js +184 -0
  1055. package/dist/goals/criterion-progress.d.ts +24 -0
  1056. package/dist/goals/criterion-progress.js +59 -0
  1057. package/dist/goals/evidence-artifact.d.ts +18 -0
  1058. package/dist/goals/evidence-artifact.js +76 -0
  1059. package/dist/goals/goal-decomposer.d.ts +15 -0
  1060. package/dist/goals/goal-decomposer.js +89 -4
  1061. package/dist/goals/goal-loop.d.ts +29 -0
  1062. package/dist/goals/goal-loop.js +92 -6
  1063. package/dist/goals/goal-manager.d.ts +1 -0
  1064. package/dist/goals/goal-manager.js +4 -1
  1065. package/dist/goals/goal-state.d.ts +10 -0
  1066. package/dist/goals/goal-state.js +21 -1
  1067. package/dist/goals/goal-store.js +4 -6
  1068. package/dist/goals/index.d.ts +11 -0
  1069. package/dist/goals/index.js +11 -0
  1070. package/dist/goals/intent-graph.d.ts +40 -0
  1071. package/dist/goals/intent-graph.js +133 -0
  1072. package/dist/goals/mission-constitution.d.ts +59 -0
  1073. package/dist/goals/mission-constitution.js +132 -0
  1074. package/dist/goals/mission-exchange.d.ts +86 -0
  1075. package/dist/goals/mission-exchange.js +216 -0
  1076. package/dist/goals/outcome-capsule.d.ts +80 -0
  1077. package/dist/goals/outcome-capsule.js +186 -0
  1078. package/dist/goals/proof-ledger.d.ts +79 -0
  1079. package/dist/goals/proof-ledger.js +181 -0
  1080. package/dist/goals/proven-outcome-lessons.d.ts +11 -0
  1081. package/dist/goals/proven-outcome-lessons.js +30 -0
  1082. package/dist/goals/proven-outcome-memory.d.ts +55 -0
  1083. package/dist/goals/proven-outcome-memory.js +125 -0
  1084. package/dist/goals/shadow-twin.d.ts +57 -0
  1085. package/dist/goals/shadow-twin.js +110 -0
  1086. package/dist/gpu-worker/gpu-media-worker-server.d.ts +49 -0
  1087. package/dist/gpu-worker/gpu-media-worker-server.js +637 -0
  1088. package/dist/harness/contract.d.ts +84 -84
  1089. package/dist/hooks/advanced-hooks.js +6 -4
  1090. package/dist/hooks/env-persistence.js +5 -6
  1091. package/dist/hooks/hook-manager.js +8 -7
  1092. package/dist/hooks/hook-system.js +6 -4
  1093. package/dist/hooks/lifecycle-hooks.js +6 -3
  1094. package/dist/hooks/moltbot/moltbot-hooks-manager.js +8 -3
  1095. package/dist/hooks/moltbot/session-persistence-manager.js +15 -7
  1096. package/dist/hooks/moltbot/setup-utilities.js +6 -4
  1097. package/dist/hooks/smart-hooks.js +6 -4
  1098. package/dist/hooks/use-input-handler.js +9 -63
  1099. package/dist/hooks/user-hooks.d.ts +10 -1
  1100. package/dist/hooks/user-hooks.js +77 -1
  1101. package/dist/identity/companion-identity.d.ts +4 -1
  1102. package/dist/identity/companion-identity.js +134 -4
  1103. package/dist/identity/identity-manager.d.ts +1 -1
  1104. package/dist/identity/identity-manager.js +7 -6
  1105. package/dist/identity/lisa-introspection.d.ts +36 -0
  1106. package/dist/identity/lisa-introspection.js +411 -0
  1107. package/dist/identity/operational-self-model.d.ts +143 -0
  1108. package/dist/identity/operational-self-model.js +974 -0
  1109. package/dist/index.d.ts +3 -1
  1110. package/dist/index.js +987 -223
  1111. package/dist/input/context-mentions.d.ts +7 -1
  1112. package/dist/input/context-mentions.js +18 -20
  1113. package/dist/input/text-to-speech.d.ts +3 -0
  1114. package/dist/input/text-to-speech.js +70 -27
  1115. package/dist/input/voice-control.d.ts +1 -0
  1116. package/dist/input/voice-control.js +24 -18
  1117. package/dist/input/voice-input-enhanced.d.ts +1 -0
  1118. package/dist/input/voice-input-enhanced.js +31 -16
  1119. package/dist/integrations/ci-autofix-pipeline.js +15 -20
  1120. package/dist/integrations/ide/server.js +3 -2
  1121. package/dist/integrations/json-rpc/server.js +4 -2
  1122. package/dist/integrations/mcp/mcp-server.js +4 -2
  1123. package/dist/integrations/opentelemetry-integration.js +6 -4
  1124. package/dist/integrations/pubcommander-bridge.d.ts +5 -0
  1125. package/dist/integrations/pubcommander-bridge.js +61 -0
  1126. package/dist/integrations/sentry-integration.js +9 -3
  1127. package/dist/intelligence/semantic-search.js +9 -12
  1128. package/dist/intelligence/user-preferences.js +8 -11
  1129. package/dist/intents/intent-checker.d.ts +34 -0
  1130. package/dist/intents/intent-checker.js +175 -0
  1131. package/dist/intents/intent-generator.d.ts +12 -0
  1132. package/dist/intents/intent-generator.js +86 -0
  1133. package/dist/intents/intent-store.d.ts +62 -0
  1134. package/dist/intents/intent-store.js +263 -0
  1135. package/dist/interpreter/computer/skills.js +3 -2
  1136. package/dist/interpreter/interpreter-service.js +18 -9
  1137. package/dist/kanban/kanban-board-registry.js +6 -4
  1138. package/dist/kanban/kanban-store.js +5 -7
  1139. package/dist/knowledge/code-graph-persistence.js +8 -16
  1140. package/dist/knowledge/graph-drift.js +14 -11
  1141. package/dist/knowledge/knowledge-manager.js +2 -1
  1142. package/dist/knowledge/scanners/index.d.ts +3 -0
  1143. package/dist/knowledge/scanners/index.js +57 -29
  1144. package/dist/knowledge/workspace-indexer.js +22 -15
  1145. package/dist/life-rhythm/cooking-timer-store.d.ts +50 -0
  1146. package/dist/life-rhythm/cooking-timer-store.js +240 -0
  1147. package/dist/life-rhythm/day-context.d.ts +30 -0
  1148. package/dist/life-rhythm/day-context.js +198 -0
  1149. package/dist/life-rhythm/etalab-holiday-provider.d.ts +40 -0
  1150. package/dist/life-rhythm/etalab-holiday-provider.js +318 -0
  1151. package/dist/life-rhythm/home-mode-store.d.ts +32 -0
  1152. package/dist/life-rhythm/home-mode-store.js +184 -0
  1153. package/dist/life-rhythm/index.d.ts +6 -0
  1154. package/dist/life-rhythm/index.js +7 -0
  1155. package/dist/life-rhythm/types.d.ts +88 -0
  1156. package/dist/life-rhythm/types.js +33 -0
  1157. package/dist/life-rhythm/zoned-minute.d.ts +24 -0
  1158. package/dist/life-rhythm/zoned-minute.js +113 -0
  1159. package/dist/location/index.d.ts +2 -12
  1160. package/dist/location/index.js +129 -56
  1161. package/dist/logging/interaction-logger.js +29 -46
  1162. package/dist/lora/dataset-v3-plan.d.ts +27 -0
  1163. package/dist/lora/dataset-v3-plan.js +121 -0
  1164. package/dist/lora/dataset.d.ts +26 -0
  1165. package/dist/lora/dataset.js +165 -0
  1166. package/dist/lora/fal-krea-trainer.d.ts +54 -0
  1167. package/dist/lora/fal-krea-trainer.js +197 -0
  1168. package/dist/lora/generate-training-set.d.ts +61 -0
  1169. package/dist/lora/generate-training-set.js +190 -0
  1170. package/dist/lora/identity-dataset-gate.d.ts +104 -0
  1171. package/dist/lora/identity-dataset-gate.js +204 -0
  1172. package/dist/lora/identity-dataset-promotion.d.ts +32 -0
  1173. package/dist/lora/identity-dataset-promotion.js +269 -0
  1174. package/dist/lora/index.d.ts +11 -0
  1175. package/dist/lora/index.js +12 -0
  1176. package/dist/lora/install-comfy.d.ts +14 -0
  1177. package/dist/lora/install-comfy.js +63 -0
  1178. package/dist/lora/lisa-avatar-bible.d.ts +85 -0
  1179. package/dist/lora/lisa-avatar-bible.js +275 -0
  1180. package/dist/lora/local-plan.d.ts +10 -0
  1181. package/dist/lora/local-plan.js +205 -0
  1182. package/dist/lora/pack-dataset.d.ts +7 -0
  1183. package/dist/lora/pack-dataset.js +39 -0
  1184. package/dist/lora/quality-gate.d.ts +31 -0
  1185. package/dist/lora/quality-gate.js +90 -0
  1186. package/dist/lora/types.d.ts +66 -0
  1187. package/dist/lora/types.js +5 -0
  1188. package/dist/lsp/lsp-client.d.ts +12 -0
  1189. package/dist/lsp/lsp-client.js +45 -9
  1190. package/dist/lsp/server.js +1 -1
  1191. package/dist/mcp/approval-elicitation.d.ts +1 -0
  1192. package/dist/mcp/approval-elicitation.js +2 -0
  1193. package/dist/mcp/client.d.ts +15 -1
  1194. package/dist/mcp/client.js +110 -24
  1195. package/dist/mcp/config.d.ts +12 -1
  1196. package/dist/mcp/config.js +55 -12
  1197. package/dist/mcp/index.d.ts +1 -1
  1198. package/dist/mcp/mcp-agent-tools.d.ts +1 -1
  1199. package/dist/mcp/mcp-agent-tools.js +76 -73
  1200. package/dist/mcp/mcp-ckg-tools.d.ts +31 -0
  1201. package/dist/mcp/mcp-ckg-tools.js +121 -0
  1202. package/dist/mcp/mcp-client.js +8 -5
  1203. package/dist/mcp/mcp-desktop-tools.d.ts +1 -1
  1204. package/dist/mcp/mcp-desktop-tools.js +105 -99
  1205. package/dist/mcp/mcp-memory-tools.d.ts +1 -1
  1206. package/dist/mcp/mcp-memory-tools.js +63 -61
  1207. package/dist/mcp/mcp-oauth.js +5 -2
  1208. package/dist/mcp/mcp-server.d.ts +48 -79
  1209. package/dist/mcp/mcp-server.js +445 -478
  1210. package/dist/mcp/mcp-session-tools.d.ts +1 -1
  1211. package/dist/mcp/mcp-session-tools.js +95 -92
  1212. package/dist/mcp/profiles.d.ts +18 -0
  1213. package/dist/mcp/profiles.js +65 -0
  1214. package/dist/mcp/prompt-footprint.d.ts +21 -0
  1215. package/dist/mcp/prompt-footprint.js +39 -0
  1216. package/dist/meals/allergens.d.ts +19 -0
  1217. package/dist/meals/allergens.js +122 -0
  1218. package/dist/meals/compatibility.d.ts +6 -0
  1219. package/dist/meals/compatibility.js +109 -0
  1220. package/dist/meals/food-inventory-store.d.ts +51 -0
  1221. package/dist/meals/food-inventory-store.js +257 -0
  1222. package/dist/meals/index.d.ts +10 -0
  1223. package/dist/meals/index.js +11 -0
  1224. package/dist/meals/meal-engine.d.ts +7 -0
  1225. package/dist/meals/meal-engine.js +206 -0
  1226. package/dist/meals/meal-plan-store.d.ts +73 -0
  1227. package/dist/meals/meal-plan-store.js +271 -0
  1228. package/dist/meals/private-json-store.d.ts +9 -0
  1229. package/dist/meals/private-json-store.js +92 -0
  1230. package/dist/meals/profile-store.d.ts +49 -0
  1231. package/dist/meals/profile-store.js +296 -0
  1232. package/dist/meals/profile-validator.d.ts +7 -0
  1233. package/dist/meals/profile-validator.js +124 -0
  1234. package/dist/meals/recipe-normalizer.d.ts +7 -0
  1235. package/dist/meals/recipe-normalizer.js +162 -0
  1236. package/dist/meals/store-validation.d.ts +21 -0
  1237. package/dist/meals/store-validation.js +101 -0
  1238. package/dist/meals/types.d.ts +170 -0
  1239. package/dist/meals/types.js +12 -0
  1240. package/dist/media/comfy-health-supervisor.d.ts +142 -0
  1241. package/dist/media/comfy-health-supervisor.js +608 -0
  1242. package/dist/media/comfyui-recipe-contract.d.ts +696 -0
  1243. package/dist/media/comfyui-recipe-contract.js +580 -0
  1244. package/dist/media/comfyui-recipe-engine.d.ts +3 -0
  1245. package/dist/media/comfyui-recipe-engine.js +4 -0
  1246. package/dist/media/comfyui-recipe-registry.d.ts +35 -0
  1247. package/dist/media/comfyui-recipe-registry.js +385 -0
  1248. package/dist/media/comfyui-recipe-runtime.d.ts +135 -0
  1249. package/dist/media/comfyui-recipe-runtime.js +942 -0
  1250. package/dist/media/content-tier.d.ts +25 -0
  1251. package/dist/media/content-tier.js +29 -0
  1252. package/dist/meeting/analyzer.d.ts +24 -0
  1253. package/dist/meeting/analyzer.js +402 -0
  1254. package/dist/meeting/index.d.ts +13 -0
  1255. package/dist/meeting/index.js +48 -0
  1256. package/dist/meeting/markdown.d.ts +3 -0
  1257. package/dist/meeting/markdown.js +51 -0
  1258. package/dist/meeting/output.d.ts +13 -0
  1259. package/dist/meeting/output.js +155 -0
  1260. package/dist/meeting/transcript.d.ts +25 -0
  1261. package/dist/meeting/transcript.js +292 -0
  1262. package/dist/meeting/types.d.ts +112 -0
  1263. package/dist/meeting/types.js +9 -0
  1264. package/dist/memory/adapters/network-memory-adapters.d.ts +19 -4
  1265. package/dist/memory/adapters/network-memory-adapters.js +4 -4
  1266. package/dist/memory/auto-memory.js +5 -2
  1267. package/dist/memory/background-extractor.d.ts +43 -0
  1268. package/dist/memory/background-extractor.js +368 -0
  1269. package/dist/memory/buddy-memory-client.d.ts +40 -0
  1270. package/dist/memory/buddy-memory-client.js +198 -0
  1271. package/dist/memory/ckg-engine-policy.d.ts +19 -0
  1272. package/dist/memory/ckg-engine-policy.js +45 -0
  1273. package/dist/memory/ckg-fact-reconciliation.d.ts +81 -0
  1274. package/dist/memory/ckg-fact-reconciliation.js +155 -0
  1275. package/dist/memory/ckg-redaction.d.ts +2 -0
  1276. package/dist/memory/ckg-redaction.js +25 -0
  1277. package/dist/memory/coding-style-analyzer.js +2 -2
  1278. package/dist/memory/collective-knowledge-graph.d.ts +380 -0
  1279. package/dist/memory/collective-knowledge-graph.js +1228 -0
  1280. package/dist/memory/enhanced-memory.d.ts +29 -0
  1281. package/dist/memory/enhanced-memory.js +153 -63
  1282. package/dist/memory/facts-memory.d.ts +9 -4
  1283. package/dist/memory/facts-memory.js +21 -4
  1284. package/dist/memory/hybrid-mmr.d.ts +71 -0
  1285. package/dist/memory/hybrid-mmr.js +127 -0
  1286. package/dist/memory/hybrid-search.js +4 -1
  1287. package/dist/memory/knowledge-graph.d.ts +23 -2
  1288. package/dist/memory/knowledge-graph.js +62 -47
  1289. package/dist/memory/memory-candidate-queue.js +9 -4
  1290. package/dist/memory/memory-consolidation.d.ts +8 -0
  1291. package/dist/memory/memory-consolidation.js +66 -17
  1292. package/dist/memory/memory-forgetting.d.ts +57 -0
  1293. package/dist/memory/memory-forgetting.js +87 -0
  1294. package/dist/memory/ocr-memory-pipeline.js +16 -10
  1295. package/dist/memory/persistent-memory.d.ts +98 -0
  1296. package/dist/memory/persistent-memory.js +711 -119
  1297. package/dist/memory/presence-injector.d.ts +1 -1
  1298. package/dist/memory/presence-injector.js +9 -4
  1299. package/dist/memory/semantic-memory-search.js +12 -9
  1300. package/dist/memory/subagent-memory.js +8 -8
  1301. package/dist/memory/user-model.js +9 -4
  1302. package/dist/metrics/metrics-collector.d.ts +1 -0
  1303. package/dist/metrics/metrics-collector.js +11 -2
  1304. package/dist/nodes/device-node.d.ts +5 -2
  1305. package/dist/nodes/device-node.js +65 -19
  1306. package/dist/nodes/index.d.ts +32 -2
  1307. package/dist/nodes/index.js +208 -7
  1308. package/dist/nodes/transports/adb-transport.d.ts +2 -6
  1309. package/dist/nodes/transports/adb-transport.js +29 -13
  1310. package/dist/nodes/transports/base-transport.d.ts +10 -0
  1311. package/dist/observability/run-store.d.ts +6 -1
  1312. package/dist/observability/run-store.js +89 -22
  1313. package/dist/observability/run-trajectory-load.d.ts +16 -0
  1314. package/dist/observability/run-trajectory-load.js +266 -0
  1315. package/dist/observability/run-trajectory.d.ts +168 -0
  1316. package/dist/observability/run-trajectory.js +468 -0
  1317. package/dist/observability/run-viewer.d.ts +5 -1
  1318. package/dist/observability/run-viewer.js +83 -9
  1319. package/dist/observability/turn-metrics.d.ts +86 -0
  1320. package/dist/observability/turn-metrics.js +201 -0
  1321. package/dist/offline/offline-mode.js +10 -9
  1322. package/dist/openclaw/gateway-bridge.js +3 -2
  1323. package/dist/optimization/latency-optimizer.d.ts +2 -1
  1324. package/dist/optimization/latency-optimizer.js +2 -2
  1325. package/dist/optimization/model-routing.d.ts +3 -0
  1326. package/dist/orchestration/orchestrator.js +4 -1
  1327. package/dist/orchestration/types.d.ts +2 -0
  1328. package/dist/performance/lazy-loader.js +2 -1
  1329. package/dist/performance/tool-cache.d.ts +4 -0
  1330. package/dist/performance/tool-cache.js +4 -2
  1331. package/dist/persistence/conversation-branches.js +9 -2
  1332. package/dist/persistence/session-store.d.ts +26 -0
  1333. package/dist/persistence/session-store.js +56 -17
  1334. package/dist/personas/persona-manager.d.ts +39 -1
  1335. package/dist/personas/persona-manager.js +276 -38
  1336. package/dist/plugins/bundled/groq-provider.js +10 -7
  1337. package/dist/plugins/bundled/openrouter-provider.js +2 -1
  1338. package/dist/plugins/code-explorer/CodeExplorerManager.d.ts +52 -4
  1339. package/dist/plugins/code-explorer/CodeExplorerManager.js +201 -31
  1340. package/dist/plugins/code-explorer/code-explorer-client.d.ts +36 -0
  1341. package/dist/plugins/code-explorer/code-explorer-client.js +86 -0
  1342. package/dist/plugins/code-explorer/index.d.ts +1 -3
  1343. package/dist/plugins/code-explorer/index.js +0 -1
  1344. package/dist/plugins/git-pinned-marketplace.js +3 -2
  1345. package/dist/plugins/plugin-manager.js +6 -9
  1346. package/dist/plugins/sandbox-worker.js +1 -1
  1347. package/dist/prompts/system-base.js +27 -3
  1348. package/dist/protocols/a2a/codebuddy-executor.d.ts +9 -0
  1349. package/dist/protocols/a2a/codebuddy-executor.js +25 -6
  1350. package/dist/protocols/a2a/index.d.ts +6 -0
  1351. package/dist/protocols/a2a/index.js +32 -3
  1352. package/dist/protocols/acp/acp-agentic-runner.d.ts +6 -2
  1353. package/dist/protocols/acp/acp-agentic-runner.js +91 -15
  1354. package/dist/protocols/acp/acp-session-store.js +28 -5
  1355. package/dist/protocols/acp/acp-stdio-server.d.ts +13 -0
  1356. package/dist/protocols/acp/acp-stdio-server.js +30 -3
  1357. package/dist/providers/active-llm-model-pool.d.ts +45 -0
  1358. package/dist/providers/active-llm-model-pool.js +139 -0
  1359. package/dist/providers/active-llm-registry.js +48 -8
  1360. package/dist/providers/auxiliary-provider.d.ts +1 -1
  1361. package/dist/providers/auxiliary-provider.js +23 -10
  1362. package/dist/providers/chatgpt-models.d.ts +71 -0
  1363. package/dist/providers/chatgpt-models.js +302 -0
  1364. package/dist/providers/codex-oauth.d.ts +8 -0
  1365. package/dist/providers/codex-oauth.js +47 -39
  1366. package/dist/providers/gemini-oauth.js +7 -6
  1367. package/dist/providers/grok-provider.js +1 -1
  1368. package/dist/providers/index.d.ts +3 -0
  1369. package/dist/providers/index.js +3 -0
  1370. package/dist/providers/local-model-resolver.d.ts +66 -0
  1371. package/dist/providers/local-model-resolver.js +128 -0
  1372. package/dist/providers/model-egress.d.ts +8 -0
  1373. package/dist/providers/model-egress.js +62 -0
  1374. package/dist/providers/model-provider-compat.d.ts +13 -0
  1375. package/dist/providers/model-provider-compat.js +48 -0
  1376. package/dist/providers/provider-catalog.d.ts +4 -1
  1377. package/dist/providers/provider-catalog.js +494 -28
  1378. package/dist/providers/provider-failover-notify.d.ts +15 -0
  1379. package/dist/providers/provider-failover-notify.js +93 -0
  1380. package/dist/providers/provider-failover-policy.d.ts +28 -0
  1381. package/dist/providers/provider-failover-policy.js +188 -0
  1382. package/dist/providers/provider-failover-user-notice.d.ts +13 -0
  1383. package/dist/providers/provider-failover-user-notice.js +49 -0
  1384. package/dist/providers/provider-fallback.d.ts +1 -0
  1385. package/dist/providers/provider-fallback.js +1 -1
  1386. package/dist/providers/provider-health.d.ts +46 -0
  1387. package/dist/providers/provider-health.js +249 -0
  1388. package/dist/providers/turboquant-provider.d.ts +1 -1
  1389. package/dist/providers/xai-oauth.js +7 -34
  1390. package/dist/queue/persistent-queue.js +9 -6
  1391. package/dist/renderers/charts/special-charts.d.ts +7 -1
  1392. package/dist/renderers/charts/special-charts.js +5 -0
  1393. package/dist/renderers/weather-conditions.d.ts +20 -0
  1394. package/dist/renderers/weather-conditions.js +74 -0
  1395. package/dist/renderers/weather-renderer.js +4 -18
  1396. package/dist/rendering/ansi.d.ts +4 -0
  1397. package/dist/rendering/ansi.js +149 -0
  1398. package/dist/rendering/index.d.ts +19 -0
  1399. package/dist/rendering/index.js +18 -0
  1400. package/dist/rendering/markdown-core.d.ts +13 -0
  1401. package/dist/rendering/markdown-core.js +18 -0
  1402. package/dist/rendering/plain.d.ts +2 -0
  1403. package/dist/rendering/plain.js +91 -0
  1404. package/dist/rendering/telegram-html.d.ts +27 -0
  1405. package/dist/rendering/telegram-html.js +290 -0
  1406. package/dist/research/auto-ingest.d.ts +45 -0
  1407. package/dist/research/auto-ingest.js +85 -0
  1408. package/dist/research/code-explorer-source.d.ts +29 -0
  1409. package/dist/research/code-explorer-source.js +76 -0
  1410. package/dist/research/connector-source.d.ts +25 -0
  1411. package/dist/research/connector-source.js +314 -0
  1412. package/dist/research/paper-qa/answer.d.ts +72 -0
  1413. package/dist/research/paper-qa/answer.js +227 -0
  1414. package/dist/research/paper-qa/corpus.d.ts +36 -0
  1415. package/dist/research/paper-qa/corpus.js +102 -0
  1416. package/dist/research/paper-qa/disk-embedding-cache.d.ts +28 -0
  1417. package/dist/research/paper-qa/disk-embedding-cache.js +193 -0
  1418. package/dist/research/paper-qa/index.d.ts +31 -0
  1419. package/dist/research/paper-qa/index.js +24 -0
  1420. package/dist/research/paper-qa/paper-qa-pipeline.d.ts +107 -0
  1421. package/dist/research/paper-qa/paper-qa-pipeline.js +163 -0
  1422. package/dist/research/paper-qa/passage-index.d.ts +203 -0
  1423. package/dist/research/paper-qa/passage-index.js +405 -0
  1424. package/dist/research/paper-qa/pdf-structure.d.ts +37 -0
  1425. package/dist/research/paper-qa/pdf-structure.js +377 -0
  1426. package/dist/research/paper-qa/persistent-corpus-index.d.ts +23 -0
  1427. package/dist/research/paper-qa/persistent-corpus-index.js +122 -0
  1428. package/dist/research/paper-qa/prose-chunker.d.ts +19 -0
  1429. package/dist/research/paper-qa/prose-chunker.js +201 -0
  1430. package/dist/research/paper-qa/provenance.d.ts +24 -0
  1431. package/dist/research/paper-qa/provenance.js +40 -0
  1432. package/dist/research/paper-qa/rcs.d.ts +78 -0
  1433. package/dist/research/paper-qa/rcs.js +200 -0
  1434. package/dist/research/paper-qa/types.d.ts +124 -0
  1435. package/dist/research/paper-qa/types.js +13 -0
  1436. package/dist/research/publication-sources.d.ts +34 -0
  1437. package/dist/research/publication-sources.js +131 -0
  1438. package/dist/research/relation-classifier.d.ts +13 -0
  1439. package/dist/research/relation-classifier.js +58 -0
  1440. package/dist/research/research-topics.d.ts +13 -0
  1441. package/dist/research/research-topics.js +81 -0
  1442. package/dist/review/apply-transaction.d.ts +40 -0
  1443. package/dist/review/apply-transaction.js +112 -0
  1444. package/dist/review/diff-model.d.ts +39 -0
  1445. package/dist/review/diff-model.js +124 -0
  1446. package/dist/review/llm-client.d.ts +30 -0
  1447. package/dist/review/llm-client.js +98 -0
  1448. package/dist/review/llm-reviewer.d.ts +16 -0
  1449. package/dist/review/llm-reviewer.js +122 -0
  1450. package/dist/review/review-engine.d.ts +54 -0
  1451. package/dist/review/review-engine.js +0 -0
  1452. package/dist/review/revision-loop.d.ts +67 -0
  1453. package/dist/review/revision-loop.js +160 -0
  1454. package/dist/review/static-gate.d.ts +13 -0
  1455. package/dist/review/static-gate.js +110 -0
  1456. package/dist/review/types.d.ts +122 -0
  1457. package/dist/review/types.js +24 -0
  1458. package/dist/review/write-gate.d.ts +55 -0
  1459. package/dist/review/write-gate.js +121 -0
  1460. package/dist/sandbox/auto-sandbox.d.ts +4 -2
  1461. package/dist/sandbox/auto-sandbox.js +14 -1
  1462. package/dist/sandbox/docker-sandbox.d.ts +39 -0
  1463. package/dist/sandbox/docker-sandbox.js +292 -14
  1464. package/dist/sandbox/execpolicy.d.ts +36 -1
  1465. package/dist/sandbox/execpolicy.js +375 -40
  1466. package/dist/sandbox/os-sandbox.d.ts +53 -0
  1467. package/dist/sandbox/os-sandbox.js +315 -70
  1468. package/dist/sandbox/sandbox-backend.d.ts +2 -0
  1469. package/dist/scheduler/cron-scheduler.d.ts +1 -0
  1470. package/dist/scheduler/cron-scheduler.js +142 -41
  1471. package/dist/scripting/codebuddy-bindings.js +2 -1
  1472. package/dist/search/bm25.js +5 -2
  1473. package/dist/search/usearch-index.js +7 -5
  1474. package/dist/security/audit-logger.js +14 -7
  1475. package/dist/security/bash-allowlist/allowlist-store.d.ts +8 -2
  1476. package/dist/security/bash-allowlist/allowlist-store.js +52 -12
  1477. package/dist/security/bash-allowlist/approval-flow.d.ts +1 -1
  1478. package/dist/security/bash-allowlist/approval-flow.js +10 -8
  1479. package/dist/security/bash-allowlist/deny-guard.d.ts +14 -0
  1480. package/dist/security/bash-allowlist/deny-guard.js +61 -0
  1481. package/dist/security/bash-allowlist/types.d.ts +5 -0
  1482. package/dist/security/bash-parser.d.ts +32 -0
  1483. package/dist/security/bash-parser.js +129 -14
  1484. package/dist/security/dangerous-patterns.js +18 -3
  1485. package/dist/security/declarative-rules.d.ts +1 -1
  1486. package/dist/security/declarative-rules.js +242 -65
  1487. package/dist/security/dependency-vuln-scanner.js +4 -4
  1488. package/dist/security/dev-origins.d.ts +40 -0
  1489. package/dist/security/dev-origins.js +111 -0
  1490. package/dist/security/docker-sandbox/manager.js +1 -1
  1491. package/dist/security/env-blocklist.d.ts +7 -0
  1492. package/dist/security/env-blocklist.js +22 -2
  1493. package/dist/security/guardian-agent.d.ts +0 -5
  1494. package/dist/security/guardian-agent.js +17 -6
  1495. package/dist/security/index.d.ts +3 -0
  1496. package/dist/security/index.js +2 -0
  1497. package/dist/security/native-sandbox.d.ts +80 -0
  1498. package/dist/security/native-sandbox.js +455 -0
  1499. package/dist/security/pack-contents-policy.d.ts +49 -0
  1500. package/dist/security/pack-contents-policy.js +139 -0
  1501. package/dist/security/permission-config.js +2 -5
  1502. package/dist/security/permission-modes.d.ts +11 -0
  1503. package/dist/security/permission-modes.js +71 -7
  1504. package/dist/security/policy-amendments.js +40 -22
  1505. package/dist/security/policy-engine.js +39 -12
  1506. package/dist/security/powershell-parser.d.ts +40 -0
  1507. package/dist/security/powershell-parser.js +198 -0
  1508. package/dist/security/remote-approval.d.ts +0 -1
  1509. package/dist/security/remote-approval.js +3 -2
  1510. package/dist/security/safe-binaries.d.ts +13 -1
  1511. package/dist/security/safe-binaries.js +240 -32
  1512. package/dist/security/safe-fetch.d.ts +7 -0
  1513. package/dist/security/safe-fetch.js +101 -0
  1514. package/dist/security/sandbox.js +2 -2
  1515. package/dist/security/secret-patterns.d.ts +18 -0
  1516. package/dist/security/secret-patterns.js +232 -0
  1517. package/dist/security/secret-scrubber.d.ts +31 -0
  1518. package/dist/security/secret-scrubber.js +170 -0
  1519. package/dist/security/secrets-detector.d.ts +3 -1
  1520. package/dist/security/secrets-detector.js +3 -106
  1521. package/dist/security/security-modes.js +2 -1
  1522. package/dist/security/session-encryption.d.ts +7 -2
  1523. package/dist/security/session-encryption.js +28 -7
  1524. package/dist/security/shell-env-policy.js +11 -2
  1525. package/dist/security/skill-scanner.d.ts +2 -2
  1526. package/dist/security/skill-scanner.js +237 -11
  1527. package/dist/security/ssrf-guard.d.ts +13 -0
  1528. package/dist/security/ssrf-guard.js +27 -0
  1529. package/dist/security/text-deobfuscation.d.ts +41 -0
  1530. package/dist/security/text-deobfuscation.js +256 -0
  1531. package/dist/security/tool-permissions.js +2 -3
  1532. package/dist/security/tool-policy/approval-scope.d.ts +11 -0
  1533. package/dist/security/tool-policy/approval-scope.js +67 -0
  1534. package/dist/security/tool-policy/policy-manager.d.ts +9 -0
  1535. package/dist/security/tool-policy/policy-manager.js +28 -1
  1536. package/dist/security/tool-policy/profiles.js +24 -0
  1537. package/dist/security/tool-policy/tool-groups.js +26 -3
  1538. package/dist/security/tool-policy/types.d.ts +3 -1
  1539. package/dist/security/tool-policy/types.js +2 -0
  1540. package/dist/security/trust-folders.js +3 -2
  1541. package/dist/security/write-policy.d.ts +8 -0
  1542. package/dist/security/write-policy.js +63 -1
  1543. package/dist/self-model/evolution-notes.d.ts +51 -0
  1544. package/dist/self-model/evolution-notes.js +324 -0
  1545. package/dist/sensory/agent-reply.d.ts +136 -0
  1546. package/dist/sensory/agent-reply.js +682 -0
  1547. package/dist/sensory/alert.d.ts +18 -0
  1548. package/dist/sensory/alert.js +105 -0
  1549. package/dist/sensory/arrival-opener.d.ts +102 -0
  1550. package/dist/sensory/arrival-opener.js +292 -0
  1551. package/dist/sensory/audio-scene.d.ts +24 -0
  1552. package/dist/sensory/audio-scene.js +74 -0
  1553. package/dist/sensory/camera-keyframe-policy.d.ts +11 -0
  1554. package/dist/sensory/camera-keyframe-policy.js +43 -0
  1555. package/dist/sensory/conversation-cues.d.ts +55 -0
  1556. package/dist/sensory/conversation-cues.js +140 -0
  1557. package/dist/sensory/domain-event-bridge.d.ts +7 -0
  1558. package/dist/sensory/domain-event-bridge.js +134 -0
  1559. package/dist/sensory/dreaming.d.ts +17 -0
  1560. package/dist/sensory/dreaming.js +52 -2
  1561. package/dist/sensory/elevenlabs-library.d.ts +91 -0
  1562. package/dist/sensory/elevenlabs-library.js +303 -0
  1563. package/dist/sensory/episodic-journal.d.ts +69 -0
  1564. package/dist/sensory/episodic-journal.js +240 -0
  1565. package/dist/sensory/error-watch-reaction.d.ts +41 -0
  1566. package/dist/sensory/error-watch-reaction.js +312 -0
  1567. package/dist/sensory/heartbeat-fallback.d.ts +46 -0
  1568. package/dist/sensory/heartbeat-fallback.js +171 -0
  1569. package/dist/sensory/heartbeat-scheduler.d.ts +6 -0
  1570. package/dist/sensory/heartbeat-scheduler.js +27 -7
  1571. package/dist/sensory/hybrid-reply.d.ts +132 -0
  1572. package/dist/sensory/hybrid-reply.js +1217 -0
  1573. package/dist/sensory/reactions.d.ts +6 -0
  1574. package/dist/sensory/reactions.js +10 -1
  1575. package/dist/sensory/respond-decider.d.ts +124 -0
  1576. package/dist/sensory/respond-decider.js +608 -0
  1577. package/dist/sensory/rule-templates.d.ts +30 -0
  1578. package/dist/sensory/rule-templates.js +100 -0
  1579. package/dist/sensory/schedule-emitter.d.ts +24 -0
  1580. package/dist/sensory/schedule-emitter.js +57 -0
  1581. package/dist/sensory/screen-reaction.js +15 -1
  1582. package/dist/sensory/semantic-vision-reaction.d.ts +36 -0
  1583. package/dist/sensory/semantic-vision-reaction.js +342 -0
  1584. package/dist/sensory/sensory-action-executor.d.ts +98 -0
  1585. package/dist/sensory/sensory-action-executor.js +473 -0
  1586. package/dist/sensory/sensory-bridge.d.ts +11 -1
  1587. package/dist/sensory/sensory-bridge.js +59 -7
  1588. package/dist/sensory/sensory-rules-engine.d.ts +81 -0
  1589. package/dist/sensory/sensory-rules-engine.js +434 -0
  1590. package/dist/sensory/sensory-status.d.ts +102 -0
  1591. package/dist/sensory/sensory-status.js +291 -0
  1592. package/dist/sensory/speech-engine-config.d.ts +68 -0
  1593. package/dist/sensory/speech-engine-config.js +157 -0
  1594. package/dist/sensory/speech-reaction.d.ts +183 -7
  1595. package/dist/sensory/speech-reaction.js +2141 -35
  1596. package/dist/sensory/speech-sanitizer.d.ts +12 -0
  1597. package/dist/sensory/speech-sanitizer.js +143 -0
  1598. package/dist/sensory/system-vitals-emitter.d.ts +130 -0
  1599. package/dist/sensory/system-vitals-emitter.js +514 -0
  1600. package/dist/sensory/tts-cache.d.ts +76 -0
  1601. package/dist/sensory/tts-cache.js +0 -0
  1602. package/dist/sensory/turn-detector.d.ts +28 -0
  1603. package/dist/sensory/turn-detector.js +57 -0
  1604. package/dist/sensory/vision-description-safety.d.ts +4 -0
  1605. package/dist/sensory/vision-description-safety.js +25 -0
  1606. package/dist/sensory/vision-reaction.d.ts +21 -7
  1607. package/dist/sensory/vision-reaction.js +209 -18
  1608. package/dist/sensory/voice-activity.d.ts +69 -0
  1609. package/dist/sensory/voice-activity.js +271 -0
  1610. package/dist/sensory/voice-clock.d.ts +19 -0
  1611. package/dist/sensory/voice-clock.js +111 -0
  1612. package/dist/sensory/voice-entrainment.d.ts +62 -0
  1613. package/dist/sensory/voice-entrainment.js +176 -0
  1614. package/dist/sensory/voice-interactions.d.ts +13 -0
  1615. package/dist/sensory/voice-interactions.js +258 -0
  1616. package/dist/sensory/voice-loop.d.ts +618 -0
  1617. package/dist/sensory/voice-loop.js +3581 -0
  1618. package/dist/sensory/voice-replay-lab.d.ts +32 -0
  1619. package/dist/sensory/voice-replay-lab.js +109 -0
  1620. package/dist/sensory/voice-stream.d.ts +121 -0
  1621. package/dist/sensory/voice-stream.js +598 -0
  1622. package/dist/sensory/voice-turn-coordinator.d.ts +88 -0
  1623. package/dist/sensory/voice-turn-coordinator.js +258 -0
  1624. package/dist/sensory/voice-turn-taking.d.ts +26 -0
  1625. package/dist/sensory/voice-turn-taking.js +59 -0
  1626. package/dist/server/agent-adapter.d.ts +49 -3
  1627. package/dist/server/agent-adapter.js +26 -4
  1628. package/dist/server/channel-a2a-bridge.js +1 -1
  1629. package/dist/server/exposure-diagnostic.d.ts +25 -0
  1630. package/dist/server/exposure-diagnostic.js +51 -0
  1631. package/dist/server/heartbeat-monitor.d.ts +13 -0
  1632. package/dist/server/heartbeat-monitor.js +8 -3
  1633. package/dist/server/http-agent-sessions.d.ts +32 -0
  1634. package/dist/server/http-agent-sessions.js +245 -0
  1635. package/dist/server/index.d.ts +3 -0
  1636. package/dist/server/index.js +913 -46
  1637. package/dist/server/mcp/approval-elicitation.d.ts +144 -0
  1638. package/dist/server/mcp/approval-elicitation.js +377 -0
  1639. package/dist/server/middleware/auth.d.ts +11 -0
  1640. package/dist/server/middleware/auth.js +54 -0
  1641. package/dist/server/middleware/error-handler.d.ts +5 -0
  1642. package/dist/server/middleware/error-handler.js +30 -4
  1643. package/dist/server/middleware/index.d.ts +1 -1
  1644. package/dist/server/middleware/index.js +1 -1
  1645. package/dist/server/mobile/album.d.ts +46 -0
  1646. package/dist/server/mobile/album.js +144 -0
  1647. package/dist/server/mobile/assets/app.js +3036 -0
  1648. package/dist/server/mobile/assets/emoji-data.js +508 -0
  1649. package/dist/server/mobile/assets/icon-192.png +0 -0
  1650. package/dist/server/mobile/assets/icon-512.png +0 -0
  1651. package/dist/server/mobile/assets/icon-96.png +0 -0
  1652. package/dist/server/mobile/assets/icon.svg +12 -0
  1653. package/dist/server/mobile/assets/index.html +261 -0
  1654. package/dist/server/mobile/assets/manifest.webmanifest +37 -0
  1655. package/dist/server/mobile/assets/styles.css +831 -0
  1656. package/dist/server/mobile/assets/sw.js +149 -0
  1657. package/dist/server/mobile/chat-extras.d.ts +9 -0
  1658. package/dist/server/mobile/chat-extras.js +24 -0
  1659. package/dist/server/mobile/index.d.ts +22 -0
  1660. package/dist/server/mobile/index.js +287 -0
  1661. package/dist/server/mobile/link-preview.d.ts +24 -0
  1662. package/dist/server/mobile/link-preview.js +139 -0
  1663. package/dist/server/mobile/push.d.ts +38 -0
  1664. package/dist/server/mobile/push.js +190 -0
  1665. package/dist/server/mobile/status.d.ts +23 -0
  1666. package/dist/server/mobile/status.js +107 -0
  1667. package/dist/server/mobile/telegram-forward.d.ts +14 -0
  1668. package/dist/server/mobile/telegram-forward.js +32 -0
  1669. package/dist/server/mobile/voice-note.d.ts +54 -0
  1670. package/dist/server/mobile/voice-note.js +305 -0
  1671. package/dist/server/origin-check.d.ts +4 -5
  1672. package/dist/server/origin-check.js +43 -8
  1673. package/dist/server/routes/canvas.d.ts +7 -1
  1674. package/dist/server/routes/canvas.js +138 -24
  1675. package/dist/server/routes/chat.js +340 -203
  1676. package/dist/server/routes/cognition.d.ts +3 -0
  1677. package/dist/server/routes/cognition.js +75 -0
  1678. package/dist/server/routes/health.js +93 -81
  1679. package/dist/server/routes/index.d.ts +5 -1
  1680. package/dist/server/routes/index.js +5 -1
  1681. package/dist/server/routes/lessons.d.ts +13 -0
  1682. package/dist/server/routes/lessons.js +111 -0
  1683. package/dist/server/routes/memory.d.ts +12 -0
  1684. package/dist/server/routes/memory.js +191 -131
  1685. package/dist/server/routes/runs.d.ts +9 -0
  1686. package/dist/server/routes/runs.js +50 -0
  1687. package/dist/server/routes/sessions.js +8 -1
  1688. package/dist/server/routes/tools.js +93 -74
  1689. package/dist/server/routes/webhooks.js +56 -46
  1690. package/dist/server/tunnel-manager.js +21 -1
  1691. package/dist/server/types.d.ts +25 -1
  1692. package/dist/server/webhook-agent-queue.d.ts +12 -0
  1693. package/dist/server/webhook-agent-queue.js +58 -0
  1694. package/dist/server/websocket/cognition-bridge.d.ts +13 -0
  1695. package/dist/server/websocket/cognition-bridge.js +334 -0
  1696. package/dist/server/websocket/confirmation-bridge.d.ts +22 -0
  1697. package/dist/server/websocket/confirmation-bridge.js +178 -0
  1698. package/dist/server/websocket/desktop-handler.d.ts +17 -0
  1699. package/dist/server/websocket/desktop-handler.js +177 -16
  1700. package/dist/server/websocket/handler.d.ts +123 -1
  1701. package/dist/server/websocket/handler.js +852 -67
  1702. package/dist/server/websocket/index.d.ts +2 -1
  1703. package/dist/server/websocket/index.js +2 -1
  1704. package/dist/server/websocket/peer-rpc.d.ts +1 -1
  1705. package/dist/server/websocket/peer-rpc.js +25 -3
  1706. package/dist/services/prompt-builder.d.ts +47 -2
  1707. package/dist/services/prompt-builder.js +310 -99
  1708. package/dist/sessions/timeline-snapshot.d.ts +35 -0
  1709. package/dist/sessions/timeline-snapshot.js +144 -0
  1710. package/dist/sessions/timeline.d.ts +33 -0
  1711. package/dist/sessions/timeline.js +85 -0
  1712. package/dist/shared/context-optimization-metadata.d.ts +29 -0
  1713. package/dist/shared/context-optimization-metadata.js +73 -0
  1714. package/dist/shared/engine-types.d.ts +26 -0
  1715. package/dist/skills/bash-injection.d.ts +2 -2
  1716. package/dist/skills/bash-injection.js +9 -2
  1717. package/dist/skills/bundled/code-explorer.skill.md +50 -0
  1718. package/dist/skills/bundled/file-edit.skill.md +62 -0
  1719. package/dist/skills/bundled/git-commit.skill.md +66 -0
  1720. package/dist/skills/bundled/pubcommander-control/SKILL.md +33 -0
  1721. package/dist/skills/bundled/pubcommander-control/agents/openai.yaml +4 -0
  1722. package/dist/skills/bundled/typescript-expert.skill.md +21 -0
  1723. package/dist/skills/bundled/weather.skill.md +48 -0
  1724. package/dist/skills/bundled/web-app-testing.skill.md +71 -0
  1725. package/dist/skills/bundled/web-search.skill.md +56 -0
  1726. package/dist/skills/hub.js +52 -30
  1727. package/dist/skills/index.d.ts +6 -3
  1728. package/dist/skills/index.js +19 -4
  1729. package/dist/skills/parser.js +2 -0
  1730. package/dist/skills/registry.d.ts +52 -0
  1731. package/dist/skills/registry.js +291 -14
  1732. package/dist/skills/skill-exchange.d.ts +61 -0
  1733. package/dist/skills/skill-exchange.js +523 -0
  1734. package/dist/skills/skill-importer.d.ts +2 -2
  1735. package/dist/skills/skill-importer.js +76 -17
  1736. package/dist/skills/skill-registry.js +3 -2
  1737. package/dist/skills/skill-signing.d.ts +20 -0
  1738. package/dist/skills/skill-signing.js +106 -0
  1739. package/dist/skills/skill-sources.d.ts +3 -2
  1740. package/dist/skills/skill-sources.js +5 -4
  1741. package/dist/skills/types.d.ts +4 -0
  1742. package/dist/spec/spec-store.js +7 -6
  1743. package/dist/speculative/shadow-workspace.d.ts +79 -0
  1744. package/dist/speculative/shadow-workspace.js +500 -0
  1745. package/dist/talk-mode/index.d.ts +4 -4
  1746. package/dist/talk-mode/index.js +3 -3
  1747. package/dist/talk-mode/providers/elevenlabs-client.d.ts +48 -0
  1748. package/dist/talk-mode/providers/elevenlabs-client.js +117 -0
  1749. package/dist/talk-mode/providers/elevenlabs.js +12 -23
  1750. package/dist/talk-mode/providers/index.d.ts +3 -1
  1751. package/dist/talk-mode/providers/index.js +2 -0
  1752. package/dist/talk-mode/providers/pocket-tts.d.ts +88 -0
  1753. package/dist/talk-mode/providers/pocket-tts.js +334 -0
  1754. package/dist/talk-mode/providers/voicebox-tts.d.ts +24 -0
  1755. package/dist/talk-mode/providers/voicebox-tts.js +120 -0
  1756. package/dist/talk-mode/types.d.ts +39 -1
  1757. package/dist/tasks/background-tasks.js +22 -5
  1758. package/dist/telemetry/otel-tracer.js +5 -2
  1759. package/dist/templates/design-system-apply.d.ts +23 -0
  1760. package/dist/templates/design-system-apply.js +100 -0
  1761. package/dist/templates/project-scaffolding.d.ts +2 -0
  1762. package/dist/templates/project-scaffolding.js +616 -1
  1763. package/dist/themes/theme-manager.js +9 -6
  1764. package/dist/themes/theme-schema.d.ts +46 -46
  1765. package/dist/tools/advanced/multi-file-editor.js +3 -1
  1766. package/dist/tools/advanced/operation-history.js +2 -1
  1767. package/dist/tools/app-server-tool.d.ts +66 -0
  1768. package/dist/tools/app-server-tool.js +423 -0
  1769. package/dist/tools/apply-patch.d.ts +31 -1
  1770. package/dist/tools/apply-patch.js +214 -19
  1771. package/dist/tools/authored-tools-manifest-2.d.ts +17 -0
  1772. package/dist/tools/authored-tools-manifest-2.js +133 -0
  1773. package/dist/tools/authored-tools-manifest.d.ts +15 -0
  1774. package/dist/tools/authored-tools-manifest.js +13 -0
  1775. package/dist/tools/bash/bash-tool.d.ts +36 -3
  1776. package/dist/tools/bash/bash-tool.js +240 -100
  1777. package/dist/tools/bash/command-validator.d.ts +1 -1
  1778. package/dist/tools/bash/command-validator.js +115 -40
  1779. package/dist/tools/bash/execution-policy.d.ts +42 -0
  1780. package/dist/tools/bash/execution-policy.js +278 -0
  1781. package/dist/tools/bash/security-patterns.js +43 -5
  1782. package/dist/tools/bash/streaming-executor.d.ts +1 -1
  1783. package/dist/tools/bash/streaming-executor.js +124 -18
  1784. package/dist/tools/build-project-tool.d.ts +25 -0
  1785. package/dist/tools/build-project-tool.js +30 -0
  1786. package/dist/tools/bundle-analyze-tool.d.ts +28 -0
  1787. package/dist/tools/bundle-analyze-tool.js +39 -0
  1788. package/dist/tools/code-exec-tool.d.ts +55 -23
  1789. package/dist/tools/code-exec-tool.js +598 -111
  1790. package/dist/tools/code-explorer-tool.d.ts +1 -1
  1791. package/dist/tools/code-explorer-tool.js +25 -1
  1792. package/dist/tools/code-review.js +5 -0
  1793. package/dist/tools/code-stats-tool.d.ts +43 -0
  1794. package/dist/tools/code-stats-tool.js +70 -0
  1795. package/dist/tools/codebase-replace-tool.js +2 -2
  1796. package/dist/tools/comfy-recipe-tool.d.ts +37 -0
  1797. package/dist/tools/comfy-recipe-tool.js +693 -0
  1798. package/dist/tools/community-search.d.ts +93 -0
  1799. package/dist/tools/community-search.js +334 -0
  1800. package/dist/tools/computer-control-harness.js +5 -2
  1801. package/dist/tools/computer-control-tool.d.ts +8 -0
  1802. package/dist/tools/computer-control-tool.js +71 -26
  1803. package/dist/tools/context-expand-tool.d.ts +19 -0
  1804. package/dist/tools/context-expand-tool.js +132 -0
  1805. package/dist/tools/csv/csv-parse.d.ts +19 -0
  1806. package/dist/tools/csv/csv-parse.js +132 -0
  1807. package/dist/tools/csv/csv-wiring.d.ts +8 -0
  1808. package/dist/tools/csv/csv-wiring.js +9 -0
  1809. package/dist/tools/csv-analyze-tool.d.ts +11 -0
  1810. package/dist/tools/csv-analyze-tool.js +114 -0
  1811. package/dist/tools/csv-preview-tool.d.ts +34 -0
  1812. package/dist/tools/csv-preview-tool.js +69 -0
  1813. package/dist/tools/db-migration.js +11 -3
  1814. package/dist/tools/deep-research-tool.d.ts +68 -0
  1815. package/dist/tools/deep-research-tool.js +257 -0
  1816. package/dist/tools/deferred-schema-state.d.ts +19 -0
  1817. package/dist/tools/deferred-schema-state.js +33 -0
  1818. package/dist/tools/dep-inspect-tool.d.ts +32 -0
  1819. package/dist/tools/dep-inspect-tool.js +74 -0
  1820. package/dist/tools/design-system-tool.d.ts +10 -0
  1821. package/dist/tools/design-system-tool.js +95 -0
  1822. package/dist/tools/device-tool.d.ts +2 -1
  1823. package/dist/tools/device-tool.js +21 -0
  1824. package/dist/tools/diagram-tool.js +8 -2
  1825. package/dist/tools/diff-files-tool.d.ts +28 -0
  1826. package/dist/tools/diff-files-tool.js +49 -0
  1827. package/dist/tools/enhanced-search.js +32 -16
  1828. package/dist/tools/env-doctor-tool.d.ts +30 -0
  1829. package/dist/tools/env-doctor-tool.js +54 -0
  1830. package/dist/tools/execute-code-rpc-invoker.js +2 -2
  1831. package/dist/tools/execute-code-runner.d.ts +21 -0
  1832. package/dist/tools/execute-code-runner.js +117 -8
  1833. package/dist/tools/extension-forge-tool.d.ts +29 -0
  1834. package/dist/tools/extension-forge-tool.js +288 -0
  1835. package/dist/tools/fetch-tool.js +7 -3
  1836. package/dist/tools/file-search-tool.d.ts +41 -0
  1837. package/dist/tools/file-search-tool.js +99 -0
  1838. package/dist/tools/format-project-tool.d.ts +28 -0
  1839. package/dist/tools/format-project-tool.js +45 -0
  1840. package/dist/tools/git-summary-tool.d.ts +36 -0
  1841. package/dist/tools/git-summary-tool.js +65 -0
  1842. package/dist/tools/git-tool.js +16 -4
  1843. package/dist/tools/gpu-avatar-delivery.d.ts +16 -0
  1844. package/dist/tools/gpu-avatar-delivery.js +67 -0
  1845. package/dist/tools/gpu-media-worker.d.ts +96 -0
  1846. package/dist/tools/gpu-media-worker.js +363 -0
  1847. package/dist/tools/gui-tool.js +92 -13
  1848. package/dist/tools/http-probe-tool.d.ts +25 -0
  1849. package/dist/tools/http-probe-tool.js +40 -0
  1850. package/dist/tools/image-tool.js +29 -16
  1851. package/dist/tools/index.d.ts +6 -1
  1852. package/dist/tools/index.js +5 -0
  1853. package/dist/tools/interactive-bash.d.ts +29 -1
  1854. package/dist/tools/interactive-bash.js +141 -21
  1855. package/dist/tools/json-query-tool.d.ts +30 -0
  1856. package/dist/tools/json-query-tool.js +49 -0
  1857. package/dist/tools/license-check-tool.d.ts +22 -0
  1858. package/dist/tools/license-check-tool.js +43 -0
  1859. package/dist/tools/lint-project-tool.d.ts +52 -0
  1860. package/dist/tools/lint-project-tool.js +143 -0
  1861. package/dist/tools/local-binary-launch.d.ts +14 -0
  1862. package/dist/tools/local-binary-launch.js +63 -0
  1863. package/dist/tools/lsp-navigation-tools.d.ts +87 -0
  1864. package/dist/tools/lsp-navigation-tools.js +470 -0
  1865. package/dist/tools/markdown-convert.d.ts +51 -0
  1866. package/dist/tools/markdown-convert.js +159 -0
  1867. package/dist/tools/media-generation-tool.d.ts +90 -1
  1868. package/dist/tools/media-generation-tool.js +1553 -11
  1869. package/dist/tools/meeting-notes-tool.d.ts +25 -0
  1870. package/dist/tools/meeting-notes-tool.js +240 -0
  1871. package/dist/tools/merge-conflict-tool.js +1 -1
  1872. package/dist/tools/metadata.d.ts +7 -1
  1873. package/dist/tools/metadata.js +823 -13
  1874. package/dist/tools/mixture-of-agents-tool.d.ts +7 -0
  1875. package/dist/tools/mixture-of-agents-tool.js +230 -31
  1876. package/dist/tools/multi-edit.js +42 -18
  1877. package/dist/tools/ocr-tool.d.ts +43 -0
  1878. package/dist/tools/ocr-tool.js +24 -18
  1879. package/dist/tools/omission-placeholder-detector.js +12 -6
  1880. package/dist/tools/paper-qa-tool.d.ts +73 -0
  1881. package/dist/tools/paper-qa-tool.js +313 -0
  1882. package/dist/tools/peer-chain-tool.js +4 -1
  1883. package/dist/tools/peer-delegate-tool.d.ts +2 -0
  1884. package/dist/tools/peer-delegate-tool.js +11 -1
  1885. package/dist/tools/port-check-tool.d.ts +31 -0
  1886. package/dist/tools/port-check-tool.js +25 -0
  1887. package/dist/tools/project-map-tool.d.ts +39 -0
  1888. package/dist/tools/project-map-tool.js +128 -0
  1889. package/dist/tools/register-tool-handler.d.ts +2 -2
  1890. package/dist/tools/register-tool-handler.js +7 -4
  1891. package/dist/tools/registry/advanced-tools.js +1 -1
  1892. package/dist/tools/registry/attention-tools.d.ts +3 -3
  1893. package/dist/tools/registry/attention-tools.js +14 -10
  1894. package/dist/tools/registry/authored-extra-tools.d.ts +20 -0
  1895. package/dist/tools/registry/authored-extra-tools.js +147 -0
  1896. package/dist/tools/registry/bash-tools.d.ts +2 -2
  1897. package/dist/tools/registry/bash-tools.js +7 -3
  1898. package/dist/tools/registry/browser-operator-tools.d.ts +1 -1
  1899. package/dist/tools/registry/browser-operator-tools.js +17 -3
  1900. package/dist/tools/registry/browser-tools.d.ts +1 -1
  1901. package/dist/tools/registry/browser-tools.js +38 -33
  1902. package/dist/tools/registry/code-explorer-tools.js +6 -1
  1903. package/dist/tools/registry/comfy-recipe-tools.d.ts +2 -0
  1904. package/dist/tools/registry/comfy-recipe-tools.js +5 -0
  1905. package/dist/tools/registry/context-expand-tools.d.ts +3 -0
  1906. package/dist/tools/registry/context-expand-tools.js +6 -0
  1907. package/dist/tools/registry/csv-tools.d.ts +12 -0
  1908. package/dist/tools/registry/csv-tools.js +62 -0
  1909. package/dist/tools/registry/delegate-agent-tools.d.ts +64 -0
  1910. package/dist/tools/registry/delegate-agent-tools.js +206 -0
  1911. package/dist/tools/registry/design-tools.d.ts +12 -0
  1912. package/dist/tools/registry/design-tools.js +80 -0
  1913. package/dist/tools/registry/fleet-tools.js +6 -0
  1914. package/dist/tools/registry/index.d.ts +25 -5
  1915. package/dist/tools/registry/index.js +80 -6
  1916. package/dist/tools/registry/interactive-adapters.d.ts +37 -0
  1917. package/dist/tools/registry/interactive-adapters.js +116 -0
  1918. package/dist/tools/registry/lsp-tools.d.ts +3 -3
  1919. package/dist/tools/registry/lsp-tools.js +9 -3
  1920. package/dist/tools/registry/meeting-tools.d.ts +3 -0
  1921. package/dist/tools/registry/meeting-tools.js +6 -0
  1922. package/dist/tools/registry/memory-tools.js +32 -20
  1923. package/dist/tools/registry/misc-tools.d.ts +1 -1
  1924. package/dist/tools/registry/misc-tools.js +7 -4
  1925. package/dist/tools/registry/moa-tools.js +13 -0
  1926. package/dist/tools/registry/multimodal-tools.d.ts +73 -1
  1927. package/dist/tools/registry/multimodal-tools.js +581 -4
  1928. package/dist/tools/registry/process-tools.d.ts +16 -0
  1929. package/dist/tools/registry/process-tools.js +136 -1
  1930. package/dist/tools/registry/remind-tools.d.ts +23 -0
  1931. package/dist/tools/registry/remind-tools.js +120 -0
  1932. package/dist/tools/registry/research-tools.d.ts +17 -0
  1933. package/dist/tools/registry/research-tools.js +21 -0
  1934. package/dist/tools/registry/search-tools.d.ts +6 -6
  1935. package/dist/tools/registry/search-tools.js +30 -17
  1936. package/dist/tools/registry/secrets-tools.d.ts +33 -0
  1937. package/dist/tools/registry/secrets-tools.js +71 -0
  1938. package/dist/tools/registry/self-describe-tools.d.ts +23 -0
  1939. package/dist/tools/registry/self-describe-tools.js +156 -0
  1940. package/dist/tools/registry/self-evolution-tools.d.ts +13 -0
  1941. package/dist/tools/registry/self-evolution-tools.js +97 -0
  1942. package/dist/tools/registry/text-editor-tools.d.ts +26 -4
  1943. package/dist/tools/registry/text-editor-tools.js +102 -6
  1944. package/dist/tools/registry/tool-alias-map.d.ts +8 -0
  1945. package/dist/tools/registry/tool-alias-map.js +47 -0
  1946. package/dist/tools/registry/tool-aliases.d.ts +3 -4
  1947. package/dist/tools/registry/tool-aliases.js +12 -48
  1948. package/dist/tools/registry/types.d.ts +5 -0
  1949. package/dist/tools/registry/verify-tools.d.ts +50 -0
  1950. package/dist/tools/registry/verify-tools.js +136 -0
  1951. package/dist/tools/registry/video-studio-tools.d.ts +13 -0
  1952. package/dist/tools/registry/video-studio-tools.js +21 -0
  1953. package/dist/tools/registry/vision-tools.d.ts +15 -1
  1954. package/dist/tools/registry/vision-tools.js +252 -27
  1955. package/dist/tools/registry/web-test-tool.d.ts +66 -0
  1956. package/dist/tools/registry/web-test-tool.js +321 -0
  1957. package/dist/tools/registry/web-tools.d.ts +43 -0
  1958. package/dist/tools/registry/web-tools.js +281 -1
  1959. package/dist/tools/review-gate-helper.d.ts +44 -0
  1960. package/dist/tools/review-gate-helper.js +110 -0
  1961. package/dist/tools/route-peer-tool.js +62 -11
  1962. package/dist/tools/sbom-generate-tool.d.ts +22 -0
  1963. package/dist/tools/sbom-generate-tool.js +41 -0
  1964. package/dist/tools/scaffold-app-tool.d.ts +48 -0
  1965. package/dist/tools/scaffold-app-tool.js +144 -0
  1966. package/dist/tools/screenshot-tool.js +5 -2
  1967. package/dist/tools/search.d.ts +17 -0
  1968. package/dist/tools/search.js +31 -8
  1969. package/dist/tools/self-describe.d.ts +73 -0
  1970. package/dist/tools/self-describe.js +298 -0
  1971. package/dist/tools/stock-quote.d.ts +67 -0
  1972. package/dist/tools/stock-quote.js +645 -0
  1973. package/dist/tools/submit-plan-tool.js +1 -1
  1974. package/dist/tools/test-runner-tool.d.ts +38 -0
  1975. package/dist/tools/test-runner-tool.js +96 -0
  1976. package/dist/tools/text-editor.js +91 -8
  1977. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  1978. package/dist/tools/text-to-speech-tool.js +48 -2
  1979. package/dist/tools/todo-scan-tool.d.ts +39 -0
  1980. package/dist/tools/todo-scan-tool.js +53 -0
  1981. package/dist/tools/tool-manager.js +8 -0
  1982. package/dist/tools/tool-search.js +11 -3
  1983. package/dist/tools/tool-selector.d.ts +7 -0
  1984. package/dist/tools/tool-selector.js +27 -13
  1985. package/dist/tools/tools-md-generator.js +2 -2
  1986. package/dist/tools/types.d.ts +16 -0
  1987. package/dist/tools/types.js +5 -1
  1988. package/dist/tools/video/approved-media-source.d.ts +8 -0
  1989. package/dist/tools/video/approved-media-source.js +59 -0
  1990. package/dist/tools/video/book-manuscript-source.d.ts +49 -0
  1991. package/dist/tools/video/book-manuscript-source.js +263 -0
  1992. package/dist/tools/video/character-in-location.d.ts +42 -0
  1993. package/dist/tools/video/character-in-location.js +161 -0
  1994. package/dist/tools/video/cinematic-trailer-plan.d.ts +203 -0
  1995. package/dist/tools/video/cinematic-trailer-plan.js +498 -0
  1996. package/dist/tools/video/cloud-understand.d.ts +91 -0
  1997. package/dist/tools/video/cloud-understand.js +214 -0
  1998. package/dist/tools/video/comfy-client.d.ts +38 -0
  1999. package/dist/tools/video/comfy-client.js +227 -0
  2000. package/dist/tools/video/comfy-workflow-template.d.ts +70 -0
  2001. package/dist/tools/video/comfy-workflow-template.js +194 -0
  2002. package/dist/tools/video/describe-frame.d.ts +36 -0
  2003. package/dist/tools/video/describe-frame.js +68 -0
  2004. package/dist/tools/video/film-assemble.d.ts +234 -0
  2005. package/dist/tools/video/film-assemble.js +959 -0
  2006. package/dist/tools/video/film-project.d.ts +152 -0
  2007. package/dist/tools/video/film-project.js +312 -0
  2008. package/dist/tools/video/frame-dedup.d.ts +46 -0
  2009. package/dist/tools/video/frame-dedup.js +110 -0
  2010. package/dist/tools/video/frame-sample.d.ts +72 -0
  2011. package/dist/tools/video/frame-sample.js +238 -0
  2012. package/dist/tools/video/google-flow-driver.d.ts +131 -0
  2013. package/dist/tools/video/google-flow-driver.js +312 -0
  2014. package/dist/tools/video/google-flow-handoff.d.ts +75 -0
  2015. package/dist/tools/video/google-flow-handoff.js +121 -0
  2016. package/dist/tools/video/google-flow-plan-export.d.ts +21 -0
  2017. package/dist/tools/video/google-flow-plan-export.js +123 -0
  2018. package/dist/tools/video/google-flow-result-import.d.ts +92 -0
  2019. package/dist/tools/video/google-flow-result-import.js +297 -0
  2020. package/dist/tools/video/hybrid-video-router.d.ts +34 -0
  2021. package/dist/tools/video/hybrid-video-router.js +113 -0
  2022. package/dist/tools/video/localized-media.d.ts +50 -0
  2023. package/dist/tools/video/localized-media.js +128 -0
  2024. package/dist/tools/video/long-form-plan.d.ts +37 -0
  2025. package/dist/tools/video/long-form-plan.js +83 -0
  2026. package/dist/tools/video/long-form-production.d.ts +49 -0
  2027. package/dist/tools/video/long-form-production.js +168 -0
  2028. package/dist/tools/video/long-transcribe.d.ts +94 -0
  2029. package/dist/tools/video/long-transcribe.js +206 -0
  2030. package/dist/tools/video/media-fetch.d.ts +94 -0
  2031. package/dist/tools/video/media-fetch.js +311 -0
  2032. package/dist/tools/video/mermaid-render.d.ts +34 -0
  2033. package/dist/tools/video/mermaid-render.js +127 -0
  2034. package/dist/tools/video/narration.d.ts +96 -0
  2035. package/dist/tools/video/narration.js +505 -0
  2036. package/dist/tools/video/native-fashion-defects.d.ts +27 -0
  2037. package/dist/tools/video/native-fashion-defects.js +80 -0
  2038. package/dist/tools/video/scene-render.d.ts +108 -0
  2039. package/dist/tools/video/scene-render.js +418 -0
  2040. package/dist/tools/video/subtitles.d.ts +49 -0
  2041. package/dist/tools/video/subtitles.js +116 -0
  2042. package/dist/tools/video/video-ckg.d.ts +123 -0
  2043. package/dist/tools/video/video-ckg.js +188 -0
  2044. package/dist/tools/video/video-research-card.d.ts +58 -0
  2045. package/dist/tools/video/video-research-card.js +468 -0
  2046. package/dist/tools/video/video-understanding.d.ts +159 -0
  2047. package/dist/tools/video/video-understanding.js +534 -0
  2048. package/dist/tools/video/visual-gate-report.d.ts +139 -0
  2049. package/dist/tools/video/visual-gate-report.js +379 -0
  2050. package/dist/tools/video/voice-rights-registry.d.ts +13 -0
  2051. package/dist/tools/video/voice-rights-registry.js +142 -0
  2052. package/dist/tools/video/youtube-captions.d.ts +51 -0
  2053. package/dist/tools/video/youtube-captions.js +102 -0
  2054. package/dist/tools/video/youtube-master-quality.d.ts +163 -0
  2055. package/dist/tools/video/youtube-master-quality.js +379 -0
  2056. package/dist/tools/video/youtube-storyboard.d.ts +43 -0
  2057. package/dist/tools/video/youtube-storyboard.js +194 -0
  2058. package/dist/tools/video-flow-handoff-tool.d.ts +181 -0
  2059. package/dist/tools/video-flow-handoff-tool.js +261 -0
  2060. package/dist/tools/video-long-form-plan-tool.d.ts +31 -0
  2061. package/dist/tools/video-long-form-plan-tool.js +87 -0
  2062. package/dist/tools/video-quality-gate-tool.d.ts +97 -0
  2063. package/dist/tools/video-quality-gate-tool.js +189 -0
  2064. package/dist/tools/video-route-tool.d.ts +128 -0
  2065. package/dist/tools/video-route-tool.js +126 -0
  2066. package/dist/tools/video-studio-tool-helpers.d.ts +22 -0
  2067. package/dist/tools/video-studio-tool-helpers.js +128 -0
  2068. package/dist/tools/video-trailer-plan-tool.d.ts +60 -0
  2069. package/dist/tools/video-trailer-plan-tool.js +103 -0
  2070. package/dist/tools/vision/blender-render.d.ts +76 -0
  2071. package/dist/tools/vision/blender-render.js +121 -0
  2072. package/dist/tools/vision/image-processor.d.ts +1 -0
  2073. package/dist/tools/vision/image-processor.js +8 -1
  2074. package/dist/tools/vision/load-sharp.d.ts +53 -0
  2075. package/dist/tools/vision/load-sharp.js +48 -0
  2076. package/dist/tools/vision/mean-luma.d.ts +4 -0
  2077. package/dist/tools/vision/mean-luma.js +189 -0
  2078. package/dist/tools/vision/object-detection.d.ts +90 -0
  2079. package/dist/tools/vision/object-detection.js +403 -0
  2080. package/dist/tools/vision/vision-analysis.js +2 -1
  2081. package/dist/tools/weather.d.ts +33 -0
  2082. package/dist/tools/weather.js +183 -0
  2083. package/dist/tools/web-scrape-tool.d.ts +63 -0
  2084. package/dist/tools/web-scrape-tool.js +318 -0
  2085. package/dist/tools/web-search.d.ts +67 -6
  2086. package/dist/tools/web-search.js +231 -68
  2087. package/dist/tools/workspace-tools.d.ts +39 -0
  2088. package/dist/tools/workspace-tools.js +347 -0
  2089. package/dist/tracks/track-manager.js +9 -8
  2090. package/dist/triggers/webhook-trigger.js +10 -18
  2091. package/dist/ui/components/ChatHistory.js +12 -0
  2092. package/dist/ui/components/ChatInterface.js +6 -2
  2093. package/dist/ui/components/FileAutocomplete.d.ts +6 -1
  2094. package/dist/ui/components/FileAutocomplete.js +136 -76
  2095. package/dist/ui/components/FuzzyPicker.d.ts +5 -0
  2096. package/dist/ui/components/FuzzyPicker.js +1 -1
  2097. package/dist/ui/http-server/server.js +2 -2
  2098. package/dist/undo/checkpoint-manager.d.ts +3 -0
  2099. package/dist/undo/checkpoint-manager.js +6 -1
  2100. package/dist/utils/approval-pattern-tracker.js +5 -13
  2101. package/dist/utils/ascii-banner.d.ts +1 -1
  2102. package/dist/utils/ascii-banner.js +1 -1
  2103. package/dist/utils/atomic-write.d.ts +77 -0
  2104. package/dist/utils/atomic-write.js +530 -0
  2105. package/dist/utils/audio-player.d.ts +1 -0
  2106. package/dist/utils/audio-player.js +7 -3
  2107. package/dist/utils/autonomy-manager.js +12 -3
  2108. package/dist/utils/command-exists.d.ts +14 -0
  2109. package/dist/utils/command-exists.js +43 -0
  2110. package/dist/utils/config-validation/schema.d.ts +13 -13
  2111. package/dist/utils/config-validation/schema.js +33 -1
  2112. package/dist/utils/confirmation-service.d.ts +60 -1
  2113. package/dist/utils/confirmation-service.js +204 -41
  2114. package/dist/utils/cost-tracker.d.ts +66 -1
  2115. package/dist/utils/cost-tracker.js +100 -17
  2116. package/dist/utils/history-manager.js +6 -7
  2117. package/dist/utils/init-project.js +17 -13
  2118. package/dist/utils/input-validation/index.d.ts +16 -16
  2119. package/dist/utils/installation-id.js +7 -22
  2120. package/dist/utils/interactive-setup.js +7 -12
  2121. package/dist/utils/json-salvage.d.ts +22 -0
  2122. package/dist/utils/json-salvage.js +91 -0
  2123. package/dist/utils/llm-retry.js +3 -0
  2124. package/dist/utils/logger.d.ts +1 -0
  2125. package/dist/utils/logger.js +16 -5
  2126. package/dist/utils/model-router.js +8 -12
  2127. package/dist/utils/model-utils.js +14 -0
  2128. package/dist/utils/output-sanitizer.d.ts +4 -8
  2129. package/dist/utils/output-sanitizer.js +10 -10
  2130. package/dist/utils/output-schema-validator.d.ts +7 -0
  2131. package/dist/utils/output-schema-validator.js +25 -1
  2132. package/dist/utils/response-cache.js +11 -22
  2133. package/dist/utils/ripgrep-path.d.ts +11 -0
  2134. package/dist/utils/ripgrep-path.js +60 -0
  2135. package/dist/utils/semantic-cache.js +4 -7
  2136. package/dist/utils/settings-manager.d.ts +27 -4
  2137. package/dist/utils/settings-manager.js +51 -39
  2138. package/dist/utils/shell-completions.js +25 -34
  2139. package/dist/utils/shell-configuration.d.ts +39 -0
  2140. package/dist/utils/shell-configuration.js +106 -0
  2141. package/dist/utils/stream-stall-guard.d.ts +39 -0
  2142. package/dist/utils/stream-stall-guard.js +123 -0
  2143. package/dist/utils/subprocess-env.d.ts +15 -0
  2144. package/dist/utils/subprocess-env.js +112 -0
  2145. package/dist/utils/telegram-api-base.d.ts +9 -0
  2146. package/dist/utils/telegram-api-base.js +15 -0
  2147. package/dist/utils/telemetry-config.js +16 -13
  2148. package/dist/utils/update-notifier.js +5 -10
  2149. package/dist/utils/validators.js +1 -2
  2150. package/dist/versioning/config-migrator.js +3 -2
  2151. package/dist/versioning/migration-manager.js +5 -4
  2152. package/dist/versioning/version-detector.js +2 -1
  2153. package/dist/vision-train/assets.d.ts +37 -0
  2154. package/dist/vision-train/assets.js +97 -0
  2155. package/dist/vision-train/ckg-publish.d.ts +26 -0
  2156. package/dist/vision-train/ckg-publish.js +36 -0
  2157. package/dist/vision-train/coco-to-labels.d.ts +63 -0
  2158. package/dist/vision-train/coco-to-labels.js +63 -0
  2159. package/dist/vision-train/curriculum.d.ts +29 -0
  2160. package/dist/vision-train/curriculum.js +49 -0
  2161. package/dist/vision-train/engine.d.ts +56 -0
  2162. package/dist/vision-train/engine.js +55 -0
  2163. package/dist/vision-train/report.d.ts +15 -0
  2164. package/dist/vision-train/report.js +72 -0
  2165. package/dist/vision-train/scorer.d.ts +67 -0
  2166. package/dist/vision-train/scorer.js +114 -0
  2167. package/dist/vision-train/yolo-labels.d.ts +13 -0
  2168. package/dist/vision-train/yolo-labels.js +66 -0
  2169. package/dist/voice/elevenlabs-voice.d.ts +53 -0
  2170. package/dist/voice/elevenlabs-voice.js +412 -0
  2171. package/dist/voice/kyutai-local-voice.d.ts +33 -0
  2172. package/dist/voice/kyutai-local-voice.js +198 -0
  2173. package/dist/voice/local-tts.d.ts +106 -3
  2174. package/dist/voice/local-tts.js +672 -35
  2175. package/dist/voice/local-whisper.d.ts +11 -0
  2176. package/dist/voice/local-whisper.js +18 -2
  2177. package/dist/voice/pcm-edges.d.ts +43 -0
  2178. package/dist/voice/pcm-edges.js +210 -0
  2179. package/dist/voice/perceived-latency-benchmark.d.ts +56 -0
  2180. package/dist/voice/perceived-latency-benchmark.js +218 -0
  2181. package/dist/voice/tts-bank.d.ts +72 -0
  2182. package/dist/voice/tts-bank.js +172 -0
  2183. package/dist/voice/tts-latency-benchmark.d.ts +36 -0
  2184. package/dist/voice/tts-latency-benchmark.js +76 -0
  2185. package/dist/voice/tts-volume.d.ts +86 -0
  2186. package/dist/voice/tts-volume.js +378 -0
  2187. package/dist/voice/two-speed-voice.d.ts +19 -0
  2188. package/dist/voice/two-speed-voice.js +40 -0
  2189. package/dist/voice/voice-to-code.js +1 -1
  2190. package/dist/voice/voicebox-tts.d.ts +150 -0
  2191. package/dist/voice/voicebox-tts.js +669 -0
  2192. package/dist/voice/wake-word.d.ts +2 -0
  2193. package/dist/voice/wake-word.js +30 -10
  2194. package/dist/webhooks/webhook-manager.js +10 -18
  2195. package/dist/widgets/auto-widget.d.ts +27 -0
  2196. package/dist/widgets/auto-widget.js +111 -0
  2197. package/dist/widgets/canvas-publish.d.ts +15 -0
  2198. package/dist/widgets/canvas-publish.js +39 -0
  2199. package/dist/widgets/curated/news.d.ts +2 -0
  2200. package/dist/widgets/curated/news.js +46 -0
  2201. package/dist/widgets/curated/stock.d.ts +1 -0
  2202. package/dist/widgets/curated/stock.js +87 -0
  2203. package/dist/widgets/curated/weather.d.ts +2 -0
  2204. package/dist/widgets/curated/weather.js +93 -0
  2205. package/dist/widgets/template-engine.d.ts +19 -0
  2206. package/dist/widgets/template-engine.js +134 -0
  2207. package/dist/widgets/widget-engine.d.ts +24 -0
  2208. package/dist/widgets/widget-engine.js +153 -0
  2209. package/dist/widgets/widget-gate.d.ts +19 -0
  2210. package/dist/widgets/widget-gate.js +144 -0
  2211. package/dist/widgets/widget-image-renderer.d.ts +4 -0
  2212. package/dist/widgets/widget-image-renderer.js +164 -0
  2213. package/dist/widgets/widget-matcher.d.ts +48 -0
  2214. package/dist/widgets/widget-matcher.js +109 -0
  2215. package/dist/widgets/widget-proposer.d.ts +17 -0
  2216. package/dist/widgets/widget-proposer.js +75 -0
  2217. package/dist/widgets/widget-registry.d.ts +36 -0
  2218. package/dist/widgets/widget-registry.js +231 -0
  2219. package/dist/widgets/widget-types.d.ts +100 -0
  2220. package/dist/widgets/widget-types.js +17 -0
  2221. package/dist/wizard/environment-detection.d.ts +67 -0
  2222. package/dist/wizard/environment-detection.js +210 -0
  2223. package/dist/wizard/onboarding.d.ts +21 -1
  2224. package/dist/wizard/onboarding.js +202 -27
  2225. package/dist/workflows/state-manager.js +8 -2
  2226. package/dist/workspace/workspace-config.d.ts +37 -0
  2227. package/dist/workspace/workspace-config.js +199 -0
  2228. package/dist/workspace/workspace-isolation.d.ts +19 -0
  2229. package/dist/workspace/workspace-isolation.js +124 -39
  2230. package/dist/workspace/workspace-manager.js +19 -14
  2231. package/examples/claude_desktop_config.json +8 -0
  2232. package/package.json +75 -31
  2233. package/.codebuddy/README.md +0 -65
  2234. package/dist/agent/middleware/learning-first-middleware.d.ts +0 -79
  2235. package/dist/agent/middleware/learning-first-middleware.js +0 -271
  2236. package/dist/agent/middleware/tool-filter-middleware.d.ts +0 -45
  2237. package/dist/agent/middleware/tool-filter-middleware.js +0 -122
  2238. package/dist/codebuddy/tool-definitions/batch-tools.d.ts +0 -10
  2239. package/dist/codebuddy/tool-definitions/batch-tools.js +0 -46
  2240. package/dist/codebuddy/tool-definitions/graph-tools.d.ts +0 -13
  2241. package/dist/codebuddy/tool-definitions/graph-tools.js +0 -78
  2242. package/dist/plugins/code-explorer/CodeExplorerMCPClient.d.ts +0 -129
  2243. package/dist/plugins/code-explorer/CodeExplorerMCPClient.js +0 -143
  2244. package/dist/tools/registry/batch-tools.d.ts +0 -36
  2245. package/dist/tools/registry/batch-tools.js +0 -135
  2246. package/dist/tools/registry/graph-tools.d.ts +0 -45
  2247. package/dist/tools/registry/graph-tools.js +0 -283
@@ -7,31 +7,273 @@
7
7
  *
8
8
  * @module agent/execution
9
9
  */
10
+ import { resolveFirstTokenStallTimeoutMs, resolveStallTimeoutMs, withStallGuard } from "../../utils/stream-stall-guard.js";
11
+ import { startHeadlessPromptProgress } from "../../cli/headless-prompt-progress.js";
12
+ import { HEADLESS_LOCAL_COMPACT_ALWAYS_INCLUDE, HEADLESS_LOCAL_COMPACT_MAX_TOOLS, isHeadlessLocalPromptCompact, } from "../../config/headless-local-prompt.js";
10
13
  import { normalizeHallucinatedLocalToolCall } from "../tool-handler.js";
14
+ import { ContextCompactionError } from "../../context/context-manager-v2.js";
11
15
  import { logger } from "../../utils/logger.js";
12
16
  import { getErrorMessage } from "../../errors/index.js";
13
17
  import { sanitizeToolResult } from "../../utils/sanitize.js";
14
- import { prepareTurnMessages, injectInitialContext, injectNextRoundContext, runJitContextDiscovery, sanitizeAssistantOutput, } from "./context-pipeline.js";
18
+ import { prepareTurnMessages, compactTurnMessagesInPlace, injectInitialContext, injectNextRoundContext, runJitContextDiscovery, sanitizeAssistantOutput, } from "./context-pipeline.js";
15
19
  import { extractYieldChildId, processYieldSignal } from "./yield-coordinator.js";
16
20
  import { runPreToolUseHook, pushBlockedToolMessage, runPostToolUseHook, recordToolMetric, emitFleetToolStarted, emitFleetToolCompleted, } from "./tool-hooks.js";
17
21
  import { extractTerminateMessage, extractSignalMessage, INTERACTIVE_SHELL_SIGNAL, PLAN_APPROVAL_SIGNAL, } from "./turn-signals.js";
18
- import { persistToolResult, applyObservationVariator, logYoloCostIfEnabled, } from "./post-tool-handlers.js";
22
+ import { applyObservationVariator, logYoloCostIfEnabled, } from "./post-tool-handlers.js";
23
+ import { extractEditedFilesFromHistory } from "../middleware/changed-files.js";
19
24
  import { semanticTruncate } from "../../utils/head-tail-truncation.js";
20
- import { getRestorableCompressor } from "../../context/restorable-compression.js";
25
+ import { optimizeToolObservation } from '../../context/tool-observation-optimizer.js';
26
+ import { compress as tokenJuice, isTokenJuiceEnabled, JUICE_MIN_CHARS } from "../../context/token-juice.js";
27
+ import { formatToolResultForRecovery, getRestorableCompressor, } from "../../context/restorable-compression.js";
21
28
  import { recordCompactionFork } from "../../context/compaction-fork.js";
22
29
  import { getActiveRunStore } from "../../observability/run-store.js";
30
+ import { getTurnMetricsRecorder } from '../../observability/turn-metrics.js';
23
31
  import { shouldCompactBeforeToolExec, estimateToolResultTokens } from "../../context/proactive-compaction.js";
24
32
  import { formatTokenUsage, estimateCost } from "../../utils/token-display.js";
25
33
  import { classifyQuery } from "./query-classifier.js";
34
+ import { getModelToolConfig } from "../../config/model-tools.js";
35
+ import { getLatencyOptimizer, getStreamingOptimizer } from "../../optimization/latency-optimizer.js";
36
+ import { buildTextEmotionalPresenceContext } from "../../companion/reply-augment.js";
37
+ import { guardRelationshipReply, SAFE_RELATIONSHIP_REPAIR, } from "../../conversation/relationship-safety.js";
38
+ import { classifyLisaIntrospection, guardLisaOperationalSelfInspectionReply, isLisaEvolutionRequest, renderLisaOperationalSelfResponse, } from '../../identity/lisa-introspection.js';
39
+ import { withLlmStreamRetry } from '../../codebuddy/llm-retry.js';
40
+ import { getStreamingAdapter } from '../../tools/streaming-adapter.js';
41
+ import { notify } from '../proactive/notification-default-sink.js';
42
+ import { getProgressTracker } from '../planner/progress-default-sink.js';
43
+ import { trackRecentFile } from '../../knowledge/code-graph-context-provider.js';
44
+ import { getKnowledgeGraph } from '../../knowledge/knowledge-graph.js';
45
+ import { updateGraphForFile } from '../../knowledge/graph-updater.js';
46
+ import { resolve as resolvePath } from 'node:path';
47
+ import { maybeAutoCommit } from '../../tools/auto-commit.js';
48
+ import { applyToolOutputMasking, expireOldToolResults, pruneImageContent, } from '../../context/tool-output-masking.js';
49
+ import { IncrementalMessageTokenCounter } from './incremental-token-counter.js';
50
+ import { createOrderedToolBatches, executeBoundedInOrder, } from './ordered-tool-executor.js';
26
51
  /**
27
- * Race a promise against a timeout, returning the fallback value if the
28
- * promise doesn't settle within `ms` milliseconds.
52
+ * Tools whose (verbose, prose/HTML) output TokenJuice may losslessly compress before it
53
+ * enters message history. Scoped to web tools on purpose — never structured output the
54
+ * agent parses. See `context/token-juice.ts`.
29
55
  */
30
- function withTimeout(promise, ms, fallback) {
31
- return Promise.race([
32
- promise,
33
- new Promise(resolve => setTimeout(() => resolve(fallback), ms)),
34
- ]);
56
+ const JUICE_WEB_TOOLS = new Set(['web_fetch', 'web_search', 'fetch', 'browser_fetch']);
57
+ const CONTEXT_MENTION_PATTERN = /@(?:file:|url:|image:|git(?::|\s)|symbol:|search:|web\s|terminal\b)/i;
58
+ const FILE_MENTION_CANDIDATE_PATTERN = /(?:^|\s)@[^\s@]+/;
59
+ const RELATIONSHIP_OUTBOUND_TOOLS = new Set([
60
+ 'send_message',
61
+ 'reply',
62
+ 'broadcast',
63
+ 'slack_send',
64
+ 'discord_send',
65
+ 'telegram_send',
66
+ 'email_send',
67
+ 'notification',
68
+ 'notify',
69
+ 'send_notification',
70
+ 'yb_send_dm',
71
+ 'feishu_drive_reply_comment',
72
+ 'feishu_drive_add_comment',
73
+ 'sessions_send',
74
+ ]);
75
+ const RELATIONSHIP_INTERACTIVE_TOOLS = new Set(['ask_human', 'ask_user_question']);
76
+ const RELATIONSHIP_BLOCK_MARKER = '__codebuddyRelationshipSafetyBlocked';
77
+ const SAFE_INTERACTIVE_QUESTION = 'Peux-tu préciser ce que tu souhaites faire ensuite ?';
78
+ const SAFE_TOOL_RESULT = 'Résultat traité en interne par Lisa.';
79
+ const MAX_PARALLEL_TOOL_CALLS = 5;
80
+ function abortedToolResult(startedAt) {
81
+ const elapsedSeconds = Math.max(0, Date.now() - startedAt) / 1000;
82
+ return {
83
+ success: false,
84
+ error: `aborted by user after ${elapsedSeconds.toFixed(1)}s`,
85
+ };
86
+ }
87
+ function configuredSensoryRuntime(surface, env = process.env) {
88
+ const voiceConfigured = surface === 'voice' || env.CODEBUDDY_SENSORY_SPEAK === 'true';
89
+ const configuredTtsEngine = env.CODEBUDDY_TTS_ENGINE?.trim().toLowerCase();
90
+ const ttsProvider = env.CODEBUDDY_TTS_VOICE?.trim().toLowerCase().startsWith('elevenlabs:')
91
+ ? 'elevenlabs'
92
+ : configuredTtsEngine === 'piper' || configuredTtsEngine === 'voicebox'
93
+ ? configuredTtsEngine
94
+ : 'pocket';
95
+ const ttsConfigured = voiceConfigured || Boolean(env.CODEBUDDY_TTS_ENGINE ||
96
+ env.CODEBUDDY_TTS_VOICE ||
97
+ env.CODEBUDDY_TTS_PIPER_MODEL ||
98
+ env.CODEBUDDY_POCKET_VOICE ||
99
+ env.CODEBUDDY_VOICEBOX_PROFILE);
100
+ return {
101
+ voice: {
102
+ configured: voiceConfigured,
103
+ ...(voiceConfigured ? { provider: 'resident voice loop' } : {}),
104
+ },
105
+ tts: {
106
+ configured: ttsConfigured,
107
+ ...(ttsConfigured ? { provider: ttsProvider } : {}),
108
+ },
109
+ camera: {
110
+ configured: env.CODEBUDDY_SENSORY_CAMERA === 'true',
111
+ },
112
+ };
113
+ }
114
+ function isUnknownRecord(value) {
115
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
116
+ }
117
+ function guardInteractiveText(value, fallback) {
118
+ if (typeof value !== 'string' || !value.trim())
119
+ return { value: fallback, intervened: true };
120
+ const guarded = guardRelationshipReply(value);
121
+ return {
122
+ value: guarded.intervened || !guarded.response.trim() ? fallback : guarded.response,
123
+ intervened: guarded.intervened,
124
+ };
125
+ }
126
+ function blockedRelationshipInteractiveToolCall(toolCall) {
127
+ return {
128
+ ...toolCall,
129
+ function: {
130
+ ...toolCall.function,
131
+ arguments: JSON.stringify({ [RELATIONSHIP_BLOCK_MARKER]: true }),
132
+ },
133
+ };
134
+ }
135
+ /**
136
+ * Guard every string an interactive tool can render before the tool gets a
137
+ * chance to touch readline, Ink, Cowork, or another UI provider. Malformed
138
+ * calls fail closed instead of being handed to a side-effecting renderer.
139
+ */
140
+ function prepareRelationshipSafeInteractiveToolCall(toolCall) {
141
+ const name = toolCall.function.name.trim().toLowerCase();
142
+ if (!RELATIONSHIP_INTERACTIVE_TOOLS.has(name))
143
+ return toolCall;
144
+ let parsed;
145
+ try {
146
+ parsed = JSON.parse(toolCall.function.arguments || '{}');
147
+ }
148
+ catch {
149
+ return blockedRelationshipInteractiveToolCall(toolCall);
150
+ }
151
+ if (!isUnknownRecord(parsed))
152
+ return blockedRelationshipInteractiveToolCall(toolCall);
153
+ if (name === 'ask_human') {
154
+ if (typeof parsed.question !== 'string')
155
+ return blockedRelationshipInteractiveToolCall(toolCall);
156
+ const question = guardInteractiveText(parsed.question, SAFE_INTERACTIVE_QUESTION);
157
+ const prepared = { ...parsed, question: question.value };
158
+ if (Array.isArray(parsed.options)) {
159
+ prepared.options = parsed.options.map((option, index) => guardInteractiveText(option, `Option ${index + 1}`).value);
160
+ }
161
+ if (typeof parsed.default === 'string') {
162
+ prepared.default = guardInteractiveText(parsed.default, 'No answer provided – use your best judgement and continue.').value;
163
+ }
164
+ return {
165
+ ...toolCall,
166
+ function: { ...toolCall.function, arguments: JSON.stringify(prepared) },
167
+ };
168
+ }
169
+ if (!Array.isArray(parsed.questions))
170
+ return blockedRelationshipInteractiveToolCall(toolCall);
171
+ const questions = [];
172
+ for (let questionIndex = 0; questionIndex < parsed.questions.length; questionIndex += 1) {
173
+ const rawQuestion = parsed.questions[questionIndex];
174
+ if (!isUnknownRecord(rawQuestion) || !Array.isArray(rawQuestion.options)) {
175
+ return blockedRelationshipInteractiveToolCall(toolCall);
176
+ }
177
+ const question = guardInteractiveText(rawQuestion.question, SAFE_INTERACTIVE_QUESTION);
178
+ const header = guardInteractiveText(rawQuestion.header, `Question ${questionIndex + 1}`);
179
+ const options = [];
180
+ for (let optionIndex = 0; optionIndex < rawQuestion.options.length; optionIndex += 1) {
181
+ const rawOption = rawQuestion.options[optionIndex];
182
+ if (!isUnknownRecord(rawOption))
183
+ return blockedRelationshipInteractiveToolCall(toolCall);
184
+ const label = guardInteractiveText(rawOption.label, `Option ${optionIndex + 1}`);
185
+ const description = guardInteractiveText(rawOption.description, 'Choix proposé sans pression relationnelle.');
186
+ const preview = typeof rawOption.preview === 'string'
187
+ ? guardInteractiveText(rawOption.preview, 'Aperçu masqué par la sécurité relationnelle.')
188
+ : null;
189
+ const optionIntervened = label.intervened || description.intervened || preview?.intervened;
190
+ const preparedOption = {
191
+ ...rawOption,
192
+ label: optionIntervened ? `Option ${optionIndex + 1}` : label.value,
193
+ description: optionIntervened
194
+ ? 'Choix proposé sans pression relationnelle.'
195
+ : description.value,
196
+ };
197
+ if (preview) {
198
+ preparedOption.preview = optionIntervened
199
+ ? 'Aperçu masqué par la sécurité relationnelle.'
200
+ : preview.value;
201
+ }
202
+ options.push(preparedOption);
203
+ }
204
+ questions.push({
205
+ ...rawQuestion,
206
+ question: question.value,
207
+ header: question.intervened || header.intervened
208
+ ? `Question ${questionIndex + 1}`
209
+ : header.value,
210
+ options,
211
+ });
212
+ }
213
+ return {
214
+ ...toolCall,
215
+ function: {
216
+ ...toolCall.function,
217
+ arguments: JSON.stringify({ ...parsed, questions }),
218
+ },
219
+ };
220
+ }
221
+ function isBlockedRelationshipInteractiveToolCall(toolCall) {
222
+ const name = toolCall.function.name.trim().toLowerCase();
223
+ if (!RELATIONSHIP_INTERACTIVE_TOOLS.has(name))
224
+ return false;
225
+ try {
226
+ const parsed = JSON.parse(toolCall.function.arguments || '{}');
227
+ return parsed[RELATIONSHIP_BLOCK_MARKER] === true;
228
+ }
229
+ catch {
230
+ return true;
231
+ }
232
+ }
233
+ function relationshipSafeToolResultForDisplay(result) {
234
+ return result.success
235
+ ? { success: true, output: SAFE_TOOL_RESULT }
236
+ : { success: false, error: "L'outil a échoué ; aucun contenu brut n'est affiché." };
237
+ }
238
+ function relationshipSafeToolCallsForDisplay(toolCalls) {
239
+ return toolCalls.map((toolCall) => ({
240
+ ...toolCall,
241
+ function: {
242
+ ...toolCall.function,
243
+ arguments: JSON.stringify({ redacted: 'companion-safety' }),
244
+ },
245
+ }));
246
+ }
247
+ function unsafeRelationshipOutboundToolCall(toolCall) {
248
+ const name = toolCall.function.name.trim().toLowerCase();
249
+ if (!RELATIONSHIP_OUTBOUND_TOOLS.has(name))
250
+ return false;
251
+ let parsed;
252
+ try {
253
+ parsed = JSON.parse(toolCall.function.arguments || '{}');
254
+ }
255
+ catch {
256
+ // Malformed outbound arguments are not safe to reinterpret or deliver.
257
+ return true;
258
+ }
259
+ const strings = [];
260
+ const visit = (value) => {
261
+ if (typeof value === 'string') {
262
+ strings.push(value);
263
+ return;
264
+ }
265
+ if (Array.isArray(value)) {
266
+ for (const item of value)
267
+ visit(item);
268
+ return;
269
+ }
270
+ if (value && typeof value === 'object') {
271
+ for (const item of Object.values(value))
272
+ visit(item);
273
+ }
274
+ };
275
+ visit(parsed);
276
+ return strings.some((value) => guardRelationshipReply(value).intervened);
35
277
  }
36
278
  function isIgnorableControlToolCall(toolCall) {
37
279
  const name = toolCall.function?.name?.trim();
@@ -143,6 +385,17 @@ export class AgentExecutor {
143
385
  getDecisionContextProvider() {
144
386
  return this.deps.decisionContextProvider ?? _decisionContextProvider;
145
387
  }
388
+ async getOperationalRobotName() {
389
+ const configured = process.env.CODEBUDDY_ROBOT_NAME?.trim();
390
+ if (configured)
391
+ return configured;
392
+ try {
393
+ return (await this.deps.operationalRobotNameProvider?.())?.trim() || undefined;
394
+ }
395
+ catch {
396
+ return undefined;
397
+ }
398
+ }
146
399
  /**
147
400
  * Get or set the middleware pipeline.
148
401
  * Used by CodeBuddyAgent.enableAutoObservation() to inject middleware.
@@ -168,6 +421,9 @@ export class AgentExecutor {
168
421
  messages,
169
422
  isStreaming,
170
423
  abortController,
424
+ // Authoritative edit set from editor tool CALLS — editors emit diffs in
425
+ // their RESULTS, which the quality gate's text scrape can't parse (V3).
426
+ changedFiles: extractEditedFilesFromHistory(history),
171
427
  };
172
428
  }
173
429
  /**
@@ -194,86 +450,84 @@ export class AgentExecutor {
194
450
  * Execute a tool call, optionally through the LaneQueue for serialization.
195
451
  * Supports LLM-controlled parallelism via `wait_for_previous` parameter.
196
452
  */
197
- executeToolViaLane(toolCall) {
453
+ executeToolViaLane(toolCall, executionExtra) {
198
454
  const laneQueue = this.deps.laneQueue;
199
455
  if (!laneQueue) {
200
- return this.deps.toolHandler.executeTool(toolCall);
456
+ return this.deps.toolHandler.executeTool(toolCall, executionExtra);
201
457
  }
202
458
  const laneId = this.deps.laneId ?? 'default';
203
459
  const isParallel = this.isToolParallelizable(toolCall);
204
460
  const timeoutMs = this.getLaneTaskTimeoutMs(isParallel);
205
- return laneQueue.enqueue(laneId, () => this.deps.toolHandler.executeTool(toolCall), {
461
+ return laneQueue.enqueue(laneId, () => this.deps.toolHandler.executeTool(toolCall, executionExtra), {
206
462
  parallel: isParallel,
207
463
  category: toolCall.function.name,
208
464
  timeout: timeoutMs,
209
465
  });
210
466
  }
211
- /**
212
- * Compute adaptive compaction threshold based on the model's context window.
213
- * Reserves ~30% of context for tool results; rest for system prompt + history.
214
- * Falls back to 70K chars if model info unavailable.
215
- */
216
- getAdaptiveCompactionThreshold() {
217
- try {
218
- const modelName = this.deps.client.getCurrentModel();
219
- const { getModelToolConfig } = require('../../config/model-tools.js');
220
- const config = getModelToolConfig(modelName);
221
- const contextChars = (config.contextWindow ?? 128_000) * 4; // ~4 chars/token
222
- // Allocate 30% of context window for tool results
223
- return Math.max(40_000, Math.floor(contextChars * 0.3));
224
- }
225
- catch {
226
- return 70_000; // Fallback
227
- }
228
- }
229
- /**
230
- * Tool Result Compaction Guard (Native Engine / Manus AI #13)
231
- *
232
- * Before each model call, scan accumulated tool result messages.
233
- * If their total size exceeds an adaptive threshold (scaled to model context),
234
- * compress the oldest ones using RestorableCompressor — replacing full content
235
- * with a compact stub referencing the callId. The content remains restorable
236
- * via the `restore_context` tool.
237
- *
238
- * This prevents deep agent chains from silently overflowing the context window.
239
- */
240
- compactLargeToolResults(preparedMessages, maxToolResultChars) {
241
- const threshold = maxToolResultChars ?? this.getAdaptiveCompactionThreshold();
242
- // Sum characters from tool result messages
243
- let totalToolChars = 0;
244
- for (const m of preparedMessages) {
245
- if (m.role === 'tool' && typeof m.content === 'string') {
246
- totalToolChars += m.content.length;
247
- }
248
- }
249
- if (totalToolChars <= threshold)
250
- return preparedMessages;
251
- const compressor = getRestorableCompressor();
252
- // Compress oldest tool results first (front of the list)
253
- const result = [...preparedMessages];
254
- let charsToFree = totalToolChars - threshold;
255
- for (let i = 0; i < result.length && charsToFree > 0; i++) {
256
- const m = result[i];
257
- if (m === undefined)
258
- continue;
259
- if (m.role === 'tool' && typeof m.content === 'string' && m.content.length > 500) {
260
- const callId = m.tool_call_id || `tool_${i}`;
261
- const compressed = compressor.compress([{
262
- role: m.role,
263
- content: m.content,
264
- tool_call_id: callId,
265
- }]);
266
- if (compressed.messages[0]) {
267
- charsToFree -= (m.content.length - (compressed.messages[0].content?.length ?? 0));
268
- result[i] = { ...m, content: compressed.messages[0].content ?? m.content };
467
+ /** Execute one tool and buffer optional streaming-adapter output. */
468
+ async executeToolForBatch(toolCall, executionExtra, signal, startedAt = Date.now()) {
469
+ const streamChunks = [];
470
+ const extraWithSignal = signal
471
+ ? { ...(executionExtra ?? {}), abortSignal: signal }
472
+ : executionExtra;
473
+ const execute = async () => {
474
+ const streamingTools = new Set(['bash', 'reason', 'generate_document']);
475
+ if (streamingTools.has(toolCall.function.name)) {
476
+ const generator = this.deps.toolHandler.executeToolStreaming(toolCall, extraWithSignal);
477
+ let generated = await generator.next();
478
+ while (!generated.done) {
479
+ streamChunks.push(generated.value);
480
+ generated = await generator.next();
269
481
  }
482
+ return {
483
+ result: generated.value ?? { success: false, error: 'Tool returned no result' },
484
+ streamChunks,
485
+ };
486
+ }
487
+ const streamingAdapter = getStreamingAdapter();
488
+ if (streamingAdapter.supportsStreaming(toolCall.function.name)) {
489
+ const result = await streamingAdapter.wrapWithStreaming(toolCall.function.name, () => this.executeToolViaLane(toolCall, extraWithSignal), (chunk) => streamChunks.push(chunk));
490
+ return { result, streamChunks };
491
+ }
492
+ return {
493
+ result: await this.executeToolViaLane(toolCall, extraWithSignal),
494
+ streamChunks,
495
+ };
496
+ };
497
+ if (!signal) {
498
+ try {
499
+ return await execute();
500
+ }
501
+ catch (error) {
502
+ return {
503
+ result: { success: false, error: `Tool execution failed: ${getErrorMessage(error)}` },
504
+ streamChunks,
505
+ };
270
506
  }
271
507
  }
272
- logger.debug(`ToolResultCompactionGuard: compacted tool results`, {
273
- before: totalToolChars,
274
- freed: totalToolChars - charsToFree,
508
+ return await new Promise((resolve) => {
509
+ let settled = false;
510
+ const finish = (value) => {
511
+ if (settled)
512
+ return;
513
+ settled = true;
514
+ signal.removeEventListener('abort', onAbort);
515
+ resolve(value);
516
+ };
517
+ const onAbort = () => finish({
518
+ result: abortedToolResult(startedAt),
519
+ streamChunks,
520
+ });
521
+ signal.addEventListener('abort', onAbort, { once: true });
522
+ if (signal.aborted) {
523
+ onAbort();
524
+ return;
525
+ }
526
+ void execute().then(finish, (error) => finish({
527
+ result: { success: false, error: `Tool execution failed: ${getErrorMessage(error)}` },
528
+ streamChunks,
529
+ }));
275
530
  });
276
- return result;
277
531
  }
278
532
  /**
279
533
  * Process a user message sequentially (non-streaming)
@@ -291,50 +545,115 @@ export class AgentExecutor {
291
545
  * processUserMessageStream (F10): handles @mention expansion, fires
292
546
  * persona auto-selection, and feeds the knowledge graph in the
293
547
  * background. Returns the cleaned message (with `@web` / `@git` /
294
- * `@terminal` markers removed). Both paths must call this before
295
- * entering their respective main loops so the loops stay parity.
548
+ * `@terminal` markers removed) and ephemeral context for bare `@path`
549
+ * mentions. Both paths must call this before entering their respective
550
+ * main loops so the loops stay parity.
296
551
  *
297
552
  * All sub-steps are best-effort: any individual failure is swallowed at
298
553
  * debug level so a broken plugin cannot break the main loop.
299
554
  */
300
- async preprocessUserMessage(message, messages) {
301
- // 1. Process @mentions and inject context blocks
302
- try {
303
- const { processMentions } = await import('../../input/context-mentions.js');
304
- const mentionResult = await processMentions(message);
305
- if (mentionResult.contextBlocks.length > 0) {
306
- message = mentionResult.cleanedMessage;
307
- // Update the last user message in the messages array to match
308
- const lastUserMsg = [...messages].reverse().find(m => m.role === 'user');
309
- if (lastUserMsg && typeof lastUserMsg.content === 'string') {
310
- lastUserMsg.content = message;
311
- }
312
- for (const block of mentionResult.contextBlocks) {
313
- messages.push({
555
+ async preprocessUserMessage(message, messages, projectRoot, readOnlySelfInspection = false, isolatedSharedHost = false) {
556
+ // Mentions can read explicit workspace files, persona selection can alter
557
+ // identity, and KG extraction persists project entities. None belongs in a
558
+ // core-only technical self-inspection turn.
559
+ if (readOnlySelfInspection) {
560
+ return { message, fileMentionContextBlocks: [], fileMentionUserNotices: [] };
561
+ }
562
+ // Avoid loading the sizeable mention parser (fs-extra, axios, child_process)
563
+ // for the overwhelmingly common case where the message contains no mention.
564
+ const mentionPromise = CONTEXT_MENTION_PATTERN.test(message)
565
+ ? import('../../input/context-mentions.js')
566
+ .then(({ processMentions }) => processMentions(message, { projectRoot }))
567
+ .catch(() => null)
568
+ : Promise.resolve(null);
569
+ // Bare @path mentions are resolved independently from the heavier legacy
570
+ // mention parser. They are turn-scoped context: the user's message remains
571
+ // readable in history, while file contents do not persist into later turns.
572
+ const fileMentionPromise = FILE_MENTION_CANDIDATE_PATTERN.test(message)
573
+ ? import('../../context/file-mentions.js')
574
+ .then(async ({ formatFileMentionContext, resolveFileMentions }) => {
575
+ const resolution = await resolveFileMentions(message, { projectRoot });
576
+ const blocks = resolution.files.map((file) => ({
577
+ role: 'system',
578
+ content: `<context type="file_mention" ephemeral="true">\n${formatFileMentionContext(file)}\n</context>`,
579
+ }));
580
+ const notices = [];
581
+ for (const ignored of resolution.issues) {
582
+ logger.debug('File mention content was not injected', {
583
+ path: ignored.path,
584
+ reason: ignored.reason,
585
+ });
586
+ blocks.push({
314
587
  role: 'system',
315
- content: `<context type="${block.type}" source="${block.source}">\n${block.content}\n</context>`,
588
+ content: [
589
+ '<context type="file_mention_notice" ephemeral="true">',
590
+ `Mention ${JSON.stringify(ignored.mention)} was not included: ${ignored.message}`,
591
+ '</context>',
592
+ ].join('\n'),
316
593
  });
594
+ if (ignored.reason === 'not-found') {
595
+ notices.push(`Fichier ${ignored.path} introuvable, ignoré.`);
596
+ }
317
597
  }
598
+ return { blocks, notices };
599
+ })
600
+ .catch((error) => {
601
+ const errorMessage = getErrorMessage(error);
602
+ logger.debug('File mention resolution failed closed', {
603
+ error: errorMessage,
604
+ });
605
+ return {
606
+ blocks: [{
607
+ role: 'system',
608
+ content: [
609
+ '<context type="file_mention_notice" ephemeral="true">',
610
+ `File mention resolution failed: ${errorMessage}`,
611
+ '</context>',
612
+ ].join('\n'),
613
+ }],
614
+ notices: [`Mention de fichier ignorée : ${errorMessage}`],
615
+ };
616
+ })
617
+ : Promise.resolve({ blocks: [], notices: [] });
618
+ // Persona selection affects this turn's system prompt, so keep it on the
619
+ // critical path, but load it concurrently with explicit mention expansion.
620
+ const personaPromise = isolatedSharedHost
621
+ ? Promise.resolve(null)
622
+ : import('../../personas/persona-manager.js')
623
+ .then(({ getPersonaManager }) => getPersonaManager().autoSelectPersona({ message }))
624
+ .catch(() => null);
625
+ const [mentionResult, , fileMentionResolution] = await Promise.all([
626
+ mentionPromise,
627
+ personaPromise,
628
+ fileMentionPromise,
629
+ ]);
630
+ const fileMentionContextBlocks = fileMentionResolution.blocks;
631
+ const fileMentionUserNotices = fileMentionResolution.notices;
632
+ if (mentionResult && mentionResult.contextBlocks.length > 0) {
633
+ message = mentionResult.cleanedMessage;
634
+ const lastUserMsg = [...messages].reverse().find(m => m.role === 'user');
635
+ if (lastUserMsg && typeof lastUserMsg.content === 'string') {
636
+ lastUserMsg.content = message;
318
637
  }
319
- }
320
- catch { /* mention processing optional */ }
321
- // 2. Auto-select persona (fire-and-forget, no await needed)
322
- try {
323
- const { getPersonaManager } = await import('../../personas/persona-manager.js');
324
- getPersonaManager().autoSelectPersona({ message });
325
- }
326
- catch { /* persona auto-select optional */ }
327
- // 3. Auto-extract entities into the knowledge graph (background)
328
- try {
329
- const { getKnowledgeGraph, isTrivialMessage } = await import('../../memory/knowledge-graph.js');
330
- if (!isTrivialMessage(message)) {
331
- const kg = getKnowledgeGraph();
332
- await kg.load();
333
- kg.extractFromMessageDeduped(message);
638
+ for (const block of mentionResult.contextBlocks) {
639
+ messages.push({
640
+ role: 'system',
641
+ content: `<context type="${block.type}" source="${block.source}">\n${block.content}\n</context>`,
642
+ });
334
643
  }
335
644
  }
336
- catch { /* non-critical */ }
337
- return message;
645
+ // Entity extraction is persistence work. Defer even the module evaluation
646
+ // until the current call stack has started response preparation.
647
+ if (!isolatedSharedHost && classifyQuery(message).complexity !== 'trivial') {
648
+ setImmediate(() => {
649
+ void import('../../memory/knowledge-graph.js').then(async ({ getKnowledgeGraph }) => {
650
+ const kg = getKnowledgeGraph();
651
+ await kg.load();
652
+ kg.extractFromMessageDeduped(message);
653
+ }).catch(() => { });
654
+ });
655
+ }
656
+ return { message, fileMentionContextBlocks, fileMentionUserNotices };
338
657
  }
339
658
  /**
340
659
  * Process a user message — sequential adapter (Phase D of task #5 fusion).
@@ -344,18 +663,25 @@ export class AgentExecutor {
344
663
  * into `history` and the right messages into `messages` — we just slice
345
664
  * the new entries out of `history`.
346
665
  *
347
- * Streaming-only events (`ask_user`, `tool_stream`, `token_count`,
348
- * `reasoning`, `steer`) are silently dropped per décision #3 of the plan
349
- * `~/.claude/plans/vague1-task5-design-decisions.md` the sequential
350
- * caller cannot suspend, so these have no meaningful sync representation.
666
+ * Progress-only events (`tool_stream`, `token_count`, `reasoning`, `steer`)
667
+ * are dropped per décision #3 of the fusion plan. `ask_user` is different:
668
+ * the sequential caller cannot suspend, but it can surface the question and
669
+ * accept the answer as a later turn, so the collector persists it as an
670
+ * assistant entry in both history projections.
351
671
  *
352
672
  * The sequential path has no abortController support (signature-bound) —
353
673
  * we pass null to runTurnLoop and rely on its internal handling.
354
674
  */
355
- async processUserMessage(message, history, messages) {
675
+ async processUserMessage(message, history, messages, turnStartedAt = Date.now(), transientContext, relationshipSafety = false, surface, introspectionText) {
356
676
  const initialHistoryLength = history.length;
357
- for await (const _event of this.runTurnLoop(message, history, messages, null)) {
358
- // Events dropped. runTurnLoop pushes ChatEntries to history directly.
677
+ for await (const event of this.runMeasuredTurn(message, history, messages, null, turnStartedAt, transientContext, relationshipSafety, surface, introspectionText)) {
678
+ if (event.type === 'ask_user' && event.askUser?.question.trim()) {
679
+ const content = sanitizeAssistantOutput(event.askUser.question.trim());
680
+ history.push({ type: 'assistant', content, timestamp: new Date() });
681
+ messages.push({ role: 'assistant', content });
682
+ }
683
+ // Other entries are pushed by runTurnLoop itself. Progress-only events
684
+ // have no durable sequential representation and are intentionally dropped.
359
685
  }
360
686
  return history.slice(initialHistoryLength);
361
687
  }
@@ -369,7 +695,7 @@ export class AgentExecutor {
369
695
  * path.
370
696
  *
371
697
  * Derived from the comparative audit Gemini CLI vs Code Buddy
372
- * (claude-et-patrice/propositions/AUDIT-GEMINI-CLI-AGENTIC-LOOP-2026-05-04.md,
698
+ * (le dépôt privé de passation, propositions/AUDIT-GEMINI-CLI-AGENTIC-LOOP-2026-05-04.md,
373
699
  * recommendation #2 — fix défensif S scope). Backward compat preserved:
374
700
  * existing `processUserMessage` callers see no change.
375
701
  *
@@ -379,10 +705,10 @@ export class AgentExecutor {
379
705
  * @returns `{ entries }` — new ChatEntries pushed during this turn
380
706
  * PLUS `{ streamingEvents }` — every event the loop yielded, in order
381
707
  */
382
- async processUserMessageWithStreamingEvents(message, history, messages) {
708
+ async processUserMessageWithStreamingEvents(message, history, messages, turnStartedAt = Date.now()) {
383
709
  const initialHistoryLength = history.length;
384
710
  const streamingEvents = [];
385
- for await (const event of this.runTurnLoop(message, history, messages, null)) {
711
+ for await (const event of this.runMeasuredTurn(message, history, messages, null, turnStartedAt)) {
386
712
  streamingEvents.push(event);
387
713
  }
388
714
  return {
@@ -406,8 +732,27 @@ export class AgentExecutor {
406
732
  * Stream user-message processing — thin adapter over `runTurnLoop`.
407
733
  * Forwards each `ExecutorEvent` as a `StreamingChunk` (alias-compatible).
408
734
  */
409
- async *processUserMessageStream(message, history, messages, abortController) {
410
- yield* this.runTurnLoop(message, history, messages, abortController);
735
+ async *processUserMessageStream(message, history, messages, abortController, turnStartedAt = Date.now(), transientContext, relationshipSafety = false, surface, introspectionText) {
736
+ yield* this.runMeasuredTurn(message, history, messages, abortController, turnStartedAt, transientContext, relationshipSafety, surface, introspectionText);
737
+ }
738
+ /** Measure end-to-end perceived latency around the single authoritative loop. */
739
+ async *runMeasuredTurn(message, history, messages, abortController, startedAt, transientContext, relationshipSafety = false, surface, introspectionText) {
740
+ const operationId = getLatencyOptimizer().startOperation('assistant_turn', startedAt);
741
+ let recordedFirstVisibleResponse = false;
742
+ try {
743
+ for await (const event of this.runTurnLoop(message, history, messages, abortController, transientContext, relationshipSafety, surface, introspectionText)) {
744
+ if (!recordedFirstVisibleResponse &&
745
+ (event.type === 'content' || event.type === 'reasoning' || event.type === 'tool_calls')) {
746
+ recordedFirstVisibleResponse = true;
747
+ getStreamingOptimizer().recordFirstToken(Date.now() - startedAt);
748
+ }
749
+ yield event;
750
+ }
751
+ }
752
+ finally {
753
+ getLatencyOptimizer().endOperation(operationId);
754
+ getStreamingOptimizer().recordTotalTime(Date.now() - startedAt);
755
+ }
411
756
  }
412
757
  /**
413
758
  * Unified turn loop — Phase C of the task #5 fusion. Single source of
@@ -421,13 +766,134 @@ export class AgentExecutor {
421
766
  *
422
767
  * Plan : ~/.claude/plans/vague1-task5-design-decisions.md
423
768
  */
424
- async *runTurnLoop(message, history, messages, abortController) {
769
+ async *runTurnLoop(message, history, messages, abortController, transientContext, relationshipSafety = false, surface, introspectionText) {
770
+ const timelineEnabled = process.env.CODEBUDDY_TIMELINE === 'true' && this.deps.recordTimelineTurn !== undefined;
771
+ const timelineHistoryStart = timelineEnabled ? history.length : 0;
772
+ const timelineTurn = timelineEnabled
773
+ ? Math.max(1, history.reduce((count, entry) => count + (entry.type === 'user' ? 1 : 0), 0))
774
+ : 0;
425
775
  // Shared pre-processing with the sequential path (@mentions, persona
426
776
  // auto-select, knowledge graph extraction). Single source of truth in
427
777
  // preprocessUserMessage (F10).
428
- message = await this.preprocessUserMessage(message, messages);
429
- // Calculate input tokens
430
- let inputTokens = this.deps.tokenCounter.countMessageTokens(messages);
778
+ // Voice and other transports may wrap the current utterance in recent
779
+ // history. Intent must be derived from the explicit current text only: an
780
+ // earlier "es-tu consciente ?" must never turn a later write request into
781
+ // a read-only introspection turn.
782
+ const introspectionTextForTurn = introspectionText ?? message;
783
+ const introspectionIntent = classifyLisaIntrospection(introspectionTextForTurn);
784
+ const readOnlySelfInspection = introspectionIntent === 'describe' || introspectionIntent === 'inspect';
785
+ const guardGenerativeSelfInspection = introspectionIntent === 'improve';
786
+ const isolatedSharedHost = surface === 'http';
787
+ const turnCwd = typeof this.deps.toolHandler.getWorkingDirectory === 'function'
788
+ ? this.deps.toolHandler.getWorkingDirectory()
789
+ : process.cwd();
790
+ // A stateful `cd` changes the tool cwd, not the TUI project boundary.
791
+ // Keep @file confinement anchored to the process launch directory there;
792
+ // embedded hosts continue to provide their explicit workspace directory.
793
+ const fileMentionProjectRoot = surface === 'cli' ? process.cwd() : turnCwd;
794
+ const preprocessed = await this.preprocessUserMessage(message, messages, fileMentionProjectRoot, readOnlySelfInspection, isolatedSharedHost);
795
+ message = preprocessed.message;
796
+ const fileMentionContextBlocks = preprocessed.fileMentionContextBlocks;
797
+ for (const notice of preprocessed.fileMentionUserNotices) {
798
+ history.push({ type: 'assistant', content: notice, timestamp: new Date() });
799
+ yield { type: 'content', content: `\n${notice}\n` };
800
+ }
801
+ const jitContextBlocks = [];
802
+ // Query ranking should also follow the current utterance on transports that
803
+ // embed history in `message`; keep the full composite only as user context
804
+ // for the provider. Normal CLI turns retain the preprocessed query.
805
+ const turnQueryText = introspectionText ?? message;
806
+ let permissionMode;
807
+ let providerName;
808
+ let operationalRobotName;
809
+ if (introspectionIntent !== null) {
810
+ operationalRobotName = await this.getOperationalRobotName();
811
+ try {
812
+ const { getPermissionModeManager } = await import('../../security/permission-modes.js');
813
+ permissionMode = getPermissionModeManager().getMode();
814
+ }
815
+ catch {
816
+ // Runtime permission evidence is optional. Never invent a value.
817
+ }
818
+ try {
819
+ providerName = this.deps.client.getProviderName();
820
+ }
821
+ catch {
822
+ // Legacy/test clients may not expose provider metadata.
823
+ }
824
+ }
825
+ if (readOnlySelfInspection) {
826
+ if (isLisaEvolutionRequest(introspectionTextForTurn)) {
827
+ const { formatEvolutionNotesForVoice, queryEvolutionNotes, readEvolutionNotes, } = await import('../../self-model/evolution-notes.js');
828
+ const since = introspectionTextForTurn.match(/\b20\d{2}-\d{2}-\d{2}\b/)?.[0];
829
+ const notes = queryEvolutionNotes(await readEvolutionNotes({ workDir: turnCwd }), {
830
+ ...(since ? { since } : {}),
831
+ limit: 3,
832
+ });
833
+ const content = sanitizeAssistantOutput(formatEvolutionNotesForVoice(notes));
834
+ history.push({ type: 'assistant', content, timestamp: new Date() });
835
+ messages.push({ role: 'assistant', content });
836
+ yield { type: 'content', content };
837
+ yield {
838
+ type: 'token_count',
839
+ tokenCount: this.deps.tokenCounter.countTokens(content),
840
+ };
841
+ if (timelineEnabled) {
842
+ await this.recordCompletedTimelineTurn(timelineHistoryStart, timelineTurn, history, message);
843
+ }
844
+ yield { type: 'done' };
845
+ return;
846
+ }
847
+ // A provider can ignore an optional tool schema, and free-form prose
848
+ // cannot provide a hard postcondition against invented inner experience.
849
+ // Build the complete report locally from the attested, curated core on
850
+ // every strict describe/inspect turn. No provider, plugin or generic
851
+ // workspace tool participates in this path.
852
+ const { buildOperationalSelfModel } = await import('../../identity/operational-self-model.js');
853
+ const selfModel = buildOperationalSelfModel({
854
+ cwd: turnCwd,
855
+ focus: introspectionTextForTurn,
856
+ depth: introspectionIntent === 'describe' ? 'summary' : 'deep',
857
+ ...(operationalRobotName
858
+ ? { robotName: operationalRobotName }
859
+ : {}),
860
+ runtime: {
861
+ providerInvoked: false,
862
+ ...(this.deps.client.getCurrentModel()
863
+ ? { model: this.deps.client.getCurrentModel() }
864
+ : {}),
865
+ provider: providerName,
866
+ ...(surface ? { surface } : {}),
867
+ ...(permissionMode ? { permissionMode } : {}),
868
+ ...configuredSensoryRuntime(surface),
869
+ },
870
+ });
871
+ const content = sanitizeAssistantOutput(guardLisaOperationalSelfInspectionReply(renderLisaOperationalSelfResponse(selfModel, introspectionTextForTurn, introspectionIntent), introspectionTextForTurn));
872
+ history.push({ type: 'assistant', content, timestamp: new Date() });
873
+ messages.push({ role: 'assistant', content });
874
+ yield { type: 'content', content };
875
+ yield {
876
+ type: 'token_count',
877
+ tokenCount: this.deps.tokenCounter.countTokens(content),
878
+ };
879
+ if (timelineEnabled) {
880
+ await this.recordCompletedTimelineTurn(timelineHistoryStart, timelineTurn, history, message);
881
+ }
882
+ yield { type: 'done' };
883
+ return;
884
+ }
885
+ // Pure, per-turn tone context. Keep it out of the persisted transcript and
886
+ // the agent identity: a changing system-prompt append would rebuild Cowork's
887
+ // cached agent on every message. This block is added to each prepared LLM
888
+ // request in the turn instead, including post-tool rounds.
889
+ const emotionalPresenceContext = buildTextEmotionalPresenceContext(turnQueryText, messages.flatMap((turn) => typeof turn.content === 'string'
890
+ ? [{ role: turn.role, content: turn.content }]
891
+ : []));
892
+ const currentTurnContext = transientContext?.trim();
893
+ const { injection: ctxLevel, complexity: queryComplexity } = classifyQuery(turnQueryText);
894
+ logger.debug(`Query classified as '${queryComplexity}' — context injection level: ${JSON.stringify(ctxLevel)}`);
895
+ const incrementalTokenCounter = new IncrementalMessageTokenCounter((batch) => this.deps.tokenCounter.countMessageTokens(batch));
896
+ let inputTokens = incrementalTokenCounter.count(messages);
431
897
  yield {
432
898
  type: "token_count",
433
899
  tokenCount: inputTokens,
@@ -435,6 +901,41 @@ export class AgentExecutor {
435
901
  const maxToolRounds = this.config.maxToolRounds;
436
902
  let toolRounds = 0;
437
903
  let totalOutputTokens = 0;
904
+ let totalInputTokensForCost = 0;
905
+ let providerPromptTokens = 0;
906
+ let providerCompletionTokens = 0;
907
+ let providerUsageSeen = false;
908
+ let sessionCostRecorded = false;
909
+ const recordTurnCost = () => {
910
+ if (sessionCostRecorded)
911
+ return;
912
+ sessionCostRecorded = true;
913
+ try {
914
+ // Pass provider usage when available (takes precedence over local estimates)
915
+ const providerUsage = providerUsageSeen
916
+ ? { promptTokens: providerPromptTokens, completionTokens: providerCompletionTokens }
917
+ : undefined;
918
+ // Only pass provider usage when the provider reported one, so the
919
+ // historical two-argument call (and its tests) stays byte-identical.
920
+ if (providerUsage) {
921
+ this.config.recordSessionCost(totalInputTokensForCost, totalOutputTokens, providerUsage);
922
+ }
923
+ else {
924
+ this.config.recordSessionCost(totalInputTokensForCost, totalOutputTokens);
925
+ }
926
+ }
927
+ catch (error) {
928
+ logger.warn('Failed to record session cost', { error: getErrorMessage(error) });
929
+ }
930
+ try {
931
+ this.config.recordTurnProviderUsage?.(providerUsageSeen
932
+ ? { promptTokens: providerPromptTokens, completionTokens: providerCompletionTokens }
933
+ : undefined);
934
+ }
935
+ catch (error) {
936
+ logger.warn('Failed to record provider turn usage', { error: getErrorMessage(error) });
937
+ }
938
+ };
438
939
  // In-loop recovery budgets (Hermes parity): bound re-prompts WITHIN a turn
439
940
  // so a length-truncated or post-tool-empty response is recovered instead of
440
941
  // returned half-written. 0 disables. Per-turn counters.
@@ -450,16 +951,17 @@ export class AgentExecutor {
450
951
  const maxEmptyRetries = parseRecoveryBudget(process.env.CODEBUDDY_MAX_EMPTY_RETRIES, 0);
451
952
  let lengthContinuations = 0;
452
953
  let emptyRetries = 0;
453
- // Phase (d).21 ship 4 — start a progress session for this turn.
454
- // The default sink (boot-wired) logs at 25/50/75/100. Lazy-import to
455
- // avoid circular load at module init time.
456
954
  try {
457
- const { getProgressTracker } = await import('../planner/progress-default-sink.js');
458
955
  getProgressTracker().start(maxToolRounds);
459
956
  }
460
957
  catch { /* progress tracker optional */ }
461
958
  try {
462
959
  const pipeline = this.deps.middlewarePipeline;
960
+ // New task: clear per-task middleware latching (quality-gate run count,
961
+ // auto-repair attempts, verification one-shot warning). The pipeline is
962
+ // built once and reused across tasks while toolRound restarts at 0, so
963
+ // without this the gates would silently stay off after the first task(s).
964
+ pipeline?.resetForNewTask?.();
463
965
  let terminateDetectedStreaming = false;
464
966
  while (toolRounds < maxToolRounds) {
465
967
  if (abortController?.signal.aborted) {
@@ -478,8 +980,13 @@ export class AgentExecutor {
478
980
  return;
479
981
  }
480
982
  if (mwResult.action === 'compact') {
481
- // Trigger context compaction
482
- this.deps.contextManager.prepareMessages(messages);
983
+ // Trigger context compaction IN PLACE — prepareMessages() is pure
984
+ // and its discarded return made this action a silent no-op.
985
+ const compacted = compactTurnMessagesInPlace(this.deps.contextManager, messages, {
986
+ isolatedSharedHost,
987
+ });
988
+ if (compacted)
989
+ incrementalTokenCounter.invalidate();
483
990
  // S7: record a fork run at the compaction boundary for lineage.
484
991
  // No-op unless this session is linked to an observability run.
485
992
  const forkId = recordCompactionFork(getActiveRunStore(), this.deps.toolHandler.getRunId());
@@ -494,102 +1001,161 @@ export class AgentExecutor {
494
1001
  });
495
1002
  }
496
1003
  }
497
- // Rebuild the system prompt query-aware on the first round only.
498
- // Per-turn rebuild costs are dominated by manager .load() calls
499
- // (~50ms); doing it only on toolRounds === 0 amortizes the cost
500
- // over the whole turn loop. Sub-turn tool follow-ups reuse the
501
- // SP picked at turn start.
1004
+ // Start every independent pre-request task before awaiting any of it.
1005
+ // Time-to-first-token is then bounded by the slowest task instead of the
1006
+ // sum of prompt building, tool selection, and context enrichment.
502
1007
  const rebuildSystemPromptForQuery = this.deps.rebuildSystemPromptForQuery;
503
- if (toolRounds === 0 && rebuildSystemPromptForQuery) {
504
- try {
505
- const rebuiltSP = await rebuildSystemPromptForQuery(message);
506
- const firstMessage = messages[0];
507
- if (rebuiltSP && firstMessage && firstMessage.role === 'system') {
508
- firstMessage.content = rebuiltSP;
509
- logger.debug(`[agent-executor] system prompt rebuilt query-aware (${rebuiltSP.length} chars)`);
510
- }
511
- }
512
- catch (err) {
1008
+ const rebuiltSystemPromptPromise = toolRounds === 0 &&
1009
+ rebuildSystemPromptForQuery &&
1010
+ !isolatedSharedHost
1011
+ ? rebuildSystemPromptForQuery(turnQueryText).catch((err) => {
513
1012
  logger.warn('[agent-executor] query-aware SP rebuild failed', { error: String(err) });
514
- }
515
- }
1013
+ return null;
1014
+ })
1015
+ : Promise.resolve(null);
516
1016
  // Profile-aware tool selection. For `lite` (small Ollama models),
517
- // shrink the tool set to ~5 with a minimal alwaysInclude — we
518
- // don't want to dangle `remember`/`lessons_*` in front of a model
519
- // that can't actually call tools and would inline-hallucinate them.
1017
+ // shrink the tool set to a minimal, reliable core.
520
1018
  const activeModelName = this.deps.client.getCurrentModel() ?? '';
1019
+ const modelToolConfig = getModelToolConfig(activeModelName);
521
1020
  let selectionOpts = activeModelName ? { modelName: activeModelName } : {};
522
- try {
523
- const { getModelToolConfig } = await import('../../config/model-tools.js');
524
- const cfg = getModelToolConfig(activeModelName);
525
- if (cfg.promptProfile === 'lite') {
526
- selectionOpts = {
527
- ...selectionOpts,
528
- maxTools: 5,
529
- alwaysInclude: ['view_file', 'bash', 'search'],
530
- };
531
- }
1021
+ if (introspectionIntent === 'improve') {
1022
+ selectionOpts = {
1023
+ ...selectionOpts,
1024
+ // Improvement is not silently elevated: these are only model-facing
1025
+ // schemas. ToolHandler still applies the active permission, trust,
1026
+ // confirmation, and WritePolicy gates to every requested effect.
1027
+ alwaysInclude: ['self_describe', 'view_file', 'search', 'apply_patch', 'bash'],
1028
+ enableCaching: false,
1029
+ };
1030
+ }
1031
+ else if (isHeadlessLocalPromptCompact()) {
1032
+ selectionOpts = {
1033
+ ...selectionOpts,
1034
+ maxTools: HEADLESS_LOCAL_COMPACT_MAX_TOOLS,
1035
+ alwaysInclude: [...HEADLESS_LOCAL_COMPACT_ALWAYS_INCLUDE],
1036
+ };
1037
+ }
1038
+ else if (modelToolConfig.promptProfile === 'lite') {
1039
+ selectionOpts = {
1040
+ ...selectionOpts,
1041
+ maxTools: 5,
1042
+ alwaysInclude: ['view_file', 'bash', 'search'],
1043
+ };
1044
+ }
1045
+ const selectionPromise = this.deps.toolSelectionStrategy.selectToolsForQuery(turnQueryText, selectionOpts);
1046
+ // Build context in a scratch array while the prompt and tools are being
1047
+ // prepared. It is appended only after transcript preparation so the
1048
+ // existing compaction and repair ordering remains unchanged.
1049
+ const contextBlocks = [
1050
+ ...fileMentionContextBlocks,
1051
+ ...jitContextBlocks,
1052
+ ];
1053
+ const contextPromise = toolRounds === 0
1054
+ ? injectInitialContext(contextBlocks, {
1055
+ message: turnQueryText,
1056
+ introspectionText: introspectionTextForTurn,
1057
+ cwd: turnCwd,
1058
+ ctxLevel,
1059
+ loadWorkspaceContext: lazyGetWorkspaceContext,
1060
+ decisionContextProvider: this.getDecisionContextProvider(),
1061
+ icmBridgeProvider: this.getICMBridgeProvider(),
1062
+ codeGraphContextProvider: this.getCodeGraphContextProvider(),
1063
+ docsContextProvider: this.getDocsContextProvider(),
1064
+ isolatedSharedHost,
1065
+ ...(operationalRobotName ? { operationalRobotName } : {}),
1066
+ ...(introspectionIntent
1067
+ ? {
1068
+ operationalRuntime: {
1069
+ ...(activeModelName ? { model: activeModelName } : {}),
1070
+ ...(providerName ? { provider: providerName } : {}),
1071
+ ...(surface ? { surface } : {}),
1072
+ ...(permissionMode ? { permissionMode } : {}),
1073
+ ...configuredSensoryRuntime(surface),
1074
+ },
1075
+ }
1076
+ : {}),
1077
+ })
1078
+ : injectNextRoundContext(contextBlocks, {
1079
+ message: turnQueryText,
1080
+ introspectionText: introspectionTextForTurn,
1081
+ cwd: turnCwd,
1082
+ queryComplexity,
1083
+ collectiveGraph: ctxLevel.collectiveGraph,
1084
+ isolatedSharedHost,
1085
+ });
1086
+ const [rebuiltSystemPrompt, selectionResult] = await Promise.all([
1087
+ rebuiltSystemPromptPromise,
1088
+ selectionPromise,
1089
+ contextPromise,
1090
+ ]);
1091
+ const firstMessage = messages[0];
1092
+ if (rebuiltSystemPrompt && firstMessage && firstMessage.role === 'system') {
1093
+ firstMessage.content = rebuiltSystemPrompt;
1094
+ incrementalTokenCounter.invalidate();
1095
+ logger.debug(`[agent-executor] system prompt rebuilt query-aware (${rebuiltSystemPrompt.length} chars)`);
532
1096
  }
533
- catch { /* model-tools optional, never block */ }
534
- const selectionResult = await this.deps.toolSelectionStrategy.selectToolsForQuery(message, selectionOpts);
535
1097
  let tools = selectionResult.tools;
536
1098
  let forcedChatOnlyToolRunModel = null;
537
- if (toolRounds === 0)
1099
+ if (toolRounds === 0) {
538
1100
  this.deps.toolSelectionStrategy.cacheTools(tools, activeModelName);
539
- // If the active model is flagged `supportsToolCalls: false` in
540
- // model-tools.ts (typical of small Ollama / LM Studio models that
541
- // can't reliably emit OpenAI-style tool_call frames), drop the
542
- // tool list entirely. Without this, the LLM still sees tool
543
- // descriptors in the API contract and tries to "call" them by
544
- // generating raw JSON in the assistant content — which we can't
545
- // dispatch, so the user gets back the JSON literal instead of an
546
- // executed tool result. Honest fallback: tool-less chat.
1101
+ }
1102
+ // Models explicitly marked chat-only must not see callable schemas.
1103
+ if (activeModelName && modelToolConfig.supportsToolCalls === false && tools.length > 0) {
1104
+ if (process.env.GROK_FORCE_TOOLS === 'true') {
1105
+ forcedChatOnlyToolRunModel = activeModelName;
1106
+ }
1107
+ else {
1108
+ logger.debug(`[agent-executor] supportsToolCalls=false for ${activeModelName} — dropping ${tools.length} tools from chat call`);
1109
+ tools = [];
1110
+ }
1111
+ }
1112
+ const turnExecutionExtra = introspectionIntent
1113
+ ? {
1114
+ ...(activeModelName ? { model: activeModelName } : {}),
1115
+ ...(providerName ? { provider: providerName } : {}),
1116
+ ...(surface ? { surface } : {}),
1117
+ ...(permissionMode ? { permissionMode } : {}),
1118
+ ...(operationalRobotName
1119
+ ? { robotName: operationalRobotName }
1120
+ : {}),
1121
+ exposedToolNames: tools.map((tool) => tool.function.name),
1122
+ introspectionIntent,
1123
+ }
1124
+ : undefined;
1125
+ let preparedMessages;
547
1126
  try {
548
- const { getModelToolConfig } = await import('../../config/model-tools.js');
549
- // CodeBuddyClient exposes `getCurrentModel()`; the previous
550
- // `(client as { defaultModel? }).defaultModel` access always
551
- // resolved to undefined because that field doesn't exist on
552
- // the dispatcher class — left the guard latent for ages.
553
- const modelName = activeModelName;
554
- if (modelName) {
555
- const cfg = getModelToolConfig(modelName);
556
- if (cfg.supportsToolCalls === false && tools.length > 0) {
557
- if (process.env.GROK_FORCE_TOOLS === 'true') {
558
- forcedChatOnlyToolRunModel = modelName;
559
- }
560
- else {
561
- logger.debug(`[agent-executor] supportsToolCalls=false for ${modelName} — dropping ${tools.length} tools from chat call`);
562
- tools = [];
563
- }
564
- }
1127
+ preparedMessages = prepareTurnMessages(this.deps.contextManager, messages, {
1128
+ isolatedSharedHost,
1129
+ });
1130
+ }
1131
+ catch (error) {
1132
+ if (error instanceof ContextCompactionError) {
1133
+ logger.error('Context compaction refused the provider call', {
1134
+ code: error.code,
1135
+ tokens: error.tokens,
1136
+ limit: error.limit,
1137
+ });
1138
+ yield { type: 'content', content: `\n\n${error.message}` };
1139
+ yield { type: 'done' };
1140
+ return;
565
1141
  }
1142
+ throw error;
566
1143
  }
567
- catch { /* model-tools is optional, never block the loop */ }
568
- const preparedMessages = prepareTurnMessages(this.deps.contextManager, messages);
569
- // --- Query-aware context injection (saves ~15-20K tokens for trivial messages) ---
570
- const { injection: ctxLevel, complexity: queryComplexity } = classifyQuery(message);
571
- logger.debug(`Query classified as '${queryComplexity}' — context injection level: ${JSON.stringify(ctxLevel)}`);
572
- await injectInitialContext(preparedMessages, {
573
- message,
574
- cwd: process.cwd(),
575
- ctxLevel,
576
- loadWorkspaceContext: lazyGetWorkspaceContext,
577
- decisionContextProvider: this.getDecisionContextProvider(),
578
- icmBridgeProvider: this.getICMBridgeProvider(),
579
- codeGraphContextProvider: this.getCodeGraphContextProvider(),
580
- docsContextProvider: this.getDocsContextProvider(),
581
- });
582
- // Décision #4 du plan task #5 — injection between-rounds promue depuis
583
- // le sequential path. Lessons + KG (si complex) + todo réinjectés à
584
- // chaque round > 0 pour préserver la qualité des conversations
585
- // multi-round dans le streaming. Sentinel `TODO #4` couvre cet invariant.
586
- if (toolRounds > 0) {
587
- await injectNextRoundContext(preparedMessages, {
588
- message,
589
- cwd: process.cwd(),
590
- queryComplexity,
1144
+ preparedMessages.push(...contextBlocks);
1145
+ if (emotionalPresenceContext) {
1146
+ preparedMessages.push({
1147
+ role: 'system',
1148
+ content: `<interaction_context ephemeral="true">\n${emotionalPresenceContext}\n</interaction_context>`,
1149
+ });
1150
+ }
1151
+ if (currentTurnContext) {
1152
+ preparedMessages.push({
1153
+ role: 'system',
1154
+ content: `<companion_current_turn_context ephemeral="true">\n${currentTurnContext}\n</companion_current_turn_context>`,
591
1155
  });
592
1156
  }
1157
+ inputTokens = incrementalTokenCounter.count(messages);
1158
+ totalInputTokensForCost += inputTokens;
593
1159
  // Context warning — always check regardless of pipeline state
594
1160
  {
595
1161
  const contextWarning = this.deps.contextManager.shouldWarn(preparedMessages);
@@ -613,34 +1179,109 @@ export class AgentExecutor {
613
1179
  }
614
1180
  }
615
1181
  }
616
- const stream = this.deps.client.chatStream(preparedMessages, tools, undefined, this.config.isGrokModel() && this.deps.toolSelectionStrategy.shouldUseSearchFor(message)
617
- ? { search_parameters: { mode: "auto" } }
618
- : { search_parameters: { mode: "off" } });
619
1182
  this.deps.streamingHandler.reset();
620
- for await (const chunk of stream) {
621
- if (abortController?.signal.aborted) {
622
- yield { type: "content", content: "\n\n[Operation cancelled by user]" };
623
- yield { type: "done" };
624
- return;
625
- }
626
- const result = this.deps.streamingHandler.accumulateChunk(chunk);
627
- if (result.reasoningContent) {
628
- yield { type: "reasoning", reasoning: result.reasoningContent };
629
- }
630
- if (result.hasNewToolCalls && result.toolCalls) {
631
- yield { type: "tool_calls", toolCalls: result.toolCalls };
632
- }
633
- if (result.displayContent) {
634
- yield { type: "content", content: result.displayContent };
635
- }
636
- if (result.shouldEmitTokenCount && result.tokenCount !== undefined) {
637
- yield { type: "token_count", tokenCount: inputTokens + result.tokenCount };
1183
+ let steeringRequestedDuringText = false;
1184
+ let streamObservedToolCalls = false;
1185
+ let streamEmittedVisibleDelta = false;
1186
+ // Stall guard: some backends (ChatGPT/Codex OAuth observed) accept
1187
+ // the request then never send a byte — without a bound this loop
1188
+ // hangs FOREVER (turns stuck for hours in Cowork and headless waves).
1189
+ // Fail fast with a clear error instead; the caller/user retries.
1190
+ const progress = startHeadlessPromptProgress();
1191
+ const streamFactory = () => withStallGuard(this.deps.client.chatStream(preparedMessages, tools, {
1192
+ streamRetry: false,
1193
+ turnMetrics: {
1194
+ recorder: getTurnMetricsRecorder(),
1195
+ inputTokens,
1196
+ getOutputTokens: () => this.deps.streamingHandler.getTokenCount() || 0,
1197
+ },
1198
+ ...(abortController?.signal ? { signal: abortController.signal } : {}),
1199
+ }, this.config.isGrokModel() &&
1200
+ this.deps.toolSelectionStrategy.shouldUseSearchFor(turnQueryText)
1201
+ ? { search_parameters: { mode: "auto" } }
1202
+ : { search_parameters: { mode: "off" } }), resolveStallTimeoutMs(), {
1203
+ firstTokenTimeoutMs: () => resolveFirstTokenStallTimeoutMs(inputTokens, process.env, {
1204
+ targetIsLocal: this.deps.client.isEffectiveTargetLocal?.(),
1205
+ }),
1206
+ });
1207
+ try {
1208
+ for await (const streamEvent of withLlmStreamRetry(streamFactory, {
1209
+ maxRetries: 2,
1210
+ baseDelayMs: 500,
1211
+ ...(abortController?.signal ? { signal: abortController.signal } : {}),
1212
+ })) {
1213
+ if (streamEvent.type === 'retry') {
1214
+ // A retry after bytes were already shown would concatenate the
1215
+ // abandoned fragment with the new attempt (hybrid answer). Align
1216
+ // with the mid-stream integrity rule: retry only when nothing
1217
+ // visible has been yielded.
1218
+ if (streamEmittedVisibleDelta) {
1219
+ throw new Error('Réponse interrompue après un fragment déjà rendu ; retry refusé pour éviter une réponse hybride.');
1220
+ }
1221
+ this.deps.streamingHandler.reset();
1222
+ streamObservedToolCalls = false;
1223
+ yield {
1224
+ type: 'reasoning',
1225
+ reasoning: `Reconnexion ${streamEvent.retry}/${streamEvent.maxRetries}`,
1226
+ };
1227
+ continue;
1228
+ }
1229
+ const chunk = streamEvent.value;
1230
+ progress.onFirstToken();
1231
+ if (abortController?.signal.aborted) {
1232
+ yield { type: "content", content: "\n\n[Operation cancelled by user]" };
1233
+ yield { type: "done" };
1234
+ return;
1235
+ }
1236
+ const result = this.deps.streamingHandler.accumulateChunk(chunk);
1237
+ if (result.reasoningContent && !relationshipSafety && !guardGenerativeSelfInspection) {
1238
+ yield { type: "reasoning", reasoning: result.reasoningContent };
1239
+ }
1240
+ if (result.hasNewToolCalls && result.toolCalls) {
1241
+ streamObservedToolCalls = true;
1242
+ streamEmittedVisibleDelta = true;
1243
+ yield {
1244
+ type: "tool_calls",
1245
+ toolCalls: relationshipSafety
1246
+ ? relationshipSafeToolCallsForDisplay(result.toolCalls)
1247
+ : result.toolCalls,
1248
+ };
1249
+ }
1250
+ if (result.displayContent && !relationshipSafety && !guardGenerativeSelfInspection) {
1251
+ streamEmittedVisibleDelta = true;
1252
+ yield { type: "content", content: result.displayContent };
1253
+ }
1254
+ if (result.shouldEmitTokenCount && result.tokenCount !== undefined) {
1255
+ yield { type: "token_count", tokenCount: inputTokens + result.tokenCount };
1256
+ }
1257
+ // Steering is safe only while this response is still pure text. Do
1258
+ // not consume the queue yet: the accumulated message is authoritative
1259
+ // and may reveal a tool call in the same chunk.
1260
+ if (!streamObservedToolCalls &&
1261
+ this.deps.messageQueue?.hasSteeringMessage()) {
1262
+ steeringRequestedDuringText = true;
1263
+ break;
1264
+ }
638
1265
  }
639
1266
  }
1267
+ finally {
1268
+ progress.stop();
1269
+ }
1270
+ const trailingDisplayContent = this.deps.streamingHandler.flushDisplayContent?.() ?? '';
1271
+ if (trailingDisplayContent &&
1272
+ !relationshipSafety &&
1273
+ !guardGenerativeSelfInspection) {
1274
+ yield { type: 'content', content: trailingDisplayContent };
1275
+ }
640
1276
  if (tools.length > 0 && !this.deps.streamingHandler.hasYieldedToolCalls()) {
641
1277
  const extracted = this.deps.streamingHandler.extractToolCalls();
642
1278
  if (extracted.toolCalls.length > 0) {
643
- yield { type: "tool_calls", toolCalls: extracted.toolCalls };
1279
+ yield {
1280
+ type: "tool_calls",
1281
+ toolCalls: relationshipSafety
1282
+ ? relationshipSafeToolCallsForDisplay(extracted.toolCalls)
1283
+ : extracted.toolCalls,
1284
+ };
644
1285
  }
645
1286
  }
646
1287
  const accumulatedMessage = this.deps.streamingHandler.getAccumulatedMessage();
@@ -656,6 +1297,9 @@ export class AgentExecutor {
656
1297
  }
657
1298
  toolCalls = filteredToolCalls.length > 0 ? filteredToolCalls : undefined;
658
1299
  }
1300
+ if (relationshipSafety && Array.isArray(toolCalls)) {
1301
+ toolCalls = toolCalls.map(prepareRelationshipSafeInteractiveToolCall);
1302
+ }
659
1303
  const hasToolCalls = Array.isArray(toolCalls) && toolCalls.length > 0;
660
1304
  // Pre-fallback raw content — used by in-loop recovery to tell a real
661
1305
  // partial answer (retry-able) from a truly empty turn (give up).
@@ -666,321 +1310,565 @@ export class AgentExecutor {
666
1310
  rawStreamedContent =
667
1311
  `Blocked: ${forcedChatOnlyToolRunModel} is configured as a chat-only local model and ` +
668
1312
  'returned no structured tool call even with GROK_FORCE_TOOLS=true. ' +
669
- 'Use a tool-capable model such as qwen3.5-ctx32k or gpt-5.5 for goals that need shell/tools.';
670
- yield { type: "content", content: `${rawStreamedContent}\n` };
1313
+ 'Use a tool-capable model such as qwen3.5-ctx32k or gpt-5.6-sol for goals that need shell/tools.';
1314
+ if (!relationshipSafety && !guardGenerativeSelfInspection) {
1315
+ yield { type: "content", content: `${rawStreamedContent}\n` };
1316
+ }
671
1317
  }
672
- if (!rawStreamedContent)
1318
+ // The "Using tools..." placeholder is only legitimate when this turn
1319
+ // actually carries tool_calls. An empty provider reply without tools
1320
+ // must not be rewritten into a plausible assistant message.
1321
+ const synthesizedToolFallback = !rawStreamedContent.trim() && hasToolCalls;
1322
+ if (synthesizedToolFallback) {
673
1323
  rawStreamedContent = "Using tools to help you...";
674
- const content = sanitizeAssistantOutput(rawStreamedContent);
1324
+ }
1325
+ const sanitizedContent = sanitizeAssistantOutput(rawStreamedContent);
1326
+ const guardedContent = relationshipSafety
1327
+ ? guardRelationshipReply(sanitizedContent)
1328
+ : null;
1329
+ let content = guardedContent?.response ?? sanitizedContent;
1330
+ if (guardGenerativeSelfInspection) {
1331
+ content = guardLisaOperationalSelfInspectionReply(content, introspectionTextForTurn);
1332
+ }
1333
+ if (guardedContent?.intervened) {
1334
+ logger.warn('[agent-executor] relationship safety gate rewrote persisted output', {
1335
+ issues: guardedContent.issues,
1336
+ });
1337
+ }
1338
+ // D1: empty provider response (no tools, no length truncation).
1339
+ // Retry is bounded and opt-in via CODEBUDDY_MAX_EMPTY_RETRIES, including
1340
+ // the first turn. Exhaustion throws so the caller and transcript get an
1341
+ // honest failure — never an empty or fabricated assistant message.
1342
+ if (!hasToolCalls && !content.trim() && streamFinishReason !== 'length') {
1343
+ if (!abortController?.signal.aborted && emptyRetries < maxEmptyRetries) {
1344
+ emptyRetries++;
1345
+ logger.warn('[agent-executor] empty provider response, retrying', {
1346
+ attempt: emptyRetries,
1347
+ max: maxEmptyRetries,
1348
+ });
1349
+ messages.push({
1350
+ role: 'user',
1351
+ content: toolRounds > 0
1352
+ ? 'Your last response was empty. Use the results of the tool calls you just made to continue the task and produce your answer.'
1353
+ : 'Your last response was empty. Please produce your answer now.',
1354
+ });
1355
+ continue;
1356
+ }
1357
+ throw new Error('réponse vide du fournisseur');
1358
+ }
1359
+ if ((relationshipSafety || guardGenerativeSelfInspection) &&
1360
+ content &&
1361
+ !(synthesizedToolFallback && hasToolCalls)) {
1362
+ // The outer last-mile gate buffers the complete agent turn. Explicit
1363
+ // spacing keeps a genuine pre-tool preamble and the final answer from
1364
+ // being concatenated into one word after per-round trimming.
1365
+ yield { type: 'content', content: `${content}\n\n` };
1366
+ }
1367
+ const persistedAssistantContent = synthesizedToolFallback
1368
+ ? null
1369
+ : content;
675
1370
  const assistantEntry = {
676
1371
  type: "assistant",
677
- content: content,
1372
+ content: persistedAssistantContent ?? '',
678
1373
  timestamp: new Date(),
679
1374
  toolCalls: toolCalls,
680
1375
  };
681
1376
  history.push(assistantEntry);
682
- messages.push({ role: "assistant", content: content, tool_calls: toolCalls });
1377
+ messages.push({
1378
+ role: 'assistant',
1379
+ content: persistedAssistantContent,
1380
+ tool_calls: toolCalls,
1381
+ });
683
1382
  const currentOutputTokens = this.deps.streamingHandler.getTokenCount() || 0;
684
1383
  totalOutputTokens += currentOutputTokens;
1384
+ // Sum the provider's own counters across rounds: one HTTP completion can
1385
+ // cost several provider calls, exactly like the cost accounting above.
1386
+ const roundProviderUsage = this.deps.streamingHandler.getProviderUsage?.();
1387
+ if (roundProviderUsage) {
1388
+ providerUsageSeen = true;
1389
+ providerPromptTokens += roundProviderUsage.promptTokens ?? 0;
1390
+ providerCompletionTokens += roundProviderUsage.completionTokens ?? 0;
1391
+ }
685
1392
  yield { type: "token_count", tokenCount: inputTokens + totalOutputTokens };
1393
+ if (steeringRequestedDuringText && !hasToolCalls) {
1394
+ const steering = this.deps.messageQueue?.consumeSteeringMessage();
1395
+ if (steering) {
1396
+ yield { type: 'steer', steer: { content: steering.content, source: steering.source } };
1397
+ messages.push({ role: 'user', content: steering.content });
1398
+ history.push({
1399
+ type: 'user',
1400
+ content: steering.content,
1401
+ timestamp: steering.timestamp,
1402
+ });
1403
+ continue;
1404
+ }
1405
+ }
686
1406
  if (toolCalls && toolCalls.length > 0) {
687
1407
  toolRounds++;
688
1408
  // Pre-check cost limit before executing tools (estimate only — no side effects)
689
1409
  if (this.config.estimateSessionCostLimitReached(inputTokens, totalOutputTokens)) {
690
1410
  const sessionCost = this.config.getSessionCost();
691
1411
  const sessionCostLimit = this.config.getSessionCostLimit();
692
- yield { type: "content", content: `\n\nSession cost limit reached ($${sessionCost.toFixed(2)} / $${sessionCostLimit.toFixed(2)}). Stopping before tool execution.` };
693
- yield { type: "done" };
694
- return;
695
- }
696
- // Check for steering messages (steer mode: interrupt execution)
697
- const mq = this.deps.messageQueue;
698
- if (mq?.hasSteeringMessage()) {
699
- const steering = mq.consumeSteeringMessage();
700
- if (steering) {
701
- yield { type: "steer", steer: { content: steering.content, source: steering.source } };
702
- // Inject as user message and skip remaining tool calls
703
- messages.push({ role: "user", content: steering.content });
1412
+ for (const toolCall of toolCalls) {
1413
+ const toolResult = {
1414
+ success: false,
1415
+ error: 'Skipped because the session cost limit was reached before tool execution.',
1416
+ };
704
1417
  history.push({
705
- type: "user",
706
- content: steering.content,
1418
+ type: 'tool_result',
1419
+ content: toolResult.error ?? 'Tool skipped',
707
1420
  timestamp: new Date(),
1421
+ toolCall,
1422
+ toolResult,
708
1423
  });
709
- // Rollback toolRounds since we didn't actually execute any tools
710
- toolRounds--;
711
- continue; // Re-enter loop to get new LLM response
1424
+ messages.push({
1425
+ role: 'tool',
1426
+ content: toolResult.error ?? 'Tool skipped',
1427
+ tool_call_id: toolCall.id,
1428
+ name: toolCall.function.name,
1429
+ });
1430
+ yield { type: 'tool_result', toolCall, toolResult };
712
1431
  }
1432
+ yield { type: "content", content: `\n\nSession cost limit reached ($${sessionCost.toFixed(2)} / $${sessionCostLimit.toFixed(2)}). Stopping before tool execution.` };
1433
+ yield { type: "done" };
1434
+ return;
713
1435
  }
714
- // Single-tool mode: only execute first tool call, re-enqueue rest
1436
+ // Single-tool mode executes only the first call. The remaining calls
1437
+ // still receive synthetic results below so the provider transcript
1438
+ // never contains an unresolved assistant tool call.
715
1439
  const streamToolCallsToExecute = this.config.singleToolMode
716
1440
  ? toolCalls.slice(0, 1)
717
1441
  : toolCalls;
718
- if (this.config.singleToolMode && toolCalls.length > 1) {
719
- const deferred = toolCalls.slice(1);
720
- preparedMessages.push({
721
- role: 'assistant',
722
- content: null,
723
- tool_calls: deferred,
724
- });
725
- logger.debug(`Single-tool mode (stream): deferred ${deferred.length} tool calls`);
1442
+ const deferredToolCalls = this.config.singleToolMode
1443
+ ? toolCalls.slice(1)
1444
+ : [];
1445
+ if (deferredToolCalls.length > 0) {
1446
+ logger.debug(`Single-tool mode (stream): skipped ${deferredToolCalls.length} extra tool calls`);
726
1447
  }
727
1448
  if (!this.deps.streamingHandler.hasYieldedToolCalls()) {
728
- yield { type: "tool_calls", toolCalls: streamToolCallsToExecute };
1449
+ yield {
1450
+ type: "tool_calls",
1451
+ toolCalls: relationshipSafety
1452
+ ? relationshipSafeToolCallsForDisplay(streamToolCallsToExecute)
1453
+ : streamToolCallsToExecute,
1454
+ };
729
1455
  }
730
- // Buffer for streaming adapter chunks (cannot yield from inside a callback)
731
- const streamChunkBuffer = [];
732
- for (const toolCall of streamToolCallsToExecute) {
733
- if (abortController?.signal.aborted) {
734
- yield { type: "content", content: "\n\n[Operation cancelled by user]" };
735
- yield { type: "done" };
736
- return;
1456
+ const executionBatches = createOrderedToolBatches(streamToolCallsToExecute, (toolCall) => this.isToolParallelizable(toolCall));
1457
+ toolExecution: for (const batch of executionBatches) {
1458
+ // Compaction mutates shared transcript state, so keep this preflight
1459
+ // ordered even when the calls themselves are safe to run together.
1460
+ for (const toolCall of batch) {
1461
+ try {
1462
+ const toolArgs = JSON.parse(toolCall.function.arguments || '{}');
1463
+ const estimatedTokens = estimateToolResultTokens(toolCall.function.name, toolArgs);
1464
+ const modelName = this.deps.client.getCurrentModel();
1465
+ const modelConfig = getModelToolConfig(modelName);
1466
+ const contextWindow = modelConfig.contextWindow ?? 128_000;
1467
+ if (shouldCompactBeforeToolExec(inputTokens, estimatedTokens, contextWindow)) {
1468
+ logger.debug('Proactive compaction (stream): compacting before tool execution', {
1469
+ toolName: toolCall.function.name,
1470
+ inputTokens,
1471
+ estimatedTokens,
1472
+ contextWindow,
1473
+ });
1474
+ const compacted = compactTurnMessagesInPlace(this.deps.contextManager, messages, {
1475
+ isolatedSharedHost,
1476
+ });
1477
+ if (compacted)
1478
+ incrementalTokenCounter.invalidate();
1479
+ inputTokens = incrementalTokenCounter.count(messages);
1480
+ }
1481
+ }
1482
+ catch { /* proactive compaction is non-critical */ }
737
1483
  }
738
- // --- Proactive context compaction (streaming path) ---
739
- try {
740
- const toolArgs = JSON.parse(toolCall.function.arguments || '{}');
741
- const estimatedTokens = estimateToolResultTokens(toolCall.function.name, toolArgs);
742
- const modelName = this.deps.client.getCurrentModel();
743
- const { getModelToolConfig } = await import('../../config/model-tools.js');
744
- const modelConfig = getModelToolConfig(modelName);
745
- const contextWindow = modelConfig.contextWindow ?? 128_000;
746
- if (shouldCompactBeforeToolExec(inputTokens, estimatedTokens, contextWindow)) {
747
- logger.debug('Proactive compaction (stream): compacting before tool execution', {
1484
+ const outcomes = await executeBoundedInOrder(batch, async (toolCall) => {
1485
+ const startedAt = Date.now();
1486
+ if (abortController?.signal.aborted) {
1487
+ return {
1488
+ result: abortedToolResult(startedAt),
1489
+ startedAt,
1490
+ streamChunks: [],
1491
+ };
1492
+ }
1493
+ if (relationshipSafety &&
1494
+ (isBlockedRelationshipInteractiveToolCall(toolCall) ||
1495
+ unsafeRelationshipOutboundToolCall(toolCall))) {
1496
+ logger.warn('[agent-executor] relationship safety blocked outbound tool call', {
748
1497
  toolName: toolCall.function.name,
749
- inputTokens,
750
- estimatedTokens,
751
- contextWindow,
752
1498
  });
753
- this.deps.contextManager.prepareMessages(messages);
754
- inputTokens = this.deps.tokenCounter.countMessageTokens(messages);
1499
+ return {
1500
+ blockedContent: 'Relationship safety policy blocked manipulative outbound content.',
1501
+ startedAt,
1502
+ streamChunks: [],
1503
+ };
755
1504
  }
756
- }
757
- catch { /* proactive compaction is non-critical */ }
758
- // --- User hooks: PreToolUse (streaming path) ---
759
- const streamPreHook = await runPreToolUseHook(process.cwd(), toolCall);
760
- if (!streamPreHook.allowed) {
761
- const blockedContent = streamPreHook.feedback ?? 'Action blocked by PreToolUse hook';
762
- yield { type: "content", content: `\n[Hook blocked: ${blockedContent}]\n` };
763
- pushBlockedToolMessage(messages, toolCall, blockedContent);
764
- continue;
765
- }
766
- // Phase (d).2 — broadcast tool_started to the fleet (opt-in via
767
- // CODEBUDDY_FLEET_STREAM=1). Best-effort, no-op when disabled
768
- // or when the WS server isn't running.
769
- emitFleetToolStarted(toolCall);
770
- // Use streaming execution for tools that support it (bash, reason, + adapter-based)
771
- let result;
772
- const _streamToolStartMs = Date.now();
773
- const STREAMING_TOOLS = ['bash', 'reason', 'generate_document'];
774
- if (STREAMING_TOOLS.includes(toolCall.function.name)) {
775
- const gen = this.deps.toolHandler.executeToolStreaming(toolCall);
776
- let genResult = await gen.next();
777
- while (!genResult.done) {
778
- // Check abort between stream chunks
779
- if (abortController?.signal.aborted) {
780
- await gen.return({ success: false, error: 'Aborted' });
781
- yield { type: "content", content: "\n\n[Operation cancelled by user]" };
782
- yield { type: "done" };
783
- return;
784
- }
1505
+ const streamPreHook = await runPreToolUseHook(process.cwd(), toolCall);
1506
+ if (!streamPreHook.allowed) {
1507
+ return {
1508
+ blockedContent: streamPreHook.feedback ?? 'Action blocked by PreToolUse hook',
1509
+ startedAt,
1510
+ streamChunks: [],
1511
+ };
1512
+ }
1513
+ if (abortController?.signal.aborted) {
1514
+ return {
1515
+ result: abortedToolResult(startedAt),
1516
+ startedAt,
1517
+ streamChunks: [],
1518
+ };
1519
+ }
1520
+ emitFleetToolStarted(toolCall);
1521
+ const execution = await this.executeToolForBatch(toolCall, turnExecutionExtra, abortController?.signal, startedAt);
1522
+ return { ...execution, startedAt };
1523
+ }, (error) => ({
1524
+ result: {
1525
+ success: false,
1526
+ error: `Tool execution failed: ${getErrorMessage(error)}`,
1527
+ },
1528
+ startedAt: Date.now(),
1529
+ streamChunks: [],
1530
+ }), MAX_PARALLEL_TOOL_CALLS);
1531
+ // Promise completion order is intentionally ignored. Provider-facing
1532
+ // results and every observable side effect are replayed by call index.
1533
+ for (let outcomeIndex = 0; outcomeIndex < batch.length; outcomeIndex++) {
1534
+ const toolCall = batch[outcomeIndex];
1535
+ const outcome = outcomes[outcomeIndex];
1536
+ if (!toolCall || !outcome)
1537
+ continue;
1538
+ if (outcome.blockedContent) {
1539
+ const relationshipBlocked = relationshipSafety &&
1540
+ (isBlockedRelationshipInteractiveToolCall(toolCall) ||
1541
+ unsafeRelationshipOutboundToolCall(toolCall));
785
1542
  yield {
786
- type: "tool_stream",
787
- toolStreamData: {
788
- toolCallId: toolCall.id,
789
- toolName: toolCall.function.name,
790
- delta: genResult.value,
791
- },
1543
+ type: 'content',
1544
+ content: relationshipBlocked
1545
+ ? `\n${SAFE_RELATIONSHIP_REPAIR}\n`
1546
+ : `\n[Hook blocked: ${outcome.blockedContent}]\n`,
792
1547
  };
793
- genResult = await gen.next();
1548
+ pushBlockedToolMessage(messages, toolCall, outcome.blockedContent);
1549
+ continue;
794
1550
  }
795
- result = genResult.value ?? { success: false, error: 'Tool returned no result' };
796
- }
797
- else {
798
- // Check if the streaming adapter supports this tool
799
- const { getStreamingAdapter } = await import('../../tools/streaming-adapter.js');
800
- const streamingAdapter = getStreamingAdapter();
801
- if (streamingAdapter.supportsStreaming(toolCall.function.name)) {
802
- const tc = toolCall; // capture for closure
803
- result = await streamingAdapter.wrapWithStreaming(tc.function.name, () => this.executeToolViaLane(tc), (chunk) => {
804
- // We cannot yield from inside a callback, so we accumulate
805
- // chunks and emit them after. Instead, use a buffer approach.
806
- streamChunkBuffer.push({
807
- type: "tool_stream",
1551
+ let result = outcome.result ?? {
1552
+ success: false,
1553
+ error: 'Tool returned no result',
1554
+ };
1555
+ const _streamToolStartMs = outcome.startedAt;
1556
+ if (!relationshipSafety) {
1557
+ for (const delta of outcome.streamChunks) {
1558
+ yield {
1559
+ type: 'tool_stream',
808
1560
  toolStreamData: {
809
- toolCallId: tc.id,
810
- toolName: tc.function.name,
811
- delta: chunk,
1561
+ toolCallId: toolCall.id,
1562
+ toolName: toolCall.function.name,
1563
+ delta,
812
1564
  },
813
- });
814
- });
815
- // Flush buffered streaming chunks
816
- for (const chunk of streamChunkBuffer) {
817
- yield chunk;
1565
+ };
818
1566
  }
819
- streamChunkBuffer.length = 0;
820
- }
821
- else {
822
- result = await this.executeToolViaLane(toolCall);
823
1567
  }
824
- }
825
- // --- User hooks: PostToolUse / PostToolUseFailure (streaming path) ---
826
- await runPostToolUseHook(process.cwd(), toolCall, result);
827
- // --- Per-tool metrics (streaming path, DeepWiki gap #3) ---
828
- await recordToolMetric(toolCall.function.name, result.success, Date.now() - _streamToolStartMs);
829
- // Phase (d).2 fleet broadcast on completion (opt-in).
830
- emitFleetToolCompleted(toolCall, result, Date.now() - _streamToolStartMs);
831
- // Phase (d).21 ship 3 proactive notification on tool completion.
832
- // Default sink logs at info (success) / warn (failure). Gated by
833
- // quiet hours + rate limit in NotificationManager.
834
- try {
835
- const { notify } = await import('../proactive/notification-default-sink.js');
836
- const _toolDurationStream = Date.now() - _streamToolStartMs;
837
- notify({
838
- channelType: 'cli',
839
- channelId: 'tool-completion',
840
- message: result.success
841
- ? `${toolCall.function.name} completed in ${_toolDurationStream}ms`
842
- : `${toolCall.function.name} failed: ${result.error ?? 'unknown error'}`,
843
- priority: result.success ? 'low' : 'high',
844
- });
845
- }
846
- catch { /* notification optional */ }
847
- // Phase (d).21 ship 4 — progress update.
848
- try {
849
- const { getProgressTracker } = await import('../planner/progress-default-sink.js');
850
- getProgressTracker().update(toolCall.id, result.success ? 'completed' : 'failed', toolCall.function.name);
851
- }
852
- catch { /* progress optional */ }
853
- // --- Track file access for code graph context (streaming, incremental update) ---
854
- try {
855
- const fileToolsStream = new Set(['view_file', 'create_file', 'str_replace_editor', 'file_read', 'file_write']);
856
- if (fileToolsStream.has(toolCall.function.name)) {
857
- const args = JSON.parse(toolCall.function.arguments || '{}');
858
- const filePath = args.path || args.file_path || args.target_file || '';
859
- if (filePath) {
860
- const { trackRecentFile } = await import('../../knowledge/code-graph-context-provider.js');
861
- trackRecentFile(filePath);
862
- if (['create_file', 'str_replace_editor', 'file_write'].includes(toolCall.function.name)) {
863
- const { getKnowledgeGraph } = await import('../../knowledge/knowledge-graph.js');
864
- const kg = getKnowledgeGraph();
865
- if (kg.getStats().tripleCount > 0) {
866
- const { updateGraphForFile } = await import('../../knowledge/graph-updater.js');
867
- const pathMod = await import('path');
868
- const absPath = pathMod.default.resolve(process.cwd(), filePath);
869
- updateGraphForFile(kg, absPath, process.cwd());
870
- }
1568
+ // Expand the current turn's cached schema after discovery or live
1569
+ // authoring. Without this, a newly created tool is dispatchable but
1570
+ // invisible to the model until the next user turn.
1571
+ if (result.success) {
1572
+ const data = result.data;
1573
+ const discoveredNames = toolCall.function.name === 'tool_search' ? data?.names : undefined;
1574
+ const names = [...new Set([
1575
+ ...(Array.isArray(discoveredNames) ? discoveredNames : []),
1576
+ ...(Array.isArray(data?.createdTools) ? data.createdTools : []),
1577
+ ])];
1578
+ if (names.length > 0) {
1579
+ try {
1580
+ const added = await this.deps.toolSelectionStrategy.expandCachedTools(names);
1581
+ logger.debug('tool selection expanded after tool result', {
1582
+ source: toolCall.function.name,
1583
+ names,
1584
+ added,
1585
+ });
1586
+ }
1587
+ catch (err) {
1588
+ logger.warn('tool selection expansion failed', {
1589
+ source: toolCall.function.name,
1590
+ error: String(err),
1591
+ });
871
1592
  }
872
1593
  }
873
1594
  }
874
- }
875
- catch { /* file tracking is optional */ }
876
- // --- JIT context discovery: load subdirectory context files ---
877
- // Décision #2 du plan task #5 — promu du sequential vers streaming
878
- // pour parité d'enrichissement après chaque tool qui touche un path.
879
- for (const msg of await runJitContextDiscovery(toolCall)) {
880
- preparedMessages.push(msg);
881
- }
882
- // Check abort after tool execution completes
883
- if (abortController?.signal.aborted) {
884
- yield { type: "content", content: "\n\n[Operation cancelled by user]" };
885
- yield { type: "done" };
886
- return;
887
- }
888
- // Apply semantic truncation if tool output is very large (> 20k chars)
889
- const RAW_OUTPUT_LIMIT = 20_000;
890
- if (result?.output && result.output.length > RAW_OUTPUT_LIMIT) {
891
- const truncResult = semanticTruncate(result.output, { maxChars: RAW_OUTPUT_LIMIT });
892
- if (truncResult.truncated) {
893
- result = {
894
- ...result,
895
- output: truncResult.output,
896
- };
1595
+ // --- User hooks: PostToolUse / PostToolUseFailure (streaming path) ---
1596
+ await runPostToolUseHook(process.cwd(), toolCall, result);
1597
+ // --- Per-tool metrics (streaming path, DeepWiki gap #3) ---
1598
+ await recordToolMetric(toolCall.function.name, result.success, Date.now() - _streamToolStartMs);
1599
+ // Phase (d).2 fleet broadcast on completion (opt-in).
1600
+ emitFleetToolCompleted(toolCall, result, Date.now() - _streamToolStartMs);
1601
+ // Phase (d).21 ship 3 — proactive notification on tool completion.
1602
+ // Default sink logs at info (success) / warn (failure). Gated by
1603
+ // quiet hours + rate limit in NotificationManager.
1604
+ try {
1605
+ const _toolDurationStream = Date.now() - _streamToolStartMs;
1606
+ notify({
1607
+ channelType: 'cli',
1608
+ channelId: 'tool-completion',
1609
+ message: result.success
1610
+ ? `${toolCall.function.name} completed in ${_toolDurationStream}ms`
1611
+ : `${toolCall.function.name} failed: ${result.error ?? 'unknown error'}`,
1612
+ priority: result.success ? 'low' : 'high',
1613
+ });
897
1614
  }
898
- }
899
- // --- Disk-backed tool result (Manus AI #19) ---
900
- const rawStreamContent = sanitizeToolResult(result?.success ? result.output || "Success" : result?.error || "Error");
901
- persistToolResult(toolCall.id, rawStreamContent);
902
- // --- Observation Variator (Manus AI #17) ---
903
- const variedStreamContent = applyObservationVariator(toolCall.function.name, rawStreamContent);
904
- const toolResultEntry = {
905
- type: "tool_result",
906
- content: result?.success ? result.output || "Success" : result?.error || "Error occurred",
907
- timestamp: new Date(),
908
- toolCall: toolCall,
909
- toolResult: result,
910
- };
911
- history.push(toolResultEntry);
912
- yield { type: "tool_result", toolCall, toolResult: result };
913
- // Note: 'name' is required for Gemini API to match functionResponse with functionCall
914
- messages.push({
915
- role: "tool",
916
- content: variedStreamContent,
917
- tool_call_id: toolCall.id || `tool_${Date.now()}`,
918
- name: toolCall.function.name,
919
- });
920
- // --- Auto-commit after file-modifying tools (streaming path) ---
921
- if (result?.success) {
1615
+ catch { /* notification optional */ }
1616
+ // Phase (d).21 ship 4 progress update.
1617
+ try {
1618
+ getProgressTracker().update(toolCall.id, result.success ? 'completed' : 'failed', toolCall.function.name);
1619
+ }
1620
+ catch { /* progress optional */ }
1621
+ // --- Track file access for code graph context (streaming, incremental update) ---
922
1622
  try {
923
- const { maybeAutoCommit } = await import('../../tools/auto-commit.js');
924
- const acResult = await maybeAutoCommit(toolCall.function.name, toolCall.function.arguments || '{}', rawStreamContent.substring(0, 120));
925
- if (acResult?.success) {
926
- logger.debug('Auto-commit (stream):', { hash: acResult.commitHash });
1623
+ const fileToolsStream = new Set(['view_file', 'create_file', 'str_replace_editor', 'file_read', 'file_write']);
1624
+ if (!isolatedSharedHost && fileToolsStream.has(toolCall.function.name)) {
1625
+ const args = JSON.parse(toolCall.function.arguments || '{}');
1626
+ const filePath = args.path || args.file_path || args.target_file || '';
1627
+ if (filePath) {
1628
+ trackRecentFile(filePath);
1629
+ if (['create_file', 'str_replace_editor', 'file_write'].includes(toolCall.function.name)) {
1630
+ const kg = getKnowledgeGraph();
1631
+ if (kg.getStats().tripleCount > 0) {
1632
+ const absPath = resolvePath(process.cwd(), filePath);
1633
+ updateGraphForFile(kg, absPath, process.cwd());
1634
+ }
1635
+ }
1636
+ }
1637
+ }
1638
+ }
1639
+ catch { /* file tracking is optional */ }
1640
+ // --- JIT context discovery: load subdirectory context files ---
1641
+ // Décision #2 du plan task #5 — promu du sequential vers streaming
1642
+ // pour parité d'enrichissement après chaque tool qui touche un path.
1643
+ // The current provider request already consumed preparedMessages.
1644
+ // Keep newly discovered instructions in turn-local state so the
1645
+ // next provider round actually receives them without persisting
1646
+ // them into later user turns.
1647
+ jitContextBlocks.push(...await runJitContextDiscovery(toolCall));
1648
+ // Build three deliberately separate views of one observation:
1649
+ // 1. recovery: exact native output persisted before any hook/optimizer,
1650
+ // 2. display: provider-sanitized ToolResult emitted to the UI,
1651
+ // 3. model: token-budgeted observation appended to the transcript.
1652
+ // Non-streaming ToolHandler calls already persisted (1) before their
1653
+ // after-hooks. Streaming adapters are persisted here on first sight.
1654
+ const recoveryStore = getRestorableCompressor();
1655
+ const toolWorkspace = typeof this.deps.toolHandler.getWorkingDirectory === 'function'
1656
+ ? this.deps.toolHandler.getWorkingDirectory()
1657
+ : process.cwd();
1658
+ const recoverySessionId = typeof this.deps.toolHandler.getRecoverySessionId === 'function'
1659
+ ? this.deps.toolHandler.getRecoverySessionId()
1660
+ : undefined;
1661
+ let rawForRecovery = formatToolResultForRecovery(result);
1662
+ const executionWasAborted = result.error?.startsWith('aborted by user after ') ?? false;
1663
+ if (toolCall.id && recoveryStore && !executionWasAborted) {
1664
+ const existingRecovery = recoveryStore.restore(toolCall.id, toolWorkspace, recoverySessionId);
1665
+ if (existingRecovery.found) {
1666
+ rawForRecovery = existingRecovery.content;
927
1667
  }
928
- else if (acResult && acResult.message && /failed/i.test(acResult.message)) {
929
- // Real commit failure — surface to the user (see sequential path above).
930
- logger.warn(`Auto-commit failed: ${acResult.message}`);
1668
+ else {
1669
+ recoveryStore.writeToolResult(toolCall.id, rawForRecovery, toolWorkspace, recoverySessionId);
931
1670
  }
932
1671
  }
933
- catch (err) {
934
- logger.debug('Auto-commit threw (stream)', { err: err instanceof Error ? err.message : String(err) });
1672
+ let modelObservation = rawForRecovery;
1673
+ // TokenJuice remains a lossless first pass for verbose web content.
1674
+ // It only affects the model view; recovery and display stay intact.
1675
+ if (isTokenJuiceEnabled() &&
1676
+ result?.success &&
1677
+ modelObservation.length > JUICE_MIN_CHARS &&
1678
+ JUICE_WEB_TOOLS.has(toolCall.function.name)) {
1679
+ const juiced = tokenJuice(modelObservation, { html: true, dedupe: true });
1680
+ if (juiced.savedChars > 0) {
1681
+ logger.debug(`[token-juice] ${toolCall.function.name}: saved ${juiced.savedChars} chars (${juiced.applied.join('+')})`);
1682
+ modelObservation = juiced.output;
1683
+ }
935
1684
  }
936
- }
937
- // --- Fix 11: YOLO cost display after each tool (streaming path) ---
938
- await logYoloCostIfEnabled(this.config);
939
- // --- Terminate signal detection (OpenManus #5, streaming path) ---
940
- const streamTerminateMsg = extractTerminateMessage(rawStreamContent);
941
- if (streamTerminateMsg !== null) {
942
- yield { type: "content", content: `\n\n${streamTerminateMsg}` };
943
- terminateDetectedStreaming = true;
944
- break;
945
- }
946
- // --- Interactive Shell Handoff detection (streaming path) ---
947
- const shellRequestMsg = extractSignalMessage(rawStreamContent, INTERACTIVE_SHELL_SIGNAL);
948
- if (shellRequestMsg !== null) {
949
- yield { type: "content", content: `\n\n⚠️ **INTERACTIVE SHELL HANDOFF REQUESTED**\n\n${shellRequestMsg}` };
950
- yield {
951
- type: "ask_user",
952
- askUser: {
953
- question: "Do you want to open an interactive terminal to perform this action? (Type 'exit' in the terminal when done to return control to the AI)",
954
- options: ["Yes, open interactive shell", "No, cancel tool"]
1685
+ let logicalCommand = '';
1686
+ try {
1687
+ const args = JSON.parse(toolCall.function.arguments || '{}');
1688
+ if (typeof args.command === 'string')
1689
+ logicalCommand = args.command;
1690
+ }
1691
+ catch { /* malformed args were already handled by the dispatcher */ }
1692
+ const activeObservationModel = this.deps.client.getCurrentModel() ?? '';
1693
+ const activeObservationConfig = getModelToolConfig(activeObservationModel);
1694
+ const optimization = await optimizeToolObservation({
1695
+ toolName: toolCall.function.name,
1696
+ toolCallId: toolCall.id || `tool_${Date.now()}`,
1697
+ content: modelObservation,
1698
+ success: result?.success,
1699
+ exitCode: result?.success ? 0 : 1,
1700
+ command: logicalCommand,
1701
+ query: message ?? '',
1702
+ workspaceRoot: toolWorkspace,
1703
+ contextWindow: activeObservationConfig.contextWindow ?? 128_000,
1704
+ currentInputTokens: inputTokens,
1705
+ signal: abortController?.signal,
1706
+ });
1707
+ let modelStreamContent = optimization.content;
1708
+ // lm-resizer owns the semantic budget when available. Its absence or
1709
+ // an intentionally raw failure still receives a model-aware hard cap;
1710
+ // the exact observation remains available through restore_context.
1711
+ if (toolCall.function.name !== 'restore_context') {
1712
+ const budgetTokens = optimization.tokenBudget ?? 5_000;
1713
+ const hardLimitChars = Math.min(80_000, Math.max(8_000, budgetTokens * 4));
1714
+ if (modelStreamContent.length > hardLimitChars ||
1715
+ this.deps.tokenCounter.countTokens(modelStreamContent) > budgetTokens) {
1716
+ const truncated = semanticTruncate(modelStreamContent, { maxChars: hardLimitChars });
1717
+ if (truncated.truncated) {
1718
+ const recoveryNote = toolCall.id
1719
+ ? `\n\n[Full exact observation: restore_context({"identifier":${JSON.stringify(toolCall.id)}})]`
1720
+ : '';
1721
+ modelStreamContent = `${truncated.output}${recoveryNote}`;
1722
+ }
955
1723
  }
1724
+ }
1725
+ const observationMetadata = {
1726
+ optimizer: optimization.optimized ? 'lm-resizer' : 'none',
1727
+ reason: optimization.reason,
1728
+ rawRef: optimization.rawRef,
1729
+ originalBytes: optimization.originalBytes,
1730
+ finalBytes: Buffer.byteLength(modelStreamContent),
1731
+ bytesSaved: Math.max(0, optimization.originalBytes - Buffer.byteLength(modelStreamContent)),
1732
+ ...(optimization.transport ? { transport: optimization.transport } : {}),
956
1733
  };
957
- terminateDetectedStreaming = true;
958
- break;
959
- }
960
- // --- Plan Approval detection (streaming path) ---
961
- const planMsg = extractSignalMessage(rawStreamContent, PLAN_APPROVAL_SIGNAL);
962
- if (planMsg !== null) {
963
- yield { type: "content", content: `\n\n⚠️ **PLAN APPROVAL REQUIRED**\n\n${planMsg}` };
964
- yield {
965
- type: "ask_user",
966
- askUser: {
967
- question: "Do you approve this plan? (Yes to execute, No to cancel, or provide feedback)",
968
- options: ["Approve", "Reject"]
969
- }
1734
+ result = {
1735
+ ...result,
1736
+ metadata: {
1737
+ ...(result?.metadata ?? {}),
1738
+ contextOptimization: observationMetadata,
1739
+ },
970
1740
  };
971
- terminateDetectedStreaming = true;
972
- break;
973
- }
974
- // --- Yield signal detection (Native Engine v2026.3.14, streaming path) ---
975
- const streamYieldChildId = extractYieldChildId(rawStreamContent);
976
- if (streamYieldChildId) {
977
- yield { type: "content", content: `\n[Waiting for sub-agent to complete...]` };
978
- await processYieldSignal(streamYieldChildId, messages);
1741
+ const rawStreamContent = sanitizeToolResult(rawForRecovery);
1742
+ const sanitizedModelObservation = sanitizeToolResult(modelStreamContent);
1743
+ const variedStreamContent = applyObservationVariator(toolCall.function.name, sanitizedModelObservation);
1744
+ const visibleToolResult = relationshipSafety
1745
+ ? relationshipSafeToolResultForDisplay(result)
1746
+ : result;
1747
+ const toolResultEntry = {
1748
+ type: "tool_result",
1749
+ content: visibleToolResult.success
1750
+ ? visibleToolResult.output || "Success"
1751
+ : visibleToolResult.error || "Error occurred",
1752
+ timestamp: new Date(),
1753
+ toolCall: toolCall,
1754
+ toolResult: visibleToolResult,
1755
+ };
1756
+ history.push(toolResultEntry);
1757
+ yield { type: "tool_result", toolCall, toolResult: visibleToolResult };
1758
+ // Note: 'name' is required for Gemini API to match functionResponse with functionCall
1759
+ messages.push({
1760
+ role: "tool",
1761
+ content: variedStreamContent,
1762
+ tool_call_id: toolCall.id || `tool_${Date.now()}`,
1763
+ name: toolCall.function.name,
1764
+ });
1765
+ // --- Auto-commit after file-modifying tools (streaming path) ---
1766
+ if (result?.success) {
1767
+ try {
1768
+ const acResult = await maybeAutoCommit(toolCall.function.name, toolCall.function.arguments || '{}', rawStreamContent.substring(0, 120));
1769
+ if (acResult?.success) {
1770
+ logger.debug('Auto-commit (stream):', { hash: acResult.commitHash });
1771
+ }
1772
+ else if (acResult && acResult.message && /failed/i.test(acResult.message)) {
1773
+ // Real commit failure — surface to the user (see sequential path above).
1774
+ logger.warn(`Auto-commit failed: ${acResult.message}`);
1775
+ }
1776
+ }
1777
+ catch (err) {
1778
+ logger.debug('Auto-commit threw (stream)', { err: err instanceof Error ? err.message : String(err) });
1779
+ }
1780
+ }
1781
+ // --- Fix 11: YOLO cost display after each tool (streaming path) ---
1782
+ await logYoloCostIfEnabled(this.config);
1783
+ // --- Terminate signal detection (OpenManus #5, streaming path) ---
1784
+ const streamTerminateMsg = extractTerminateMessage(rawStreamContent);
1785
+ if (streamTerminateMsg !== null) {
1786
+ yield { type: "content", content: `\n\n${streamTerminateMsg}` };
1787
+ terminateDetectedStreaming = true;
1788
+ break toolExecution;
1789
+ }
1790
+ // --- Interactive Shell Handoff detection (streaming path) ---
1791
+ const shellRequestMsg = extractSignalMessage(rawStreamContent, INTERACTIVE_SHELL_SIGNAL);
1792
+ if (shellRequestMsg !== null) {
1793
+ yield { type: "content", content: `\n\n⚠️ **INTERACTIVE SHELL HANDOFF REQUESTED**\n\n${shellRequestMsg}` };
1794
+ yield {
1795
+ type: "ask_user",
1796
+ askUser: {
1797
+ question: "Do you want to open an interactive terminal to perform this action? (Type 'exit' in the terminal when done to return control to the AI)",
1798
+ options: ["Yes, open interactive shell", "No, cancel tool"]
1799
+ }
1800
+ };
1801
+ terminateDetectedStreaming = true;
1802
+ break toolExecution;
1803
+ }
1804
+ // --- Plan Approval detection (streaming path) ---
1805
+ const planMsg = extractSignalMessage(rawStreamContent, PLAN_APPROVAL_SIGNAL);
1806
+ if (planMsg !== null) {
1807
+ yield { type: "content", content: `\n\n⚠️ **PLAN APPROVAL REQUIRED**\n\n${planMsg}` };
1808
+ yield {
1809
+ type: "ask_user",
1810
+ askUser: {
1811
+ question: "Do you approve this plan? (Yes to execute, No to cancel, or provide feedback)",
1812
+ options: ["Approve", "Reject"]
1813
+ }
1814
+ };
1815
+ terminateDetectedStreaming = true;
1816
+ break toolExecution;
1817
+ }
1818
+ // --- Yield signal detection (Native Engine v2026.3.14, streaming path) ---
1819
+ const streamYieldChildId = extractYieldChildId(rawStreamContent);
1820
+ if (streamYieldChildId) {
1821
+ yield { type: "content", content: `\n[Waiting for sub-agent to complete...]` };
1822
+ await processYieldSignal(streamYieldChildId, messages);
1823
+ }
979
1824
  }
980
1825
  }
1826
+ for (const toolCall of deferredToolCalls) {
1827
+ const toolResult = {
1828
+ success: false,
1829
+ error: 'Skipped because single-tool mode executes one call per round.',
1830
+ };
1831
+ history.push({
1832
+ type: 'tool_result',
1833
+ content: toolResult.error ?? 'Tool skipped',
1834
+ timestamp: new Date(),
1835
+ toolCall,
1836
+ toolResult,
1837
+ });
1838
+ messages.push({
1839
+ role: 'tool',
1840
+ content: toolResult.error ?? 'Tool skipped',
1841
+ tool_call_id: toolCall.id,
1842
+ name: toolCall.function.name,
1843
+ });
1844
+ yield { type: 'tool_result', toolCall, toolResult };
1845
+ }
981
1846
  if (terminateDetectedStreaming)
982
1847
  break;
983
- inputTokens = this.deps.tokenCounter.countMessageTokens(messages);
1848
+ if (abortController?.signal.aborted) {
1849
+ yield { type: "content", content: "\n\n[Operation cancelled by user]" };
1850
+ yield { type: "done" };
1851
+ return;
1852
+ }
1853
+ // Tool-call/result pairs are complete at this boundary, so a steer
1854
+ // that arrived while tools were running can now be injected safely.
1855
+ const deferredSteering = this.deps.messageQueue?.hasSteeringMessage()
1856
+ ? this.deps.messageQueue.consumeSteeringMessage()
1857
+ : null;
1858
+ if (deferredSteering) {
1859
+ yield {
1860
+ type: 'steer',
1861
+ steer: { content: deferredSteering.content, source: deferredSteering.source },
1862
+ };
1863
+ messages.push({ role: 'user', content: deferredSteering.content });
1864
+ history.push({
1865
+ type: 'user',
1866
+ content: deferredSteering.content,
1867
+ timestamp: deferredSteering.timestamp,
1868
+ });
1869
+ continue;
1870
+ }
1871
+ inputTokens = incrementalTokenCounter.count(messages);
984
1872
  yield { type: "token_count", tokenCount: inputTokens + totalOutputTokens };
985
1873
  // Run after_turn middleware (handles cost recording + limit)
986
1874
  if (pipeline) {
@@ -999,10 +1887,10 @@ export class AgentExecutor {
999
1887
  // Note: cost is recorded once at end-of-loop, not here (avoids double-counting)
1000
1888
  // Apply TTL-based tool result expiry + image pruning + backward-scanned FIFO masking (streaming path)
1001
1889
  try {
1002
- const { applyToolOutputMasking, expireOldToolResults, pruneImageContent } = await import('../../context/tool-output-masking.js');
1003
1890
  expireOldToolResults(messages, toolRounds);
1004
1891
  pruneImageContent(messages);
1005
1892
  applyToolOutputMasking(messages);
1893
+ incrementalTokenCounter.invalidate();
1006
1894
  }
1007
1895
  catch { /* masking is optional */ }
1008
1896
  }
@@ -1033,64 +1921,48 @@ export class AgentExecutor {
1033
1921
  });
1034
1922
  continue;
1035
1923
  }
1036
- // (2) Post-tool empty response: the model went silent after running
1037
- // tools. Nudge it to use the results and continue, bounded.
1038
- if (streamedContentRaw.length === 0 &&
1039
- streamFinishReason !== 'length' &&
1040
- toolRounds > 0 &&
1041
- emptyRetries < maxEmptyRetries) {
1042
- emptyRetries++;
1043
- logger.debug('[agent-executor] empty-response re-prompt', {
1044
- attempt: emptyRetries,
1045
- max: maxEmptyRetries,
1046
- });
1047
- messages.push({
1048
- role: 'user',
1049
- content: 'Your last response was empty. Use the results of the tool calls you just made ' +
1050
- 'to continue the task and produce your answer.',
1924
+ if (streamFinishReason === 'length') {
1925
+ assistantEntry.truncated = true;
1926
+ const notice = lengthContinuations > 0
1927
+ ? `Réponse tronquée après ${lengthContinuations} continuation(s) (limite de longueur atteinte).`
1928
+ : 'Réponse tronquée (limite de longueur atteinte).';
1929
+ logger.warn('[agent-executor] length-truncated response', {
1930
+ continuations: lengthContinuations,
1931
+ max: maxLengthContinuations,
1051
1932
  });
1052
- continue;
1053
- }
1054
- }
1055
- // Fire-and-forget auto-capture on final assistant response (streaming)
1056
- try {
1057
- const { getAutoCaptureManager } = await import('../../memory/auto-capture.js');
1058
- const acm = getAutoCaptureManager();
1059
- if (acm) {
1060
- acm.processMessage('assistant', content || '').catch(err => logger.debug('Auto-capture failed', { error: String(err) }));
1061
- }
1062
- }
1063
- catch { /* auto-capture optional */ }
1064
- // Fire-and-forget ICM episode storage (streaming path)
1065
- if (this.getICMBridgeProvider()) {
1066
- try {
1067
- const icm = this.getICMBridgeProvider()();
1068
- if (icm?.isAvailable()) {
1069
- const episode = `User: ${message}\nAssistant: ${(content || '').substring(0, 500)}`;
1070
- icm.storeEpisode(episode, {
1071
- source: 'agent-executor-stream',
1072
- sessionId: process.env.CODEBUDDY_SESSION_ID,
1073
- turnNumber: toolRounds,
1074
- }).catch(err => logger.debug('ICM episode store failed', { error: String(err) }));
1933
+ assistantEntry.content = assistantEntry.content
1934
+ ? `${assistantEntry.content}\n\n${notice}`
1935
+ : notice;
1936
+ const lastMessage = messages[messages.length - 1];
1937
+ if (lastMessage?.role === 'assistant') {
1938
+ lastMessage.content = assistantEntry.content;
1075
1939
  }
1940
+ yield { type: 'content', content: `\n${notice}\n` };
1941
+ break;
1076
1942
  }
1077
- catch { /* ICM store optional */ }
1943
+ // Post-tool empty responses are handled before persist (D1) so an
1944
+ // empty assistant message is never written to the transcript.
1078
1945
  }
1079
- // Context engine afterTurn hook (Native Engine v2026.3.7 — streaming path)
1080
- try {
1081
- const engine = this.deps.contextManager.getContextEngine?.();
1082
- if (engine) {
1083
- engine.afterTurn(messages, { role: 'assistant', content: content || '' });
1084
- }
1946
+ // Companion hosts own the canonical commit boundary: voice,
1947
+ // channel and Cowork persist only relationship-safe, semantically
1948
+ // accepted text in their surface continuity/session stores. Generic
1949
+ // core observers (AutoCapture, ICM and plugin ContextEngine hooks)
1950
+ // are deliberately not replayed for these protected turns: their
1951
+ // storage/privacy contracts are independent and must never receive a
1952
+ // pre-gate draft or intimate cross-surface transcript by accident.
1953
+ if (!isolatedSharedHost && !relationshipSafety) {
1954
+ this.commitAssistantSideEffects(message, messages, content || '', toolRounds);
1085
1955
  }
1086
- catch { /* afterTurn hook optional */ }
1087
1956
  break;
1088
1957
  }
1089
1958
  }
1090
- if (toolRounds >= maxToolRounds) {
1091
- yield { type: "content", content: "\n\nMaximum tool execution rounds reached." };
1959
+ if (toolRounds >= maxToolRounds && !terminateDetectedStreaming) {
1960
+ const limitMessage = 'Maximum tool execution rounds reached.';
1961
+ history.push({ type: 'assistant', content: limitMessage, timestamp: new Date() });
1962
+ messages.push({ role: 'assistant', content: limitMessage });
1963
+ yield { type: 'content', content: `\n\n${limitMessage}` };
1092
1964
  }
1093
- this.config.recordSessionCost(inputTokens, totalOutputTokens);
1965
+ recordTurnCost();
1094
1966
  // Display per-turn token usage (streaming path). Pass the model
1095
1967
  // name so estimateCost can zero out subscription-billed models
1096
1968
  // (e.g. gpt-5.5 via ChatGPT Codex backend) — flat-fee, not per token.
@@ -1098,8 +1970,12 @@ export class AgentExecutor {
1098
1970
  // may be partial mocks — fall through to estimateCost when it's absent.
1099
1971
  const streamTurnCost = this.deps.client.isSubscriptionAuth?.()
1100
1972
  ? 0
1101
- : estimateCost(inputTokens, totalOutputTokens, undefined, undefined, this.deps.client.getCurrentModel());
1102
- const streamUsageDisplay = formatTokenUsage({ inputTokens, outputTokens: totalOutputTokens, cost: streamTurnCost });
1973
+ : estimateCost(totalInputTokensForCost, totalOutputTokens, undefined, undefined, this.deps.client.getCurrentModel());
1974
+ const streamUsageDisplay = formatTokenUsage({
1975
+ inputTokens: totalInputTokensForCost,
1976
+ outputTokens: totalOutputTokens,
1977
+ cost: streamTurnCost,
1978
+ });
1103
1979
  logger.info(`Token usage: ${streamUsageDisplay}`);
1104
1980
  yield { type: "content", content: `\n${streamUsageDisplay}` };
1105
1981
  if (this.config.isSessionCostLimitReached()) {
@@ -1141,6 +2017,10 @@ export class AgentExecutor {
1141
2017
  return;
1142
2018
  }
1143
2019
  const errorMessage = getErrorMessage(error);
2020
+ logger.error('Agent turn failed', {
2021
+ errorType: error instanceof Error ? error.name : 'unknown',
2022
+ error: errorMessage.slice(0, 2_000),
2023
+ });
1144
2024
  const errorEntry = {
1145
2025
  type: "assistant",
1146
2026
  content: `Sorry, I encountered an error: ${errorMessage}`,
@@ -1151,6 +2031,99 @@ export class AgentExecutor {
1151
2031
  yield { type: "content", content: errorEntry.content };
1152
2032
  yield { type: "done" };
1153
2033
  }
2034
+ finally {
2035
+ recordTurnCost();
2036
+ if (timelineEnabled) {
2037
+ await this.recordCompletedTimelineTurn(timelineHistoryStart, timelineTurn, history, message);
2038
+ }
2039
+ }
2040
+ }
2041
+ async recordCompletedTimelineTurn(historyStart, turn, history, userMessage) {
2042
+ if (!this.deps.recordTimelineTurn)
2043
+ return;
2044
+ try {
2045
+ const turnHistory = history.slice(historyStart);
2046
+ const assistant = [...turnHistory]
2047
+ .reverse()
2048
+ .find((entry) => entry.type === 'assistant');
2049
+ const results = new Map();
2050
+ for (const entry of turnHistory) {
2051
+ if (entry.type !== 'tool_result' || !entry.toolCall)
2052
+ continue;
2053
+ results.set(entry.toolCall.id, entry.toolResult?.success === true);
2054
+ }
2055
+ const toolCalls = [];
2056
+ const seenCalls = new Set();
2057
+ for (const entry of turnHistory) {
2058
+ const calls = entry.toolCalls ?? (entry.toolCall ? [entry.toolCall] : []);
2059
+ for (const call of calls) {
2060
+ const key = call.id || `${call.function.name}:${call.function.arguments}`;
2061
+ if (seenCalls.has(key))
2062
+ continue;
2063
+ seenCalls.add(key);
2064
+ toolCalls.push({
2065
+ name: call.function.name,
2066
+ ok: results.get(call.id) ?? false,
2067
+ });
2068
+ }
2069
+ }
2070
+ const successfulCallIds = new Set([...results.entries()]
2071
+ .filter(([, success]) => success)
2072
+ .map(([callId]) => callId));
2073
+ const successfulHistory = turnHistory.map((entry) => ({
2074
+ ...entry,
2075
+ ...(entry.toolCalls
2076
+ ? { toolCalls: entry.toolCalls.filter((call) => successfulCallIds.has(call.id)) }
2077
+ : {}),
2078
+ ...(entry.toolCall && !successfulCallIds.has(entry.toolCall.id)
2079
+ ? { toolCall: undefined }
2080
+ : {}),
2081
+ }));
2082
+ await this.deps.recordTimelineTurn({
2083
+ turn,
2084
+ ts: new Date().toISOString(),
2085
+ role: assistant ? 'assistant' : 'user',
2086
+ text: assistant?.content ?? userMessage,
2087
+ toolCalls,
2088
+ filesTouched: extractEditedFilesFromHistory(successfulHistory),
2089
+ });
2090
+ }
2091
+ catch (error) {
2092
+ logger.warn('[agent-executor] timeline hook failed', {
2093
+ error: error instanceof Error ? error.message : String(error),
2094
+ });
2095
+ }
2096
+ }
2097
+ /** Notify internal memory/context observers for an ordinary committed turn. */
2098
+ commitAssistantSideEffects(message, messages, content, toolRounds = 0) {
2099
+ try {
2100
+ void import('../../memory/auto-capture.js').then(({ getAutoCaptureManager }) => {
2101
+ const acm = getAutoCaptureManager();
2102
+ return acm?.processMessage('assistant', content);
2103
+ }).catch(err => logger.debug('Auto-capture failed', { error: String(err) }));
2104
+ }
2105
+ catch { /* auto-capture optional */ }
2106
+ if (this.getICMBridgeProvider()) {
2107
+ try {
2108
+ const icm = this.getICMBridgeProvider()();
2109
+ if (icm?.isAvailable()) {
2110
+ const episode = `User: ${message}\nAssistant: ${content.substring(0, 500)}`;
2111
+ void icm.storeEpisode(episode, {
2112
+ source: 'agent-executor-stream',
2113
+ sessionId: process.env.CODEBUDDY_SESSION_ID,
2114
+ turnNumber: toolRounds,
2115
+ }).catch(err => logger.debug('ICM episode store failed', { error: String(err) }));
2116
+ }
2117
+ }
2118
+ catch { /* ICM store optional */ }
2119
+ }
2120
+ try {
2121
+ const engine = this.deps.contextManager.getContextEngine?.();
2122
+ if (engine) {
2123
+ engine.afterTurn(messages, { role: 'assistant', content });
2124
+ }
2125
+ }
2126
+ catch { /* afterTurn hook optional */ }
1154
2127
  }
1155
2128
  }
1156
2129
  //# sourceMappingURL=agent-executor.js.map