@phuetz/code-buddy 1.6.1 → 2.1.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 (2485) hide show
  1. package/LICENSE +90 -21
  2. package/README.fr.md +56 -0
  3. package/README.md +183 -330
  4. package/codebuddy-runtime.json +24 -0
  5. package/dist/advanced/session-replay.js +3 -2
  6. package/dist/agent/agent-state.d.ts +4 -1
  7. package/dist/agent/agent-state.js +9 -3
  8. package/dist/agent/architect-mode.js +1 -1
  9. package/dist/agent/autonomous/agentic-coding-contract.d.ts +28 -28
  10. package/dist/agent/autonomous/agentic-coding-runner.d.ts +14 -4
  11. package/dist/agent/autonomous/agentic-coding-runner.js +176 -27
  12. package/dist/agent/autonomous/checkpoint-manager.js +3 -12
  13. package/dist/agent/autonomous/codex-autonomy-directive.d.ts +10 -0
  14. package/dist/agent/autonomous/codex-autonomy-directive.js +25 -0
  15. package/dist/agent/autonomous/edit-proposal-producer.js +2 -2
  16. package/dist/agent/autonomous/fleet-task-types.d.ts +2 -2
  17. package/dist/agent/autonomous/fleet-task-types.js +2 -2
  18. package/dist/agent/autonomous/fleet-tick-handler.d.ts +3 -3
  19. package/dist/agent/autonomous/fleet-tick-handler.js +14 -8
  20. package/dist/agent/autonomous/recursive-improvement.d.ts +23 -0
  21. package/dist/agent/autonomous/recursive-improvement.js +114 -0
  22. package/dist/agent/autonomous/verification-loop.js +4 -2
  23. package/dist/agent/codebuddy-agent.d.ts +111 -6
  24. package/dist/agent/codebuddy-agent.js +491 -60
  25. package/dist/agent/council-lesson-proposer.d.ts +80 -13
  26. package/dist/agent/council-lesson-proposer.js +201 -43
  27. package/dist/agent/deep-research-ckg.d.ts +176 -0
  28. package/dist/agent/deep-research-ckg.js +250 -0
  29. package/dist/agent/deep-research-storm.d.ts +222 -0
  30. package/dist/agent/deep-research-storm.js +689 -0
  31. package/dist/agent/deep-research.d.ts +329 -0
  32. package/dist/agent/deep-research.js +994 -0
  33. package/dist/agent/delegation/thread-delegation.d.ts +80 -0
  34. package/dist/agent/delegation/thread-delegation.js +472 -0
  35. package/dist/agent/delegation/thread-task-runner.d.ts +37 -0
  36. package/dist/agent/delegation/thread-task-runner.js +89 -0
  37. package/dist/agent/dev-loop/dev-loop.d.ts +120 -0
  38. package/dist/agent/dev-loop/dev-loop.js +404 -0
  39. package/dist/agent/dev-loop/structural-gate.d.ts +32 -0
  40. package/dist/agent/dev-loop/structural-gate.js +120 -0
  41. package/dist/agent/execution/agent-executor.d.ts +52 -40
  42. package/dist/agent/execution/agent-executor.js +1669 -543
  43. package/dist/agent/execution/context-pipeline.d.ts +63 -6
  44. package/dist/agent/execution/context-pipeline.js +347 -88
  45. package/dist/agent/execution/incremental-token-counter.d.ts +15 -0
  46. package/dist/agent/execution/incremental-token-counter.js +36 -0
  47. package/dist/agent/execution/ordered-tool-executor.d.ts +14 -0
  48. package/dist/agent/execution/ordered-tool-executor.js +54 -0
  49. package/dist/agent/execution/post-tool-handlers.d.ts +1 -1
  50. package/dist/agent/execution/post-tool-handlers.js +2 -2
  51. package/dist/agent/execution/query-classifier.d.ts +2 -0
  52. package/dist/agent/execution/query-classifier.js +2 -0
  53. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  54. package/dist/agent/execution/tool-loop-guard.d.ts +76 -0
  55. package/dist/agent/execution/tool-loop-guard.js +165 -0
  56. package/dist/agent/execution/tool-selection-strategy.d.ts +20 -0
  57. package/dist/agent/execution/tool-selection-strategy.js +162 -23
  58. package/dist/agent/facades/message-history-manager.d.ts +1 -1
  59. package/dist/agent/facades/message-history-manager.js +1 -1
  60. package/dist/agent/facades/model-routing-facade.d.ts +31 -1
  61. package/dist/agent/facades/model-routing-facade.js +86 -2
  62. package/dist/agent/facades/session-facade.d.ts +10 -8
  63. package/dist/agent/facades/session-facade.js +58 -45
  64. package/dist/agent/film/film-producer.d.ts +98 -0
  65. package/dist/agent/film/film-producer.js +289 -0
  66. package/dist/agent/film/scene-planner.d.ts +38 -0
  67. package/dist/agent/film/scene-planner.js +93 -0
  68. package/dist/agent/film/trailer-planner.d.ts +23 -0
  69. package/dist/agent/film/trailer-planner.js +242 -0
  70. package/dist/agent/film/video-studio.d.ts +72 -0
  71. package/dist/agent/film/video-studio.js +249 -0
  72. package/dist/agent/flow/planning-flow.d.ts +3 -0
  73. package/dist/agent/flow/planning-flow.js +70 -8
  74. package/dist/agent/hermes-claw-migrate.d.ts +62 -21
  75. package/dist/agent/hermes-claw-migrate.js +196 -17
  76. package/dist/agent/hermes-memory-providers.js +3 -3
  77. package/dist/agent/hermes-parity-manifest.js +69 -15
  78. package/dist/agent/hermes-protocol-gateways.js +8 -1
  79. package/dist/agent/infrastructure/agent-infrastructure.d.ts +1 -0
  80. package/dist/agent/infrastructure/agent-infrastructure.js +1 -1
  81. package/dist/agent/isolation/agent-workspace.js +5 -2
  82. package/dist/agent/learning/skill-background-writes.js +9 -4
  83. package/dist/agent/learning-agent.js +4 -4
  84. package/dist/agent/learning-background-writes.js +9 -5
  85. package/dist/agent/lesson-candidate-queue.d.ts +4 -0
  86. package/dist/agent/lesson-candidate-queue.js +9 -3
  87. package/dist/agent/lesson-provenance.js +9 -3
  88. package/dist/agent/lessons-tracker.d.ts +68 -1
  89. package/dist/agent/lessons-tracker.js +218 -36
  90. package/dist/agent/loop-detection-service.d.ts +56 -0
  91. package/dist/agent/loop-detection-service.js +207 -0
  92. package/dist/agent/middleware/auto-observation.d.ts +2 -0
  93. package/dist/agent/middleware/auto-observation.js +4 -2
  94. package/dist/agent/middleware/auto-repair-middleware.d.ts +2 -0
  95. package/dist/agent/middleware/auto-repair-middleware.js +27 -4
  96. package/dist/agent/middleware/changed-files.d.ts +19 -0
  97. package/dist/agent/middleware/changed-files.js +113 -0
  98. package/dist/agent/middleware/cost-limit.d.ts +0 -2
  99. package/dist/agent/middleware/cost-limit.js +0 -3
  100. package/dist/agent/middleware/index.d.ts +2 -0
  101. package/dist/agent/middleware/index.js +1 -0
  102. package/dist/agent/middleware/pipeline.d.ts +9 -0
  103. package/dist/agent/middleware/pipeline.js +18 -0
  104. package/dist/agent/middleware/plan-completion-audit.d.ts +76 -0
  105. package/dist/agent/middleware/plan-completion-audit.js +157 -0
  106. package/dist/agent/middleware/quality-gate-middleware.d.ts +43 -1
  107. package/dist/agent/middleware/quality-gate-middleware.js +198 -40
  108. package/dist/agent/middleware/types.d.ts +6 -0
  109. package/dist/agent/middleware/verification-enforcement.d.ts +10 -3
  110. package/dist/agent/middleware/verification-enforcement.js +43 -13
  111. package/dist/agent/middleware/workflow-guard.js +7 -0
  112. package/dist/agent/model-benchmark.js +11 -17
  113. package/dist/agent/model-tier.d.ts +2 -2
  114. package/dist/agent/model-tier.js +10 -7
  115. package/dist/agent/multi-agent/agent-memory-integration.js +3 -2
  116. package/dist/agent/multi-agent/base-agent.d.ts +12 -1
  117. package/dist/agent/multi-agent/base-agent.js +58 -10
  118. package/dist/agent/multi-agent/enhanced-coordination.js +1 -0
  119. package/dist/agent/multi-agent/metrics-persistence.js +28 -14
  120. package/dist/agent/multi-agent/multi-agent-system.d.ts +5 -0
  121. package/dist/agent/multi-agent/multi-agent-system.js +81 -4
  122. package/dist/agent/multi-agent/session-fleet-bridge.js +2 -1
  123. package/dist/agent/multi-agent/session-registry.js +9 -3
  124. package/dist/agent/multi-agent/team-manager.d.ts +11 -0
  125. package/dist/agent/multi-agent/team-manager.js +94 -5
  126. package/dist/agent/multi-agent/types.d.ts +10 -1
  127. package/dist/agent/multi-agent/workflow-multi-persistence.js +16 -8
  128. package/dist/agent/multi-agent/workflow-persistence.js +9 -6
  129. package/dist/agent/observer/trigger-registry.js +3 -5
  130. package/dist/agent/operating-modes.d.ts +3 -0
  131. package/dist/agent/operating-modes.js +15 -22
  132. package/dist/agent/pipelines.d.ts +2 -4
  133. package/dist/agent/pipelines.js +1 -1
  134. package/dist/agent/plan-mode.js +1 -1
  135. package/dist/agent/prompt-suggestions.js +2 -1
  136. package/dist/agent/prompt-tool-observation.d.ts +55 -0
  137. package/dist/agent/prompt-tool-observation.js +165 -0
  138. package/dist/agent/reasoning/tree-of-thought.js +1 -1
  139. package/dist/agent/repair/repair-engine.js +1 -1
  140. package/dist/agent/repo-profiler.d.ts +12 -1
  141. package/dist/agent/repo-profiler.js +37 -18
  142. package/dist/agent/repo-profiling/cache.js +6 -9
  143. package/dist/agent/research-worker-provider.d.ts +38 -0
  144. package/dist/agent/research-worker-provider.js +30 -0
  145. package/dist/agent/science/experiment-decision.d.ts +48 -0
  146. package/dist/agent/science/experiment-decision.js +65 -0
  147. package/dist/agent/science/experiment-empirical-gate.d.ts +83 -0
  148. package/dist/agent/science/experiment-empirical-gate.js +156 -0
  149. package/dist/agent/science/experiment-fitness.d.ts +112 -0
  150. package/dist/agent/science/experiment-fitness.js +188 -0
  151. package/dist/agent/science/experiment-loop.d.ts +196 -0
  152. package/dist/agent/science/experiment-loop.js +765 -0
  153. package/dist/agent/science/experiment-orchestrator.d.ts +203 -0
  154. package/dist/agent/science/experiment-orchestrator.js +454 -0
  155. package/dist/agent/science/experiment-sandbox-backends.d.ts +56 -0
  156. package/dist/agent/science/experiment-sandbox-backends.js +201 -0
  157. package/dist/agent/science/experiment-sandbox.d.ts +105 -0
  158. package/dist/agent/science/experiment-sandbox.js +196 -0
  159. package/dist/agent/science/experiment-variant-store.d.ts +108 -0
  160. package/dist/agent/science/experiment-variant-store.js +156 -0
  161. package/dist/agent/science/human-gate.d.ts +31 -0
  162. package/dist/agent/science/human-gate.js +32 -0
  163. package/dist/agent/self-improvement/authored-artifact-gate.js +28 -3
  164. package/dist/agent/self-improvement/authored-tool-runtime.d.ts +4 -2
  165. package/dist/agent/self-improvement/authored-tool-runtime.js +16 -3
  166. package/dist/agent/self-improvement/authored-tool-store.js +3 -2
  167. package/dist/agent/self-improvement/capability-benchmark.js +89 -2
  168. package/dist/agent/self-improvement/continuous-benchmark.d.ts +105 -0
  169. package/dist/agent/self-improvement/continuous-benchmark.js +355 -0
  170. package/dist/agent/self-improvement/delegation-facts.d.ts +105 -0
  171. package/dist/agent/self-improvement/delegation-facts.js +483 -0
  172. package/dist/agent/self-improvement/digest-sources.d.ts +56 -0
  173. package/dist/agent/self-improvement/digest-sources.js +294 -0
  174. package/dist/agent/self-improvement/digest.d.ts +169 -0
  175. package/dist/agent/self-improvement/digest.js +543 -0
  176. package/dist/agent/self-improvement/engine.d.ts +11 -6
  177. package/dist/agent/self-improvement/engine.js +13 -7
  178. package/dist/agent/self-improvement/evolution/ast-novelty.d.ts +25 -0
  179. package/dist/agent/self-improvement/evolution/ast-novelty.js +116 -0
  180. package/dist/agent/self-improvement/evolution/code-variant-store.d.ts +104 -0
  181. package/dist/agent/self-improvement/evolution/code-variant-store.js +229 -0
  182. package/dist/agent/self-improvement/evolution/evolution-engine.d.ts +199 -0
  183. package/dist/agent/self-improvement/evolution/evolution-engine.js +505 -0
  184. package/dist/agent/self-improvement/evolution/feature-map.d.ts +24 -0
  185. package/dist/agent/self-improvement/evolution/feature-map.js +88 -0
  186. package/dist/agent/self-improvement/evolution/model-bandit.d.ts +57 -0
  187. package/dist/agent/self-improvement/evolution/model-bandit.js +98 -0
  188. package/dist/agent/self-improvement/evolution/protected-paths.d.ts +31 -0
  189. package/dist/agent/self-improvement/evolution/protected-paths.js +111 -0
  190. package/dist/agent/self-improvement/evolution/research-weakness-source.d.ts +56 -0
  191. package/dist/agent/self-improvement/evolution/research-weakness-source.js +161 -0
  192. package/dist/agent/self-improvement/evolution/scrub-env.d.ts +22 -0
  193. package/dist/agent/self-improvement/evolution/scrub-env.js +40 -0
  194. package/dist/agent/self-improvement/evolution/variant-fitness.d.ts +97 -0
  195. package/dist/agent/self-improvement/evolution/variant-fitness.js +343 -0
  196. package/dist/agent/self-improvement/evolution/variant-planner.d.ts +41 -0
  197. package/dist/agent/self-improvement/evolution/variant-planner.js +156 -0
  198. package/dist/agent/self-improvement/evolution/weakness-selector.d.ts +38 -0
  199. package/dist/agent/self-improvement/evolution/weakness-selector.js +108 -0
  200. package/dist/agent/self-improvement/evolution/worktree-scorer.d.ts +46 -0
  201. package/dist/agent/self-improvement/evolution/worktree-scorer.js +114 -0
  202. package/dist/agent/self-improvement/evolutionary-archive.d.ts +2 -1
  203. package/dist/agent/self-improvement/evolutionary-archive.js +37 -7
  204. package/dist/agent/self-improvement/experience-source.d.ts +60 -7
  205. package/dist/agent/self-improvement/experience-source.js +78 -8
  206. package/dist/agent/self-improvement/index.d.ts +1 -0
  207. package/dist/agent/self-improvement/index.js +6 -3
  208. package/dist/agent/self-improvement/learning-store.d.ts +16 -0
  209. package/dist/agent/self-improvement/learning-store.js +83 -3
  210. package/dist/agent/self-improvement/llm-drafter.d.ts +3 -1
  211. package/dist/agent/self-improvement/llm-drafter.js +20 -2
  212. package/dist/agent/self-improvement/llm-tool-proposer.js +1 -1
  213. package/dist/agent/self-improvement/proposal-store.d.ts +47 -0
  214. package/dist/agent/self-improvement/proposal-store.js +149 -0
  215. package/dist/agent/self-improvement/proposer.d.ts +1 -1
  216. package/dist/agent/self-improvement/proposer.js +94 -2
  217. package/dist/agent/self-improvement/rule-store.js +5 -4
  218. package/dist/agent/self-improvement/sandbox-scorer.d.ts +1 -1
  219. package/dist/agent/self-improvement/sandbox-scorer.js +8 -4
  220. package/dist/agent/self-improvement/self-knowledge.d.ts +1 -1
  221. package/dist/agent/self-improvement/self-knowledge.js +8 -8
  222. package/dist/agent/self-improvement/skill-apply-journal.d.ts +44 -0
  223. package/dist/agent/self-improvement/skill-apply-journal.js +178 -0
  224. package/dist/agent/self-improvement/skill-behavior-benchmark.d.ts +3 -0
  225. package/dist/agent/self-improvement/skill-behavior-benchmark.js +19 -0
  226. package/dist/agent/self-improvement/skill-behavior-gate.d.ts +34 -0
  227. package/dist/agent/self-improvement/skill-behavior-gate.js +96 -0
  228. package/dist/agent/self-improvement/skill-benchmark.js +27 -0
  229. package/dist/agent/self-improvement/skill-consolidator.js +16 -0
  230. package/dist/agent/self-improvement/skill-engine.d.ts +29 -0
  231. package/dist/agent/self-improvement/skill-engine.js +428 -30
  232. package/dist/agent/self-improvement/skill-gate.d.ts +6 -4
  233. package/dist/agent/self-improvement/skill-gate.js +55 -22
  234. package/dist/agent/self-improvement/skill-mutator.d.ts +26 -2
  235. package/dist/agent/self-improvement/skill-mutator.js +185 -30
  236. package/dist/agent/self-improvement/skill-proposer.js +2 -1
  237. package/dist/agent/self-improvement/skill-types.d.ts +6 -1
  238. package/dist/agent/self-improvement/strategy-engine.d.ts +54 -0
  239. package/dist/agent/self-improvement/strategy-engine.js +104 -0
  240. package/dist/agent/self-improvement/strategy-gate.d.ts +49 -0
  241. package/dist/agent/self-improvement/strategy-gate.js +243 -0
  242. package/dist/agent/self-improvement/strategy-live.d.ts +39 -0
  243. package/dist/agent/self-improvement/strategy-live.js +114 -0
  244. package/dist/agent/self-improvement/strategy-proposer.d.ts +30 -0
  245. package/dist/agent/self-improvement/strategy-proposer.js +114 -0
  246. package/dist/agent/self-improvement/strategy-replay.d.ts +40 -0
  247. package/dist/agent/self-improvement/strategy-replay.js +150 -0
  248. package/dist/agent/self-improvement/strategy-runtime.d.ts +43 -0
  249. package/dist/agent/self-improvement/strategy-runtime.js +56 -0
  250. package/dist/agent/self-improvement/strategy-store.d.ts +38 -0
  251. package/dist/agent/self-improvement/strategy-store.js +139 -0
  252. package/dist/agent/self-improvement/strategy-types.d.ts +229 -0
  253. package/dist/agent/self-improvement/strategy-types.js +90 -0
  254. package/dist/agent/self-improvement/tool-benchmark.js +164 -8
  255. package/dist/agent/self-improvement/tool-engine.d.ts +12 -3
  256. package/dist/agent/self-improvement/tool-engine.js +59 -31
  257. package/dist/agent/self-improvement/tool-gate.d.ts +2 -0
  258. package/dist/agent/self-improvement/tool-gate.js +26 -0
  259. package/dist/agent/self-improvement/tool-skill-mutator.d.ts +1 -1
  260. package/dist/agent/self-improvement/tool-skill-mutator.js +20 -2
  261. package/dist/agent/self-improvement/tool-types.d.ts +5 -3
  262. package/dist/agent/self-improvement/types.d.ts +18 -3
  263. package/dist/agent/session-end-flush.js +2 -1
  264. package/dist/agent/specialized/agent-registry.d.ts +1 -0
  265. package/dist/agent/specialized/agent-registry.js +118 -0
  266. package/dist/agent/specialized/excel-agent.js +15 -1
  267. package/dist/agent/specialized/index.d.ts +1 -0
  268. package/dist/agent/specialized/index.js +2 -0
  269. package/dist/agent/specialized/pdf-agent.js +4 -2
  270. package/dist/agent/specialized/swe-agent-adapter.js +8 -0
  271. package/dist/agent/specialized/swe-agent.d.ts +16 -1
  272. package/dist/agent/specialized/swe-agent.js +75 -7
  273. package/dist/agent/specialized/types.d.ts +31 -1
  274. package/dist/agent/specialized/types.js +26 -0
  275. package/dist/agent/specialized/verifier-agent.d.ts +53 -0
  276. package/dist/agent/specialized/verifier-agent.js +342 -0
  277. package/dist/agent/streaming/message-reducer.js +73 -19
  278. package/dist/agent/streaming/streaming-handler.d.ts +24 -0
  279. package/dist/agent/streaming/streaming-handler.js +136 -1
  280. package/dist/agent/subagents.d.ts +10 -4
  281. package/dist/agent/subagents.js +39 -6
  282. package/dist/agent/thinking/extended-thinking.js +1 -1
  283. package/dist/agent/todo-tracker.js +5 -4
  284. package/dist/agent/tool-executor.d.ts +10 -1
  285. package/dist/agent/tool-executor.js +29 -0
  286. package/dist/agent/tool-handler.d.ts +50 -3
  287. package/dist/agent/tool-handler.js +758 -182
  288. package/dist/agent/types.d.ts +3 -5
  289. package/dist/agent/wide-research-checkpoint.d.ts +77 -0
  290. package/dist/agent/wide-research-checkpoint.js +361 -0
  291. package/dist/agent/wide-research-files.d.ts +11 -0
  292. package/dist/agent/wide-research-files.js +189 -0
  293. package/dist/agent/wide-research.d.ts +148 -3
  294. package/dist/agent/wide-research.js +833 -56
  295. package/dist/analytics/code-evolution.js +20 -15
  296. package/dist/analytics/complexity-analyzer.js +2 -2
  297. package/dist/analytics/cost-report.d.ts +71 -0
  298. package/dist/analytics/cost-report.js +724 -0
  299. package/dist/analytics/dashboard.js +8 -7
  300. package/dist/analytics/index.d.ts +2 -0
  301. package/dist/analytics/index.js +2 -0
  302. package/dist/analytics/repo-explainer-collector.d.ts +13 -0
  303. package/dist/analytics/repo-explainer-collector.js +351 -0
  304. package/dist/analytics/repo-explainer.d.ts +224 -0
  305. package/dist/analytics/repo-explainer.js +605 -0
  306. package/dist/analytics/roi-tracker.js +11 -9
  307. package/dist/api/webhooks.js +9 -14
  308. package/dist/app/application-factory.d.ts +1 -1
  309. package/dist/app/application-factory.js +6 -5
  310. package/dist/auth/profile-manager.js +9 -5
  311. package/dist/avatar/avatar-event-bus.d.ts +16 -0
  312. package/dist/avatar/avatar-event-bus.js +53 -0
  313. package/dist/avatar/avatar-gateway-bridge.d.ts +26 -0
  314. package/dist/avatar/avatar-gateway-bridge.js +54 -0
  315. package/dist/avatar/avatar-protocol.d.ts +133 -0
  316. package/dist/avatar/avatar-protocol.js +241 -0
  317. package/dist/avatar/avatar-renderer-registry.d.ts +56 -0
  318. package/dist/avatar/avatar-renderer-registry.js +191 -0
  319. package/dist/avatar/avatar-renderer-simulator.d.ts +31 -0
  320. package/dist/avatar/avatar-renderer-simulator.js +160 -0
  321. package/dist/browser-automation/browser-manager.d.ts +15 -1
  322. package/dist/browser-automation/browser-manager.js +101 -0
  323. package/dist/browser-automation/browser-operator-executor.d.ts +89 -7
  324. package/dist/browser-automation/browser-operator-executor.js +1280 -58
  325. package/dist/browser-automation/browser-operator-runtime.d.ts +87 -0
  326. package/dist/browser-automation/browser-operator-runtime.js +441 -0
  327. package/dist/browser-automation/browser-operator-session.js +4 -3
  328. package/dist/browser-automation/browser-tool.d.ts +17 -2
  329. package/dist/browser-automation/browser-tool.js +101 -39
  330. package/dist/browser-automation/internet-scout-plan.d.ts +1 -0
  331. package/dist/browser-automation/internet-scout-plan.js +17 -0
  332. package/dist/browser-automation/profile-manager.js +5 -3
  333. package/dist/browser-automation/types.d.ts +25 -0
  334. package/dist/cache/advanced-lru-cache.js +4 -4
  335. package/dist/cache/cache-manager.js +9 -10
  336. package/dist/cache/embedding-cache.js +6 -5
  337. package/dist/cache/llm-response-cache.js +3 -4
  338. package/dist/capture/screen-recorder.d.ts +2 -0
  339. package/dist/capture/screen-recorder.js +6 -4
  340. package/dist/capture/screen-watcher.d.ts +6 -3
  341. package/dist/capture/screen-watcher.js +86 -9
  342. package/dist/channels/channel-cognitive-port.d.ts +46 -0
  343. package/dist/channels/channel-cognitive-port.js +182 -0
  344. package/dist/channels/channel-model-override.d.ts +47 -0
  345. package/dist/channels/channel-model-override.js +62 -0
  346. package/dist/channels/companion-channel-profile.d.ts +68 -0
  347. package/dist/channels/companion-channel-profile.js +142 -0
  348. package/dist/channels/companion-channel-turn.d.ts +79 -0
  349. package/dist/channels/companion-channel-turn.js +240 -0
  350. package/dist/channels/core.d.ts +37 -3
  351. package/dist/channels/core.js +63 -6
  352. package/dist/channels/discord/client.js +34 -14
  353. package/dist/channels/dm-pairing.d.ts +18 -4
  354. package/dist/channels/dm-pairing.js +199 -33
  355. package/dist/channels/gateway-lifecycle.d.ts +2 -0
  356. package/dist/channels/gateway-lifecycle.js +1 -0
  357. package/dist/channels/identity-links.d.ts +19 -1
  358. package/dist/channels/identity-links.js +68 -12
  359. package/dist/channels/matrix/index.js +6 -2
  360. package/dist/channels/pro/pro-features.js +17 -0
  361. package/dist/channels/pro/run-tracker.js +9 -4
  362. package/dist/channels/pro/scoped-auth.js +10 -8
  363. package/dist/channels/provider-failure-speech.d.ts +28 -0
  364. package/dist/channels/provider-failure-speech.js +128 -0
  365. package/dist/channels/reconnection-manager.d.ts +2 -0
  366. package/dist/channels/reconnection-manager.js +7 -2
  367. package/dist/channels/resolve-channel-secret.d.ts +43 -0
  368. package/dist/channels/resolve-channel-secret.js +82 -0
  369. package/dist/channels/slack/block-builder.d.ts +12 -0
  370. package/dist/channels/slack/block-builder.js +70 -2
  371. package/dist/channels/slack/client.js +62 -15
  372. package/dist/channels/slack/types.d.ts +20 -1
  373. package/dist/channels/slash-parity.d.ts +4 -6
  374. package/dist/channels/slash-parity.js +9 -44
  375. package/dist/channels/telegram/client.d.ts +36 -3
  376. package/dist/channels/telegram/client.js +438 -84
  377. package/dist/channels/telegram/types.d.ts +2 -0
  378. package/dist/channels/webhook-server.js +8 -1
  379. package/dist/channels/whatsapp/index.js +2 -1
  380. package/dist/checkpoints/ghost-snapshot.js +15 -9
  381. package/dist/checkpoints/persistent-checkpoint-manager.js +15 -8
  382. package/dist/cli/command-routing.d.ts +22 -0
  383. package/dist/cli/command-routing.js +54 -0
  384. package/dist/cli/first-run.d.ts +17 -0
  385. package/dist/cli/first-run.js +40 -0
  386. package/dist/cli/headless-options.d.ts +22 -0
  387. package/dist/cli/headless-options.js +112 -0
  388. package/dist/cli/headless-prompt-progress.d.ts +22 -0
  389. package/dist/cli/headless-prompt-progress.js +35 -0
  390. package/dist/cli/headless.js +2 -2
  391. package/dist/cli/listen-port.d.ts +8 -0
  392. package/dist/cli/listen-port.js +20 -0
  393. package/dist/cli/permission-mode-option.d.ts +14 -0
  394. package/dist/cli/permission-mode-option.js +64 -0
  395. package/dist/cli/requested-profile.d.ts +15 -0
  396. package/dist/cli/requested-profile.js +27 -0
  397. package/dist/cli/session-commands.d.ts +9 -0
  398. package/dist/cli/session-commands.js +45 -5
  399. package/dist/cli/session-picker.d.ts +43 -0
  400. package/dist/cli/session-picker.js +128 -0
  401. package/dist/cli/unknown-option-hint.d.ts +16 -0
  402. package/dist/cli/unknown-option-hint.js +116 -0
  403. package/dist/cli/voice-command.d.ts +32 -0
  404. package/dist/cli/voice-command.js +96 -0
  405. package/dist/codebuddy/a2a-call-tool-defs.d.ts +26 -0
  406. package/dist/codebuddy/a2a-call-tool-defs.js +12 -0
  407. package/dist/codebuddy/abort-signal.d.ts +7 -0
  408. package/dist/codebuddy/abort-signal.js +31 -0
  409. package/dist/codebuddy/client.d.ts +68 -0
  410. package/dist/codebuddy/client.js +460 -11
  411. package/dist/codebuddy/fleet-tool-defs.d.ts +1 -0
  412. package/dist/codebuddy/fleet-tool-defs.js +29 -0
  413. package/dist/codebuddy/llm-retry.d.ts +24 -0
  414. package/dist/codebuddy/llm-retry.js +124 -0
  415. package/dist/codebuddy/provider-error-classifier.d.ts +86 -0
  416. package/dist/codebuddy/provider-error-classifier.js +410 -0
  417. package/dist/codebuddy/provider-failover-error.d.ts +16 -0
  418. package/dist/codebuddy/provider-failover-error.js +50 -0
  419. package/dist/codebuddy/provider-failover-kind.d.ts +15 -0
  420. package/dist/codebuddy/provider-failover-kind.js +172 -0
  421. package/dist/codebuddy/provider-handoff.d.ts +35 -0
  422. package/dist/codebuddy/provider-handoff.js +294 -0
  423. package/dist/codebuddy/providers/chatgpt-headers.d.ts +18 -0
  424. package/dist/codebuddy/providers/chatgpt-headers.js +37 -0
  425. package/dist/codebuddy/providers/ollama-native-transport.d.ts +130 -0
  426. package/dist/codebuddy/providers/ollama-native-transport.js +387 -0
  427. package/dist/codebuddy/providers/provider-agy-cli.d.ts +29 -0
  428. package/dist/codebuddy/providers/provider-agy-cli.js +264 -0
  429. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +61 -8
  430. package/dist/codebuddy/providers/provider-chatgpt-responses.js +526 -184
  431. package/dist/codebuddy/providers/provider-gemini-cli.js +95 -13
  432. package/dist/codebuddy/providers/provider-gemini-native.d.ts +2 -0
  433. package/dist/codebuddy/providers/provider-gemini-native.js +199 -86
  434. package/dist/codebuddy/providers/provider-openai-compat.d.ts +82 -0
  435. package/dist/codebuddy/providers/provider-openai-compat.js +469 -45
  436. package/dist/codebuddy/ragchat-tool-defs.d.ts +31 -0
  437. package/dist/codebuddy/ragchat-tool-defs.js +19 -0
  438. package/dist/codebuddy/resource-catalog-tool-defs.d.ts +28 -0
  439. package/dist/codebuddy/resource-catalog-tool-defs.js +18 -0
  440. package/dist/codebuddy/stream-retry.d.ts +21 -8
  441. package/dist/codebuddy/stream-retry.js +44 -40
  442. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +4 -0
  443. package/dist/codebuddy/tool-definitions/advanced-tools.js +188 -0
  444. package/dist/codebuddy/tool-definitions/agent-tools.d.ts +5 -0
  445. package/dist/codebuddy/tool-definitions/agent-tools.js +197 -9
  446. package/dist/codebuddy/tool-definitions/browser-tools.d.ts +1 -0
  447. package/dist/codebuddy/tool-definitions/browser-tools.js +65 -1
  448. package/dist/codebuddy/tool-definitions/code-exec-tools.d.ts +8 -0
  449. package/dist/codebuddy/tool-definitions/code-exec-tools.js +33 -0
  450. package/dist/codebuddy/tool-definitions/code-explorer-tools.js +4 -0
  451. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.d.ts +3 -0
  452. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.js +37 -0
  453. package/dist/codebuddy/tool-definitions/core-tools.d.ts +2 -0
  454. package/dist/codebuddy/tool-definitions/core-tools.js +58 -2
  455. package/dist/codebuddy/tool-definitions/cron-tools.js +6 -0
  456. package/dist/codebuddy/tool-definitions/delegate-agent-tools.d.ts +11 -0
  457. package/dist/codebuddy/tool-definitions/delegate-agent-tools.js +50 -0
  458. package/dist/codebuddy/tool-definitions/design-tools.d.ts +6 -0
  459. package/dist/codebuddy/tool-definitions/design-tools.js +35 -0
  460. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.d.ts +1 -0
  461. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.js +23 -1
  462. package/dist/codebuddy/tool-definitions/index.d.ts +16 -7
  463. package/dist/codebuddy/tool-definitions/index.js +27 -8
  464. package/dist/codebuddy/tool-definitions/lsp-tools.d.ts +7 -1
  465. package/dist/codebuddy/tool-definitions/lsp-tools.js +104 -1
  466. package/dist/codebuddy/tool-definitions/meeting-tools.d.ts +4 -0
  467. package/dist/codebuddy/tool-definitions/meeting-tools.js +32 -0
  468. package/dist/codebuddy/tool-definitions/moa-tools.js +7 -2
  469. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +14 -0
  470. package/dist/codebuddy/tool-definitions/multimodal-tools.js +615 -3
  471. package/dist/codebuddy/tool-definitions/research-tools.d.ts +20 -0
  472. package/dist/codebuddy/tool-definitions/research-tools.js +98 -0
  473. package/dist/codebuddy/tool-definitions/self-describe-tools.d.ts +4 -0
  474. package/dist/codebuddy/tool-definitions/self-describe-tools.js +33 -0
  475. package/dist/codebuddy/tool-definitions/self-evolution-tools.d.ts +4 -0
  476. package/dist/codebuddy/tool-definitions/self-evolution-tools.js +31 -0
  477. package/dist/codebuddy/tool-definitions/verify-tools.d.ts +14 -0
  478. package/dist/codebuddy/tool-definitions/verify-tools.js +36 -0
  479. package/dist/codebuddy/tool-definitions/web-tools.d.ts +4 -0
  480. package/dist/codebuddy/tool-definitions/web-tools.js +135 -0
  481. package/dist/codebuddy/tool-definitions/workspace-tools.d.ts +4 -0
  482. package/dist/codebuddy/tool-definitions/workspace-tools.js +43 -0
  483. package/dist/codebuddy/tools.d.ts +15 -23
  484. package/dist/codebuddy/tools.js +259 -57
  485. package/dist/cognition/budget-reservations.d.ts +27 -0
  486. package/dist/cognition/budget-reservations.js +70 -0
  487. package/dist/cognition/cognitive-bus-client.d.ts +94 -0
  488. package/dist/cognition/cognitive-bus-client.js +724 -0
  489. package/dist/cognition/cognitive-hub.d.ts +93 -0
  490. package/dist/cognition/cognitive-hub.js +366 -0
  491. package/dist/cognition/cognitive-mesh.d.ts +38 -0
  492. package/dist/cognition/cognitive-mesh.js +263 -0
  493. package/dist/cognition/cognitive-port.d.ts +35 -0
  494. package/dist/cognition/cognitive-port.js +80 -0
  495. package/dist/cognition/cognitive-wire-contract.d.ts +1542 -0
  496. package/dist/cognition/cognitive-wire-contract.js +164 -0
  497. package/dist/cognition/context-renderer.d.ts +52 -0
  498. package/dist/cognition/context-renderer.js +227 -0
  499. package/dist/cognition/global-workspace.d.ts +39 -0
  500. package/dist/cognition/global-workspace.js +181 -0
  501. package/dist/cognition/index.d.ts +9 -0
  502. package/dist/cognition/index.js +10 -0
  503. package/dist/cognition/llm-specialist.d.ts +40 -0
  504. package/dist/cognition/llm-specialist.js +93 -0
  505. package/dist/cognition/sensory-workspace.d.ts +57 -0
  506. package/dist/cognition/sensory-workspace.js +346 -0
  507. package/dist/cognition/types.d.ts +93 -0
  508. package/dist/cognition/types.js +7 -0
  509. package/dist/cognition/voice-specialists.d.ts +21 -0
  510. package/dist/cognition/voice-specialists.js +89 -0
  511. package/dist/cognition/world-model.d.ts +95 -0
  512. package/dist/cognition/world-model.js +228 -0
  513. package/dist/collaboration/ai-colab-manager.js +12 -13
  514. package/dist/collaboration/team-session.js +25 -11
  515. package/dist/commands/apply-permission-mode.d.ts +27 -0
  516. package/dist/commands/apply-permission-mode.js +35 -0
  517. package/dist/commands/assistant.d.ts +3 -0
  518. package/dist/commands/assistant.js +1022 -0
  519. package/dist/commands/campaign.d.ts +6 -0
  520. package/dist/commands/campaign.js +140 -0
  521. package/dist/commands/capsule.d.ts +2 -0
  522. package/dist/commands/capsule.js +104 -0
  523. package/dist/commands/changelog.d.ts +29 -0
  524. package/dist/commands/changelog.js +283 -0
  525. package/dist/commands/cli/acp-command.js +4 -1
  526. package/dist/commands/cli/backup-command.d.ts +9 -0
  527. package/dist/commands/cli/backup-command.js +47 -0
  528. package/dist/commands/cli/daemon-commands.js +3 -1
  529. package/dist/commands/cli/evolve-command.d.ts +26 -0
  530. package/dist/commands/cli/evolve-command.js +275 -0
  531. package/dist/commands/cli/fleet-collaboration-commands.d.ts +2 -0
  532. package/dist/commands/cli/fleet-collaboration-commands.js +57 -0
  533. package/dist/commands/cli/fleet-commands.js +134 -0
  534. package/dist/commands/cli/fleet-mission-commands.d.ts +3 -0
  535. package/dist/commands/cli/fleet-mission-commands.js +72 -0
  536. package/dist/commands/cli/fleet-rooms-commands.d.ts +10 -0
  537. package/dist/commands/cli/fleet-rooms-commands.js +289 -0
  538. package/dist/commands/cli/improve-command.d.ts +2 -1
  539. package/dist/commands/cli/improve-command.js +309 -20
  540. package/dist/commands/cli/native-engine-commands.js +405 -28
  541. package/dist/commands/cli/sensory-command.d.ts +8 -0
  542. package/dist/commands/cli/sensory-command.js +27 -0
  543. package/dist/commands/cli/speak-command.js +87 -24
  544. package/dist/commands/cli/tools-commands.js +69 -36
  545. package/dist/commands/cli/triage-command.d.ts +8 -0
  546. package/dist/commands/cli/triage-command.js +72 -0
  547. package/dist/commands/cli/utility-commands.js +59 -10
  548. package/dist/commands/client-dispatcher.d.ts +8 -0
  549. package/dist/commands/client-dispatcher.js +113 -42
  550. package/dist/commands/compress.js +3 -0
  551. package/dist/commands/cost.d.ts +33 -0
  552. package/dist/commands/cost.js +342 -0
  553. package/dist/commands/council-scoreboard.d.ts +8 -0
  554. package/dist/commands/council-scoreboard.js +68 -0
  555. package/dist/commands/council.d.ts +16 -24
  556. package/dist/commands/council.js +247 -255
  557. package/dist/commands/cron-cli/index.d.ts +3 -1
  558. package/dist/commands/cron-cli/index.js +25 -0
  559. package/dist/commands/curator-cli.d.ts +14 -0
  560. package/dist/commands/curator-cli.js +57 -0
  561. package/dist/commands/delegate.js +82 -25
  562. package/dist/commands/dev/golden-path.d.ts +71 -0
  563. package/dist/commands/dev/golden-path.js +317 -0
  564. package/dist/commands/dev/index.d.ts +3 -0
  565. package/dist/commands/dev/index.js +151 -119
  566. package/dist/commands/dev/issue-pipeline.js +7 -7
  567. package/dist/commands/dev/workflows.d.ts +2 -0
  568. package/dist/commands/dev/workflows.js +39 -6
  569. package/dist/commands/device-auth.d.ts +10 -0
  570. package/dist/commands/device-auth.js +91 -0
  571. package/dist/commands/enhanced-command-handler.d.ts +12 -0
  572. package/dist/commands/enhanced-command-handler.js +57 -18
  573. package/dist/commands/exchange.d.ts +2 -0
  574. package/dist/commands/exchange.js +193 -0
  575. package/dist/commands/explain.d.ts +12 -0
  576. package/dist/commands/explain.js +135 -0
  577. package/dist/commands/film.d.ts +18 -0
  578. package/dist/commands/film.js +239 -0
  579. package/dist/commands/flow.js +15 -5
  580. package/dist/commands/forge.d.ts +2 -0
  581. package/dist/commands/forge.js +102 -0
  582. package/dist/commands/goal-cli.d.ts +3 -0
  583. package/dist/commands/goal-cli.js +9 -4
  584. package/dist/commands/gpu-worker.d.ts +14 -0
  585. package/dist/commands/gpu-worker.js +135 -0
  586. package/dist/commands/handlers/agent-handlers.d.ts +1 -1
  587. package/dist/commands/handlers/agent-handlers.js +4 -4
  588. package/dist/commands/handlers/agents-handler.d.ts +11 -2
  589. package/dist/commands/handlers/agents-handler.js +79 -13
  590. package/dist/commands/handlers/auth-handlers.js +12 -5
  591. package/dist/commands/handlers/backup-handlers.d.ts +40 -0
  592. package/dist/commands/handlers/backup-handlers.js +784 -57
  593. package/dist/commands/handlers/batch-handlers.d.ts +72 -2
  594. package/dist/commands/handlers/batch-handlers.js +443 -37
  595. package/dist/commands/handlers/branch-handlers.d.ts +1 -0
  596. package/dist/commands/handlers/channel-handlers.d.ts +7 -2
  597. package/dist/commands/handlers/channel-handlers.js +1716 -111
  598. package/dist/commands/handlers/companion-handler.js +130 -9
  599. package/dist/commands/handlers/daily-reset-handler.d.ts +1 -1
  600. package/dist/commands/handlers/daily-reset-handler.js +1 -1
  601. package/dist/commands/handlers/deepthink-handler.d.ts +2 -0
  602. package/dist/commands/handlers/deepthink-handler.js +49 -0
  603. package/dist/commands/handlers/export-handlers.d.ts +3 -2
  604. package/dist/commands/handlers/export-handlers.js +55 -28
  605. package/dist/commands/handlers/extra-handlers.js +28 -25
  606. package/dist/commands/handlers/fleet-handler.d.ts +3 -4
  607. package/dist/commands/handlers/fleet-handler.js +82 -35
  608. package/dist/commands/handlers/goal-handler.d.ts +13 -0
  609. package/dist/commands/handlers/goal-handler.js +26 -7
  610. package/dist/commands/handlers/grill-me-handler.d.ts +2 -0
  611. package/dist/commands/handlers/grill-me-handler.js +49 -0
  612. package/dist/commands/handlers/heartbeat-handler.d.ts +2 -2
  613. package/dist/commands/handlers/heartbeat-handler.js +2 -2
  614. package/dist/commands/handlers/index.d.ts +3 -2
  615. package/dist/commands/handlers/index.js +4 -2
  616. package/dist/commands/handlers/memory-handlers.d.ts +6 -2
  617. package/dist/commands/handlers/memory-handlers.js +75 -15
  618. package/dist/commands/handlers/missing-handlers.d.ts +2 -2
  619. package/dist/commands/handlers/missing-handlers.js +4 -4
  620. package/dist/commands/handlers/permissions-handlers.js +3 -2
  621. package/dist/commands/handlers/pr-handlers.js +15 -17
  622. package/dist/commands/handlers/resources-handler.d.ts +12 -0
  623. package/dist/commands/handlers/resources-handler.js +52 -0
  624. package/dist/commands/handlers/security-handlers.d.ts +1 -1
  625. package/dist/commands/handlers/security-handlers.js +3 -3
  626. package/dist/commands/handlers/slash-session-handlers.d.ts +9 -0
  627. package/dist/commands/handlers/slash-session-handlers.js +134 -0
  628. package/dist/commands/handlers/starter-handlers.d.ts +1 -1
  629. package/dist/commands/handlers/starter-handlers.js +32 -2
  630. package/dist/commands/handlers/swarm-handler.js +41 -2
  631. package/dist/commands/handlers/switch-handler.d.ts +1 -1
  632. package/dist/commands/handlers/switch-handler.js +15 -0
  633. package/dist/commands/handlers/team-handlers.d.ts +28 -1
  634. package/dist/commands/handlers/team-handlers.js +243 -2
  635. package/dist/commands/handlers/test-handlers.js +4 -86
  636. package/dist/commands/handlers/think-handlers.js +2 -1
  637. package/dist/commands/handlers/ui-handlers.js +11 -5
  638. package/dist/commands/handlers/vibe-handlers.js +8 -1
  639. package/dist/commands/handlers/worktree-handlers.js +23 -12
  640. package/dist/commands/headless-slash.d.ts +9 -0
  641. package/dist/commands/headless-slash.js +41 -3
  642. package/dist/commands/import.d.ts +34 -0
  643. package/dist/commands/import.js +478 -0
  644. package/dist/commands/index.d.ts +0 -1
  645. package/dist/commands/index.js +0 -1
  646. package/dist/commands/influencer.d.ts +2 -0
  647. package/dist/commands/influencer.js +87 -0
  648. package/dist/commands/intent.d.ts +6 -0
  649. package/dist/commands/intent.js +131 -0
  650. package/dist/commands/intents.d.ts +10 -0
  651. package/dist/commands/intents.js +163 -0
  652. package/dist/commands/lessons.js +91 -0
  653. package/dist/commands/llm-provider-resolution.d.ts +20 -0
  654. package/dist/commands/llm-provider-resolution.js +74 -13
  655. package/dist/commands/login-chatgpt.d.ts +8 -0
  656. package/dist/commands/login-chatgpt.js +17 -0
  657. package/dist/commands/login-prerequisites.d.ts +11 -0
  658. package/dist/commands/login-prerequisites.js +23 -0
  659. package/dist/commands/loop-cli.d.ts +31 -0
  660. package/dist/commands/loop-cli.js +189 -0
  661. package/dist/commands/lora.d.ts +6 -0
  662. package/dist/commands/lora.js +445 -0
  663. package/dist/commands/maison-food.d.ts +10 -0
  664. package/dist/commands/maison-food.js +485 -0
  665. package/dist/commands/maison.d.ts +17 -0
  666. package/dist/commands/maison.js +236 -0
  667. package/dist/commands/mcp-import.d.ts +11 -0
  668. package/dist/commands/mcp-import.js +67 -0
  669. package/dist/commands/mcp-invoke.d.ts +2 -0
  670. package/dist/commands/mcp-invoke.js +68 -0
  671. package/dist/commands/mcp.d.ts +6 -0
  672. package/dist/commands/mcp.js +240 -7
  673. package/dist/commands/meeting.d.ts +8 -0
  674. package/dist/commands/meeting.js +31 -0
  675. package/dist/commands/pairing.js +7 -8
  676. package/dist/commands/papers/ask.d.ts +47 -0
  677. package/dist/commands/papers/ask.js +105 -0
  678. package/dist/commands/papers/index.d.ts +19 -0
  679. package/dist/commands/papers/index.js +54 -0
  680. package/dist/commands/pipeline.d.ts +7 -1
  681. package/dist/commands/pipeline.js +104 -7
  682. package/dist/commands/provider.d.ts +9 -0
  683. package/dist/commands/provider.js +178 -10
  684. package/dist/commands/replay.d.ts +11 -0
  685. package/dist/commands/replay.js +131 -0
  686. package/dist/commands/research/deep.d.ts +66 -0
  687. package/dist/commands/research/deep.js +236 -0
  688. package/dist/commands/research/discover-searxng.d.ts +25 -0
  689. package/dist/commands/research/discover-searxng.js +62 -0
  690. package/dist/commands/research/index.d.ts +24 -2
  691. package/dist/commands/research/index.js +456 -79
  692. package/dist/commands/research/knowledge-ingest.d.ts +170 -0
  693. package/dist/commands/research/knowledge-ingest.js +449 -0
  694. package/dist/commands/research/wire-research-worker.d.ts +9 -0
  695. package/dist/commands/research/wire-research-worker.js +18 -0
  696. package/dist/commands/resources.d.ts +2 -0
  697. package/dist/commands/resources.js +64 -0
  698. package/dist/commands/run-cli/index.d.ts +3 -1
  699. package/dist/commands/run-cli/index.js +53 -2
  700. package/dist/commands/science/deps.d.ts +95 -0
  701. package/dist/commands/science/deps.js +343 -0
  702. package/dist/commands/science/index.d.ts +31 -0
  703. package/dist/commands/science/index.js +285 -0
  704. package/dist/commands/science/loop-option.d.ts +40 -0
  705. package/dist/commands/science/loop-option.js +91 -0
  706. package/dist/commands/science/sandbox-option.d.ts +44 -0
  707. package/dist/commands/science/sandbox-option.js +42 -0
  708. package/dist/commands/scrape.d.ts +18 -0
  709. package/dist/commands/scrape.js +159 -0
  710. package/dist/commands/self.d.ts +9 -0
  711. package/dist/commands/self.js +56 -0
  712. package/dist/commands/shadow.d.ts +3 -0
  713. package/dist/commands/shadow.js +72 -0
  714. package/dist/commands/share.d.ts +13 -0
  715. package/dist/commands/share.js +71 -0
  716. package/dist/commands/shell-prefix.d.ts +4 -22
  717. package/dist/commands/shell-prefix.js +11 -73
  718. package/dist/commands/skills-cli/index.d.ts +2 -0
  719. package/dist/commands/skills-cli/index.js +224 -26
  720. package/dist/commands/slash/builtin-commands.js +57 -24
  721. package/dist/commands/slash/index.d.ts +3 -1
  722. package/dist/commands/slash/index.js +2 -0
  723. package/dist/commands/slash/surfaces.d.ts +53 -0
  724. package/dist/commands/slash/surfaces.js +177 -0
  725. package/dist/commands/slash/types.d.ts +17 -0
  726. package/dist/commands/slash-commands.js +4 -1
  727. package/dist/commands/token.d.ts +80 -0
  728. package/dist/commands/token.js +319 -0
  729. package/dist/commands/try.d.ts +72 -0
  730. package/dist/commands/try.js +357 -0
  731. package/dist/commands/update.d.ts +14 -1
  732. package/dist/commands/update.js +97 -15
  733. package/dist/commands/vision-train.d.ts +15 -0
  734. package/dist/commands/vision-train.js +214 -0
  735. package/dist/commands/whoami-status.d.ts +17 -0
  736. package/dist/commands/whoami-status.js +34 -0
  737. package/dist/commands/widgets.d.ts +2 -0
  738. package/dist/commands/widgets.js +179 -0
  739. package/dist/commands/ws.d.ts +7 -0
  740. package/dist/commands/ws.js +100 -0
  741. package/dist/companion/assistant-config.d.ts +79 -0
  742. package/dist/companion/assistant-config.js +1148 -0
  743. package/dist/companion/attached-image-grounding.d.ts +29 -0
  744. package/dist/companion/attached-image-grounding.js +285 -0
  745. package/dist/companion/away-mode.d.ts +80 -0
  746. package/dist/companion/away-mode.js +269 -0
  747. package/dist/companion/camera-share.d.ts +65 -0
  748. package/dist/companion/camera-share.js +321 -0
  749. package/dist/companion/camera.d.ts +8 -0
  750. package/dist/companion/camera.js +57 -31
  751. package/dist/companion/cards.js +7 -10
  752. package/dist/companion/check-in.js +23 -8
  753. package/dist/companion/companion-doctor.d.ts +58 -0
  754. package/dist/companion/companion-doctor.js +194 -0
  755. package/dist/companion/companion-history.d.ts +23 -0
  756. package/dist/companion/companion-history.js +22 -0
  757. package/dist/companion/companion-identity.d.ts +43 -0
  758. package/dist/companion/companion-identity.js +136 -0
  759. package/dist/companion/companion-mode.d.ts +77 -1
  760. package/dist/companion/companion-mode.js +916 -6
  761. package/dist/companion/companion-photo-intake.d.ts +40 -0
  762. package/dist/companion/companion-photo-intake.js +112 -0
  763. package/dist/companion/companion-photo.d.ts +144 -0
  764. package/dist/companion/companion-photo.js +318 -0
  765. package/dist/companion/companion-toolset.d.ts +66 -0
  766. package/dist/companion/companion-toolset.js +368 -0
  767. package/dist/companion/companion-turn.d.ts +96 -0
  768. package/dist/companion/companion-turn.js +260 -0
  769. package/dist/companion/companion-voice-character.d.ts +62 -0
  770. package/dist/companion/companion-voice-character.js +148 -0
  771. package/dist/companion/competitive-radar.js +14 -13
  772. package/dist/companion/continuity.d.ts +62 -0
  773. package/dist/companion/continuity.js +284 -0
  774. package/dist/companion/conversation-improvement-loop.d.ts +61 -0
  775. package/dist/companion/conversation-improvement-loop.js +317 -0
  776. package/dist/companion/conversation-quality-insights.d.ts +56 -0
  777. package/dist/companion/conversation-quality-insights.js +161 -0
  778. package/dist/companion/cooking-timer-runner.d.ts +20 -0
  779. package/dist/companion/cooking-timer-runner.js +98 -0
  780. package/dist/companion/core-adapter.d.ts +60 -0
  781. package/dist/companion/core-adapter.js +111 -0
  782. package/dist/companion/crisis-safety.d.ts +52 -0
  783. package/dist/companion/crisis-safety.js +150 -0
  784. package/dist/companion/daily-interaction-budget.d.ts +34 -0
  785. package/dist/companion/daily-interaction-budget.js +260 -0
  786. package/dist/companion/dialogue-percepts.d.ts +16 -0
  787. package/dist/companion/dialogue-percepts.js +50 -0
  788. package/dist/companion/event-followups.d.ts +58 -0
  789. package/dist/companion/event-followups.js +213 -0
  790. package/dist/companion/fashion-scene-catalog.d.ts +29 -0
  791. package/dist/companion/fashion-scene-catalog.js +141 -0
  792. package/dist/companion/gateway-inbox.js +25 -13
  793. package/dist/companion/gateway.d.ts +1 -0
  794. package/dist/companion/gateway.js +37 -17
  795. package/dist/companion/home-interaction-policy.d.ts +31 -0
  796. package/dist/companion/home-interaction-policy.js +89 -0
  797. package/dist/companion/household-time.d.ts +9 -0
  798. package/dist/companion/household-time.js +15 -0
  799. package/dist/companion/idle-loop.d.ts +53 -0
  800. package/dist/companion/idle-loop.js +254 -0
  801. package/dist/companion/impulses.js +148 -23
  802. package/dist/companion/inner-life.d.ts +60 -0
  803. package/dist/companion/inner-life.js +112 -0
  804. package/dist/companion/jokes.d.ts +21 -0
  805. package/dist/companion/jokes.js +175 -0
  806. package/dist/companion/lisa-selfie-cache.d.ts +36 -0
  807. package/dist/companion/lisa-selfie-cache.js +123 -0
  808. package/dist/companion/lisa-selfie-ingest.d.ts +36 -0
  809. package/dist/companion/lisa-selfie-ingest.js +205 -0
  810. package/dist/companion/lisa-selfie-refill.d.ts +32 -0
  811. package/dist/companion/lisa-selfie-refill.js +121 -0
  812. package/dist/companion/lisa-selfie-router.d.ts +40 -0
  813. package/dist/companion/lisa-selfie-router.js +156 -0
  814. package/dist/companion/lisa-selfie.d.ts +97 -0
  815. package/dist/companion/lisa-selfie.js +542 -0
  816. package/dist/companion/maison-voice-actions.d.ts +34 -0
  817. package/dist/companion/maison-voice-actions.js +192 -0
  818. package/dist/companion/migration.d.ts +63 -0
  819. package/dist/companion/migration.js +270 -0
  820. package/dist/companion/mission-board.js +7 -10
  821. package/dist/companion/mission-runner.js +2 -3
  822. package/dist/companion/mobile-conversation-log.d.ts +19 -0
  823. package/dist/companion/mobile-conversation-log.js +157 -0
  824. package/dist/companion/mobile-history.d.ts +34 -0
  825. package/dist/companion/mobile-history.js +123 -0
  826. package/dist/companion/mysoulmate-image-prompts.d.ts +26 -0
  827. package/dist/companion/mysoulmate-image-prompts.js +278 -0
  828. package/dist/companion/orchestrator.d.ts +32 -0
  829. package/dist/companion/orchestrator.js +49 -0
  830. package/dist/companion/percepts.d.ts +70 -0
  831. package/dist/companion/percepts.js +251 -18
  832. package/dist/companion/personas/copine.d.ts +8 -0
  833. package/dist/companion/personas/copine.js +195 -0
  834. package/dist/companion/personas/index.d.ts +19 -0
  835. package/dist/companion/personas/index.js +33 -0
  836. package/dist/companion/personas/types.d.ts +34 -0
  837. package/dist/companion/personas/types.js +8 -0
  838. package/dist/companion/photo-memory-fr.d.ts +36 -0
  839. package/dist/companion/photo-memory-fr.js +291 -0
  840. package/dist/companion/prefetch-config.d.ts +38 -0
  841. package/dist/companion/prefetch-config.js +119 -0
  842. package/dist/companion/prefetch-engine.d.ts +87 -0
  843. package/dist/companion/prefetch-engine.js +513 -0
  844. package/dist/companion/presence-loop.d.ts +85 -0
  845. package/dist/companion/presence-loop.js +297 -0
  846. package/dist/companion/privacy.js +3 -2
  847. package/dist/companion/proactive-engine.d.ts +97 -0
  848. package/dist/companion/proactive-engine.js +447 -0
  849. package/dist/companion/recent-said.d.ts +30 -0
  850. package/dist/companion/recent-said.js +98 -0
  851. package/dist/companion/relational-benchmark-scenarios.d.ts +191 -0
  852. package/dist/companion/relational-benchmark-scenarios.js +227 -0
  853. package/dist/companion/relational-context.d.ts +71 -0
  854. package/dist/companion/relational-context.js +302 -0
  855. package/dist/companion/relational-episode-evaluator.d.ts +117 -0
  856. package/dist/companion/relational-episode-evaluator.js +453 -0
  857. package/dist/companion/relationship-evolution.d.ts +2 -0
  858. package/dist/companion/relationship-evolution.js +30 -0
  859. package/dist/companion/relationship-state.d.ts +106 -0
  860. package/dist/companion/relationship-state.js +293 -0
  861. package/dist/companion/reminder-runner.d.ts +33 -0
  862. package/dist/companion/reminder-runner.js +183 -0
  863. package/dist/companion/reminders.d.ts +228 -0
  864. package/dist/companion/reminders.js +906 -0
  865. package/dist/companion/reply-augment.d.ts +87 -0
  866. package/dist/companion/reply-augment.js +464 -0
  867. package/dist/companion/safety-ledger.js +19 -12
  868. package/dist/companion/self-evaluation.js +22 -23
  869. package/dist/companion/shared-photo-memory.d.ts +65 -0
  870. package/dist/companion/shared-photo-memory.js +145 -0
  871. package/dist/companion/shared-photos.d.ts +88 -0
  872. package/dist/companion/shared-photos.js +321 -0
  873. package/dist/companion/signature-locations.d.ts +16 -0
  874. package/dist/companion/signature-locations.js +108 -0
  875. package/dist/companion/skill-curator.d.ts +9 -0
  876. package/dist/companion/skill-curator.js +147 -58
  877. package/dist/companion/untrusted-text.d.ts +22 -0
  878. package/dist/companion/untrusted-text.js +47 -0
  879. package/dist/companion/user-name.d.ts +18 -0
  880. package/dist/companion/user-name.js +22 -0
  881. package/dist/companion/visual-consent.d.ts +40 -0
  882. package/dist/companion/visual-consent.js +98 -0
  883. package/dist/companion/visual-grounding.d.ts +83 -0
  884. package/dist/companion/visual-grounding.js +474 -0
  885. package/dist/companion/voice-callbacks.d.ts +9 -0
  886. package/dist/companion/voice-callbacks.js +84 -0
  887. package/dist/companion/voice-guidance.d.ts +23 -0
  888. package/dist/companion/voice-guidance.js +85 -0
  889. package/dist/companion/voice-improvement-loop.d.ts +53 -0
  890. package/dist/companion/voice-improvement-loop.js +279 -0
  891. package/dist/companion/voice-incident-repair.d.ts +41 -0
  892. package/dist/companion/voice-incident-repair.js +214 -0
  893. package/dist/config/code-exec-policy.d.ts +25 -0
  894. package/dist/config/code-exec-policy.js +39 -0
  895. package/dist/config/constants.d.ts +41 -0
  896. package/dist/config/constants.js +14 -0
  897. package/dist/config/env-schema.d.ts +2 -0
  898. package/dist/config/env-schema.js +714 -5
  899. package/dist/config/feature-flags.js +8 -12
  900. package/dist/config/feature-surface.d.ts +12 -0
  901. package/dist/config/feature-surface.js +86 -0
  902. package/dist/config/headless-local-prompt.d.ts +9 -0
  903. package/dist/config/headless-local-prompt.js +39 -0
  904. package/dist/config/local-runtime-context.d.ts +41 -0
  905. package/dist/config/local-runtime-context.js +430 -0
  906. package/dist/config/model-registry.js +4 -0
  907. package/dist/config/model-strengths.d.ts +14 -0
  908. package/dist/config/model-strengths.js +15 -0
  909. package/dist/config/model-tools.d.ts +65 -0
  910. package/dist/config/model-tools.js +823 -21
  911. package/dist/config/secret-ref.d.ts +22 -3
  912. package/dist/config/secret-ref.js +103 -41
  913. package/dist/config/toml-config.d.ts +20 -4
  914. package/dist/config/toml-config.js +40 -2
  915. package/dist/context/auto-compact-threshold.d.ts +1 -1
  916. package/dist/context/auto-compact-threshold.js +1 -1
  917. package/dist/context/codebase-map.js +9 -4
  918. package/dist/context/codebase-rag/codebase-rag.js +7 -6
  919. package/dist/context/codebase-rag/hnsw-store.js +9 -4
  920. package/dist/context/codebase-rag/vector-store.js +4 -4
  921. package/dist/context/compaction/parallel-summarizer.js +1 -0
  922. package/dist/context/compression.js +25 -29
  923. package/dist/context/context-manager-v2.d.ts +95 -7
  924. package/dist/context/context-manager-v2.js +444 -91
  925. package/dist/context/context-manager-v3.d.ts +4 -0
  926. package/dist/context/context-manager-v3.js +68 -9
  927. package/dist/context/cross-encoder-reranker.js +8 -3
  928. package/dist/context/default-context-engine.js +1 -1
  929. package/dist/context/enhanced-compression.d.ts +26 -2
  930. package/dist/context/enhanced-compression.js +81 -30
  931. package/dist/context/file-mentions.d.ts +46 -0
  932. package/dist/context/file-mentions.js +245 -0
  933. package/dist/context/importance-scorer.js +4 -3
  934. package/dist/context/jit-context.d.ts +7 -0
  935. package/dist/context/jit-context.js +22 -4
  936. package/dist/context/lm-resizer-compressor.d.ts +102 -0
  937. package/dist/context/lm-resizer-compressor.js +594 -0
  938. package/dist/context/lm-resizer-diagnostics.d.ts +9 -0
  939. package/dist/context/lm-resizer-diagnostics.js +30 -0
  940. package/dist/context/precompaction-flush.js +1 -1
  941. package/dist/context/restorable-compression.d.ts +59 -14
  942. package/dist/context/restorable-compression.js +310 -60
  943. package/dist/context/segment-archive.d.ts +36 -0
  944. package/dist/context/segment-archive.js +220 -0
  945. package/dist/context/smart-compaction.d.ts +7 -0
  946. package/dist/context/smart-compaction.js +84 -15
  947. package/dist/context/token-counter.d.ts +6 -0
  948. package/dist/context/token-counter.js +41 -0
  949. package/dist/context/token-juice.d.ts +72 -0
  950. package/dist/context/token-juice.js +220 -0
  951. package/dist/context/tool-observation-optimizer.d.ts +90 -0
  952. package/dist/context/tool-observation-optimizer.js +231 -0
  953. package/dist/context/tool-output-masking.js +3 -4
  954. package/dist/context/tool-pair-preserver.d.ts +1 -1
  955. package/dist/context/tool-pair-preserver.js +1 -1
  956. package/dist/context/transcript-repair.d.ts +16 -3
  957. package/dist/context/transcript-repair.js +72 -35
  958. package/dist/context/types.d.ts +2 -0
  959. package/dist/conversation/argument-obligations.d.ts +65 -0
  960. package/dist/conversation/argument-obligations.js +157 -0
  961. package/dist/conversation/companion-model-routing.d.ts +121 -0
  962. package/dist/conversation/companion-model-routing.js +810 -0
  963. package/dist/conversation/conversation-benchmark.d.ts +143 -0
  964. package/dist/conversation/conversation-benchmark.js +766 -0
  965. package/dist/conversation/conversation-blind-comparison.d.ts +135 -0
  966. package/dist/conversation/conversation-blind-comparison.js +451 -0
  967. package/dist/conversation/conversation-evaluator.d.ts +56 -0
  968. package/dist/conversation/conversation-evaluator.js +335 -0
  969. package/dist/conversation/conversation-orchestrator.d.ts +32 -0
  970. package/dist/conversation/conversation-orchestrator.js +59 -0
  971. package/dist/conversation/conversation-pilot-corpus.d.ts +33 -0
  972. package/dist/conversation/conversation-pilot-corpus.js +313 -0
  973. package/dist/conversation/conversation-quality.d.ts +31 -0
  974. package/dist/conversation/conversation-quality.js +280 -0
  975. package/dist/conversation/conversation-state.d.ts +23 -0
  976. package/dist/conversation/conversation-state.js +117 -0
  977. package/dist/conversation/cross-channel-bridge.d.ts +127 -0
  978. package/dist/conversation/cross-channel-bridge.js +785 -0
  979. package/dist/conversation/deliberation-thread.d.ts +18 -0
  980. package/dist/conversation/deliberation-thread.js +303 -0
  981. package/dist/conversation/dialogue-act.d.ts +11 -0
  982. package/dist/conversation/dialogue-act.js +132 -0
  983. package/dist/conversation/discourse-planner.d.ts +3 -0
  984. package/dist/conversation/discourse-planner.js +141 -0
  985. package/dist/conversation/fresh-context.d.ts +54 -0
  986. package/dist/conversation/fresh-context.js +258 -0
  987. package/dist/conversation/prefetched-turn-context.d.ts +45 -0
  988. package/dist/conversation/prefetched-turn-context.js +209 -0
  989. package/dist/conversation/relationship-safety.d.ts +37 -0
  990. package/dist/conversation/relationship-safety.js +407 -0
  991. package/dist/conversation/semantic-response-gate.d.ts +262 -0
  992. package/dist/conversation/semantic-response-gate.js +656 -0
  993. package/dist/conversation/semantic-response-runtime.d.ts +79 -0
  994. package/dist/conversation/semantic-response-runtime.js +419 -0
  995. package/dist/conversation/shared-relationship-state.d.ts +60 -0
  996. package/dist/conversation/shared-relationship-state.js +262 -0
  997. package/dist/conversation/types.d.ts +77 -0
  998. package/dist/conversation/types.js +3 -0
  999. package/dist/conversation/voice-continuity.d.ts +13 -0
  1000. package/dist/conversation/voice-continuity.js +48 -0
  1001. package/dist/council/conductor.d.ts +26 -0
  1002. package/dist/council/conductor.js +292 -0
  1003. package/dist/council/council-engine.d.ts +29 -0
  1004. package/dist/council/council-engine.js +458 -0
  1005. package/dist/council/deliberation-health.d.ts +58 -0
  1006. package/dist/council/deliberation-health.js +108 -0
  1007. package/dist/council/judge.d.ts +69 -0
  1008. package/dist/council/judge.js +183 -0
  1009. package/dist/council/peers.d.ts +19 -0
  1010. package/dist/council/peers.js +47 -0
  1011. package/dist/council/signals.d.ts +26 -0
  1012. package/dist/council/signals.js +156 -0
  1013. package/dist/council/task-types.d.ts +16 -0
  1014. package/dist/council/task-types.js +58 -0
  1015. package/dist/council/triage.d.ts +48 -0
  1016. package/dist/council/triage.js +228 -0
  1017. package/dist/council/types.d.ts +292 -0
  1018. package/dist/council/types.js +20 -0
  1019. package/dist/council/with-timeout.d.ts +10 -0
  1020. package/dist/council/with-timeout.js +29 -0
  1021. package/dist/curator/curator.d.ts +85 -0
  1022. package/dist/curator/curator.js +367 -0
  1023. package/dist/daemon/agent-task-executor.js +51 -0
  1024. package/dist/daemon/autonomous-daemon.d.ts +2 -0
  1025. package/dist/daemon/autonomous-daemon.js +4 -1
  1026. package/dist/daemon/autonomous-loop.d.ts +9 -0
  1027. package/dist/daemon/autonomous-loop.js +57 -1
  1028. package/dist/daemon/autonomy-bench-candidates.d.ts +33 -0
  1029. package/dist/daemon/autonomy-bench-candidates.js +68 -0
  1030. package/dist/daemon/autonomy-briefing.d.ts +112 -0
  1031. package/dist/daemon/autonomy-briefing.js +359 -0
  1032. package/dist/daemon/autonomy-run-journal.d.ts +20 -0
  1033. package/dist/daemon/autonomy-run-journal.js +41 -0
  1034. package/dist/daemon/cron-agent-bridge.d.ts +6 -0
  1035. package/dist/daemon/cron-agent-bridge.js +31 -4
  1036. package/dist/daemon/daily-reset.d.ts +2 -2
  1037. package/dist/daemon/daily-reset.js +16 -15
  1038. package/dist/daemon/ollama-task-executor.js +9 -1
  1039. package/dist/database/database-manager.d.ts +1 -1
  1040. package/dist/database/database-manager.js +6 -4
  1041. package/dist/database/optional-sqlite.d.ts +20 -0
  1042. package/dist/database/optional-sqlite.js +101 -0
  1043. package/dist/design/design-system-registry.d.ts +21 -0
  1044. package/dist/design/design-system-registry.js +106 -0
  1045. package/dist/desktop/codebuddy-engine-adapter.d.ts +34 -0
  1046. package/dist/desktop/codebuddy-engine-adapter.js +306 -21
  1047. package/dist/desktop/electron-launch-args.d.ts +7 -0
  1048. package/dist/desktop/electron-launch-args.js +13 -0
  1049. package/dist/desktop/engine-adapter.d.ts +6 -0
  1050. package/dist/desktop/launcher.js +2 -1
  1051. package/dist/desktop/permission-bridge.d.ts +12 -1
  1052. package/dist/desktop/permission-bridge.js +12 -5
  1053. package/dist/desktop-automation/omniparser-runner.d.ts +1 -0
  1054. package/dist/desktop-automation/omniparser-runner.js +12 -1
  1055. package/dist/desktop-automation/smart-snapshot.js +7 -0
  1056. package/dist/desktop-automation/windows-native-provider.js +1 -1
  1057. package/dist/doctor/assistant-runtime.d.ts +90 -0
  1058. package/dist/doctor/assistant-runtime.js +472 -0
  1059. package/dist/doctor/env-sanity.d.ts +17 -0
  1060. package/dist/doctor/env-sanity.js +74 -0
  1061. package/dist/doctor/index.d.ts +47 -1
  1062. package/dist/doctor/index.js +464 -49
  1063. package/dist/doctor/integrations.d.ts +179 -0
  1064. package/dist/doctor/integrations.js +227 -0
  1065. package/dist/doctor/llm-key-check.d.ts +17 -0
  1066. package/dist/doctor/llm-key-check.js +100 -0
  1067. package/dist/doctor/ollama-model-selection.d.ts +16 -0
  1068. package/dist/doctor/ollama-model-selection.js +55 -0
  1069. package/dist/doctor/triage.d.ts +108 -0
  1070. package/dist/doctor/triage.js +304 -0
  1071. package/dist/embeddings/embedding-provider.d.ts +1 -0
  1072. package/dist/embeddings/embedding-provider.js +21 -9
  1073. package/dist/errors/crash-recovery.js +6 -4
  1074. package/dist/events/index.d.ts +1 -1
  1075. package/dist/events/types.d.ts +44 -0
  1076. package/dist/export/repo-explanation.d.ts +10 -0
  1077. package/dist/export/repo-explanation.js +334 -0
  1078. package/dist/export/session-share.d.ts +34 -0
  1079. package/dist/export/session-share.js +687 -0
  1080. package/dist/fleet/autonomous-tick-broadcaster.d.ts +1 -1
  1081. package/dist/fleet/capability-registry.d.ts +9 -0
  1082. package/dist/fleet/capability-registry.js +268 -56
  1083. package/dist/fleet/colab-store.d.ts +3 -4
  1084. package/dist/fleet/colab-store.js +6 -26
  1085. package/dist/fleet/collaboration.d.ts +44 -0
  1086. package/dist/fleet/collaboration.js +170 -0
  1087. package/dist/fleet/compatible-model.d.ts +39 -0
  1088. package/dist/fleet/compatible-model.js +148 -0
  1089. package/dist/fleet/consolidation/collecte.d.ts +31 -0
  1090. package/dist/fleet/consolidation/collecte.js +86 -0
  1091. package/dist/fleet/consolidation/digest-texte.d.ts +11 -0
  1092. package/dist/fleet/consolidation/digest-texte.js +52 -0
  1093. package/dist/fleet/consolidation/thalamus.d.ts +35 -0
  1094. package/dist/fleet/consolidation/thalamus.js +151 -0
  1095. package/dist/fleet/consolidation/types.d.ts +66 -0
  1096. package/dist/fleet/consolidation/types.js +22 -0
  1097. package/dist/fleet/cost-tracker.d.ts +11 -0
  1098. package/dist/fleet/cost-tracker.js +64 -17
  1099. package/dist/fleet/fleet-cost-cap.d.ts +36 -0
  1100. package/dist/fleet/fleet-cost-cap.js +175 -0
  1101. package/dist/fleet/fleet-http-surface.d.ts +24 -0
  1102. package/dist/fleet/fleet-http-surface.js +72 -0
  1103. package/dist/fleet/fleet-listener.d.ts +2 -1
  1104. package/dist/fleet/fleet-listener.js +91 -46
  1105. package/dist/fleet/fleet-registry.d.ts +2 -0
  1106. package/dist/fleet/model-capability-heuristics.d.ts +31 -0
  1107. package/dist/fleet/model-capability-heuristics.js +49 -0
  1108. package/dist/fleet/model-inventory.d.ts +46 -0
  1109. package/dist/fleet/model-inventory.js +242 -0
  1110. package/dist/fleet/model-scoreboard.d.ts +118 -13
  1111. package/dist/fleet/model-scoreboard.js +339 -27
  1112. package/dist/fleet/model-selector.d.ts +83 -0
  1113. package/dist/fleet/model-selector.js +218 -0
  1114. package/dist/fleet/peer-chat-bridge.d.ts +9 -2
  1115. package/dist/fleet/peer-chat-bridge.js +133 -19
  1116. package/dist/fleet/peer-chat-client-factory.d.ts +28 -2
  1117. package/dist/fleet/peer-chat-client-factory.js +195 -22
  1118. package/dist/fleet/peer-ckg-bridge.d.ts +67 -0
  1119. package/dist/fleet/peer-ckg-bridge.js +467 -0
  1120. package/dist/fleet/peer-mission-exchange-bridge.d.ts +8 -0
  1121. package/dist/fleet/peer-mission-exchange-bridge.js +127 -0
  1122. package/dist/fleet/peer-session-bridge.d.ts +7 -1
  1123. package/dist/fleet/peer-session-bridge.js +98 -17
  1124. package/dist/fleet/peer-session-store.d.ts +2 -0
  1125. package/dist/fleet/peer-session-store.js +6 -5
  1126. package/dist/fleet/peer-text-sanitizer.d.ts +59 -0
  1127. package/dist/fleet/peer-text-sanitizer.js +99 -0
  1128. package/dist/fleet/peer-tool-bridge.js +38 -10
  1129. package/dist/fleet/privacy-lint.js +80 -8
  1130. package/dist/fleet/resource-catalog.d.ts +245 -0
  1131. package/dist/fleet/resource-catalog.js +211 -0
  1132. package/dist/fleet/rooms/room-access.d.ts +138 -0
  1133. package/dist/fleet/rooms/room-access.js +196 -0
  1134. package/dist/fleet/rooms/room-client.d.ts +158 -0
  1135. package/dist/fleet/rooms/room-client.js +685 -0
  1136. package/dist/fleet/rooms/room-event.d.ts +139 -0
  1137. package/dist/fleet/rooms/room-event.js +330 -0
  1138. package/dist/fleet/rooms/room-filter.d.ts +48 -0
  1139. package/dist/fleet/rooms/room-filter.js +152 -0
  1140. package/dist/fleet/rooms/room-hub.d.ts +154 -0
  1141. package/dist/fleet/rooms/room-hub.js +363 -0
  1142. package/dist/fleet/rooms/room-identity.d.ts +26 -0
  1143. package/dist/fleet/rooms/room-identity.js +82 -0
  1144. package/dist/fleet/rooms/room-lock.d.ts +34 -0
  1145. package/dist/fleet/rooms/room-lock.js +180 -0
  1146. package/dist/fleet/rooms/room-observations.d.ts +7 -0
  1147. package/dist/fleet/rooms/room-observations.js +61 -0
  1148. package/dist/fleet/rooms/room-server.d.ts +28 -0
  1149. package/dist/fleet/rooms/room-server.js +75 -0
  1150. package/dist/fleet/rooms/room-store.d.ts +119 -0
  1151. package/dist/fleet/rooms/room-store.js +448 -0
  1152. package/dist/fleet/rooms/room-ws-bridge.d.ts +27 -0
  1153. package/dist/fleet/rooms/room-ws-bridge.js +137 -0
  1154. package/dist/fleet/saga-store.d.ts +25 -1
  1155. package/dist/fleet/saga-store.js +34 -6
  1156. package/dist/fleet/sensory-mission-bridge.d.ts +42 -0
  1157. package/dist/fleet/sensory-mission-bridge.js +136 -0
  1158. package/dist/fleet/task-router.d.ts +17 -1
  1159. package/dist/fleet/task-router.js +65 -20
  1160. package/dist/fleet/types.d.ts +9 -5
  1161. package/dist/gateway/device-pairing.js +5 -11
  1162. package/dist/gateway/ws-transport.d.ts +1 -5
  1163. package/dist/gateway/ws-transport.js +2 -22
  1164. package/dist/git/changelog.d.ts +36 -0
  1165. package/dist/git/changelog.js +109 -0
  1166. package/dist/git/worktree-sessions.js +2 -1
  1167. package/dist/goals/counterfactual-forge.d.ts +70 -0
  1168. package/dist/goals/counterfactual-forge.js +184 -0
  1169. package/dist/goals/criterion-progress.d.ts +24 -0
  1170. package/dist/goals/criterion-progress.js +59 -0
  1171. package/dist/goals/evidence-artifact.d.ts +18 -0
  1172. package/dist/goals/evidence-artifact.js +76 -0
  1173. package/dist/goals/goal-decomposer.d.ts +15 -0
  1174. package/dist/goals/goal-decomposer.js +89 -4
  1175. package/dist/goals/goal-loop.d.ts +29 -0
  1176. package/dist/goals/goal-loop.js +92 -6
  1177. package/dist/goals/goal-manager.d.ts +1 -0
  1178. package/dist/goals/goal-manager.js +4 -1
  1179. package/dist/goals/goal-state.d.ts +10 -0
  1180. package/dist/goals/goal-state.js +21 -1
  1181. package/dist/goals/goal-store.js +4 -6
  1182. package/dist/goals/index.d.ts +11 -0
  1183. package/dist/goals/index.js +11 -0
  1184. package/dist/goals/intent-graph.d.ts +40 -0
  1185. package/dist/goals/intent-graph.js +133 -0
  1186. package/dist/goals/mission-constitution.d.ts +59 -0
  1187. package/dist/goals/mission-constitution.js +132 -0
  1188. package/dist/goals/mission-exchange.d.ts +86 -0
  1189. package/dist/goals/mission-exchange.js +216 -0
  1190. package/dist/goals/outcome-capsule.d.ts +80 -0
  1191. package/dist/goals/outcome-capsule.js +186 -0
  1192. package/dist/goals/proof-ledger.d.ts +79 -0
  1193. package/dist/goals/proof-ledger.js +181 -0
  1194. package/dist/goals/proven-outcome-lessons.d.ts +11 -0
  1195. package/dist/goals/proven-outcome-lessons.js +30 -0
  1196. package/dist/goals/proven-outcome-memory.d.ts +55 -0
  1197. package/dist/goals/proven-outcome-memory.js +125 -0
  1198. package/dist/goals/shadow-twin.d.ts +57 -0
  1199. package/dist/goals/shadow-twin.js +110 -0
  1200. package/dist/gpu-worker/gpu-media-worker-server.d.ts +49 -0
  1201. package/dist/gpu-worker/gpu-media-worker-server.js +637 -0
  1202. package/dist/harness/contract.d.ts +88 -88
  1203. package/dist/harness/fleet-supervisor.d.ts +16 -0
  1204. package/dist/harness/fleet-supervisor.js +64 -0
  1205. package/dist/harness/index.d.ts +4 -0
  1206. package/dist/harness/index.js +4 -0
  1207. package/dist/harness/mission-runner.d.ts +3 -0
  1208. package/dist/harness/mission-runner.js +53 -0
  1209. package/dist/harness/mission-store.d.ts +93 -0
  1210. package/dist/harness/mission-store.js +297 -0
  1211. package/dist/harness/tool-harness.d.ts +56 -0
  1212. package/dist/harness/tool-harness.js +153 -0
  1213. package/dist/hooks/advanced-hooks.js +6 -4
  1214. package/dist/hooks/env-persistence.js +5 -6
  1215. package/dist/hooks/hook-manager.js +8 -7
  1216. package/dist/hooks/hook-system.js +6 -4
  1217. package/dist/hooks/lifecycle-hooks.js +6 -3
  1218. package/dist/hooks/moltbot/moltbot-hooks-manager.js +8 -3
  1219. package/dist/hooks/moltbot/session-persistence-manager.js +15 -7
  1220. package/dist/hooks/moltbot/setup-utilities.js +6 -4
  1221. package/dist/hooks/smart-hooks.js +6 -4
  1222. package/dist/hooks/use-enhanced-input.js +48 -4
  1223. package/dist/hooks/use-input-handler.d.ts +1 -0
  1224. package/dist/hooks/use-input-handler.js +90 -84
  1225. package/dist/hooks/use-input-history.js +1 -0
  1226. package/dist/hooks/user-hooks.d.ts +10 -1
  1227. package/dist/hooks/user-hooks.js +77 -1
  1228. package/dist/identity/companion-identity.d.ts +4 -1
  1229. package/dist/identity/companion-identity.js +134 -4
  1230. package/dist/identity/identity-manager.d.ts +1 -1
  1231. package/dist/identity/identity-manager.js +7 -6
  1232. package/dist/identity/lisa-introspection.d.ts +36 -0
  1233. package/dist/identity/lisa-introspection.js +414 -0
  1234. package/dist/identity/operational-self-model.d.ts +145 -0
  1235. package/dist/identity/operational-self-model.js +978 -0
  1236. package/dist/index.d.ts +3 -1
  1237. package/dist/index.js +1039 -229
  1238. package/dist/input/context-mentions.d.ts +7 -1
  1239. package/dist/input/context-mentions.js +18 -20
  1240. package/dist/input/text-to-speech.d.ts +3 -0
  1241. package/dist/input/text-to-speech.js +70 -27
  1242. package/dist/input/voice-control.d.ts +1 -0
  1243. package/dist/input/voice-control.js +24 -18
  1244. package/dist/input/voice-input-enhanced.d.ts +1 -0
  1245. package/dist/input/voice-input-enhanced.js +31 -16
  1246. package/dist/integrations/ci-autofix-pipeline.js +15 -20
  1247. package/dist/integrations/ide/server.js +3 -2
  1248. package/dist/integrations/json-rpc/server.js +4 -2
  1249. package/dist/integrations/mcp/mcp-server.js +4 -2
  1250. package/dist/integrations/opentelemetry-integration.js +6 -4
  1251. package/dist/integrations/pubcommander-bridge.d.ts +5 -0
  1252. package/dist/integrations/pubcommander-bridge.js +61 -0
  1253. package/dist/integrations/sentry-integration.js +9 -3
  1254. package/dist/intelligence/semantic-search.js +9 -12
  1255. package/dist/intelligence/user-preferences.js +8 -11
  1256. package/dist/intents/intent-checker.d.ts +34 -0
  1257. package/dist/intents/intent-checker.js +175 -0
  1258. package/dist/intents/intent-generator.d.ts +12 -0
  1259. package/dist/intents/intent-generator.js +86 -0
  1260. package/dist/intents/intent-store.d.ts +62 -0
  1261. package/dist/intents/intent-store.js +263 -0
  1262. package/dist/interpreter/computer/skills.js +3 -2
  1263. package/dist/interpreter/interpreter-service.js +18 -9
  1264. package/dist/kanban/kanban-board-registry.js +6 -4
  1265. package/dist/kanban/kanban-store.js +5 -7
  1266. package/dist/knowledge/code-graph-persistence.js +8 -16
  1267. package/dist/knowledge/graph-drift.js +14 -11
  1268. package/dist/knowledge/knowledge-manager.js +2 -1
  1269. package/dist/knowledge/scanners/index.d.ts +3 -0
  1270. package/dist/knowledge/scanners/index.js +57 -29
  1271. package/dist/knowledge/workspace-indexer.js +22 -15
  1272. package/dist/life-rhythm/cooking-timer-store.d.ts +50 -0
  1273. package/dist/life-rhythm/cooking-timer-store.js +240 -0
  1274. package/dist/life-rhythm/day-context.d.ts +30 -0
  1275. package/dist/life-rhythm/day-context.js +198 -0
  1276. package/dist/life-rhythm/etalab-holiday-provider.d.ts +40 -0
  1277. package/dist/life-rhythm/etalab-holiday-provider.js +318 -0
  1278. package/dist/life-rhythm/home-mode-store.d.ts +32 -0
  1279. package/dist/life-rhythm/home-mode-store.js +184 -0
  1280. package/dist/life-rhythm/index.d.ts +6 -0
  1281. package/dist/life-rhythm/index.js +7 -0
  1282. package/dist/life-rhythm/types.d.ts +88 -0
  1283. package/dist/life-rhythm/types.js +33 -0
  1284. package/dist/life-rhythm/zoned-minute.d.ts +24 -0
  1285. package/dist/life-rhythm/zoned-minute.js +113 -0
  1286. package/dist/location/index.d.ts +2 -12
  1287. package/dist/location/index.js +129 -56
  1288. package/dist/logging/interaction-logger.js +29 -46
  1289. package/dist/lora/dataset-v3-plan.d.ts +27 -0
  1290. package/dist/lora/dataset-v3-plan.js +121 -0
  1291. package/dist/lora/dataset.d.ts +26 -0
  1292. package/dist/lora/dataset.js +165 -0
  1293. package/dist/lora/fal-krea-trainer.d.ts +54 -0
  1294. package/dist/lora/fal-krea-trainer.js +197 -0
  1295. package/dist/lora/generate-training-set.d.ts +61 -0
  1296. package/dist/lora/generate-training-set.js +190 -0
  1297. package/dist/lora/identity-dataset-gate.d.ts +104 -0
  1298. package/dist/lora/identity-dataset-gate.js +204 -0
  1299. package/dist/lora/identity-dataset-promotion.d.ts +32 -0
  1300. package/dist/lora/identity-dataset-promotion.js +269 -0
  1301. package/dist/lora/index.d.ts +11 -0
  1302. package/dist/lora/index.js +12 -0
  1303. package/dist/lora/install-comfy.d.ts +14 -0
  1304. package/dist/lora/install-comfy.js +63 -0
  1305. package/dist/lora/lisa-avatar-bible.d.ts +85 -0
  1306. package/dist/lora/lisa-avatar-bible.js +275 -0
  1307. package/dist/lora/local-plan.d.ts +10 -0
  1308. package/dist/lora/local-plan.js +205 -0
  1309. package/dist/lora/pack-dataset.d.ts +7 -0
  1310. package/dist/lora/pack-dataset.js +39 -0
  1311. package/dist/lora/quality-gate.d.ts +31 -0
  1312. package/dist/lora/quality-gate.js +90 -0
  1313. package/dist/lora/types.d.ts +66 -0
  1314. package/dist/lora/types.js +5 -0
  1315. package/dist/lsp/lsp-client.d.ts +12 -0
  1316. package/dist/lsp/lsp-client.js +45 -9
  1317. package/dist/lsp/server.js +1 -1
  1318. package/dist/mcp/approval-elicitation.d.ts +1 -0
  1319. package/dist/mcp/approval-elicitation.js +2 -0
  1320. package/dist/mcp/client.d.ts +15 -1
  1321. package/dist/mcp/client.js +116 -24
  1322. package/dist/mcp/config.d.ts +32 -1
  1323. package/dist/mcp/config.js +175 -19
  1324. package/dist/mcp/import-normalize.d.ts +12 -0
  1325. package/dist/mcp/import-normalize.js +114 -0
  1326. package/dist/mcp/index.d.ts +1 -1
  1327. package/dist/mcp/mcp-agent-tools.d.ts +1 -1
  1328. package/dist/mcp/mcp-agent-tools.js +76 -73
  1329. package/dist/mcp/mcp-ckg-tools.d.ts +31 -0
  1330. package/dist/mcp/mcp-ckg-tools.js +121 -0
  1331. package/dist/mcp/mcp-client.js +8 -5
  1332. package/dist/mcp/mcp-desktop-tools.d.ts +1 -1
  1333. package/dist/mcp/mcp-desktop-tools.js +105 -99
  1334. package/dist/mcp/mcp-memory-tools.d.ts +1 -1
  1335. package/dist/mcp/mcp-memory-tools.js +63 -61
  1336. package/dist/mcp/mcp-oauth.js +5 -2
  1337. package/dist/mcp/mcp-server.d.ts +48 -79
  1338. package/dist/mcp/mcp-server.js +445 -478
  1339. package/dist/mcp/mcp-session-tools.d.ts +1 -1
  1340. package/dist/mcp/mcp-session-tools.js +95 -92
  1341. package/dist/mcp/profiles.d.ts +18 -0
  1342. package/dist/mcp/profiles.js +65 -0
  1343. package/dist/mcp/prompt-footprint.d.ts +21 -0
  1344. package/dist/mcp/prompt-footprint.js +39 -0
  1345. package/dist/mcp/transports.d.ts +10 -5
  1346. package/dist/mcp/transports.js +61 -99
  1347. package/dist/mcp/types.d.ts +5 -0
  1348. package/dist/meals/allergens.d.ts +19 -0
  1349. package/dist/meals/allergens.js +122 -0
  1350. package/dist/meals/compatibility.d.ts +6 -0
  1351. package/dist/meals/compatibility.js +109 -0
  1352. package/dist/meals/food-inventory-store.d.ts +51 -0
  1353. package/dist/meals/food-inventory-store.js +257 -0
  1354. package/dist/meals/index.d.ts +10 -0
  1355. package/dist/meals/index.js +11 -0
  1356. package/dist/meals/meal-engine.d.ts +7 -0
  1357. package/dist/meals/meal-engine.js +206 -0
  1358. package/dist/meals/meal-plan-store.d.ts +73 -0
  1359. package/dist/meals/meal-plan-store.js +271 -0
  1360. package/dist/meals/private-json-store.d.ts +9 -0
  1361. package/dist/meals/private-json-store.js +92 -0
  1362. package/dist/meals/profile-store.d.ts +49 -0
  1363. package/dist/meals/profile-store.js +296 -0
  1364. package/dist/meals/profile-validator.d.ts +7 -0
  1365. package/dist/meals/profile-validator.js +124 -0
  1366. package/dist/meals/recipe-normalizer.d.ts +7 -0
  1367. package/dist/meals/recipe-normalizer.js +162 -0
  1368. package/dist/meals/store-validation.d.ts +21 -0
  1369. package/dist/meals/store-validation.js +101 -0
  1370. package/dist/meals/types.d.ts +170 -0
  1371. package/dist/meals/types.js +12 -0
  1372. package/dist/media/comfy-health-supervisor.d.ts +142 -0
  1373. package/dist/media/comfy-health-supervisor.js +608 -0
  1374. package/dist/media/comfyui-recipe-contract.d.ts +696 -0
  1375. package/dist/media/comfyui-recipe-contract.js +580 -0
  1376. package/dist/media/comfyui-recipe-engine.d.ts +3 -0
  1377. package/dist/media/comfyui-recipe-engine.js +4 -0
  1378. package/dist/media/comfyui-recipe-registry.d.ts +35 -0
  1379. package/dist/media/comfyui-recipe-registry.js +385 -0
  1380. package/dist/media/comfyui-recipe-runtime.d.ts +135 -0
  1381. package/dist/media/comfyui-recipe-runtime.js +942 -0
  1382. package/dist/media/content-tier.d.ts +25 -0
  1383. package/dist/media/content-tier.js +29 -0
  1384. package/dist/meeting/analyzer.d.ts +24 -0
  1385. package/dist/meeting/analyzer.js +402 -0
  1386. package/dist/meeting/index.d.ts +13 -0
  1387. package/dist/meeting/index.js +48 -0
  1388. package/dist/meeting/markdown.d.ts +3 -0
  1389. package/dist/meeting/markdown.js +51 -0
  1390. package/dist/meeting/output.d.ts +13 -0
  1391. package/dist/meeting/output.js +155 -0
  1392. package/dist/meeting/transcript.d.ts +25 -0
  1393. package/dist/meeting/transcript.js +292 -0
  1394. package/dist/meeting/types.d.ts +112 -0
  1395. package/dist/meeting/types.js +9 -0
  1396. package/dist/memory/adapters/network-memory-adapters.d.ts +19 -4
  1397. package/dist/memory/adapters/network-memory-adapters.js +4 -4
  1398. package/dist/memory/auto-memory.js +5 -2
  1399. package/dist/memory/background-extractor.d.ts +43 -0
  1400. package/dist/memory/background-extractor.js +368 -0
  1401. package/dist/memory/buddy-memory-client.d.ts +40 -0
  1402. package/dist/memory/buddy-memory-client.js +198 -0
  1403. package/dist/memory/ckg-engine-policy.d.ts +19 -0
  1404. package/dist/memory/ckg-engine-policy.js +45 -0
  1405. package/dist/memory/ckg-fact-reconciliation.d.ts +81 -0
  1406. package/dist/memory/ckg-fact-reconciliation.js +155 -0
  1407. package/dist/memory/ckg-redaction.d.ts +2 -0
  1408. package/dist/memory/ckg-redaction.js +25 -0
  1409. package/dist/memory/coding-style-analyzer.js +2 -2
  1410. package/dist/memory/collective-knowledge-graph.d.ts +380 -0
  1411. package/dist/memory/collective-knowledge-graph.js +1228 -0
  1412. package/dist/memory/enhanced-memory.d.ts +29 -0
  1413. package/dist/memory/enhanced-memory.js +153 -63
  1414. package/dist/memory/facts-memory.d.ts +20 -5
  1415. package/dist/memory/facts-memory.js +68 -12
  1416. package/dist/memory/hybrid-mmr.d.ts +71 -0
  1417. package/dist/memory/hybrid-mmr.js +127 -0
  1418. package/dist/memory/hybrid-search.js +4 -1
  1419. package/dist/memory/knowledge-graph.d.ts +23 -2
  1420. package/dist/memory/knowledge-graph.js +62 -47
  1421. package/dist/memory/memory-candidate-queue.d.ts +2 -2
  1422. package/dist/memory/memory-candidate-queue.js +15 -10
  1423. package/dist/memory/memory-consolidation.d.ts +8 -0
  1424. package/dist/memory/memory-consolidation.js +66 -17
  1425. package/dist/memory/memory-forgetting.d.ts +57 -0
  1426. package/dist/memory/memory-forgetting.js +87 -0
  1427. package/dist/memory/ocr-memory-pipeline.js +16 -10
  1428. package/dist/memory/persistent-memory.d.ts +111 -8
  1429. package/dist/memory/persistent-memory.js +788 -149
  1430. package/dist/memory/presence-injector.d.ts +1 -1
  1431. package/dist/memory/presence-injector.js +9 -4
  1432. package/dist/memory/semantic-memory-search.js +12 -9
  1433. package/dist/memory/subagent-memory.js +8 -8
  1434. package/dist/memory/user-model.js +9 -4
  1435. package/dist/metrics/metrics-collector.d.ts +1 -0
  1436. package/dist/metrics/metrics-collector.js +11 -2
  1437. package/dist/nodes/device-node.d.ts +5 -2
  1438. package/dist/nodes/device-node.js +61 -19
  1439. package/dist/nodes/index.d.ts +32 -2
  1440. package/dist/nodes/index.js +208 -7
  1441. package/dist/nodes/transports/adb-transport.d.ts +2 -6
  1442. package/dist/nodes/transports/adb-transport.js +29 -13
  1443. package/dist/nodes/transports/base-transport.d.ts +10 -0
  1444. package/dist/observability/mobile-supervision-gateway-contract.js +20 -7
  1445. package/dist/observability/run-event-writer.d.ts +21 -0
  1446. package/dist/observability/run-event-writer.js +81 -0
  1447. package/dist/observability/run-store.d.ts +11 -1
  1448. package/dist/observability/run-store.js +107 -35
  1449. package/dist/observability/run-trajectory-load.d.ts +16 -0
  1450. package/dist/observability/run-trajectory-load.js +266 -0
  1451. package/dist/observability/run-trajectory.d.ts +168 -0
  1452. package/dist/observability/run-trajectory.js +468 -0
  1453. package/dist/observability/run-viewer.d.ts +5 -1
  1454. package/dist/observability/run-viewer.js +83 -9
  1455. package/dist/observability/turn-metrics.d.ts +86 -0
  1456. package/dist/observability/turn-metrics.js +201 -0
  1457. package/dist/offline/offline-mode.js +10 -9
  1458. package/dist/openclaw/gateway-bridge.js +3 -2
  1459. package/dist/optimization/latency-optimizer.d.ts +2 -1
  1460. package/dist/optimization/latency-optimizer.js +2 -2
  1461. package/dist/optimization/model-routing.d.ts +3 -0
  1462. package/dist/optimization/prompt-cache.d.ts +19 -2
  1463. package/dist/optimization/prompt-cache.js +41 -6
  1464. package/dist/orchestration/orchestrator.d.ts +21 -0
  1465. package/dist/orchestration/orchestrator.js +126 -16
  1466. package/dist/orchestration/types.d.ts +2 -0
  1467. package/dist/performance/lazy-loader.js +2 -1
  1468. package/dist/performance/tool-cache.d.ts +4 -0
  1469. package/dist/performance/tool-cache.js +4 -2
  1470. package/dist/persistence/conversation-branches.js +9 -2
  1471. package/dist/persistence/session-content.d.ts +8 -0
  1472. package/dist/persistence/session-content.js +76 -0
  1473. package/dist/persistence/session-handoff.d.ts +64 -0
  1474. package/dist/persistence/session-handoff.js +80 -0
  1475. package/dist/persistence/session-history.d.ts +4 -0
  1476. package/dist/persistence/session-history.js +38 -0
  1477. package/dist/persistence/session-store.d.ts +35 -0
  1478. package/dist/persistence/session-store.js +104 -37
  1479. package/dist/personas/persona-manager.d.ts +39 -1
  1480. package/dist/personas/persona-manager.js +292 -38
  1481. package/dist/plugins/bundled/groq-provider.js +10 -7
  1482. package/dist/plugins/bundled/openrouter-provider.js +2 -1
  1483. package/dist/plugins/code-explorer/CodeExplorerManager.d.ts +62 -8
  1484. package/dist/plugins/code-explorer/CodeExplorerManager.js +255 -32
  1485. package/dist/plugins/code-explorer/code-explorer-client.d.ts +36 -0
  1486. package/dist/plugins/code-explorer/code-explorer-client.js +86 -0
  1487. package/dist/plugins/code-explorer/index.d.ts +1 -3
  1488. package/dist/plugins/code-explorer/index.js +0 -1
  1489. package/dist/plugins/git-pinned-marketplace.js +3 -2
  1490. package/dist/plugins/plugin-manager.js +16 -10
  1491. package/dist/plugins/sandbox-worker.js +1 -1
  1492. package/dist/prompts/prompt-manager.js +11 -4
  1493. package/dist/prompts/system-base.js +33 -5
  1494. package/dist/protocols/a2a/codebuddy-executor.d.ts +20 -2
  1495. package/dist/protocols/a2a/codebuddy-executor.js +34 -14
  1496. package/dist/protocols/a2a/index.d.ts +7 -1
  1497. package/dist/protocols/a2a/index.js +32 -3
  1498. package/dist/protocols/a2a/jsonrpc-v1.d.ts +41 -0
  1499. package/dist/protocols/a2a/jsonrpc-v1.js +145 -0
  1500. package/dist/protocols/a2a/peer-config.d.ts +20 -0
  1501. package/dist/protocols/a2a/peer-config.js +55 -0
  1502. package/dist/protocols/acp/acp-agentic-runner.d.ts +6 -2
  1503. package/dist/protocols/acp/acp-agentic-runner.js +91 -15
  1504. package/dist/protocols/acp/acp-session-store.js +28 -5
  1505. package/dist/protocols/acp/acp-stdio-server.d.ts +13 -0
  1506. package/dist/protocols/acp/acp-stdio-server.js +30 -3
  1507. package/dist/providers/active-llm-model-pool.d.ts +45 -0
  1508. package/dist/providers/active-llm-model-pool.js +139 -0
  1509. package/dist/providers/active-llm-registry.js +48 -8
  1510. package/dist/providers/auxiliary-provider.d.ts +1 -1
  1511. package/dist/providers/auxiliary-provider.js +23 -10
  1512. package/dist/providers/chatgpt-models.d.ts +71 -0
  1513. package/dist/providers/chatgpt-models.js +302 -0
  1514. package/dist/providers/codex-oauth.d.ts +8 -0
  1515. package/dist/providers/codex-oauth.js +75 -43
  1516. package/dist/providers/gemini-oauth.js +7 -6
  1517. package/dist/providers/grok-provider.js +1 -1
  1518. package/dist/providers/index.d.ts +3 -0
  1519. package/dist/providers/index.js +3 -0
  1520. package/dist/providers/local-model-resolver.d.ts +66 -0
  1521. package/dist/providers/local-model-resolver.js +128 -0
  1522. package/dist/providers/model-egress.d.ts +8 -0
  1523. package/dist/providers/model-egress.js +62 -0
  1524. package/dist/providers/model-provider-compat.d.ts +13 -0
  1525. package/dist/providers/model-provider-compat.js +49 -0
  1526. package/dist/providers/provider-catalog.d.ts +4 -1
  1527. package/dist/providers/provider-catalog.js +494 -28
  1528. package/dist/providers/provider-failover-notify.d.ts +15 -0
  1529. package/dist/providers/provider-failover-notify.js +93 -0
  1530. package/dist/providers/provider-failover-policy.d.ts +28 -0
  1531. package/dist/providers/provider-failover-policy.js +188 -0
  1532. package/dist/providers/provider-failover-user-notice.d.ts +13 -0
  1533. package/dist/providers/provider-failover-user-notice.js +49 -0
  1534. package/dist/providers/provider-fallback.d.ts +1 -0
  1535. package/dist/providers/provider-fallback.js +1 -1
  1536. package/dist/providers/provider-health.d.ts +46 -0
  1537. package/dist/providers/provider-health.js +249 -0
  1538. package/dist/providers/turboquant-provider.d.ts +1 -1
  1539. package/dist/providers/xai-oauth.js +7 -34
  1540. package/dist/queue/persistent-queue.js +9 -6
  1541. package/dist/renderers/charts/special-charts.d.ts +7 -1
  1542. package/dist/renderers/charts/special-charts.js +5 -0
  1543. package/dist/renderers/weather-conditions.d.ts +20 -0
  1544. package/dist/renderers/weather-conditions.js +74 -0
  1545. package/dist/renderers/weather-renderer.js +4 -18
  1546. package/dist/rendering/ansi.d.ts +4 -0
  1547. package/dist/rendering/ansi.js +149 -0
  1548. package/dist/rendering/index.d.ts +19 -0
  1549. package/dist/rendering/index.js +18 -0
  1550. package/dist/rendering/plain.d.ts +2 -0
  1551. package/dist/rendering/plain.js +91 -0
  1552. package/dist/rendering/telegram-html.d.ts +7 -0
  1553. package/dist/rendering/telegram-html.js +76 -16
  1554. package/dist/research/auto-ingest.d.ts +45 -0
  1555. package/dist/research/auto-ingest.js +85 -0
  1556. package/dist/research/code-explorer-source.d.ts +29 -0
  1557. package/dist/research/code-explorer-source.js +76 -0
  1558. package/dist/research/connector-source.d.ts +25 -0
  1559. package/dist/research/connector-source.js +314 -0
  1560. package/dist/research/paper-qa/answer.d.ts +72 -0
  1561. package/dist/research/paper-qa/answer.js +227 -0
  1562. package/dist/research/paper-qa/corpus.d.ts +36 -0
  1563. package/dist/research/paper-qa/corpus.js +102 -0
  1564. package/dist/research/paper-qa/disk-embedding-cache.d.ts +28 -0
  1565. package/dist/research/paper-qa/disk-embedding-cache.js +193 -0
  1566. package/dist/research/paper-qa/index.d.ts +31 -0
  1567. package/dist/research/paper-qa/index.js +24 -0
  1568. package/dist/research/paper-qa/paper-qa-pipeline.d.ts +107 -0
  1569. package/dist/research/paper-qa/paper-qa-pipeline.js +163 -0
  1570. package/dist/research/paper-qa/passage-index.d.ts +203 -0
  1571. package/dist/research/paper-qa/passage-index.js +405 -0
  1572. package/dist/research/paper-qa/pdf-structure.d.ts +37 -0
  1573. package/dist/research/paper-qa/pdf-structure.js +377 -0
  1574. package/dist/research/paper-qa/persistent-corpus-index.d.ts +23 -0
  1575. package/dist/research/paper-qa/persistent-corpus-index.js +122 -0
  1576. package/dist/research/paper-qa/prose-chunker.d.ts +19 -0
  1577. package/dist/research/paper-qa/prose-chunker.js +201 -0
  1578. package/dist/research/paper-qa/provenance.d.ts +24 -0
  1579. package/dist/research/paper-qa/provenance.js +40 -0
  1580. package/dist/research/paper-qa/rcs.d.ts +78 -0
  1581. package/dist/research/paper-qa/rcs.js +200 -0
  1582. package/dist/research/paper-qa/types.d.ts +124 -0
  1583. package/dist/research/paper-qa/types.js +13 -0
  1584. package/dist/research/publication-sources.d.ts +34 -0
  1585. package/dist/research/publication-sources.js +131 -0
  1586. package/dist/research/relation-classifier.d.ts +13 -0
  1587. package/dist/research/relation-classifier.js +58 -0
  1588. package/dist/research/research-topics.d.ts +13 -0
  1589. package/dist/research/research-topics.js +81 -0
  1590. package/dist/review/apply-transaction.d.ts +40 -0
  1591. package/dist/review/apply-transaction.js +112 -0
  1592. package/dist/review/diff-model.d.ts +39 -0
  1593. package/dist/review/diff-model.js +124 -0
  1594. package/dist/review/llm-client.d.ts +30 -0
  1595. package/dist/review/llm-client.js +98 -0
  1596. package/dist/review/llm-reviewer.d.ts +16 -0
  1597. package/dist/review/llm-reviewer.js +122 -0
  1598. package/dist/review/review-engine.d.ts +54 -0
  1599. package/dist/review/review-engine.js +0 -0
  1600. package/dist/review/revision-loop.d.ts +67 -0
  1601. package/dist/review/revision-loop.js +160 -0
  1602. package/dist/review/static-gate.d.ts +13 -0
  1603. package/dist/review/static-gate.js +110 -0
  1604. package/dist/review/types.d.ts +122 -0
  1605. package/dist/review/types.js +24 -0
  1606. package/dist/review/write-gate.d.ts +55 -0
  1607. package/dist/review/write-gate.js +121 -0
  1608. package/dist/sandbox/auto-sandbox.d.ts +4 -2
  1609. package/dist/sandbox/auto-sandbox.js +14 -1
  1610. package/dist/sandbox/docker-sandbox.d.ts +39 -0
  1611. package/dist/sandbox/docker-sandbox.js +292 -14
  1612. package/dist/sandbox/execpolicy.d.ts +36 -1
  1613. package/dist/sandbox/execpolicy.js +375 -40
  1614. package/dist/sandbox/os-sandbox.d.ts +54 -1
  1615. package/dist/sandbox/os-sandbox.js +315 -70
  1616. package/dist/sandbox/sandbox-backend.d.ts +2 -0
  1617. package/dist/scheduler/cron-scheduler.d.ts +16 -2
  1618. package/dist/scheduler/cron-scheduler.js +177 -45
  1619. package/dist/scheduler/job-notepad.d.ts +69 -0
  1620. package/dist/scheduler/job-notepad.js +339 -0
  1621. package/dist/scripting/codebuddy-bindings.js +2 -1
  1622. package/dist/search/bm25.js +5 -2
  1623. package/dist/search/usearch-index.js +7 -5
  1624. package/dist/security/audit-logger.d.ts +1 -1
  1625. package/dist/security/audit-logger.js +14 -7
  1626. package/dist/security/bash-allowlist/allowlist-store.d.ts +8 -2
  1627. package/dist/security/bash-allowlist/allowlist-store.js +52 -12
  1628. package/dist/security/bash-allowlist/approval-flow.d.ts +1 -1
  1629. package/dist/security/bash-allowlist/approval-flow.js +10 -8
  1630. package/dist/security/bash-allowlist/deny-guard.d.ts +14 -0
  1631. package/dist/security/bash-allowlist/deny-guard.js +61 -0
  1632. package/dist/security/bash-allowlist/types.d.ts +5 -0
  1633. package/dist/security/bash-parser.d.ts +32 -0
  1634. package/dist/security/bash-parser.js +129 -14
  1635. package/dist/security/compute-confinement.d.ts +4 -0
  1636. package/dist/security/compute-confinement.js +89 -0
  1637. package/dist/security/dangerous-patterns.js +18 -3
  1638. package/dist/security/declarative-rules.d.ts +1 -1
  1639. package/dist/security/declarative-rules.js +242 -65
  1640. package/dist/security/dependency-vuln-scanner.js +4 -4
  1641. package/dist/security/dev-origins.d.ts +40 -0
  1642. package/dist/security/dev-origins.js +111 -0
  1643. package/dist/security/docker-sandbox/manager.js +1 -1
  1644. package/dist/security/env-blocklist.d.ts +7 -0
  1645. package/dist/security/env-blocklist.js +22 -2
  1646. package/dist/security/guardian-agent.d.ts +0 -5
  1647. package/dist/security/guardian-agent.js +17 -6
  1648. package/dist/security/index.d.ts +3 -0
  1649. package/dist/security/index.js +2 -0
  1650. package/dist/security/native-sandbox.d.ts +80 -0
  1651. package/dist/security/native-sandbox.js +455 -0
  1652. package/dist/security/pack-contents-policy.d.ts +49 -0
  1653. package/dist/security/pack-contents-policy.js +139 -0
  1654. package/dist/security/permission-config.js +2 -5
  1655. package/dist/security/permission-modes.d.ts +11 -0
  1656. package/dist/security/permission-modes.js +71 -7
  1657. package/dist/security/policy-amendments.js +40 -22
  1658. package/dist/security/policy-engine.js +39 -12
  1659. package/dist/security/powershell-parser.d.ts +40 -0
  1660. package/dist/security/powershell-parser.js +198 -0
  1661. package/dist/security/remote-approval.d.ts +0 -1
  1662. package/dist/security/remote-approval.js +3 -2
  1663. package/dist/security/safe-binaries.d.ts +13 -1
  1664. package/dist/security/safe-binaries.js +240 -32
  1665. package/dist/security/safe-fetch.d.ts +7 -0
  1666. package/dist/security/safe-fetch.js +101 -0
  1667. package/dist/security/sandbox.js +2 -2
  1668. package/dist/security/secret-patterns.d.ts +18 -0
  1669. package/dist/security/secret-patterns.js +232 -0
  1670. package/dist/security/secret-scrubber.d.ts +31 -0
  1671. package/dist/security/secret-scrubber.js +170 -0
  1672. package/dist/security/secrets-detector.d.ts +3 -1
  1673. package/dist/security/secrets-detector.js +3 -106
  1674. package/dist/security/security-modes.js +2 -1
  1675. package/dist/security/session-encryption.d.ts +11 -2
  1676. package/dist/security/session-encryption.js +59 -7
  1677. package/dist/security/shell-env-policy.js +11 -2
  1678. package/dist/security/skill-scanner.d.ts +2 -2
  1679. package/dist/security/skill-scanner.js +237 -11
  1680. package/dist/security/ssrf-guard.d.ts +13 -0
  1681. package/dist/security/ssrf-guard.js +27 -0
  1682. package/dist/security/text-deobfuscation.d.ts +41 -0
  1683. package/dist/security/text-deobfuscation.js +256 -0
  1684. package/dist/security/tool-permissions.js +2 -3
  1685. package/dist/security/tool-policy/approval-scope.d.ts +11 -0
  1686. package/dist/security/tool-policy/approval-scope.js +67 -0
  1687. package/dist/security/tool-policy/policy-manager.d.ts +9 -0
  1688. package/dist/security/tool-policy/policy-manager.js +28 -1
  1689. package/dist/security/tool-policy/profiles.js +24 -0
  1690. package/dist/security/tool-policy/tool-groups.js +26 -3
  1691. package/dist/security/tool-policy/types.d.ts +3 -1
  1692. package/dist/security/tool-policy/types.js +2 -0
  1693. package/dist/security/trust-folders.js +3 -2
  1694. package/dist/security/write-policy.d.ts +8 -0
  1695. package/dist/security/write-policy.js +63 -1
  1696. package/dist/self-model/evolution-notes.d.ts +51 -0
  1697. package/dist/self-model/evolution-notes.js +324 -0
  1698. package/dist/sensory/agent-reply.d.ts +136 -0
  1699. package/dist/sensory/agent-reply.js +682 -0
  1700. package/dist/sensory/alert.d.ts +18 -0
  1701. package/dist/sensory/alert.js +105 -0
  1702. package/dist/sensory/arrival-opener.d.ts +102 -0
  1703. package/dist/sensory/arrival-opener.js +292 -0
  1704. package/dist/sensory/audio-scene.d.ts +24 -0
  1705. package/dist/sensory/audio-scene.js +74 -0
  1706. package/dist/sensory/camera-keyframe-policy.d.ts +11 -0
  1707. package/dist/sensory/camera-keyframe-policy.js +43 -0
  1708. package/dist/sensory/conversation-cues.d.ts +55 -0
  1709. package/dist/sensory/conversation-cues.js +140 -0
  1710. package/dist/sensory/domain-event-bridge.d.ts +7 -0
  1711. package/dist/sensory/domain-event-bridge.js +134 -0
  1712. package/dist/sensory/dreaming.d.ts +17 -0
  1713. package/dist/sensory/dreaming.js +52 -2
  1714. package/dist/sensory/elevenlabs-library.d.ts +91 -0
  1715. package/dist/sensory/elevenlabs-library.js +303 -0
  1716. package/dist/sensory/episodic-journal.d.ts +69 -0
  1717. package/dist/sensory/episodic-journal.js +240 -0
  1718. package/dist/sensory/error-watch-reaction.d.ts +41 -0
  1719. package/dist/sensory/error-watch-reaction.js +312 -0
  1720. package/dist/sensory/heartbeat-fallback.d.ts +46 -0
  1721. package/dist/sensory/heartbeat-fallback.js +171 -0
  1722. package/dist/sensory/heartbeat-scheduler.d.ts +6 -0
  1723. package/dist/sensory/heartbeat-scheduler.js +27 -7
  1724. package/dist/sensory/hybrid-reply.d.ts +132 -0
  1725. package/dist/sensory/hybrid-reply.js +1217 -0
  1726. package/dist/sensory/reactions.d.ts +6 -0
  1727. package/dist/sensory/reactions.js +10 -1
  1728. package/dist/sensory/respond-decider.d.ts +124 -0
  1729. package/dist/sensory/respond-decider.js +608 -0
  1730. package/dist/sensory/rule-templates.d.ts +30 -0
  1731. package/dist/sensory/rule-templates.js +100 -0
  1732. package/dist/sensory/schedule-emitter.d.ts +24 -0
  1733. package/dist/sensory/schedule-emitter.js +57 -0
  1734. package/dist/sensory/screen-reaction.js +15 -1
  1735. package/dist/sensory/semantic-vision-reaction.d.ts +36 -0
  1736. package/dist/sensory/semantic-vision-reaction.js +342 -0
  1737. package/dist/sensory/sensory-action-executor.d.ts +98 -0
  1738. package/dist/sensory/sensory-action-executor.js +473 -0
  1739. package/dist/sensory/sensory-bridge.d.ts +11 -1
  1740. package/dist/sensory/sensory-bridge.js +59 -7
  1741. package/dist/sensory/sensory-rules-engine.d.ts +81 -0
  1742. package/dist/sensory/sensory-rules-engine.js +434 -0
  1743. package/dist/sensory/sensory-status.d.ts +102 -0
  1744. package/dist/sensory/sensory-status.js +291 -0
  1745. package/dist/sensory/speech-engine-config.d.ts +68 -0
  1746. package/dist/sensory/speech-engine-config.js +157 -0
  1747. package/dist/sensory/speech-reaction.d.ts +183 -7
  1748. package/dist/sensory/speech-reaction.js +2141 -35
  1749. package/dist/sensory/speech-sanitizer.d.ts +12 -0
  1750. package/dist/sensory/speech-sanitizer.js +143 -0
  1751. package/dist/sensory/system-vitals-emitter.d.ts +130 -0
  1752. package/dist/sensory/system-vitals-emitter.js +514 -0
  1753. package/dist/sensory/tts-cache.d.ts +76 -0
  1754. package/dist/sensory/tts-cache.js +0 -0
  1755. package/dist/sensory/turn-detector.d.ts +28 -0
  1756. package/dist/sensory/turn-detector.js +57 -0
  1757. package/dist/sensory/vision-description-safety.d.ts +4 -0
  1758. package/dist/sensory/vision-description-safety.js +25 -0
  1759. package/dist/sensory/vision-reaction.d.ts +21 -7
  1760. package/dist/sensory/vision-reaction.js +209 -18
  1761. package/dist/sensory/voice-activity.d.ts +69 -0
  1762. package/dist/sensory/voice-activity.js +271 -0
  1763. package/dist/sensory/voice-clock.d.ts +19 -0
  1764. package/dist/sensory/voice-clock.js +111 -0
  1765. package/dist/sensory/voice-entrainment.d.ts +62 -0
  1766. package/dist/sensory/voice-entrainment.js +176 -0
  1767. package/dist/sensory/voice-interactions.d.ts +13 -0
  1768. package/dist/sensory/voice-interactions.js +258 -0
  1769. package/dist/sensory/voice-loop.d.ts +635 -0
  1770. package/dist/sensory/voice-loop.js +3638 -0
  1771. package/dist/sensory/voice-replay-lab.d.ts +32 -0
  1772. package/dist/sensory/voice-replay-lab.js +109 -0
  1773. package/dist/sensory/voice-stream.d.ts +121 -0
  1774. package/dist/sensory/voice-stream.js +598 -0
  1775. package/dist/sensory/voice-turn-coordinator.d.ts +88 -0
  1776. package/dist/sensory/voice-turn-coordinator.js +258 -0
  1777. package/dist/sensory/voice-turn-taking.d.ts +26 -0
  1778. package/dist/sensory/voice-turn-taking.js +59 -0
  1779. package/dist/server/agent-adapter.d.ts +49 -3
  1780. package/dist/server/agent-adapter.js +26 -4
  1781. package/dist/server/auth/device-session-context.d.ts +9 -0
  1782. package/dist/server/auth/device-session-context.js +13 -0
  1783. package/dist/server/auth/device-store.d.ts +89 -0
  1784. package/dist/server/auth/device-store.js +261 -0
  1785. package/dist/server/auth/device-token.d.ts +3 -0
  1786. package/dist/server/auth/device-token.js +6 -0
  1787. package/dist/server/auth/jwt.js +4 -0
  1788. package/dist/server/channel-a2a-bridge.js +1 -1
  1789. package/dist/server/exposure-diagnostic.d.ts +25 -0
  1790. package/dist/server/exposure-diagnostic.js +51 -0
  1791. package/dist/server/heartbeat-monitor.d.ts +13 -0
  1792. package/dist/server/heartbeat-monitor.js +8 -3
  1793. package/dist/server/http-agent-sessions.d.ts +32 -0
  1794. package/dist/server/http-agent-sessions.js +245 -0
  1795. package/dist/server/index.d.ts +3 -10
  1796. package/dist/server/index.js +941 -46
  1797. package/dist/server/mcp/approval-elicitation.d.ts +144 -0
  1798. package/dist/server/mcp/approval-elicitation.js +377 -0
  1799. package/dist/server/middleware/auth.d.ts +11 -0
  1800. package/dist/server/middleware/auth.js +57 -2
  1801. package/dist/server/middleware/error-handler.d.ts +5 -0
  1802. package/dist/server/middleware/error-handler.js +30 -4
  1803. package/dist/server/middleware/index.d.ts +1 -1
  1804. package/dist/server/middleware/index.js +1 -1
  1805. package/dist/server/mobile/album.d.ts +46 -0
  1806. package/dist/server/mobile/album.js +144 -0
  1807. package/dist/server/mobile/assets/app.js +3036 -0
  1808. package/dist/server/mobile/assets/emoji-data.js +508 -0
  1809. package/dist/server/mobile/assets/icon-192.png +0 -0
  1810. package/dist/server/mobile/assets/icon-512.png +0 -0
  1811. package/dist/server/mobile/assets/icon-96.png +0 -0
  1812. package/dist/server/mobile/assets/icon.svg +12 -0
  1813. package/dist/server/mobile/assets/index.html +261 -0
  1814. package/dist/server/mobile/assets/manifest.webmanifest +37 -0
  1815. package/dist/server/mobile/assets/styles.css +831 -0
  1816. package/dist/server/mobile/assets/sw.js +149 -0
  1817. package/dist/server/mobile/chat-extras.d.ts +9 -0
  1818. package/dist/server/mobile/chat-extras.js +24 -0
  1819. package/dist/server/mobile/index.d.ts +22 -0
  1820. package/dist/server/mobile/index.js +287 -0
  1821. package/dist/server/mobile/link-preview.d.ts +24 -0
  1822. package/dist/server/mobile/link-preview.js +139 -0
  1823. package/dist/server/mobile/push.d.ts +38 -0
  1824. package/dist/server/mobile/push.js +190 -0
  1825. package/dist/server/mobile/status.d.ts +23 -0
  1826. package/dist/server/mobile/status.js +107 -0
  1827. package/dist/server/mobile/telegram-forward.d.ts +14 -0
  1828. package/dist/server/mobile/telegram-forward.js +32 -0
  1829. package/dist/server/mobile/voice-note.d.ts +54 -0
  1830. package/dist/server/mobile/voice-note.js +305 -0
  1831. package/dist/server/origin-check.d.ts +4 -5
  1832. package/dist/server/origin-check.js +43 -8
  1833. package/dist/server/routes/a2a-jsonrpc.d.ts +9 -0
  1834. package/dist/server/routes/a2a-jsonrpc.js +66 -0
  1835. package/dist/server/routes/a2a-protocol.d.ts +12 -0
  1836. package/dist/server/routes/a2a-protocol.js +1 -1
  1837. package/dist/server/routes/canvas.d.ts +7 -1
  1838. package/dist/server/routes/canvas.js +138 -24
  1839. package/dist/server/routes/chat.js +340 -203
  1840. package/dist/server/routes/cognition.d.ts +3 -0
  1841. package/dist/server/routes/cognition.js +75 -0
  1842. package/dist/server/routes/device-auth.d.ts +4 -0
  1843. package/dist/server/routes/device-auth.js +40 -0
  1844. package/dist/server/routes/health.js +93 -81
  1845. package/dist/server/routes/index.d.ts +5 -1
  1846. package/dist/server/routes/index.js +5 -1
  1847. package/dist/server/routes/lessons.d.ts +13 -0
  1848. package/dist/server/routes/lessons.js +111 -0
  1849. package/dist/server/routes/memory.d.ts +12 -0
  1850. package/dist/server/routes/memory.js +191 -131
  1851. package/dist/server/routes/runs.d.ts +9 -0
  1852. package/dist/server/routes/runs.js +50 -0
  1853. package/dist/server/routes/sessions.js +8 -1
  1854. package/dist/server/routes/tools.js +93 -74
  1855. package/dist/server/routes/webhooks.js +56 -46
  1856. package/dist/server/tunnel-manager.js +21 -1
  1857. package/dist/server/types.d.ts +29 -1
  1858. package/dist/server/webhook-agent-queue.d.ts +12 -0
  1859. package/dist/server/webhook-agent-queue.js +58 -0
  1860. package/dist/server/websocket/cognition-bridge.d.ts +13 -0
  1861. package/dist/server/websocket/cognition-bridge.js +334 -0
  1862. package/dist/server/websocket/confirmation-bridge.d.ts +22 -0
  1863. package/dist/server/websocket/confirmation-bridge.js +178 -0
  1864. package/dist/server/websocket/desktop-handler.d.ts +17 -0
  1865. package/dist/server/websocket/desktop-handler.js +177 -16
  1866. package/dist/server/websocket/handler.d.ts +136 -1
  1867. package/dist/server/websocket/handler.js +942 -72
  1868. package/dist/server/websocket/index.d.ts +2 -1
  1869. package/dist/server/websocket/index.js +2 -1
  1870. package/dist/server/websocket/peer-rpc.d.ts +1 -1
  1871. package/dist/server/websocket/peer-rpc.js +25 -3
  1872. package/dist/services/prompt-builder.d.ts +49 -2
  1873. package/dist/services/prompt-builder.js +318 -99
  1874. package/dist/services/runtime-settings-context.d.ts +73 -0
  1875. package/dist/services/runtime-settings-context.js +69 -0
  1876. package/dist/sessions/timeline-snapshot.d.ts +35 -0
  1877. package/dist/sessions/timeline-snapshot.js +144 -0
  1878. package/dist/sessions/timeline.d.ts +33 -0
  1879. package/dist/sessions/timeline.js +85 -0
  1880. package/dist/shared/context-optimization-metadata.d.ts +29 -0
  1881. package/dist/shared/context-optimization-metadata.js +73 -0
  1882. package/dist/shared/engine-types.d.ts +26 -0
  1883. package/dist/skills/bash-injection.d.ts +2 -2
  1884. package/dist/skills/bash-injection.js +9 -2
  1885. package/dist/skills/bundled/code-explorer.skill.md +50 -0
  1886. package/dist/skills/bundled/file-edit.skill.md +62 -0
  1887. package/dist/skills/bundled/git-commit.skill.md +66 -0
  1888. package/dist/skills/bundled/pubcommander-control/SKILL.md +33 -0
  1889. package/dist/skills/bundled/pubcommander-control/agents/openai.yaml +4 -0
  1890. package/dist/skills/bundled/typescript-expert.skill.md +21 -0
  1891. package/dist/skills/bundled/weather.skill.md +48 -0
  1892. package/dist/skills/bundled/web-app-testing.skill.md +71 -0
  1893. package/dist/skills/bundled/web-search.skill.md +56 -0
  1894. package/dist/skills/executor.js +2 -0
  1895. package/dist/skills/hub.js +68 -44
  1896. package/dist/skills/index.d.ts +6 -3
  1897. package/dist/skills/index.js +19 -4
  1898. package/dist/skills/local-inventory.d.ts +21 -0
  1899. package/dist/skills/local-inventory.js +72 -0
  1900. package/dist/skills/parser.js +2 -0
  1901. package/dist/skills/registry.d.ts +52 -0
  1902. package/dist/skills/registry.js +291 -14
  1903. package/dist/skills/skill-exchange.d.ts +61 -0
  1904. package/dist/skills/skill-exchange.js +523 -0
  1905. package/dist/skills/skill-importer.d.ts +2 -2
  1906. package/dist/skills/skill-importer.js +76 -17
  1907. package/dist/skills/skill-loader.js +2 -2
  1908. package/dist/skills/skill-registry.js +3 -2
  1909. package/dist/skills/skill-signing.d.ts +20 -0
  1910. package/dist/skills/skill-signing.js +106 -0
  1911. package/dist/skills/skill-sources.d.ts +3 -2
  1912. package/dist/skills/skill-sources.js +5 -4
  1913. package/dist/skills/skill-usage-store.d.ts +49 -0
  1914. package/dist/skills/skill-usage-store.js +121 -0
  1915. package/dist/skills/types.d.ts +4 -0
  1916. package/dist/spec/spec-store.js +7 -6
  1917. package/dist/speculative/shadow-workspace.d.ts +79 -0
  1918. package/dist/speculative/shadow-workspace.js +500 -0
  1919. package/dist/talk-mode/index.d.ts +4 -4
  1920. package/dist/talk-mode/index.js +3 -3
  1921. package/dist/talk-mode/providers/elevenlabs-client.d.ts +48 -0
  1922. package/dist/talk-mode/providers/elevenlabs-client.js +117 -0
  1923. package/dist/talk-mode/providers/elevenlabs.js +12 -23
  1924. package/dist/talk-mode/providers/index.d.ts +3 -1
  1925. package/dist/talk-mode/providers/index.js +2 -0
  1926. package/dist/talk-mode/providers/pocket-tts.d.ts +88 -0
  1927. package/dist/talk-mode/providers/pocket-tts.js +334 -0
  1928. package/dist/talk-mode/providers/voicebox-tts.d.ts +24 -0
  1929. package/dist/talk-mode/providers/voicebox-tts.js +120 -0
  1930. package/dist/talk-mode/types.d.ts +39 -1
  1931. package/dist/tasks/background-tasks.js +22 -5
  1932. package/dist/telemetry/otel-tracer.js +5 -2
  1933. package/dist/templates/design-system-apply.d.ts +23 -0
  1934. package/dist/templates/design-system-apply.js +100 -0
  1935. package/dist/templates/project-scaffolding.d.ts +2 -0
  1936. package/dist/templates/project-scaffolding.js +616 -1
  1937. package/dist/testing/ai-integration-tests.js +8 -5
  1938. package/dist/themes/theme-manager.d.ts +12 -0
  1939. package/dist/themes/theme-manager.js +38 -6
  1940. package/dist/themes/theme-schema.d.ts +42 -42
  1941. package/dist/tools/a2a-call-tool.d.ts +34 -0
  1942. package/dist/tools/a2a-call-tool.js +75 -0
  1943. package/dist/tools/advanced/multi-file-editor.js +3 -1
  1944. package/dist/tools/advanced/operation-history.js +2 -1
  1945. package/dist/tools/app-server-tool.d.ts +66 -0
  1946. package/dist/tools/app-server-tool.js +423 -0
  1947. package/dist/tools/apply-patch.d.ts +31 -1
  1948. package/dist/tools/apply-patch.js +214 -19
  1949. package/dist/tools/authored-tools-manifest-2.d.ts +17 -0
  1950. package/dist/tools/authored-tools-manifest-2.js +133 -0
  1951. package/dist/tools/authored-tools-manifest.d.ts +15 -0
  1952. package/dist/tools/authored-tools-manifest.js +13 -0
  1953. package/dist/tools/bash/bash-tool.d.ts +36 -3
  1954. package/dist/tools/bash/bash-tool.js +240 -100
  1955. package/dist/tools/bash/command-validator.d.ts +1 -1
  1956. package/dist/tools/bash/command-validator.js +115 -40
  1957. package/dist/tools/bash/execution-policy.d.ts +42 -0
  1958. package/dist/tools/bash/execution-policy.js +278 -0
  1959. package/dist/tools/bash/security-patterns.js +43 -5
  1960. package/dist/tools/bash/streaming-executor.d.ts +2 -1
  1961. package/dist/tools/bash/streaming-executor.js +172 -78
  1962. package/dist/tools/build-project-tool.d.ts +25 -0
  1963. package/dist/tools/build-project-tool.js +30 -0
  1964. package/dist/tools/bundle-analyze-tool.d.ts +28 -0
  1965. package/dist/tools/bundle-analyze-tool.js +39 -0
  1966. package/dist/tools/code-exec-preflight-runner.d.ts +41 -0
  1967. package/dist/tools/code-exec-preflight-runner.js +254 -0
  1968. package/dist/tools/code-exec-preflight.d.ts +44 -0
  1969. package/dist/tools/code-exec-preflight.js +501 -0
  1970. package/dist/tools/code-exec-tool.d.ts +102 -23
  1971. package/dist/tools/code-exec-tool.js +741 -110
  1972. package/dist/tools/code-explorer-tool.d.ts +1 -1
  1973. package/dist/tools/code-explorer-tool.js +25 -1
  1974. package/dist/tools/code-review.js +5 -0
  1975. package/dist/tools/code-stats-tool.d.ts +43 -0
  1976. package/dist/tools/code-stats-tool.js +70 -0
  1977. package/dist/tools/codebase-replace-tool.js +2 -2
  1978. package/dist/tools/comfy-recipe-tool.d.ts +37 -0
  1979. package/dist/tools/comfy-recipe-tool.js +693 -0
  1980. package/dist/tools/comment-watcher.js +29 -12
  1981. package/dist/tools/community-search.d.ts +93 -0
  1982. package/dist/tools/community-search.js +334 -0
  1983. package/dist/tools/computer-control-harness.js +5 -2
  1984. package/dist/tools/computer-control-tool.d.ts +8 -0
  1985. package/dist/tools/computer-control-tool.js +71 -26
  1986. package/dist/tools/context-expand-tool.d.ts +19 -0
  1987. package/dist/tools/context-expand-tool.js +132 -0
  1988. package/dist/tools/core-code-inspection.d.ts +56 -0
  1989. package/dist/tools/core-code-inspection.js +86 -0
  1990. package/dist/tools/create-skill-tool.d.ts +2 -3
  1991. package/dist/tools/create-skill-tool.js +16 -75
  1992. package/dist/tools/cronjob-tool.d.ts +1 -0
  1993. package/dist/tools/cronjob-tool.js +1 -0
  1994. package/dist/tools/csv/csv-parse.d.ts +19 -0
  1995. package/dist/tools/csv/csv-parse.js +132 -0
  1996. package/dist/tools/csv/csv-wiring.d.ts +8 -0
  1997. package/dist/tools/csv/csv-wiring.js +9 -0
  1998. package/dist/tools/csv-analyze-tool.d.ts +11 -0
  1999. package/dist/tools/csv-analyze-tool.js +114 -0
  2000. package/dist/tools/csv-preview-tool.d.ts +34 -0
  2001. package/dist/tools/csv-preview-tool.js +69 -0
  2002. package/dist/tools/db-migration.js +11 -3
  2003. package/dist/tools/deep-research-tool.d.ts +68 -0
  2004. package/dist/tools/deep-research-tool.js +257 -0
  2005. package/dist/tools/deferred-schema-state.d.ts +19 -0
  2006. package/dist/tools/deferred-schema-state.js +33 -0
  2007. package/dist/tools/dep-inspect-tool.d.ts +32 -0
  2008. package/dist/tools/dep-inspect-tool.js +74 -0
  2009. package/dist/tools/design-system-tool.d.ts +10 -0
  2010. package/dist/tools/design-system-tool.js +95 -0
  2011. package/dist/tools/device-tool.d.ts +2 -1
  2012. package/dist/tools/device-tool.js +21 -0
  2013. package/dist/tools/diagram-tool.js +8 -2
  2014. package/dist/tools/diff-files-tool.d.ts +28 -0
  2015. package/dist/tools/diff-files-tool.js +49 -0
  2016. package/dist/tools/enhanced-search.js +32 -16
  2017. package/dist/tools/env-doctor-tool.d.ts +32 -0
  2018. package/dist/tools/env-doctor-tool.js +55 -0
  2019. package/dist/tools/execute-code-rpc-invoker.d.ts +1 -1
  2020. package/dist/tools/execute-code-rpc-invoker.js +36 -20
  2021. package/dist/tools/execute-code-runner.d.ts +23 -0
  2022. package/dist/tools/execute-code-runner.js +169 -25
  2023. package/dist/tools/extension-forge-tool.d.ts +29 -0
  2024. package/dist/tools/extension-forge-tool.js +288 -0
  2025. package/dist/tools/fetch-tool.js +7 -3
  2026. package/dist/tools/file-search-tool.d.ts +41 -0
  2027. package/dist/tools/file-search-tool.js +99 -0
  2028. package/dist/tools/fleet-room-tool.d.ts +104 -0
  2029. package/dist/tools/fleet-room-tool.js +124 -0
  2030. package/dist/tools/format-project-tool.d.ts +28 -0
  2031. package/dist/tools/format-project-tool.js +45 -0
  2032. package/dist/tools/git-summary-tool.d.ts +36 -0
  2033. package/dist/tools/git-summary-tool.js +65 -0
  2034. package/dist/tools/git-tool.js +16 -4
  2035. package/dist/tools/gpu-avatar-delivery.d.ts +16 -0
  2036. package/dist/tools/gpu-avatar-delivery.js +67 -0
  2037. package/dist/tools/gpu-media-worker.d.ts +96 -0
  2038. package/dist/tools/gpu-media-worker.js +363 -0
  2039. package/dist/tools/gui-tool.js +92 -13
  2040. package/dist/tools/http-probe-tool.d.ts +25 -0
  2041. package/dist/tools/http-probe-tool.js +40 -0
  2042. package/dist/tools/image-tool.js +29 -16
  2043. package/dist/tools/index.d.ts +6 -1
  2044. package/dist/tools/index.js +5 -0
  2045. package/dist/tools/integration-tool-hints.d.ts +4 -0
  2046. package/dist/tools/integration-tool-hints.js +19 -0
  2047. package/dist/tools/interactive-bash.d.ts +29 -1
  2048. package/dist/tools/interactive-bash.js +141 -21
  2049. package/dist/tools/json-query-tool.d.ts +30 -0
  2050. package/dist/tools/json-query-tool.js +49 -0
  2051. package/dist/tools/license-check-tool.d.ts +22 -0
  2052. package/dist/tools/license-check-tool.js +43 -0
  2053. package/dist/tools/lint-project-tool.d.ts +52 -0
  2054. package/dist/tools/lint-project-tool.js +143 -0
  2055. package/dist/tools/list-peers-tool.d.ts +3 -0
  2056. package/dist/tools/list-peers-tool.js +11 -4
  2057. package/dist/tools/local-binary-launch.d.ts +14 -0
  2058. package/dist/tools/local-binary-launch.js +63 -0
  2059. package/dist/tools/lsp-navigation-tools.d.ts +87 -0
  2060. package/dist/tools/lsp-navigation-tools.js +470 -0
  2061. package/dist/tools/markdown-convert.d.ts +51 -0
  2062. package/dist/tools/markdown-convert.js +159 -0
  2063. package/dist/tools/media-generation-tool.d.ts +105 -1
  2064. package/dist/tools/media-generation-tool.js +1892 -18
  2065. package/dist/tools/meeting-notes-tool.d.ts +25 -0
  2066. package/dist/tools/meeting-notes-tool.js +240 -0
  2067. package/dist/tools/merge-conflict-tool.js +54 -26
  2068. package/dist/tools/metadata.d.ts +3 -1
  2069. package/dist/tools/metadata.js +819 -16
  2070. package/dist/tools/mixture-of-agents-tool.d.ts +7 -0
  2071. package/dist/tools/mixture-of-agents-tool.js +230 -31
  2072. package/dist/tools/multi-edit.js +42 -18
  2073. package/dist/tools/ocr-tool.d.ts +43 -0
  2074. package/dist/tools/ocr-tool.js +24 -18
  2075. package/dist/tools/omission-placeholder-detector.js +12 -6
  2076. package/dist/tools/paper-qa-tool.d.ts +73 -0
  2077. package/dist/tools/paper-qa-tool.js +313 -0
  2078. package/dist/tools/peer-chain-tool.js +4 -1
  2079. package/dist/tools/peer-delegate-tool.d.ts +2 -0
  2080. package/dist/tools/peer-delegate-tool.js +11 -1
  2081. package/dist/tools/port-check-tool.d.ts +31 -0
  2082. package/dist/tools/port-check-tool.js +25 -0
  2083. package/dist/tools/project-map-tool.d.ts +39 -0
  2084. package/dist/tools/project-map-tool.js +128 -0
  2085. package/dist/tools/ragchat-tool.d.ts +39 -0
  2086. package/dist/tools/ragchat-tool.js +105 -0
  2087. package/dist/tools/register-tool-handler.d.ts +2 -2
  2088. package/dist/tools/register-tool-handler.js +7 -4
  2089. package/dist/tools/registry/advanced-tools.js +1 -1
  2090. package/dist/tools/registry/attention-tools.d.ts +3 -3
  2091. package/dist/tools/registry/attention-tools.js +14 -10
  2092. package/dist/tools/registry/authored-extra-tools.d.ts +20 -0
  2093. package/dist/tools/registry/authored-extra-tools.js +147 -0
  2094. package/dist/tools/registry/bash-tools.d.ts +2 -2
  2095. package/dist/tools/registry/bash-tools.js +7 -3
  2096. package/dist/tools/registry/browser-operator-tools.d.ts +1 -1
  2097. package/dist/tools/registry/browser-operator-tools.js +17 -3
  2098. package/dist/tools/registry/browser-tools.d.ts +1 -1
  2099. package/dist/tools/registry/browser-tools.js +38 -33
  2100. package/dist/tools/registry/code-explorer-tools.js +6 -1
  2101. package/dist/tools/registry/comfy-recipe-tools.d.ts +2 -0
  2102. package/dist/tools/registry/comfy-recipe-tools.js +5 -0
  2103. package/dist/tools/registry/context-expand-tools.d.ts +3 -0
  2104. package/dist/tools/registry/context-expand-tools.js +6 -0
  2105. package/dist/tools/registry/csv-tools.d.ts +12 -0
  2106. package/dist/tools/registry/csv-tools.js +62 -0
  2107. package/dist/tools/registry/delegate-agent-tools.d.ts +64 -0
  2108. package/dist/tools/registry/delegate-agent-tools.js +206 -0
  2109. package/dist/tools/registry/design-tools.d.ts +12 -0
  2110. package/dist/tools/registry/design-tools.js +80 -0
  2111. package/dist/tools/registry/fleet-tools.d.ts +9 -0
  2112. package/dist/tools/registry/fleet-tools.js +28 -1
  2113. package/dist/tools/registry/index.d.ts +25 -5
  2114. package/dist/tools/registry/index.js +80 -6
  2115. package/dist/tools/registry/interactive-adapters.d.ts +37 -0
  2116. package/dist/tools/registry/interactive-adapters.js +116 -0
  2117. package/dist/tools/registry/knowledge-tools.d.ts +2 -2
  2118. package/dist/tools/registry/knowledge-tools.js +2 -2
  2119. package/dist/tools/registry/lessons-tools.d.ts +7 -0
  2120. package/dist/tools/registry/lessons-tools.js +43 -3
  2121. package/dist/tools/registry/lsp-tools.d.ts +3 -3
  2122. package/dist/tools/registry/lsp-tools.js +9 -3
  2123. package/dist/tools/registry/meeting-tools.d.ts +3 -0
  2124. package/dist/tools/registry/meeting-tools.js +6 -0
  2125. package/dist/tools/registry/memory-tools.d.ts +1 -1
  2126. package/dist/tools/registry/memory-tools.js +40 -28
  2127. package/dist/tools/registry/misc-tools.d.ts +1 -1
  2128. package/dist/tools/registry/misc-tools.js +7 -4
  2129. package/dist/tools/registry/moa-tools.js +13 -0
  2130. package/dist/tools/registry/multimodal-tools.d.ts +73 -1
  2131. package/dist/tools/registry/multimodal-tools.js +581 -4
  2132. package/dist/tools/registry/process-tools.d.ts +16 -0
  2133. package/dist/tools/registry/process-tools.js +136 -1
  2134. package/dist/tools/registry/remind-tools.d.ts +23 -0
  2135. package/dist/tools/registry/remind-tools.js +120 -0
  2136. package/dist/tools/registry/research-tools.d.ts +18 -0
  2137. package/dist/tools/registry/research-tools.js +12 -0
  2138. package/dist/tools/registry/search-tools.d.ts +6 -6
  2139. package/dist/tools/registry/search-tools.js +30 -17
  2140. package/dist/tools/registry/secrets-tools.d.ts +33 -0
  2141. package/dist/tools/registry/secrets-tools.js +71 -0
  2142. package/dist/tools/registry/self-describe-tools.d.ts +23 -0
  2143. package/dist/tools/registry/self-describe-tools.js +169 -0
  2144. package/dist/tools/registry/self-evolution-tools.d.ts +13 -0
  2145. package/dist/tools/registry/self-evolution-tools.js +97 -0
  2146. package/dist/tools/registry/text-editor-tools.d.ts +26 -4
  2147. package/dist/tools/registry/text-editor-tools.js +102 -6
  2148. package/dist/tools/registry/tool-alias-map.d.ts +8 -0
  2149. package/dist/tools/registry/tool-alias-map.js +47 -0
  2150. package/dist/tools/registry/tool-aliases.d.ts +3 -4
  2151. package/dist/tools/registry/tool-aliases.js +12 -48
  2152. package/dist/tools/registry/types.d.ts +5 -0
  2153. package/dist/tools/registry/verify-tools.d.ts +50 -0
  2154. package/dist/tools/registry/verify-tools.js +136 -0
  2155. package/dist/tools/registry/video-studio-tools.d.ts +13 -0
  2156. package/dist/tools/registry/video-studio-tools.js +21 -0
  2157. package/dist/tools/registry/vision-tools.d.ts +15 -1
  2158. package/dist/tools/registry/vision-tools.js +252 -27
  2159. package/dist/tools/registry/web-test-tool.d.ts +66 -0
  2160. package/dist/tools/registry/web-test-tool.js +321 -0
  2161. package/dist/tools/registry/web-tools.d.ts +43 -0
  2162. package/dist/tools/registry/web-tools.js +281 -1
  2163. package/dist/tools/resource-catalog-tool.d.ts +38 -0
  2164. package/dist/tools/resource-catalog-tool.js +46 -0
  2165. package/dist/tools/review-gate-helper.d.ts +44 -0
  2166. package/dist/tools/review-gate-helper.js +110 -0
  2167. package/dist/tools/route-peer-tool.js +62 -11
  2168. package/dist/tools/sbom-generate-tool.d.ts +22 -0
  2169. package/dist/tools/sbom-generate-tool.js +41 -0
  2170. package/dist/tools/scaffold-app-tool.d.ts +48 -0
  2171. package/dist/tools/scaffold-app-tool.js +144 -0
  2172. package/dist/tools/screenshot-tool.js +5 -2
  2173. package/dist/tools/search.d.ts +17 -0
  2174. package/dist/tools/search.js +31 -8
  2175. package/dist/tools/self-describe.d.ts +73 -0
  2176. package/dist/tools/self-describe.js +298 -0
  2177. package/dist/tools/skills-inspection-tool.js +30 -1
  2178. package/dist/tools/stock-quote.d.ts +67 -0
  2179. package/dist/tools/stock-quote.js +645 -0
  2180. package/dist/tools/stream-tool-output.d.ts +3 -0
  2181. package/dist/tools/stream-tool-output.js +33 -0
  2182. package/dist/tools/submit-plan-tool.js +1 -1
  2183. package/dist/tools/test-runner-tool.d.ts +38 -0
  2184. package/dist/tools/test-runner-tool.js +96 -0
  2185. package/dist/tools/text-editor.js +91 -8
  2186. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  2187. package/dist/tools/text-to-speech-tool.js +48 -2
  2188. package/dist/tools/todo-scan-tool.d.ts +39 -0
  2189. package/dist/tools/todo-scan-tool.js +53 -0
  2190. package/dist/tools/tool-call-scheduler.d.ts +10 -0
  2191. package/dist/tools/tool-call-scheduler.js +58 -0
  2192. package/dist/tools/tool-effect.d.ts +5 -0
  2193. package/dist/tools/tool-effect.js +26 -0
  2194. package/dist/tools/tool-manager.js +8 -0
  2195. package/dist/tools/tool-search.d.ts +12 -11
  2196. package/dist/tools/tool-search.js +77 -28
  2197. package/dist/tools/tool-selector.d.ts +7 -0
  2198. package/dist/tools/tool-selector.js +27 -13
  2199. package/dist/tools/tools-md-generator.js +2 -2
  2200. package/dist/tools/types.d.ts +22 -0
  2201. package/dist/tools/types.js +5 -1
  2202. package/dist/tools/video/approved-media-source.d.ts +8 -0
  2203. package/dist/tools/video/approved-media-source.js +59 -0
  2204. package/dist/tools/video/book-manuscript-source.d.ts +49 -0
  2205. package/dist/tools/video/book-manuscript-source.js +263 -0
  2206. package/dist/tools/video/character-in-location.d.ts +42 -0
  2207. package/dist/tools/video/character-in-location.js +161 -0
  2208. package/dist/tools/video/cinematic-trailer-plan.d.ts +203 -0
  2209. package/dist/tools/video/cinematic-trailer-plan.js +498 -0
  2210. package/dist/tools/video/cloud-understand.d.ts +91 -0
  2211. package/dist/tools/video/cloud-understand.js +214 -0
  2212. package/dist/tools/video/comfy-client.d.ts +38 -0
  2213. package/dist/tools/video/comfy-client.js +227 -0
  2214. package/dist/tools/video/comfy-workflow-template.d.ts +70 -0
  2215. package/dist/tools/video/comfy-workflow-template.js +194 -0
  2216. package/dist/tools/video/describe-frame.d.ts +36 -0
  2217. package/dist/tools/video/describe-frame.js +68 -0
  2218. package/dist/tools/video/film-assemble.d.ts +234 -0
  2219. package/dist/tools/video/film-assemble.js +959 -0
  2220. package/dist/tools/video/film-project.d.ts +152 -0
  2221. package/dist/tools/video/film-project.js +312 -0
  2222. package/dist/tools/video/frame-dedup.d.ts +46 -0
  2223. package/dist/tools/video/frame-dedup.js +110 -0
  2224. package/dist/tools/video/frame-sample.d.ts +72 -0
  2225. package/dist/tools/video/frame-sample.js +238 -0
  2226. package/dist/tools/video/google-flow-driver.d.ts +131 -0
  2227. package/dist/tools/video/google-flow-driver.js +312 -0
  2228. package/dist/tools/video/google-flow-handoff.d.ts +75 -0
  2229. package/dist/tools/video/google-flow-handoff.js +121 -0
  2230. package/dist/tools/video/google-flow-plan-export.d.ts +21 -0
  2231. package/dist/tools/video/google-flow-plan-export.js +123 -0
  2232. package/dist/tools/video/google-flow-result-import.d.ts +92 -0
  2233. package/dist/tools/video/google-flow-result-import.js +297 -0
  2234. package/dist/tools/video/hybrid-video-router.d.ts +34 -0
  2235. package/dist/tools/video/hybrid-video-router.js +113 -0
  2236. package/dist/tools/video/localized-media.d.ts +50 -0
  2237. package/dist/tools/video/localized-media.js +128 -0
  2238. package/dist/tools/video/long-form-plan.d.ts +37 -0
  2239. package/dist/tools/video/long-form-plan.js +83 -0
  2240. package/dist/tools/video/long-form-production.d.ts +49 -0
  2241. package/dist/tools/video/long-form-production.js +168 -0
  2242. package/dist/tools/video/long-transcribe.d.ts +94 -0
  2243. package/dist/tools/video/long-transcribe.js +206 -0
  2244. package/dist/tools/video/media-fetch.d.ts +94 -0
  2245. package/dist/tools/video/media-fetch.js +311 -0
  2246. package/dist/tools/video/mermaid-render.d.ts +34 -0
  2247. package/dist/tools/video/mermaid-render.js +127 -0
  2248. package/dist/tools/video/narration.d.ts +96 -0
  2249. package/dist/tools/video/narration.js +505 -0
  2250. package/dist/tools/video/native-fashion-defects.d.ts +27 -0
  2251. package/dist/tools/video/native-fashion-defects.js +80 -0
  2252. package/dist/tools/video/scene-render.d.ts +108 -0
  2253. package/dist/tools/video/scene-render.js +418 -0
  2254. package/dist/tools/video/subtitles.d.ts +49 -0
  2255. package/dist/tools/video/subtitles.js +116 -0
  2256. package/dist/tools/video/video-ckg.d.ts +123 -0
  2257. package/dist/tools/video/video-ckg.js +188 -0
  2258. package/dist/tools/video/video-research-card.d.ts +58 -0
  2259. package/dist/tools/video/video-research-card.js +468 -0
  2260. package/dist/tools/video/video-understanding.d.ts +159 -0
  2261. package/dist/tools/video/video-understanding.js +534 -0
  2262. package/dist/tools/video/visual-gate-report.d.ts +139 -0
  2263. package/dist/tools/video/visual-gate-report.js +379 -0
  2264. package/dist/tools/video/voice-rights-registry.d.ts +13 -0
  2265. package/dist/tools/video/voice-rights-registry.js +142 -0
  2266. package/dist/tools/video/youtube-captions.d.ts +51 -0
  2267. package/dist/tools/video/youtube-captions.js +102 -0
  2268. package/dist/tools/video/youtube-master-quality.d.ts +163 -0
  2269. package/dist/tools/video/youtube-master-quality.js +379 -0
  2270. package/dist/tools/video/youtube-storyboard.d.ts +43 -0
  2271. package/dist/tools/video/youtube-storyboard.js +194 -0
  2272. package/dist/tools/video-flow-handoff-tool.d.ts +181 -0
  2273. package/dist/tools/video-flow-handoff-tool.js +261 -0
  2274. package/dist/tools/video-long-form-plan-tool.d.ts +31 -0
  2275. package/dist/tools/video-long-form-plan-tool.js +87 -0
  2276. package/dist/tools/video-quality-gate-tool.d.ts +97 -0
  2277. package/dist/tools/video-quality-gate-tool.js +189 -0
  2278. package/dist/tools/video-route-tool.d.ts +128 -0
  2279. package/dist/tools/video-route-tool.js +126 -0
  2280. package/dist/tools/video-studio-tool-helpers.d.ts +22 -0
  2281. package/dist/tools/video-studio-tool-helpers.js +128 -0
  2282. package/dist/tools/video-trailer-plan-tool.d.ts +60 -0
  2283. package/dist/tools/video-trailer-plan-tool.js +103 -0
  2284. package/dist/tools/vision/blender-render.d.ts +76 -0
  2285. package/dist/tools/vision/blender-render.js +121 -0
  2286. package/dist/tools/vision/image-processor.d.ts +1 -0
  2287. package/dist/tools/vision/image-processor.js +8 -1
  2288. package/dist/tools/vision/load-sharp.d.ts +53 -0
  2289. package/dist/tools/vision/load-sharp.js +48 -0
  2290. package/dist/tools/vision/mean-luma.d.ts +4 -0
  2291. package/dist/tools/vision/mean-luma.js +189 -0
  2292. package/dist/tools/vision/object-detection.d.ts +90 -0
  2293. package/dist/tools/vision/object-detection.js +403 -0
  2294. package/dist/tools/vision/vision-analysis.js +2 -1
  2295. package/dist/tools/weather.d.ts +33 -0
  2296. package/dist/tools/weather.js +183 -0
  2297. package/dist/tools/web-scrape-tool.d.ts +63 -0
  2298. package/dist/tools/web-scrape-tool.js +318 -0
  2299. package/dist/tools/web-search.d.ts +67 -6
  2300. package/dist/tools/web-search.js +231 -68
  2301. package/dist/tools/workspace-tools.d.ts +39 -0
  2302. package/dist/tools/workspace-tools.js +347 -0
  2303. package/dist/tracks/track-manager.js +9 -8
  2304. package/dist/triggers/webhook-trigger.js +10 -18
  2305. package/dist/ui/components/ChatHistory.d.ts +1 -1
  2306. package/dist/ui/components/ChatHistory.js +14 -2
  2307. package/dist/ui/components/ChatInput.d.ts +2 -1
  2308. package/dist/ui/components/ChatInput.js +42 -88
  2309. package/dist/ui/components/ChatInterface.d.ts +4 -2
  2310. package/dist/ui/components/ChatInterface.js +32 -64
  2311. package/dist/ui/components/CommandSuggestions.d.ts +0 -1
  2312. package/dist/ui/components/CommandSuggestions.js +4 -6
  2313. package/dist/ui/components/FileAutocomplete.d.ts +6 -1
  2314. package/dist/ui/components/FileAutocomplete.js +137 -77
  2315. package/dist/ui/components/FuzzyPicker.d.ts +5 -0
  2316. package/dist/ui/components/FuzzyPicker.js +1 -1
  2317. package/dist/ui/components/KeyboardHelp.js +8 -6
  2318. package/dist/ui/components/ModelSelection.js +6 -5
  2319. package/dist/ui/components/StatusBar.d.ts +2 -1
  2320. package/dist/ui/components/StatusBar.js +8 -7
  2321. package/dist/ui/context/theme-context.js +3 -2
  2322. package/dist/ui/http-server/server.js +2 -2
  2323. package/dist/ui/index.d.ts +1 -1
  2324. package/dist/ui/index.js +1 -1
  2325. package/dist/ui/utils/markdown-renderer.js +4 -13
  2326. package/dist/undo/checkpoint-manager.d.ts +3 -0
  2327. package/dist/undo/checkpoint-manager.js +6 -1
  2328. package/dist/utils/approval-pattern-tracker.js +5 -13
  2329. package/dist/utils/ascii-banner.d.ts +1 -1
  2330. package/dist/utils/ascii-banner.js +1 -1
  2331. package/dist/utils/atomic-write.d.ts +99 -0
  2332. package/dist/utils/atomic-write.js +559 -0
  2333. package/dist/utils/audio-player.d.ts +1 -0
  2334. package/dist/utils/audio-player.js +7 -3
  2335. package/dist/utils/autonomy-manager.js +12 -3
  2336. package/dist/utils/bounded-output.d.ts +16 -0
  2337. package/dist/utils/bounded-output.js +63 -0
  2338. package/dist/utils/command-exists.d.ts +14 -0
  2339. package/dist/utils/command-exists.js +43 -0
  2340. package/dist/utils/config-validation/schema.d.ts +13 -13
  2341. package/dist/utils/config-validation/schema.js +33 -1
  2342. package/dist/utils/confirmation-service.d.ts +60 -1
  2343. package/dist/utils/confirmation-service.js +204 -41
  2344. package/dist/utils/cost-tracker.d.ts +66 -1
  2345. package/dist/utils/cost-tracker.js +100 -17
  2346. package/dist/utils/device-store-file.d.ts +4 -0
  2347. package/dist/utils/device-store-file.js +40 -0
  2348. package/dist/utils/export-manager.d.ts +9 -0
  2349. package/dist/utils/export-manager.js +19 -0
  2350. package/dist/utils/first-use-hints.d.ts +25 -0
  2351. package/dist/utils/first-use-hints.js +58 -0
  2352. package/dist/utils/history-manager.js +7 -8
  2353. package/dist/utils/init-project.js +17 -13
  2354. package/dist/utils/input-validation/index.d.ts +16 -16
  2355. package/dist/utils/installation-id.js +7 -22
  2356. package/dist/utils/interactive-setup.js +7 -12
  2357. package/dist/utils/json-salvage.d.ts +22 -0
  2358. package/dist/utils/json-salvage.js +91 -0
  2359. package/dist/utils/llm-retry.js +3 -0
  2360. package/dist/utils/logger.d.ts +1 -0
  2361. package/dist/utils/logger.js +16 -5
  2362. package/dist/utils/model-router.js +8 -12
  2363. package/dist/utils/model-utils.js +14 -0
  2364. package/dist/utils/output-sanitizer.d.ts +4 -8
  2365. package/dist/utils/output-sanitizer.js +10 -10
  2366. package/dist/utils/output-schema-validator.d.ts +7 -0
  2367. package/dist/utils/output-schema-validator.js +25 -1
  2368. package/dist/utils/response-cache.js +11 -22
  2369. package/dist/utils/ripgrep-path.d.ts +11 -0
  2370. package/dist/utils/ripgrep-path.js +60 -0
  2371. package/dist/utils/semantic-cache.js +4 -7
  2372. package/dist/utils/settings-manager.d.ts +27 -4
  2373. package/dist/utils/settings-manager.js +51 -39
  2374. package/dist/utils/shell-completions.js +25 -34
  2375. package/dist/utils/shell-configuration.d.ts +39 -0
  2376. package/dist/utils/shell-configuration.js +106 -0
  2377. package/dist/utils/stream-stall-guard.d.ts +39 -0
  2378. package/dist/utils/stream-stall-guard.js +123 -0
  2379. package/dist/utils/subprocess-env.d.ts +15 -0
  2380. package/dist/utils/subprocess-env.js +112 -0
  2381. package/dist/utils/telegram-api-base.d.ts +9 -0
  2382. package/dist/utils/telegram-api-base.js +15 -0
  2383. package/dist/utils/telemetry-config.js +16 -13
  2384. package/dist/utils/update-notifier.js +20 -27
  2385. package/dist/utils/validators.js +1 -2
  2386. package/dist/versioning/config-migrator.js +3 -2
  2387. package/dist/versioning/migration-manager.js +5 -4
  2388. package/dist/versioning/version-detector.js +2 -1
  2389. package/dist/vision-train/assets.d.ts +37 -0
  2390. package/dist/vision-train/assets.js +97 -0
  2391. package/dist/vision-train/ckg-publish.d.ts +26 -0
  2392. package/dist/vision-train/ckg-publish.js +36 -0
  2393. package/dist/vision-train/coco-to-labels.d.ts +63 -0
  2394. package/dist/vision-train/coco-to-labels.js +63 -0
  2395. package/dist/vision-train/curriculum.d.ts +29 -0
  2396. package/dist/vision-train/curriculum.js +49 -0
  2397. package/dist/vision-train/engine.d.ts +56 -0
  2398. package/dist/vision-train/engine.js +55 -0
  2399. package/dist/vision-train/report.d.ts +15 -0
  2400. package/dist/vision-train/report.js +72 -0
  2401. package/dist/vision-train/scorer.d.ts +67 -0
  2402. package/dist/vision-train/scorer.js +114 -0
  2403. package/dist/vision-train/yolo-labels.d.ts +13 -0
  2404. package/dist/vision-train/yolo-labels.js +66 -0
  2405. package/dist/voice/elevenlabs-voice.d.ts +53 -0
  2406. package/dist/voice/elevenlabs-voice.js +412 -0
  2407. package/dist/voice/kyutai-local-voice.d.ts +33 -0
  2408. package/dist/voice/kyutai-local-voice.js +198 -0
  2409. package/dist/voice/local-tts.d.ts +106 -3
  2410. package/dist/voice/local-tts.js +672 -35
  2411. package/dist/voice/local-whisper.d.ts +11 -0
  2412. package/dist/voice/local-whisper.js +18 -2
  2413. package/dist/voice/pcm-edges.d.ts +43 -0
  2414. package/dist/voice/pcm-edges.js +210 -0
  2415. package/dist/voice/perceived-latency-benchmark.d.ts +56 -0
  2416. package/dist/voice/perceived-latency-benchmark.js +218 -0
  2417. package/dist/voice/tts-bank.d.ts +72 -0
  2418. package/dist/voice/tts-bank.js +172 -0
  2419. package/dist/voice/tts-latency-benchmark.d.ts +36 -0
  2420. package/dist/voice/tts-latency-benchmark.js +76 -0
  2421. package/dist/voice/tts-volume.d.ts +86 -0
  2422. package/dist/voice/tts-volume.js +378 -0
  2423. package/dist/voice/two-speed-voice.d.ts +19 -0
  2424. package/dist/voice/two-speed-voice.js +40 -0
  2425. package/dist/voice/voice-to-code.js +1 -1
  2426. package/dist/voice/voicebox-tts.d.ts +150 -0
  2427. package/dist/voice/voicebox-tts.js +669 -0
  2428. package/dist/voice/wake-word.d.ts +2 -0
  2429. package/dist/voice/wake-word.js +30 -10
  2430. package/dist/webhooks/webhook-manager.js +10 -18
  2431. package/dist/widgets/auto-widget.d.ts +27 -0
  2432. package/dist/widgets/auto-widget.js +111 -0
  2433. package/dist/widgets/canvas-publish.d.ts +15 -0
  2434. package/dist/widgets/canvas-publish.js +39 -0
  2435. package/dist/widgets/curated/news.d.ts +2 -0
  2436. package/dist/widgets/curated/news.js +46 -0
  2437. package/dist/widgets/curated/stock.d.ts +1 -0
  2438. package/dist/widgets/curated/stock.js +87 -0
  2439. package/dist/widgets/curated/weather.d.ts +2 -0
  2440. package/dist/widgets/curated/weather.js +93 -0
  2441. package/dist/widgets/template-engine.d.ts +19 -0
  2442. package/dist/widgets/template-engine.js +134 -0
  2443. package/dist/widgets/widget-engine.d.ts +24 -0
  2444. package/dist/widgets/widget-engine.js +153 -0
  2445. package/dist/widgets/widget-gate.d.ts +19 -0
  2446. package/dist/widgets/widget-gate.js +144 -0
  2447. package/dist/widgets/widget-image-renderer.d.ts +4 -0
  2448. package/dist/widgets/widget-image-renderer.js +164 -0
  2449. package/dist/widgets/widget-matcher.d.ts +48 -0
  2450. package/dist/widgets/widget-matcher.js +109 -0
  2451. package/dist/widgets/widget-proposer.d.ts +17 -0
  2452. package/dist/widgets/widget-proposer.js +75 -0
  2453. package/dist/widgets/widget-registry.d.ts +36 -0
  2454. package/dist/widgets/widget-registry.js +231 -0
  2455. package/dist/widgets/widget-types.d.ts +100 -0
  2456. package/dist/widgets/widget-types.js +17 -0
  2457. package/dist/wizard/environment-detection.d.ts +71 -0
  2458. package/dist/wizard/environment-detection.js +252 -0
  2459. package/dist/wizard/onboarding.d.ts +26 -2
  2460. package/dist/wizard/onboarding.js +284 -49
  2461. package/dist/wizard/provider-onboarding.d.ts +2 -0
  2462. package/dist/wizard/provider-onboarding.js +55 -17
  2463. package/dist/workflows/state-manager.js +8 -2
  2464. package/dist/workspace/workspace-config.d.ts +37 -0
  2465. package/dist/workspace/workspace-config.js +199 -0
  2466. package/dist/workspace/workspace-isolation.d.ts +19 -0
  2467. package/dist/workspace/workspace-isolation.js +124 -39
  2468. package/dist/workspace/workspace-manager.js +19 -14
  2469. package/examples/claude_desktop_config.json +8 -0
  2470. package/package.json +80 -32
  2471. package/.codebuddy/README.md +0 -65
  2472. package/dist/agent/middleware/learning-first-middleware.d.ts +0 -79
  2473. package/dist/agent/middleware/learning-first-middleware.js +0 -271
  2474. package/dist/agent/middleware/tool-filter-middleware.d.ts +0 -45
  2475. package/dist/agent/middleware/tool-filter-middleware.js +0 -122
  2476. package/dist/codebuddy/tool-definitions/batch-tools.d.ts +0 -10
  2477. package/dist/codebuddy/tool-definitions/batch-tools.js +0 -46
  2478. package/dist/codebuddy/tool-definitions/graph-tools.d.ts +0 -13
  2479. package/dist/codebuddy/tool-definitions/graph-tools.js +0 -78
  2480. package/dist/plugins/code-explorer/CodeExplorerMCPClient.d.ts +0 -129
  2481. package/dist/plugins/code-explorer/CodeExplorerMCPClient.js +0 -143
  2482. package/dist/tools/registry/batch-tools.d.ts +0 -36
  2483. package/dist/tools/registry/batch-tools.js +0 -135
  2484. package/dist/tools/registry/graph-tools.d.ts +0 -45
  2485. package/dist/tools/registry/graph-tools.js +0 -283
