@phuetz/code-buddy 1.6.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2247) hide show
  1. package/LICENSE +90 -21
  2. package/README.md +145 -349
  3. package/codebuddy-runtime.json +24 -0
  4. package/dist/advanced/session-replay.js +3 -2
  5. package/dist/agent/agent-state.d.ts +4 -1
  6. package/dist/agent/agent-state.js +9 -3
  7. package/dist/agent/architect-mode.js +1 -1
  8. package/dist/agent/autonomous/agentic-coding-contract.d.ts +28 -28
  9. package/dist/agent/autonomous/agentic-coding-runner.d.ts +14 -4
  10. package/dist/agent/autonomous/agentic-coding-runner.js +176 -27
  11. package/dist/agent/autonomous/checkpoint-manager.js +3 -12
  12. package/dist/agent/autonomous/codex-autonomy-directive.d.ts +10 -0
  13. package/dist/agent/autonomous/codex-autonomy-directive.js +25 -0
  14. package/dist/agent/autonomous/edit-proposal-producer.js +2 -2
  15. package/dist/agent/autonomous/fleet-task-types.d.ts +2 -2
  16. package/dist/agent/autonomous/fleet-task-types.js +2 -2
  17. package/dist/agent/autonomous/fleet-tick-handler.d.ts +3 -3
  18. package/dist/agent/autonomous/fleet-tick-handler.js +14 -8
  19. package/dist/agent/autonomous/recursive-improvement.d.ts +23 -0
  20. package/dist/agent/autonomous/recursive-improvement.js +114 -0
  21. package/dist/agent/autonomous/verification-loop.js +4 -2
  22. package/dist/agent/codebuddy-agent.d.ts +93 -6
  23. package/dist/agent/codebuddy-agent.js +452 -58
  24. package/dist/agent/council-lesson-proposer.d.ts +80 -13
  25. package/dist/agent/council-lesson-proposer.js +201 -43
  26. package/dist/agent/deep-research-ckg.d.ts +176 -0
  27. package/dist/agent/deep-research-ckg.js +250 -0
  28. package/dist/agent/deep-research-storm.d.ts +222 -0
  29. package/dist/agent/deep-research-storm.js +689 -0
  30. package/dist/agent/deep-research.d.ts +329 -0
  31. package/dist/agent/deep-research.js +994 -0
  32. package/dist/agent/delegation/thread-delegation.d.ts +80 -0
  33. package/dist/agent/delegation/thread-delegation.js +472 -0
  34. package/dist/agent/delegation/thread-task-runner.d.ts +37 -0
  35. package/dist/agent/delegation/thread-task-runner.js +89 -0
  36. package/dist/agent/dev-loop/dev-loop.d.ts +120 -0
  37. package/dist/agent/dev-loop/dev-loop.js +404 -0
  38. package/dist/agent/dev-loop/structural-gate.d.ts +32 -0
  39. package/dist/agent/dev-loop/structural-gate.js +120 -0
  40. package/dist/agent/execution/agent-executor.d.ts +52 -31
  41. package/dist/agent/execution/agent-executor.js +1520 -547
  42. package/dist/agent/execution/context-pipeline.d.ts +54 -6
  43. package/dist/agent/execution/context-pipeline.js +285 -88
  44. package/dist/agent/execution/incremental-token-counter.d.ts +15 -0
  45. package/dist/agent/execution/incremental-token-counter.js +36 -0
  46. package/dist/agent/execution/ordered-tool-executor.d.ts +14 -0
  47. package/dist/agent/execution/ordered-tool-executor.js +54 -0
  48. package/dist/agent/execution/post-tool-handlers.d.ts +1 -1
  49. package/dist/agent/execution/post-tool-handlers.js +2 -2
  50. package/dist/agent/execution/query-classifier.d.ts +2 -0
  51. package/dist/agent/execution/query-classifier.js +2 -0
  52. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  53. package/dist/agent/execution/tool-selection-strategy.d.ts +20 -0
  54. package/dist/agent/execution/tool-selection-strategy.js +145 -23
  55. package/dist/agent/facades/message-history-manager.d.ts +1 -1
  56. package/dist/agent/facades/message-history-manager.js +1 -1
  57. package/dist/agent/facades/model-routing-facade.d.ts +31 -1
  58. package/dist/agent/facades/model-routing-facade.js +86 -2
  59. package/dist/agent/facades/session-facade.d.ts +10 -2
  60. package/dist/agent/facades/session-facade.js +59 -1
  61. package/dist/agent/film/film-producer.d.ts +98 -0
  62. package/dist/agent/film/film-producer.js +289 -0
  63. package/dist/agent/film/scene-planner.d.ts +38 -0
  64. package/dist/agent/film/scene-planner.js +93 -0
  65. package/dist/agent/film/trailer-planner.d.ts +23 -0
  66. package/dist/agent/film/trailer-planner.js +242 -0
  67. package/dist/agent/film/video-studio.d.ts +72 -0
  68. package/dist/agent/film/video-studio.js +249 -0
  69. package/dist/agent/flow/planning-flow.d.ts +3 -0
  70. package/dist/agent/flow/planning-flow.js +70 -8
  71. package/dist/agent/hermes-claw-migrate.d.ts +62 -0
  72. package/dist/agent/hermes-claw-migrate.js +189 -15
  73. package/dist/agent/hermes-memory-providers.js +3 -3
  74. package/dist/agent/hermes-parity-manifest.js +69 -15
  75. package/dist/agent/infrastructure/agent-infrastructure.d.ts +1 -0
  76. package/dist/agent/infrastructure/agent-infrastructure.js +1 -1
  77. package/dist/agent/isolation/agent-workspace.js +5 -2
  78. package/dist/agent/learning/skill-background-writes.js +9 -4
  79. package/dist/agent/learning-agent.js +4 -4
  80. package/dist/agent/learning-background-writes.js +9 -5
  81. package/dist/agent/lesson-candidate-queue.d.ts +4 -0
  82. package/dist/agent/lesson-candidate-queue.js +9 -3
  83. package/dist/agent/lesson-provenance.js +9 -3
  84. package/dist/agent/lessons-tracker.d.ts +68 -1
  85. package/dist/agent/lessons-tracker.js +218 -36
  86. package/dist/agent/loop-detection-service.d.ts +56 -0
  87. package/dist/agent/loop-detection-service.js +207 -0
  88. package/dist/agent/middleware/auto-observation.d.ts +2 -0
  89. package/dist/agent/middleware/auto-observation.js +4 -2
  90. package/dist/agent/middleware/auto-repair-middleware.d.ts +2 -0
  91. package/dist/agent/middleware/auto-repair-middleware.js +27 -4
  92. package/dist/agent/middleware/changed-files.d.ts +19 -0
  93. package/dist/agent/middleware/changed-files.js +113 -0
  94. package/dist/agent/middleware/cost-limit.d.ts +0 -2
  95. package/dist/agent/middleware/cost-limit.js +0 -3
  96. package/dist/agent/middleware/index.d.ts +2 -0
  97. package/dist/agent/middleware/index.js +1 -0
  98. package/dist/agent/middleware/pipeline.d.ts +9 -0
  99. package/dist/agent/middleware/pipeline.js +18 -0
  100. package/dist/agent/middleware/plan-completion-audit.d.ts +76 -0
  101. package/dist/agent/middleware/plan-completion-audit.js +157 -0
  102. package/dist/agent/middleware/quality-gate-middleware.d.ts +43 -1
  103. package/dist/agent/middleware/quality-gate-middleware.js +198 -40
  104. package/dist/agent/middleware/types.d.ts +6 -0
  105. package/dist/agent/middleware/verification-enforcement.d.ts +10 -3
  106. package/dist/agent/middleware/verification-enforcement.js +43 -13
  107. package/dist/agent/middleware/workflow-guard.js +7 -0
  108. package/dist/agent/model-benchmark.js +11 -17
  109. package/dist/agent/model-tier.d.ts +2 -2
  110. package/dist/agent/model-tier.js +10 -7
  111. package/dist/agent/multi-agent/agent-memory-integration.js +3 -2
  112. package/dist/agent/multi-agent/base-agent.d.ts +12 -1
  113. package/dist/agent/multi-agent/base-agent.js +58 -10
  114. package/dist/agent/multi-agent/enhanced-coordination.js +1 -0
  115. package/dist/agent/multi-agent/metrics-persistence.js +28 -14
  116. package/dist/agent/multi-agent/multi-agent-system.d.ts +5 -0
  117. package/dist/agent/multi-agent/multi-agent-system.js +81 -4
  118. package/dist/agent/multi-agent/session-fleet-bridge.js +2 -1
  119. package/dist/agent/multi-agent/session-registry.js +9 -3
  120. package/dist/agent/multi-agent/team-manager.d.ts +11 -0
  121. package/dist/agent/multi-agent/team-manager.js +94 -5
  122. package/dist/agent/multi-agent/types.d.ts +10 -1
  123. package/dist/agent/multi-agent/workflow-multi-persistence.js +16 -8
  124. package/dist/agent/multi-agent/workflow-persistence.js +9 -6
  125. package/dist/agent/observer/trigger-registry.js +3 -5
  126. package/dist/agent/operating-modes.d.ts +3 -0
  127. package/dist/agent/operating-modes.js +15 -22
  128. package/dist/agent/pipelines.d.ts +2 -4
  129. package/dist/agent/pipelines.js +1 -1
  130. package/dist/agent/plan-mode.js +1 -1
  131. package/dist/agent/prompt-suggestions.js +2 -1
  132. package/dist/agent/prompt-tool-observation.d.ts +55 -0
  133. package/dist/agent/prompt-tool-observation.js +165 -0
  134. package/dist/agent/reasoning/tree-of-thought.js +1 -1
  135. package/dist/agent/repair/repair-engine.js +1 -1
  136. package/dist/agent/repo-profiler.d.ts +12 -1
  137. package/dist/agent/repo-profiler.js +21 -15
  138. package/dist/agent/repo-profiling/cache.js +6 -9
  139. package/dist/agent/research-worker-provider.d.ts +38 -0
  140. package/dist/agent/research-worker-provider.js +30 -0
  141. package/dist/agent/science/experiment-decision.d.ts +48 -0
  142. package/dist/agent/science/experiment-decision.js +65 -0
  143. package/dist/agent/science/experiment-empirical-gate.d.ts +83 -0
  144. package/dist/agent/science/experiment-empirical-gate.js +156 -0
  145. package/dist/agent/science/experiment-fitness.d.ts +112 -0
  146. package/dist/agent/science/experiment-fitness.js +188 -0
  147. package/dist/agent/science/experiment-loop.d.ts +196 -0
  148. package/dist/agent/science/experiment-loop.js +765 -0
  149. package/dist/agent/science/experiment-orchestrator.d.ts +203 -0
  150. package/dist/agent/science/experiment-orchestrator.js +454 -0
  151. package/dist/agent/science/experiment-sandbox-backends.d.ts +56 -0
  152. package/dist/agent/science/experiment-sandbox-backends.js +201 -0
  153. package/dist/agent/science/experiment-sandbox.d.ts +105 -0
  154. package/dist/agent/science/experiment-sandbox.js +196 -0
  155. package/dist/agent/science/experiment-variant-store.d.ts +108 -0
  156. package/dist/agent/science/experiment-variant-store.js +156 -0
  157. package/dist/agent/science/human-gate.d.ts +31 -0
  158. package/dist/agent/science/human-gate.js +32 -0
  159. package/dist/agent/self-improvement/authored-artifact-gate.js +28 -3
  160. package/dist/agent/self-improvement/authored-tool-runtime.d.ts +4 -2
  161. package/dist/agent/self-improvement/authored-tool-runtime.js +8 -3
  162. package/dist/agent/self-improvement/authored-tool-store.js +3 -2
  163. package/dist/agent/self-improvement/capability-benchmark.js +89 -2
  164. package/dist/agent/self-improvement/continuous-benchmark.d.ts +105 -0
  165. package/dist/agent/self-improvement/continuous-benchmark.js +355 -0
  166. package/dist/agent/self-improvement/delegation-facts.d.ts +105 -0
  167. package/dist/agent/self-improvement/delegation-facts.js +483 -0
  168. package/dist/agent/self-improvement/digest-sources.d.ts +56 -0
  169. package/dist/agent/self-improvement/digest-sources.js +294 -0
  170. package/dist/agent/self-improvement/digest.d.ts +169 -0
  171. package/dist/agent/self-improvement/digest.js +543 -0
  172. package/dist/agent/self-improvement/engine.d.ts +11 -6
  173. package/dist/agent/self-improvement/engine.js +13 -7
  174. package/dist/agent/self-improvement/evolution/ast-novelty.d.ts +20 -0
  175. package/dist/agent/self-improvement/evolution/ast-novelty.js +81 -0
  176. package/dist/agent/self-improvement/evolution/code-variant-store.d.ts +101 -0
  177. package/dist/agent/self-improvement/evolution/code-variant-store.js +229 -0
  178. package/dist/agent/self-improvement/evolution/evolution-engine.d.ts +199 -0
  179. package/dist/agent/self-improvement/evolution/evolution-engine.js +503 -0
  180. package/dist/agent/self-improvement/evolution/feature-map.d.ts +24 -0
  181. package/dist/agent/self-improvement/evolution/feature-map.js +88 -0
  182. package/dist/agent/self-improvement/evolution/model-bandit.d.ts +57 -0
  183. package/dist/agent/self-improvement/evolution/model-bandit.js +98 -0
  184. package/dist/agent/self-improvement/evolution/protected-paths.d.ts +31 -0
  185. package/dist/agent/self-improvement/evolution/protected-paths.js +105 -0
  186. package/dist/agent/self-improvement/evolution/research-weakness-source.d.ts +56 -0
  187. package/dist/agent/self-improvement/evolution/research-weakness-source.js +161 -0
  188. package/dist/agent/self-improvement/evolution/scrub-env.d.ts +22 -0
  189. package/dist/agent/self-improvement/evolution/scrub-env.js +40 -0
  190. package/dist/agent/self-improvement/evolution/variant-fitness.d.ts +86 -0
  191. package/dist/agent/self-improvement/evolution/variant-fitness.js +217 -0
  192. package/dist/agent/self-improvement/evolution/variant-planner.d.ts +41 -0
  193. package/dist/agent/self-improvement/evolution/variant-planner.js +156 -0
  194. package/dist/agent/self-improvement/evolution/weakness-selector.d.ts +38 -0
  195. package/dist/agent/self-improvement/evolution/weakness-selector.js +108 -0
  196. package/dist/agent/self-improvement/evolution/worktree-scorer.d.ts +44 -0
  197. package/dist/agent/self-improvement/evolution/worktree-scorer.js +99 -0
  198. package/dist/agent/self-improvement/evolutionary-archive.js +3 -2
  199. package/dist/agent/self-improvement/experience-source.d.ts +60 -7
  200. package/dist/agent/self-improvement/experience-source.js +78 -8
  201. package/dist/agent/self-improvement/index.d.ts +1 -0
  202. package/dist/agent/self-improvement/index.js +6 -3
  203. package/dist/agent/self-improvement/learning-store.d.ts +16 -0
  204. package/dist/agent/self-improvement/learning-store.js +83 -3
  205. package/dist/agent/self-improvement/llm-drafter.d.ts +3 -1
  206. package/dist/agent/self-improvement/llm-drafter.js +20 -2
  207. package/dist/agent/self-improvement/llm-tool-proposer.js +1 -1
  208. package/dist/agent/self-improvement/proposal-store.d.ts +46 -0
  209. package/dist/agent/self-improvement/proposal-store.js +87 -0
  210. package/dist/agent/self-improvement/proposer.d.ts +1 -1
  211. package/dist/agent/self-improvement/proposer.js +94 -2
  212. package/dist/agent/self-improvement/rule-store.js +5 -4
  213. package/dist/agent/self-improvement/sandbox-scorer.d.ts +1 -1
  214. package/dist/agent/self-improvement/sandbox-scorer.js +8 -4
  215. package/dist/agent/self-improvement/self-knowledge.d.ts +1 -1
  216. package/dist/agent/self-improvement/self-knowledge.js +8 -8
  217. package/dist/agent/self-improvement/skill-benchmark.js +27 -0
  218. package/dist/agent/self-improvement/skill-consolidator.js +16 -0
  219. package/dist/agent/self-improvement/skill-engine.d.ts +7 -0
  220. package/dist/agent/self-improvement/skill-engine.js +54 -28
  221. package/dist/agent/self-improvement/skill-gate.d.ts +4 -4
  222. package/dist/agent/self-improvement/skill-gate.js +38 -20
  223. package/dist/agent/self-improvement/skill-mutator.d.ts +20 -1
  224. package/dist/agent/self-improvement/skill-mutator.js +138 -19
  225. package/dist/agent/self-improvement/skill-proposer.js +2 -1
  226. package/dist/agent/self-improvement/skill-types.d.ts +4 -0
  227. package/dist/agent/self-improvement/strategy-engine.d.ts +54 -0
  228. package/dist/agent/self-improvement/strategy-engine.js +104 -0
  229. package/dist/agent/self-improvement/strategy-gate.d.ts +49 -0
  230. package/dist/agent/self-improvement/strategy-gate.js +243 -0
  231. package/dist/agent/self-improvement/strategy-live.d.ts +39 -0
  232. package/dist/agent/self-improvement/strategy-live.js +114 -0
  233. package/dist/agent/self-improvement/strategy-proposer.d.ts +30 -0
  234. package/dist/agent/self-improvement/strategy-proposer.js +114 -0
  235. package/dist/agent/self-improvement/strategy-replay.d.ts +40 -0
  236. package/dist/agent/self-improvement/strategy-replay.js +150 -0
  237. package/dist/agent/self-improvement/strategy-runtime.d.ts +43 -0
  238. package/dist/agent/self-improvement/strategy-runtime.js +56 -0
  239. package/dist/agent/self-improvement/strategy-store.d.ts +38 -0
  240. package/dist/agent/self-improvement/strategy-store.js +139 -0
  241. package/dist/agent/self-improvement/strategy-types.d.ts +229 -0
  242. package/dist/agent/self-improvement/strategy-types.js +90 -0
  243. package/dist/agent/self-improvement/tool-benchmark.js +164 -8
  244. package/dist/agent/self-improvement/tool-engine.d.ts +12 -3
  245. package/dist/agent/self-improvement/tool-engine.js +59 -31
  246. package/dist/agent/self-improvement/tool-gate.d.ts +2 -0
  247. package/dist/agent/self-improvement/tool-gate.js +26 -0
  248. package/dist/agent/self-improvement/tool-skill-mutator.d.ts +1 -1
  249. package/dist/agent/self-improvement/tool-skill-mutator.js +20 -2
  250. package/dist/agent/self-improvement/tool-types.d.ts +5 -3
  251. package/dist/agent/self-improvement/types.d.ts +7 -3
  252. package/dist/agent/session-end-flush.js +2 -1
  253. package/dist/agent/specialized/agent-registry.d.ts +1 -0
  254. package/dist/agent/specialized/agent-registry.js +118 -0
  255. package/dist/agent/specialized/excel-agent.js +15 -1
  256. package/dist/agent/specialized/index.d.ts +1 -0
  257. package/dist/agent/specialized/index.js +2 -0
  258. package/dist/agent/specialized/pdf-agent.js +4 -2
  259. package/dist/agent/specialized/swe-agent-adapter.js +8 -0
  260. package/dist/agent/specialized/swe-agent.d.ts +16 -1
  261. package/dist/agent/specialized/swe-agent.js +75 -7
  262. package/dist/agent/specialized/types.d.ts +31 -1
  263. package/dist/agent/specialized/types.js +26 -0
  264. package/dist/agent/specialized/verifier-agent.d.ts +53 -0
  265. package/dist/agent/specialized/verifier-agent.js +342 -0
  266. package/dist/agent/streaming/message-reducer.js +73 -19
  267. package/dist/agent/streaming/streaming-handler.d.ts +24 -0
  268. package/dist/agent/streaming/streaming-handler.js +136 -1
  269. package/dist/agent/subagents.d.ts +10 -4
  270. package/dist/agent/subagents.js +39 -6
  271. package/dist/agent/thinking/extended-thinking.js +1 -1
  272. package/dist/agent/todo-tracker.js +5 -4
  273. package/dist/agent/tool-executor.d.ts +10 -1
  274. package/dist/agent/tool-executor.js +29 -0
  275. package/dist/agent/tool-handler.d.ts +49 -2
  276. package/dist/agent/tool-handler.js +738 -181
  277. package/dist/agent/types.d.ts +3 -5
  278. package/dist/agent/wide-research-checkpoint.d.ts +77 -0
  279. package/dist/agent/wide-research-checkpoint.js +361 -0
  280. package/dist/agent/wide-research-files.d.ts +11 -0
  281. package/dist/agent/wide-research-files.js +189 -0
  282. package/dist/agent/wide-research.d.ts +148 -3
  283. package/dist/agent/wide-research.js +833 -56
  284. package/dist/analytics/code-evolution.js +20 -15
  285. package/dist/analytics/complexity-analyzer.js +2 -2
  286. package/dist/analytics/cost-report.d.ts +71 -0
  287. package/dist/analytics/cost-report.js +724 -0
  288. package/dist/analytics/dashboard.js +8 -7
  289. package/dist/analytics/index.d.ts +2 -0
  290. package/dist/analytics/index.js +2 -0
  291. package/dist/analytics/repo-explainer-collector.d.ts +13 -0
  292. package/dist/analytics/repo-explainer-collector.js +351 -0
  293. package/dist/analytics/repo-explainer.d.ts +224 -0
  294. package/dist/analytics/repo-explainer.js +605 -0
  295. package/dist/analytics/roi-tracker.js +11 -9
  296. package/dist/api/webhooks.js +9 -14
  297. package/dist/app/application-factory.d.ts +1 -1
  298. package/dist/app/application-factory.js +6 -5
  299. package/dist/auth/profile-manager.js +8 -4
  300. package/dist/avatar/avatar-event-bus.d.ts +16 -0
  301. package/dist/avatar/avatar-event-bus.js +53 -0
  302. package/dist/avatar/avatar-gateway-bridge.d.ts +26 -0
  303. package/dist/avatar/avatar-gateway-bridge.js +54 -0
  304. package/dist/avatar/avatar-protocol.d.ts +133 -0
  305. package/dist/avatar/avatar-protocol.js +241 -0
  306. package/dist/avatar/avatar-renderer-registry.d.ts +56 -0
  307. package/dist/avatar/avatar-renderer-registry.js +191 -0
  308. package/dist/avatar/avatar-renderer-simulator.d.ts +31 -0
  309. package/dist/avatar/avatar-renderer-simulator.js +160 -0
  310. package/dist/browser-automation/browser-manager.d.ts +15 -1
  311. package/dist/browser-automation/browser-manager.js +101 -0
  312. package/dist/browser-automation/browser-operator-executor.d.ts +89 -7
  313. package/dist/browser-automation/browser-operator-executor.js +1280 -58
  314. package/dist/browser-automation/browser-operator-runtime.d.ts +87 -0
  315. package/dist/browser-automation/browser-operator-runtime.js +441 -0
  316. package/dist/browser-automation/browser-operator-session.js +4 -3
  317. package/dist/browser-automation/browser-tool.d.ts +17 -2
  318. package/dist/browser-automation/browser-tool.js +101 -39
  319. package/dist/browser-automation/internet-scout-plan.d.ts +1 -0
  320. package/dist/browser-automation/internet-scout-plan.js +17 -0
  321. package/dist/browser-automation/profile-manager.js +5 -3
  322. package/dist/browser-automation/types.d.ts +25 -0
  323. package/dist/cache/advanced-lru-cache.js +4 -4
  324. package/dist/cache/cache-manager.js +9 -10
  325. package/dist/cache/embedding-cache.js +6 -5
  326. package/dist/cache/llm-response-cache.js +3 -4
  327. package/dist/capture/screen-recorder.d.ts +2 -0
  328. package/dist/capture/screen-recorder.js +6 -4
  329. package/dist/capture/screen-watcher.d.ts +6 -3
  330. package/dist/capture/screen-watcher.js +86 -9
  331. package/dist/channels/channel-cognitive-port.d.ts +46 -0
  332. package/dist/channels/channel-cognitive-port.js +182 -0
  333. package/dist/channels/channel-model-override.d.ts +47 -0
  334. package/dist/channels/channel-model-override.js +62 -0
  335. package/dist/channels/companion-channel-profile.d.ts +68 -0
  336. package/dist/channels/companion-channel-profile.js +142 -0
  337. package/dist/channels/companion-channel-turn.d.ts +30 -0
  338. package/dist/channels/companion-channel-turn.js +38 -0
  339. package/dist/channels/core.d.ts +37 -3
  340. package/dist/channels/core.js +63 -6
  341. package/dist/channels/discord/client.js +34 -14
  342. package/dist/channels/dm-pairing.d.ts +18 -4
  343. package/dist/channels/dm-pairing.js +199 -33
  344. package/dist/channels/gateway-lifecycle.d.ts +2 -0
  345. package/dist/channels/gateway-lifecycle.js +1 -0
  346. package/dist/channels/identity-links.d.ts +19 -1
  347. package/dist/channels/identity-links.js +68 -12
  348. package/dist/channels/matrix/index.js +6 -2
  349. package/dist/channels/pro/pro-features.js +17 -0
  350. package/dist/channels/pro/run-tracker.js +9 -4
  351. package/dist/channels/pro/scoped-auth.js +10 -8
  352. package/dist/channels/provider-failure-speech.d.ts +28 -0
  353. package/dist/channels/provider-failure-speech.js +128 -0
  354. package/dist/channels/reconnection-manager.d.ts +2 -0
  355. package/dist/channels/reconnection-manager.js +7 -2
  356. package/dist/channels/resolve-channel-secret.d.ts +43 -0
  357. package/dist/channels/resolve-channel-secret.js +82 -0
  358. package/dist/channels/slack/block-builder.d.ts +12 -0
  359. package/dist/channels/slack/block-builder.js +70 -2
  360. package/dist/channels/slack/client.js +62 -15
  361. package/dist/channels/slack/types.d.ts +20 -1
  362. package/dist/channels/telegram/client.d.ts +36 -3
  363. package/dist/channels/telegram/client.js +438 -84
  364. package/dist/channels/telegram/types.d.ts +2 -0
  365. package/dist/channels/webhook-server.js +8 -1
  366. package/dist/channels/whatsapp/index.js +2 -1
  367. package/dist/checkpoints/ghost-snapshot.js +15 -9
  368. package/dist/checkpoints/persistent-checkpoint-manager.js +15 -8
  369. package/dist/cli/command-routing.d.ts +22 -0
  370. package/dist/cli/command-routing.js +54 -0
  371. package/dist/cli/first-run.d.ts +17 -0
  372. package/dist/cli/first-run.js +40 -0
  373. package/dist/cli/headless-options.d.ts +22 -0
  374. package/dist/cli/headless-options.js +112 -0
  375. package/dist/cli/headless-prompt-progress.d.ts +22 -0
  376. package/dist/cli/headless-prompt-progress.js +35 -0
  377. package/dist/cli/headless.js +2 -2
  378. package/dist/cli/listen-port.d.ts +8 -0
  379. package/dist/cli/listen-port.js +20 -0
  380. package/dist/cli/permission-mode-option.d.ts +14 -0
  381. package/dist/cli/permission-mode-option.js +64 -0
  382. package/dist/cli/requested-profile.d.ts +15 -0
  383. package/dist/cli/requested-profile.js +27 -0
  384. package/dist/cli/unknown-option-hint.d.ts +16 -0
  385. package/dist/cli/unknown-option-hint.js +116 -0
  386. package/dist/cli/voice-command.d.ts +32 -0
  387. package/dist/cli/voice-command.js +96 -0
  388. package/dist/codebuddy/abort-signal.d.ts +7 -0
  389. package/dist/codebuddy/abort-signal.js +31 -0
  390. package/dist/codebuddy/client.d.ts +68 -0
  391. package/dist/codebuddy/client.js +460 -11
  392. package/dist/codebuddy/fleet-tool-defs.js +5 -0
  393. package/dist/codebuddy/llm-retry.d.ts +24 -0
  394. package/dist/codebuddy/llm-retry.js +124 -0
  395. package/dist/codebuddy/provider-error-classifier.d.ts +86 -0
  396. package/dist/codebuddy/provider-error-classifier.js +410 -0
  397. package/dist/codebuddy/provider-failover-error.d.ts +16 -0
  398. package/dist/codebuddy/provider-failover-error.js +50 -0
  399. package/dist/codebuddy/provider-failover-kind.d.ts +15 -0
  400. package/dist/codebuddy/provider-failover-kind.js +172 -0
  401. package/dist/codebuddy/provider-handoff.d.ts +35 -0
  402. package/dist/codebuddy/provider-handoff.js +294 -0
  403. package/dist/codebuddy/providers/ollama-native-transport.d.ts +130 -0
  404. package/dist/codebuddy/providers/ollama-native-transport.js +387 -0
  405. package/dist/codebuddy/providers/provider-agy-cli.d.ts +29 -0
  406. package/dist/codebuddy/providers/provider-agy-cli.js +264 -0
  407. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +59 -7
  408. package/dist/codebuddy/providers/provider-chatgpt-responses.js +519 -164
  409. package/dist/codebuddy/providers/provider-gemini-cli.js +95 -13
  410. package/dist/codebuddy/providers/provider-gemini-native.d.ts +2 -0
  411. package/dist/codebuddy/providers/provider-gemini-native.js +199 -86
  412. package/dist/codebuddy/providers/provider-openai-compat.d.ts +82 -0
  413. package/dist/codebuddy/providers/provider-openai-compat.js +469 -45
  414. package/dist/codebuddy/stream-retry.d.ts +21 -8
  415. package/dist/codebuddy/stream-retry.js +44 -40
  416. package/dist/codebuddy/tool-definitions/advanced-tools.d.ts +4 -0
  417. package/dist/codebuddy/tool-definitions/advanced-tools.js +188 -0
  418. package/dist/codebuddy/tool-definitions/agent-tools.d.ts +5 -0
  419. package/dist/codebuddy/tool-definitions/agent-tools.js +195 -7
  420. package/dist/codebuddy/tool-definitions/browser-tools.d.ts +1 -0
  421. package/dist/codebuddy/tool-definitions/browser-tools.js +65 -1
  422. package/dist/codebuddy/tool-definitions/code-exec-tools.d.ts +8 -0
  423. package/dist/codebuddy/tool-definitions/code-exec-tools.js +29 -0
  424. package/dist/codebuddy/tool-definitions/code-explorer-tools.js +4 -0
  425. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.d.ts +3 -0
  426. package/dist/codebuddy/tool-definitions/comfy-recipe-tools.js +37 -0
  427. package/dist/codebuddy/tool-definitions/core-tools.d.ts +2 -0
  428. package/dist/codebuddy/tool-definitions/core-tools.js +58 -2
  429. package/dist/codebuddy/tool-definitions/delegate-agent-tools.d.ts +11 -0
  430. package/dist/codebuddy/tool-definitions/delegate-agent-tools.js +50 -0
  431. package/dist/codebuddy/tool-definitions/design-tools.d.ts +6 -0
  432. package/dist/codebuddy/tool-definitions/design-tools.js +35 -0
  433. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.d.ts +1 -0
  434. package/dist/codebuddy/tool-definitions/exit-plan-mode-tools.js +23 -1
  435. package/dist/codebuddy/tool-definitions/index.d.ts +16 -7
  436. package/dist/codebuddy/tool-definitions/index.js +27 -8
  437. package/dist/codebuddy/tool-definitions/lsp-tools.d.ts +7 -1
  438. package/dist/codebuddy/tool-definitions/lsp-tools.js +104 -1
  439. package/dist/codebuddy/tool-definitions/meeting-tools.d.ts +4 -0
  440. package/dist/codebuddy/tool-definitions/meeting-tools.js +32 -0
  441. package/dist/codebuddy/tool-definitions/moa-tools.js +7 -2
  442. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +14 -0
  443. package/dist/codebuddy/tool-definitions/multimodal-tools.js +615 -3
  444. package/dist/codebuddy/tool-definitions/research-tools.d.ts +20 -0
  445. package/dist/codebuddy/tool-definitions/research-tools.js +98 -0
  446. package/dist/codebuddy/tool-definitions/self-describe-tools.d.ts +4 -0
  447. package/dist/codebuddy/tool-definitions/self-describe-tools.js +28 -0
  448. package/dist/codebuddy/tool-definitions/self-evolution-tools.d.ts +4 -0
  449. package/dist/codebuddy/tool-definitions/self-evolution-tools.js +31 -0
  450. package/dist/codebuddy/tool-definitions/verify-tools.d.ts +14 -0
  451. package/dist/codebuddy/tool-definitions/verify-tools.js +36 -0
  452. package/dist/codebuddy/tool-definitions/web-tools.d.ts +4 -0
  453. package/dist/codebuddy/tool-definitions/web-tools.js +135 -0
  454. package/dist/codebuddy/tool-definitions/workspace-tools.d.ts +4 -0
  455. package/dist/codebuddy/tool-definitions/workspace-tools.js +43 -0
  456. package/dist/codebuddy/tools.d.ts +15 -17
  457. package/dist/codebuddy/tools.js +235 -55
  458. package/dist/cognition/budget-reservations.d.ts +27 -0
  459. package/dist/cognition/budget-reservations.js +70 -0
  460. package/dist/cognition/cognitive-bus-client.d.ts +94 -0
  461. package/dist/cognition/cognitive-bus-client.js +724 -0
  462. package/dist/cognition/cognitive-hub.d.ts +93 -0
  463. package/dist/cognition/cognitive-hub.js +366 -0
  464. package/dist/cognition/cognitive-mesh.d.ts +38 -0
  465. package/dist/cognition/cognitive-mesh.js +263 -0
  466. package/dist/cognition/cognitive-port.d.ts +35 -0
  467. package/dist/cognition/cognitive-port.js +80 -0
  468. package/dist/cognition/cognitive-wire-contract.d.ts +1542 -0
  469. package/dist/cognition/cognitive-wire-contract.js +164 -0
  470. package/dist/cognition/context-renderer.d.ts +52 -0
  471. package/dist/cognition/context-renderer.js +227 -0
  472. package/dist/cognition/global-workspace.d.ts +39 -0
  473. package/dist/cognition/global-workspace.js +181 -0
  474. package/dist/cognition/index.d.ts +9 -0
  475. package/dist/cognition/index.js +10 -0
  476. package/dist/cognition/llm-specialist.d.ts +40 -0
  477. package/dist/cognition/llm-specialist.js +93 -0
  478. package/dist/cognition/sensory-workspace.d.ts +57 -0
  479. package/dist/cognition/sensory-workspace.js +346 -0
  480. package/dist/cognition/types.d.ts +93 -0
  481. package/dist/cognition/types.js +7 -0
  482. package/dist/cognition/voice-specialists.d.ts +21 -0
  483. package/dist/cognition/voice-specialists.js +89 -0
  484. package/dist/cognition/world-model.d.ts +95 -0
  485. package/dist/cognition/world-model.js +228 -0
  486. package/dist/collaboration/ai-colab-manager.js +12 -13
  487. package/dist/collaboration/team-session.js +25 -11
  488. package/dist/commands/apply-permission-mode.d.ts +27 -0
  489. package/dist/commands/apply-permission-mode.js +35 -0
  490. package/dist/commands/assistant.d.ts +3 -0
  491. package/dist/commands/assistant.js +1022 -0
  492. package/dist/commands/campaign.d.ts +6 -0
  493. package/dist/commands/campaign.js +140 -0
  494. package/dist/commands/capsule.d.ts +2 -0
  495. package/dist/commands/capsule.js +104 -0
  496. package/dist/commands/changelog.d.ts +29 -0
  497. package/dist/commands/changelog.js +283 -0
  498. package/dist/commands/cli/acp-command.js +4 -1
  499. package/dist/commands/cli/backup-command.d.ts +9 -0
  500. package/dist/commands/cli/backup-command.js +47 -0
  501. package/dist/commands/cli/evolve-command.d.ts +26 -0
  502. package/dist/commands/cli/evolve-command.js +259 -0
  503. package/dist/commands/cli/fleet-commands.js +105 -0
  504. package/dist/commands/cli/improve-command.d.ts +2 -1
  505. package/dist/commands/cli/improve-command.js +309 -20
  506. package/dist/commands/cli/native-engine-commands.js +405 -28
  507. package/dist/commands/cli/sensory-command.d.ts +8 -0
  508. package/dist/commands/cli/sensory-command.js +27 -0
  509. package/dist/commands/cli/speak-command.js +87 -24
  510. package/dist/commands/cli/tools-commands.js +68 -36
  511. package/dist/commands/cli/utility-commands.js +34 -9
  512. package/dist/commands/client-dispatcher.d.ts +1 -0
  513. package/dist/commands/client-dispatcher.js +40 -21
  514. package/dist/commands/compress.js +3 -0
  515. package/dist/commands/cost.d.ts +33 -0
  516. package/dist/commands/cost.js +342 -0
  517. package/dist/commands/council-scoreboard.d.ts +8 -0
  518. package/dist/commands/council-scoreboard.js +68 -0
  519. package/dist/commands/council.d.ts +16 -24
  520. package/dist/commands/council.js +247 -255
  521. package/dist/commands/curator-cli.d.ts +14 -0
  522. package/dist/commands/curator-cli.js +57 -0
  523. package/dist/commands/delegate.js +82 -25
  524. package/dist/commands/dev/golden-path.d.ts +71 -0
  525. package/dist/commands/dev/golden-path.js +317 -0
  526. package/dist/commands/dev/index.d.ts +3 -0
  527. package/dist/commands/dev/index.js +151 -119
  528. package/dist/commands/dev/issue-pipeline.js +7 -7
  529. package/dist/commands/dev/workflows.d.ts +2 -0
  530. package/dist/commands/dev/workflows.js +39 -6
  531. package/dist/commands/enhanced-command-handler.d.ts +3 -0
  532. package/dist/commands/enhanced-command-handler.js +29 -12
  533. package/dist/commands/exchange.d.ts +2 -0
  534. package/dist/commands/exchange.js +193 -0
  535. package/dist/commands/explain.d.ts +12 -0
  536. package/dist/commands/explain.js +135 -0
  537. package/dist/commands/film.d.ts +18 -0
  538. package/dist/commands/film.js +239 -0
  539. package/dist/commands/flow.js +15 -5
  540. package/dist/commands/forge.d.ts +2 -0
  541. package/dist/commands/forge.js +102 -0
  542. package/dist/commands/goal-cli.d.ts +3 -0
  543. package/dist/commands/goal-cli.js +9 -4
  544. package/dist/commands/gpu-worker.d.ts +14 -0
  545. package/dist/commands/gpu-worker.js +135 -0
  546. package/dist/commands/handlers/agents-handler.d.ts +11 -2
  547. package/dist/commands/handlers/agents-handler.js +79 -13
  548. package/dist/commands/handlers/auth-handlers.js +12 -5
  549. package/dist/commands/handlers/backup-handlers.d.ts +40 -0
  550. package/dist/commands/handlers/backup-handlers.js +784 -57
  551. package/dist/commands/handlers/batch-handlers.d.ts +72 -2
  552. package/dist/commands/handlers/batch-handlers.js +443 -37
  553. package/dist/commands/handlers/branch-handlers.d.ts +1 -0
  554. package/dist/commands/handlers/channel-handlers.d.ts +7 -2
  555. package/dist/commands/handlers/channel-handlers.js +1705 -103
  556. package/dist/commands/handlers/companion-handler.js +130 -9
  557. package/dist/commands/handlers/daily-reset-handler.d.ts +1 -1
  558. package/dist/commands/handlers/daily-reset-handler.js +1 -1
  559. package/dist/commands/handlers/deepthink-handler.d.ts +2 -0
  560. package/dist/commands/handlers/deepthink-handler.js +49 -0
  561. package/dist/commands/handlers/extra-handlers.js +23 -24
  562. package/dist/commands/handlers/fleet-handler.d.ts +3 -4
  563. package/dist/commands/handlers/fleet-handler.js +82 -35
  564. package/dist/commands/handlers/goal-handler.d.ts +13 -0
  565. package/dist/commands/handlers/goal-handler.js +26 -7
  566. package/dist/commands/handlers/grill-me-handler.d.ts +2 -0
  567. package/dist/commands/handlers/grill-me-handler.js +41 -0
  568. package/dist/commands/handlers/heartbeat-handler.d.ts +2 -2
  569. package/dist/commands/handlers/heartbeat-handler.js +2 -2
  570. package/dist/commands/handlers/index.d.ts +3 -2
  571. package/dist/commands/handlers/index.js +4 -2
  572. package/dist/commands/handlers/memory-handlers.js +40 -0
  573. package/dist/commands/handlers/permissions-handlers.js +3 -2
  574. package/dist/commands/handlers/pr-handlers.js +15 -17
  575. package/dist/commands/handlers/security-handlers.d.ts +1 -1
  576. package/dist/commands/handlers/security-handlers.js +3 -3
  577. package/dist/commands/handlers/slash-session-handlers.d.ts +9 -0
  578. package/dist/commands/handlers/slash-session-handlers.js +134 -0
  579. package/dist/commands/handlers/swarm-handler.js +41 -2
  580. package/dist/commands/handlers/team-handlers.d.ts +28 -1
  581. package/dist/commands/handlers/team-handlers.js +243 -2
  582. package/dist/commands/handlers/think-handlers.js +2 -1
  583. package/dist/commands/handlers/vibe-handlers.js +8 -1
  584. package/dist/commands/handlers/worktree-handlers.js +23 -12
  585. package/dist/commands/headless-slash.d.ts +9 -0
  586. package/dist/commands/headless-slash.js +41 -3
  587. package/dist/commands/import.d.ts +34 -0
  588. package/dist/commands/import.js +478 -0
  589. package/dist/commands/index.d.ts +0 -1
  590. package/dist/commands/index.js +0 -1
  591. package/dist/commands/influencer.d.ts +2 -0
  592. package/dist/commands/influencer.js +87 -0
  593. package/dist/commands/intent.d.ts +6 -0
  594. package/dist/commands/intent.js +131 -0
  595. package/dist/commands/intents.d.ts +10 -0
  596. package/dist/commands/intents.js +163 -0
  597. package/dist/commands/lessons.js +91 -0
  598. package/dist/commands/llm-provider-resolution.d.ts +20 -0
  599. package/dist/commands/llm-provider-resolution.js +74 -13
  600. package/dist/commands/login-prerequisites.d.ts +11 -0
  601. package/dist/commands/login-prerequisites.js +23 -0
  602. package/dist/commands/loop-cli.d.ts +31 -0
  603. package/dist/commands/loop-cli.js +189 -0
  604. package/dist/commands/lora.d.ts +6 -0
  605. package/dist/commands/lora.js +445 -0
  606. package/dist/commands/maison-food.d.ts +10 -0
  607. package/dist/commands/maison-food.js +485 -0
  608. package/dist/commands/maison.d.ts +17 -0
  609. package/dist/commands/maison.js +236 -0
  610. package/dist/commands/mcp.d.ts +6 -0
  611. package/dist/commands/mcp.js +236 -7
  612. package/dist/commands/meeting.d.ts +8 -0
  613. package/dist/commands/meeting.js +31 -0
  614. package/dist/commands/pairing.js +7 -8
  615. package/dist/commands/papers/ask.d.ts +47 -0
  616. package/dist/commands/papers/ask.js +105 -0
  617. package/dist/commands/papers/index.d.ts +19 -0
  618. package/dist/commands/papers/index.js +54 -0
  619. package/dist/commands/provider.d.ts +9 -0
  620. package/dist/commands/provider.js +178 -10
  621. package/dist/commands/replay.d.ts +11 -0
  622. package/dist/commands/replay.js +131 -0
  623. package/dist/commands/research/deep.d.ts +66 -0
  624. package/dist/commands/research/deep.js +236 -0
  625. package/dist/commands/research/discover-searxng.d.ts +25 -0
  626. package/dist/commands/research/discover-searxng.js +62 -0
  627. package/dist/commands/research/index.d.ts +24 -2
  628. package/dist/commands/research/index.js +456 -79
  629. package/dist/commands/research/knowledge-ingest.d.ts +170 -0
  630. package/dist/commands/research/knowledge-ingest.js +449 -0
  631. package/dist/commands/research/wire-research-worker.d.ts +9 -0
  632. package/dist/commands/research/wire-research-worker.js +18 -0
  633. package/dist/commands/run-cli/index.d.ts +3 -1
  634. package/dist/commands/run-cli/index.js +53 -2
  635. package/dist/commands/science/deps.d.ts +95 -0
  636. package/dist/commands/science/deps.js +343 -0
  637. package/dist/commands/science/index.d.ts +31 -0
  638. package/dist/commands/science/index.js +285 -0
  639. package/dist/commands/science/loop-option.d.ts +40 -0
  640. package/dist/commands/science/loop-option.js +91 -0
  641. package/dist/commands/science/sandbox-option.d.ts +44 -0
  642. package/dist/commands/science/sandbox-option.js +42 -0
  643. package/dist/commands/scrape.d.ts +18 -0
  644. package/dist/commands/scrape.js +159 -0
  645. package/dist/commands/self.d.ts +9 -0
  646. package/dist/commands/self.js +56 -0
  647. package/dist/commands/shadow.d.ts +3 -0
  648. package/dist/commands/shadow.js +72 -0
  649. package/dist/commands/share.d.ts +13 -0
  650. package/dist/commands/share.js +71 -0
  651. package/dist/commands/shell-prefix.d.ts +4 -22
  652. package/dist/commands/shell-prefix.js +11 -73
  653. package/dist/commands/skills-cli/index.d.ts +2 -0
  654. package/dist/commands/skills-cli/index.js +190 -15
  655. package/dist/commands/slash/builtin-commands.js +41 -21
  656. package/dist/commands/slash-commands.js +4 -1
  657. package/dist/commands/token.d.ts +80 -0
  658. package/dist/commands/token.js +319 -0
  659. package/dist/commands/try.d.ts +72 -0
  660. package/dist/commands/try.js +357 -0
  661. package/dist/commands/update.d.ts +14 -1
  662. package/dist/commands/update.js +97 -15
  663. package/dist/commands/vision-train.d.ts +15 -0
  664. package/dist/commands/vision-train.js +214 -0
  665. package/dist/commands/whoami-status.d.ts +17 -0
  666. package/dist/commands/whoami-status.js +34 -0
  667. package/dist/commands/widgets.d.ts +2 -0
  668. package/dist/commands/widgets.js +179 -0
  669. package/dist/commands/ws.d.ts +7 -0
  670. package/dist/commands/ws.js +100 -0
  671. package/dist/companion/assistant-config.d.ts +79 -0
  672. package/dist/companion/assistant-config.js +1148 -0
  673. package/dist/companion/attached-image-grounding.d.ts +29 -0
  674. package/dist/companion/attached-image-grounding.js +285 -0
  675. package/dist/companion/away-mode.d.ts +80 -0
  676. package/dist/companion/away-mode.js +269 -0
  677. package/dist/companion/camera-share.d.ts +65 -0
  678. package/dist/companion/camera-share.js +321 -0
  679. package/dist/companion/camera.d.ts +8 -0
  680. package/dist/companion/camera.js +57 -31
  681. package/dist/companion/cards.js +7 -10
  682. package/dist/companion/check-in.js +23 -8
  683. package/dist/companion/companion-doctor.d.ts +58 -0
  684. package/dist/companion/companion-doctor.js +194 -0
  685. package/dist/companion/companion-history.d.ts +23 -0
  686. package/dist/companion/companion-history.js +22 -0
  687. package/dist/companion/companion-mode.d.ts +77 -1
  688. package/dist/companion/companion-mode.js +916 -6
  689. package/dist/companion/companion-photo-intake.d.ts +40 -0
  690. package/dist/companion/companion-photo-intake.js +112 -0
  691. package/dist/companion/companion-photo.d.ts +144 -0
  692. package/dist/companion/companion-photo.js +318 -0
  693. package/dist/companion/companion-turn.d.ts +88 -0
  694. package/dist/companion/companion-turn.js +223 -0
  695. package/dist/companion/companion-voice-character.d.ts +62 -0
  696. package/dist/companion/companion-voice-character.js +148 -0
  697. package/dist/companion/competitive-radar.js +14 -13
  698. package/dist/companion/continuity.d.ts +62 -0
  699. package/dist/companion/continuity.js +284 -0
  700. package/dist/companion/conversation-improvement-loop.d.ts +61 -0
  701. package/dist/companion/conversation-improvement-loop.js +317 -0
  702. package/dist/companion/conversation-quality-insights.d.ts +56 -0
  703. package/dist/companion/conversation-quality-insights.js +161 -0
  704. package/dist/companion/cooking-timer-runner.d.ts +20 -0
  705. package/dist/companion/cooking-timer-runner.js +98 -0
  706. package/dist/companion/core-adapter.d.ts +60 -0
  707. package/dist/companion/core-adapter.js +111 -0
  708. package/dist/companion/crisis-safety.d.ts +52 -0
  709. package/dist/companion/crisis-safety.js +150 -0
  710. package/dist/companion/daily-interaction-budget.d.ts +34 -0
  711. package/dist/companion/daily-interaction-budget.js +260 -0
  712. package/dist/companion/dialogue-percepts.d.ts +16 -0
  713. package/dist/companion/dialogue-percepts.js +50 -0
  714. package/dist/companion/event-followups.d.ts +58 -0
  715. package/dist/companion/event-followups.js +213 -0
  716. package/dist/companion/fashion-scene-catalog.d.ts +29 -0
  717. package/dist/companion/fashion-scene-catalog.js +141 -0
  718. package/dist/companion/gateway-inbox.js +25 -13
  719. package/dist/companion/gateway.d.ts +1 -0
  720. package/dist/companion/gateway.js +37 -17
  721. package/dist/companion/home-interaction-policy.d.ts +31 -0
  722. package/dist/companion/home-interaction-policy.js +89 -0
  723. package/dist/companion/household-time.d.ts +9 -0
  724. package/dist/companion/household-time.js +15 -0
  725. package/dist/companion/idle-loop.d.ts +53 -0
  726. package/dist/companion/idle-loop.js +254 -0
  727. package/dist/companion/impulses.js +148 -23
  728. package/dist/companion/inner-life.d.ts +60 -0
  729. package/dist/companion/inner-life.js +112 -0
  730. package/dist/companion/jokes.d.ts +21 -0
  731. package/dist/companion/jokes.js +175 -0
  732. package/dist/companion/lisa-selfie-cache.d.ts +36 -0
  733. package/dist/companion/lisa-selfie-cache.js +123 -0
  734. package/dist/companion/lisa-selfie-ingest.d.ts +36 -0
  735. package/dist/companion/lisa-selfie-ingest.js +205 -0
  736. package/dist/companion/lisa-selfie-refill.d.ts +32 -0
  737. package/dist/companion/lisa-selfie-refill.js +121 -0
  738. package/dist/companion/lisa-selfie-router.d.ts +40 -0
  739. package/dist/companion/lisa-selfie-router.js +156 -0
  740. package/dist/companion/lisa-selfie.d.ts +97 -0
  741. package/dist/companion/lisa-selfie.js +542 -0
  742. package/dist/companion/maison-voice-actions.d.ts +34 -0
  743. package/dist/companion/maison-voice-actions.js +192 -0
  744. package/dist/companion/migration.d.ts +63 -0
  745. package/dist/companion/migration.js +270 -0
  746. package/dist/companion/mission-board.js +7 -10
  747. package/dist/companion/mission-runner.js +2 -3
  748. package/dist/companion/mobile-conversation-log.d.ts +19 -0
  749. package/dist/companion/mobile-conversation-log.js +157 -0
  750. package/dist/companion/mobile-history.d.ts +34 -0
  751. package/dist/companion/mobile-history.js +123 -0
  752. package/dist/companion/mysoulmate-image-prompts.d.ts +26 -0
  753. package/dist/companion/mysoulmate-image-prompts.js +278 -0
  754. package/dist/companion/orchestrator.d.ts +32 -0
  755. package/dist/companion/orchestrator.js +49 -0
  756. package/dist/companion/percepts.d.ts +70 -0
  757. package/dist/companion/percepts.js +251 -18
  758. package/dist/companion/personas/copine.d.ts +8 -0
  759. package/dist/companion/personas/copine.js +195 -0
  760. package/dist/companion/personas/index.d.ts +19 -0
  761. package/dist/companion/personas/index.js +33 -0
  762. package/dist/companion/personas/types.d.ts +34 -0
  763. package/dist/companion/personas/types.js +8 -0
  764. package/dist/companion/photo-memory-fr.d.ts +36 -0
  765. package/dist/companion/photo-memory-fr.js +291 -0
  766. package/dist/companion/prefetch-config.d.ts +38 -0
  767. package/dist/companion/prefetch-config.js +119 -0
  768. package/dist/companion/prefetch-engine.d.ts +87 -0
  769. package/dist/companion/prefetch-engine.js +513 -0
  770. package/dist/companion/presence-loop.d.ts +85 -0
  771. package/dist/companion/presence-loop.js +297 -0
  772. package/dist/companion/privacy.js +3 -2
  773. package/dist/companion/proactive-engine.d.ts +97 -0
  774. package/dist/companion/proactive-engine.js +447 -0
  775. package/dist/companion/recent-said.d.ts +30 -0
  776. package/dist/companion/recent-said.js +98 -0
  777. package/dist/companion/relational-benchmark-scenarios.d.ts +191 -0
  778. package/dist/companion/relational-benchmark-scenarios.js +227 -0
  779. package/dist/companion/relational-context.d.ts +71 -0
  780. package/dist/companion/relational-context.js +302 -0
  781. package/dist/companion/relational-episode-evaluator.d.ts +117 -0
  782. package/dist/companion/relational-episode-evaluator.js +453 -0
  783. package/dist/companion/relationship-evolution.d.ts +2 -0
  784. package/dist/companion/relationship-evolution.js +30 -0
  785. package/dist/companion/relationship-state.d.ts +106 -0
  786. package/dist/companion/relationship-state.js +293 -0
  787. package/dist/companion/reminder-runner.d.ts +33 -0
  788. package/dist/companion/reminder-runner.js +183 -0
  789. package/dist/companion/reminders.d.ts +228 -0
  790. package/dist/companion/reminders.js +906 -0
  791. package/dist/companion/reply-augment.d.ts +87 -0
  792. package/dist/companion/reply-augment.js +464 -0
  793. package/dist/companion/safety-ledger.js +19 -12
  794. package/dist/companion/self-evaluation.js +22 -23
  795. package/dist/companion/shared-photo-memory.d.ts +65 -0
  796. package/dist/companion/shared-photo-memory.js +145 -0
  797. package/dist/companion/shared-photos.d.ts +88 -0
  798. package/dist/companion/shared-photos.js +321 -0
  799. package/dist/companion/signature-locations.d.ts +16 -0
  800. package/dist/companion/signature-locations.js +108 -0
  801. package/dist/companion/skill-curator.d.ts +9 -0
  802. package/dist/companion/skill-curator.js +147 -58
  803. package/dist/companion/untrusted-text.d.ts +22 -0
  804. package/dist/companion/untrusted-text.js +47 -0
  805. package/dist/companion/user-name.d.ts +18 -0
  806. package/dist/companion/user-name.js +22 -0
  807. package/dist/companion/visual-consent.d.ts +40 -0
  808. package/dist/companion/visual-consent.js +98 -0
  809. package/dist/companion/visual-grounding.d.ts +83 -0
  810. package/dist/companion/visual-grounding.js +474 -0
  811. package/dist/companion/voice-callbacks.d.ts +9 -0
  812. package/dist/companion/voice-callbacks.js +84 -0
  813. package/dist/companion/voice-guidance.d.ts +23 -0
  814. package/dist/companion/voice-guidance.js +85 -0
  815. package/dist/companion/voice-improvement-loop.d.ts +53 -0
  816. package/dist/companion/voice-improvement-loop.js +279 -0
  817. package/dist/companion/voice-incident-repair.d.ts +41 -0
  818. package/dist/companion/voice-incident-repair.js +214 -0
  819. package/dist/config/constants.d.ts +41 -0
  820. package/dist/config/constants.js +14 -0
  821. package/dist/config/env-schema.d.ts +2 -0
  822. package/dist/config/env-schema.js +714 -5
  823. package/dist/config/feature-flags.js +8 -12
  824. package/dist/config/feature-surface.d.ts +12 -0
  825. package/dist/config/feature-surface.js +86 -0
  826. package/dist/config/headless-local-prompt.d.ts +9 -0
  827. package/dist/config/headless-local-prompt.js +39 -0
  828. package/dist/config/local-runtime-context.d.ts +41 -0
  829. package/dist/config/local-runtime-context.js +430 -0
  830. package/dist/config/model-registry.js +4 -0
  831. package/dist/config/model-strengths.d.ts +14 -0
  832. package/dist/config/model-strengths.js +15 -0
  833. package/dist/config/model-tools.d.ts +56 -0
  834. package/dist/config/model-tools.js +819 -21
  835. package/dist/config/secret-ref.d.ts +22 -3
  836. package/dist/config/secret-ref.js +103 -41
  837. package/dist/config/toml-config.d.ts +20 -4
  838. package/dist/config/toml-config.js +40 -2
  839. package/dist/context/auto-compact-threshold.d.ts +1 -1
  840. package/dist/context/auto-compact-threshold.js +1 -1
  841. package/dist/context/codebase-map.js +9 -4
  842. package/dist/context/codebase-rag/codebase-rag.js +7 -6
  843. package/dist/context/codebase-rag/hnsw-store.js +9 -4
  844. package/dist/context/codebase-rag/vector-store.js +4 -4
  845. package/dist/context/compaction/parallel-summarizer.js +1 -0
  846. package/dist/context/compression.js +25 -29
  847. package/dist/context/context-manager-v2.d.ts +95 -7
  848. package/dist/context/context-manager-v2.js +442 -89
  849. package/dist/context/context-manager-v3.d.ts +4 -0
  850. package/dist/context/context-manager-v3.js +68 -9
  851. package/dist/context/cross-encoder-reranker.js +8 -3
  852. package/dist/context/default-context-engine.js +1 -1
  853. package/dist/context/enhanced-compression.d.ts +26 -2
  854. package/dist/context/enhanced-compression.js +81 -30
  855. package/dist/context/file-mentions.d.ts +46 -0
  856. package/dist/context/file-mentions.js +245 -0
  857. package/dist/context/importance-scorer.js +4 -3
  858. package/dist/context/jit-context.d.ts +7 -0
  859. package/dist/context/jit-context.js +22 -4
  860. package/dist/context/lm-resizer-compressor.d.ts +102 -0
  861. package/dist/context/lm-resizer-compressor.js +593 -0
  862. package/dist/context/precompaction-flush.js +1 -1
  863. package/dist/context/restorable-compression.d.ts +59 -14
  864. package/dist/context/restorable-compression.js +310 -60
  865. package/dist/context/segment-archive.d.ts +36 -0
  866. package/dist/context/segment-archive.js +220 -0
  867. package/dist/context/smart-compaction.d.ts +7 -0
  868. package/dist/context/smart-compaction.js +84 -15
  869. package/dist/context/token-counter.d.ts +6 -0
  870. package/dist/context/token-counter.js +41 -0
  871. package/dist/context/token-juice.d.ts +72 -0
  872. package/dist/context/token-juice.js +220 -0
  873. package/dist/context/tool-observation-optimizer.d.ts +90 -0
  874. package/dist/context/tool-observation-optimizer.js +231 -0
  875. package/dist/context/tool-pair-preserver.d.ts +1 -1
  876. package/dist/context/tool-pair-preserver.js +1 -1
  877. package/dist/context/transcript-repair.d.ts +16 -3
  878. package/dist/context/transcript-repair.js +72 -35
  879. package/dist/context/types.d.ts +2 -0
  880. package/dist/conversation/argument-obligations.d.ts +65 -0
  881. package/dist/conversation/argument-obligations.js +157 -0
  882. package/dist/conversation/companion-model-routing.d.ts +121 -0
  883. package/dist/conversation/companion-model-routing.js +810 -0
  884. package/dist/conversation/conversation-benchmark.d.ts +143 -0
  885. package/dist/conversation/conversation-benchmark.js +766 -0
  886. package/dist/conversation/conversation-blind-comparison.d.ts +135 -0
  887. package/dist/conversation/conversation-blind-comparison.js +451 -0
  888. package/dist/conversation/conversation-evaluator.d.ts +56 -0
  889. package/dist/conversation/conversation-evaluator.js +335 -0
  890. package/dist/conversation/conversation-orchestrator.d.ts +32 -0
  891. package/dist/conversation/conversation-orchestrator.js +59 -0
  892. package/dist/conversation/conversation-pilot-corpus.d.ts +33 -0
  893. package/dist/conversation/conversation-pilot-corpus.js +313 -0
  894. package/dist/conversation/conversation-quality.d.ts +31 -0
  895. package/dist/conversation/conversation-quality.js +280 -0
  896. package/dist/conversation/conversation-state.d.ts +23 -0
  897. package/dist/conversation/conversation-state.js +117 -0
  898. package/dist/conversation/cross-channel-bridge.d.ts +127 -0
  899. package/dist/conversation/cross-channel-bridge.js +785 -0
  900. package/dist/conversation/deliberation-thread.d.ts +18 -0
  901. package/dist/conversation/deliberation-thread.js +303 -0
  902. package/dist/conversation/dialogue-act.d.ts +11 -0
  903. package/dist/conversation/dialogue-act.js +132 -0
  904. package/dist/conversation/discourse-planner.d.ts +3 -0
  905. package/dist/conversation/discourse-planner.js +141 -0
  906. package/dist/conversation/fresh-context.d.ts +54 -0
  907. package/dist/conversation/fresh-context.js +258 -0
  908. package/dist/conversation/prefetched-turn-context.d.ts +45 -0
  909. package/dist/conversation/prefetched-turn-context.js +209 -0
  910. package/dist/conversation/relationship-safety.d.ts +37 -0
  911. package/dist/conversation/relationship-safety.js +407 -0
  912. package/dist/conversation/semantic-response-gate.d.ts +262 -0
  913. package/dist/conversation/semantic-response-gate.js +656 -0
  914. package/dist/conversation/semantic-response-runtime.d.ts +79 -0
  915. package/dist/conversation/semantic-response-runtime.js +419 -0
  916. package/dist/conversation/shared-relationship-state.d.ts +60 -0
  917. package/dist/conversation/shared-relationship-state.js +262 -0
  918. package/dist/conversation/types.d.ts +77 -0
  919. package/dist/conversation/types.js +3 -0
  920. package/dist/conversation/voice-continuity.d.ts +13 -0
  921. package/dist/conversation/voice-continuity.js +48 -0
  922. package/dist/council/conductor.d.ts +26 -0
  923. package/dist/council/conductor.js +292 -0
  924. package/dist/council/council-engine.d.ts +29 -0
  925. package/dist/council/council-engine.js +458 -0
  926. package/dist/council/deliberation-health.d.ts +58 -0
  927. package/dist/council/deliberation-health.js +108 -0
  928. package/dist/council/judge.d.ts +69 -0
  929. package/dist/council/judge.js +183 -0
  930. package/dist/council/peers.d.ts +19 -0
  931. package/dist/council/peers.js +47 -0
  932. package/dist/council/signals.d.ts +26 -0
  933. package/dist/council/signals.js +156 -0
  934. package/dist/council/task-types.d.ts +16 -0
  935. package/dist/council/task-types.js +58 -0
  936. package/dist/council/triage.d.ts +48 -0
  937. package/dist/council/triage.js +228 -0
  938. package/dist/council/types.d.ts +292 -0
  939. package/dist/council/types.js +20 -0
  940. package/dist/council/with-timeout.d.ts +10 -0
  941. package/dist/council/with-timeout.js +29 -0
  942. package/dist/curator/curator.d.ts +79 -0
  943. package/dist/curator/curator.js +317 -0
  944. package/dist/daemon/agent-task-executor.js +51 -0
  945. package/dist/daemon/autonomous-daemon.d.ts +2 -0
  946. package/dist/daemon/autonomous-daemon.js +4 -1
  947. package/dist/daemon/autonomous-loop.d.ts +9 -0
  948. package/dist/daemon/autonomous-loop.js +57 -1
  949. package/dist/daemon/autonomy-bench-candidates.d.ts +33 -0
  950. package/dist/daemon/autonomy-bench-candidates.js +68 -0
  951. package/dist/daemon/autonomy-briefing.d.ts +112 -0
  952. package/dist/daemon/autonomy-briefing.js +359 -0
  953. package/dist/daemon/autonomy-run-journal.d.ts +20 -0
  954. package/dist/daemon/autonomy-run-journal.js +41 -0
  955. package/dist/daemon/daily-reset.d.ts +2 -2
  956. package/dist/daemon/daily-reset.js +16 -15
  957. package/dist/daemon/ollama-task-executor.js +9 -1
  958. package/dist/database/database-manager.d.ts +1 -1
  959. package/dist/database/database-manager.js +6 -4
  960. package/dist/database/optional-sqlite.d.ts +20 -0
  961. package/dist/database/optional-sqlite.js +101 -0
  962. package/dist/design/design-system-registry.d.ts +21 -0
  963. package/dist/design/design-system-registry.js +106 -0
  964. package/dist/desktop/codebuddy-engine-adapter.d.ts +34 -0
  965. package/dist/desktop/codebuddy-engine-adapter.js +306 -21
  966. package/dist/desktop/electron-launch-args.d.ts +7 -0
  967. package/dist/desktop/electron-launch-args.js +13 -0
  968. package/dist/desktop/engine-adapter.d.ts +6 -0
  969. package/dist/desktop/launcher.js +2 -1
  970. package/dist/desktop/permission-bridge.d.ts +12 -1
  971. package/dist/desktop/permission-bridge.js +12 -5
  972. package/dist/desktop-automation/omniparser-runner.d.ts +1 -0
  973. package/dist/desktop-automation/omniparser-runner.js +12 -1
  974. package/dist/desktop-automation/smart-snapshot.js +7 -0
  975. package/dist/desktop-automation/windows-native-provider.js +1 -1
  976. package/dist/doctor/assistant-runtime.d.ts +90 -0
  977. package/dist/doctor/assistant-runtime.js +472 -0
  978. package/dist/doctor/env-sanity.d.ts +17 -0
  979. package/dist/doctor/env-sanity.js +74 -0
  980. package/dist/doctor/index.d.ts +37 -0
  981. package/dist/doctor/index.js +389 -37
  982. package/dist/doctor/llm-key-check.d.ts +17 -0
  983. package/dist/doctor/llm-key-check.js +100 -0
  984. package/dist/doctor/ollama-model-selection.d.ts +16 -0
  985. package/dist/doctor/ollama-model-selection.js +55 -0
  986. package/dist/embeddings/embedding-provider.d.ts +1 -0
  987. package/dist/embeddings/embedding-provider.js +21 -9
  988. package/dist/errors/crash-recovery.js +6 -4
  989. package/dist/events/index.d.ts +1 -1
  990. package/dist/events/types.d.ts +44 -0
  991. package/dist/export/repo-explanation.d.ts +10 -0
  992. package/dist/export/repo-explanation.js +334 -0
  993. package/dist/export/session-share.d.ts +34 -0
  994. package/dist/export/session-share.js +687 -0
  995. package/dist/fleet/autonomous-tick-broadcaster.d.ts +1 -1
  996. package/dist/fleet/capability-registry.d.ts +9 -0
  997. package/dist/fleet/capability-registry.js +268 -56
  998. package/dist/fleet/colab-store.d.ts +3 -4
  999. package/dist/fleet/colab-store.js +6 -26
  1000. package/dist/fleet/compatible-model.d.ts +39 -0
  1001. package/dist/fleet/compatible-model.js +148 -0
  1002. package/dist/fleet/consolidation/collecte.d.ts +31 -0
  1003. package/dist/fleet/consolidation/collecte.js +86 -0
  1004. package/dist/fleet/consolidation/digest-texte.d.ts +11 -0
  1005. package/dist/fleet/consolidation/digest-texte.js +52 -0
  1006. package/dist/fleet/consolidation/thalamus.d.ts +35 -0
  1007. package/dist/fleet/consolidation/thalamus.js +151 -0
  1008. package/dist/fleet/consolidation/types.d.ts +66 -0
  1009. package/dist/fleet/consolidation/types.js +22 -0
  1010. package/dist/fleet/cost-tracker.d.ts +11 -0
  1011. package/dist/fleet/cost-tracker.js +64 -17
  1012. package/dist/fleet/fleet-cost-cap.d.ts +36 -0
  1013. package/dist/fleet/fleet-cost-cap.js +175 -0
  1014. package/dist/fleet/fleet-http-surface.d.ts +24 -0
  1015. package/dist/fleet/fleet-http-surface.js +72 -0
  1016. package/dist/fleet/fleet-listener.d.ts +1 -1
  1017. package/dist/fleet/fleet-listener.js +4 -0
  1018. package/dist/fleet/model-capability-heuristics.d.ts +31 -0
  1019. package/dist/fleet/model-capability-heuristics.js +49 -0
  1020. package/dist/fleet/model-inventory.d.ts +46 -0
  1021. package/dist/fleet/model-inventory.js +242 -0
  1022. package/dist/fleet/model-scoreboard.d.ts +118 -13
  1023. package/dist/fleet/model-scoreboard.js +339 -27
  1024. package/dist/fleet/model-selector.d.ts +83 -0
  1025. package/dist/fleet/model-selector.js +218 -0
  1026. package/dist/fleet/peer-chat-bridge.d.ts +9 -2
  1027. package/dist/fleet/peer-chat-bridge.js +133 -19
  1028. package/dist/fleet/peer-chat-client-factory.d.ts +28 -2
  1029. package/dist/fleet/peer-chat-client-factory.js +195 -22
  1030. package/dist/fleet/peer-ckg-bridge.d.ts +67 -0
  1031. package/dist/fleet/peer-ckg-bridge.js +467 -0
  1032. package/dist/fleet/peer-mission-exchange-bridge.d.ts +8 -0
  1033. package/dist/fleet/peer-mission-exchange-bridge.js +127 -0
  1034. package/dist/fleet/peer-session-bridge.d.ts +7 -1
  1035. package/dist/fleet/peer-session-bridge.js +98 -17
  1036. package/dist/fleet/peer-session-store.d.ts +2 -0
  1037. package/dist/fleet/peer-session-store.js +6 -5
  1038. package/dist/fleet/peer-text-sanitizer.d.ts +59 -0
  1039. package/dist/fleet/peer-text-sanitizer.js +99 -0
  1040. package/dist/fleet/peer-tool-bridge.js +38 -10
  1041. package/dist/fleet/privacy-lint.js +80 -8
  1042. package/dist/fleet/saga-store.d.ts +25 -1
  1043. package/dist/fleet/saga-store.js +34 -6
  1044. package/dist/fleet/task-router.d.ts +17 -1
  1045. package/dist/fleet/task-router.js +65 -20
  1046. package/dist/fleet/types.d.ts +9 -5
  1047. package/dist/gateway/device-pairing.js +5 -11
  1048. package/dist/gateway/ws-transport.d.ts +1 -5
  1049. package/dist/gateway/ws-transport.js +2 -22
  1050. package/dist/git/changelog.d.ts +36 -0
  1051. package/dist/git/changelog.js +109 -0
  1052. package/dist/git/worktree-sessions.js +1 -1
  1053. package/dist/goals/counterfactual-forge.d.ts +70 -0
  1054. package/dist/goals/counterfactual-forge.js +184 -0
  1055. package/dist/goals/criterion-progress.d.ts +24 -0
  1056. package/dist/goals/criterion-progress.js +59 -0
  1057. package/dist/goals/evidence-artifact.d.ts +18 -0
  1058. package/dist/goals/evidence-artifact.js +76 -0
  1059. package/dist/goals/goal-decomposer.d.ts +15 -0
  1060. package/dist/goals/goal-decomposer.js +89 -4
  1061. package/dist/goals/goal-loop.d.ts +29 -0
  1062. package/dist/goals/goal-loop.js +92 -6
  1063. package/dist/goals/goal-manager.d.ts +1 -0
  1064. package/dist/goals/goal-manager.js +4 -1
  1065. package/dist/goals/goal-state.d.ts +10 -0
  1066. package/dist/goals/goal-state.js +21 -1
  1067. package/dist/goals/goal-store.js +4 -6
  1068. package/dist/goals/index.d.ts +11 -0
  1069. package/dist/goals/index.js +11 -0
  1070. package/dist/goals/intent-graph.d.ts +40 -0
  1071. package/dist/goals/intent-graph.js +133 -0
  1072. package/dist/goals/mission-constitution.d.ts +59 -0
  1073. package/dist/goals/mission-constitution.js +132 -0
  1074. package/dist/goals/mission-exchange.d.ts +86 -0
  1075. package/dist/goals/mission-exchange.js +216 -0
  1076. package/dist/goals/outcome-capsule.d.ts +80 -0
  1077. package/dist/goals/outcome-capsule.js +186 -0
  1078. package/dist/goals/proof-ledger.d.ts +79 -0
  1079. package/dist/goals/proof-ledger.js +181 -0
  1080. package/dist/goals/proven-outcome-lessons.d.ts +11 -0
  1081. package/dist/goals/proven-outcome-lessons.js +30 -0
  1082. package/dist/goals/proven-outcome-memory.d.ts +55 -0
  1083. package/dist/goals/proven-outcome-memory.js +125 -0
  1084. package/dist/goals/shadow-twin.d.ts +57 -0
  1085. package/dist/goals/shadow-twin.js +110 -0
  1086. package/dist/gpu-worker/gpu-media-worker-server.d.ts +49 -0
  1087. package/dist/gpu-worker/gpu-media-worker-server.js +637 -0
  1088. package/dist/harness/contract.d.ts +84 -84
  1089. package/dist/hooks/advanced-hooks.js +6 -4
  1090. package/dist/hooks/env-persistence.js +5 -6
  1091. package/dist/hooks/hook-manager.js +8 -7
  1092. package/dist/hooks/hook-system.js +6 -4
  1093. package/dist/hooks/lifecycle-hooks.js +6 -3
  1094. package/dist/hooks/moltbot/moltbot-hooks-manager.js +8 -3
  1095. package/dist/hooks/moltbot/session-persistence-manager.js +15 -7
  1096. package/dist/hooks/moltbot/setup-utilities.js +6 -4
  1097. package/dist/hooks/smart-hooks.js +6 -4
  1098. package/dist/hooks/use-input-handler.js +9 -63
  1099. package/dist/hooks/user-hooks.d.ts +10 -1
  1100. package/dist/hooks/user-hooks.js +77 -1
  1101. package/dist/identity/companion-identity.d.ts +4 -1
  1102. package/dist/identity/companion-identity.js +134 -4
  1103. package/dist/identity/identity-manager.d.ts +1 -1
  1104. package/dist/identity/identity-manager.js +7 -6
  1105. package/dist/identity/lisa-introspection.d.ts +36 -0
  1106. package/dist/identity/lisa-introspection.js +411 -0
  1107. package/dist/identity/operational-self-model.d.ts +143 -0
  1108. package/dist/identity/operational-self-model.js +974 -0
  1109. package/dist/index.d.ts +3 -1
  1110. package/dist/index.js +987 -223
  1111. package/dist/input/context-mentions.d.ts +7 -1
  1112. package/dist/input/context-mentions.js +18 -20
  1113. package/dist/input/text-to-speech.d.ts +3 -0
  1114. package/dist/input/text-to-speech.js +70 -27
  1115. package/dist/input/voice-control.d.ts +1 -0
  1116. package/dist/input/voice-control.js +24 -18
  1117. package/dist/input/voice-input-enhanced.d.ts +1 -0
  1118. package/dist/input/voice-input-enhanced.js +31 -16
  1119. package/dist/integrations/ci-autofix-pipeline.js +15 -20
  1120. package/dist/integrations/ide/server.js +3 -2
  1121. package/dist/integrations/json-rpc/server.js +4 -2
  1122. package/dist/integrations/mcp/mcp-server.js +4 -2
  1123. package/dist/integrations/opentelemetry-integration.js +6 -4
  1124. package/dist/integrations/pubcommander-bridge.d.ts +5 -0
  1125. package/dist/integrations/pubcommander-bridge.js +61 -0
  1126. package/dist/integrations/sentry-integration.js +9 -3
  1127. package/dist/intelligence/semantic-search.js +9 -12
  1128. package/dist/intelligence/user-preferences.js +8 -11
  1129. package/dist/intents/intent-checker.d.ts +34 -0
  1130. package/dist/intents/intent-checker.js +175 -0
  1131. package/dist/intents/intent-generator.d.ts +12 -0
  1132. package/dist/intents/intent-generator.js +86 -0
  1133. package/dist/intents/intent-store.d.ts +62 -0
  1134. package/dist/intents/intent-store.js +263 -0
  1135. package/dist/interpreter/computer/skills.js +3 -2
  1136. package/dist/interpreter/interpreter-service.js +18 -9
  1137. package/dist/kanban/kanban-board-registry.js +6 -4
  1138. package/dist/kanban/kanban-store.js +5 -7
  1139. package/dist/knowledge/code-graph-persistence.js +8 -16
  1140. package/dist/knowledge/graph-drift.js +14 -11
  1141. package/dist/knowledge/knowledge-manager.js +2 -1
  1142. package/dist/knowledge/scanners/index.d.ts +3 -0
  1143. package/dist/knowledge/scanners/index.js +57 -29
  1144. package/dist/knowledge/workspace-indexer.js +22 -15
  1145. package/dist/life-rhythm/cooking-timer-store.d.ts +50 -0
  1146. package/dist/life-rhythm/cooking-timer-store.js +240 -0
  1147. package/dist/life-rhythm/day-context.d.ts +30 -0
  1148. package/dist/life-rhythm/day-context.js +198 -0
  1149. package/dist/life-rhythm/etalab-holiday-provider.d.ts +40 -0
  1150. package/dist/life-rhythm/etalab-holiday-provider.js +318 -0
  1151. package/dist/life-rhythm/home-mode-store.d.ts +32 -0
  1152. package/dist/life-rhythm/home-mode-store.js +184 -0
  1153. package/dist/life-rhythm/index.d.ts +6 -0
  1154. package/dist/life-rhythm/index.js +7 -0
  1155. package/dist/life-rhythm/types.d.ts +88 -0
  1156. package/dist/life-rhythm/types.js +33 -0
  1157. package/dist/life-rhythm/zoned-minute.d.ts +24 -0
  1158. package/dist/life-rhythm/zoned-minute.js +113 -0
  1159. package/dist/location/index.d.ts +2 -12
  1160. package/dist/location/index.js +129 -56
  1161. package/dist/logging/interaction-logger.js +29 -46
  1162. package/dist/lora/dataset-v3-plan.d.ts +27 -0
  1163. package/dist/lora/dataset-v3-plan.js +121 -0
  1164. package/dist/lora/dataset.d.ts +26 -0
  1165. package/dist/lora/dataset.js +165 -0
  1166. package/dist/lora/fal-krea-trainer.d.ts +54 -0
  1167. package/dist/lora/fal-krea-trainer.js +197 -0
  1168. package/dist/lora/generate-training-set.d.ts +61 -0
  1169. package/dist/lora/generate-training-set.js +190 -0
  1170. package/dist/lora/identity-dataset-gate.d.ts +104 -0
  1171. package/dist/lora/identity-dataset-gate.js +204 -0
  1172. package/dist/lora/identity-dataset-promotion.d.ts +32 -0
  1173. package/dist/lora/identity-dataset-promotion.js +269 -0
  1174. package/dist/lora/index.d.ts +11 -0
  1175. package/dist/lora/index.js +12 -0
  1176. package/dist/lora/install-comfy.d.ts +14 -0
  1177. package/dist/lora/install-comfy.js +63 -0
  1178. package/dist/lora/lisa-avatar-bible.d.ts +85 -0
  1179. package/dist/lora/lisa-avatar-bible.js +275 -0
  1180. package/dist/lora/local-plan.d.ts +10 -0
  1181. package/dist/lora/local-plan.js +205 -0
  1182. package/dist/lora/pack-dataset.d.ts +7 -0
  1183. package/dist/lora/pack-dataset.js +39 -0
  1184. package/dist/lora/quality-gate.d.ts +31 -0
  1185. package/dist/lora/quality-gate.js +90 -0
  1186. package/dist/lora/types.d.ts +66 -0
  1187. package/dist/lora/types.js +5 -0
  1188. package/dist/lsp/lsp-client.d.ts +12 -0
  1189. package/dist/lsp/lsp-client.js +45 -9
  1190. package/dist/lsp/server.js +1 -1
  1191. package/dist/mcp/approval-elicitation.d.ts +1 -0
  1192. package/dist/mcp/approval-elicitation.js +2 -0
  1193. package/dist/mcp/client.d.ts +15 -1
  1194. package/dist/mcp/client.js +110 -24
  1195. package/dist/mcp/config.d.ts +12 -1
  1196. package/dist/mcp/config.js +55 -12
  1197. package/dist/mcp/index.d.ts +1 -1
  1198. package/dist/mcp/mcp-agent-tools.d.ts +1 -1
  1199. package/dist/mcp/mcp-agent-tools.js +76 -73
  1200. package/dist/mcp/mcp-ckg-tools.d.ts +31 -0
  1201. package/dist/mcp/mcp-ckg-tools.js +121 -0
  1202. package/dist/mcp/mcp-client.js +8 -5
  1203. package/dist/mcp/mcp-desktop-tools.d.ts +1 -1
  1204. package/dist/mcp/mcp-desktop-tools.js +105 -99
  1205. package/dist/mcp/mcp-memory-tools.d.ts +1 -1
  1206. package/dist/mcp/mcp-memory-tools.js +63 -61
  1207. package/dist/mcp/mcp-oauth.js +5 -2
  1208. package/dist/mcp/mcp-server.d.ts +48 -79
  1209. package/dist/mcp/mcp-server.js +445 -478
  1210. package/dist/mcp/mcp-session-tools.d.ts +1 -1
  1211. package/dist/mcp/mcp-session-tools.js +95 -92
  1212. package/dist/mcp/profiles.d.ts +18 -0
  1213. package/dist/mcp/profiles.js +65 -0
  1214. package/dist/mcp/prompt-footprint.d.ts +21 -0
  1215. package/dist/mcp/prompt-footprint.js +39 -0
  1216. package/dist/meals/allergens.d.ts +19 -0
  1217. package/dist/meals/allergens.js +122 -0
  1218. package/dist/meals/compatibility.d.ts +6 -0
  1219. package/dist/meals/compatibility.js +109 -0
  1220. package/dist/meals/food-inventory-store.d.ts +51 -0
  1221. package/dist/meals/food-inventory-store.js +257 -0
  1222. package/dist/meals/index.d.ts +10 -0
  1223. package/dist/meals/index.js +11 -0
  1224. package/dist/meals/meal-engine.d.ts +7 -0
  1225. package/dist/meals/meal-engine.js +206 -0
  1226. package/dist/meals/meal-plan-store.d.ts +73 -0
  1227. package/dist/meals/meal-plan-store.js +271 -0
  1228. package/dist/meals/private-json-store.d.ts +9 -0
  1229. package/dist/meals/private-json-store.js +92 -0
  1230. package/dist/meals/profile-store.d.ts +49 -0
  1231. package/dist/meals/profile-store.js +296 -0
  1232. package/dist/meals/profile-validator.d.ts +7 -0
  1233. package/dist/meals/profile-validator.js +124 -0
  1234. package/dist/meals/recipe-normalizer.d.ts +7 -0
  1235. package/dist/meals/recipe-normalizer.js +162 -0
  1236. package/dist/meals/store-validation.d.ts +21 -0
  1237. package/dist/meals/store-validation.js +101 -0
  1238. package/dist/meals/types.d.ts +170 -0
  1239. package/dist/meals/types.js +12 -0
  1240. package/dist/media/comfy-health-supervisor.d.ts +142 -0
  1241. package/dist/media/comfy-health-supervisor.js +608 -0
  1242. package/dist/media/comfyui-recipe-contract.d.ts +696 -0
  1243. package/dist/media/comfyui-recipe-contract.js +580 -0
  1244. package/dist/media/comfyui-recipe-engine.d.ts +3 -0
  1245. package/dist/media/comfyui-recipe-engine.js +4 -0
  1246. package/dist/media/comfyui-recipe-registry.d.ts +35 -0
  1247. package/dist/media/comfyui-recipe-registry.js +385 -0
  1248. package/dist/media/comfyui-recipe-runtime.d.ts +135 -0
  1249. package/dist/media/comfyui-recipe-runtime.js +942 -0
  1250. package/dist/media/content-tier.d.ts +25 -0
  1251. package/dist/media/content-tier.js +29 -0
  1252. package/dist/meeting/analyzer.d.ts +24 -0
  1253. package/dist/meeting/analyzer.js +402 -0
  1254. package/dist/meeting/index.d.ts +13 -0
  1255. package/dist/meeting/index.js +48 -0
  1256. package/dist/meeting/markdown.d.ts +3 -0
  1257. package/dist/meeting/markdown.js +51 -0
  1258. package/dist/meeting/output.d.ts +13 -0
  1259. package/dist/meeting/output.js +155 -0
  1260. package/dist/meeting/transcript.d.ts +25 -0
  1261. package/dist/meeting/transcript.js +292 -0
  1262. package/dist/meeting/types.d.ts +112 -0
  1263. package/dist/meeting/types.js +9 -0
  1264. package/dist/memory/adapters/network-memory-adapters.d.ts +19 -4
  1265. package/dist/memory/adapters/network-memory-adapters.js +4 -4
  1266. package/dist/memory/auto-memory.js +5 -2
  1267. package/dist/memory/background-extractor.d.ts +43 -0
  1268. package/dist/memory/background-extractor.js +368 -0
  1269. package/dist/memory/buddy-memory-client.d.ts +40 -0
  1270. package/dist/memory/buddy-memory-client.js +198 -0
  1271. package/dist/memory/ckg-engine-policy.d.ts +19 -0
  1272. package/dist/memory/ckg-engine-policy.js +45 -0
  1273. package/dist/memory/ckg-fact-reconciliation.d.ts +81 -0
  1274. package/dist/memory/ckg-fact-reconciliation.js +155 -0
  1275. package/dist/memory/ckg-redaction.d.ts +2 -0
  1276. package/dist/memory/ckg-redaction.js +25 -0
  1277. package/dist/memory/coding-style-analyzer.js +2 -2
  1278. package/dist/memory/collective-knowledge-graph.d.ts +380 -0
  1279. package/dist/memory/collective-knowledge-graph.js +1228 -0
  1280. package/dist/memory/enhanced-memory.d.ts +29 -0
  1281. package/dist/memory/enhanced-memory.js +153 -63
  1282. package/dist/memory/facts-memory.d.ts +9 -4
  1283. package/dist/memory/facts-memory.js +21 -4
  1284. package/dist/memory/hybrid-mmr.d.ts +71 -0
  1285. package/dist/memory/hybrid-mmr.js +127 -0
  1286. package/dist/memory/hybrid-search.js +4 -1
  1287. package/dist/memory/knowledge-graph.d.ts +23 -2
  1288. package/dist/memory/knowledge-graph.js +62 -47
  1289. package/dist/memory/memory-candidate-queue.js +9 -4
  1290. package/dist/memory/memory-consolidation.d.ts +8 -0
  1291. package/dist/memory/memory-consolidation.js +66 -17
  1292. package/dist/memory/memory-forgetting.d.ts +57 -0
  1293. package/dist/memory/memory-forgetting.js +87 -0
  1294. package/dist/memory/ocr-memory-pipeline.js +16 -10
  1295. package/dist/memory/persistent-memory.d.ts +98 -0
  1296. package/dist/memory/persistent-memory.js +711 -119
  1297. package/dist/memory/presence-injector.d.ts +1 -1
  1298. package/dist/memory/presence-injector.js +9 -4
  1299. package/dist/memory/semantic-memory-search.js +12 -9
  1300. package/dist/memory/subagent-memory.js +8 -8
  1301. package/dist/memory/user-model.js +9 -4
  1302. package/dist/metrics/metrics-collector.d.ts +1 -0
  1303. package/dist/metrics/metrics-collector.js +11 -2
  1304. package/dist/nodes/device-node.d.ts +5 -2
  1305. package/dist/nodes/device-node.js +65 -19
  1306. package/dist/nodes/index.d.ts +32 -2
  1307. package/dist/nodes/index.js +208 -7
  1308. package/dist/nodes/transports/adb-transport.d.ts +2 -6
  1309. package/dist/nodes/transports/adb-transport.js +29 -13
  1310. package/dist/nodes/transports/base-transport.d.ts +10 -0
  1311. package/dist/observability/run-store.d.ts +6 -1
  1312. package/dist/observability/run-store.js +89 -22
  1313. package/dist/observability/run-trajectory-load.d.ts +16 -0
  1314. package/dist/observability/run-trajectory-load.js +266 -0
  1315. package/dist/observability/run-trajectory.d.ts +168 -0
  1316. package/dist/observability/run-trajectory.js +468 -0
  1317. package/dist/observability/run-viewer.d.ts +5 -1
  1318. package/dist/observability/run-viewer.js +83 -9
  1319. package/dist/observability/turn-metrics.d.ts +86 -0
  1320. package/dist/observability/turn-metrics.js +201 -0
  1321. package/dist/offline/offline-mode.js +10 -9
  1322. package/dist/openclaw/gateway-bridge.js +3 -2
  1323. package/dist/optimization/latency-optimizer.d.ts +2 -1
  1324. package/dist/optimization/latency-optimizer.js +2 -2
  1325. package/dist/optimization/model-routing.d.ts +3 -0
  1326. package/dist/orchestration/orchestrator.js +4 -1
  1327. package/dist/orchestration/types.d.ts +2 -0
  1328. package/dist/performance/lazy-loader.js +2 -1
  1329. package/dist/performance/tool-cache.d.ts +4 -0
  1330. package/dist/performance/tool-cache.js +4 -2
  1331. package/dist/persistence/conversation-branches.js +9 -2
  1332. package/dist/persistence/session-store.d.ts +26 -0
  1333. package/dist/persistence/session-store.js +56 -17
  1334. package/dist/personas/persona-manager.d.ts +39 -1
  1335. package/dist/personas/persona-manager.js +276 -38
  1336. package/dist/plugins/bundled/groq-provider.js +10 -7
  1337. package/dist/plugins/bundled/openrouter-provider.js +2 -1
  1338. package/dist/plugins/code-explorer/CodeExplorerManager.d.ts +52 -4
  1339. package/dist/plugins/code-explorer/CodeExplorerManager.js +201 -31
  1340. package/dist/plugins/code-explorer/code-explorer-client.d.ts +36 -0
  1341. package/dist/plugins/code-explorer/code-explorer-client.js +86 -0
  1342. package/dist/plugins/code-explorer/index.d.ts +1 -3
  1343. package/dist/plugins/code-explorer/index.js +0 -1
  1344. package/dist/plugins/git-pinned-marketplace.js +3 -2
  1345. package/dist/plugins/plugin-manager.js +6 -9
  1346. package/dist/plugins/sandbox-worker.js +1 -1
  1347. package/dist/prompts/system-base.js +27 -3
  1348. package/dist/protocols/a2a/codebuddy-executor.d.ts +9 -0
  1349. package/dist/protocols/a2a/codebuddy-executor.js +25 -6
  1350. package/dist/protocols/a2a/index.d.ts +6 -0
  1351. package/dist/protocols/a2a/index.js +32 -3
  1352. package/dist/protocols/acp/acp-agentic-runner.d.ts +6 -2
  1353. package/dist/protocols/acp/acp-agentic-runner.js +91 -15
  1354. package/dist/protocols/acp/acp-session-store.js +28 -5
  1355. package/dist/protocols/acp/acp-stdio-server.d.ts +13 -0
  1356. package/dist/protocols/acp/acp-stdio-server.js +30 -3
  1357. package/dist/providers/active-llm-model-pool.d.ts +45 -0
  1358. package/dist/providers/active-llm-model-pool.js +139 -0
  1359. package/dist/providers/active-llm-registry.js +48 -8
  1360. package/dist/providers/auxiliary-provider.d.ts +1 -1
  1361. package/dist/providers/auxiliary-provider.js +23 -10
  1362. package/dist/providers/chatgpt-models.d.ts +71 -0
  1363. package/dist/providers/chatgpt-models.js +302 -0
  1364. package/dist/providers/codex-oauth.d.ts +8 -0
  1365. package/dist/providers/codex-oauth.js +47 -39
  1366. package/dist/providers/gemini-oauth.js +7 -6
  1367. package/dist/providers/grok-provider.js +1 -1
  1368. package/dist/providers/index.d.ts +3 -0
  1369. package/dist/providers/index.js +3 -0
  1370. package/dist/providers/local-model-resolver.d.ts +66 -0
  1371. package/dist/providers/local-model-resolver.js +128 -0
  1372. package/dist/providers/model-egress.d.ts +8 -0
  1373. package/dist/providers/model-egress.js +62 -0
  1374. package/dist/providers/model-provider-compat.d.ts +13 -0
  1375. package/dist/providers/model-provider-compat.js +48 -0
  1376. package/dist/providers/provider-catalog.d.ts +4 -1
  1377. package/dist/providers/provider-catalog.js +494 -28
  1378. package/dist/providers/provider-failover-notify.d.ts +15 -0
  1379. package/dist/providers/provider-failover-notify.js +93 -0
  1380. package/dist/providers/provider-failover-policy.d.ts +28 -0
  1381. package/dist/providers/provider-failover-policy.js +188 -0
  1382. package/dist/providers/provider-failover-user-notice.d.ts +13 -0
  1383. package/dist/providers/provider-failover-user-notice.js +49 -0
  1384. package/dist/providers/provider-fallback.d.ts +1 -0
  1385. package/dist/providers/provider-fallback.js +1 -1
  1386. package/dist/providers/provider-health.d.ts +46 -0
  1387. package/dist/providers/provider-health.js +249 -0
  1388. package/dist/providers/turboquant-provider.d.ts +1 -1
  1389. package/dist/providers/xai-oauth.js +7 -34
  1390. package/dist/queue/persistent-queue.js +9 -6
  1391. package/dist/renderers/charts/special-charts.d.ts +7 -1
  1392. package/dist/renderers/charts/special-charts.js +5 -0
  1393. package/dist/renderers/weather-conditions.d.ts +20 -0
  1394. package/dist/renderers/weather-conditions.js +74 -0
  1395. package/dist/renderers/weather-renderer.js +4 -18
  1396. package/dist/rendering/ansi.d.ts +4 -0
  1397. package/dist/rendering/ansi.js +149 -0
  1398. package/dist/rendering/index.d.ts +19 -0
  1399. package/dist/rendering/index.js +18 -0
  1400. package/dist/rendering/markdown-core.d.ts +13 -0
  1401. package/dist/rendering/markdown-core.js +18 -0
  1402. package/dist/rendering/plain.d.ts +2 -0
  1403. package/dist/rendering/plain.js +91 -0
  1404. package/dist/rendering/telegram-html.d.ts +27 -0
  1405. package/dist/rendering/telegram-html.js +290 -0
  1406. package/dist/research/auto-ingest.d.ts +45 -0
  1407. package/dist/research/auto-ingest.js +85 -0
  1408. package/dist/research/code-explorer-source.d.ts +29 -0
  1409. package/dist/research/code-explorer-source.js +76 -0
  1410. package/dist/research/connector-source.d.ts +25 -0
  1411. package/dist/research/connector-source.js +314 -0
  1412. package/dist/research/paper-qa/answer.d.ts +72 -0
  1413. package/dist/research/paper-qa/answer.js +227 -0
  1414. package/dist/research/paper-qa/corpus.d.ts +36 -0
  1415. package/dist/research/paper-qa/corpus.js +102 -0
  1416. package/dist/research/paper-qa/disk-embedding-cache.d.ts +28 -0
  1417. package/dist/research/paper-qa/disk-embedding-cache.js +193 -0
  1418. package/dist/research/paper-qa/index.d.ts +31 -0
  1419. package/dist/research/paper-qa/index.js +24 -0
  1420. package/dist/research/paper-qa/paper-qa-pipeline.d.ts +107 -0
  1421. package/dist/research/paper-qa/paper-qa-pipeline.js +163 -0
  1422. package/dist/research/paper-qa/passage-index.d.ts +203 -0
  1423. package/dist/research/paper-qa/passage-index.js +405 -0
  1424. package/dist/research/paper-qa/pdf-structure.d.ts +37 -0
  1425. package/dist/research/paper-qa/pdf-structure.js +377 -0
  1426. package/dist/research/paper-qa/persistent-corpus-index.d.ts +23 -0
  1427. package/dist/research/paper-qa/persistent-corpus-index.js +122 -0
  1428. package/dist/research/paper-qa/prose-chunker.d.ts +19 -0
  1429. package/dist/research/paper-qa/prose-chunker.js +201 -0
  1430. package/dist/research/paper-qa/provenance.d.ts +24 -0
  1431. package/dist/research/paper-qa/provenance.js +40 -0
  1432. package/dist/research/paper-qa/rcs.d.ts +78 -0
  1433. package/dist/research/paper-qa/rcs.js +200 -0
  1434. package/dist/research/paper-qa/types.d.ts +124 -0
  1435. package/dist/research/paper-qa/types.js +13 -0
  1436. package/dist/research/publication-sources.d.ts +34 -0
  1437. package/dist/research/publication-sources.js +131 -0
  1438. package/dist/research/relation-classifier.d.ts +13 -0
  1439. package/dist/research/relation-classifier.js +58 -0
  1440. package/dist/research/research-topics.d.ts +13 -0
  1441. package/dist/research/research-topics.js +81 -0
  1442. package/dist/review/apply-transaction.d.ts +40 -0
  1443. package/dist/review/apply-transaction.js +112 -0
  1444. package/dist/review/diff-model.d.ts +39 -0
  1445. package/dist/review/diff-model.js +124 -0
  1446. package/dist/review/llm-client.d.ts +30 -0
  1447. package/dist/review/llm-client.js +98 -0
  1448. package/dist/review/llm-reviewer.d.ts +16 -0
  1449. package/dist/review/llm-reviewer.js +122 -0
  1450. package/dist/review/review-engine.d.ts +54 -0
  1451. package/dist/review/review-engine.js +0 -0
  1452. package/dist/review/revision-loop.d.ts +67 -0
  1453. package/dist/review/revision-loop.js +160 -0
  1454. package/dist/review/static-gate.d.ts +13 -0
  1455. package/dist/review/static-gate.js +110 -0
  1456. package/dist/review/types.d.ts +122 -0
  1457. package/dist/review/types.js +24 -0
  1458. package/dist/review/write-gate.d.ts +55 -0
  1459. package/dist/review/write-gate.js +121 -0
  1460. package/dist/sandbox/auto-sandbox.d.ts +4 -2
  1461. package/dist/sandbox/auto-sandbox.js +14 -1
  1462. package/dist/sandbox/docker-sandbox.d.ts +39 -0
  1463. package/dist/sandbox/docker-sandbox.js +292 -14
  1464. package/dist/sandbox/execpolicy.d.ts +36 -1
  1465. package/dist/sandbox/execpolicy.js +375 -40
  1466. package/dist/sandbox/os-sandbox.d.ts +53 -0
  1467. package/dist/sandbox/os-sandbox.js +315 -70
  1468. package/dist/sandbox/sandbox-backend.d.ts +2 -0
  1469. package/dist/scheduler/cron-scheduler.d.ts +1 -0
  1470. package/dist/scheduler/cron-scheduler.js +142 -41
  1471. package/dist/scripting/codebuddy-bindings.js +2 -1
  1472. package/dist/search/bm25.js +5 -2
  1473. package/dist/search/usearch-index.js +7 -5
  1474. package/dist/security/audit-logger.js +14 -7
  1475. package/dist/security/bash-allowlist/allowlist-store.d.ts +8 -2
  1476. package/dist/security/bash-allowlist/allowlist-store.js +52 -12
  1477. package/dist/security/bash-allowlist/approval-flow.d.ts +1 -1
  1478. package/dist/security/bash-allowlist/approval-flow.js +10 -8
  1479. package/dist/security/bash-allowlist/deny-guard.d.ts +14 -0
  1480. package/dist/security/bash-allowlist/deny-guard.js +61 -0
  1481. package/dist/security/bash-allowlist/types.d.ts +5 -0
  1482. package/dist/security/bash-parser.d.ts +32 -0
  1483. package/dist/security/bash-parser.js +129 -14
  1484. package/dist/security/dangerous-patterns.js +18 -3
  1485. package/dist/security/declarative-rules.d.ts +1 -1
  1486. package/dist/security/declarative-rules.js +242 -65
  1487. package/dist/security/dependency-vuln-scanner.js +4 -4
  1488. package/dist/security/dev-origins.d.ts +40 -0
  1489. package/dist/security/dev-origins.js +111 -0
  1490. package/dist/security/docker-sandbox/manager.js +1 -1
  1491. package/dist/security/env-blocklist.d.ts +7 -0
  1492. package/dist/security/env-blocklist.js +22 -2
  1493. package/dist/security/guardian-agent.d.ts +0 -5
  1494. package/dist/security/guardian-agent.js +17 -6
  1495. package/dist/security/index.d.ts +3 -0
  1496. package/dist/security/index.js +2 -0
  1497. package/dist/security/native-sandbox.d.ts +80 -0
  1498. package/dist/security/native-sandbox.js +455 -0
  1499. package/dist/security/pack-contents-policy.d.ts +49 -0
  1500. package/dist/security/pack-contents-policy.js +139 -0
  1501. package/dist/security/permission-config.js +2 -5
  1502. package/dist/security/permission-modes.d.ts +11 -0
  1503. package/dist/security/permission-modes.js +71 -7
  1504. package/dist/security/policy-amendments.js +40 -22
  1505. package/dist/security/policy-engine.js +39 -12
  1506. package/dist/security/powershell-parser.d.ts +40 -0
  1507. package/dist/security/powershell-parser.js +198 -0
  1508. package/dist/security/remote-approval.d.ts +0 -1
  1509. package/dist/security/remote-approval.js +3 -2
  1510. package/dist/security/safe-binaries.d.ts +13 -1
  1511. package/dist/security/safe-binaries.js +240 -32
  1512. package/dist/security/safe-fetch.d.ts +7 -0
  1513. package/dist/security/safe-fetch.js +101 -0
  1514. package/dist/security/sandbox.js +2 -2
  1515. package/dist/security/secret-patterns.d.ts +18 -0
  1516. package/dist/security/secret-patterns.js +232 -0
  1517. package/dist/security/secret-scrubber.d.ts +31 -0
  1518. package/dist/security/secret-scrubber.js +170 -0
  1519. package/dist/security/secrets-detector.d.ts +3 -1
  1520. package/dist/security/secrets-detector.js +3 -106
  1521. package/dist/security/security-modes.js +2 -1
  1522. package/dist/security/session-encryption.d.ts +7 -2
  1523. package/dist/security/session-encryption.js +28 -7
  1524. package/dist/security/shell-env-policy.js +11 -2
  1525. package/dist/security/skill-scanner.d.ts +2 -2
  1526. package/dist/security/skill-scanner.js +237 -11
  1527. package/dist/security/ssrf-guard.d.ts +13 -0
  1528. package/dist/security/ssrf-guard.js +27 -0
  1529. package/dist/security/text-deobfuscation.d.ts +41 -0
  1530. package/dist/security/text-deobfuscation.js +256 -0
  1531. package/dist/security/tool-permissions.js +2 -3
  1532. package/dist/security/tool-policy/approval-scope.d.ts +11 -0
  1533. package/dist/security/tool-policy/approval-scope.js +67 -0
  1534. package/dist/security/tool-policy/policy-manager.d.ts +9 -0
  1535. package/dist/security/tool-policy/policy-manager.js +28 -1
  1536. package/dist/security/tool-policy/profiles.js +24 -0
  1537. package/dist/security/tool-policy/tool-groups.js +26 -3
  1538. package/dist/security/tool-policy/types.d.ts +3 -1
  1539. package/dist/security/tool-policy/types.js +2 -0
  1540. package/dist/security/trust-folders.js +3 -2
  1541. package/dist/security/write-policy.d.ts +8 -0
  1542. package/dist/security/write-policy.js +63 -1
  1543. package/dist/self-model/evolution-notes.d.ts +51 -0
  1544. package/dist/self-model/evolution-notes.js +324 -0
  1545. package/dist/sensory/agent-reply.d.ts +136 -0
  1546. package/dist/sensory/agent-reply.js +682 -0
  1547. package/dist/sensory/alert.d.ts +18 -0
  1548. package/dist/sensory/alert.js +105 -0
  1549. package/dist/sensory/arrival-opener.d.ts +102 -0
  1550. package/dist/sensory/arrival-opener.js +292 -0
  1551. package/dist/sensory/audio-scene.d.ts +24 -0
  1552. package/dist/sensory/audio-scene.js +74 -0
  1553. package/dist/sensory/camera-keyframe-policy.d.ts +11 -0
  1554. package/dist/sensory/camera-keyframe-policy.js +43 -0
  1555. package/dist/sensory/conversation-cues.d.ts +55 -0
  1556. package/dist/sensory/conversation-cues.js +140 -0
  1557. package/dist/sensory/domain-event-bridge.d.ts +7 -0
  1558. package/dist/sensory/domain-event-bridge.js +134 -0
  1559. package/dist/sensory/dreaming.d.ts +17 -0
  1560. package/dist/sensory/dreaming.js +52 -2
  1561. package/dist/sensory/elevenlabs-library.d.ts +91 -0
  1562. package/dist/sensory/elevenlabs-library.js +303 -0
  1563. package/dist/sensory/episodic-journal.d.ts +69 -0
  1564. package/dist/sensory/episodic-journal.js +240 -0
  1565. package/dist/sensory/error-watch-reaction.d.ts +41 -0
  1566. package/dist/sensory/error-watch-reaction.js +312 -0
  1567. package/dist/sensory/heartbeat-fallback.d.ts +46 -0
  1568. package/dist/sensory/heartbeat-fallback.js +171 -0
  1569. package/dist/sensory/heartbeat-scheduler.d.ts +6 -0
  1570. package/dist/sensory/heartbeat-scheduler.js +27 -7
  1571. package/dist/sensory/hybrid-reply.d.ts +132 -0
  1572. package/dist/sensory/hybrid-reply.js +1217 -0
  1573. package/dist/sensory/reactions.d.ts +6 -0
  1574. package/dist/sensory/reactions.js +10 -1
  1575. package/dist/sensory/respond-decider.d.ts +124 -0
  1576. package/dist/sensory/respond-decider.js +608 -0
  1577. package/dist/sensory/rule-templates.d.ts +30 -0
  1578. package/dist/sensory/rule-templates.js +100 -0
  1579. package/dist/sensory/schedule-emitter.d.ts +24 -0
  1580. package/dist/sensory/schedule-emitter.js +57 -0
  1581. package/dist/sensory/screen-reaction.js +15 -1
  1582. package/dist/sensory/semantic-vision-reaction.d.ts +36 -0
  1583. package/dist/sensory/semantic-vision-reaction.js +342 -0
  1584. package/dist/sensory/sensory-action-executor.d.ts +98 -0
  1585. package/dist/sensory/sensory-action-executor.js +473 -0
  1586. package/dist/sensory/sensory-bridge.d.ts +11 -1
  1587. package/dist/sensory/sensory-bridge.js +59 -7
  1588. package/dist/sensory/sensory-rules-engine.d.ts +81 -0
  1589. package/dist/sensory/sensory-rules-engine.js +434 -0
  1590. package/dist/sensory/sensory-status.d.ts +102 -0
  1591. package/dist/sensory/sensory-status.js +291 -0
  1592. package/dist/sensory/speech-engine-config.d.ts +68 -0
  1593. package/dist/sensory/speech-engine-config.js +157 -0
  1594. package/dist/sensory/speech-reaction.d.ts +183 -7
  1595. package/dist/sensory/speech-reaction.js +2141 -35
  1596. package/dist/sensory/speech-sanitizer.d.ts +12 -0
  1597. package/dist/sensory/speech-sanitizer.js +143 -0
  1598. package/dist/sensory/system-vitals-emitter.d.ts +130 -0
  1599. package/dist/sensory/system-vitals-emitter.js +514 -0
  1600. package/dist/sensory/tts-cache.d.ts +76 -0
  1601. package/dist/sensory/tts-cache.js +0 -0
  1602. package/dist/sensory/turn-detector.d.ts +28 -0
  1603. package/dist/sensory/turn-detector.js +57 -0
  1604. package/dist/sensory/vision-description-safety.d.ts +4 -0
  1605. package/dist/sensory/vision-description-safety.js +25 -0
  1606. package/dist/sensory/vision-reaction.d.ts +21 -7
  1607. package/dist/sensory/vision-reaction.js +209 -18
  1608. package/dist/sensory/voice-activity.d.ts +69 -0
  1609. package/dist/sensory/voice-activity.js +271 -0
  1610. package/dist/sensory/voice-clock.d.ts +19 -0
  1611. package/dist/sensory/voice-clock.js +111 -0
  1612. package/dist/sensory/voice-entrainment.d.ts +62 -0
  1613. package/dist/sensory/voice-entrainment.js +176 -0
  1614. package/dist/sensory/voice-interactions.d.ts +13 -0
  1615. package/dist/sensory/voice-interactions.js +258 -0
  1616. package/dist/sensory/voice-loop.d.ts +618 -0
  1617. package/dist/sensory/voice-loop.js +3581 -0
  1618. package/dist/sensory/voice-replay-lab.d.ts +32 -0
  1619. package/dist/sensory/voice-replay-lab.js +109 -0
  1620. package/dist/sensory/voice-stream.d.ts +121 -0
  1621. package/dist/sensory/voice-stream.js +598 -0
  1622. package/dist/sensory/voice-turn-coordinator.d.ts +88 -0
  1623. package/dist/sensory/voice-turn-coordinator.js +258 -0
  1624. package/dist/sensory/voice-turn-taking.d.ts +26 -0
  1625. package/dist/sensory/voice-turn-taking.js +59 -0
  1626. package/dist/server/agent-adapter.d.ts +49 -3
  1627. package/dist/server/agent-adapter.js +26 -4
  1628. package/dist/server/channel-a2a-bridge.js +1 -1
  1629. package/dist/server/exposure-diagnostic.d.ts +25 -0
  1630. package/dist/server/exposure-diagnostic.js +51 -0
  1631. package/dist/server/heartbeat-monitor.d.ts +13 -0
  1632. package/dist/server/heartbeat-monitor.js +8 -3
  1633. package/dist/server/http-agent-sessions.d.ts +32 -0
  1634. package/dist/server/http-agent-sessions.js +245 -0
  1635. package/dist/server/index.d.ts +3 -0
  1636. package/dist/server/index.js +913 -46
  1637. package/dist/server/mcp/approval-elicitation.d.ts +144 -0
  1638. package/dist/server/mcp/approval-elicitation.js +377 -0
  1639. package/dist/server/middleware/auth.d.ts +11 -0
  1640. package/dist/server/middleware/auth.js +54 -0
  1641. package/dist/server/middleware/error-handler.d.ts +5 -0
  1642. package/dist/server/middleware/error-handler.js +30 -4
  1643. package/dist/server/middleware/index.d.ts +1 -1
  1644. package/dist/server/middleware/index.js +1 -1
  1645. package/dist/server/mobile/album.d.ts +46 -0
  1646. package/dist/server/mobile/album.js +144 -0
  1647. package/dist/server/mobile/assets/app.js +3036 -0
  1648. package/dist/server/mobile/assets/emoji-data.js +508 -0
  1649. package/dist/server/mobile/assets/icon-192.png +0 -0
  1650. package/dist/server/mobile/assets/icon-512.png +0 -0
  1651. package/dist/server/mobile/assets/icon-96.png +0 -0
  1652. package/dist/server/mobile/assets/icon.svg +12 -0
  1653. package/dist/server/mobile/assets/index.html +261 -0
  1654. package/dist/server/mobile/assets/manifest.webmanifest +37 -0
  1655. package/dist/server/mobile/assets/styles.css +831 -0
  1656. package/dist/server/mobile/assets/sw.js +149 -0
  1657. package/dist/server/mobile/chat-extras.d.ts +9 -0
  1658. package/dist/server/mobile/chat-extras.js +24 -0
  1659. package/dist/server/mobile/index.d.ts +22 -0
  1660. package/dist/server/mobile/index.js +287 -0
  1661. package/dist/server/mobile/link-preview.d.ts +24 -0
  1662. package/dist/server/mobile/link-preview.js +139 -0
  1663. package/dist/server/mobile/push.d.ts +38 -0
  1664. package/dist/server/mobile/push.js +190 -0
  1665. package/dist/server/mobile/status.d.ts +23 -0
  1666. package/dist/server/mobile/status.js +107 -0
  1667. package/dist/server/mobile/telegram-forward.d.ts +14 -0
  1668. package/dist/server/mobile/telegram-forward.js +32 -0
  1669. package/dist/server/mobile/voice-note.d.ts +54 -0
  1670. package/dist/server/mobile/voice-note.js +305 -0
  1671. package/dist/server/origin-check.d.ts +4 -5
  1672. package/dist/server/origin-check.js +43 -8
  1673. package/dist/server/routes/canvas.d.ts +7 -1
  1674. package/dist/server/routes/canvas.js +138 -24
  1675. package/dist/server/routes/chat.js +340 -203
  1676. package/dist/server/routes/cognition.d.ts +3 -0
  1677. package/dist/server/routes/cognition.js +75 -0
  1678. package/dist/server/routes/health.js +93 -81
  1679. package/dist/server/routes/index.d.ts +5 -1
  1680. package/dist/server/routes/index.js +5 -1
  1681. package/dist/server/routes/lessons.d.ts +13 -0
  1682. package/dist/server/routes/lessons.js +111 -0
  1683. package/dist/server/routes/memory.d.ts +12 -0
  1684. package/dist/server/routes/memory.js +191 -131
  1685. package/dist/server/routes/runs.d.ts +9 -0
  1686. package/dist/server/routes/runs.js +50 -0
  1687. package/dist/server/routes/sessions.js +8 -1
  1688. package/dist/server/routes/tools.js +93 -74
  1689. package/dist/server/routes/webhooks.js +56 -46
  1690. package/dist/server/tunnel-manager.js +21 -1
  1691. package/dist/server/types.d.ts +25 -1
  1692. package/dist/server/webhook-agent-queue.d.ts +12 -0
  1693. package/dist/server/webhook-agent-queue.js +58 -0
  1694. package/dist/server/websocket/cognition-bridge.d.ts +13 -0
  1695. package/dist/server/websocket/cognition-bridge.js +334 -0
  1696. package/dist/server/websocket/confirmation-bridge.d.ts +22 -0
  1697. package/dist/server/websocket/confirmation-bridge.js +178 -0
  1698. package/dist/server/websocket/desktop-handler.d.ts +17 -0
  1699. package/dist/server/websocket/desktop-handler.js +177 -16
  1700. package/dist/server/websocket/handler.d.ts +123 -1
  1701. package/dist/server/websocket/handler.js +852 -67
  1702. package/dist/server/websocket/index.d.ts +2 -1
  1703. package/dist/server/websocket/index.js +2 -1
  1704. package/dist/server/websocket/peer-rpc.d.ts +1 -1
  1705. package/dist/server/websocket/peer-rpc.js +25 -3
  1706. package/dist/services/prompt-builder.d.ts +47 -2
  1707. package/dist/services/prompt-builder.js +310 -99
  1708. package/dist/sessions/timeline-snapshot.d.ts +35 -0
  1709. package/dist/sessions/timeline-snapshot.js +144 -0
  1710. package/dist/sessions/timeline.d.ts +33 -0
  1711. package/dist/sessions/timeline.js +85 -0
  1712. package/dist/shared/context-optimization-metadata.d.ts +29 -0
  1713. package/dist/shared/context-optimization-metadata.js +73 -0
  1714. package/dist/shared/engine-types.d.ts +26 -0
  1715. package/dist/skills/bash-injection.d.ts +2 -2
  1716. package/dist/skills/bash-injection.js +9 -2
  1717. package/dist/skills/bundled/code-explorer.skill.md +50 -0
  1718. package/dist/skills/bundled/file-edit.skill.md +62 -0
  1719. package/dist/skills/bundled/git-commit.skill.md +66 -0
  1720. package/dist/skills/bundled/pubcommander-control/SKILL.md +33 -0
  1721. package/dist/skills/bundled/pubcommander-control/agents/openai.yaml +4 -0
  1722. package/dist/skills/bundled/typescript-expert.skill.md +21 -0
  1723. package/dist/skills/bundled/weather.skill.md +48 -0
  1724. package/dist/skills/bundled/web-app-testing.skill.md +71 -0
  1725. package/dist/skills/bundled/web-search.skill.md +56 -0
  1726. package/dist/skills/hub.js +52 -30
  1727. package/dist/skills/index.d.ts +6 -3
  1728. package/dist/skills/index.js +19 -4
  1729. package/dist/skills/parser.js +2 -0
  1730. package/dist/skills/registry.d.ts +52 -0
  1731. package/dist/skills/registry.js +291 -14
  1732. package/dist/skills/skill-exchange.d.ts +61 -0
  1733. package/dist/skills/skill-exchange.js +523 -0
  1734. package/dist/skills/skill-importer.d.ts +2 -2
  1735. package/dist/skills/skill-importer.js +76 -17
  1736. package/dist/skills/skill-registry.js +3 -2
  1737. package/dist/skills/skill-signing.d.ts +20 -0
  1738. package/dist/skills/skill-signing.js +106 -0
  1739. package/dist/skills/skill-sources.d.ts +3 -2
  1740. package/dist/skills/skill-sources.js +5 -4
  1741. package/dist/skills/types.d.ts +4 -0
  1742. package/dist/spec/spec-store.js +7 -6
  1743. package/dist/speculative/shadow-workspace.d.ts +79 -0
  1744. package/dist/speculative/shadow-workspace.js +500 -0
  1745. package/dist/talk-mode/index.d.ts +4 -4
  1746. package/dist/talk-mode/index.js +3 -3
  1747. package/dist/talk-mode/providers/elevenlabs-client.d.ts +48 -0
  1748. package/dist/talk-mode/providers/elevenlabs-client.js +117 -0
  1749. package/dist/talk-mode/providers/elevenlabs.js +12 -23
  1750. package/dist/talk-mode/providers/index.d.ts +3 -1
  1751. package/dist/talk-mode/providers/index.js +2 -0
  1752. package/dist/talk-mode/providers/pocket-tts.d.ts +88 -0
  1753. package/dist/talk-mode/providers/pocket-tts.js +334 -0
  1754. package/dist/talk-mode/providers/voicebox-tts.d.ts +24 -0
  1755. package/dist/talk-mode/providers/voicebox-tts.js +120 -0
  1756. package/dist/talk-mode/types.d.ts +39 -1
  1757. package/dist/tasks/background-tasks.js +22 -5
  1758. package/dist/telemetry/otel-tracer.js +5 -2
  1759. package/dist/templates/design-system-apply.d.ts +23 -0
  1760. package/dist/templates/design-system-apply.js +100 -0
  1761. package/dist/templates/project-scaffolding.d.ts +2 -0
  1762. package/dist/templates/project-scaffolding.js +616 -1
  1763. package/dist/themes/theme-manager.js +9 -6
  1764. package/dist/themes/theme-schema.d.ts +46 -46
  1765. package/dist/tools/advanced/multi-file-editor.js +3 -1
  1766. package/dist/tools/advanced/operation-history.js +2 -1
  1767. package/dist/tools/app-server-tool.d.ts +66 -0
  1768. package/dist/tools/app-server-tool.js +423 -0
  1769. package/dist/tools/apply-patch.d.ts +31 -1
  1770. package/dist/tools/apply-patch.js +214 -19
  1771. package/dist/tools/authored-tools-manifest-2.d.ts +17 -0
  1772. package/dist/tools/authored-tools-manifest-2.js +133 -0
  1773. package/dist/tools/authored-tools-manifest.d.ts +15 -0
  1774. package/dist/tools/authored-tools-manifest.js +13 -0
  1775. package/dist/tools/bash/bash-tool.d.ts +36 -3
  1776. package/dist/tools/bash/bash-tool.js +240 -100
  1777. package/dist/tools/bash/command-validator.d.ts +1 -1
  1778. package/dist/tools/bash/command-validator.js +115 -40
  1779. package/dist/tools/bash/execution-policy.d.ts +42 -0
  1780. package/dist/tools/bash/execution-policy.js +278 -0
  1781. package/dist/tools/bash/security-patterns.js +43 -5
  1782. package/dist/tools/bash/streaming-executor.d.ts +1 -1
  1783. package/dist/tools/bash/streaming-executor.js +124 -18
  1784. package/dist/tools/build-project-tool.d.ts +25 -0
  1785. package/dist/tools/build-project-tool.js +30 -0
  1786. package/dist/tools/bundle-analyze-tool.d.ts +28 -0
  1787. package/dist/tools/bundle-analyze-tool.js +39 -0
  1788. package/dist/tools/code-exec-tool.d.ts +55 -23
  1789. package/dist/tools/code-exec-tool.js +598 -111
  1790. package/dist/tools/code-explorer-tool.d.ts +1 -1
  1791. package/dist/tools/code-explorer-tool.js +25 -1
  1792. package/dist/tools/code-review.js +5 -0
  1793. package/dist/tools/code-stats-tool.d.ts +43 -0
  1794. package/dist/tools/code-stats-tool.js +70 -0
  1795. package/dist/tools/codebase-replace-tool.js +2 -2
  1796. package/dist/tools/comfy-recipe-tool.d.ts +37 -0
  1797. package/dist/tools/comfy-recipe-tool.js +693 -0
  1798. package/dist/tools/community-search.d.ts +93 -0
  1799. package/dist/tools/community-search.js +334 -0
  1800. package/dist/tools/computer-control-harness.js +5 -2
  1801. package/dist/tools/computer-control-tool.d.ts +8 -0
  1802. package/dist/tools/computer-control-tool.js +71 -26
  1803. package/dist/tools/context-expand-tool.d.ts +19 -0
  1804. package/dist/tools/context-expand-tool.js +132 -0
  1805. package/dist/tools/csv/csv-parse.d.ts +19 -0
  1806. package/dist/tools/csv/csv-parse.js +132 -0
  1807. package/dist/tools/csv/csv-wiring.d.ts +8 -0
  1808. package/dist/tools/csv/csv-wiring.js +9 -0
  1809. package/dist/tools/csv-analyze-tool.d.ts +11 -0
  1810. package/dist/tools/csv-analyze-tool.js +114 -0
  1811. package/dist/tools/csv-preview-tool.d.ts +34 -0
  1812. package/dist/tools/csv-preview-tool.js +69 -0
  1813. package/dist/tools/db-migration.js +11 -3
  1814. package/dist/tools/deep-research-tool.d.ts +68 -0
  1815. package/dist/tools/deep-research-tool.js +257 -0
  1816. package/dist/tools/deferred-schema-state.d.ts +19 -0
  1817. package/dist/tools/deferred-schema-state.js +33 -0
  1818. package/dist/tools/dep-inspect-tool.d.ts +32 -0
  1819. package/dist/tools/dep-inspect-tool.js +74 -0
  1820. package/dist/tools/design-system-tool.d.ts +10 -0
  1821. package/dist/tools/design-system-tool.js +95 -0
  1822. package/dist/tools/device-tool.d.ts +2 -1
  1823. package/dist/tools/device-tool.js +21 -0
  1824. package/dist/tools/diagram-tool.js +8 -2
  1825. package/dist/tools/diff-files-tool.d.ts +28 -0
  1826. package/dist/tools/diff-files-tool.js +49 -0
  1827. package/dist/tools/enhanced-search.js +32 -16
  1828. package/dist/tools/env-doctor-tool.d.ts +30 -0
  1829. package/dist/tools/env-doctor-tool.js +54 -0
  1830. package/dist/tools/execute-code-rpc-invoker.js +2 -2
  1831. package/dist/tools/execute-code-runner.d.ts +21 -0
  1832. package/dist/tools/execute-code-runner.js +117 -8
  1833. package/dist/tools/extension-forge-tool.d.ts +29 -0
  1834. package/dist/tools/extension-forge-tool.js +288 -0
  1835. package/dist/tools/fetch-tool.js +7 -3
  1836. package/dist/tools/file-search-tool.d.ts +41 -0
  1837. package/dist/tools/file-search-tool.js +99 -0
  1838. package/dist/tools/format-project-tool.d.ts +28 -0
  1839. package/dist/tools/format-project-tool.js +45 -0
  1840. package/dist/tools/git-summary-tool.d.ts +36 -0
  1841. package/dist/tools/git-summary-tool.js +65 -0
  1842. package/dist/tools/git-tool.js +16 -4
  1843. package/dist/tools/gpu-avatar-delivery.d.ts +16 -0
  1844. package/dist/tools/gpu-avatar-delivery.js +67 -0
  1845. package/dist/tools/gpu-media-worker.d.ts +96 -0
  1846. package/dist/tools/gpu-media-worker.js +363 -0
  1847. package/dist/tools/gui-tool.js +92 -13
  1848. package/dist/tools/http-probe-tool.d.ts +25 -0
  1849. package/dist/tools/http-probe-tool.js +40 -0
  1850. package/dist/tools/image-tool.js +29 -16
  1851. package/dist/tools/index.d.ts +6 -1
  1852. package/dist/tools/index.js +5 -0
  1853. package/dist/tools/interactive-bash.d.ts +29 -1
  1854. package/dist/tools/interactive-bash.js +141 -21
  1855. package/dist/tools/json-query-tool.d.ts +30 -0
  1856. package/dist/tools/json-query-tool.js +49 -0
  1857. package/dist/tools/license-check-tool.d.ts +22 -0
  1858. package/dist/tools/license-check-tool.js +43 -0
  1859. package/dist/tools/lint-project-tool.d.ts +52 -0
  1860. package/dist/tools/lint-project-tool.js +143 -0
  1861. package/dist/tools/local-binary-launch.d.ts +14 -0
  1862. package/dist/tools/local-binary-launch.js +63 -0
  1863. package/dist/tools/lsp-navigation-tools.d.ts +87 -0
  1864. package/dist/tools/lsp-navigation-tools.js +470 -0
  1865. package/dist/tools/markdown-convert.d.ts +51 -0
  1866. package/dist/tools/markdown-convert.js +159 -0
  1867. package/dist/tools/media-generation-tool.d.ts +90 -1
  1868. package/dist/tools/media-generation-tool.js +1553 -11
  1869. package/dist/tools/meeting-notes-tool.d.ts +25 -0
  1870. package/dist/tools/meeting-notes-tool.js +240 -0
  1871. package/dist/tools/merge-conflict-tool.js +1 -1
  1872. package/dist/tools/metadata.d.ts +7 -1
  1873. package/dist/tools/metadata.js +823 -13
  1874. package/dist/tools/mixture-of-agents-tool.d.ts +7 -0
  1875. package/dist/tools/mixture-of-agents-tool.js +230 -31
  1876. package/dist/tools/multi-edit.js +42 -18
  1877. package/dist/tools/ocr-tool.d.ts +43 -0
  1878. package/dist/tools/ocr-tool.js +24 -18
  1879. package/dist/tools/omission-placeholder-detector.js +12 -6
  1880. package/dist/tools/paper-qa-tool.d.ts +73 -0
  1881. package/dist/tools/paper-qa-tool.js +313 -0
  1882. package/dist/tools/peer-chain-tool.js +4 -1
  1883. package/dist/tools/peer-delegate-tool.d.ts +2 -0
  1884. package/dist/tools/peer-delegate-tool.js +11 -1
  1885. package/dist/tools/port-check-tool.d.ts +31 -0
  1886. package/dist/tools/port-check-tool.js +25 -0
  1887. package/dist/tools/project-map-tool.d.ts +39 -0
  1888. package/dist/tools/project-map-tool.js +128 -0
  1889. package/dist/tools/register-tool-handler.d.ts +2 -2
  1890. package/dist/tools/register-tool-handler.js +7 -4
  1891. package/dist/tools/registry/advanced-tools.js +1 -1
  1892. package/dist/tools/registry/attention-tools.d.ts +3 -3
  1893. package/dist/tools/registry/attention-tools.js +14 -10
  1894. package/dist/tools/registry/authored-extra-tools.d.ts +20 -0
  1895. package/dist/tools/registry/authored-extra-tools.js +147 -0
  1896. package/dist/tools/registry/bash-tools.d.ts +2 -2
  1897. package/dist/tools/registry/bash-tools.js +7 -3
  1898. package/dist/tools/registry/browser-operator-tools.d.ts +1 -1
  1899. package/dist/tools/registry/browser-operator-tools.js +17 -3
  1900. package/dist/tools/registry/browser-tools.d.ts +1 -1
  1901. package/dist/tools/registry/browser-tools.js +38 -33
  1902. package/dist/tools/registry/code-explorer-tools.js +6 -1
  1903. package/dist/tools/registry/comfy-recipe-tools.d.ts +2 -0
  1904. package/dist/tools/registry/comfy-recipe-tools.js +5 -0
  1905. package/dist/tools/registry/context-expand-tools.d.ts +3 -0
  1906. package/dist/tools/registry/context-expand-tools.js +6 -0
  1907. package/dist/tools/registry/csv-tools.d.ts +12 -0
  1908. package/dist/tools/registry/csv-tools.js +62 -0
  1909. package/dist/tools/registry/delegate-agent-tools.d.ts +64 -0
  1910. package/dist/tools/registry/delegate-agent-tools.js +206 -0
  1911. package/dist/tools/registry/design-tools.d.ts +12 -0
  1912. package/dist/tools/registry/design-tools.js +80 -0
  1913. package/dist/tools/registry/fleet-tools.js +6 -0
  1914. package/dist/tools/registry/index.d.ts +25 -5
  1915. package/dist/tools/registry/index.js +80 -6
  1916. package/dist/tools/registry/interactive-adapters.d.ts +37 -0
  1917. package/dist/tools/registry/interactive-adapters.js +116 -0
  1918. package/dist/tools/registry/lsp-tools.d.ts +3 -3
  1919. package/dist/tools/registry/lsp-tools.js +9 -3
  1920. package/dist/tools/registry/meeting-tools.d.ts +3 -0
  1921. package/dist/tools/registry/meeting-tools.js +6 -0
  1922. package/dist/tools/registry/memory-tools.js +32 -20
  1923. package/dist/tools/registry/misc-tools.d.ts +1 -1
  1924. package/dist/tools/registry/misc-tools.js +7 -4
  1925. package/dist/tools/registry/moa-tools.js +13 -0
  1926. package/dist/tools/registry/multimodal-tools.d.ts +73 -1
  1927. package/dist/tools/registry/multimodal-tools.js +581 -4
  1928. package/dist/tools/registry/process-tools.d.ts +16 -0
  1929. package/dist/tools/registry/process-tools.js +136 -1
  1930. package/dist/tools/registry/remind-tools.d.ts +23 -0
  1931. package/dist/tools/registry/remind-tools.js +120 -0
  1932. package/dist/tools/registry/research-tools.d.ts +17 -0
  1933. package/dist/tools/registry/research-tools.js +21 -0
  1934. package/dist/tools/registry/search-tools.d.ts +6 -6
  1935. package/dist/tools/registry/search-tools.js +30 -17
  1936. package/dist/tools/registry/secrets-tools.d.ts +33 -0
  1937. package/dist/tools/registry/secrets-tools.js +71 -0
  1938. package/dist/tools/registry/self-describe-tools.d.ts +23 -0
  1939. package/dist/tools/registry/self-describe-tools.js +156 -0
  1940. package/dist/tools/registry/self-evolution-tools.d.ts +13 -0
  1941. package/dist/tools/registry/self-evolution-tools.js +97 -0
  1942. package/dist/tools/registry/text-editor-tools.d.ts +26 -4
  1943. package/dist/tools/registry/text-editor-tools.js +102 -6
  1944. package/dist/tools/registry/tool-alias-map.d.ts +8 -0
  1945. package/dist/tools/registry/tool-alias-map.js +47 -0
  1946. package/dist/tools/registry/tool-aliases.d.ts +3 -4
  1947. package/dist/tools/registry/tool-aliases.js +12 -48
  1948. package/dist/tools/registry/types.d.ts +5 -0
  1949. package/dist/tools/registry/verify-tools.d.ts +50 -0
  1950. package/dist/tools/registry/verify-tools.js +136 -0
  1951. package/dist/tools/registry/video-studio-tools.d.ts +13 -0
  1952. package/dist/tools/registry/video-studio-tools.js +21 -0
  1953. package/dist/tools/registry/vision-tools.d.ts +15 -1
  1954. package/dist/tools/registry/vision-tools.js +252 -27
  1955. package/dist/tools/registry/web-test-tool.d.ts +66 -0
  1956. package/dist/tools/registry/web-test-tool.js +321 -0
  1957. package/dist/tools/registry/web-tools.d.ts +43 -0
  1958. package/dist/tools/registry/web-tools.js +281 -1
  1959. package/dist/tools/review-gate-helper.d.ts +44 -0
  1960. package/dist/tools/review-gate-helper.js +110 -0
  1961. package/dist/tools/route-peer-tool.js +62 -11
  1962. package/dist/tools/sbom-generate-tool.d.ts +22 -0
  1963. package/dist/tools/sbom-generate-tool.js +41 -0
  1964. package/dist/tools/scaffold-app-tool.d.ts +48 -0
  1965. package/dist/tools/scaffold-app-tool.js +144 -0
  1966. package/dist/tools/screenshot-tool.js +5 -2
  1967. package/dist/tools/search.d.ts +17 -0
  1968. package/dist/tools/search.js +31 -8
  1969. package/dist/tools/self-describe.d.ts +73 -0
  1970. package/dist/tools/self-describe.js +298 -0
  1971. package/dist/tools/stock-quote.d.ts +67 -0
  1972. package/dist/tools/stock-quote.js +645 -0
  1973. package/dist/tools/submit-plan-tool.js +1 -1
  1974. package/dist/tools/test-runner-tool.d.ts +38 -0
  1975. package/dist/tools/test-runner-tool.js +96 -0
  1976. package/dist/tools/text-editor.js +91 -8
  1977. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  1978. package/dist/tools/text-to-speech-tool.js +48 -2
  1979. package/dist/tools/todo-scan-tool.d.ts +39 -0
  1980. package/dist/tools/todo-scan-tool.js +53 -0
  1981. package/dist/tools/tool-manager.js +8 -0
  1982. package/dist/tools/tool-search.js +11 -3
  1983. package/dist/tools/tool-selector.d.ts +7 -0
  1984. package/dist/tools/tool-selector.js +27 -13
  1985. package/dist/tools/tools-md-generator.js +2 -2
  1986. package/dist/tools/types.d.ts +16 -0
  1987. package/dist/tools/types.js +5 -1
  1988. package/dist/tools/video/approved-media-source.d.ts +8 -0
  1989. package/dist/tools/video/approved-media-source.js +59 -0
  1990. package/dist/tools/video/book-manuscript-source.d.ts +49 -0
  1991. package/dist/tools/video/book-manuscript-source.js +263 -0
  1992. package/dist/tools/video/character-in-location.d.ts +42 -0
  1993. package/dist/tools/video/character-in-location.js +161 -0
  1994. package/dist/tools/video/cinematic-trailer-plan.d.ts +203 -0
  1995. package/dist/tools/video/cinematic-trailer-plan.js +498 -0
  1996. package/dist/tools/video/cloud-understand.d.ts +91 -0
  1997. package/dist/tools/video/cloud-understand.js +214 -0
  1998. package/dist/tools/video/comfy-client.d.ts +38 -0
  1999. package/dist/tools/video/comfy-client.js +227 -0
  2000. package/dist/tools/video/comfy-workflow-template.d.ts +70 -0
  2001. package/dist/tools/video/comfy-workflow-template.js +194 -0
  2002. package/dist/tools/video/describe-frame.d.ts +36 -0
  2003. package/dist/tools/video/describe-frame.js +68 -0
  2004. package/dist/tools/video/film-assemble.d.ts +234 -0
  2005. package/dist/tools/video/film-assemble.js +959 -0
  2006. package/dist/tools/video/film-project.d.ts +152 -0
  2007. package/dist/tools/video/film-project.js +312 -0
  2008. package/dist/tools/video/frame-dedup.d.ts +46 -0
  2009. package/dist/tools/video/frame-dedup.js +110 -0
  2010. package/dist/tools/video/frame-sample.d.ts +72 -0
  2011. package/dist/tools/video/frame-sample.js +238 -0
  2012. package/dist/tools/video/google-flow-driver.d.ts +131 -0
  2013. package/dist/tools/video/google-flow-driver.js +312 -0
  2014. package/dist/tools/video/google-flow-handoff.d.ts +75 -0
  2015. package/dist/tools/video/google-flow-handoff.js +121 -0
  2016. package/dist/tools/video/google-flow-plan-export.d.ts +21 -0
  2017. package/dist/tools/video/google-flow-plan-export.js +123 -0
  2018. package/dist/tools/video/google-flow-result-import.d.ts +92 -0
  2019. package/dist/tools/video/google-flow-result-import.js +297 -0
  2020. package/dist/tools/video/hybrid-video-router.d.ts +34 -0
  2021. package/dist/tools/video/hybrid-video-router.js +113 -0
  2022. package/dist/tools/video/localized-media.d.ts +50 -0
  2023. package/dist/tools/video/localized-media.js +128 -0
  2024. package/dist/tools/video/long-form-plan.d.ts +37 -0
  2025. package/dist/tools/video/long-form-plan.js +83 -0
  2026. package/dist/tools/video/long-form-production.d.ts +49 -0
  2027. package/dist/tools/video/long-form-production.js +168 -0
  2028. package/dist/tools/video/long-transcribe.d.ts +94 -0
  2029. package/dist/tools/video/long-transcribe.js +206 -0
  2030. package/dist/tools/video/media-fetch.d.ts +94 -0
  2031. package/dist/tools/video/media-fetch.js +311 -0
  2032. package/dist/tools/video/mermaid-render.d.ts +34 -0
  2033. package/dist/tools/video/mermaid-render.js +127 -0
  2034. package/dist/tools/video/narration.d.ts +96 -0
  2035. package/dist/tools/video/narration.js +505 -0
  2036. package/dist/tools/video/native-fashion-defects.d.ts +27 -0
  2037. package/dist/tools/video/native-fashion-defects.js +80 -0
  2038. package/dist/tools/video/scene-render.d.ts +108 -0
  2039. package/dist/tools/video/scene-render.js +418 -0
  2040. package/dist/tools/video/subtitles.d.ts +49 -0
  2041. package/dist/tools/video/subtitles.js +116 -0
  2042. package/dist/tools/video/video-ckg.d.ts +123 -0
  2043. package/dist/tools/video/video-ckg.js +188 -0
  2044. package/dist/tools/video/video-research-card.d.ts +58 -0
  2045. package/dist/tools/video/video-research-card.js +468 -0
  2046. package/dist/tools/video/video-understanding.d.ts +159 -0
  2047. package/dist/tools/video/video-understanding.js +534 -0
  2048. package/dist/tools/video/visual-gate-report.d.ts +139 -0
  2049. package/dist/tools/video/visual-gate-report.js +379 -0
  2050. package/dist/tools/video/voice-rights-registry.d.ts +13 -0
  2051. package/dist/tools/video/voice-rights-registry.js +142 -0
  2052. package/dist/tools/video/youtube-captions.d.ts +51 -0
  2053. package/dist/tools/video/youtube-captions.js +102 -0
  2054. package/dist/tools/video/youtube-master-quality.d.ts +163 -0
  2055. package/dist/tools/video/youtube-master-quality.js +379 -0
  2056. package/dist/tools/video/youtube-storyboard.d.ts +43 -0
  2057. package/dist/tools/video/youtube-storyboard.js +194 -0
  2058. package/dist/tools/video-flow-handoff-tool.d.ts +181 -0
  2059. package/dist/tools/video-flow-handoff-tool.js +261 -0
  2060. package/dist/tools/video-long-form-plan-tool.d.ts +31 -0
  2061. package/dist/tools/video-long-form-plan-tool.js +87 -0
  2062. package/dist/tools/video-quality-gate-tool.d.ts +97 -0
  2063. package/dist/tools/video-quality-gate-tool.js +189 -0
  2064. package/dist/tools/video-route-tool.d.ts +128 -0
  2065. package/dist/tools/video-route-tool.js +126 -0
  2066. package/dist/tools/video-studio-tool-helpers.d.ts +22 -0
  2067. package/dist/tools/video-studio-tool-helpers.js +128 -0
  2068. package/dist/tools/video-trailer-plan-tool.d.ts +60 -0
  2069. package/dist/tools/video-trailer-plan-tool.js +103 -0
  2070. package/dist/tools/vision/blender-render.d.ts +76 -0
  2071. package/dist/tools/vision/blender-render.js +121 -0
  2072. package/dist/tools/vision/image-processor.d.ts +1 -0
  2073. package/dist/tools/vision/image-processor.js +8 -1
  2074. package/dist/tools/vision/load-sharp.d.ts +53 -0
  2075. package/dist/tools/vision/load-sharp.js +48 -0
  2076. package/dist/tools/vision/mean-luma.d.ts +4 -0
  2077. package/dist/tools/vision/mean-luma.js +189 -0
  2078. package/dist/tools/vision/object-detection.d.ts +90 -0
  2079. package/dist/tools/vision/object-detection.js +403 -0
  2080. package/dist/tools/vision/vision-analysis.js +2 -1
  2081. package/dist/tools/weather.d.ts +33 -0
  2082. package/dist/tools/weather.js +183 -0
  2083. package/dist/tools/web-scrape-tool.d.ts +63 -0
  2084. package/dist/tools/web-scrape-tool.js +318 -0
  2085. package/dist/tools/web-search.d.ts +67 -6
  2086. package/dist/tools/web-search.js +231 -68
  2087. package/dist/tools/workspace-tools.d.ts +39 -0
  2088. package/dist/tools/workspace-tools.js +347 -0
  2089. package/dist/tracks/track-manager.js +9 -8
  2090. package/dist/triggers/webhook-trigger.js +10 -18
  2091. package/dist/ui/components/ChatHistory.js +12 -0
  2092. package/dist/ui/components/ChatInterface.js +6 -2
  2093. package/dist/ui/components/FileAutocomplete.d.ts +6 -1
  2094. package/dist/ui/components/FileAutocomplete.js +136 -76
  2095. package/dist/ui/components/FuzzyPicker.d.ts +5 -0
  2096. package/dist/ui/components/FuzzyPicker.js +1 -1
  2097. package/dist/ui/http-server/server.js +2 -2
  2098. package/dist/undo/checkpoint-manager.d.ts +3 -0
  2099. package/dist/undo/checkpoint-manager.js +6 -1
  2100. package/dist/utils/approval-pattern-tracker.js +5 -13
  2101. package/dist/utils/ascii-banner.d.ts +1 -1
  2102. package/dist/utils/ascii-banner.js +1 -1
  2103. package/dist/utils/atomic-write.d.ts +77 -0
  2104. package/dist/utils/atomic-write.js +530 -0
  2105. package/dist/utils/audio-player.d.ts +1 -0
  2106. package/dist/utils/audio-player.js +7 -3
  2107. package/dist/utils/autonomy-manager.js +12 -3
  2108. package/dist/utils/command-exists.d.ts +14 -0
  2109. package/dist/utils/command-exists.js +43 -0
  2110. package/dist/utils/config-validation/schema.d.ts +13 -13
  2111. package/dist/utils/config-validation/schema.js +33 -1
  2112. package/dist/utils/confirmation-service.d.ts +60 -1
  2113. package/dist/utils/confirmation-service.js +204 -41
  2114. package/dist/utils/cost-tracker.d.ts +66 -1
  2115. package/dist/utils/cost-tracker.js +100 -17
  2116. package/dist/utils/history-manager.js +6 -7
  2117. package/dist/utils/init-project.js +17 -13
  2118. package/dist/utils/input-validation/index.d.ts +16 -16
  2119. package/dist/utils/installation-id.js +7 -22
  2120. package/dist/utils/interactive-setup.js +7 -12
  2121. package/dist/utils/json-salvage.d.ts +22 -0
  2122. package/dist/utils/json-salvage.js +91 -0
  2123. package/dist/utils/llm-retry.js +3 -0
  2124. package/dist/utils/logger.d.ts +1 -0
  2125. package/dist/utils/logger.js +16 -5
  2126. package/dist/utils/model-router.js +8 -12
  2127. package/dist/utils/model-utils.js +14 -0
  2128. package/dist/utils/output-sanitizer.d.ts +4 -8
  2129. package/dist/utils/output-sanitizer.js +10 -10
  2130. package/dist/utils/output-schema-validator.d.ts +7 -0
  2131. package/dist/utils/output-schema-validator.js +25 -1
  2132. package/dist/utils/response-cache.js +11 -22
  2133. package/dist/utils/ripgrep-path.d.ts +11 -0
  2134. package/dist/utils/ripgrep-path.js +60 -0
  2135. package/dist/utils/semantic-cache.js +4 -7
  2136. package/dist/utils/settings-manager.d.ts +27 -4
  2137. package/dist/utils/settings-manager.js +51 -39
  2138. package/dist/utils/shell-completions.js +25 -34
  2139. package/dist/utils/shell-configuration.d.ts +39 -0
  2140. package/dist/utils/shell-configuration.js +106 -0
  2141. package/dist/utils/stream-stall-guard.d.ts +39 -0
  2142. package/dist/utils/stream-stall-guard.js +123 -0
  2143. package/dist/utils/subprocess-env.d.ts +15 -0
  2144. package/dist/utils/subprocess-env.js +112 -0
  2145. package/dist/utils/telegram-api-base.d.ts +9 -0
  2146. package/dist/utils/telegram-api-base.js +15 -0
  2147. package/dist/utils/telemetry-config.js +16 -13
  2148. package/dist/utils/update-notifier.js +5 -10
  2149. package/dist/utils/validators.js +1 -2
  2150. package/dist/versioning/config-migrator.js +3 -2
  2151. package/dist/versioning/migration-manager.js +5 -4
  2152. package/dist/versioning/version-detector.js +2 -1
  2153. package/dist/vision-train/assets.d.ts +37 -0
  2154. package/dist/vision-train/assets.js +97 -0
  2155. package/dist/vision-train/ckg-publish.d.ts +26 -0
  2156. package/dist/vision-train/ckg-publish.js +36 -0
  2157. package/dist/vision-train/coco-to-labels.d.ts +63 -0
  2158. package/dist/vision-train/coco-to-labels.js +63 -0
  2159. package/dist/vision-train/curriculum.d.ts +29 -0
  2160. package/dist/vision-train/curriculum.js +49 -0
  2161. package/dist/vision-train/engine.d.ts +56 -0
  2162. package/dist/vision-train/engine.js +55 -0
  2163. package/dist/vision-train/report.d.ts +15 -0
  2164. package/dist/vision-train/report.js +72 -0
  2165. package/dist/vision-train/scorer.d.ts +67 -0
  2166. package/dist/vision-train/scorer.js +114 -0
  2167. package/dist/vision-train/yolo-labels.d.ts +13 -0
  2168. package/dist/vision-train/yolo-labels.js +66 -0
  2169. package/dist/voice/elevenlabs-voice.d.ts +53 -0
  2170. package/dist/voice/elevenlabs-voice.js +412 -0
  2171. package/dist/voice/kyutai-local-voice.d.ts +33 -0
  2172. package/dist/voice/kyutai-local-voice.js +198 -0
  2173. package/dist/voice/local-tts.d.ts +106 -3
  2174. package/dist/voice/local-tts.js +672 -35
  2175. package/dist/voice/local-whisper.d.ts +11 -0
  2176. package/dist/voice/local-whisper.js +18 -2
  2177. package/dist/voice/pcm-edges.d.ts +43 -0
  2178. package/dist/voice/pcm-edges.js +210 -0
  2179. package/dist/voice/perceived-latency-benchmark.d.ts +56 -0
  2180. package/dist/voice/perceived-latency-benchmark.js +218 -0
  2181. package/dist/voice/tts-bank.d.ts +72 -0
  2182. package/dist/voice/tts-bank.js +172 -0
  2183. package/dist/voice/tts-latency-benchmark.d.ts +36 -0
  2184. package/dist/voice/tts-latency-benchmark.js +76 -0
  2185. package/dist/voice/tts-volume.d.ts +86 -0
  2186. package/dist/voice/tts-volume.js +378 -0
  2187. package/dist/voice/two-speed-voice.d.ts +19 -0
  2188. package/dist/voice/two-speed-voice.js +40 -0
  2189. package/dist/voice/voice-to-code.js +1 -1
  2190. package/dist/voice/voicebox-tts.d.ts +150 -0
  2191. package/dist/voice/voicebox-tts.js +669 -0
  2192. package/dist/voice/wake-word.d.ts +2 -0
  2193. package/dist/voice/wake-word.js +30 -10
  2194. package/dist/webhooks/webhook-manager.js +10 -18
  2195. package/dist/widgets/auto-widget.d.ts +27 -0
  2196. package/dist/widgets/auto-widget.js +111 -0
  2197. package/dist/widgets/canvas-publish.d.ts +15 -0
  2198. package/dist/widgets/canvas-publish.js +39 -0
  2199. package/dist/widgets/curated/news.d.ts +2 -0
  2200. package/dist/widgets/curated/news.js +46 -0
  2201. package/dist/widgets/curated/stock.d.ts +1 -0
  2202. package/dist/widgets/curated/stock.js +87 -0
  2203. package/dist/widgets/curated/weather.d.ts +2 -0
  2204. package/dist/widgets/curated/weather.js +93 -0
  2205. package/dist/widgets/template-engine.d.ts +19 -0
  2206. package/dist/widgets/template-engine.js +134 -0
  2207. package/dist/widgets/widget-engine.d.ts +24 -0
  2208. package/dist/widgets/widget-engine.js +153 -0
  2209. package/dist/widgets/widget-gate.d.ts +19 -0
  2210. package/dist/widgets/widget-gate.js +144 -0
  2211. package/dist/widgets/widget-image-renderer.d.ts +4 -0
  2212. package/dist/widgets/widget-image-renderer.js +164 -0
  2213. package/dist/widgets/widget-matcher.d.ts +48 -0
  2214. package/dist/widgets/widget-matcher.js +109 -0
  2215. package/dist/widgets/widget-proposer.d.ts +17 -0
  2216. package/dist/widgets/widget-proposer.js +75 -0
  2217. package/dist/widgets/widget-registry.d.ts +36 -0
  2218. package/dist/widgets/widget-registry.js +231 -0
  2219. package/dist/widgets/widget-types.d.ts +100 -0
  2220. package/dist/widgets/widget-types.js +17 -0
  2221. package/dist/wizard/environment-detection.d.ts +67 -0
  2222. package/dist/wizard/environment-detection.js +210 -0
  2223. package/dist/wizard/onboarding.d.ts +21 -1
  2224. package/dist/wizard/onboarding.js +202 -27
  2225. package/dist/workflows/state-manager.js +8 -2
  2226. package/dist/workspace/workspace-config.d.ts +37 -0
  2227. package/dist/workspace/workspace-config.js +199 -0
  2228. package/dist/workspace/workspace-isolation.d.ts +19 -0
  2229. package/dist/workspace/workspace-isolation.js +124 -39
  2230. package/dist/workspace/workspace-manager.js +19 -14
  2231. package/examples/claude_desktop_config.json +8 -0
  2232. package/package.json +75 -31
  2233. package/.codebuddy/README.md +0 -65
  2234. package/dist/agent/middleware/learning-first-middleware.d.ts +0 -79
  2235. package/dist/agent/middleware/learning-first-middleware.js +0 -271
  2236. package/dist/agent/middleware/tool-filter-middleware.d.ts +0 -45
  2237. package/dist/agent/middleware/tool-filter-middleware.js +0 -122
  2238. package/dist/codebuddy/tool-definitions/batch-tools.d.ts +0 -10
  2239. package/dist/codebuddy/tool-definitions/batch-tools.js +0 -46
  2240. package/dist/codebuddy/tool-definitions/graph-tools.d.ts +0 -13
  2241. package/dist/codebuddy/tool-definitions/graph-tools.js +0 -78
  2242. package/dist/plugins/code-explorer/CodeExplorerMCPClient.d.ts +0 -129
  2243. package/dist/plugins/code-explorer/CodeExplorerMCPClient.js +0 -143
  2244. package/dist/tools/registry/batch-tools.d.ts +0 -36
  2245. package/dist/tools/registry/batch-tools.js +0 -135
  2246. package/dist/tools/registry/graph-tools.d.ts +0 -45
  2247. package/dist/tools/registry/graph-tools.js +0 -283
@@ -0,0 +1,3036 @@
1
+ /**
2
+ * Code Buddy Mobile PWA — protocol matches src/server/websocket/handler.ts
3
+ * authenticate / chat / stop / ping + stream_* / confirmation_*
4
+ * Reactions are local-only (no WS type "reaction").
5
+ */
6
+ (function (root) {
7
+ 'use strict';
8
+
9
+ var TOKEN_KEY = 'codebuddy_mobile_token';
10
+ var BASE = '/__codebuddy__/mobile';
11
+ var DEFAULT_AVATAR = BASE + '/assets/icon-192.png';
12
+ var REACTIONS = ['❤️', '😂', '😮', '😢', '👍', '🔥'];
13
+ var MAX_RECENT = 10;
14
+ var MAX_HISTORY = 2000;
15
+ var VIRTUAL_WINDOW = 150;
16
+ var MAX_HISTORY_IMAGES = 5;
17
+ var MAX_IMAGE_CHARS = 100 * 1024;
18
+ // Client-side resize target. The server refuses anything over 600 KB per
19
+ // photo, so the phone shrinks BEFORE sending: a 12 Mpx camera shot is ~4 MB
20
+ // and would simply be rejected.
21
+ var ATTACH_MAX_DIM = 1280;
22
+ var ATTACH_QUALITY = 0.82;
23
+ var ATTACH_MAX_COUNT = 4;
24
+ var ATTACH_MAX_CHARS = 600 * 1024;
25
+ var MAX_AVATAR_CHARS = 200 * 1024;
26
+ var LONG_PRESS_MS = 400;
27
+ var GROUP_MS = 5 * 60 * 1000;
28
+ var LONG_REPLY = 400;
29
+
30
+ var STORAGE = {
31
+ recent: 'codebuddy_mobile_emoji_recent',
32
+ avatar: 'codebuddy_mobile_avatar',
33
+ history: 'codebuddy_mobile_history',
34
+ suggestHidden: 'codebuddy_mobile_suggest_hidden',
35
+ pins: 'codebuddy_mobile_pins',
36
+ lastRead: 'codebuddy_mobile_last_read',
37
+ voiceReply: 'codebuddy_mobile_voice_reply',
38
+ theme: 'codebuddy_mobile_theme',
39
+ font: 'codebuddy_mobile_font',
40
+ wallpaper: 'codebuddy_mobile_wallpaper',
41
+ sounds: 'codebuddy_mobile_sounds',
42
+ };
43
+
44
+ var SUGGEST_START = [
45
+ 'Coucou 💕',
46
+ 'Raconte-moi ta journée',
47
+ 'Envoie-moi une photo de toi 📸',
48
+ 'Tu penses à quoi ?',
49
+ ];
50
+ var SUGGEST_IMAGE = ['Encore une ?', 'Trop belle 😍'];
51
+ var SUGGEST_LONG = ['Continue', 'Résume'];
52
+
53
+ var state = {
54
+ token: '',
55
+ ws: null,
56
+ connected: false,
57
+ streaming: false,
58
+ assistant: 'companion',
59
+ assistantLabel: 'Lisa',
60
+ peers: [],
61
+ confirmations: [],
62
+ activeConfirmationId: null,
63
+ streamEl: null,
64
+ streamId: null,
65
+ pingTimer: 0,
66
+ reconnectTimer: 0,
67
+ reconnectAttempt: 0,
68
+ manualClose: false,
69
+ outbox: [],
70
+ messages: [],
71
+ seq: 0,
72
+ avatarUrl: DEFAULT_AVATAR,
73
+ presence: 'offline',
74
+ moodLabel: '',
75
+ pickerOpen: false,
76
+ pickerCat: 'smileys',
77
+ suggestHidden: false,
78
+ suggestRotate: 0,
79
+ atBottom: true,
80
+ unread: 0,
81
+ reactionTarget: null,
82
+ longPressTimer: 0,
83
+ lastTap: { id: '', at: 0 },
84
+ sawChunk: false,
85
+ attachments: [],
86
+ album: [],
87
+ albumLoading: false,
88
+ lightboxAlbumId: '',
89
+ bound: false,
90
+ replyTo: null,
91
+ editOf: null,
92
+ telegramForward: false,
93
+ selectMode: false,
94
+ selected: {},
95
+ pins: [],
96
+ searchOpen: false,
97
+ searchQuery: '',
98
+ searchHits: [],
99
+ searchHit: 0,
100
+ unreadAnchorId: '',
101
+ swipe: null,
102
+ pendingAckId: '',
103
+ voiceReply: false,
104
+ lastUserWasVoice: false,
105
+ recording: null,
106
+ recordTimer: 0,
107
+ recordStartedAt: 0,
108
+ recordCancelled: false,
109
+ lastSeenAt: 0,
110
+ sounds: true,
111
+ mobilePush: false,
112
+ historyLoading: false,
113
+ historyDone: false,
114
+ theme: 'dark',
115
+ font: '2',
116
+ wallpaper: '0',
117
+ };
118
+
119
+ try {
120
+ state.token = sessionStorage.getItem(TOKEN_KEY) || '';
121
+ } catch (_err) {
122
+ state.token = '';
123
+ }
124
+
125
+ function el(id) {
126
+ return document.getElementById(id);
127
+ }
128
+
129
+ function emojiData() {
130
+ return root.CODEBUDDY_EMOJI_DATA || { CATEGORIES: [], EMOJIS: [], searchEmojis: function () { return []; }, byCategory: function () { return []; } };
131
+ }
132
+
133
+ function haptic() {
134
+ try {
135
+ if (navigator.vibrate) navigator.vibrate(10);
136
+ } catch (_err) { /* optional */ }
137
+ }
138
+
139
+ function storeGet(key, fallback) {
140
+ try {
141
+ var raw = localStorage.getItem(key);
142
+ if (raw == null) return fallback;
143
+ return JSON.parse(raw);
144
+ } catch (_err) {
145
+ return fallback;
146
+ }
147
+ }
148
+
149
+ function storeSet(key, value) {
150
+ try {
151
+ localStorage.setItem(key, JSON.stringify(value));
152
+ return true;
153
+ } catch (_err) {
154
+ return false;
155
+ }
156
+ }
157
+
158
+ function escapeHtml(text) {
159
+ return String(text)
160
+ .replace(/&/g, '&')
161
+ .replace(/</g, '&lt;')
162
+ .replace(/>/g, '&gt;')
163
+ .replace(/"/g, '&quot;');
164
+ }
165
+
166
+ function linkify(escaped) {
167
+ return escaped.replace(/(https?:\/\/[^\s<]+)/g, '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>');
168
+ }
169
+
170
+ function renderMarkdown(src) {
171
+ var escaped = linkify(escapeHtml(src));
172
+ return escaped
173
+ .replace(/```([\s\S]*?)```/g, '<pre><code>$1</code></pre>')
174
+ .replace(/`([^`]+)`/g, '<code>$1</code>')
175
+ .replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>')
176
+ .replace(/\n/g, '<br>');
177
+ }
178
+
179
+ function show(id, on) {
180
+ var node = el(id);
181
+ if (!node) return;
182
+ node.classList.toggle('hidden', !on);
183
+ node.classList.toggle('active', on);
184
+ }
185
+
186
+ function setError(message) {
187
+ var box = el('error-message');
188
+ if (!box) return;
189
+ box.textContent = message || '';
190
+ box.classList.toggle('hidden', !message);
191
+ }
192
+
193
+ function authHeaders() {
194
+ return { Authorization: 'Bearer ' + state.token };
195
+ }
196
+
197
+ async function fetchJson(path) {
198
+ var res = await fetch(path, { headers: authHeaders() });
199
+ if (!res.ok) throw new Error(path + ' → ' + res.status);
200
+ return res.json();
201
+ }
202
+
203
+ function wsUrl() {
204
+ var proto = location.protocol === 'https:' ? 'wss:' : 'ws:';
205
+ return proto + '//' + location.host + '/ws';
206
+ }
207
+
208
+ var OUTBOX_MAX = 5;
209
+
210
+ function wsOpen() {
211
+ return Boolean(state.ws && state.ws.readyState === 1);
212
+ }
213
+
214
+ function send(type, payload) {
215
+ var frame = { type: type };
216
+ if (payload !== undefined) frame.payload = payload;
217
+ if (type === 'chat' && !wsOpen()) {
218
+ // Serveur redémarré ou téléphone revenu de veille : on garde le message
219
+ // et on le rejoue dès que la connexion est ré-authentifiée.
220
+ state.outbox.push(frame);
221
+ while (state.outbox.length > OUTBOX_MAX) state.outbox.shift();
222
+ ensureConnected();
223
+ return;
224
+ }
225
+ if (!state.ws || state.ws.readyState !== 1) return;
226
+ state.ws.send(JSON.stringify(frame));
227
+ }
228
+
229
+ function flushOutbox() {
230
+ if (!wsOpen()) return;
231
+ var pending = state.outbox;
232
+ state.outbox = [];
233
+ pending.forEach(function (frame) {
234
+ state.ws.send(JSON.stringify(frame));
235
+ });
236
+ }
237
+
238
+ function reconnectDelayMs() {
239
+ return Math.min(30000, 1000 * Math.pow(2, Math.min(state.reconnectAttempt, 5)));
240
+ }
241
+
242
+ function scheduleReconnect() {
243
+ if (state.reconnectTimer || state.manualClose || !state.token) return;
244
+ var delay = reconnectDelayMs();
245
+ state.reconnectAttempt += 1;
246
+ setPresence('reconnecting');
247
+ state.reconnectTimer = setTimeout(function () {
248
+ state.reconnectTimer = 0;
249
+ connectWs();
250
+ }, delay);
251
+ }
252
+
253
+ function ensureConnected() {
254
+ if (wsOpen() || state.manualClose || !state.token) return;
255
+ if (state.ws && state.ws.readyState === 0) return; // connexion en cours
256
+ if (state.reconnectTimer) {
257
+ clearTimeout(state.reconnectTimer);
258
+ state.reconnectTimer = 0;
259
+ }
260
+ connectWs();
261
+ }
262
+
263
+ function nextId() {
264
+ state.seq += 1;
265
+ return 'm-' + Date.now() + '-' + state.seq;
266
+ }
267
+
268
+ function byteLen(str) {
269
+ return String(str || '').length;
270
+ }
271
+
272
+ function constrainDataUrl(dataUrl, maxChars) {
273
+ if (!dataUrl) return '';
274
+ if (byteLen(dataUrl) <= maxChars) return dataUrl;
275
+ return '';
276
+ }
277
+
278
+ function formatDuration(ms) {
279
+ var total = Math.max(0, Math.round((ms || 0) / 1000));
280
+ var m = Math.floor(total / 60);
281
+ var s = total % 60;
282
+ return m + ':' + (s < 10 ? '0' : '') + s;
283
+ }
284
+
285
+ function voiceCardHtml(msg) {
286
+ var speed = msg.audioSpeed === 1.5 ? '1.5×' : '1×';
287
+ var transcript = msg.transcript
288
+ ? '<details class="voice-transcript"><summary>Transcription</summary>' + escapeHtml(msg.transcript) + '</details>'
289
+ : '';
290
+ return '<div class="voice-card" data-voice="' + escapeHtml(msg.id) + '">' +
291
+ '<button type="button" class="btn icon touch voice-play" data-voice="' + escapeHtml(msg.id) + '" aria-label="Lecture">' +
292
+ (msg.playing ? '⏸' : '▶') + '</button>' +
293
+ '<span class="voice-dur">' + escapeHtml(formatDuration(msg.durationMs)) + '</span>' +
294
+ '<button type="button" class="btn icon touch voice-speed" data-voice="' + escapeHtml(msg.id) + '" aria-label="Vitesse">' +
295
+ speed + '</button>' +
296
+ transcript +
297
+ '</div>';
298
+ }
299
+
300
+ function imageHtml(dataUrl) {
301
+ if (!dataUrl) return '';
302
+ return '<img class="bubble-img selfie" alt="Image" src="' + dataUrl + '">';
303
+ }
304
+
305
+ function sentImagesHtml(images) {
306
+ if (!images || !images.length) return '';
307
+ var html = '<div class="bubble-photos">';
308
+ var i;
309
+ for (i = 0; i < images.length; i += 1) {
310
+ html += '<img class="bubble-img sent" alt="Photo envoyée" src="' + images[i] + '">';
311
+ }
312
+ return html + '</div>';
313
+ }
314
+
315
+ function dataUrlFromFrame(image) {
316
+ if (!image || typeof image.data !== 'string' || typeof image.mimeType !== 'string') return '';
317
+ var mime = image.mimeType === 'image/jpeg' || image.mimeType === 'image/webp'
318
+ ? image.mimeType
319
+ : 'image/png';
320
+ return 'data:' + mime + ';base64,' + image.data;
321
+ }
322
+
323
+ function startOfDay(ts) {
324
+ var d = new Date(ts);
325
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();
326
+ }
327
+
328
+ function daySeparatorLabel(ts, now) {
329
+ var then = startOfDay(ts);
330
+ var today = startOfDay(now == null ? Date.now() : now);
331
+ var diff = Math.round((today - then) / 86400000);
332
+ if (diff === 0) return 'Aujourd’hui';
333
+ if (diff === 1) return 'Hier';
334
+ return new Date(ts).toLocaleDateString('fr-FR', {
335
+ weekday: 'long',
336
+ day: 'numeric',
337
+ month: 'long',
338
+ });
339
+ }
340
+
341
+ function formatTime(ts) {
342
+ return new Date(ts).toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' });
343
+ }
344
+
345
+ function formatFullTime(ts) {
346
+ return new Date(ts).toLocaleString('fr-FR', {
347
+ day: 'numeric',
348
+ month: 'short',
349
+ year: 'numeric',
350
+ hour: '2-digit',
351
+ minute: '2-digit',
352
+ });
353
+ }
354
+
355
+ function groupingFor(index, msgs) {
356
+ var cur = msgs[index];
357
+ var prev = msgs[index - 1];
358
+ var next = msgs[index + 1];
359
+ var withPrev = prev && prev.role === cur.role && Math.abs(cur.ts - prev.ts) < GROUP_MS;
360
+ var withNext = next && next.role === cur.role && Math.abs(next.ts - cur.ts) < GROUP_MS;
361
+ if (withPrev && withNext) return 'group-mid';
362
+ if (withPrev) return 'group-end';
363
+ if (withNext) return 'group-start';
364
+ return 'group-alone';
365
+ }
366
+
367
+ function ackMark(msg) {
368
+ if (msg.role !== 'user') return '';
369
+ if (msg.ack === 'read' || msg.ack === 'replied') {
370
+ return '<span class="ack read" aria-label="Lu">✓✓</span>';
371
+ }
372
+ if (msg.ack === 'received') {
373
+ return '<span class="ack received" aria-label="Reçu">✓✓</span>';
374
+ }
375
+ return '<span class="ack sent" aria-label="Envoyé">✓</span>';
376
+ }
377
+
378
+ function isNearBottom(box) {
379
+ if (!box) return true;
380
+ return box.scrollHeight - box.scrollTop - box.clientHeight < 80;
381
+ }
382
+
383
+ function updateJumpButton() {
384
+ var btn = el('jump-bottom');
385
+ var count = el('unread-count');
386
+ if (!btn) return;
387
+ var showBtn = !state.atBottom;
388
+ btn.classList.toggle('hidden', !showBtn);
389
+ if (count) {
390
+ count.textContent = String(state.unread);
391
+ count.classList.toggle('hidden', state.unread < 1);
392
+ }
393
+ }
394
+
395
+ function scrollMessages(force) {
396
+ var box = el('messages');
397
+ if (!box) return;
398
+ if (force || state.atBottom) {
399
+ box.scrollTop = box.scrollHeight;
400
+ state.atBottom = true;
401
+ state.unread = 0;
402
+ state.unreadAnchorId = '';
403
+ rememberLastRead();
404
+ }
405
+ updateJumpButton();
406
+ }
407
+
408
+ function persistHistory() {
409
+ var images = 0;
410
+ var slim = state.messages.slice(-MAX_HISTORY).map(function (msg) {
411
+ var copy = {
412
+ id: msg.id,
413
+ role: msg.role,
414
+ text: msg.text || '',
415
+ ts: msg.ts,
416
+ reaction: msg.reaction || '',
417
+ ack: msg.ack || '',
418
+ edited: msg.edited === true,
419
+ pinned: msg.pinned === true,
420
+ durationMs: typeof msg.durationMs === 'number' ? msg.durationMs : undefined,
421
+ transcript: msg.transcript || undefined,
422
+ hasAudio: msg.hasAudio === true,
423
+ };
424
+ if (msg.replyTo && typeof msg.replyTo.id === 'string') {
425
+ copy.replyTo = {
426
+ id: msg.replyTo.id,
427
+ text: String(msg.replyTo.text || '').slice(0, 280),
428
+ role: msg.replyTo.role || '',
429
+ };
430
+ }
431
+ if (msg.image && images < MAX_HISTORY_IMAGES) {
432
+ var clipped = constrainDataUrl(msg.image, MAX_IMAGE_CHARS);
433
+ if (clipped) {
434
+ copy.image = clipped;
435
+ images += 1;
436
+ }
437
+ }
438
+ if (msg.images && msg.images.length && images < MAX_HISTORY_IMAGES) {
439
+ var kept = [];
440
+ msg.images.forEach(function (dataUrl) {
441
+ if (images >= MAX_HISTORY_IMAGES) return;
442
+ var small = constrainDataUrl(dataUrl, MAX_IMAGE_CHARS);
443
+ if (small) {
444
+ kept.push(small);
445
+ images += 1;
446
+ }
447
+ });
448
+ if (kept.length) copy.images = kept;
449
+ }
450
+ return copy;
451
+ });
452
+ if (!storeSet(STORAGE.history, slim)) {
453
+ var withoutImages = slim.map(function (msg) {
454
+ if (!msg.image && !msg.images) return msg;
455
+ return {
456
+ id: msg.id,
457
+ role: msg.role,
458
+ text: msg.text || '',
459
+ ts: msg.ts,
460
+ reaction: msg.reaction || '',
461
+ ack: msg.ack || '',
462
+ edited: msg.edited === true,
463
+ pinned: msg.pinned === true,
464
+ replyTo: msg.replyTo || undefined,
465
+ };
466
+ });
467
+ if (!storeSet(STORAGE.history, withoutImages)) {
468
+ var candidate = withoutImages;
469
+ while (candidate.length > 1) {
470
+ candidate = candidate.slice(Math.ceil(candidate.length / 2));
471
+ if (storeSet(STORAGE.history, candidate)) {
472
+ break;
473
+ }
474
+ }
475
+ }
476
+ }
477
+ }
478
+
479
+ function restoreHistory() {
480
+ var raw = storeGet(STORAGE.history, []);
481
+ if (!Array.isArray(raw)) raw = [];
482
+ state.messages = raw.filter(function (item) {
483
+ return item && typeof item.id === 'string' && typeof item.role === 'string';
484
+ }).slice(-MAX_HISTORY).map(function (item) {
485
+ return {
486
+ id: item.id,
487
+ role: item.role,
488
+ text: typeof item.text === 'string' ? item.text : '',
489
+ ts: typeof item.ts === 'number' ? item.ts : Date.now(),
490
+ reaction: typeof item.reaction === 'string' ? item.reaction : '',
491
+ ack: typeof item.ack === 'string' ? item.ack : '',
492
+ edited: item.edited === true,
493
+ pinned: item.pinned === true,
494
+ replyTo: item.replyTo && typeof item.replyTo.id === 'string'
495
+ ? { id: item.replyTo.id, text: String(item.replyTo.text || ''), role: item.replyTo.role || '' }
496
+ : null,
497
+ image: typeof item.image === 'string' ? item.image : '',
498
+ images: Array.isArray(item.images)
499
+ ? item.images.filter(function (entry) { return typeof entry === 'string'; })
500
+ : [],
501
+ durationMs: typeof item.durationMs === 'number' ? item.durationMs : 0,
502
+ transcript: typeof item.transcript === 'string' ? item.transcript : '',
503
+ hasAudio: item.hasAudio === true,
504
+ };
505
+ });
506
+ var storedPins = storeGet(STORAGE.pins, []);
507
+ state.pins = Array.isArray(storedPins)
508
+ ? storedPins.filter(function (id) { return typeof id === 'string'; })
509
+ : [];
510
+ state.messages.forEach(function (msg) {
511
+ if (state.pins.indexOf(msg.id) !== -1) msg.pinned = true;
512
+ });
513
+ var lastRead = storeGet(STORAGE.lastRead, '');
514
+ if (typeof lastRead === 'string' && lastRead) {
515
+ var lastMsg = state.messages[state.messages.length - 1];
516
+ if (lastMsg && lastMsg.id !== lastRead) state.unreadAnchorId = lastRead;
517
+ }
518
+ var maxSeq = 0;
519
+ state.messages.forEach(function (msg) {
520
+ var m = /-(\d+)$/.exec(msg.id);
521
+ if (m) maxSeq = Math.max(maxSeq, Number(m[1]) || 0);
522
+ });
523
+ state.seq = maxSeq;
524
+ renderMessages();
525
+ }
526
+
527
+ function clearHistory() {
528
+ state.messages = [];
529
+ state.pins = [];
530
+ state.selected = {};
531
+ state.unreadAnchorId = '';
532
+ storeSet(STORAGE.history, []);
533
+ storeSet(STORAGE.pins, []);
534
+ storeSet(STORAGE.lastRead, '');
535
+ renderMessages();
536
+ refreshSuggestions();
537
+ }
538
+
539
+ function markUserReplied() {
540
+ var i;
541
+ for (i = state.messages.length - 1; i >= 0; i -= 1) {
542
+ if (state.messages[i].role === 'user') {
543
+ state.messages[i].ack = 'read';
544
+ } else {
545
+ break;
546
+ }
547
+ }
548
+ }
549
+
550
+ function highlightSearch(html) {
551
+ var q = (state.searchQuery || '').trim();
552
+ if (!q) return html;
553
+ var safe = q.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
554
+ try {
555
+ return html.replace(new RegExp(safe, 'gi'), function (match) {
556
+ return '<mark class="search-hit">' + match + '</mark>';
557
+ });
558
+ } catch (_err) {
559
+ return html;
560
+ }
561
+ }
562
+
563
+ function renderMessages() {
564
+ var box = el('messages');
565
+ if (!box) return;
566
+ var html = [];
567
+ var lastDay = null;
568
+ var now = Date.now();
569
+ var start = Math.max(0, state.messages.length - VIRTUAL_WINDOW);
570
+ var visible = state.messages.slice(start);
571
+ visible.forEach(function (msg, visIndex) {
572
+ var index = start + visIndex;
573
+ var day = startOfDay(msg.ts);
574
+ if (day !== lastDay) {
575
+ html.push('<div class="day-sep">' + escapeHtml(daySeparatorLabel(msg.ts, now)) + '</div>');
576
+ lastDay = day;
577
+ }
578
+ if (
579
+ state.unreadAnchorId &&
580
+ index > 0 &&
581
+ state.messages[index - 1].id === state.unreadAnchorId
582
+ ) {
583
+ html.push('<div class="new-sep" role="separator">nouveaux messages</div>');
584
+ }
585
+ var group = groupingFor(index, state.messages);
586
+ var avatar = '';
587
+ if (msg.role === 'assistant') {
588
+ avatar = '<img class="msg-avatar" alt="" src="' + escapeHtml(state.avatarUrl) + '">';
589
+ }
590
+ var quote = '';
591
+ if (msg.replyTo && msg.replyTo.text) {
592
+ quote = '<button type="button" class="quote-ref" data-quote="' + escapeHtml(msg.replyTo.id || '') +
593
+ '" aria-label="Aller au message cité">' + escapeHtml(String(msg.replyTo.text).slice(0, 140)) + '</button>';
594
+ }
595
+ var body = highlightSearch(quote + renderMarkdown(msg.text || ''));
596
+ if (msg.image) body += imageHtml(msg.image);
597
+ if (msg.images && msg.images.length) body += sentImagesHtml(msg.images);
598
+ if (msg.hasAudio || msg.audioUrl) body += voiceCardHtml(msg);
599
+ var reaction = msg.reaction
600
+ ? '<div class="bubble-reactions">' + escapeHtml(msg.reaction) + '</div>'
601
+ : '';
602
+ var edited = msg.edited ? '<span class="edited-mark">modifié</span>' : '';
603
+ var selected = state.selected[msg.id] ? ' selected' : '';
604
+ var emojiOnly = isEmojiOnly(msg.text) && !msg.hasAudio && !msg.image && !(msg.images && msg.images.length);
605
+ html.push(
606
+ '<div class="msg-row ' + msg.role + ' ' + group + selected + '" data-id="' + escapeHtml(msg.id) + '" data-role="' + escapeHtml(msg.role) + '">' +
607
+ avatar +
608
+ '<div class="bubble ' + msg.role + ' ' + group + (emojiOnly ? ' emoji-only' : '') + '">' +
609
+ '<div class="bubble-body">' + body + '</div>' +
610
+ '<div class="bubble-meta">' + escapeHtml(formatFullTime(msg.ts)) + edited + ackMark(msg) + '</div>' +
611
+ reaction +
612
+ '</div>' +
613
+ '</div>'
614
+ );
615
+ });
616
+ box.innerHTML = html.join('');
617
+ scrollMessages(false);
618
+ renderPinnedBar();
619
+ hydrateLinkPreviews(box);
620
+ }
621
+
622
+ function addMessage(partial) {
623
+ var msg = {
624
+ id: partial.id || nextId(),
625
+ role: partial.role || 'assistant',
626
+ text: partial.text || '',
627
+ ts: partial.ts || Date.now(),
628
+ reaction: partial.reaction || '',
629
+ ack: partial.ack || (partial.role === 'user' ? 'sent' : ''),
630
+ edited: partial.edited === true,
631
+ pinned: partial.pinned === true,
632
+ replyTo: partial.replyTo || null,
633
+ durationMs: partial.durationMs || 0,
634
+ transcript: partial.transcript || '',
635
+ hasAudio: partial.hasAudio === true || Boolean(partial.audioUrl),
636
+ audioUrl: partial.audioUrl || '',
637
+ audioSpeed: partial.audioSpeed || 1,
638
+ image: partial.image || '',
639
+ images: partial.images && partial.images.length ? partial.images.slice(0, ATTACH_MAX_COUNT) : [],
640
+ };
641
+ if (msg.role === 'assistant') markUserReplied();
642
+ state.messages.push(msg);
643
+ if (state.messages.length > MAX_HISTORY) {
644
+ state.messages = state.messages.slice(-MAX_HISTORY);
645
+ }
646
+ persistHistory();
647
+ var box = el('messages');
648
+ var stick = isNearBottom(box);
649
+ if (!stick && msg.role !== 'user') state.unread += 1;
650
+ state.atBottom = stick || msg.role === 'user';
651
+ updateTabBadge();
652
+ if (msg.role === 'assistant' && document.visibilityState === 'hidden') {
653
+ notifyIncoming();
654
+ }
655
+ renderMessages();
656
+ if (msg.image) maybeAdoptAvatar(msg.image);
657
+ refreshSuggestions();
658
+ return msg;
659
+ }
660
+
661
+ function findMessage(id) {
662
+ var i;
663
+ for (i = 0; i < state.messages.length; i += 1) {
664
+ if (state.messages[i].id === id) return state.messages[i];
665
+ }
666
+ return null;
667
+ }
668
+
669
+ function maybeAdoptAvatar(dataUrl) {
670
+ var clipped = constrainDataUrl(dataUrl, MAX_AVATAR_CHARS);
671
+ if (!clipped) return;
672
+ state.avatarUrl = clipped;
673
+ storeSet(STORAGE.avatar, clipped);
674
+ var header = el('lisa-avatar');
675
+ if (header) header.src = clipped;
676
+ document.querySelectorAll('.msg-avatar').forEach(function (img) {
677
+ img.src = clipped;
678
+ });
679
+ }
680
+
681
+ function restoreAvatar() {
682
+ var saved = storeGet(STORAGE.avatar, '');
683
+ if (typeof saved === 'string' && saved.indexOf('data:image/') === 0 && byteLen(saved) <= MAX_AVATAR_CHARS) {
684
+ state.avatarUrl = saved;
685
+ } else {
686
+ state.avatarUrl = DEFAULT_AVATAR;
687
+ }
688
+ var header = el('lisa-avatar');
689
+ if (header) header.src = state.avatarUrl;
690
+ }
691
+
692
+ function setPresence(kind) {
693
+ state.presence = kind;
694
+ var line = el('presence-line');
695
+ var typing = el('typing-indicator');
696
+ if (line) {
697
+ line.classList.remove('online', 'typing');
698
+ if (kind === 'typing') {
699
+ line.textContent = 'écrit…';
700
+ line.classList.add('typing');
701
+ } else if (kind === 'online') {
702
+ line.textContent = 'en ligne';
703
+ line.classList.add('online');
704
+ } else if (kind === 'last-seen') {
705
+ var when = state.lastSeenAt ? formatTime(state.lastSeenAt) : '';
706
+ line.textContent = when ? 'vu à ' + when : 'vu récemment';
707
+ } else if (kind === 'reconnecting') {
708
+ line.textContent = 'reconnexion…';
709
+ } else {
710
+ line.textContent = 'hors ligne';
711
+ }
712
+ }
713
+ if (typing) typing.classList.toggle('hidden', kind !== 'typing');
714
+ setDot(kind === 'typing' || state.streaming ? 'busy' : state.connected ? 'ok' : '');
715
+ }
716
+
717
+ function setDot(kind) {
718
+ var dot = el('connection-status');
719
+ if (!dot) return;
720
+ dot.classList.remove('ok', 'busy');
721
+ if (kind) dot.classList.add(kind);
722
+ }
723
+
724
+ function setStreaming(on) {
725
+ state.streaming = on;
726
+ var sendBtn = el('send-btn');
727
+ var stopBtn = el('stop-btn');
728
+ if (sendBtn) sendBtn.classList.toggle('hidden', on);
729
+ if (stopBtn) stopBtn.classList.toggle('hidden', !on);
730
+ if (!on) {
731
+ state.sawChunk = false;
732
+ state.lastSeenAt = Date.now();
733
+ setPresence(state.connected ? 'last-seen' : 'offline');
734
+ }
735
+ }
736
+
737
+ function hydrateLinkPreviews(box) {
738
+ if (!box || !state.token) return;
739
+ box.querySelectorAll('.bubble-body a[href^="http"]').forEach(function (anchor) {
740
+ if (anchor.parentNode && anchor.parentNode.querySelector('.link-preview')) return;
741
+ var href = anchor.getAttribute('href');
742
+ if (!href) return;
743
+ fetchJson(BASE + '/link-preview?url=' + encodeURIComponent(href)).then(function (data) {
744
+ if (!data || !data.title) return;
745
+ var card = document.createElement('a');
746
+ card.className = 'link-preview';
747
+ card.href = href;
748
+ card.target = '_blank';
749
+ card.rel = 'noopener';
750
+ card.innerHTML = '<strong>' + escapeHtml(data.title) + '</strong><span>' + escapeHtml(data.description || '') + '</span>';
751
+ if (anchor.parentNode) anchor.parentNode.appendChild(card);
752
+ }).catch(function () { /* ignore */ });
753
+ });
754
+ }
755
+
756
+ function isEmojiOnly(text) {
757
+ var t = String(text || '').trim();
758
+ if (!t || t.length > 32) return false;
759
+ try {
760
+ return /^[\p{Extended_Pictographic}\uFE0F\u200D\s]+$/u.test(t) && !/[A-Za-z0-9]/.test(t);
761
+ } catch (_e) {
762
+ return false;
763
+ }
764
+ }
765
+
766
+ function applyPrefs() {
767
+ var theme = state.theme || 'dark';
768
+ if (theme === 'auto') {
769
+ theme = (root.matchMedia && root.matchMedia('(prefers-color-scheme: light)').matches) ? 'light' : 'dark';
770
+ }
771
+ document.documentElement.setAttribute('data-theme', theme);
772
+ document.documentElement.setAttribute('data-font', String(state.font || '2'));
773
+ var box = el('messages');
774
+ if (box) {
775
+ box.classList.remove('wp-1', 'wp-2', 'wp-3');
776
+ if (state.wallpaper && state.wallpaper !== '0') box.classList.add('wp-' + state.wallpaper);
777
+ }
778
+ var sounds = el('sounds-toggle');
779
+ if (sounds) sounds.checked = state.sounds !== false;
780
+ }
781
+
782
+ function setTheme(theme) {
783
+ state.theme = theme;
784
+ storeSet(STORAGE.theme, theme);
785
+ applyPrefs();
786
+ }
787
+
788
+ function setFont(size) {
789
+ state.font = String(size);
790
+ storeSet(STORAGE.font, state.font);
791
+ applyPrefs();
792
+ }
793
+
794
+ function setWallpaper(id) {
795
+ state.wallpaper = String(id);
796
+ storeSet(STORAGE.wallpaper, state.wallpaper);
797
+ applyPrefs();
798
+ }
799
+
800
+ function applyStatusPayload(data) {
801
+ if (!data || typeof data !== 'object') return;
802
+ state.telegramForward = data.telegramForward === true;
803
+ state.mobilePush = data.mobilePush === true;
804
+ if (state.mobilePush) subscribePush();
805
+ var fwd = el('forward-msg-btn');
806
+ if (fwd) fwd.classList.toggle('hidden', !state.telegramForward);
807
+ var companion = data.companion;
808
+ var chip = el('mood-chip');
809
+ if (!chip) return;
810
+ if (companion && (companion.label || companion.mood != null)) {
811
+ var label = companion.label || String(companion.mood);
812
+ state.moodLabel = label;
813
+ chip.textContent = label;
814
+ chip.classList.remove('hidden');
815
+ } else {
816
+ state.moodLabel = '';
817
+ chip.textContent = '';
818
+ chip.classList.add('hidden');
819
+ }
820
+ }
821
+
822
+ function pulseSend() {
823
+ var btn = el('send-btn');
824
+ if (!btn) return;
825
+ btn.classList.remove('pulse');
826
+ void btn.offsetWidth;
827
+ btn.classList.add('pulse');
828
+ }
829
+
830
+ function autosizeComposer() {
831
+ var input = el('message-input');
832
+ if (!input) return;
833
+ input.style.height = 'auto';
834
+ var max = 132;
835
+ var min = 44;
836
+ var h = Math.min(max, Math.max(min, input.scrollHeight));
837
+ input.style.height = h + 'px';
838
+ }
839
+
840
+ function getRecentEmojis() {
841
+ var list = storeGet(STORAGE.recent, []);
842
+ if (!Array.isArray(list)) return [];
843
+ return list.filter(function (item) { return typeof item === 'string'; }).slice(0, MAX_RECENT);
844
+ }
845
+
846
+ function rememberEmoji(emoji) {
847
+ if (!emoji) return getRecentEmojis();
848
+ var list = getRecentEmojis().filter(function (item) { return item !== emoji; });
849
+ list.unshift(emoji);
850
+ list = list.slice(0, MAX_RECENT);
851
+ storeSet(STORAGE.recent, list);
852
+ return list;
853
+ }
854
+
855
+ function searchEmojis(query) {
856
+ return emojiData().searchEmojis(query);
857
+ }
858
+
859
+ function insertAtCursor(textarea, text) {
860
+ if (!textarea) return;
861
+ var start = typeof textarea.selectionStart === 'number' ? textarea.selectionStart : textarea.value.length;
862
+ var end = typeof textarea.selectionEnd === 'number' ? textarea.selectionEnd : start;
863
+ var value = textarea.value || '';
864
+ textarea.value = value.slice(0, start) + text + value.slice(end);
865
+ var pos = start + String(text).length;
866
+ try {
867
+ textarea.setSelectionRange(pos, pos);
868
+ } catch (_err) { /* ignore */ }
869
+ textarea.focus();
870
+ autosizeComposer();
871
+ }
872
+
873
+ function insertEmoji(emoji) {
874
+ var input = el('message-input');
875
+ insertAtCursor(input, emoji);
876
+ rememberEmoji(emoji);
877
+ if (state.pickerCat === 'recents') renderEmojiGrid();
878
+ }
879
+
880
+ function renderEmojiCats() {
881
+ var bar = el('emoji-cats');
882
+ var data = emojiData();
883
+ if (!bar || !data.CATEGORIES) return;
884
+ bar.innerHTML = '';
885
+ data.CATEGORIES.forEach(function (cat) {
886
+ var btn = document.createElement('button');
887
+ btn.type = 'button';
888
+ btn.className = 'emoji-cat' + (cat.id === state.pickerCat ? ' active' : '');
889
+ btn.textContent = cat.icon;
890
+ btn.setAttribute('aria-label', cat.label);
891
+ btn.setAttribute('role', 'tab');
892
+ btn.addEventListener('click', function () {
893
+ state.pickerCat = cat.id;
894
+ el('emoji-search').value = '';
895
+ renderEmojiCats();
896
+ renderEmojiGrid();
897
+ });
898
+ bar.appendChild(btn);
899
+ });
900
+ }
901
+
902
+ function renderEmojiGrid() {
903
+ var grid = el('emoji-grid');
904
+ var search = el('emoji-search');
905
+ var data = emojiData();
906
+ if (!grid) return;
907
+ var q = search ? search.value : '';
908
+ var items;
909
+ if (q && q.trim()) {
910
+ items = data.searchEmojis(q).map(function (item) { return item.e; });
911
+ } else if (state.pickerCat === 'recents') {
912
+ items = getRecentEmojis();
913
+ } else {
914
+ items = data.byCategory(state.pickerCat).map(function (item) { return item.e; });
915
+ }
916
+ grid.innerHTML = '';
917
+ items.forEach(function (emoji) {
918
+ var btn = document.createElement('button');
919
+ btn.type = 'button';
920
+ btn.className = 'emoji-cell';
921
+ btn.textContent = emoji;
922
+ btn.setAttribute('aria-label', emoji);
923
+ btn.addEventListener('click', function () {
924
+ insertEmoji(emoji);
925
+ });
926
+ grid.appendChild(btn);
927
+ });
928
+ }
929
+
930
+ function openEmojiPicker() {
931
+ var picker = el('emoji-picker');
932
+ var btn = el('emoji-btn');
933
+ if (!picker) return;
934
+ picker.classList.remove('hidden');
935
+ state.pickerOpen = true;
936
+ if (btn) btn.setAttribute('aria-expanded', 'true');
937
+ renderEmojiCats();
938
+ renderEmojiGrid();
939
+ var search = el('emoji-search');
940
+ if (search) search.focus();
941
+ }
942
+
943
+ function closeEmojiPicker() {
944
+ var picker = el('emoji-picker');
945
+ var btn = el('emoji-btn');
946
+ if (!picker) return;
947
+ picker.classList.add('hidden');
948
+ state.pickerOpen = false;
949
+ if (btn) btn.setAttribute('aria-expanded', 'false');
950
+ }
951
+
952
+ function toggleEmojiPicker() {
953
+ if (state.pickerOpen) closeEmojiPicker();
954
+ else openEmojiPicker();
955
+ }
956
+
957
+ function getSuggestions() {
958
+ if (state.suggestHidden) return [];
959
+ var last = null;
960
+ var i;
961
+ for (i = state.messages.length - 1; i >= 0; i -= 1) {
962
+ if (state.messages[i].role === 'assistant') {
963
+ last = state.messages[i];
964
+ break;
965
+ }
966
+ }
967
+ var pool = SUGGEST_START;
968
+ if (last && last.image) pool = SUGGEST_IMAGE;
969
+ else if (last && (last.text || '').length >= LONG_REPLY) pool = SUGGEST_LONG;
970
+ var out = [];
971
+ var n = pool.length;
972
+ if (!n) return out;
973
+ var start = state.suggestRotate % n;
974
+ var count = Math.min(3, n);
975
+ var k;
976
+ for (k = 0; k < count; k += 1) {
977
+ out.push(pool[(start + k) % n]);
978
+ }
979
+ return out;
980
+ }
981
+
982
+ function refreshSuggestions() {
983
+ var bar = el('suggestions');
984
+ if (!bar) return;
985
+ bar.innerHTML = '';
986
+ if (state.suggestHidden) return;
987
+ getSuggestions().forEach(function (text) {
988
+ var btn = document.createElement('button');
989
+ btn.type = 'button';
990
+ btn.className = 'suggest-chip';
991
+ btn.textContent = text;
992
+ btn.addEventListener('click', function () {
993
+ sendText(text);
994
+ });
995
+ bar.appendChild(btn);
996
+ });
997
+ var hide = document.createElement('button');
998
+ hide.type = 'button';
999
+ hide.className = 'suggest-hide';
1000
+ hide.setAttribute('aria-label', 'Masquer les suggestions');
1001
+ hide.textContent = '✕';
1002
+ hide.addEventListener('click', hideSuggestions);
1003
+ bar.appendChild(hide);
1004
+ }
1005
+
1006
+ function hideSuggestions() {
1007
+ state.suggestHidden = true;
1008
+ storeSet(STORAGE.suggestHidden, true);
1009
+ refreshSuggestions();
1010
+ }
1011
+
1012
+ // --- Photos: pick, shrink on the device, preview, send ---------------------
1013
+
1014
+ function attachmentCount() {
1015
+ return state.attachments.length;
1016
+ }
1017
+
1018
+ /**
1019
+ * Shrink a camera photo in the browser. A phone shot is 3-5 MB; the server
1020
+ * caps a message photo at 600 KB. Resizing here means the upload is small on
1021
+ * a mobile uplink AND the request is never rejected for size.
1022
+ */
1023
+ function shrinkImageFile(file) {
1024
+ return new Promise(function (resolve) {
1025
+ if (!file || !/^image\//.test(file.type || '')) {
1026
+ resolve(null);
1027
+ return;
1028
+ }
1029
+ var url = URL.createObjectURL(file);
1030
+ var img = new Image();
1031
+ img.onload = function () {
1032
+ try {
1033
+ var scale = Math.min(1, ATTACH_MAX_DIM / Math.max(img.width || 1, img.height || 1));
1034
+ var width = Math.max(1, Math.round((img.width || 1) * scale));
1035
+ var height = Math.max(1, Math.round((img.height || 1) * scale));
1036
+ var canvas = document.createElement('canvas');
1037
+ canvas.width = width;
1038
+ canvas.height = height;
1039
+ var ctx = canvas.getContext('2d');
1040
+ ctx.drawImage(img, 0, 0, width, height);
1041
+ var dataUrl = canvas.toDataURL('image/jpeg', ATTACH_QUALITY);
1042
+ URL.revokeObjectURL(url);
1043
+ if (!dataUrl || dataUrl.indexOf('data:image/') !== 0) {
1044
+ resolve(null);
1045
+ return;
1046
+ }
1047
+ resolve({ mimeType: 'image/jpeg', dataUrl: dataUrl });
1048
+ } catch (_err) {
1049
+ URL.revokeObjectURL(url);
1050
+ resolve(null);
1051
+ }
1052
+ };
1053
+ img.onerror = function () {
1054
+ URL.revokeObjectURL(url);
1055
+ resolve(null);
1056
+ };
1057
+ img.src = url;
1058
+ });
1059
+ }
1060
+
1061
+ function renderAttachPreview() {
1062
+ var box = el('attach-preview');
1063
+ if (!box) return;
1064
+ if (!state.attachments.length) {
1065
+ box.classList.add('hidden');
1066
+ box.innerHTML = '';
1067
+ return;
1068
+ }
1069
+ var html = [];
1070
+ state.attachments.forEach(function (item, index) {
1071
+ html.push(
1072
+ '<span class="attach-thumb">' +
1073
+ '<img alt="Photo à envoyer" src="' + item.dataUrl + '">' +
1074
+ '<button type="button" class="attach-remove touch" data-index="' + index + '" aria-label="Retirer la photo">✕</button>' +
1075
+ '</span>'
1076
+ );
1077
+ });
1078
+ box.innerHTML = html.join('');
1079
+ box.classList.remove('hidden');
1080
+ }
1081
+
1082
+ function addAttachments(files) {
1083
+ var list = Array.prototype.slice.call(files || []);
1084
+ if (!list.length) return Promise.resolve(state.attachments.length);
1085
+ var room = ATTACH_MAX_COUNT - state.attachments.length;
1086
+ if (room <= 0) {
1087
+ setError('4 photos au maximum par message.');
1088
+ return Promise.resolve(state.attachments.length);
1089
+ }
1090
+ return Promise.all(list.slice(0, room).map(shrinkImageFile)).then(function (results) {
1091
+ results.forEach(function (item) {
1092
+ if (!item) return;
1093
+ if (byteLen(item.dataUrl) > ATTACH_MAX_CHARS) return;
1094
+ state.attachments.push(item);
1095
+ });
1096
+ renderAttachPreview();
1097
+ return state.attachments.length;
1098
+ });
1099
+ }
1100
+
1101
+ function removeAttachment(index) {
1102
+ if (index < 0 || index >= state.attachments.length) return state.attachments.length;
1103
+ state.attachments.splice(index, 1);
1104
+ renderAttachPreview();
1105
+ return state.attachments.length;
1106
+ }
1107
+
1108
+ function clearAttachments() {
1109
+ state.attachments = [];
1110
+ renderAttachPreview();
1111
+ }
1112
+
1113
+ function attachmentPayload() {
1114
+ return state.attachments.map(function (item) {
1115
+ return { mimeType: item.mimeType, data: item.dataUrl.slice(item.dataUrl.indexOf(',') + 1) };
1116
+ });
1117
+ }
1118
+
1119
+ function openFilePicker() {
1120
+ var input = el('attach-input');
1121
+ if (input) input.click();
1122
+ }
1123
+
1124
+ function currentChatPayload(message, attachments, extras) {
1125
+ var payload = { message: message, stream: true, assistant: 'agent' };
1126
+ if (state.assistant === 'companion') {
1127
+ payload.assistant = 'companion';
1128
+ // Photos are a companion gesture: never sent to the agent or a peer.
1129
+ if (attachments && attachments.length) payload.attachments = attachments;
1130
+ } else if (state.assistant !== 'agent') {
1131
+ payload.assistant = 'peer';
1132
+ payload.peerId = state.assistant;
1133
+ }
1134
+ if (extras && extras.clientMsgId) payload.clientMsgId = extras.clientMsgId;
1135
+ if (extras && extras.replyTo) {
1136
+ payload.replyTo = {
1137
+ id: extras.replyTo.id,
1138
+ text: String(extras.replyTo.text || '').slice(0, 280),
1139
+ };
1140
+ }
1141
+ if (extras && extras.editOf) payload.editOf = extras.editOf;
1142
+ if (extras && typeof extras.durationMs === 'number') payload.durationMs = extras.durationMs;
1143
+ if (state.voiceReply) payload.voiceReply = true;
1144
+ return payload;
1145
+ }
1146
+
1147
+ function sendText(message) {
1148
+ var text = String(message || '').trim();
1149
+ var photos = state.assistant === 'companion' ? attachmentPayload() : [];
1150
+ // A photo alone IS a message — "regarde" is optional.
1151
+ if ((!text && !photos.length) || state.streaming) return false;
1152
+ state.lastUserWasVoice = false;
1153
+ var thumbs = state.attachments.map(function (item) { return item.dataUrl; });
1154
+ var outgoing = text || (photos.length > 1 ? 'Regarde ces photos.' : 'Regarde cette photo.');
1155
+ var extras = {};
1156
+ var outgoingMsg;
1157
+ if (state.editOf) {
1158
+ var existing = findMessage(state.editOf);
1159
+ if (existing && existing.role === 'user') {
1160
+ existing.text = text;
1161
+ existing.edited = true;
1162
+ existing.ts = Date.now();
1163
+ existing.ack = 'sent';
1164
+ extras.editOf = existing.id;
1165
+ extras.clientMsgId = existing.id;
1166
+ outgoingMsg = existing;
1167
+ persistHistory();
1168
+ renderMessages();
1169
+ }
1170
+ state.editOf = null;
1171
+ }
1172
+ if (!outgoingMsg) {
1173
+ outgoingMsg = addMessage({
1174
+ role: 'user',
1175
+ text: text,
1176
+ ack: 'sent',
1177
+ images: photos.length ? thumbs : [],
1178
+ replyTo: state.replyTo
1179
+ ? { id: state.replyTo.id, text: state.replyTo.text, role: state.replyTo.role }
1180
+ : null,
1181
+ });
1182
+ extras.clientMsgId = outgoingMsg.id;
1183
+ if (state.replyTo) extras.replyTo = state.replyTo;
1184
+ }
1185
+ state.pendingAckId = extras.clientMsgId || '';
1186
+ cancelReply();
1187
+ var input = el('message-input');
1188
+ if (input) {
1189
+ input.value = '';
1190
+ autosizeComposer();
1191
+ }
1192
+ pulseSend();
1193
+ haptic();
1194
+ closeEmojiPicker();
1195
+ state.suggestRotate += 1;
1196
+ send('chat', currentChatPayload(outgoing, photos, extras));
1197
+ if (photos.length) clearAttachments();
1198
+ return true;
1199
+ }
1200
+
1201
+ function sendChat(event) {
1202
+ if (event) event.preventDefault();
1203
+ var input = el('message-input');
1204
+ return sendText(input ? input.value : '');
1205
+ }
1206
+
1207
+ function handleComposerKey(event) {
1208
+ if (event.key === 'Enter' && !event.shiftKey) {
1209
+ event.preventDefault();
1210
+ sendChat();
1211
+ return true;
1212
+ }
1213
+ return false;
1214
+ }
1215
+
1216
+ function stopChat() {
1217
+ send('stop');
1218
+ }
1219
+
1220
+ function openLightbox(src) {
1221
+ var box = el('lightbox');
1222
+ var img = el('lightbox-img');
1223
+ if (!box || !img || !src) return;
1224
+ img.src = src;
1225
+ box.classList.remove('hidden');
1226
+ }
1227
+
1228
+ function closeLightbox() {
1229
+ var box = el('lightbox');
1230
+ var img = el('lightbox-img');
1231
+ if (!box) return;
1232
+ box.classList.add('hidden');
1233
+ if (img) img.removeAttribute('src');
1234
+ state.lightboxAlbumId = '';
1235
+ var actions = el('lightbox-actions');
1236
+ if (actions) actions.classList.add('hidden');
1237
+ var confirmBox = el('album-del-confirm');
1238
+ if (confirmBox) confirmBox.classList.add('hidden');
1239
+ }
1240
+
1241
+ function hideReactionBar() {
1242
+ var bar = el('reaction-bar');
1243
+ if (bar) bar.classList.add('hidden');
1244
+ state.reactionTarget = null;
1245
+ }
1246
+
1247
+ function showReactionBar(msgId, x, y) {
1248
+ var bar = el('reaction-bar');
1249
+ if (!bar) return;
1250
+ state.reactionTarget = msgId;
1251
+ bar.classList.remove('hidden');
1252
+ var left = Math.max(8, Math.min((x || 80) - 80, window.innerWidth - 280));
1253
+ var top = Math.max(8, (y || 120) - 56);
1254
+ bar.style.left = left + 'px';
1255
+ bar.style.top = top + 'px';
1256
+ }
1257
+
1258
+ function setReaction(id, emoji) {
1259
+ var msg = findMessage(id);
1260
+ if (!msg) return null;
1261
+ if (msg.reaction === emoji) msg.reaction = '';
1262
+ else msg.reaction = emoji;
1263
+ persistHistory();
1264
+ renderMessages();
1265
+ hideReactionBar();
1266
+ return msg.reaction;
1267
+ }
1268
+
1269
+ function copyMessage(id) {
1270
+ var msg = findMessage(id);
1271
+ if (!msg) return;
1272
+ var text = msg.text || '';
1273
+ if (navigator.clipboard && navigator.clipboard.writeText) {
1274
+ navigator.clipboard.writeText(text).catch(function () { /* ignore */ });
1275
+ }
1276
+ hideReactionBar();
1277
+ }
1278
+
1279
+ function mergeServerHistory(rows) {
1280
+ if (!Array.isArray(rows) || rows.length === 0) return 0;
1281
+ var known = {};
1282
+ state.messages.forEach(function (msg) { known[msg.id] = true; });
1283
+ var extra = [];
1284
+ rows.forEach(function (row) {
1285
+ if (!row || known[row.id]) return;
1286
+ extra.push({
1287
+ id: String(row.id),
1288
+ role: row.role === 'user' ? 'user' : 'assistant',
1289
+ text: String(row.text || ''),
1290
+ ts: typeof row.ts === 'number' ? row.ts : Date.now(),
1291
+ ack: '',
1292
+ reaction: '',
1293
+ edited: false,
1294
+ pinned: false,
1295
+ replyTo: null,
1296
+ image: '',
1297
+ images: [],
1298
+ });
1299
+ known[row.id] = true;
1300
+ });
1301
+ if (!extra.length) return 0;
1302
+ extra.sort(function (a, b) { return a.ts - b.ts; });
1303
+ state.messages = extra.concat(state.messages);
1304
+ renderMessages();
1305
+ return extra.length;
1306
+ }
1307
+
1308
+ function loadOlderHistory() {
1309
+ if (state.historyLoading || state.historyDone) return Promise.resolve([]);
1310
+ state.historyLoading = true;
1311
+ var first = state.messages[0];
1312
+ var q = first ? ('?before=' + encodeURIComponent(first.id) + '&limit=50') : '?limit=50';
1313
+ return fetchJson(BASE + '/history' + q).then(function (data) {
1314
+ var rows = data && Array.isArray(data.messages) ? data.messages : [];
1315
+ if (!rows.length) state.historyDone = true;
1316
+ mergeServerHistory(rows);
1317
+ state.historyLoading = false;
1318
+ return rows;
1319
+ }).catch(function () {
1320
+ state.historyLoading = false;
1321
+ return [];
1322
+ });
1323
+ }
1324
+
1325
+ function rememberLastRead() {
1326
+ var last = state.messages[state.messages.length - 1];
1327
+ if (last) storeSet(STORAGE.lastRead, last.id);
1328
+ }
1329
+
1330
+ function scrollToMessage(id) {
1331
+ var row = document.querySelector('.msg-row[data-id="' + id + '"]');
1332
+ if (!row) return false;
1333
+ if (row.scrollIntoView) row.scrollIntoView({ block: 'center' });
1334
+ row.classList.add('flash');
1335
+ setTimeout(function () { row.classList.remove('flash'); }, 800);
1336
+ return true;
1337
+ }
1338
+
1339
+ function renderReplyQuote() {
1340
+ var box = el('reply-quote');
1341
+ var text = el('reply-quote-text');
1342
+ if (!box) return;
1343
+ if (!state.replyTo) {
1344
+ box.classList.add('hidden');
1345
+ return;
1346
+ }
1347
+ box.classList.remove('hidden');
1348
+ if (text) text.textContent = String(state.replyTo.text || '').slice(0, 140);
1349
+ }
1350
+
1351
+ function startReply(id) {
1352
+ var msg = findMessage(id);
1353
+ if (!msg) return false;
1354
+ state.replyTo = { id: msg.id, text: msg.text || '', role: msg.role };
1355
+ state.editOf = null;
1356
+ renderReplyQuote();
1357
+ hideReactionBar();
1358
+ var input = el('message-input');
1359
+ if (input && input.focus) input.focus();
1360
+ return true;
1361
+ }
1362
+
1363
+ function cancelReply() {
1364
+ state.replyTo = null;
1365
+ renderReplyQuote();
1366
+ }
1367
+
1368
+ function lastUserMessage() {
1369
+ var last = null;
1370
+ state.messages.forEach(function (msg) {
1371
+ if (msg.role === 'user') last = msg;
1372
+ });
1373
+ return last;
1374
+ }
1375
+
1376
+ function beginEdit(id) {
1377
+ var msg = id ? findMessage(id) : lastUserMessage();
1378
+ if (!msg || msg.role !== 'user') return false;
1379
+ var last = lastUserMessage();
1380
+ if (!last || last.id !== msg.id) return false;
1381
+ state.editOf = msg.id;
1382
+ cancelReply();
1383
+ var input = el('message-input');
1384
+ if (input) {
1385
+ input.value = msg.text || '';
1386
+ autosizeComposer();
1387
+ if (input.focus) input.focus();
1388
+ }
1389
+ hideReactionBar();
1390
+ return true;
1391
+ }
1392
+
1393
+ function deleteForMe(id) {
1394
+ state.messages = state.messages.filter(function (msg) { return msg.id !== id; });
1395
+ state.pins = state.pins.filter(function (pin) { return pin !== id; });
1396
+ delete state.selected[id];
1397
+ storeSet(STORAGE.pins, state.pins);
1398
+ persistHistory();
1399
+ renderMessages();
1400
+ hideReactionBar();
1401
+ return true;
1402
+ }
1403
+
1404
+ function togglePin(id) {
1405
+ var msg = findMessage(id);
1406
+ if (!msg) return false;
1407
+ var idx = state.pins.indexOf(id);
1408
+ if (idx === -1) {
1409
+ state.pins.push(id);
1410
+ msg.pinned = true;
1411
+ } else {
1412
+ state.pins.splice(idx, 1);
1413
+ msg.pinned = false;
1414
+ }
1415
+ storeSet(STORAGE.pins, state.pins);
1416
+ persistHistory();
1417
+ renderMessages();
1418
+ hideReactionBar();
1419
+ return msg.pinned;
1420
+ }
1421
+
1422
+ function renderPinnedBar() {
1423
+ var bar = el('pinned-bar');
1424
+ var label = el('pinned-label');
1425
+ var list = el('pinned-list');
1426
+ if (!bar) return;
1427
+ var pinned = state.messages.filter(function (msg) { return state.pins.indexOf(msg.id) !== -1; });
1428
+ bar.classList.toggle('hidden', pinned.length === 0);
1429
+ if (label) {
1430
+ label.textContent = pinned.length === 1
1431
+ ? '1 message épinglé'
1432
+ : pinned.length + ' messages épinglés';
1433
+ }
1434
+ if (!list) return;
1435
+ list.innerHTML = '';
1436
+ pinned.forEach(function (msg) {
1437
+ var btn = document.createElement('button');
1438
+ btn.type = 'button';
1439
+ btn.className = 'pinned-item touch';
1440
+ btn.setAttribute('aria-label', 'Aller au message épinglé');
1441
+ btn.textContent = (msg.text || '').slice(0, 80) || '(photo)';
1442
+ btn.addEventListener('click', function () { scrollToMessage(msg.id); });
1443
+ list.appendChild(btn);
1444
+ });
1445
+ }
1446
+
1447
+ function setSelectMode(on) {
1448
+ state.selectMode = Boolean(on);
1449
+ if (!state.selectMode) state.selected = {};
1450
+ var bar = el('select-bar');
1451
+ if (bar) bar.classList.toggle('hidden', !state.selectMode);
1452
+ updateSelectCount();
1453
+ renderMessages();
1454
+ hideReactionBar();
1455
+ }
1456
+
1457
+ function updateSelectCount() {
1458
+ var n = Object.keys(state.selected).length;
1459
+ var count = el('select-count');
1460
+ if (count) count.textContent = String(n);
1461
+ }
1462
+
1463
+ function toggleSelected(id) {
1464
+ if (state.selected[id]) delete state.selected[id];
1465
+ else state.selected[id] = true;
1466
+ updateSelectCount();
1467
+ var row = document.querySelector('.msg-row[data-id="' + id + '"]');
1468
+ if (row) row.classList.toggle('selected', Boolean(state.selected[id]));
1469
+ }
1470
+
1471
+ function deleteSelected() {
1472
+ var ids = Object.keys(state.selected);
1473
+ ids.forEach(function (id) { deleteForMe(id); });
1474
+ setSelectMode(false);
1475
+ }
1476
+
1477
+ function applyAck(ack, clientMsgId) {
1478
+ var target = clientMsgId ? findMessage(clientMsgId) : null;
1479
+ if (!target && state.pendingAckId) target = findMessage(state.pendingAckId);
1480
+ if (!target) {
1481
+ var i;
1482
+ for (i = state.messages.length - 1; i >= 0; i -= 1) {
1483
+ if (state.messages[i].role === 'user') {
1484
+ target = state.messages[i];
1485
+ break;
1486
+ }
1487
+ }
1488
+ }
1489
+ if (!target || target.role !== 'user') return null;
1490
+ var rank = { sent: 1, received: 2, read: 3, replied: 3 };
1491
+ var next = ack === 'replied' ? 'read' : ack;
1492
+ if ((rank[next] || 0) >= (rank[target.ack] || 0)) {
1493
+ target.ack = next;
1494
+ persistHistory();
1495
+ renderMessages();
1496
+ }
1497
+ return target.ack;
1498
+ }
1499
+
1500
+ function searchConversation(query) {
1501
+ state.searchQuery = String(query || '');
1502
+ var q = state.searchQuery.trim().toLowerCase();
1503
+ state.searchHits = [];
1504
+ if (q) {
1505
+ state.messages.forEach(function (msg) {
1506
+ if ((msg.text || '').toLowerCase().indexOf(q) !== -1) state.searchHits.push(msg.id);
1507
+ });
1508
+ }
1509
+ state.searchHit = 0;
1510
+ var count = el('search-count');
1511
+ if (count) {
1512
+ count.textContent = q
1513
+ ? (state.searchHits.length ? (state.searchHit + 1) + '/' + state.searchHits.length : '0')
1514
+ : '';
1515
+ }
1516
+ renderMessages();
1517
+ if (state.searchHits.length) scrollToMessage(state.searchHits[0]);
1518
+ return state.searchHits.slice();
1519
+ }
1520
+
1521
+ function gotoSearch(dir) {
1522
+ if (!state.searchHits.length) return '';
1523
+ state.searchHit = (state.searchHit + dir + state.searchHits.length) % state.searchHits.length;
1524
+ var count = el('search-count');
1525
+ if (count) count.textContent = (state.searchHit + 1) + '/' + state.searchHits.length;
1526
+ var id = state.searchHits[state.searchHit];
1527
+ scrollToMessage(id);
1528
+ return id;
1529
+ }
1530
+
1531
+ function openSearch() {
1532
+ state.searchOpen = true;
1533
+ var bar = el('search-bar');
1534
+ if (bar) bar.classList.remove('hidden');
1535
+ var input = el('search-input');
1536
+ if (input && input.focus) input.focus();
1537
+ }
1538
+
1539
+ function closeSearch() {
1540
+ state.searchOpen = false;
1541
+ state.searchQuery = '';
1542
+ state.searchHits = [];
1543
+ var bar = el('search-bar');
1544
+ if (bar) bar.classList.add('hidden');
1545
+ var input = el('search-input');
1546
+ if (input) input.value = '';
1547
+ var count = el('search-count');
1548
+ if (count) count.textContent = '';
1549
+ renderMessages();
1550
+ }
1551
+
1552
+ function forwardMessage(id) {
1553
+ var msg = findMessage(id);
1554
+ if (!msg || !state.telegramForward) return Promise.resolve(false);
1555
+ hideReactionBar();
1556
+ return fetch(BASE + '/forward', {
1557
+ method: 'POST',
1558
+ headers: {
1559
+ Authorization: 'Bearer ' + state.token,
1560
+ 'Content-Type': 'application/json',
1561
+ },
1562
+ body: JSON.stringify({ text: msg.text || '' }),
1563
+ }).then(function (res) { return res.ok; }).catch(function () { return false; });
1564
+ }
1565
+
1566
+ function updateTabBadge() {
1567
+ var n = state.unread || 0;
1568
+ document.title = n > 0 ? '(' + n + ') Lisa' : 'Code Buddy Mobile';
1569
+ if (navigator.setAppBadge) {
1570
+ if (n > 0) navigator.setAppBadge(n).catch(function () { /* ignore */ });
1571
+ else if (navigator.clearAppBadge) navigator.clearAppBadge().catch(function () { /* ignore */ });
1572
+ }
1573
+ }
1574
+
1575
+ function notifyIncoming() {
1576
+ haptic();
1577
+ try { if (navigator.vibrate) navigator.vibrate([40, 30, 40]); } catch (_e) { /* ignore */ }
1578
+ if (state.sounds === false) return;
1579
+ try {
1580
+ var Ctx = root.AudioContext || root.webkitAudioContext;
1581
+ if (!Ctx) return;
1582
+ var ctx = new Ctx();
1583
+ var osc = ctx.createOscillator();
1584
+ var gain = ctx.createGain();
1585
+ osc.frequency.value = 880;
1586
+ gain.gain.value = 0.04;
1587
+ osc.connect(gain);
1588
+ gain.connect(ctx.destination);
1589
+ osc.start();
1590
+ osc.stop(ctx.currentTime + 0.12);
1591
+ } catch (_err) { /* ignore */ }
1592
+ }
1593
+
1594
+ function subscribePush() {
1595
+ if (!state.mobilePush || !navigator.serviceWorker || !root.PushManager) return;
1596
+ fetch(BASE + '/push/vapid', { headers: authHeaders() }).then(function (res) {
1597
+ return res.ok ? res.json() : null;
1598
+ }).then(function (data) {
1599
+ if (!data || !data.publicKey) return;
1600
+ return navigator.serviceWorker.ready.then(function (reg) {
1601
+ return reg.pushManager.subscribe({
1602
+ userVisibleOnly: true,
1603
+ applicationServerKey: data.publicKey,
1604
+ });
1605
+ });
1606
+ }).then(function (sub) {
1607
+ if (!sub) return;
1608
+ return fetch(BASE + '/push/subscribe', {
1609
+ method: 'POST',
1610
+ headers: {
1611
+ Authorization: 'Bearer ' + state.token,
1612
+ 'Content-Type': 'application/json',
1613
+ },
1614
+ body: JSON.stringify(sub.toJSON ? sub.toJSON() : sub),
1615
+ });
1616
+ }).catch(function () { /* ignore */ });
1617
+ }
1618
+
1619
+ function syncKeyboardInset() {
1620
+ var vv = root.visualViewport;
1621
+ if (!vv) return;
1622
+ var inset = Math.max(0, root.innerHeight - vv.height - vv.offsetTop);
1623
+ document.documentElement.style.setProperty('--kb', inset + 'px');
1624
+ }
1625
+
1626
+ var VOICE_MAX_MS = 120000;
1627
+ var VOICE_MAX_BYTES = 2 * 1024 * 1024;
1628
+
1629
+ function playVoice(id, _auto) {
1630
+ var msg = findMessage(id);
1631
+ if (!msg || !msg.audioUrl) return false;
1632
+ if (state.playingAudio) {
1633
+ try { state.playingAudio.pause(); } catch (_e) { /* ignore */ }
1634
+ }
1635
+ var audio = new Audio(msg.audioUrl);
1636
+ audio.playbackRate = msg.audioSpeed === 1.5 ? 1.5 : 1;
1637
+ state.playingAudio = audio;
1638
+ msg.playing = true;
1639
+ renderMessages();
1640
+ audio.addEventListener('ended', function () {
1641
+ msg.playing = false;
1642
+ renderMessages();
1643
+ });
1644
+ var play = audio.play();
1645
+ if (play && play.catch) play.catch(function () { msg.playing = false; });
1646
+ return true;
1647
+ }
1648
+
1649
+ function toggleVoiceSpeed(id) {
1650
+ var msg = findMessage(id);
1651
+ if (!msg) return 1;
1652
+ msg.audioSpeed = msg.audioSpeed === 1.5 ? 1 : 1.5;
1653
+ if (state.playingAudio) state.playingAudio.playbackRate = msg.audioSpeed;
1654
+ renderMessages();
1655
+ return msg.audioSpeed;
1656
+ }
1657
+
1658
+ function sendVoiceData(opts) {
1659
+ var mime = opts.mimeType || 'audio/webm';
1660
+ var data = opts.data || '';
1661
+ var durationMs = Math.min(VOICE_MAX_MS, Math.max(0, opts.durationMs || 0));
1662
+ if (!data) return false;
1663
+ var approxBytes = Math.floor(data.length * 0.75);
1664
+ if (approxBytes > VOICE_MAX_BYTES || durationMs > VOICE_MAX_MS) {
1665
+ addMessage({ role: 'system', text: 'Message vocal trop long (2 Mo / 120 s)' });
1666
+ return false;
1667
+ }
1668
+ var transcript = opts.transcript || '';
1669
+ var outgoing = transcript || '(message vocal)';
1670
+ var audioUrl = 'data:' + mime + ';base64,' + data;
1671
+ var msg = addMessage({
1672
+ role: 'user',
1673
+ text: outgoing,
1674
+ ack: 'sent',
1675
+ hasAudio: true,
1676
+ durationMs: durationMs,
1677
+ transcript: transcript,
1678
+ audioUrl: audioUrl,
1679
+ });
1680
+ state.lastUserWasVoice = true;
1681
+ state.pendingAckId = msg.id;
1682
+ send('chat', currentChatPayload(outgoing, [{ mimeType: mime, data: data }], { clientMsgId: msg.id, durationMs: durationMs }));
1683
+ return true;
1684
+ }
1685
+
1686
+ function showRecordOverlay(on, cancelling) {
1687
+ var box = el('record-overlay');
1688
+ if (!box) return;
1689
+ box.classList.toggle('hidden', !on);
1690
+ box.classList.toggle('cancel', Boolean(cancelling));
1691
+ }
1692
+
1693
+ function tickRecordTimer() {
1694
+ var label = el('record-timer');
1695
+ if (!label || !state.recordStartedAt) return;
1696
+ label.textContent = formatDuration(Date.now() - state.recordStartedAt);
1697
+ }
1698
+
1699
+ function drawWaveFrame() {
1700
+ var rec = state.recording;
1701
+ if (!rec || !rec.analyser) return;
1702
+ var canvas = el('record-wave');
1703
+ if (!canvas || !canvas.getContext) return;
1704
+ var ctx = canvas.getContext('2d');
1705
+ var data = new Uint8Array(rec.analyser.fftSize);
1706
+ rec.analyser.getByteTimeDomainData(data);
1707
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
1708
+ ctx.strokeStyle = '#f5a623';
1709
+ ctx.beginPath();
1710
+ var i;
1711
+ for (i = 0; i < data.length; i += 1) {
1712
+ var x = (i / data.length) * canvas.width;
1713
+ var y = (data[i] / 255) * canvas.height;
1714
+ if (i === 0) ctx.moveTo(x, y);
1715
+ else ctx.lineTo(x, y);
1716
+ }
1717
+ ctx.stroke();
1718
+ rec.waveFrame = root.requestAnimationFrame(drawWaveFrame);
1719
+ }
1720
+
1721
+ function stopTracks(stream) {
1722
+ if (!stream || !stream.getTracks) return;
1723
+ stream.getTracks().forEach(function (track) { track.stop(); });
1724
+ }
1725
+
1726
+ function cancelVoiceRecord() {
1727
+ state.recordCancelled = true;
1728
+ if (state.recordTimer) {
1729
+ clearInterval(state.recordTimer);
1730
+ state.recordTimer = 0;
1731
+ }
1732
+ var rec = state.recording;
1733
+ if (rec) {
1734
+ if (rec.waveFrame) root.cancelAnimationFrame(rec.waveFrame);
1735
+ try { if (rec.media && rec.media.state === 'recording') rec.media.stop(); } catch (_e) { /* ignore */ }
1736
+ stopTracks(rec.stream);
1737
+ }
1738
+ state.recording = null;
1739
+ showRecordOverlay(false, false);
1740
+ var mic = el('mic-btn');
1741
+ if (mic) mic.setAttribute('aria-pressed', 'false');
1742
+ }
1743
+
1744
+ function beginVoiceRecord() {
1745
+ if (state.streaming || state.recording) return false;
1746
+ var Rec = root.MediaRecorder;
1747
+ if (!Rec || !navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
1748
+ startDictation();
1749
+ return false;
1750
+ }
1751
+ state.recordCancelled = false;
1752
+ navigator.mediaDevices.getUserMedia({ audio: true }).then(function (stream) {
1753
+ if (state.recordCancelled) {
1754
+ stopTracks(stream);
1755
+ return;
1756
+ }
1757
+ var mime = Rec.isTypeSupported && Rec.isTypeSupported('audio/webm;codecs=opus')
1758
+ ? 'audio/webm;codecs=opus'
1759
+ : (Rec.isTypeSupported && Rec.isTypeSupported('audio/ogg;codecs=opus') ? 'audio/ogg;codecs=opus' : '');
1760
+ var media = mime ? new Rec(stream, { mimeType: mime }) : new Rec(stream);
1761
+ var chunks = [];
1762
+ media.addEventListener('dataavailable', function (ev) {
1763
+ if (ev.data && ev.data.size) chunks.push(ev.data);
1764
+ });
1765
+ media.addEventListener('stop', function () {
1766
+ stopTracks(stream);
1767
+ if (state.recordCancelled) return;
1768
+ var blob = new Blob(chunks, { type: media.mimeType || 'audio/webm' });
1769
+ if (blob.size > VOICE_MAX_BYTES) {
1770
+ addMessage({ role: 'system', text: 'Message vocal trop long (2 Mo / 120 s)' });
1771
+ return;
1772
+ }
1773
+ var reader = new FileReader();
1774
+ reader.onload = function () {
1775
+ var url = String(reader.result || '');
1776
+ var comma = url.indexOf(',');
1777
+ var data = comma >= 0 ? url.slice(comma + 1) : '';
1778
+ sendVoiceData({
1779
+ mimeType: blob.type || 'audio/webm',
1780
+ data: data,
1781
+ durationMs: Date.now() - state.recordStartedAt,
1782
+ });
1783
+ };
1784
+ reader.readAsDataURL(blob);
1785
+ });
1786
+ var ctx = root.AudioContext || root.webkitAudioContext;
1787
+ var analyser = null;
1788
+ if (ctx) {
1789
+ var ac = new ctx();
1790
+ var src = ac.createMediaStreamSource(stream);
1791
+ analyser = ac.createAnalyser();
1792
+ analyser.fftSize = 256;
1793
+ src.connect(analyser);
1794
+ }
1795
+ state.recording = { media: media, stream: stream, analyser: analyser, waveFrame: 0 };
1796
+ state.recordStartedAt = Date.now();
1797
+ showRecordOverlay(true, false);
1798
+ var mic = el('mic-btn');
1799
+ if (mic) mic.setAttribute('aria-pressed', 'true');
1800
+ media.start(100);
1801
+ if (analyser) drawWaveFrame();
1802
+ state.recordTimer = setInterval(function () {
1803
+ tickRecordTimer();
1804
+ if (Date.now() - state.recordStartedAt >= VOICE_MAX_MS) finishVoiceRecord();
1805
+ }, 200);
1806
+ }).catch(function () {
1807
+ startDictation();
1808
+ });
1809
+ return true;
1810
+ }
1811
+
1812
+ function finishVoiceRecord() {
1813
+ var rec = state.recording;
1814
+ if (!rec) return;
1815
+ if (state.recordTimer) {
1816
+ clearInterval(state.recordTimer);
1817
+ state.recordTimer = 0;
1818
+ }
1819
+ if (rec.waveFrame) root.cancelAnimationFrame(rec.waveFrame);
1820
+ showRecordOverlay(false, false);
1821
+ var mic = el('mic-btn');
1822
+ if (mic) mic.setAttribute('aria-pressed', 'false');
1823
+ try { if (rec.media && rec.media.state === 'recording') rec.media.stop(); } catch (_e) { /* ignore */ }
1824
+ state.recording = null;
1825
+ }
1826
+
1827
+ function handleMicPointerDown(event) {
1828
+ state.recordPointer = { x: event.clientX || 0, y: event.clientY || 0 };
1829
+ beginVoiceRecord();
1830
+ }
1831
+
1832
+ function handleMicPointerMove(event) {
1833
+ if (!state.recording) return;
1834
+ var dx = (event.clientX || 0) - (state.recordPointer && state.recordPointer.x || 0);
1835
+ var dy = (event.clientY || 0) - (state.recordPointer && state.recordPointer.y || 0);
1836
+ var cancel = dy < -56 || dx < -56;
1837
+ showRecordOverlay(true, cancel);
1838
+ state.recordWillCancel = cancel;
1839
+ }
1840
+
1841
+ function handleMicPointerUp() {
1842
+ if (state.recordWillCancel) {
1843
+ cancelVoiceRecord();
1844
+ state.recordWillCancel = false;
1845
+ return;
1846
+ }
1847
+ finishVoiceRecord();
1848
+ }
1849
+
1850
+ function rowIdFromEvent(target) {
1851
+ var node = target;
1852
+ while (node && node !== document.body) {
1853
+ if (node.getAttribute && node.getAttribute('data-id')) return node.getAttribute('data-id');
1854
+ node = node.parentNode;
1855
+ }
1856
+ return '';
1857
+ }
1858
+
1859
+ function handleBubblePointerDown(event) {
1860
+ var id = rowIdFromEvent(event.target);
1861
+ if (!id) return;
1862
+ clearTimeout(state.longPressTimer);
1863
+ state.swipe = { id: id, x: event.clientX || 0, y: event.clientY || 0, active: false };
1864
+ state.longPressTimer = setTimeout(function () {
1865
+ state.swipe = null;
1866
+ showReactionBar(id, event.clientX, event.clientY);
1867
+ var editBtn = el('edit-msg-btn');
1868
+ var last = lastUserMessage();
1869
+ if (editBtn) editBtn.classList.toggle('hidden', !(last && last.id === id));
1870
+ }, LONG_PRESS_MS);
1871
+ }
1872
+
1873
+ function handleBubblePointerMove(event) {
1874
+ if (!state.swipe) return;
1875
+ var dx = (event.clientX || 0) - state.swipe.x;
1876
+ if (Math.abs(dx) > 12) clearTimeout(state.longPressTimer);
1877
+ if (dx > 24) {
1878
+ state.swipe.active = true;
1879
+ var row = document.querySelector('.msg-row[data-id="' + state.swipe.id + '"]');
1880
+ if (row) row.style.transform = 'translateX(' + Math.min(dx, 72) + 'px)';
1881
+ }
1882
+ }
1883
+
1884
+ function handleBubblePointerUp(event) {
1885
+ clearTimeout(state.longPressTimer);
1886
+ if (state.swipe && state.swipe.active && ((event && event.clientX) || 0) - state.swipe.x > 56) {
1887
+ startReply(state.swipe.id);
1888
+ }
1889
+ if (state.swipe) {
1890
+ var row = document.querySelector('.msg-row[data-id="' + state.swipe.id + '"]');
1891
+ if (row) row.style.transform = '';
1892
+ }
1893
+ state.swipe = null;
1894
+ }
1895
+
1896
+ function handleBubbleClick(event) {
1897
+ var playBtn = event.target.closest ? event.target.closest('.voice-play') : null;
1898
+ if (playBtn) {
1899
+ event.preventDefault();
1900
+ playVoice(playBtn.getAttribute('data-voice') || '');
1901
+ return;
1902
+ }
1903
+ var speedBtn = event.target.closest ? event.target.closest('.voice-speed') : null;
1904
+ if (speedBtn) {
1905
+ event.preventDefault();
1906
+ toggleVoiceSpeed(speedBtn.getAttribute('data-voice') || '');
1907
+ return;
1908
+ }
1909
+ var quote = event.target.closest ? event.target.closest('.quote-ref') : null;
1910
+ if (quote) {
1911
+ event.preventDefault();
1912
+ scrollToMessage(quote.getAttribute('data-quote') || '');
1913
+ return;
1914
+ }
1915
+ var img = event.target.closest ? event.target.closest('img.bubble-img, img.selfie') : null;
1916
+ if (img && img.src) {
1917
+ event.preventDefault();
1918
+ openLightbox(img.src);
1919
+ return;
1920
+ }
1921
+ var id = rowIdFromEvent(event.target);
1922
+ if (!id) return;
1923
+ if (state.selectMode) {
1924
+ toggleSelected(id);
1925
+ return;
1926
+ }
1927
+ var now = Date.now();
1928
+ if (state.lastTap.id === id && now - state.lastTap.at < 350) {
1929
+ showReactionBar(id, event.clientX, event.clientY);
1930
+ var editBtn = el('edit-msg-btn');
1931
+ var last = lastUserMessage();
1932
+ if (editBtn) editBtn.classList.toggle('hidden', !(last && last.id === id));
1933
+ state.lastTap = { id: '', at: 0 };
1934
+ return;
1935
+ }
1936
+ state.lastTap = { id: id, at: now };
1937
+ var row = event.target.closest ? event.target.closest('.msg-row') : null;
1938
+ if (row) row.classList.toggle('meta-on');
1939
+ }
1940
+
1941
+ function handleFrame(data) {
1942
+ var type = data.type;
1943
+ if (type === 'connected') return;
1944
+ if (type === 'authenticated') {
1945
+ state.connected = true;
1946
+ state.reconnectAttempt = 0;
1947
+ if (state.reconnectTimer) {
1948
+ clearTimeout(state.reconnectTimer);
1949
+ state.reconnectTimer = 0;
1950
+ }
1951
+ setDot('ok');
1952
+ setPresence('online');
1953
+ flushOutbox();
1954
+ show('login-screen', false);
1955
+ show('main-screen', true);
1956
+ el('login-screen').classList.remove('active');
1957
+ el('main-screen').classList.add('active');
1958
+ loadAssistants();
1959
+ loadStatus();
1960
+ refreshSuggestions();
1961
+ return;
1962
+ }
1963
+ if (type === 'error') {
1964
+ var code = data.error && data.error.code;
1965
+ var msg = (data.error && data.error.message) || 'Erreur';
1966
+ if (code === 'AUTH_FAILED' || code === 'UNAUTHORIZED') {
1967
+ setError(msg);
1968
+ return;
1969
+ }
1970
+ addMessage({ role: 'system', text: msg });
1971
+ return;
1972
+ }
1973
+ if (type === 'audio') {
1974
+ var audioPayload = data.payload || {};
1975
+ var mime = typeof audioPayload.mimeType === 'string' ? audioPayload.mimeType : 'audio/ogg';
1976
+ var b64 = typeof audioPayload.data === 'string' ? audioPayload.data : '';
1977
+ var lastAsst = null;
1978
+ var ai;
1979
+ for (ai = state.messages.length - 1; ai >= 0; ai -= 1) {
1980
+ if (state.messages[ai].role === 'assistant') { lastAsst = state.messages[ai]; break; }
1981
+ }
1982
+ if (lastAsst && b64) {
1983
+ lastAsst.hasAudio = true;
1984
+ lastAsst.durationMs = typeof audioPayload.durationMs === 'number' ? audioPayload.durationMs : 0;
1985
+ lastAsst.audioUrl = 'data:' + mime + ';base64,' + b64;
1986
+ persistHistory();
1987
+ renderMessages();
1988
+ if (state.lastUserWasVoice) playVoice(lastAsst.id, true);
1989
+ }
1990
+ return;
1991
+ }
1992
+ if (type === 'ack') {
1993
+ var ackKind = data.payload && data.payload.ack;
1994
+ var ackId = data.payload && data.payload.clientMsgId;
1995
+ if (typeof ackKind === 'string') applyAck(ackKind, typeof ackId === 'string' ? ackId : '');
1996
+ return;
1997
+ }
1998
+ if (type === 'stream_start') {
1999
+ setStreaming(true);
2000
+ applyAck('read', state.pendingAckId);
2001
+ var started = addMessage({ role: 'assistant', text: '' });
2002
+ state.streamId = started.id;
2003
+ state.sawChunk = false;
2004
+ return;
2005
+ }
2006
+ if (type === 'stream_chunk') {
2007
+ var delta = data.payload && data.payload.delta;
2008
+ var image = data.payload && data.payload.image;
2009
+ if (!state.sawChunk) {
2010
+ state.sawChunk = true;
2011
+ setPresence('typing');
2012
+ }
2013
+ var current = state.streamId ? findMessage(state.streamId) : null;
2014
+ if (current) {
2015
+ if (typeof delta === 'string') current.text += delta;
2016
+ var fromFrame = dataUrlFromFrame(image);
2017
+ if (fromFrame) {
2018
+ current.image = fromFrame;
2019
+ maybeAdoptAvatar(fromFrame);
2020
+ }
2021
+ persistHistory();
2022
+ renderMessages();
2023
+ }
2024
+ return;
2025
+ }
2026
+ if (type === 'stream_end' || type === 'stream_stopped') {
2027
+ setStreaming(false);
2028
+ state.streamId = null;
2029
+ persistHistory();
2030
+ refreshSuggestions();
2031
+ return;
2032
+ }
2033
+ if (type === 'chat_response') {
2034
+ if (state.streamId || state.streaming) {
2035
+ setStreaming(false);
2036
+ state.streamId = null;
2037
+ return;
2038
+ }
2039
+ var content = data.payload && data.payload.content;
2040
+ var respImage = dataUrlFromFrame(data.payload && data.payload.image);
2041
+ if (typeof content === 'string' || respImage) {
2042
+ addMessage({
2043
+ role: 'assistant',
2044
+ text: typeof content === 'string' ? content : '',
2045
+ image: respImage,
2046
+ });
2047
+ }
2048
+ setStreaming(false);
2049
+ return;
2050
+ }
2051
+ if (type === 'pong') return;
2052
+ if (type === 'confirmation_required') {
2053
+ queueConfirmation(data.payload || {});
2054
+ }
2055
+ }
2056
+
2057
+ function connectWs() {
2058
+ state.manualClose = false;
2059
+ if (state.ws && state.ws.close) {
2060
+ state.ws.onclose = null;
2061
+ try { state.ws.close(); } catch (_e) { /* ignore */ }
2062
+ }
2063
+ var ws = new WebSocket(wsUrl());
2064
+ state.ws = ws;
2065
+ ws.addEventListener('open', function () {
2066
+ send('authenticate', { token: state.token, approvalCapable: true });
2067
+ });
2068
+ ws.addEventListener('message', function (ev) {
2069
+ try {
2070
+ handleFrame(JSON.parse(ev.data));
2071
+ } catch (_err) {
2072
+ addMessage({ role: 'system', text: 'Trame WS illisible' });
2073
+ }
2074
+ });
2075
+ ws.addEventListener('close', function () {
2076
+ if (state.ws !== ws) return; // socket remplacé, on l'ignore
2077
+ state.connected = false;
2078
+ setStreaming(false);
2079
+ setPresence('offline');
2080
+ setDot('');
2081
+ scheduleReconnect();
2082
+ });
2083
+ clearInterval(state.pingTimer);
2084
+ state.pingTimer = setInterval(function () {
2085
+ if (state.connected) send('ping');
2086
+ }, 25000);
2087
+ }
2088
+
2089
+ function persistToken(token) {
2090
+ state.token = token;
2091
+ try { sessionStorage.setItem(TOKEN_KEY, token); } catch (_err) { /* ignore */ }
2092
+ var input = el('token-input');
2093
+ if (input) input.value = token;
2094
+ }
2095
+
2096
+ function login(event) {
2097
+ if (event) event.preventDefault();
2098
+ var token = (el('token-input').value || '').trim();
2099
+ if (!token) {
2100
+ setError('Jeton requis');
2101
+ return;
2102
+ }
2103
+ persistToken(token);
2104
+ setError('');
2105
+ connectWs();
2106
+ }
2107
+
2108
+ function consumeHashToken() {
2109
+ var raw = '';
2110
+ try { raw = String(location.hash || ''); } catch (_err) { return false; }
2111
+ if (raw.charAt(0) === '#') raw = raw.slice(1);
2112
+ if (!raw) return false;
2113
+ var token = '';
2114
+ try {
2115
+ token = String(new URLSearchParams(raw).get('token') || '').trim();
2116
+ } catch (_err) {
2117
+ return false;
2118
+ }
2119
+ if (!token) return false;
2120
+ persistToken(token);
2121
+ try {
2122
+ history.replaceState(null, '', location.pathname + location.search);
2123
+ } catch (_err) { /* ignore */ }
2124
+ return true;
2125
+ }
2126
+
2127
+ function logout() {
2128
+ try { sessionStorage.removeItem(TOKEN_KEY); } catch (_err) { /* ignore */ }
2129
+ state.token = '';
2130
+ state.manualClose = true;
2131
+ state.outbox = [];
2132
+ if (state.reconnectTimer) {
2133
+ clearTimeout(state.reconnectTimer);
2134
+ state.reconnectTimer = 0;
2135
+ }
2136
+ if (state.ws) state.ws.close();
2137
+ show('main-screen', false);
2138
+ show('login-screen', true);
2139
+ el('main-screen').classList.remove('active');
2140
+ el('login-screen').classList.add('active');
2141
+ setPresence('offline');
2142
+ }
2143
+
2144
+ function showMain() {
2145
+ show('login-screen', false);
2146
+ show('main-screen', true);
2147
+ el('login-screen').classList.remove('active');
2148
+ el('main-screen').classList.add('active');
2149
+ }
2150
+
2151
+ function switchSection(id) {
2152
+ document.querySelectorAll('.panel').forEach(function (panel) {
2153
+ panel.classList.toggle('active', panel.id === id);
2154
+ panel.classList.toggle('hidden', panel.id !== id);
2155
+ });
2156
+ document.querySelectorAll('.nav-item').forEach(function (btn) {
2157
+ btn.classList.toggle('active', btn.getAttribute('data-section') === id);
2158
+ });
2159
+ if (id === 'runs-section') loadRuns();
2160
+ if (id === 'status-section') loadStatus();
2161
+ if (id === 'album-section') loadAlbum();
2162
+ }
2163
+
2164
+ // --- Album: the photos of the two of them, in one grid ---------------------
2165
+
2166
+ function albumUrl(id) {
2167
+ return BASE + '/album/' + encodeURIComponent(id);
2168
+ }
2169
+
2170
+ /**
2171
+ * An album image is served by an AUTHENTICATED route, so it cannot be an
2172
+ * `<img src>`: the browser would send no Authorization header. Fetch it and
2173
+ * hand the tile an object URL instead.
2174
+ */
2175
+ function loadAlbumThumb(img, id) {
2176
+ fetch(albumUrl(id), { headers: authHeaders() })
2177
+ .then(function (res) { return res.ok ? res.blob() : null; })
2178
+ .then(function (blob) {
2179
+ if (!blob) return;
2180
+ img.src = URL.createObjectURL(blob);
2181
+ })
2182
+ .catch(function () { /* a tile that fails simply stays blank */ });
2183
+ }
2184
+
2185
+ function albumDateLabel(iso) {
2186
+ var ts = Date.parse(iso);
2187
+ if (!ts) return '';
2188
+ return new Date(ts).toLocaleDateString('fr-FR', { day: '2-digit', month: 'short' });
2189
+ }
2190
+
2191
+ function renderAlbum() {
2192
+ var grid = el('album-grid');
2193
+ var empty = el('album-empty');
2194
+ if (!grid) return;
2195
+ grid.innerHTML = '';
2196
+ if (empty) empty.classList.toggle('hidden', state.album.length > 0);
2197
+ state.album.forEach(function (entry) {
2198
+ var tile = document.createElement('button');
2199
+ tile.type = 'button';
2200
+ tile.className = 'album-tile touch' + (entry.kind === 'selfie' ? ' selfie' : '');
2201
+ tile.setAttribute('data-id', entry.id);
2202
+ tile.setAttribute('data-kind', entry.kind);
2203
+ tile.setAttribute(
2204
+ 'aria-label',
2205
+ (entry.kind === 'selfie' ? 'Selfie de Lisa' : 'Photo partagée') +
2206
+ (entry.description ? ' — ' + entry.description : ''),
2207
+ );
2208
+ var img = document.createElement('img');
2209
+ img.alt = '';
2210
+ tile.appendChild(img);
2211
+ var meta = document.createElement('span');
2212
+ meta.className = 'album-meta';
2213
+ meta.textContent = (entry.favorite ? '❤️ ' : '') + albumDateLabel(entry.at);
2214
+ tile.appendChild(meta);
2215
+ grid.appendChild(tile);
2216
+ loadAlbumThumb(img, entry.id);
2217
+ });
2218
+ }
2219
+
2220
+ function loadAlbum() {
2221
+ if (state.albumLoading) return Promise.resolve(state.album);
2222
+ state.albumLoading = true;
2223
+ return fetchJson(BASE + '/album')
2224
+ .then(function (data) {
2225
+ state.album = Array.isArray(data && data.entries) ? data.entries : [];
2226
+ renderAlbum();
2227
+ return state.album;
2228
+ })
2229
+ .catch(function () {
2230
+ state.album = [];
2231
+ renderAlbum();
2232
+ return state.album;
2233
+ })
2234
+ .then(function (value) {
2235
+ state.albumLoading = false;
2236
+ return value;
2237
+ });
2238
+ }
2239
+
2240
+ function albumEntry(id) {
2241
+ var i;
2242
+ for (i = 0; i < state.album.length; i += 1) {
2243
+ if (state.album[i].id === id) return state.album[i];
2244
+ }
2245
+ return null;
2246
+ }
2247
+
2248
+ function syncAlbumActions() {
2249
+ var actions = el('lightbox-actions');
2250
+ var fav = el('album-fav-btn');
2251
+ var entry = state.lightboxAlbumId ? albumEntry(state.lightboxAlbumId) : null;
2252
+ // Only a shared photo can be favourited or deleted: a selfie belongs to
2253
+ // Lisa's rotating cache, not to the album store.
2254
+ var editable = Boolean(entry && entry.kind === 'shared');
2255
+ if (actions) actions.classList.toggle('hidden', !editable);
2256
+ if (fav) fav.textContent = entry && entry.favorite ? '❤️' : '🤍';
2257
+ var confirmBox = el('album-del-confirm');
2258
+ if (confirmBox) confirmBox.classList.add('hidden');
2259
+ }
2260
+
2261
+ function openAlbumEntry(id) {
2262
+ var entry = albumEntry(id);
2263
+ if (!entry) return;
2264
+ state.lightboxAlbumId = id;
2265
+ fetch(albumUrl(id), { headers: authHeaders() })
2266
+ .then(function (res) { return res.ok ? res.blob() : null; })
2267
+ .then(function (blob) {
2268
+ if (!blob) return;
2269
+ openLightbox(URL.createObjectURL(blob));
2270
+ syncAlbumActions();
2271
+ })
2272
+ .catch(function () { /* ignore */ });
2273
+ }
2274
+
2275
+ function toggleAlbumFavorite() {
2276
+ var entry = state.lightboxAlbumId ? albumEntry(state.lightboxAlbumId) : null;
2277
+ if (!entry || entry.kind !== 'shared') return Promise.resolve(false);
2278
+ var next = !entry.favorite;
2279
+ return fetch(albumUrl(entry.id) + '/favorite', {
2280
+ method: 'POST',
2281
+ headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()),
2282
+ body: JSON.stringify({ favorite: next }),
2283
+ })
2284
+ .then(function (res) { return res.ok; })
2285
+ .then(function (ok) {
2286
+ if (ok) {
2287
+ entry.favorite = next;
2288
+ syncAlbumActions();
2289
+ renderAlbum();
2290
+ }
2291
+ return ok;
2292
+ })
2293
+ .catch(function () { return false; });
2294
+ }
2295
+
2296
+ function deleteAlbumEntry() {
2297
+ var id = state.lightboxAlbumId;
2298
+ var entry = id ? albumEntry(id) : null;
2299
+ if (!entry || entry.kind !== 'shared') return Promise.resolve(false);
2300
+ return fetch(albumUrl(id), { method: 'DELETE', headers: authHeaders() })
2301
+ .then(function (res) { return res.ok; })
2302
+ .then(function (ok) {
2303
+ if (ok) {
2304
+ state.album = state.album.filter(function (item) { return item.id !== id; });
2305
+ state.lightboxAlbumId = '';
2306
+ closeLightbox();
2307
+ renderAlbum();
2308
+ }
2309
+ return ok;
2310
+ })
2311
+ .catch(function () { return false; });
2312
+ }
2313
+
2314
+ function renderAssistants() {
2315
+ var list = el('assistants-list');
2316
+ if (!list) return;
2317
+ var items = [
2318
+ { id: 'companion', name: 'Lisa', hint: 'Réponse compagnon' },
2319
+ { id: 'agent', name: 'Agent', hint: 'Chat outil Code Buddy' },
2320
+ ];
2321
+ state.peers.forEach(function (peer) {
2322
+ items.push({
2323
+ id: peer.id,
2324
+ name: peer.id,
2325
+ hint: peer.describe && peer.describe.hostname
2326
+ ? String(peer.describe.hostname)
2327
+ : peer.url,
2328
+ });
2329
+ });
2330
+ list.innerHTML = '';
2331
+ items.forEach(function (item) {
2332
+ var btn = document.createElement('button');
2333
+ btn.type = 'button';
2334
+ btn.className = 'list-item';
2335
+ btn.innerHTML = '<strong>' + escapeHtml(item.name) + '</strong><small>' + escapeHtml(item.hint) + '</small>';
2336
+ btn.addEventListener('click', function () {
2337
+ state.assistant = item.id;
2338
+ state.assistantLabel = item.name;
2339
+ el('current-assistant').textContent = item.name;
2340
+ el('assistant-modal').close();
2341
+ });
2342
+ list.appendChild(btn);
2343
+ });
2344
+ }
2345
+
2346
+ async function loadAssistants() {
2347
+ try {
2348
+ var data = await fetchJson('/api/fleet/peers');
2349
+ state.peers = Array.isArray(data.peers) ? data.peers : [];
2350
+ } catch (_err) {
2351
+ state.peers = [];
2352
+ }
2353
+ renderAssistants();
2354
+ }
2355
+
2356
+ async function loadRuns() {
2357
+ var list = el('runs-list');
2358
+ var traj = el('trajectory-view');
2359
+ if (!list || !traj) return;
2360
+ traj.classList.add('hidden');
2361
+ try {
2362
+ var data = await fetchJson('/api/runs');
2363
+ var runs = Array.isArray(data.runs) ? data.runs : [];
2364
+ if (runs.length === 0) {
2365
+ list.innerHTML = '<p class="empty">Aucun run</p>';
2366
+ return;
2367
+ }
2368
+ list.innerHTML = '';
2369
+ runs.forEach(function (run) {
2370
+ var btn = document.createElement('button');
2371
+ btn.type = 'button';
2372
+ btn.className = 'list-item';
2373
+ btn.innerHTML = '<strong>' + escapeHtml(run.objective || run.runId) + '</strong><small>'
2374
+ + escapeHtml((run.status || '') + ' · ' + (run.runId || '')) + '</small>';
2375
+ btn.addEventListener('click', function () { viewTrajectory(run.runId); });
2376
+ list.appendChild(btn);
2377
+ });
2378
+ } catch (_err) {
2379
+ list.innerHTML = '<p class="empty">Runs indisponibles</p>';
2380
+ }
2381
+ }
2382
+
2383
+ async function viewTrajectory(runId) {
2384
+ var traj = el('trajectory-view');
2385
+ if (!traj) return;
2386
+ try {
2387
+ var data = await fetchJson('/api/runs/' + encodeURIComponent(runId) + '/trajectory');
2388
+ traj.textContent = JSON.stringify(data, null, 2);
2389
+ traj.classList.remove('hidden');
2390
+ } catch (_err) {
2391
+ traj.textContent = 'Trajectoire indisponible';
2392
+ traj.classList.remove('hidden');
2393
+ }
2394
+ }
2395
+
2396
+ async function loadStatus() {
2397
+ var box = el('status-info');
2398
+ try {
2399
+ var data = await fetchJson('/api/status');
2400
+ applyStatusPayload(data);
2401
+ if (!box) return;
2402
+ var provider = data.provider
2403
+ ? (data.provider.id + ' · ' + (data.provider.model || ''))
2404
+ : 'aucun';
2405
+ var file = data.providerHealthFile
2406
+ ? JSON.stringify(data.providerHealthFile)
2407
+ : 'absent';
2408
+ var fallback = Array.isArray(data.fallback)
2409
+ ? data.fallback.map(function (item) {
2410
+ return (item.provider || '?') + (item.healthy === false ? ' (hs)' : '');
2411
+ }).join(', ') || '—'
2412
+ : '—';
2413
+ var peers = data.fleet && Array.isArray(data.fleet.peers) ? data.fleet.peers.length : 0;
2414
+ var conn = data.fleet && data.fleet.connections ? data.fleet.connections.total : 0;
2415
+ var mood = data.companion && data.companion.label ? data.companion.label : '—';
2416
+ var failoverLine = typeof data.failoverNotice === 'string' && data.failoverNotice
2417
+ ? '<article class="status-card"><h3>Repli</h3><div>' + escapeHtml(data.failoverNotice) + '</div></article>'
2418
+ : '';
2419
+ box.innerHTML =
2420
+ '<article class="status-card"><h3>Fournisseur</h3><div>' + escapeHtml(provider) + '</div></article>' +
2421
+ '<article class="status-card"><h3>Repli (fichier)</h3><div>' + escapeHtml(file) + '</div></article>' +
2422
+ '<article class="status-card"><h3>Repli (chaîne)</h3><div>' + escapeHtml(fallback) + '</div></article>' +
2423
+ failoverLine +
2424
+ '<article class="status-card"><h3>Flotte</h3><div>' + peers + ' pair(s), ' + conn + ' WS</div></article>' +
2425
+ '<article class="status-card"><h3>Humeur</h3><div>' + escapeHtml(String(mood)) + '</div></article>';
2426
+ } catch (_err) {
2427
+ if (box) box.innerHTML = '<p class="empty">Statut indisponible</p>';
2428
+ }
2429
+ try {
2430
+ var mobileStatus = await fetch(BASE + '/status');
2431
+ if (mobileStatus.ok) applyStatusPayload(await mobileStatus.json());
2432
+ } catch (_mobileErr) { /* optional public status */ }
2433
+ }
2434
+
2435
+ function refreshConfirmationBadge() {
2436
+ var badge = el('confirmation-badge');
2437
+ var n = state.confirmations.length;
2438
+ if (badge) {
2439
+ badge.textContent = String(n);
2440
+ badge.classList.toggle('hidden', n === 0);
2441
+ }
2442
+ var list = el('confirmations-list');
2443
+ if (!list) return;
2444
+ if (n === 0) {
2445
+ list.innerHTML = '<p class="empty">Aucune confirmation</p>';
2446
+ return;
2447
+ }
2448
+ list.innerHTML = '';
2449
+ state.confirmations.forEach(function (item) {
2450
+ var btn = document.createElement('button');
2451
+ btn.type = 'button';
2452
+ btn.className = 'list-item';
2453
+ btn.innerHTML = '<strong>' + escapeHtml(item.tool || 'outil') + '</strong><small>'
2454
+ + escapeHtml(item.summary || item.id) + '</small>';
2455
+ btn.addEventListener('click', function () { openConfirmation(item); });
2456
+ list.appendChild(btn);
2457
+ });
2458
+ }
2459
+
2460
+ function queueConfirmation(payload) {
2461
+ var item = {
2462
+ id: payload.id,
2463
+ tool: payload.tool,
2464
+ summary: payload.summary,
2465
+ risk: payload.risk || 'medium',
2466
+ };
2467
+ if (!item.id) return;
2468
+ state.confirmations.push(item);
2469
+ refreshConfirmationBadge();
2470
+ openConfirmation(item);
2471
+ }
2472
+
2473
+ function openConfirmation(item) {
2474
+ state.activeConfirmationId = item.id;
2475
+ var body = el('confirmation-content');
2476
+ if (!body) return;
2477
+ body.innerHTML = '<p class="risk-' + escapeHtml(item.risk) + '">' + escapeHtml(item.risk) + '</p>'
2478
+ + '<p>' + escapeHtml(item.tool || '') + '</p>'
2479
+ + '<p>' + escapeHtml(item.summary || '') + '</p>';
2480
+ var dialog = el('confirmation-modal');
2481
+ if (dialog && typeof dialog.showModal === 'function') dialog.showModal();
2482
+ }
2483
+
2484
+ function answerConfirmation(approved) {
2485
+ var id = state.activeConfirmationId;
2486
+ if (!id) return;
2487
+ send('confirmation_response', { id: id, approved: approved });
2488
+ state.confirmations = state.confirmations.filter(function (item) { return item.id !== id; });
2489
+ state.activeConfirmationId = null;
2490
+ refreshConfirmationBadge();
2491
+ var dialog = el('confirmation-modal');
2492
+ if (dialog && dialog.open) dialog.close();
2493
+ }
2494
+
2495
+ function startDictation() {
2496
+ var Rec = root.SpeechRecognition || root.webkitSpeechRecognition;
2497
+ if (!Rec) {
2498
+ addMessage({ role: 'system', text: 'Dictée indisponible sur ce navigateur' });
2499
+ return;
2500
+ }
2501
+ var rec = new Rec();
2502
+ rec.lang = 'fr-FR';
2503
+ rec.interimResults = false;
2504
+ rec.onresult = function (event) {
2505
+ var text = event.results[0] && event.results[0][0] && event.results[0][0].transcript;
2506
+ if (text) {
2507
+ var input = el('message-input');
2508
+ input.value = (input.value ? input.value + ' ' : '') + text;
2509
+ autosizeComposer();
2510
+ }
2511
+ };
2512
+ rec.start();
2513
+ }
2514
+
2515
+ function onDocumentClick(event) {
2516
+ var picker = el('emoji-picker');
2517
+ var emojiBtn = el('emoji-btn');
2518
+ if (state.pickerOpen && picker && !picker.contains(event.target) && event.target !== emojiBtn) {
2519
+ closeEmojiPicker();
2520
+ }
2521
+ var bar = el('reaction-bar');
2522
+ if (bar && !bar.classList.contains('hidden') && !bar.contains(event.target)) {
2523
+ hideReactionBar();
2524
+ }
2525
+ }
2526
+
2527
+ function onDocumentKey(event) {
2528
+ if (event.key === 'Escape') {
2529
+ closeEmojiPicker();
2530
+ closeLightbox();
2531
+ hideReactionBar();
2532
+ closeSearch();
2533
+ cancelReply();
2534
+ if (state.selectMode) setSelectMode(false);
2535
+ }
2536
+ if (event.key === 'ArrowUp' && !event.shiftKey && !event.altKey && !event.metaKey) {
2537
+ var input = el('message-input');
2538
+ var onComposer = input && document.activeElement === input && !input.value;
2539
+ if (onComposer && beginEdit()) {
2540
+ event.preventDefault();
2541
+ }
2542
+ }
2543
+ }
2544
+
2545
+ function bind() {
2546
+ if (state.bound) return;
2547
+ state.bound = true;
2548
+ if (el('login-form')) el('login-form').addEventListener('submit', login);
2549
+ if (el('copy-url-btn')) {
2550
+ el('copy-url-btn').addEventListener('click', function () {
2551
+ if (navigator.clipboard && navigator.clipboard.writeText) {
2552
+ navigator.clipboard.writeText(location.origin + BASE + '/').catch(function () { /* ignore */ });
2553
+ }
2554
+ });
2555
+ }
2556
+ if (el('logout-btn')) el('logout-btn').addEventListener('click', logout);
2557
+ if (el('composer')) el('composer').addEventListener('submit', sendChat);
2558
+ if (el('stop-btn')) el('stop-btn').addEventListener('click', stopChat);
2559
+ var micBtn = el('mic-btn');
2560
+ if (micBtn) {
2561
+ var hasSpeech = Boolean(root.SpeechRecognition || root.webkitSpeechRecognition);
2562
+ var hasRec = Boolean(root.MediaRecorder && navigator.mediaDevices && navigator.mediaDevices.getUserMedia);
2563
+ if (!hasSpeech && !hasRec) {
2564
+ micBtn.classList.add('hidden');
2565
+ micBtn.hidden = true;
2566
+ } else {
2567
+ micBtn.classList.remove('hidden');
2568
+ micBtn.hidden = false;
2569
+ if (hasRec) {
2570
+ micBtn.addEventListener('pointerdown', handleMicPointerDown);
2571
+ micBtn.addEventListener('pointermove', handleMicPointerMove);
2572
+ micBtn.addEventListener('pointerup', handleMicPointerUp);
2573
+ micBtn.addEventListener('pointercancel', handleMicPointerUp);
2574
+ micBtn.addEventListener('click', function (event) { event.preventDefault(); });
2575
+ } else {
2576
+ micBtn.addEventListener('click', startDictation);
2577
+ }
2578
+ }
2579
+ }
2580
+ document.addEventListener('paste', function (event) {
2581
+ var files = event.clipboardData && event.clipboardData.files;
2582
+ if (files && files.length) {
2583
+ event.preventDefault();
2584
+ addAttachments(files);
2585
+ }
2586
+ });
2587
+ var chatSection = el('chat-section');
2588
+ if (chatSection) {
2589
+ chatSection.addEventListener('dragover', function (event) {
2590
+ event.preventDefault();
2591
+ });
2592
+ chatSection.addEventListener('drop', function (event) {
2593
+ event.preventDefault();
2594
+ var files = event.dataTransfer && event.dataTransfer.files;
2595
+ if (files && files.length) addAttachments(files);
2596
+ });
2597
+ }
2598
+ document.querySelectorAll('.font-size-btn').forEach(function (btn) {
2599
+ btn.addEventListener('click', function () { setFont(btn.getAttribute('data-font')); });
2600
+ });
2601
+ document.querySelectorAll('.theme-btn').forEach(function (btn) {
2602
+ btn.addEventListener('click', function () { setTheme(btn.getAttribute('data-theme')); });
2603
+ });
2604
+ document.querySelectorAll('.wallpaper-btn').forEach(function (btn) {
2605
+ btn.addEventListener('click', function () { setWallpaper(btn.getAttribute('data-wp')); });
2606
+ });
2607
+ document.querySelectorAll('.tone-btn').forEach(function (btn) {
2608
+ btn.addEventListener('click', function () { insertEmoji(btn.textContent || '👋'); });
2609
+ });
2610
+ if (el('sounds-toggle')) {
2611
+ el('sounds-toggle').addEventListener('change', function (event) {
2612
+ state.sounds = Boolean(event.target.checked);
2613
+ storeSet(STORAGE.sounds, state.sounds);
2614
+ });
2615
+ }
2616
+ if (el('voice-reply-toggle')) {
2617
+ el('voice-reply-toggle').addEventListener('change', function (event) {
2618
+ state.voiceReply = Boolean(event.target.checked);
2619
+ storeSet(STORAGE.voiceReply, state.voiceReply);
2620
+ });
2621
+ }
2622
+ if (el('emoji-btn')) el('emoji-btn').addEventListener('click', toggleEmojiPicker);
2623
+ if (el('emoji-search')) {
2624
+ el('emoji-search').addEventListener('input', renderEmojiGrid);
2625
+ }
2626
+ if (el('assistant-btn')) {
2627
+ el('assistant-btn').addEventListener('click', function () {
2628
+ renderAssistants();
2629
+ var dialog = el('assistant-modal');
2630
+ if (dialog && typeof dialog.showModal === 'function') dialog.showModal();
2631
+ });
2632
+ }
2633
+ if (el('settings-btn')) {
2634
+ el('settings-btn').addEventListener('click', function () {
2635
+ var dialog = el('settings-modal');
2636
+ var confirm = el('clear-chat-confirm');
2637
+ if (confirm) confirm.classList.add('hidden');
2638
+ if (dialog && typeof dialog.showModal === 'function') dialog.showModal();
2639
+ });
2640
+ }
2641
+ if (el('clear-chat-btn')) {
2642
+ el('clear-chat-btn').addEventListener('click', function () {
2643
+ var confirm = el('clear-chat-confirm');
2644
+ if (confirm) confirm.classList.remove('hidden');
2645
+ });
2646
+ }
2647
+ if (el('clear-chat-yes')) {
2648
+ el('clear-chat-yes').addEventListener('click', function () {
2649
+ clearHistory();
2650
+ var confirm = el('clear-chat-confirm');
2651
+ if (confirm) confirm.classList.add('hidden');
2652
+ var dialog = el('settings-modal');
2653
+ if (dialog && dialog.open) dialog.close();
2654
+ });
2655
+ }
2656
+ if (el('clear-chat-no')) {
2657
+ el('clear-chat-no').addEventListener('click', function () {
2658
+ var confirm = el('clear-chat-confirm');
2659
+ if (confirm) confirm.classList.add('hidden');
2660
+ });
2661
+ }
2662
+ if (el('refresh-runs')) el('refresh-runs').addEventListener('click', loadRuns);
2663
+ document.querySelectorAll('.nav-item').forEach(function (btn) {
2664
+ btn.addEventListener('click', function () {
2665
+ switchSection(btn.getAttribute('data-section'));
2666
+ });
2667
+ });
2668
+ if (el('confirm-approve')) {
2669
+ el('confirm-approve').addEventListener('click', function (event) {
2670
+ event.preventDefault();
2671
+ answerConfirmation(true);
2672
+ });
2673
+ }
2674
+ if (el('confirm-deny')) {
2675
+ el('confirm-deny').addEventListener('click', function (event) {
2676
+ event.preventDefault();
2677
+ answerConfirmation(false);
2678
+ });
2679
+ }
2680
+ if (el('message-input')) {
2681
+ el('message-input').addEventListener('keydown', handleComposerKey);
2682
+ el('message-input').addEventListener('input', autosizeComposer);
2683
+ }
2684
+ if (el('attach-btn')) {
2685
+ el('attach-btn').addEventListener('click', openFilePicker);
2686
+ }
2687
+ if (el('attach-input')) {
2688
+ el('attach-input').addEventListener('change', function (event) {
2689
+ var input = event.target;
2690
+ addAttachments(input.files).then(function () {
2691
+ // Reset so re-picking the same file fires `change` again.
2692
+ input.value = '';
2693
+ });
2694
+ });
2695
+ }
2696
+ if (el('attach-preview')) {
2697
+ el('attach-preview').addEventListener('click', function (event) {
2698
+ var btn = event.target.closest ? event.target.closest('.attach-remove') : null;
2699
+ if (!btn) return;
2700
+ removeAttachment(Number(btn.getAttribute('data-index')));
2701
+ });
2702
+ }
2703
+ if (el('refresh-album')) {
2704
+ el('refresh-album').addEventListener('click', function () { loadAlbum(); });
2705
+ }
2706
+ if (el('album-grid')) {
2707
+ el('album-grid').addEventListener('click', function (event) {
2708
+ var tile = event.target.closest ? event.target.closest('.album-tile') : null;
2709
+ if (!tile) return;
2710
+ openAlbumEntry(tile.getAttribute('data-id'));
2711
+ });
2712
+ }
2713
+ if (el('album-fav-btn')) {
2714
+ el('album-fav-btn').addEventListener('click', function (event) {
2715
+ event.stopPropagation();
2716
+ toggleAlbumFavorite();
2717
+ });
2718
+ }
2719
+ if (el('album-del-btn')) {
2720
+ el('album-del-btn').addEventListener('click', function (event) {
2721
+ event.stopPropagation();
2722
+ var box = el('album-del-confirm');
2723
+ if (box) box.classList.remove('hidden');
2724
+ });
2725
+ }
2726
+ if (el('album-del-yes')) {
2727
+ el('album-del-yes').addEventListener('click', function (event) {
2728
+ event.stopPropagation();
2729
+ deleteAlbumEntry();
2730
+ });
2731
+ }
2732
+ if (el('album-del-no')) {
2733
+ el('album-del-no').addEventListener('click', function (event) {
2734
+ event.stopPropagation();
2735
+ var box = el('album-del-confirm');
2736
+ if (box) box.classList.add('hidden');
2737
+ });
2738
+ }
2739
+ var messages = el('messages');
2740
+ if (messages) {
2741
+ messages.addEventListener('click', handleBubbleClick);
2742
+ messages.addEventListener('pointerdown', handleBubblePointerDown);
2743
+ messages.addEventListener('pointermove', handleBubblePointerMove);
2744
+ messages.addEventListener('pointerup', handleBubblePointerUp);
2745
+ messages.addEventListener('pointercancel', handleBubblePointerUp);
2746
+ messages.addEventListener('contextmenu', function (event) {
2747
+ var id = rowIdFromEvent(event.target);
2748
+ if (!id) return;
2749
+ event.preventDefault();
2750
+ showReactionBar(id, event.clientX, event.clientY);
2751
+ var editBtn = el('edit-msg-btn');
2752
+ var last = lastUserMessage();
2753
+ if (editBtn) editBtn.classList.toggle('hidden', !(last && last.id === id));
2754
+ });
2755
+ messages.addEventListener('scroll', function () {
2756
+ state.atBottom = isNearBottom(messages);
2757
+ if (state.atBottom) {
2758
+ state.unread = 0;
2759
+ state.unreadAnchorId = '';
2760
+ rememberLastRead();
2761
+ updateTabBadge();
2762
+ }
2763
+ if (messages.scrollTop < 48) loadOlderHistory();
2764
+ try { sessionStorage.setItem('codebuddy_mobile_scroll', String(messages.scrollTop)); } catch (_e) { /* ignore */ }
2765
+ updateJumpButton();
2766
+ });
2767
+ }
2768
+ if (el('search-btn')) el('search-btn').addEventListener('click', openSearch);
2769
+ if (el('search-close')) el('search-close').addEventListener('click', closeSearch);
2770
+ if (el('search-input')) {
2771
+ el('search-input').addEventListener('input', function (event) {
2772
+ searchConversation(event.target.value);
2773
+ });
2774
+ }
2775
+ if (el('search-prev')) el('search-prev').addEventListener('click', function () { gotoSearch(-1); });
2776
+ if (el('search-next')) el('search-next').addEventListener('click', function () { gotoSearch(1); });
2777
+ if (el('reply-quote-close')) el('reply-quote-close').addEventListener('click', cancelReply);
2778
+ if (el('reply-quote-jump')) {
2779
+ el('reply-quote-jump').addEventListener('click', function () {
2780
+ if (state.replyTo) scrollToMessage(state.replyTo.id);
2781
+ });
2782
+ }
2783
+ if (el('select-cancel')) el('select-cancel').addEventListener('click', function () { setSelectMode(false); });
2784
+ if (el('select-delete')) el('select-delete').addEventListener('click', deleteSelected);
2785
+ if (el('pinned-toggle')) {
2786
+ el('pinned-toggle').addEventListener('click', function () {
2787
+ var list = el('pinned-list');
2788
+ if (!list) return;
2789
+ var open = list.classList.toggle('hidden') === false;
2790
+ el('pinned-toggle').setAttribute('aria-expanded', open ? 'true' : 'false');
2791
+ });
2792
+ }
2793
+ if (el('jump-bottom')) {
2794
+ el('jump-bottom').addEventListener('click', function () {
2795
+ state.atBottom = true;
2796
+ state.unread = 0;
2797
+ scrollMessages(true);
2798
+ });
2799
+ }
2800
+ if (el('lightbox')) {
2801
+ el('lightbox').addEventListener('click', function (event) {
2802
+ var inActions = event.target.closest
2803
+ ? event.target.closest('.lightbox-actions, .album-del-confirm')
2804
+ : null;
2805
+ if (inActions) return;
2806
+ closeLightbox();
2807
+ });
2808
+ }
2809
+ var reactionBar = el('reaction-bar');
2810
+ if (reactionBar) {
2811
+ reactionBar.addEventListener('click', function (event) {
2812
+ var btn = event.target.closest ? event.target.closest('.react-btn') : event.target;
2813
+ if (!btn || !state.reactionTarget) return;
2814
+ if (btn.id === 'copy-msg-btn') {
2815
+ copyMessage(state.reactionTarget);
2816
+ return;
2817
+ }
2818
+ if (btn.id === 'reply-msg-btn') {
2819
+ startReply(state.reactionTarget);
2820
+ return;
2821
+ }
2822
+ if (btn.id === 'forward-msg-btn') {
2823
+ forwardMessage(state.reactionTarget);
2824
+ return;
2825
+ }
2826
+ if (btn.id === 'pin-msg-btn') {
2827
+ togglePin(state.reactionTarget);
2828
+ return;
2829
+ }
2830
+ if (btn.id === 'edit-msg-btn') {
2831
+ beginEdit(state.reactionTarget);
2832
+ return;
2833
+ }
2834
+ if (btn.id === 'delete-msg-btn') {
2835
+ deleteForMe(state.reactionTarget);
2836
+ return;
2837
+ }
2838
+ if (btn.id === 'select-msg-btn') {
2839
+ setSelectMode(true);
2840
+ toggleSelected(state.reactionTarget);
2841
+ return;
2842
+ }
2843
+ var emoji = btn.getAttribute('data-emoji');
2844
+ if (emoji) setReaction(state.reactionTarget, emoji);
2845
+ });
2846
+ }
2847
+ document.addEventListener('click', onDocumentClick);
2848
+ document.addEventListener('keydown', onDocumentKey);
2849
+ if (root.visualViewport) {
2850
+ root.visualViewport.addEventListener('resize', syncKeyboardInset);
2851
+ root.visualViewport.addEventListener('scroll', syncKeyboardInset);
2852
+ syncKeyboardInset();
2853
+ }
2854
+ }
2855
+
2856
+ function onVisibilityOrOnline() {
2857
+ if (document.visibilityState === 'hidden') {
2858
+ var last = state.messages[state.messages.length - 1];
2859
+ if (last && !state.atBottom) state.unreadAnchorId = last.id;
2860
+ else if (last) rememberLastRead();
2861
+ return;
2862
+ }
2863
+ ensureConnected();
2864
+ }
2865
+
2866
+ function destroy() {
2867
+ document.removeEventListener('click', onDocumentClick);
2868
+ document.removeEventListener('keydown', onDocumentKey);
2869
+ document.removeEventListener('visibilitychange', onVisibilityOrOnline);
2870
+ root.removeEventListener('online', onVisibilityOrOnline);
2871
+ clearTimeout(state.longPressTimer);
2872
+ clearInterval(state.pingTimer);
2873
+ clearTimeout(state.reconnectTimer);
2874
+ state.reconnectTimer = 0;
2875
+ state.bound = false;
2876
+ }
2877
+
2878
+ function registerServiceWorker() {
2879
+ if (!navigator.serviceWorker) return;
2880
+ navigator.serviceWorker.register(BASE + '/sw.js', { scope: BASE + '/' }).catch(function () { /* ignore */ });
2881
+ }
2882
+
2883
+ function init() {
2884
+ registerServiceWorker();
2885
+ bind();
2886
+ document.addEventListener('visibilitychange', onVisibilityOrOnline);
2887
+ root.addEventListener('online', onVisibilityOrOnline);
2888
+ restoreAvatar();
2889
+ state.suggestHidden = storeGet(STORAGE.suggestHidden, false) === true;
2890
+ state.voiceReply = storeGet(STORAGE.voiceReply, false) === true;
2891
+ state.theme = storeGet(STORAGE.theme, 'dark') || 'dark';
2892
+ state.font = String(storeGet(STORAGE.font, '2') || '2');
2893
+ state.wallpaper = String(storeGet(STORAGE.wallpaper, '0') || '0');
2894
+ var soundsPref = storeGet(STORAGE.sounds, true);
2895
+ state.sounds = soundsPref !== false;
2896
+ applyPrefs();
2897
+ var voiceToggle = el('voice-reply-toggle');
2898
+ if (voiceToggle) voiceToggle.checked = state.voiceReply;
2899
+ restoreHistory();
2900
+ var savedScroll = 0;
2901
+ try { savedScroll = Number(sessionStorage.getItem('codebuddy_mobile_scroll') || 0); } catch (_e) { savedScroll = 0; }
2902
+ if (savedScroll > 0) {
2903
+ var box = el('messages');
2904
+ if (box) box.scrollTop = savedScroll;
2905
+ }
2906
+ refreshConfirmationBadge();
2907
+ refreshSuggestions();
2908
+ autosizeComposer();
2909
+ setPresence(state.connected ? 'online' : 'offline');
2910
+ consumeHashToken();
2911
+ if (state.token) {
2912
+ var tokenInput = el('token-input');
2913
+ if (tokenInput) tokenInput.value = state.token;
2914
+ connectWs();
2915
+ }
2916
+ }
2917
+
2918
+ var api = {
2919
+ init: init,
2920
+ bind: bind,
2921
+ state: state,
2922
+ STORAGE: STORAGE,
2923
+ REACTIONS: REACTIONS,
2924
+ DEFAULT_AVATAR: DEFAULT_AVATAR,
2925
+ MAX_RECENT: MAX_RECENT,
2926
+ MAX_HISTORY: MAX_HISTORY,
2927
+ LONG_PRESS_MS: LONG_PRESS_MS,
2928
+ searchEmojis: searchEmojis,
2929
+ getRecentEmojis: getRecentEmojis,
2930
+ rememberEmoji: rememberEmoji,
2931
+ insertEmoji: insertEmoji,
2932
+ insertAtCursor: insertAtCursor,
2933
+ openEmojiPicker: openEmojiPicker,
2934
+ closeEmojiPicker: closeEmojiPicker,
2935
+ autosizeComposer: autosizeComposer,
2936
+ sendChat: sendChat,
2937
+ sendText: sendText,
2938
+ handleComposerKey: handleComposerKey,
2939
+ addMessage: addMessage,
2940
+ getMessages: function () { return state.messages.slice(); },
2941
+ renderMessages: renderMessages,
2942
+ setReaction: setReaction,
2943
+ copyMessage: copyMessage,
2944
+ startReply: startReply,
2945
+ cancelReply: cancelReply,
2946
+ beginEdit: beginEdit,
2947
+ deleteForMe: deleteForMe,
2948
+ togglePin: togglePin,
2949
+ searchConversation: searchConversation,
2950
+ gotoSearch: gotoSearch,
2951
+ openSearch: openSearch,
2952
+ closeSearch: closeSearch,
2953
+ setSelectMode: setSelectMode,
2954
+ toggleSelected: toggleSelected,
2955
+ deleteSelected: deleteSelected,
2956
+ applyAck: applyAck,
2957
+ forwardMessage: forwardMessage,
2958
+ scrollToMessage: scrollToMessage,
2959
+ formatTime: formatTime,
2960
+ formatFullTime: formatFullTime,
2961
+ handleBubblePointerDown: handleBubblePointerDown,
2962
+ handleBubblePointerMove: handleBubblePointerMove,
2963
+ handleBubblePointerUp: handleBubblePointerUp,
2964
+ sendVoiceData: sendVoiceData,
2965
+ beginVoiceRecord: beginVoiceRecord,
2966
+ cancelVoiceRecord: cancelVoiceRecord,
2967
+ finishVoiceRecord: finishVoiceRecord,
2968
+ playVoice: playVoice,
2969
+ toggleVoiceSpeed: toggleVoiceSpeed,
2970
+ formatDuration: formatDuration,
2971
+ openLightbox: openLightbox,
2972
+ closeLightbox: closeLightbox,
2973
+ handleFrame: handleFrame,
2974
+ setPresence: setPresence,
2975
+ applyStatusPayload: applyStatusPayload,
2976
+ getSuggestions: getSuggestions,
2977
+ refreshSuggestions: refreshSuggestions,
2978
+ hideSuggestions: hideSuggestions,
2979
+ persistHistory: persistHistory,
2980
+ restoreHistory: restoreHistory,
2981
+ clearHistory: clearHistory,
2982
+ showMain: showMain,
2983
+ daySeparatorLabel: daySeparatorLabel,
2984
+ renderMarkdown: renderMarkdown,
2985
+ haptic: haptic,
2986
+ pulseSend: pulseSend,
2987
+ showReactionBar: showReactionBar,
2988
+ ATTACH_MAX_COUNT: ATTACH_MAX_COUNT,
2989
+ ATTACH_MAX_DIM: ATTACH_MAX_DIM,
2990
+ ATTACH_MAX_CHARS: ATTACH_MAX_CHARS,
2991
+ addAttachments: addAttachments,
2992
+ removeAttachment: removeAttachment,
2993
+ clearAttachments: clearAttachments,
2994
+ attachmentCount: attachmentCount,
2995
+ attachmentPayload: attachmentPayload,
2996
+ renderAttachPreview: renderAttachPreview,
2997
+ currentChatPayload: currentChatPayload,
2998
+ loadAlbum: loadAlbum,
2999
+ renderAlbum: renderAlbum,
3000
+ openAlbumEntry: openAlbumEntry,
3001
+ toggleAlbumFavorite: toggleAlbumFavorite,
3002
+ deleteAlbumEntry: deleteAlbumEntry,
3003
+ getAlbum: function () { return state.album.slice(); },
3004
+ setAlbum: function (entries) { state.album = entries.slice(); renderAlbum(); },
3005
+ syncAlbumActions: syncAlbumActions,
3006
+ connectWs: connectWs,
3007
+ logout: logout,
3008
+ ensureConnected: ensureConnected,
3009
+ scheduleReconnect: scheduleReconnect,
3010
+ reconnectDelayMs: reconnectDelayMs,
3011
+ flushOutbox: flushOutbox,
3012
+ updateTabBadge: updateTabBadge,
3013
+ notifyIncoming: notifyIncoming,
3014
+ subscribePush: subscribePush,
3015
+ loadOlderHistory: loadOlderHistory,
3016
+ mergeServerHistory: mergeServerHistory,
3017
+ applyPrefs: applyPrefs,
3018
+ setTheme: setTheme,
3019
+ setFont: setFont,
3020
+ setWallpaper: setWallpaper,
3021
+ isEmojiOnly: isEmojiOnly,
3022
+ VIRTUAL_WINDOW: VIRTUAL_WINDOW,
3023
+ destroy: destroy,
3024
+ };
3025
+
3026
+ if (root.CodeBuddyMobile && typeof root.CodeBuddyMobile.destroy === 'function') {
3027
+ root.CodeBuddyMobile.destroy();
3028
+ }
3029
+ root.CodeBuddyMobile = api;
3030
+
3031
+ if (document.readyState === 'loading') {
3032
+ document.addEventListener('DOMContentLoaded', init);
3033
+ } else {
3034
+ init();
3035
+ }
3036
+ })(typeof window !== 'undefined' ? window : globalThis);