@@ -6,7 +6,17 @@
6
6
  */
7
7
  import fs from 'fs';
8
8
  import path from 'path';
9
+ import { createHash } from 'node:crypto';
10
+ import { deriveArgumentObligations, isRuntimeEvidenceVerificationRequest, } from '../../conversation/argument-obligations.js';
11
+ import { shouldRunSemanticResponseGate } from '../../conversation/semantic-response-gate.js';
12
+ import { MODEL_NAME_PATTERN, clearSessionModelOverride, getSessionModelOverride, resolveChannelModel, setSessionModelOverride, __resetSessionModelOverridesForTests, } from '../../channels/channel-model-override.js';
9
13
  import { logger } from '../../utils/logger.js';
14
+ import { channelEnvToken, resolveChannelSecret } from '../../channels/resolve-channel-secret.js';
15
+ import { getChannelCognitivePort, } from '../../channels/channel-cognitive-port.js';
16
+ import { assembleCompanionChannelPrompt, channelWaitNoticeMs, companionWaitNoticeText, isCompanionSurfaceEnabled, shouldUseCompanionChannelProfile, } from '../../channels/companion-channel-profile.js';
17
+ import { runCompanionChannelTurn } from '../../channels/companion-channel-turn.js';
18
+ import { speakChannelProviderFailure } from '../../channels/provider-failure-speech.js';
19
+ import { prependUserFacingFailoverNotice } from '../../providers/provider-failover-user-notice.js';
10
20
  /**
11
21
  * Start every enabled channel from config and wire the inbound AI receiver loop
12
22
  * (`registerAIMessageHandler`). Shared by `buddy channels start` (CLI) and the
@@ -17,29 +27,72 @@ import { logger } from '../../utils/logger.js';
17
27
  * is the DM-pairing gate inside `registerAIMessageHandler`. Never throws on a
18
28
  * single channel failure — it collects the outcome per channel.
19
29
  */
20
- export async function startConfiguredChannels(configPath, onlyType) {
30
+ export async function startConfiguredChannels(configPath, onlyType, onlyInstance) {
21
31
  const { getChannelManager } = await import('../../channels/index.js');
22
32
  const manager = getChannelManager();
23
33
  await registerAIMessageHandler(manager);
24
- const result = { registered: [], skipped: [], failed: [], noConfig: false };
34
+ const result = {
35
+ registered: [],
36
+ skipped: [],
37
+ failed: [],
38
+ deduplicated: [],
39
+ noConfig: false,
40
+ };
25
41
  const config = loadChannelConfig(configPath);
26
42
  if (!config || config.channels.length === 0) {
27
43
  result.noConfig = true;
28
44
  return result;
29
45
  }
30
- for (const chConfig of config.channels) {
31
- if (onlyType && chConfig.type !== onlyType) {
32
- continue;
33
- }
46
+ const normalizedInstance = onlyInstance?.trim().toLowerCase();
47
+ const selected = config.channels.filter((entry) => {
48
+ if (onlyType && entry.type !== onlyType)
49
+ return false;
50
+ if (!normalizedInstance)
51
+ return true;
52
+ const configuredName = typeof entry.options?.name === 'string'
53
+ ? entry.options.name.trim().toLowerCase()
54
+ : '';
55
+ return normalizedInstance === 'default'
56
+ ? configuredName.length === 0
57
+ : configuredName === normalizedInstance;
58
+ });
59
+ if (selected.length === 0) {
60
+ result.noConfig = true;
61
+ return result;
62
+ }
63
+ const lastByType = new Map();
64
+ const counts = new Map();
65
+ for (const entry of selected) {
66
+ lastByType.set(entry.type, entry);
67
+ counts.set(entry.type, (counts.get(entry.type) ?? 0) + 1);
68
+ }
69
+ result.deduplicated = [...counts.entries()]
70
+ .filter(([, count]) => count > 1)
71
+ .map(([type]) => type);
72
+ for (const chConfig of lastByType.values()) {
34
73
  if (!chConfig.enabled) {
35
74
  result.skipped.push(chConfig.type);
36
75
  continue;
37
76
  }
38
77
  try {
78
+ // A repeated admin start or a duplicate config must never leave an old
79
+ // poller/socket alive behind the manager's type-keyed replacement.
80
+ const channelType = chConfig.type;
81
+ const existing = manager.getChannel(channelType);
82
+ if (existing) {
83
+ await existing.disconnect();
84
+ manager.unregisterChannel(channelType);
85
+ }
39
86
  const channel = await instantiateChannel(chConfig);
40
87
  if (channel) {
41
88
  manager.registerChannel(channel);
42
- await channel.connect();
89
+ try {
90
+ await channel.connect();
91
+ }
92
+ catch (connectErr) {
93
+ manager.unregisterChannel(channelType);
94
+ throw connectErr;
95
+ }
43
96
  result.registered.push(chConfig.type);
44
97
  }
45
98
  }
@@ -53,25 +106,99 @@ export async function startConfiguredChannels(configPath, onlyType) {
53
106
  return result;
54
107
  }
55
108
  function getChannelConfigPaths(configPath) {
109
+ const envConfigPath = process.env.CODEBUDDY_CHANNEL_CONFIG?.trim();
110
+ const home = process.env.HOME || process.env.USERPROFILE || '';
56
111
  return configPath
57
112
  ? [configPath]
58
- : [
59
- path.join(process.cwd(), '.codebuddy', 'channels.json'),
60
- path.join(process.env.HOME || process.env.USERPROFILE || '', '.codebuddy', 'channels.json'),
61
- ];
113
+ : envConfigPath
114
+ ? [envConfigPath]
115
+ : [
116
+ path.join(process.cwd(), '.codebuddy', 'channels.json'),
117
+ path.join(home, '.codebuddy', 'channels.json'),
118
+ path.join(process.cwd(), '.codebuddy', 'settings.json'),
119
+ path.join(home, '.codebuddy', 'settings.json'),
120
+ ];
121
+ }
122
+ function mapSettingsChannelEntry(key, value) {
123
+ if (!value || typeof value !== 'object' || Array.isArray(value))
124
+ return null;
125
+ const entry = value;
126
+ const type = typeof entry.type === 'string' && entry.type.trim() ? entry.type.trim() : key;
127
+ const options = {
128
+ ...(entry.options && typeof entry.options === 'object' && !Array.isArray(entry.options)
129
+ ? entry.options
130
+ : {}),
131
+ };
132
+ if (Array.isArray(entry.adminUsers))
133
+ options.adminUsers = entry.adminUsers;
134
+ const mapped = {
135
+ type,
136
+ enabled: entry.enabled !== false,
137
+ };
138
+ if (typeof entry.token === 'string')
139
+ mapped.token = entry.token;
140
+ if (typeof entry.webhookUrl === 'string')
141
+ mapped.webhookUrl = entry.webhookUrl;
142
+ if (Array.isArray(entry.allowedUsers)) {
143
+ mapped.allowedUsers = entry.allowedUsers.filter((item) => typeof item === 'string');
144
+ }
145
+ if (Array.isArray(entry.allowedChannels)) {
146
+ mapped.allowedChannels = entry.allowedChannels.filter((item) => typeof item === 'string');
147
+ }
148
+ if (Object.keys(options).length > 0)
149
+ mapped.options = options;
150
+ return mapped;
151
+ }
152
+ function asChannelConfig(raw) {
153
+ if (!raw || typeof raw !== 'object')
154
+ return null;
155
+ const channelsField = raw.channels;
156
+ if (Array.isArray(channelsField)) {
157
+ return { channels: channelsField };
158
+ }
159
+ if (channelsField && typeof channelsField === 'object') {
160
+ const channels = Object.entries(channelsField)
161
+ .map(([key, value]) => mapSettingsChannelEntry(key, value))
162
+ .filter((entry) => entry !== null);
163
+ if (channels.length === 0)
164
+ return null;
165
+ return { channels };
166
+ }
167
+ return null;
168
+ }
169
+ function applyEnvChannelTokens(config) {
170
+ const telegramToken = channelEnvToken('telegram');
171
+ if (!telegramToken)
172
+ return config;
173
+ const existing = config.channels.find((channel) => channel.type === 'telegram');
174
+ if (existing) {
175
+ if (!existing.token)
176
+ existing.token = telegramToken;
177
+ return config;
178
+ }
179
+ return {
180
+ channels: [...config.channels, { type: 'telegram', enabled: true, token: telegramToken }],
181
+ };
62
182
  }
63
183
  export function loadChannelConfigWithPath(configPath) {
64
184
  for (const p of getChannelConfigPaths(configPath)) {
65
185
  try {
66
186
  if (fs.existsSync(p)) {
67
187
  const content = fs.readFileSync(p, 'utf-8');
68
- return { config: JSON.parse(content), path: p };
188
+ const parsed = asChannelConfig(JSON.parse(content));
189
+ if (!parsed)
190
+ continue;
191
+ return { config: applyEnvChannelTokens(parsed), path: p };
69
192
  }
70
193
  }
71
194
  catch (err) {
72
195
  logger.debug(`Failed to load channel config from ${p}`, { error: err instanceof Error ? err.message : String(err) });
73
196
  }
74
197
  }
198
+ const fromEnv = applyEnvChannelTokens({ channels: [] });
199
+ if (fromEnv.channels.length > 0) {
200
+ return { config: fromEnv, path: 'env:TELEGRAM_BOT_TOKEN' };
201
+ }
75
202
  return null;
76
203
  }
77
204
  export function loadChannelConfig(configPath) {
@@ -171,6 +298,9 @@ export function buildChannelStatusReport(allStatus, configPath, generatedAt = ne
171
298
  connected: status.connected,
172
299
  authenticated: status.authenticated,
173
300
  ...(status.lastActivity ? { lastActivity: status.lastActivity.toISOString() } : {}),
301
+ ...(status.lastSuccessfulPoll
302
+ ? { lastSuccessfulPoll: status.lastSuccessfulPoll.toISOString() }
303
+ : {}),
174
304
  ...(status.error ? { error: status.error } : {}),
175
305
  ...(status.info ? { info: status.info } : {}),
176
306
  }))
@@ -242,7 +372,10 @@ export async function handleChannels(action, options) {
242
372
  }
243
373
  console.log('Channel Status:\n');
244
374
  for (const [type, status] of Object.entries(allStatus)) {
245
- console.log(` ${type}: ${status.connected ? 'connected' : 'disconnected'}${status.error ? ` (error: ${status.error})` : ''}`);
375
+ const pollStatus = type === 'telegram'
376
+ ? `, last successful poll: ${status.lastSuccessfulPoll?.toISOString() ?? 'never'}`
377
+ : '';
378
+ console.log(` ${type}: ${status.connected ? 'connected' : 'disconnected'}${pollStatus}${status.error ? ` (error: ${status.error})` : ''}`);
246
379
  }
247
380
  if (Object.keys(allStatus).length === 0) {
248
381
  console.log(' No channels registered.');
@@ -255,7 +388,7 @@ export async function handleChannels(action, options) {
255
388
  const channelType = options.type;
256
389
  if (!channelType) {
257
390
  // Start all configured channels (shared with `buddy server` intake)
258
- const result = await startConfiguredChannels(options.config);
391
+ const result = await startConfiguredChannels(options.config, undefined, options.instance);
259
392
  if (result.noConfig) {
260
393
  console.log('No channel configuration found. Create .codebuddy/channels.json or use --config.');
261
394
  return;
@@ -263,25 +396,55 @@ export async function handleChannels(action, options) {
263
396
  for (const t of result.registered) {
264
397
  console.log(`[OK] ${t} channel started`);
265
398
  }
399
+ for (const t of result.deduplicated) {
400
+ console.log(`[SKIP] duplicate ${t} config collapsed (last declaration used)`);
401
+ }
266
402
  for (const f of result.failed) {
267
403
  console.log(`[FAIL] ${f.type}: ${f.error}`);
268
404
  }
405
+ if (result.failed.length > 0 && result.registered.length === 0) {
406
+ process.exitCode = 1;
407
+ }
269
408
  }
270
409
  else {
271
- const result = await startConfiguredChannels(options.config, channelType);
410
+ const result = await startConfiguredChannels(options.config, channelType, options.instance);
272
411
  if (result.noConfig) {
273
412
  console.log(`No configuration found for channel type: ${channelType}`);
413
+ process.exitCode = 1;
274
414
  return;
275
415
  }
276
416
  for (const t of result.registered) {
277
417
  console.log(`[OK] ${t} channel started`);
278
418
  }
419
+ for (const t of result.deduplicated) {
420
+ console.log(`[SKIP] duplicate ${t} config collapsed (last declaration used)`);
421
+ }
279
422
  for (const t of result.skipped) {
280
423
  console.log(`[SKIP] ${t} channel disabled`);
281
424
  }
282
425
  for (const f of result.failed) {
283
426
  console.log(`[FAIL] ${f.type}: ${f.error}`);
284
427
  }
428
+ if (result.failed.length > 0 && result.registered.length === 0) {
429
+ process.exitCode = 1;
430
+ }
431
+ }
432
+ break;
433
+ }
434
+ case 'pairing': {
435
+ const { getDMPairing } = await import('../../channels/dm-pairing.js');
436
+ const pairing = getDMPairing();
437
+ const stats = pairing.getStats();
438
+ console.log(`DM pairing: ${stats.enabled ? 'on' : 'off'} (DM_PAIRING_ENABLED, default on)`);
439
+ console.log(`Approved senders: ${stats.totalApproved}`);
440
+ const pending = pairing.listPending();
441
+ if (pending.length === 0) {
442
+ console.log('No pending pairing codes. An unknown DM generates a one-time code logged server-side only.');
443
+ break;
444
+ }
445
+ console.log(`Pending one-time codes (${pending.length}):`);
446
+ for (const request of pending) {
447
+ console.log(` [${request.channelType}] sender=${request.senderId} code=${request.code} expires=${request.expiresAt.toISOString()}`);
285
448
  }
286
449
  break;
287
450
  }
@@ -305,17 +468,348 @@ export async function handleChannels(action, options) {
305
468
  break;
306
469
  }
307
470
  default:
308
- console.log(`Usage: buddy channels [start|stop|status|list] [--type <type>] [--config <path>]`);
471
+ console.log(`Usage: buddy channels [start|stop|status|list|pairing] [--type <type>] [--instance <name|default>] [--config <path>]`);
309
472
  }
310
473
  }
311
474
  let aiHandlerRegistered = false;
475
+ const LISA_SELFIE_CONTINUATION_TTL_MS = 15 * 60_000;
476
+ const recentLisaSelfieSessions = new Map();
312
477
  /** Reset the one-shot registration guard. Test-only — never call in production. */
313
478
  export function __resetChannelAIHandlerForTests() {
314
479
  aiHandlerRegistered = false;
480
+ for (const key of channelAgentCache.keys()) {
481
+ evictChannelAgent(key, true);
482
+ }
483
+ channelTurnTails.clear();
484
+ channelBotPersonas.clear();
485
+ companionChannelHistories.clear();
486
+ recentLisaSelfieSessions.clear();
487
+ __resetSessionModelOverridesForTests();
315
488
  }
316
489
  const channelAgentCache = new Map();
490
+ const channelTurnTails = new Map();
491
+ const companionChannelHistories = new Map();
317
492
  const CHANNEL_AGENT_IDLE_MS = 2 * 60 * 60 * 1000; // evict after 2h idle
318
493
  const CHANNEL_AGENT_MAX = 50;
494
+ const DEFAULT_CHANNEL_TURN_TIMEOUT_MS = 3 * 60 * 1000;
495
+ const MIN_CHANNEL_TURN_TIMEOUT_MS = 1_000;
496
+ const MAX_CHANNEL_TURN_TIMEOUT_MS = 15 * 60 * 1000;
497
+ const CHANNEL_TURN_TIMEOUT_CLEANUP_MS = 10_000;
498
+ class ChannelTurnTimeoutError extends Error {
499
+ timeoutMs;
500
+ phase;
501
+ constructor(timeoutMs, phase) {
502
+ super(`channel turn timed out after ${timeoutMs}ms during ${phase}`);
503
+ this.timeoutMs = timeoutMs;
504
+ this.phase = phase;
505
+ this.name = 'ChannelTurnTimeoutError';
506
+ }
507
+ }
508
+ function channelTurnTimeoutMs(env = process.env) {
509
+ const configured = Number(env.CODEBUDDY_CHANNEL_TURN_TIMEOUT_MS);
510
+ if (!Number.isFinite(configured) || configured <= 0)
511
+ return DEFAULT_CHANNEL_TURN_TIMEOUT_MS;
512
+ return Math.min(MAX_CHANNEL_TURN_TIMEOUT_MS, Math.max(MIN_CHANNEL_TURN_TIMEOUT_MS, Math.floor(configured)));
513
+ }
514
+ function evictChannelAgent(sessionKey, discard = false) {
515
+ const cached = channelAgentCache.get(sessionKey);
516
+ channelAgentCache.delete(sessionKey);
517
+ try {
518
+ if (discard)
519
+ cached?.agent.dispose({ skipSessionLearning: true });
520
+ else
521
+ cached?.agent.dispose();
522
+ }
523
+ catch {
524
+ // Eviction must remain best-effort; the cache reference is already gone.
525
+ }
526
+ }
527
+ /**
528
+ * One in-flight generative turn per conversation. Commands and remote approval
529
+ * are handled before this queue, so an approval can still unblock a waiting
530
+ * tool while assistant drafts cannot race into the next turn's history.
531
+ */
532
+ async function serializeChannelTurn(sessionKey, task, lifecycle = {}) {
533
+ const queuedAt = Date.now();
534
+ const previous = channelTurnTails.get(sessionKey) ?? Promise.resolve();
535
+ const run = previous.catch(() => undefined).then(async () => {
536
+ const startedAt = Date.now();
537
+ const timeoutMs = channelTurnTimeoutMs();
538
+ const controller = new AbortController();
539
+ let phase = 'starting';
540
+ let watchdogCount = 0;
541
+ const diagnosticFields = {
542
+ ...lifecycle.diagnostics,
543
+ queueWaitMs: startedAt - queuedAt,
544
+ };
545
+ logger.info('Channel turn started', diagnosticFields);
546
+ lifecycle.onStart?.();
547
+ const watchdogIntervalMs = Math.min(30_000, Math.max(1_000, Math.floor(timeoutMs / 3)));
548
+ const watchdog = setInterval(() => {
549
+ watchdogCount++;
550
+ logger.warn('Channel turn watchdog still active', {
551
+ ...diagnosticFields,
552
+ phase,
553
+ elapsedMs: Date.now() - startedAt,
554
+ watchdogCount,
555
+ });
556
+ }, watchdogIntervalMs);
557
+ watchdog.unref?.();
558
+ let timeout;
559
+ let timeoutCleanup;
560
+ const timeoutError = new Promise((_, reject) => {
561
+ timeout = setTimeout(() => {
562
+ const error = new ChannelTurnTimeoutError(timeoutMs, phase);
563
+ controller.abort(error);
564
+ logger.error('Channel turn watchdog timed out', {
565
+ ...diagnosticFields,
566
+ phase,
567
+ elapsedMs: Date.now() - startedAt,
568
+ timeoutMs,
569
+ });
570
+ const cleanup = Promise.resolve(lifecycle.onTimeout?.(error))
571
+ .catch((cleanupError) => {
572
+ logger.warn('Channel turn timeout cleanup failed', {
573
+ ...diagnosticFields,
574
+ error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),
575
+ });
576
+ })
577
+ .then(() => true);
578
+ let cleanupTimer;
579
+ const cleanupDeadline = new Promise((resolve) => {
580
+ cleanupTimer = setTimeout(() => resolve(false), CHANNEL_TURN_TIMEOUT_CLEANUP_MS);
581
+ cleanupTimer.unref?.();
582
+ });
583
+ timeoutCleanup = Promise.race([cleanup, cleanupDeadline]).then((completed) => {
584
+ if (cleanupTimer)
585
+ clearTimeout(cleanupTimer);
586
+ if (!completed) {
587
+ logger.warn('Channel turn timeout cleanup exceeded deadline', {
588
+ ...diagnosticFields,
589
+ cleanupTimeoutMs: CHANNEL_TURN_TIMEOUT_CLEANUP_MS,
590
+ });
591
+ }
592
+ });
593
+ void timeoutCleanup.finally(() => reject(error));
594
+ }, timeoutMs);
595
+ timeout.unref?.();
596
+ });
597
+ const control = {
598
+ signal: controller.signal,
599
+ phase(nextPhase) {
600
+ phase = nextPhase;
601
+ logger.info('Channel turn phase', {
602
+ ...diagnosticFields,
603
+ phase,
604
+ elapsedMs: Date.now() - startedAt,
605
+ });
606
+ },
607
+ throwIfAborted() {
608
+ if (controller.signal.aborted)
609
+ throw controller.signal.reason;
610
+ },
611
+ };
612
+ try {
613
+ const controlledTask = task(control).catch(async (error) => {
614
+ // Abort checks inside the task can observe the timeout immediately.
615
+ // Keep the FIFO closed until timeout cleanup (including the visible
616
+ // fail-soft reply) has completed.
617
+ if (controller.signal.aborted && timeoutCleanup)
618
+ await timeoutCleanup;
619
+ throw error;
620
+ });
621
+ return await Promise.race([controlledTask, timeoutError]);
622
+ }
623
+ finally {
624
+ if (timeout)
625
+ clearTimeout(timeout);
626
+ clearInterval(watchdog);
627
+ lifecycle.onSettled?.();
628
+ logger.info('Channel turn settled', {
629
+ ...diagnosticFields,
630
+ phase,
631
+ elapsedMs: Date.now() - startedAt,
632
+ timedOut: controller.signal.aborted,
633
+ });
634
+ }
635
+ });
636
+ const tail = run.then(() => undefined, () => undefined);
637
+ channelTurnTails.set(sessionKey, tail);
638
+ try {
639
+ return await run;
640
+ }
641
+ finally {
642
+ if (channelTurnTails.get(sessionKey) === tail)
643
+ channelTurnTails.delete(sessionKey);
644
+ }
645
+ }
646
+ const CONVERSATIONAL_SLASH_VERBS = new Set([
647
+ 'analyse',
648
+ 'analyze',
649
+ 'cherche',
650
+ 'compare',
651
+ 'dis',
652
+ 'donne',
653
+ 'explique',
654
+ 'find',
655
+ 'montre',
656
+ 'raconte',
657
+ 'resume',
658
+ 'résume',
659
+ 'show',
660
+ 'tell',
661
+ ]);
662
+ /** Telegram users sometimes prefix a natural request with `/` as if it were a prompt box. */
663
+ function normalizeConversationalSlashMessage(message) {
664
+ const match = message.content.trim().match(/^\/([^\s@]+)(?:@[^\s]+)?\s+([\s\S]+)$/u);
665
+ const verb = match?.[1]?.toLocaleLowerCase('fr');
666
+ if (!match || !verb || !CONVERSATIONAL_SLASH_VERBS.has(verb))
667
+ return message;
668
+ return {
669
+ ...message,
670
+ content: `${match[1]} ${match[2]}`.trim(),
671
+ contentType: 'text',
672
+ isCommand: false,
673
+ commandName: undefined,
674
+ commandArgs: undefined,
675
+ };
676
+ }
677
+ /** Keep long or queued channel turns visibly alive without sending chat noise. */
678
+ function startChannelTypingHeartbeat(channel, channelId) {
679
+ const typingChannel = channel;
680
+ if (typeof typingChannel.sendTyping !== 'function')
681
+ return () => undefined;
682
+ let stopped = false;
683
+ let inFlight = false;
684
+ const reportFailure = (error) => {
685
+ logger.debug('Channel typing indicator unavailable', {
686
+ channelType: channel.type,
687
+ channelHash: hashForLog(channelId),
688
+ errorType: error instanceof Error ? error.name : 'unknown',
689
+ });
690
+ };
691
+ const ping = () => {
692
+ if (stopped || inFlight)
693
+ return;
694
+ inFlight = true;
695
+ void Promise.resolve()
696
+ .then(() => typingChannel.sendTyping(channelId))
697
+ .catch(reportFailure)
698
+ .finally(() => {
699
+ inFlight = false;
700
+ });
701
+ };
702
+ ping();
703
+ // Telegram displays sendChatAction for about five seconds. Refresh slightly
704
+ // before expiry while a turn waits in the per-session FIFO or runs the model.
705
+ const timer = setInterval(ping, 4_000);
706
+ timer.unref?.();
707
+ return () => {
708
+ stopped = true;
709
+ clearInterval(timer);
710
+ };
711
+ }
712
+ function channelTypingLifecycle(channel, channelId) {
713
+ let stopTyping = () => undefined;
714
+ return {
715
+ onStart: () => {
716
+ stopTyping = startChannelTypingHeartbeat(channel, channelId);
717
+ },
718
+ onSettled: () => stopTyping(),
719
+ };
720
+ }
721
+ function channelWaitNoticeLifecycle(channel, channelId, replyTo) {
722
+ const delayMs = channelWaitNoticeMs();
723
+ let timer;
724
+ let stopped = false;
725
+ return {
726
+ onStart: () => {
727
+ if (delayMs <= 0)
728
+ return;
729
+ timer = setTimeout(() => {
730
+ if (stopped)
731
+ return;
732
+ void channel
733
+ .send({
734
+ channelId,
735
+ content: companionWaitNoticeText(),
736
+ ...(replyTo ? { replyTo } : {}),
737
+ })
738
+ .catch((error) => {
739
+ logger.debug('Channel wait notice skipped', {
740
+ error: error instanceof Error ? error.message : String(error),
741
+ });
742
+ });
743
+ }, delayMs);
744
+ timer.unref?.();
745
+ },
746
+ onSettled: () => {
747
+ stopped = true;
748
+ if (timer)
749
+ clearTimeout(timer);
750
+ },
751
+ };
752
+ }
753
+ function rememberCompanionChannelTurn(sessionKey, userText, assistantText) {
754
+ const previous = companionChannelHistories.get(sessionKey) ?? [];
755
+ companionChannelHistories.set(sessionKey, [
756
+ ...previous,
757
+ { role: 'user', content: userText },
758
+ { role: 'assistant', content: assistantText },
759
+ ].slice(-20));
760
+ }
761
+ function hashForLog(value) {
762
+ if (value === undefined || value === null || value === '')
763
+ return undefined;
764
+ return createHash('sha256').update(String(value)).digest('hex').slice(0, 12);
765
+ }
766
+ function isAgentFailureResponse(value) {
767
+ return /^Sorry, I encountered an error:/i.test(value.trim());
768
+ }
769
+ function channelHistoryTurn(entry) {
770
+ const role = entry.role ?? entry.type;
771
+ if (role !== 'user' && role !== 'assistant')
772
+ return null;
773
+ if (typeof entry.content !== 'string')
774
+ return null;
775
+ const content = entry.content
776
+ .replace(/<companion_turn>[\s\S]*?<\/companion_turn>\s*/g, '')
777
+ .replace(/^Message de l'utilisateur\s*:\s*/i, '')
778
+ .trim();
779
+ return content ? { role, content } : null;
780
+ }
781
+ /**
782
+ * Read the real Telegram/channel discussion before choosing the companion
783
+ * model. Warm agents are authoritative; a cold daemon falls back to the same
784
+ * persisted SessionStore used by restoreChannelSession().
785
+ */
786
+ async function resolveChannelRoutingHistory(sessionKey, sharedHistory) {
787
+ if (sharedHistory.length > 0)
788
+ return sharedHistory.slice(-12);
789
+ const cached = channelAgentCache.get(sessionKey)?.agent;
790
+ if (cached) {
791
+ return cached
792
+ .getChatHistory()
793
+ .flatMap((entry) => {
794
+ const turn = channelHistoryTurn(entry);
795
+ return turn ? [turn] : [];
796
+ })
797
+ .slice(-12);
798
+ }
799
+ try {
800
+ const { getSessionStore } = await import('../../persistence/session-store.js');
801
+ const session = await getSessionStore().loadSession(sessionKey);
802
+ return (session?.messages ?? [])
803
+ .flatMap((entry) => {
804
+ const turn = channelHistoryTurn(entry);
805
+ return turn ? [turn] : [];
806
+ })
807
+ .slice(-12);
808
+ }
809
+ catch {
810
+ return [];
811
+ }
812
+ }
319
813
  const channelBotPersonas = new Map();
320
814
  export function registerChannelBotPersona(botId, persona) {
321
815
  if (botId)
@@ -368,20 +862,54 @@ async function persistChannelSession(agent, sessionKey) {
368
862
  logger.warn(`channel session persist failed: ${err instanceof Error ? err.message : String(err)}`);
369
863
  }
370
864
  }
371
- async function getOrCreateChannelAgent(sessionKey, resolved, agentConfig, botId) {
865
+ async function getOrCreateChannelAgent(sessionKey, resolved, agentConfig, botId, routeModel, companionRoute) {
372
866
  const now = Date.now();
373
867
  // Evict idle agents first.
374
868
  for (const [key, cached] of channelAgentCache) {
375
869
  if (now - cached.lastUsed > CHANNEL_AGENT_IDLE_MS)
376
- channelAgentCache.delete(key);
870
+ evictChannelAgent(key);
377
871
  }
872
+ // Per-bot persona (multi-bot): a bot may define its own model + system prompt.
873
+ const persona = botId ? channelBotPersonas.get(botId) : undefined;
874
+ // Hermes-style tiers, finest scope first: /model session override > matched
875
+ // route > bot persona > merged route default (includes the router-wide
876
+ // defaultAgent fallback — kept below persona) > provider default.
877
+ const { model, source } = resolveChannelModel({
878
+ sessionOverride: getSessionModelOverride(sessionKey),
879
+ routeModel,
880
+ personaModel: persona?.model,
881
+ companionModel: companionRoute?.model,
882
+ routeDefaultModel: agentConfig.model,
883
+ globalModel: resolved.model,
884
+ });
885
+ const runtimeResolved = source === 'companion-profile' && companionRoute
886
+ ? {
887
+ apiKey: companionRoute.apiKey,
888
+ baseUrl: companionRoute.baseURL,
889
+ model: companionRoute.model,
890
+ egress: companionRoute.egress,
891
+ }
892
+ : resolved;
893
+ const runtimeIdentity = createHash('sha256')
894
+ .update(`${runtimeResolved.apiKey}:${runtimeResolved.baseUrl}`)
895
+ .digest('hex')
896
+ .slice(0, 16);
378
897
  const hit = channelAgentCache.get(sessionKey);
379
- if (hit) {
898
+ if (hit && hit.runtimeIdentity === runtimeIdentity) {
380
899
  hit.lastUsed = now;
381
- return hit.agent;
900
+ // Reconcile a changed override on the cached agent (no eviction — the
901
+ // in-memory conversation history is what makes the chat feel continuous).
902
+ if (hit.agent.getCurrentModel() !== model)
903
+ hit.agent.setModel(model);
904
+ return {
905
+ agent: hit.agent,
906
+ effectiveRuntime: { ...runtimeResolved, model, egress: runtimeResolved.egress ?? 'cloud' },
907
+ };
382
908
  }
383
- // Per-bot persona (multi-bot): a bot may define its own model + system prompt.
384
- const persona = botId ? channelBotPersonas.get(botId) : undefined;
909
+ // A provider/endpoint change cannot be applied through setModel(). Recreate
910
+ // the agent, then restore its persisted transcript below.
911
+ if (hit)
912
+ evictChannelAgent(sessionKey);
385
913
  // Opt-in Code Explorer nudge (set CODE_EXPLORER_BIN): some models won't reach
386
914
  // for the code-graph MCP tools on their own and just say "I can't" — tell them
387
915
  // plainly that they can, and give the CLI fallback. No-op when the env is unset.
@@ -394,13 +922,19 @@ async function getOrCreateChannelAgent(sessionKey, resolved, agentConfig, botId)
394
922
  // path it names — the handler then delivers that file to the chat as a photo.
395
923
  const pythonHint = 'ACTING vs SHOWING: when the user asks you to draw, plot, generate, create, compute or build something, you MUST actually DO it by running tools/code now — do NOT just print the code or instructions and stop. Execute it and deliver the real artifact. ' +
396
924
  'For Python work needing packages (plotting, data, etc.): do NOT use `pip`/`pip3 install` (system Python is PEP 668-locked). Use `uv` — e.g. write the script to a file then run `uv run --with matplotlib --with pandas --with numpy python /tmp/plot.py` (matplotlib must use the Agg backend). When you produce a chart/image, SAVE it to an absolute path like `/tmp/<name>.png` and state that exact path in your reply — it is then sent to the user automatically as a photo.';
397
- const channelSystemPromptAppend = [persona?.systemPrompt, codeExplorerHint, pythonHint].filter(Boolean).join('\n\n') || undefined;
925
+ // System prompts APPEND (constructor arg 8, wrapped in <runtime_persona>)
926
+ // never the full-replace arg 9, which would drop the tool-calling base prompt
927
+ // and break tools on the channel path. Persona (bot identity) first, then the
928
+ // matched route's prompt (conversation instruction — more specific, later =
929
+ // higher salience). Both are complementary, not competing.
930
+ const channelSystemPromptAppend = [persona?.systemPrompt, agentConfig.systemPrompt, codeExplorerHint, pythonHint].filter(Boolean).join('\n\n') ||
931
+ undefined;
398
932
  const { CodeBuddyAgent } = await import('../../agent/codebuddy-agent.js');
399
- const model = persona?.model || agentConfig.model || resolved.model;
400
- const agent = new CodeBuddyAgent(resolved.apiKey || 'local', resolved.baseUrl, model, agentConfig.maxToolRounds ?? 6, // bounded (vs the 50-round default)
933
+ const agent = new CodeBuddyAgent(runtimeResolved.apiKey || 'local', runtimeResolved.baseUrl, model, agentConfig.maxToolRounds ?? 6, // bounded (vs the 50-round default)
401
934
  true, // useRAGToolSelection — relevant tools on demand, not all ~194
402
935
  process.env.CODEBUDDY_CHANNEL_PROMPT_ID || 'auto', // minimal/adaptive prompt, not the 73KB legacy
403
936
  process.cwd(), channelSystemPromptAppend);
937
+ agent.setRecoverySessionId?.(sessionKey);
404
938
  // Scope per-bot state (memory/lessons) to this bot so bots don't share facts.
405
939
  agent.setChannelBotId(botId);
406
940
  // Persistence: reload prior conversation from disk on a cold agent (after a
@@ -417,36 +951,202 @@ async function getOrCreateChannelAgent(sessionKey, resolved, agentConfig, botId)
417
951
  }
418
952
  }
419
953
  if (lruKey)
420
- channelAgentCache.delete(lruKey);
954
+ evictChannelAgent(lruKey);
421
955
  }
422
- channelAgentCache.set(sessionKey, { agent, lastUsed: now });
423
- return agent;
956
+ channelAgentCache.set(sessionKey, { agent, lastUsed: now, runtimeIdentity });
957
+ return {
958
+ agent,
959
+ effectiveRuntime: { ...runtimeResolved, model, egress: runtimeResolved.egress ?? 'cloud' },
960
+ };
961
+ }
962
+ function isChannelAllowlistedSender(channel, message) {
963
+ if (typeof channel.getAllowedUsers !== 'function')
964
+ return false;
965
+ const listed = channel.getAllowedUsers();
966
+ if (!listed || listed.length === 0)
967
+ return false;
968
+ const identities = [message.sender?.id, message.sender?.username].filter((value) => Boolean(value));
969
+ if (identities.length === 0)
970
+ return false;
971
+ const allowed = new Set(listed.map((entry) => entry.trim().replace(/^@/, '').toLowerCase()));
972
+ return identities.some((identity) => allowed.has(identity.trim().replace(/^@/, '').toLowerCase()));
424
973
  }
425
974
  export async function registerAIMessageHandler(manager) {
426
975
  if (aiHandlerRegistered)
427
976
  return;
428
977
  aiHandlerRegistered = true;
429
978
  manager.onMessage(async (message, channel) => {
979
+ let releaseTranscriptSnapshotHold;
980
+ let generativeSessionKey;
981
+ let generativeTurnEngaged = false;
982
+ let cognitiveTurn = null;
983
+ let deliveryState = 'not_started';
430
984
  try {
431
985
  // 1. DM pairing gate — unapproved senders get a code, then we stop.
986
+ // A sender already on the channel static allowlist skipped pairing in the
987
+ // adapter; do not re-gate them here (pairing default-on would otherwise
988
+ // refuse the operator's own Telegram id).
432
989
  const { checkDMPairing, getDMPairing } = await import('../../channels/core.js');
433
- const pairingStatus = await checkDMPairing(message);
434
- if (!pairingStatus.approved) {
435
- if (pairingStatus.code) {
990
+ if (!isChannelAllowlistedSender(channel, message)) {
991
+ const pairingStatus = await checkDMPairing(message);
992
+ if (!pairingStatus.approved) {
436
993
  const pairing = getDMPairing();
437
994
  const pairingMsg = pairing.getPairingMessage(pairingStatus);
438
- await channel.send({
439
- channelId: message.channel.id,
440
- content: pairingMsg,
441
- replyTo: message.id,
442
- });
995
+ if (pairingMsg) {
996
+ await channel.send({
997
+ channelId: message.channel.id,
998
+ content: pairingMsg,
999
+ replyTo: message.id,
1000
+ });
1001
+ }
1002
+ return;
443
1003
  }
444
- return;
445
1004
  }
446
1005
  // Nothing to answer (e.g. a non-text message with no transcription).
447
1006
  if (!message.content || !message.content.trim()) {
448
1007
  return;
449
1008
  }
1009
+ try {
1010
+ const { observeInboundForAwayPause } = await import('../../companion/away-mode.js');
1011
+ observeInboundForAwayPause(channel.type, message.content);
1012
+ }
1013
+ catch {
1014
+ /* travel-mode pause is optional and must never block inbound chat */
1015
+ }
1016
+ const sessionKey = message.sessionKey || 'default-global';
1017
+ // On-demand camera share (« qu'est-ce que tu vois ? ») — Telegram only.
1018
+ // The photo sender is scoped to the requesting chat, not the global alert chat.
1019
+ if (channel.type === 'telegram') {
1020
+ try {
1021
+ const { maybeHandleCameraShareRequest } = await import('../../companion/camera-share.js');
1022
+ const share = await maybeHandleCameraShareRequest(message.content, {
1023
+ surface: 'telegram',
1024
+ inboundChatId: message.channel.id,
1025
+ rootDir: process.cwd(),
1026
+ sendPhoto: async (caption, imagePath) => {
1027
+ const imageChannel = channel;
1028
+ if (typeof imageChannel.sendImageFile === 'function') {
1029
+ await imageChannel.sendImageFile(message.channel.id, imagePath, caption);
1030
+ return true;
1031
+ }
1032
+ const path = await import('node:path');
1033
+ const extension = path.extname(imagePath).slice(1).toLowerCase();
1034
+ const sent = await imageChannel.send({
1035
+ channelId: message.channel.id,
1036
+ content: caption,
1037
+ replyTo: message.id,
1038
+ attachments: [{
1039
+ type: 'image',
1040
+ filePath: imagePath,
1041
+ fileName: path.basename(imagePath),
1042
+ mimeType: extension === 'jpg' || extension === 'jpeg'
1043
+ ? 'image/jpeg'
1044
+ : `image/${extension || 'png'}`,
1045
+ }],
1046
+ });
1047
+ return Boolean(sent?.success);
1048
+ },
1049
+ });
1050
+ if (share) {
1051
+ await channel.send({
1052
+ channelId: message.channel.id,
1053
+ content: share.spokenReply,
1054
+ replyTo: message.id,
1055
+ });
1056
+ return;
1057
+ }
1058
+ }
1059
+ catch (cameraShareErr) {
1060
+ logger.warn('Camera share channel path failed', {
1061
+ error: cameraShareErr instanceof Error ? cameraShareErr.message : String(cameraShareErr),
1062
+ });
1063
+ }
1064
+ }
1065
+ // Lisa selfie — cache-first, BEFORE the LLM. Companion profile has no tools,
1066
+ // so a description of lisa_selfie / image_generate never fires here.
1067
+ if (process.env.CODEBUDDY_LISA_SELFIE !== 'false'
1068
+ && isCompanionSurfaceEnabled()) {
1069
+ try {
1070
+ const { tryServeCompanionSelfie } = await import('../../companion/lisa-selfie-router.js');
1071
+ const previousSelfie = recentLisaSelfieSessions.get(sessionKey);
1072
+ const hasRecentSelfie = previousSelfie !== undefined
1073
+ && Date.now() - previousSelfie.at <= LISA_SELFIE_CONTINUATION_TTL_MS;
1074
+ if (previousSelfie && !hasRecentSelfie)
1075
+ recentLisaSelfieSessions.delete(sessionKey);
1076
+ const served = await tryServeCompanionSelfie(message.content, {
1077
+ surface: channel.type === 'telegram' ? 'telegram' : 'mobile',
1078
+ hasRecentSelfie,
1079
+ includeImageBytes: false,
1080
+ });
1081
+ if (served) {
1082
+ if (served.imagePath) {
1083
+ const ch = channel;
1084
+ if (typeof ch.sendImageFile === 'function') {
1085
+ await ch.sendImageFile(message.channel.id, served.imagePath, served.caption);
1086
+ }
1087
+ else {
1088
+ const pathMod = await import('node:path');
1089
+ const ext = pathMod.extname(served.imagePath).slice(1) || 'png';
1090
+ await ch.send({
1091
+ channelId: message.channel.id,
1092
+ content: served.caption,
1093
+ replyTo: message.id,
1094
+ attachments: [
1095
+ {
1096
+ type: 'image',
1097
+ filePath: served.imagePath,
1098
+ fileName: pathMod.basename(served.imagePath),
1099
+ mimeType: served.mimeType
1100
+ ?? (ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : `image/${ext}`),
1101
+ },
1102
+ ],
1103
+ });
1104
+ }
1105
+ recentLisaSelfieSessions.set(sessionKey, {
1106
+ at: Date.now(),
1107
+ mood: served.style ?? 'portrait',
1108
+ contentTier: served.contentTier,
1109
+ });
1110
+ }
1111
+ else {
1112
+ await channel.send({
1113
+ channelId: message.channel.id,
1114
+ content: served.caption,
1115
+ replyTo: message.id,
1116
+ });
1117
+ }
1118
+ // The selfie IS a turn of the conversation: without this the next
1119
+ // companion prompt has no trace of the photo that was just sent.
1120
+ rememberCompanionChannelTurn(sessionKey, message.content, served.caption);
1121
+ return;
1122
+ }
1123
+ }
1124
+ catch (selfieErr) {
1125
+ logger.warn('Lisa selfie channel path failed', {
1126
+ error: selfieErr instanceof Error ? selfieErr.message : String(selfieErr),
1127
+ });
1128
+ // fall through to normal AI handler
1129
+ }
1130
+ }
1131
+ const botId = message.channel?.botId;
1132
+ logger.info('Channel inbound message', {
1133
+ channelType: channel.type,
1134
+ sessionHash: hashForLog(sessionKey),
1135
+ botHash: hashForLog(botId),
1136
+ messageHash: hashForLog(message.id),
1137
+ contentType: message.contentType || 'text',
1138
+ contentLength: message.content.length,
1139
+ attachmentCount: message.attachments?.length ?? 0,
1140
+ });
1141
+ const normalizedMessage = normalizeConversationalSlashMessage(message);
1142
+ if (normalizedMessage !== message) {
1143
+ message = normalizedMessage;
1144
+ logger.info('Channel slash prompt reclassified as conversation', {
1145
+ channelType: channel.type,
1146
+ sessionHash: hashForLog(sessionKey),
1147
+ messageHash: hashForLog(message.id),
1148
+ });
1149
+ }
450
1150
  // /council <task> — convene the multi-LLM council (ask several capable
451
1151
  // LLMs, an impartial judge keeps the best, and it learns which model is
452
1152
  // best per task type over time). `/council` alone shows the scoreboard.
@@ -546,97 +1246,978 @@ export async function registerAIMessageHandler(manager) {
546
1246
  ? process.env.CODEBUDDY_PROVIDER
547
1247
  : 'auto';
548
1248
  const resolved = resolveProviderFromEnv(preferredProvider);
549
- if (!resolved) {
550
- logger.warn('No LLM provider for channel chat — set CODEBUDDY_PROVIDER + a provider key/env');
1249
+ const { getRouteAgentConfig, resolveRoute } = await import('../../channels/core.js');
1250
+ const agentConfig = getRouteAgentConfig(message);
1251
+ // The "route" tier only counts an EXPLICITLY matched route — a
1252
+ // matchType of 'default' is the router-wide fallback and must not
1253
+ // outrank a bot persona (it lands in the route-default tier instead).
1254
+ const resolvedRoute = resolveRoute(message);
1255
+ const routeModel = resolvedRoute && resolvedRoute.matchType !== 'default' ? resolvedRoute.agent?.model : undefined;
1256
+ // /model — per-conversation model override (Hermes parity: session tier).
1257
+ // `/model` shows the effective model + source, `/model <name>` overrides
1258
+ // this chat, `/model reset` reverts to the channel/global tiers. Handled
1259
+ // before the agent so it never burns an LLM turn. `(?:@\S+)?` accepts
1260
+ // Telegram's `/model@BotName` group form.
1261
+ const modelCmd = message.content.trim().match(/^\/model(?:@\S+)?(?:\s+(\S+))?\s*$/i);
1262
+ if (modelCmd) {
1263
+ const arg = modelCmd[1];
1264
+ const personaForShow = botId ? channelBotPersonas.get(botId) : undefined;
1265
+ const effective = () => {
1266
+ const { model, source } = resolveChannelModel({
1267
+ sessionOverride: getSessionModelOverride(sessionKey),
1268
+ routeModel,
1269
+ personaModel: personaForShow?.model,
1270
+ routeDefaultModel: agentConfig.model,
1271
+ globalModel: resolved?.model || 'indisponible',
1272
+ });
1273
+ return `${model} (source : ${source})`;
1274
+ };
1275
+ let reply;
1276
+ if (!arg) {
1277
+ reply = `Modèle : ${effective()} — /model <nom> pour changer, /model reset pour annuler`;
1278
+ }
1279
+ else if (arg.toLowerCase() === 'reset') {
1280
+ clearSessionModelOverride(sessionKey);
1281
+ reply = `Override retiré. Modèle effectif : ${effective()}`;
1282
+ }
1283
+ else if (!MODEL_NAME_PATTERN.test(arg)) {
1284
+ reply = 'Nom de modèle invalide. Usage : /model <nom> | /model reset | /model';
1285
+ }
1286
+ else {
1287
+ setSessionModelOverride(sessionKey, arg);
1288
+ reply = `✅ Modèle de cette conversation : ${arg} — appliqué dès le prochain message. Si le modèle est invalide, /model reset pour revenir.`;
1289
+ }
1290
+ await channel.send({ channelId: message.channel.id, content: reply, replyTo: message.id });
551
1291
  return;
552
1292
  }
553
- const { getRouteAgentConfig } = await import('../../channels/core.js');
554
- const agentConfig = getRouteAgentConfig(message);
555
- const sessionKey = message.sessionKey || 'default-global';
556
- // Reuse ONE agent per chat (cached by sessionKey) so multi-turn context
557
- // persists in-memory across messages; restored from disk on a cold start.
558
- // botId selects the per-bot persona and is already baked into sessionKey,
559
- // so different bots keep separate agents + histories.
560
- const botId = message.channel?.botId;
561
- const agent = await getOrCreateChannelAgent(sessionKey, resolved, agentConfig, botId);
562
- const entries = await agent.processUserMessage(message.content);
563
- const lastEntry = entries[entries.length - 1];
564
- const response = lastEntry ? String(lastEntry.content) : '';
565
- // 6. Deliver the reply. On Telegram, render the agent's markdown to the
566
- // robust HTML subset (bold / code / tables / links) so it doesn't show
567
- // raw; if Telegram rejects the HTML (success:false) fall back to plain
568
- // text. Other channels keep native markdown (Discord/Slack render it).
569
- if (channel.type === 'telegram' && response.trim()) {
570
- const { renderTelegramHtml } = await import('../../rendering/telegram-html.js');
571
- const chunks = renderTelegramHtml(response);
572
- let ok = chunks.length > 0;
573
- for (let i = 0; i < chunks.length; i++) {
574
- const res = await channel.send({
1293
+ const queuedAt = Date.now();
1294
+ await serializeChannelTurn(sessionKey, async (turn) => {
1295
+ const queueWaitMs = Date.now() - queuedAt;
1296
+ if (queueWaitMs >= 1_000) {
1297
+ logger.info('Channel turn dequeued after waiting', {
1298
+ channelType: channel.type,
1299
+ sessionHash: hashForLog(sessionKey),
1300
+ messageHash: hashForLog(message.id),
1301
+ queueWaitMs,
1302
+ });
1303
+ }
1304
+ turn.phase('continuity');
1305
+ turn.throwIfAborted();
1306
+ // Reuse ONE agent per chat (cached by sessionKey) so multi-turn context
1307
+ // persists in-memory across messages; restored from disk on a cold start.
1308
+ // botId selects the per-bot persona and is already baked into sessionKey,
1309
+ // so different bots keep separate agents + histories.
1310
+ const { getCrossChannelConversationBridge } = await import('../../conversation/cross-channel-bridge.js');
1311
+ const conversationBridge = getCrossChannelConversationBridge();
1312
+ const continuesVoiceConversation = !message.isCommand &&
1313
+ !message.content.trim().startsWith('/') &&
1314
+ conversationBridge.matchesChannel(channel.type, message.channel.id, message.threadId);
1315
+ // Snapshot BEFORE appending the current user turn. The current message is
1316
+ // supplied separately to the agent and must not appear twice in its prompt.
1317
+ const sharedConversationHistory = continuesVoiceConversation
1318
+ ? conversationBridge.history()
1319
+ : [];
1320
+ if (continuesVoiceConversation) {
1321
+ const claim = await conversationBridge.claimChannelTurnDurably({
1322
+ role: 'user',
1323
+ content: message.content,
1324
+ channel: channel.type,
575
1325
  channelId: message.channel.id,
576
- content: chunks[i],
577
- parseMode: 'html',
578
- replyTo: i === 0 ? message.id : undefined,
1326
+ ...(message.threadId ? { threadId: message.threadId } : {}),
1327
+ externalId: message.id,
579
1328
  });
580
- if (!res?.success) {
581
- ok = false;
582
- break;
1329
+ turn.throwIfAborted();
1330
+ if (claim === 'duplicate') {
1331
+ logger.info('Duplicate channel turn skipped before generation', {
1332
+ channelType: channel.type,
1333
+ sessionHash: hashForLog(sessionKey),
1334
+ messageHash: hashForLog(message.id),
1335
+ });
1336
+ return;
1337
+ }
1338
+ if (claim === 'failed') {
1339
+ throw new Error('shared conversation journal claim failed');
583
1340
  }
584
1341
  }
585
- if (!ok) {
586
- await channel.send({ channelId: message.channel.id, content: response, replyTo: message.id });
1342
+ // Derived after appending the current turn, so an affect/support signal
1343
+ // observed on Telegram is available immediately to this very response.
1344
+ // The renderer is raw-free: it never repeats transcript text or personal
1345
+ // facts and is only used for the explicitly linked companion thread.
1346
+ const sharedRelationshipContext = continuesVoiceConversation
1347
+ ? conversationBridge.renderRelationshipContext()
1348
+ : '';
1349
+ const channelPersona = botId ? channelBotPersonas.get(botId) : undefined;
1350
+ const companionPersona = /\b(lisa|compagne|compagnon|companion)\b/i.test(`${channelPersona?.name ?? ''} ${channelPersona?.systemPrompt ?? ''}`);
1351
+ const companionConversation = (companionPersona || Boolean(channelPersona?.systemPrompt) || continuesVoiceConversation) &&
1352
+ process.env.CODEBUDDY_CHANNEL_CONVERSATION !== 'false';
1353
+ let companionRoute;
1354
+ const hasExplicitModel = Boolean(getSessionModelOverride(sessionKey) || routeModel || channelPersona?.model);
1355
+ if ((companionPersona || continuesVoiceConversation) &&
1356
+ companionConversation &&
1357
+ channel.type === 'telegram' &&
1358
+ !hasExplicitModel) {
1359
+ try {
1360
+ const routingHistory = await resolveChannelRoutingHistory(sessionKey, sharedConversationHistory);
1361
+ const { resolveCompanionModelRoute } = await import('../../conversation/companion-model-routing.js');
1362
+ companionRoute =
1363
+ (await resolveCompanionModelRoute({
1364
+ surface: 'telegram',
1365
+ text: message.content,
1366
+ history: routingHistory,
1367
+ env: process.env,
1368
+ })) ?? undefined;
1369
+ turn.throwIfAborted();
1370
+ }
1371
+ catch (error) {
1372
+ logger.debug('Companion pilot routing unavailable on channel', {
1373
+ channelType: channel.type,
1374
+ error: error instanceof Error ? error.message : String(error),
1375
+ });
1376
+ }
587
1377
  }
588
- }
589
- else {
590
- await channel.send({
591
- channelId: message.channel.id,
592
- content: response,
593
- replyTo: message.id,
1378
+ const runtimeResolved = resolved ??
1379
+ (companionRoute
1380
+ ? {
1381
+ apiKey: companionRoute.apiKey,
1382
+ baseUrl: companionRoute.baseURL,
1383
+ model: companionRoute.model,
1384
+ egress: companionRoute.egress,
1385
+ }
1386
+ : null);
1387
+ if (!runtimeResolved) {
1388
+ logger.warn('No LLM provider for channel chat — set CODEBUDDY_PROVIDER or activate an available companion route');
1389
+ const { conversationFailureReply } = await import('../../conversation/conversation-orchestrator.js');
1390
+ await channel.send({
1391
+ channelId: message.channel.id,
1392
+ content: conversationFailureReply(message.content),
1393
+ replyTo: message.id,
1394
+ });
1395
+ return;
1396
+ }
1397
+ const useCompanionProfile = shouldUseCompanionChannelProfile({
1398
+ text: message.content,
1399
+ isCommand: message.isCommand === true,
594
1400
  });
595
- }
596
- // 7. If the user SPOKE (voice note), answer by voice too — mirror the
597
- // modality. Best-effort: the text reply already landed, so a TTS/upload
598
- // failure (or a channel without voice support) is a no-op, never fatal.
599
- const userSpoke = message.attachments?.some((a) => a.type === 'voice' || a.type === 'audio');
600
- const voiceChannel = channel;
601
- if (userSpoke && response.trim() && typeof voiceChannel.sendVoiceReply === 'function') {
602
- try {
603
- await voiceChannel.sendVoiceReply(message.channel.id, response);
1401
+ turn.phase('runtime');
1402
+ let agent;
1403
+ let effectiveRuntime = {
1404
+ apiKey: runtimeResolved.apiKey,
1405
+ baseUrl: runtimeResolved.baseUrl,
1406
+ model: runtimeResolved.model,
1407
+ egress: runtimeResolved.egress ?? 'cloud',
1408
+ };
1409
+ if (!useCompanionProfile) {
1410
+ const created = await getOrCreateChannelAgent(sessionKey, runtimeResolved, agentConfig, botId, routeModel, companionRoute);
1411
+ agent = created.agent;
1412
+ effectiveRuntime = created.effectiveRuntime;
1413
+ }
1414
+ turn.throwIfAborted();
1415
+ turn.phase('grounding');
1416
+ let attachedImageEvidence;
1417
+ // A photo shared with the companion is not an analysis request: it goes
1418
+ // through the shared-photo pipeline (privacy posture, reaction contract,
1419
+ // album, memory) instead of the analytical evidence card the agent path
1420
+ // uses. See `companion/companion-photo.ts`.
1421
+ let companionPhotos = null;
1422
+ const imageAttachmentCount = message.attachments?.filter((attachment) => attachment.type === 'image').length ?? 0;
1423
+ const telegramFileResolver = channel.type === 'telegram' &&
1424
+ typeof channel.getFileUrl === 'function'
1425
+ ? (reference) => channel.getFileUrl(reference)
1426
+ : undefined;
1427
+ if (imageAttachmentCount > 0 && useCompanionProfile) {
1428
+ try {
1429
+ const [{ loadChannelPhotos }, { prepareCompanionPhotos }] = await Promise.all([
1430
+ import('../../companion/companion-photo-intake.js'),
1431
+ import('../../companion/companion-photo.js'),
1432
+ ]);
1433
+ const loaded = await loadChannelPhotos(message.attachments, {
1434
+ ...(telegramFileResolver ? { resolveUrl: telegramFileResolver } : {}),
1435
+ signal: turn.signal,
1436
+ });
1437
+ turn.throwIfAborted();
1438
+ companionPhotos = await prepareCompanionPhotos(loaded, {
1439
+ caption: message.content,
1440
+ model: effectiveRuntime.model,
1441
+ baseUrl: effectiveRuntime.baseUrl,
1442
+ });
1443
+ logger.info('Companion shared-photo perception completed', {
1444
+ channelType: channel.type,
1445
+ sessionHash: hashForLog(sessionKey),
1446
+ messageHash: hashForLog(message.id),
1447
+ mode: companionPhotos?.mode,
1448
+ accepted: companionPhotos?.photos.length ?? 0,
1449
+ rejected: companionPhotos?.rejected.length ?? 0,
1450
+ });
1451
+ }
1452
+ catch (error) {
1453
+ turn.throwIfAborted();
1454
+ companionPhotos = null;
1455
+ logger.warn('Companion shared-photo perception unavailable', {
1456
+ channelType: channel.type,
1457
+ sessionHash: hashForLog(sessionKey),
1458
+ error: error instanceof Error ? error.message : String(error),
1459
+ });
1460
+ }
604
1461
  }
605
- catch (voiceErr) {
606
- logger.warn(`Voice reply skipped: ${voiceErr instanceof Error ? voiceErr.message : String(voiceErr)}`);
1462
+ else if (imageAttachmentCount > 0) {
1463
+ const { groundAttachedImages, renderAttachedImageEvidence, } = await import('../../companion/attached-image-grounding.js');
1464
+ const visual = await groundAttachedImages(message.attachments, message.content, {
1465
+ ...(telegramFileResolver ? { resolveUrl: telegramFileResolver } : {}),
1466
+ });
1467
+ turn.throwIfAborted();
1468
+ attachedImageEvidence = renderAttachedImageEvidence(visual) || undefined;
1469
+ logger.info('Channel attached-image perception completed', {
1470
+ channelType: channel.type,
1471
+ sessionHash: hashForLog(sessionKey),
1472
+ messageHash: hashForLog(message.id),
1473
+ imageCount: visual.imageCount,
1474
+ status: visual.status,
1475
+ model: visual.model,
1476
+ reason: visual.reason,
1477
+ });
607
1478
  }
608
- }
609
- // 7b. Deliver image artifacts: if the reply names image paths that exist
610
- // on disk (e.g. a chart the agent just generated), send them as photos.
611
- const imageChannel = channel;
612
- if (typeof imageChannel.sendImageFile === 'function') {
613
- const os = await import('node:os');
614
- const fsp = await import('node:fs/promises');
615
- const matches = response.match(/(?:~\/|\/)[\w./-]+\.(?:png|jpe?g|gif|webp)/gi) || [];
616
- const seen = new Set();
617
- for (const raw of matches) {
618
- const p = raw.startsWith('~/') ? os.homedir() + raw.slice(1) : raw;
619
- if (seen.has(p) || seen.size >= 4)
620
- continue;
621
- seen.add(p);
1479
+ if (companionConversation && !useCompanionProfile) {
1480
+ cognitiveTurn = await getChannelCognitivePort().begin({
1481
+ channelType: channel.type,
1482
+ sessionKey,
1483
+ messageId: message.id,
1484
+ content: message.content,
1485
+ egress: effectiveRuntime.egress,
1486
+ });
1487
+ turn.throwIfAborted();
1488
+ }
1489
+ const agentInput = companionPhotos
1490
+ ? companionPhotos.userText
1491
+ : attachedImageEvidence
1492
+ ? `${message.content}\n\n${attachedImageEvidence}\n\n` +
1493
+ 'Réponds à la demande en t’appuyant sur cette fiche visuelle. Distingue les faits visibles des incertitudes.'
1494
+ : imageAttachmentCount > 0
1495
+ ? `${message.content}\n\nL’analyse des images jointes a échoué. Dis-le honnêtement et demande un nouvel envoi net si nécessaire.`
1496
+ : message.content;
1497
+ let transientConversationContext;
1498
+ let preparedConversation;
1499
+ let companionConversationHistory = [];
1500
+ let companionFreshEvidence;
1501
+ let prefetchedGroundedFallback;
1502
+ let prefetchedDirectResponse;
1503
+ if (companionConversation) {
1504
+ const [conversation, prefetchedContext, prefetchEngine] = await Promise.all([
1505
+ import('../../conversation/conversation-orchestrator.js'),
1506
+ import('../../conversation/prefetched-turn-context.js'),
1507
+ import('../../companion/prefetch-engine.js'),
1508
+ ]);
1509
+ const history = sharedConversationHistory.length
1510
+ ? sharedConversationHistory.slice(-12)
1511
+ : useCompanionProfile
1512
+ ? (companionChannelHistories.get(sessionKey) ?? []).slice(-12)
1513
+ : (agent
1514
+ ?.getChatHistory()
1515
+ .filter((entry) => entry.type === 'user' || entry.type === 'assistant')
1516
+ .slice(-12)
1517
+ .map((entry) => {
1518
+ const content = String(entry.content ?? '')
1519
+ .replace(/<companion_turn>[\s\S]*?<\/companion_turn>\s*/g, '')
1520
+ .replace(/^Message de l'utilisateur\s*:\s*/i, '')
1521
+ .trim();
1522
+ return {
1523
+ role: entry.type === 'user' ? 'user' : 'assistant',
1524
+ content,
1525
+ };
1526
+ })
1527
+ .filter((entry) => entry.content) ?? []);
1528
+ companionConversationHistory = history;
1529
+ const freshContext = process.env.CODEBUDDY_PREFETCH === 'false'
1530
+ ? null
1531
+ : prefetchedContext.resolvePrefetchedTurnContextForConversation(message.content, history, { allowStale: true });
1532
+ if (process.env.CODEBUDDY_PREFETCH !== 'false' &&
1533
+ (freshContext?.freshness === 'stale' ||
1534
+ (!freshContext && prefetchedContext.isPrefetchedTurnRequest(message.content)))) {
1535
+ void prefetchEngine.runPrefetchCycle().catch(() => undefined);
1536
+ }
1537
+ companionFreshEvidence =
1538
+ prefetchedContext.semanticReviewEvidenceFromPrefetch(freshContext);
1539
+ companionFreshEvidence = [companionFreshEvidence, attachedImageEvidence]
1540
+ .filter((part) => Boolean(part?.trim()))
1541
+ .join('\n\n') || undefined;
1542
+ prefetchedGroundedFallback = freshContext
1543
+ ? freshContext.text.trim() || freshContext.speech.trim() || undefined
1544
+ : undefined;
1545
+ if (freshContext &&
1546
+ prefetchedContext.shouldUsePrefetchedAnswerDirectly(message.content, freshContext)) {
1547
+ prefetchedDirectResponse = prefetchedGroundedFallback;
1548
+ }
1549
+ preparedConversation = conversation.prepareConversationTurn(message.content, history, {
1550
+ ...(sharedRelationshipContext
1551
+ ? { relationshipContext: sharedRelationshipContext }
1552
+ : {}),
1553
+ ...(freshContext ? { freshContext: freshContext.promptGuidance } : {}),
1554
+ });
1555
+ transientConversationContext = [
1556
+ preparedConversation.systemGuidance,
1557
+ cognitiveTurn?.turnContext,
1558
+ cognitiveTurn?.evidence,
1559
+ ].filter((part) => Boolean(part?.trim())).join('\n\n') || undefined;
1560
+ }
1561
+ const semanticReviewProfile = isRuntimeEvidenceVerificationRequest(message.content)
1562
+ ? 'factual_analytical'
1563
+ : undefined;
1564
+ const semanticReviewPlanned = !useCompanionProfile &&
1565
+ companionConversation &&
1566
+ !prefetchedDirectResponse &&
1567
+ preparedConversation !== undefined &&
1568
+ shouldRunSemanticResponseGate({
1569
+ plan: preparedConversation.plan,
1570
+ ...(semanticReviewProfile ? { profile: semanticReviewProfile } : {}),
1571
+ }) &&
1572
+ deriveArgumentObligations(preparedConversation.plan, message.content).length > 0;
1573
+ if (semanticReviewPlanned && agent) {
1574
+ const snapshotAgent = agent;
1575
+ snapshotAgent.suspendTranscriptSnapshots();
1576
+ let released = false;
1577
+ releaseTranscriptSnapshotHold = () => {
1578
+ if (released)
1579
+ return;
1580
+ released = true;
1581
+ if (channelAgentCache.get(sessionKey)?.agent === snapshotAgent) {
1582
+ snapshotAgent.resumeTranscriptSnapshots();
1583
+ }
1584
+ };
1585
+ }
1586
+ // From this point onward the cached agent may contain a user turn or an
1587
+ // assistant draft. Any later exception (including a rejected transport
1588
+ // promise) must discard that private state unless delivery and
1589
+ // persistence complete normally.
1590
+ generativeSessionKey = sessionKey;
1591
+ generativeTurnEngaged = Boolean(agent);
1592
+ let response = '';
1593
+ let rawAgentFailure = false;
1594
+ let hasGeneratedResponse = false;
1595
+ let successfulLisaSelfieToolResult = false;
1596
+ let shouldPersistChannelSession = Boolean(agent);
1597
+ let telegramWidget;
1598
+ let companionMediaResult;
1599
+ let companionHistorySuffix;
1600
+ if (prefetchedDirectResponse) {
1601
+ response = prefetchedDirectResponse;
1602
+ if (agent && !agent.recordTrustedExternalConversationTurn(agentInput, response)) {
1603
+ throw new Error('trusted prefetched turn could not be recorded');
1604
+ }
1605
+ logger.info('Channel served trusted prefetched companion response directly', {
1606
+ channelType: channel.type,
1607
+ sessionHash: hashForLog(sessionKey),
1608
+ messageHash: hashForLog(message.id),
1609
+ responseLength: response.length,
1610
+ });
1611
+ }
1612
+ else if (useCompanionProfile) {
1613
+ turn.phase('generation');
1614
+ const hasSharedPhotos = (companionPhotos?.photos.length ?? 0) > 0;
1615
+ const prompt = await assembleCompanionChannelPrompt({
1616
+ userText: agentInput,
1617
+ history: companionConversationHistory.length
1618
+ ? companionConversationHistory
1619
+ : companionChannelHistories.get(sessionKey),
1620
+ ...(hasSharedPhotos && companionPhotos
1621
+ ? { extraSystem: companionPhotos.guidance }
1622
+ : {}),
1623
+ });
1624
+ let companionMessages = prompt.messages;
1625
+ if (hasSharedPhotos && companionPhotos?.mode === 'cloud') {
1626
+ const { attachPhotoParts } = await import('../../companion/companion-photo.js');
1627
+ companionMessages = attachPhotoParts(prompt.messages, companionPhotos.photos);
1628
+ }
1629
+ logger.info('Companion channel profile prompt', {
1630
+ channelType: channel.type,
1631
+ sessionHash: hashForLog(sessionKey),
1632
+ tokenEstimate: prompt.tokenEstimate,
1633
+ messageCount: prompt.messages.length,
1634
+ sharedPhotos: companionPhotos?.photos.length ?? 0,
1635
+ });
622
1636
  try {
623
- await fsp.access(p);
624
- await imageChannel.sendImageFile(message.channel.id, p);
1637
+ let companionIdentity;
1638
+ if (channel.type === 'telegram') {
1639
+ const { resolveCompanionIdentity } = await import('../../companion/companion-identity.js');
1640
+ const telegramChannel = channel;
1641
+ companionIdentity = resolveCompanionIdentity({
1642
+ channel: 'telegram',
1643
+ chatId: message.channel.id,
1644
+ senderId: message.sender?.id,
1645
+ senderUsername: message.sender?.username,
1646
+ allowedUsers: telegramChannel.config?.allowedUsers ?? [],
1647
+ env: process.env,
1648
+ });
1649
+ }
1650
+ const generated = await runCompanionChannelTurn({
1651
+ apiKey: effectiveRuntime.apiKey,
1652
+ baseUrl: effectiveRuntime.baseUrl,
1653
+ model: effectiveRuntime.model,
1654
+ messages: companionMessages,
1655
+ signal: turn.signal,
1656
+ ...(companionIdentity ? { identity: companionIdentity } : {}),
1657
+ surface: channel.type,
1658
+ env: process.env,
1659
+ });
1660
+ turn.throwIfAborted();
1661
+ response = generated.text;
1662
+ hasGeneratedResponse = response.trim() !== '';
1663
+ companionMediaResult = generated.media;
1664
+ companionHistorySuffix = generated.historySuffix;
1665
+ if (hasSharedPhotos && companionPhotos) {
1666
+ // The album write is deliberately after the reply: a full disk must
1667
+ // cost the memory, never the reaction.
1668
+ const { rememberSharedPhotos } = await import('../../companion/shared-photo-memory.js');
1669
+ const stored = await rememberSharedPhotos(companionPhotos.photos, {
1670
+ surface: 'telegram',
1671
+ caption: message.content,
1672
+ });
1673
+ logger.info('Companion shared photos filed', {
1674
+ channelType: channel.type,
1675
+ sessionHash: hashForLog(sessionKey),
1676
+ stored: stored.length,
1677
+ });
1678
+ }
1679
+ }
1680
+ catch (error) {
1681
+ turn.throwIfAborted();
1682
+ response = speakChannelProviderFailure(error, {
1683
+ copine: Boolean(process.env.CODEBUDDY_COMPANION_PERSONA),
1684
+ });
1685
+ logger.warn('Companion channel provider failure spoken to conversation', {
1686
+ channelType: channel.type,
1687
+ sessionHash: hashForLog(sessionKey),
1688
+ error: error instanceof Error ? error.message : String(error),
1689
+ });
1690
+ }
1691
+ }
1692
+ else {
1693
+ turn.phase('generation');
1694
+ const entries = await agent.processUserMessage(agentInput, {
1695
+ surface: channel.type,
1696
+ ...(attachedImageEvidence || imageAttachmentCount > 0
1697
+ ? { introspectionText: message.content }
1698
+ : {}),
1699
+ ...(transientConversationContext
1700
+ ? {
1701
+ transientContext: transientConversationContext,
1702
+ relationshipSafety: companionConversation,
1703
+ }
1704
+ : {}),
1705
+ });
1706
+ successfulLisaSelfieToolResult = entries.some((entry) => entry.type === 'tool_result' &&
1707
+ entry.toolResult?.success === true &&
1708
+ entry.toolCall?.function?.name === 'lisa_selfie');
1709
+ turn.throwIfAborted();
1710
+ const lastEntry = entries[entries.length - 1];
1711
+ response = lastEntry ? String(lastEntry.content) : '';
1712
+ if (channel.type === 'telegram') {
1713
+ const { autoWidget } = await import('../../widgets/auto-widget.js');
1714
+ const widget = await autoWidget(response, entries
1715
+ .filter((entry) => entry.type === 'tool_result')
1716
+ .map((entry) => entry.toolResult ?? { output: entry.content }));
1717
+ if (widget.widgetHtml || widget.candidate) {
1718
+ telegramWidget = {
1719
+ ...(widget.widgetHtml ? { widgetHtml: widget.widgetHtml } : {}),
1720
+ ...(widget.candidate?.kind === 'payload' ? { data: widget.candidate.data } : {}),
1721
+ };
1722
+ }
1723
+ }
1724
+ rawAgentFailure = isAgentFailureResponse(response);
1725
+ hasGeneratedResponse = response.trim() !== '' && !rawAgentFailure;
1726
+ }
1727
+ if (hasGeneratedResponse) {
1728
+ response = prependUserFacingFailoverNotice(response, `channel:${channel.type}`);
1729
+ }
1730
+ if (!response.trim() || rawAgentFailure) {
1731
+ const { conversationFailureReply } = await import('../../conversation/conversation-orchestrator.js');
1732
+ const replacement = prefetchedGroundedFallback ??
1733
+ (rawAgentFailure
1734
+ ? speakChannelProviderFailure(response, {
1735
+ copine: Boolean(process.env.CODEBUDDY_COMPANION_PERSONA),
1736
+ })
1737
+ : conversationFailureReply(message.content, companionConversationHistory));
1738
+ if (prefetchedGroundedFallback) {
1739
+ logger.info('Channel provider failure recovered from prefetched companion context', {
1740
+ channelType: channel.type,
1741
+ sessionHash: hashForLog(sessionKey),
1742
+ });
1743
+ }
1744
+ if (rawAgentFailure) {
1745
+ if (agent && !agent.replaceLastAssistantResponse(response, replacement)) {
1746
+ evictChannelAgent(sessionKey, true);
1747
+ shouldPersistChannelSession = false;
1748
+ logger.error('Channel provider failure rewrite missed agent history', {
1749
+ channelType: channel.type,
1750
+ sessionHash: hashForLog(sessionKey),
1751
+ });
1752
+ }
1753
+ logger.warn('Channel provider failure spoken to conversation', {
1754
+ channelType: channel.type,
1755
+ sessionHash: hashForLog(sessionKey),
1756
+ });
1757
+ }
1758
+ response = replacement;
1759
+ }
1760
+ const semanticReviewEligible = semanticReviewPlanned &&
1761
+ hasGeneratedResponse &&
1762
+ !successfulLisaSelfieToolResult &&
1763
+ preparedConversation !== undefined;
1764
+ // The semantic reviewer may resolve to a different provider/egress than
1765
+ // the main model. Cognitive evidence was projected for the main route,
1766
+ // so it cannot cross this second model boundary without a new projection.
1767
+ const semanticEvidence = companionFreshEvidence?.trim() || undefined;
1768
+ if (semanticReviewEligible && preparedConversation) {
1769
+ turn.phase('review');
1770
+ try {
1771
+ const { reviewSemanticResponse } = await import('../../conversation/semantic-response-runtime.js');
1772
+ const unreviewedResponse = response;
1773
+ const reviewed = await reviewSemanticResponse({
1774
+ request: message.content,
1775
+ draft: unreviewedResponse,
1776
+ plan: preparedConversation.plan,
1777
+ ...(semanticReviewProfile ? { profile: semanticReviewProfile } : {}),
1778
+ history: companionConversationHistory,
1779
+ ...(semanticEvidence ? { evidence: semanticEvidence } : {}),
1780
+ mainProvider: {
1781
+ apiKey: effectiveRuntime.apiKey,
1782
+ baseURL: effectiveRuntime.baseUrl,
1783
+ model: effectiveRuntime.model,
1784
+ },
1785
+ });
1786
+ turn.throwIfAborted();
1787
+ const rejectedFreshGrounding = reviewed.outcome === 'fail_open' &&
1788
+ (reviewed.audit?.issueCodes.includes('ungrounded_fresh_claim') === true ||
1789
+ reviewed.verificationAudit?.issueCodes.includes('ungrounded_fresh_claim') === true);
1790
+ const groundedRecovery = rejectedFreshGrounding
1791
+ ? prefetchedGroundedFallback ??
1792
+ "Je n’ai pas réussi à vérifier cette information fraîche avec une source exploitable. " +
1793
+ 'Je préfère ne pas l’inventer ; redemande-moi dans un instant.'
1794
+ : undefined;
1795
+ response = groundedRecovery ?? (reviewed.response.trim() || unreviewedResponse);
1796
+ if (response !== unreviewedResponse) {
1797
+ if (agent && !agent.replaceLastAssistantResponse(unreviewedResponse, response)) {
1798
+ // Delivery may continue with the reviewed text, but an agent
1799
+ // containing the rejected draft can neither be cached nor saved.
1800
+ evictChannelAgent(sessionKey, true);
1801
+ shouldPersistChannelSession = false;
1802
+ logger.error('Companion semantic rewrite missed agent history', {
1803
+ channelType: channel.type,
1804
+ sessionHash: hashForLog(sessionKey),
1805
+ });
1806
+ }
1807
+ }
1808
+ if (groundedRecovery) {
1809
+ logger.warn('Companion rejected ungrounded fresh response before delivery', {
1810
+ channelType: channel.type,
1811
+ sessionHash: hashForLog(sessionKey),
1812
+ recovery: prefetchedGroundedFallback ? 'prefetched_evidence' : 'honest_retry',
1813
+ });
1814
+ }
1815
+ logger.info('Companion semantic response gate completed', {
1816
+ channelType: channel.type,
1817
+ sessionHash: hashForLog(sessionKey),
1818
+ outcome: reviewed.outcome,
1819
+ reason: reviewed.reason,
1820
+ revisionAttempts: reviewed.revisionAttempts,
1821
+ issueCodes: reviewed.audit?.issueCodes ?? [],
1822
+ lowDimensions: reviewed.audit?.lowDimensions ?? [],
1823
+ });
1824
+ }
1825
+ catch (error) {
1826
+ // The shared runtime is fail-open; retain that property if module
1827
+ // loading itself is unavailable in an older packaged installation.
1828
+ logger.warn('Companion semantic response gate unavailable', {
1829
+ channelType: channel.type,
1830
+ sessionHash: hashForLog(sessionKey),
1831
+ errorType: error instanceof Error ? error.name : 'unknown',
1832
+ });
1833
+ }
1834
+ }
1835
+ if ((companionConversation || useCompanionProfile) && response.trim()) {
1836
+ const { guardRelationshipReply } = await import('../../conversation/relationship-safety.js');
1837
+ const guarded = guardRelationshipReply(response);
1838
+ const unguardedResponse = response;
1839
+ response = guarded.response;
1840
+ try {
1841
+ const { applyLimitsContract } = await import('../../companion/reply-augment.js');
1842
+ response = applyLimitsContract(response, { heard: message.content }).text;
625
1843
  }
626
1844
  catch {
627
- // path isn't a real/accessible image — skip
1845
+ /* limits contract is optional */
1846
+ }
1847
+ try {
1848
+ const { rememberSaid } = await import('../../companion/recent-said.js');
1849
+ rememberSaid(response, 'telegram');
1850
+ }
1851
+ catch {
1852
+ /* recent-said is optional */
1853
+ }
1854
+ if (guarded.intervened) {
1855
+ if (agent && !agent.replaceLastAssistantResponse(unguardedResponse, response)) {
1856
+ // Never retain a response that the delivery gate rejected. A cold
1857
+ // agent will restore the safe persisted transcript on the next turn.
1858
+ evictChannelAgent(sessionKey, true);
1859
+ shouldPersistChannelSession = false;
1860
+ logger.error('Companion relationship safety rewrite missed agent history', {
1861
+ channelType: channel.type,
1862
+ sessionHash: hashForLog(sessionKey),
1863
+ });
1864
+ }
1865
+ logger.warn('Companion relationship safety gate intervened on channel reply', {
1866
+ channelType: channel.type,
1867
+ sessionHash: hashForLog(sessionKey),
1868
+ issues: guarded.issues,
1869
+ });
628
1870
  }
629
1871
  }
630
- }
631
- // 8. Persist the conversation so it survives a daemon restart / cache eviction.
632
- await persistChannelSession(agent, sessionKey);
1872
+ let deliveryMode = response.trim() ? 'native' : 'fallback';
1873
+ let deliveredChunks = 0;
1874
+ let delivered = false;
1875
+ let deliveredAssistantContent = '';
1876
+ // 6. Deliver the reply. On Telegram, render the agent's markdown to the
1877
+ // robust HTML subset (bold / code / tables / links) so it doesn't show
1878
+ // raw; if Telegram rejects the HTML (success:false) fall back to plain
1879
+ // text. Other channels keep native markdown (Discord/Slack render it).
1880
+ turn.throwIfAborted();
1881
+ turn.phase('delivery');
1882
+ deliveryState = 'started';
1883
+ if (channel.type === 'telegram' && response.trim() && companionMediaResult && companionMediaResult.length > 0) {
1884
+ const media = companionMediaResult[0];
1885
+ if (media) {
1886
+ const pathMod = await import('path');
1887
+ const ext = pathMod.extname(media.imagePath).slice(1) || 'png';
1888
+ const result = await channel.send({
1889
+ channelId: message.channel.id,
1890
+ content: response,
1891
+ replyTo: message.id,
1892
+ attachments: [
1893
+ {
1894
+ type: 'image',
1895
+ filePath: media.imagePath,
1896
+ fileName: pathMod.basename(media.imagePath),
1897
+ mimeType: ext === 'jpg' || ext === 'jpeg' ? 'image/jpeg' : `image/${ext}`,
1898
+ },
1899
+ ],
1900
+ });
1901
+ delivered = result?.success === true;
1902
+ deliveredChunks = delivered ? 1 : 0;
1903
+ if (delivered)
1904
+ deliveredAssistantContent = response;
1905
+ if (delivered)
1906
+ deliveryMode = 'telegram-photo';
1907
+ else
1908
+ deliveryMode = 'failed';
1909
+ }
1910
+ }
1911
+ else if (channel.type === 'telegram' && response.trim() && telegramWidget) {
1912
+ const result = await channel.send({
1913
+ channelId: message.channel.id,
1914
+ content: response,
1915
+ parseMode: 'plain',
1916
+ replyTo: message.id,
1917
+ channelData: { telegram: telegramWidget },
1918
+ });
1919
+ delivered = result?.success === true;
1920
+ deliveredChunks = delivered ? 1 : 0;
1921
+ if (delivered)
1922
+ deliveredAssistantContent = response;
1923
+ if (delivered)
1924
+ deliveryMode = 'telegram-widget';
1925
+ else
1926
+ deliveryMode = 'failed';
1927
+ }
1928
+ else if (channel.type === 'telegram' && response.trim()) {
1929
+ const { renderTelegramHtml, renderPlain, telegramHtmlChunkToPlain, } = await import('../../rendering/index.js');
1930
+ const chunks = renderTelegramHtml(response);
1931
+ const acceptedChunks = [];
1932
+ let ok = chunks.length > 0;
1933
+ for (let i = 0; i < chunks.length; i++) {
1934
+ let res;
1935
+ try {
1936
+ res = await channel.send({
1937
+ channelId: message.channel.id,
1938
+ content: chunks[i],
1939
+ parseMode: 'html',
1940
+ replyTo: i === 0 ? message.id : undefined,
1941
+ });
1942
+ }
1943
+ catch (error) {
1944
+ logger.warn('Telegram HTML chunk transport rejected', {
1945
+ sessionHash: hashForLog(sessionKey),
1946
+ messageHash: hashForLog(message.id),
1947
+ chunk: i + 1,
1948
+ error: error instanceof Error ? error.message : String(error),
1949
+ });
1950
+ ok = false;
1951
+ break;
1952
+ }
1953
+ if (!res?.success) {
1954
+ ok = false;
1955
+ break;
1956
+ }
1957
+ deliveredChunks++;
1958
+ acceptedChunks.push(chunks[i]);
1959
+ }
1960
+ if (!ok) {
1961
+ if (deliveredChunks === 0) {
1962
+ // First HTML chunk rejected: no user-visible prefix exists, so a
1963
+ // complete plain fallback is safe and cannot duplicate content.
1964
+ const fallback = await channel.send({
1965
+ channelId: message.channel.id,
1966
+ content: renderPlain(response),
1967
+ replyTo: message.id,
1968
+ });
1969
+ delivered = fallback?.success === true;
1970
+ deliveryMode = delivered ? 'plain-fallback' : 'failed';
1971
+ if (delivered) {
1972
+ deliveredChunks++;
1973
+ deliveredAssistantContent = response;
1974
+ }
1975
+ }
1976
+ else {
1977
+ // A later chunk failed. Re-sending the whole answer would repeat
1978
+ // every preceding chunk. Preserve only the prefix the person
1979
+ // actually saw; the generated full draft is still evicted below.
1980
+ delivered = false;
1981
+ deliveryMode = 'partial-failure';
1982
+ deliveredAssistantContent = acceptedChunks
1983
+ .map(telegramHtmlChunkToPlain)
1984
+ .filter(Boolean)
1985
+ .join('\n\n')
1986
+ .trim();
1987
+ }
1988
+ }
1989
+ else {
1990
+ deliveryMode = 'telegram-html';
1991
+ delivered = chunks.length > 0;
1992
+ if (delivered)
1993
+ deliveredAssistantContent = response;
1994
+ }
1995
+ }
1996
+ else {
1997
+ const result = await channel.send({
1998
+ channelId: message.channel.id,
1999
+ content: response,
2000
+ replyTo: message.id,
2001
+ });
2002
+ delivered = result?.success === true;
2003
+ deliveredChunks = delivered && response.trim() ? 1 : 0;
2004
+ if (delivered)
2005
+ deliveredAssistantContent = response;
2006
+ if (!delivered)
2007
+ deliveryMode = 'failed';
2008
+ }
2009
+ logger.info('Channel response delivered', {
2010
+ channelType: channel.type,
2011
+ sessionHash: hashForLog(sessionKey),
2012
+ botHash: hashForLog(botId),
2013
+ messageHash: hashForLog(message.id),
2014
+ responseLength: response.length,
2015
+ deliveryMode,
2016
+ deliveredChunks,
2017
+ delivered,
2018
+ });
2019
+ if (delivered)
2020
+ deliveryState = 'delivered';
2021
+ if (!delivered) {
2022
+ // The cached agent already contains the generated assistant turn. Drop
2023
+ // it and skip persistence so the next request cannot build on a reply
2024
+ // the user never received.
2025
+ evictChannelAgent(sessionKey, true);
2026
+ shouldPersistChannelSession = false;
2027
+ logger.warn('Channel response was not delivered; evicting transient agent state', {
2028
+ channelType: channel.type,
2029
+ sessionHash: hashForLog(sessionKey),
2030
+ messageHash: hashForLog(message.id),
2031
+ });
2032
+ }
2033
+ releaseTranscriptSnapshotHold?.();
2034
+ releaseTranscriptSnapshotHold = undefined;
2035
+ turn.phase('settlement');
2036
+ if (continuesVoiceConversation && deliveredAssistantContent) {
2037
+ const assistantClaim = await conversationBridge.claimChannelTurnDurably({
2038
+ role: 'assistant',
2039
+ content: deliveredAssistantContent,
2040
+ channel: channel.type,
2041
+ channelId: message.channel.id,
2042
+ ...(message.threadId ? { threadId: message.threadId } : {}),
2043
+ externalId: `${message.id}:assistant`,
2044
+ });
2045
+ turn.throwIfAborted();
2046
+ if (assistantClaim === 'failed') {
2047
+ logger.warn('Delivered channel turn could not be committed to shared continuity', {
2048
+ channelType: channel.type,
2049
+ sessionHash: hashForLog(sessionKey),
2050
+ messageHash: hashForLog(message.id),
2051
+ });
2052
+ }
2053
+ }
2054
+ if (cognitiveTurn) {
2055
+ // Remove ownership before awaiting: a post-delivery network failure is
2056
+ // a commit-uncertain state and must never fall through to release.
2057
+ const turnToSettle = cognitiveTurn;
2058
+ cognitiveTurn = null;
2059
+ try {
2060
+ if (delivered) {
2061
+ await turnToSettle.complete(deliveredAssistantContent);
2062
+ }
2063
+ else if (deliveredAssistantContent) {
2064
+ await turnToSettle.complete(deliveredAssistantContent, { cancelAfter: true });
2065
+ }
2066
+ else {
2067
+ await turnToSettle.fail();
2068
+ }
2069
+ turn.throwIfAborted();
2070
+ }
2071
+ catch (error) {
2072
+ logger.warn('Channel cognitive settlement uncertain', {
2073
+ channelType: channel.type,
2074
+ sessionHash: hashForLog(sessionKey),
2075
+ error: error instanceof Error ? error.message : String(error),
2076
+ });
2077
+ }
2078
+ }
2079
+ // 7. If the user SPOKE (voice note), answer by voice too — mirror the
2080
+ // modality. Best-effort: the text reply already landed, so a TTS/upload
2081
+ // failure (or a channel without voice support) is a no-op, never fatal.
2082
+ const userSpoke = message.attachments?.some((a) => a.type === 'voice' || a.type === 'audio');
2083
+ const voiceChannel = channel;
2084
+ if (delivered &&
2085
+ userSpoke &&
2086
+ response.trim() &&
2087
+ typeof voiceChannel.sendVoiceReply === 'function') {
2088
+ try {
2089
+ await voiceChannel.sendVoiceReply(message.channel.id, response);
2090
+ }
2091
+ catch (voiceErr) {
2092
+ logger.warn(`Voice reply skipped: ${voiceErr instanceof Error ? voiceErr.message : String(voiceErr)}`);
2093
+ }
2094
+ }
2095
+ // 7b. Deliver image artifacts: if the reply names image paths that exist
2096
+ // on disk (e.g. a chart the agent just generated), send them as photos.
2097
+ const imageChannel = channel;
2098
+ if (delivered && typeof imageChannel.sendImageFile === 'function') {
2099
+ const os = await import('node:os');
2100
+ const fsp = await import('node:fs/promises');
2101
+ const matches = response.match(/(?:~\/|\/)[\w./-]+\.(?:png|jpe?g|gif|webp)/gi) || [];
2102
+ const seen = new Set();
2103
+ for (const raw of matches) {
2104
+ const p = raw.startsWith('~/') ? os.homedir() + raw.slice(1) : raw;
2105
+ if (seen.has(p) || seen.size >= 4)
2106
+ continue;
2107
+ seen.add(p);
2108
+ try {
2109
+ await fsp.access(p);
2110
+ await imageChannel.sendImageFile(message.channel.id, p);
2111
+ }
2112
+ catch {
2113
+ // path isn't a real/accessible image — skip
2114
+ }
2115
+ }
2116
+ }
2117
+ // 8. Persist the conversation so it survives a daemon restart / cache eviction.
2118
+ turn.throwIfAborted();
2119
+ turn.phase('persistence');
2120
+ if (useCompanionProfile && response.trim()) {
2121
+ const recordedResponse = companionHistorySuffix
2122
+ ? `${response}${companionHistorySuffix}`
2123
+ : response;
2124
+ rememberCompanionChannelTurn(sessionKey, message.content, recordedResponse);
2125
+ }
2126
+ if (shouldPersistChannelSession && agent)
2127
+ await persistChannelSession(agent, sessionKey);
2128
+ turn.throwIfAborted();
2129
+ }, {
2130
+ ...(() => {
2131
+ const typing = channelTypingLifecycle(channel, message.channel.id);
2132
+ const wait = channelWaitNoticeLifecycle(channel, message.channel.id, message.id);
2133
+ return {
2134
+ onStart: () => {
2135
+ typing.onStart();
2136
+ wait.onStart();
2137
+ },
2138
+ onSettled: () => {
2139
+ wait.onSettled();
2140
+ typing.onSettled();
2141
+ },
2142
+ };
2143
+ })(),
2144
+ onTimeout: async () => {
2145
+ await cognitiveTurn?.fail().catch(() => undefined);
2146
+ cognitiveTurn = null;
2147
+ releaseTranscriptSnapshotHold?.();
2148
+ releaseTranscriptSnapshotHold = undefined;
2149
+ if (generativeTurnEngaged && generativeSessionKey) {
2150
+ evictChannelAgent(generativeSessionKey, true);
2151
+ }
2152
+ if (deliveryState === 'not_started') {
2153
+ deliveryState = 'started';
2154
+ const result = await channel.send({
2155
+ channelId: message.channel.id,
2156
+ content: speakChannelProviderFailure(Object.assign(new Error('channel turn timed out after timeout during generation'), {
2157
+ name: 'ChannelTurnTimeoutError',
2158
+ }), { copine: Boolean(process.env.CODEBUDDY_COMPANION_PERSONA) }),
2159
+ replyTo: message.id,
2160
+ });
2161
+ if (result?.success)
2162
+ deliveryState = 'delivered';
2163
+ }
2164
+ },
2165
+ diagnostics: {
2166
+ channelType: channel.type,
2167
+ sessionHash: hashForLog(sessionKey),
2168
+ messageHash: hashForLog(message.id),
2169
+ },
2170
+ });
633
2171
  }
634
2172
  catch (err) {
635
- logger.error('Channel AI response failed', { error: err instanceof Error ? err.message : String(err) });
2173
+ await cognitiveTurn?.fail().catch(() => undefined);
2174
+ cognitiveTurn = null;
2175
+ releaseTranscriptSnapshotHold?.();
2176
+ releaseTranscriptSnapshotHold = undefined;
2177
+ if (generativeTurnEngaged && generativeSessionKey) {
2178
+ evictChannelAgent(generativeSessionKey, true);
2179
+ }
2180
+ const timedOut = err instanceof ChannelTurnTimeoutError;
2181
+ logger.error('Channel AI response failed', {
2182
+ error: err instanceof Error ? err.message : String(err),
2183
+ errorType: err instanceof Error ? err.name : 'unknown',
2184
+ deliveryState,
2185
+ });
2186
+ if (timedOut && deliveryState !== 'not_started') {
2187
+ // Delivery is either confirmed or transport-uncertain. Retrying here
2188
+ // could duplicate a late Telegram send, so only release the FIFO.
2189
+ return;
2190
+ }
2191
+ try {
2192
+ const { conversationFailureReply } = await import('../../conversation/conversation-orchestrator.js');
2193
+ const raw = err instanceof Error ? err.message : String(err);
2194
+ const spoken = timedOut || /sorry, i encountered an error/i.test(raw)
2195
+ ? speakChannelProviderFailure(err, {
2196
+ copine: Boolean(process.env.CODEBUDDY_COMPANION_PERSONA),
2197
+ })
2198
+ : conversationFailureReply(message.content);
2199
+ await channel.send({
2200
+ channelId: message.channel.id,
2201
+ content: spoken,
2202
+ replyTo: message.id,
2203
+ });
2204
+ }
2205
+ catch {
2206
+ /* delivery itself is unavailable; the error is already logged */
2207
+ }
636
2208
  }
637
2209
  });
638
2210
  }
639
- export async function instantiateChannel(config) {
2211
+ export async function instantiateChannel(configEntry) {
2212
+ // Resolve the auth token BEFORE building the channel config so every branch
2213
+ // below sees the effective token. Priority: an explicit literal `token` wins
2214
+ // (full backwards compat), otherwise fall back to the encrypted secret the
2215
+ // Cowork GUI stores under `channel:<type>:token`, otherwise no token. Never
2216
+ // throws, never logs the secret. See src/channels/resolve-channel-secret.ts.
2217
+ const config = {
2218
+ ...configEntry,
2219
+ token: resolveChannelSecret(configEntry.type, configEntry),
2220
+ };
640
2221
  const opts = config.options ?? {};
641
2222
  const channelConfig = {
642
2223
  type: config.type,
@@ -647,6 +2228,13 @@ export async function instantiateChannel(config) {
647
2228
  allowedChannels: config.allowedChannels,
648
2229
  options: opts,
649
2230
  };
2231
+ const optsAllowlist = Array.isArray(opts.allowedUsers)
2232
+ ? opts.allowedUsers.filter((item) => typeof item === 'string')
2233
+ : undefined;
2234
+ const inboundAllowlist = {
2235
+ allowedUsers: config.allowedUsers ?? optsAllowlist,
2236
+ allowedChannels: config.allowedChannels,
2237
+ };
650
2238
  switch (config.type) {
651
2239
  case 'telegram': {
652
2240
  const { TelegramChannel } = await import('../../channels/telegram/index.js');
@@ -665,15 +2253,32 @@ export async function instantiateChannel(config) {
665
2253
  // TelegramChannel reads `config.token` (client.ts) — pass `token`, not
666
2254
  // `botToken`, or it throws "Telegram bot token is required" and the
667
2255
  // channel never starts from channels.json / server intake.
668
- return new TelegramChannel({ token: config.token || '', ...opts });
2256
+ // Root `allowedUsers` used to be dropped here (only `...opts` was passed).
2257
+ return new TelegramChannel({
2258
+ ...channelConfig,
2259
+ token: config.token || '',
2260
+ ...opts,
2261
+ ...inboundAllowlist,
2262
+ });
669
2263
  }
670
2264
  case 'discord': {
671
2265
  const { DiscordChannel } = await import('../../channels/discord/index.js');
672
- return new DiscordChannel({ token: config.token || '', ...opts });
2266
+ return new DiscordChannel({
2267
+ ...channelConfig,
2268
+ token: config.token || '',
2269
+ ...opts,
2270
+ ...inboundAllowlist,
2271
+ });
673
2272
  }
674
2273
  case 'slack': {
675
2274
  const { SlackChannel } = await import('../../channels/slack/index.js');
676
- return new SlackChannel({ botToken: config.token || '', ...opts });
2275
+ return new SlackChannel({
2276
+ ...channelConfig,
2277
+ token: config.token || '',
2278
+ botToken: config.token || '',
2279
+ ...opts,
2280
+ ...inboundAllowlist,
2281
+ });
677
2282
  }
678
2283
  case 'whatsapp': {
679
2284
  const { WhatsAppChannel } = await import('../../channels/whatsapp/index.js');