@bubblebrain-ai/bubble 0.0.63 → 0.0.65

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 (912) hide show
  1. package/README.md +437 -11
  2. package/dist/agent/abort-errors.d.ts +18 -0
  3. package/dist/agent/abort-errors.js +51 -0
  4. package/dist/agent/budget-ledger.d.ts +20 -0
  5. package/dist/agent/budget-ledger.js +45 -0
  6. package/dist/agent/categories.d.ts +100 -0
  7. package/dist/agent/categories.js +203 -0
  8. package/dist/agent/change-tracker.d.ts +40 -0
  9. package/dist/agent/change-tracker.js +89 -0
  10. package/dist/agent/child-runner.d.ts +64 -0
  11. package/dist/agent/child-runner.js +405 -0
  12. package/dist/agent/input-controller.d.ts +14 -0
  13. package/dist/agent/input-controller.js +43 -0
  14. package/dist/agent/internal-reminder-sanitizer.d.ts +25 -0
  15. package/dist/agent/internal-reminder-sanitizer.js +297 -0
  16. package/dist/agent/profiles.d.ts +76 -0
  17. package/dist/agent/profiles.js +526 -0
  18. package/dist/agent/provider-fingerprint.d.ts +6 -0
  19. package/dist/agent/provider-fingerprint.js +89 -0
  20. package/dist/agent/resident-history.d.ts +7 -0
  21. package/dist/agent/resident-history.js +61 -0
  22. package/dist/agent/result-integrator.d.ts +22 -0
  23. package/dist/agent/result-integrator.js +50 -0
  24. package/dist/agent/routing-catalog.d.ts +131 -0
  25. package/dist/agent/routing-catalog.js +260 -0
  26. package/dist/agent/structured-output.d.ts +37 -0
  27. package/dist/agent/structured-output.js +193 -0
  28. package/dist/agent/subagent/router.d.ts +65 -0
  29. package/dist/agent/subagent/router.js +203 -0
  30. package/dist/agent/subagent/runtime.d.ts +235 -0
  31. package/dist/agent/subagent/runtime.js +835 -0
  32. package/dist/agent/subagent-control.d.ts +100 -0
  33. package/dist/agent/subagent-control.js +70 -0
  34. package/dist/agent/subagent-lifecycle-reminder.d.ts +3 -0
  35. package/dist/agent/subagent-lifecycle-reminder.js +112 -0
  36. package/dist/agent/subagent-route-format.d.ts +8 -0
  37. package/dist/agent/subagent-route-format.js +18 -0
  38. package/dist/agent/subagent-scheduler.d.ts +105 -0
  39. package/dist/agent/subagent-scheduler.js +287 -0
  40. package/dist/agent/subagent-store.d.ts +57 -0
  41. package/dist/agent/subagent-store.js +180 -0
  42. package/dist/agent/subagent-summary.d.ts +30 -0
  43. package/dist/agent/subagent-summary.js +74 -0
  44. package/dist/agent/subagent-wait-guidance.d.ts +2 -0
  45. package/dist/agent/subagent-wait-guidance.js +8 -0
  46. package/dist/agent/subtask-policy.d.ts +13 -0
  47. package/dist/agent/subtask-policy.js +56 -0
  48. package/dist/agent/task-lifecycle-reminder.d.ts +26 -0
  49. package/dist/agent/task-lifecycle-reminder.js +59 -0
  50. package/dist/agent/tool-intent.d.ts +45 -0
  51. package/dist/agent/tool-intent.js +318 -0
  52. package/dist/agent/tool-visibility.d.ts +10 -0
  53. package/dist/agent/tool-visibility.js +6 -0
  54. package/dist/agent/transcript-helpers.d.ts +20 -0
  55. package/dist/agent/transcript-helpers.js +63 -0
  56. package/dist/agent/update-queue.d.ts +13 -0
  57. package/dist/agent/update-queue.js +69 -0
  58. package/dist/agent/workflow/control.d.ts +60 -0
  59. package/dist/agent/workflow/control.js +62 -0
  60. package/dist/agent/workflow/errors.d.ts +16 -0
  61. package/dist/agent/workflow/errors.js +24 -0
  62. package/dist/agent/workflow/runs.d.ts +73 -0
  63. package/dist/agent/workflow/runs.js +160 -0
  64. package/dist/agent/workflow/runtime.d.ts +88 -0
  65. package/dist/agent/workflow/runtime.js +319 -0
  66. package/dist/agent/worktree.d.ts +29 -0
  67. package/dist/agent/worktree.js +73 -0
  68. package/dist/agent.d.ts +460 -0
  69. package/dist/agent.js +2210 -0
  70. package/dist/anthropic-thinking.d.ts +4 -0
  71. package/dist/anthropic-thinking.js +11 -0
  72. package/dist/approval/controller.d.ts +71 -0
  73. package/dist/approval/controller.js +286 -0
  74. package/dist/approval/danger.d.ts +13 -0
  75. package/dist/approval/danger.js +55 -0
  76. package/dist/approval/diff-hunks.d.ts +12 -0
  77. package/dist/approval/diff-hunks.js +32 -0
  78. package/dist/approval/protected-paths.d.ts +1 -0
  79. package/dist/approval/protected-paths.js +35 -0
  80. package/dist/approval/session-cache.d.ts +21 -0
  81. package/dist/approval/session-cache.js +38 -0
  82. package/dist/approval/tool-helper.d.ts +14 -0
  83. package/dist/approval/tool-helper.js +47 -0
  84. package/dist/approval/types.d.ts +146 -0
  85. package/dist/approval/types.js +8 -0
  86. package/dist/bin.d.ts +2 -0
  87. package/dist/bin.js +3 -0
  88. package/dist/bubble-home.d.ts +8 -0
  89. package/dist/bubble-home.js +19 -0
  90. package/dist/checkpoints.d.ts +57 -0
  91. package/dist/checkpoints.js +0 -0
  92. package/dist/cli.d.ts +37 -0
  93. package/dist/cli.js +175 -0
  94. package/dist/clipboard.d.ts +14 -0
  95. package/dist/clipboard.js +132 -0
  96. package/dist/config.d.ts +96 -0
  97. package/dist/config.js +287 -0
  98. package/dist/context/budget.d.ts +28 -0
  99. package/dist/context/budget.js +130 -0
  100. package/dist/context/checkpoint.d.ts +18 -0
  101. package/dist/context/checkpoint.js +117 -0
  102. package/dist/context/compact-llm.d.ts +25 -0
  103. package/dist/context/compact-llm.js +175 -0
  104. package/dist/context/compact.d.ts +124 -0
  105. package/dist/context/compact.js +635 -0
  106. package/dist/context/compaction-files.d.ts +44 -0
  107. package/dist/context/compaction-files.js +148 -0
  108. package/dist/context/llm-compactor.d.ts +53 -0
  109. package/dist/context/llm-compactor.js +424 -0
  110. package/dist/context/overflow.d.ts +9 -0
  111. package/dist/context/overflow.js +50 -0
  112. package/dist/context/projector.d.ts +34 -0
  113. package/dist/context/projector.js +251 -0
  114. package/dist/context/prune.d.ts +26 -0
  115. package/dist/context/prune.js +171 -0
  116. package/dist/context/session-write-lock.d.ts +20 -0
  117. package/dist/context/session-write-lock.js +162 -0
  118. package/dist/context/token-estimator.d.ts +14 -0
  119. package/dist/context/token-estimator.js +106 -0
  120. package/dist/context/tool-images.d.ts +3 -0
  121. package/dist/context/tool-images.js +35 -0
  122. package/dist/context/tool-output-truncate.d.ts +24 -0
  123. package/dist/context/tool-output-truncate.js +181 -0
  124. package/dist/context/usage.d.ts +34 -0
  125. package/dist/context/usage.js +230 -0
  126. package/dist/debug-trace.d.ts +27 -0
  127. package/dist/debug-trace.js +401 -0
  128. package/dist/diff-stats.d.ts +5 -0
  129. package/dist/diff-stats.js +21 -0
  130. package/dist/external-runtime/grok-acp.d.ts +56 -0
  131. package/dist/external-runtime/grok-acp.js +386 -0
  132. package/dist/external-runtime/grok-binary.d.ts +25 -0
  133. package/dist/external-runtime/grok-binary.js +108 -0
  134. package/dist/external-runtime/grok-errors.d.ts +7 -0
  135. package/dist/external-runtime/grok-errors.js +15 -0
  136. package/dist/external-runtime/grok-input-policy.d.ts +58 -0
  137. package/dist/external-runtime/grok-input-policy.js +52 -0
  138. package/dist/external-runtime/grok-ndjson.d.ts +14 -0
  139. package/dist/external-runtime/grok-ndjson.js +193 -0
  140. package/dist/external-runtime/grok-network.d.ts +15 -0
  141. package/dist/external-runtime/grok-network.js +81 -0
  142. package/dist/external-runtime/grok-preflight.d.ts +28 -0
  143. package/dist/external-runtime/grok-preflight.js +194 -0
  144. package/dist/external-runtime/grok-process.d.ts +26 -0
  145. package/dist/external-runtime/grok-process.js +184 -0
  146. package/dist/external-runtime/grok-profile.d.ts +32 -0
  147. package/dist/external-runtime/grok-profile.js +419 -0
  148. package/dist/external-runtime/grok-provider.d.ts +31 -0
  149. package/dist/external-runtime/grok-provider.js +41 -0
  150. package/dist/external-runtime/grok-runtime.d.ts +91 -0
  151. package/dist/external-runtime/grok-runtime.js +882 -0
  152. package/dist/external-runtime/index.d.ts +13 -0
  153. package/dist/external-runtime/index.js +13 -0
  154. package/dist/external-runtime/session-policy.d.ts +11 -0
  155. package/dist/external-runtime/session-policy.js +30 -0
  156. package/dist/external-runtime/types.d.ts +65 -0
  157. package/dist/external-runtime/types.js +1 -0
  158. package/dist/feedback/collect.d.ts +7 -0
  159. package/dist/feedback/collect.js +119 -0
  160. package/dist/feedback/config.d.ts +14 -0
  161. package/dist/feedback/config.js +16 -0
  162. package/dist/feedback/redact.d.ts +1 -0
  163. package/dist/feedback/redact.js +25 -0
  164. package/dist/feedback/submit.d.ts +6 -0
  165. package/dist/feedback/submit.js +43 -0
  166. package/dist/feedback/types.d.ts +22 -0
  167. package/dist/feedback/types.js +1 -0
  168. package/dist/feishu/agent-host/approval-card.d.ts +11 -0
  169. package/dist/feishu/agent-host/approval-card.js +85 -0
  170. package/dist/feishu/agent-host/approval-ui.d.ts +59 -0
  171. package/dist/feishu/agent-host/approval-ui.js +214 -0
  172. package/dist/feishu/agent-host/run-driver.d.ts +51 -0
  173. package/dist/feishu/agent-host/run-driver.js +397 -0
  174. package/dist/feishu/agent-host/runtime-deps.d.ts +33 -0
  175. package/dist/feishu/agent-host/runtime-deps.js +8 -0
  176. package/dist/feishu/card/budget.d.ts +40 -0
  177. package/dist/feishu/card/budget.js +134 -0
  178. package/dist/feishu/card/renderer.d.ts +29 -0
  179. package/dist/feishu/card/renderer.js +245 -0
  180. package/dist/feishu/card/run-state-types.d.ts +49 -0
  181. package/dist/feishu/card/run-state-types.js +15 -0
  182. package/dist/feishu/card/run-state.d.ts +21 -0
  183. package/dist/feishu/card/run-state.js +223 -0
  184. package/dist/feishu/channel/channel.d.ts +52 -0
  185. package/dist/feishu/channel/channel.js +74 -0
  186. package/dist/feishu/config.d.ts +24 -0
  187. package/dist/feishu/config.js +97 -0
  188. package/dist/feishu/format.d.ts +6 -0
  189. package/dist/feishu/format.js +14 -0
  190. package/dist/feishu/index.d.ts +4 -0
  191. package/dist/feishu/index.js +4 -0
  192. package/dist/feishu/logger.d.ts +31 -0
  193. package/dist/feishu/logger.js +62 -0
  194. package/dist/feishu/paths.d.ts +12 -0
  195. package/dist/feishu/paths.js +38 -0
  196. package/dist/feishu/process-registry.d.ts +29 -0
  197. package/dist/feishu/process-registry.js +90 -0
  198. package/dist/feishu/router/commands.d.ts +38 -0
  199. package/dist/feishu/router/commands.js +286 -0
  200. package/dist/feishu/router/event-router.d.ts +40 -0
  201. package/dist/feishu/router/event-router.js +208 -0
  202. package/dist/feishu/router/whitelist.d.ts +23 -0
  203. package/dist/feishu/router/whitelist.js +20 -0
  204. package/dist/feishu/runtime/active-runs.d.ts +32 -0
  205. package/dist/feishu/runtime/active-runs.js +84 -0
  206. package/dist/feishu/runtime/pending-queue.d.ts +36 -0
  207. package/dist/feishu/runtime/pending-queue.js +98 -0
  208. package/dist/feishu/runtime/process-pool.d.ts +29 -0
  209. package/dist/feishu/runtime/process-pool.js +49 -0
  210. package/dist/feishu/schema.d.ts +17 -0
  211. package/dist/feishu/schema.js +252 -0
  212. package/dist/feishu/scope/scope-registry.d.ts +39 -0
  213. package/dist/feishu/scope/scope-registry.js +148 -0
  214. package/dist/feishu/scope/session-binder.d.ts +44 -0
  215. package/dist/feishu/scope/session-binder.js +100 -0
  216. package/dist/feishu/scope/session-store.d.ts +24 -0
  217. package/dist/feishu/scope/session-store.js +73 -0
  218. package/dist/feishu/secrets.d.ts +37 -0
  219. package/dist/feishu/secrets.js +129 -0
  220. package/dist/feishu/serve.d.ts +12 -0
  221. package/dist/feishu/serve.js +302 -0
  222. package/dist/feishu/types.d.ts +75 -0
  223. package/dist/feishu/types.js +23 -0
  224. package/dist/feishu/wizard.d.ts +24 -0
  225. package/dist/feishu/wizard.js +121 -0
  226. package/dist/goal/command.d.ts +20 -0
  227. package/dist/goal/command.js +76 -0
  228. package/dist/goal/engine.d.ts +33 -0
  229. package/dist/goal/engine.js +65 -0
  230. package/dist/goal/format.d.ts +18 -0
  231. package/dist/goal/format.js +112 -0
  232. package/dist/goal/prompts.d.ts +13 -0
  233. package/dist/goal/prompts.js +84 -0
  234. package/dist/goal/store.d.ts +64 -0
  235. package/dist/goal/store.js +174 -0
  236. package/dist/goal/tools.d.ts +13 -0
  237. package/dist/goal/tools.js +67 -0
  238. package/dist/goal/usage.d.ts +2 -0
  239. package/dist/goal/usage.js +3 -0
  240. package/dist/hooks/config.d.ts +9 -0
  241. package/dist/hooks/config.js +278 -0
  242. package/dist/hooks/controller.d.ts +24 -0
  243. package/dist/hooks/controller.js +254 -0
  244. package/dist/hooks/index.d.ts +6 -0
  245. package/dist/hooks/index.js +4 -0
  246. package/dist/hooks/log.d.ts +14 -0
  247. package/dist/hooks/log.js +54 -0
  248. package/dist/hooks/runner.d.ts +5 -0
  249. package/dist/hooks/runner.js +225 -0
  250. package/dist/hooks/trust.d.ts +37 -0
  251. package/dist/hooks/trust.js +143 -0
  252. package/dist/hooks/types.d.ts +173 -0
  253. package/dist/hooks/types.js +46 -0
  254. package/dist/loop/engine.d.ts +29 -0
  255. package/dist/loop/engine.js +63 -0
  256. package/dist/lsp/config.d.ts +18 -0
  257. package/dist/lsp/config.js +58 -0
  258. package/dist/lsp/diagnostics.d.ts +24 -0
  259. package/dist/lsp/diagnostics.js +103 -0
  260. package/dist/lsp/index.d.ts +3 -0
  261. package/dist/lsp/index.js +3 -0
  262. package/dist/lsp/service.d.ts +97 -0
  263. package/dist/lsp/service.js +815 -0
  264. package/dist/main.d.ts +5 -0
  265. package/dist/main.js +984 -0
  266. package/dist/mcp/client.d.ts +68 -0
  267. package/dist/mcp/client.js +177 -0
  268. package/dist/mcp/config.d.ts +30 -0
  269. package/dist/mcp/config.js +144 -0
  270. package/dist/mcp/manager.d.ts +67 -0
  271. package/dist/mcp/manager.js +328 -0
  272. package/dist/mcp/name.d.ts +26 -0
  273. package/dist/mcp/name.js +40 -0
  274. package/dist/mcp/transports.d.ts +54 -0
  275. package/dist/mcp/transports.js +267 -0
  276. package/dist/mcp/types.d.ts +111 -0
  277. package/dist/mcp/types.js +14 -0
  278. package/dist/memory/db.d.ts +65 -0
  279. package/dist/memory/db.js +332 -0
  280. package/dist/memory/index.d.ts +10 -0
  281. package/dist/memory/index.js +10 -0
  282. package/dist/memory/paths.d.ts +18 -0
  283. package/dist/memory/paths.js +38 -0
  284. package/dist/memory/phase1.d.ts +23 -0
  285. package/dist/memory/phase1.js +292 -0
  286. package/dist/memory/phase2.d.ts +19 -0
  287. package/dist/memory/phase2.js +119 -0
  288. package/dist/memory/prompts.d.ts +19 -0
  289. package/dist/memory/prompts.js +104 -0
  290. package/dist/memory/reset.d.ts +1 -0
  291. package/dist/memory/reset.js +13 -0
  292. package/dist/memory/session-policy.d.ts +25 -0
  293. package/dist/memory/session-policy.js +55 -0
  294. package/dist/memory/start.d.ts +24 -0
  295. package/dist/memory/start.js +50 -0
  296. package/dist/memory/storage.d.ts +11 -0
  297. package/dist/memory/storage.js +95 -0
  298. package/dist/memory/store.d.ts +43 -0
  299. package/dist/memory/store.js +193 -0
  300. package/dist/memory/usage.d.ts +1 -0
  301. package/dist/memory/usage.js +38 -0
  302. package/dist/model-catalog.d.ts +65 -0
  303. package/dist/model-catalog.js +399 -0
  304. package/dist/model-config.d.ts +40 -0
  305. package/dist/model-config.js +74 -0
  306. package/dist/model-data.generated.d.ts +16 -0
  307. package/dist/model-data.generated.js +275 -0
  308. package/dist/model-pricing.d.ts +54 -0
  309. package/dist/model-pricing.js +256 -0
  310. package/dist/model-selection.d.ts +7 -0
  311. package/dist/model-selection.js +18 -0
  312. package/dist/network/chatgpt-transport.d.ts +16 -0
  313. package/dist/network/chatgpt-transport.js +232 -0
  314. package/dist/network/errors.d.ts +47 -0
  315. package/dist/network/errors.js +48 -0
  316. package/dist/network/provider-transport-log.d.ts +12 -0
  317. package/dist/network/provider-transport-log.js +32 -0
  318. package/dist/network/provider-transport.d.ts +37 -0
  319. package/dist/network/provider-transport.js +256 -0
  320. package/dist/network/retry.d.ts +34 -0
  321. package/dist/network/retry.js +97 -0
  322. package/dist/network/system-proxy.d.ts +18 -0
  323. package/dist/network/system-proxy.js +175 -0
  324. package/dist/oauth/grok.d.ts +26 -0
  325. package/dist/oauth/grok.js +251 -0
  326. package/dist/oauth/index.d.ts +4 -0
  327. package/dist/oauth/index.js +3 -0
  328. package/dist/oauth/openai-codex.d.ts +15 -0
  329. package/dist/oauth/openai-codex.js +193 -0
  330. package/dist/oauth/refresh-control.d.ts +12 -0
  331. package/dist/oauth/refresh-control.js +42 -0
  332. package/dist/oauth/storage.d.ts +88 -0
  333. package/dist/oauth/storage.js +357 -0
  334. package/dist/oauth/types.d.ts +15 -0
  335. package/dist/oauth/types.js +1 -0
  336. package/dist/orchestrator/default-hooks.d.ts +22 -0
  337. package/dist/orchestrator/default-hooks.js +127 -0
  338. package/dist/orchestrator/hooks.d.ts +69 -0
  339. package/dist/orchestrator/hooks.js +52 -0
  340. package/dist/permission/mode.d.ts +19 -0
  341. package/dist/permission/mode.js +16 -0
  342. package/dist/permissions/rule.d.ts +42 -0
  343. package/dist/permissions/rule.js +293 -0
  344. package/dist/permissions/settings.d.ts +97 -0
  345. package/dist/permissions/settings.js +289 -0
  346. package/dist/permissions/shell-command.d.ts +36 -0
  347. package/dist/permissions/shell-command.js +226 -0
  348. package/dist/permissions/trust-prompt.d.ts +10 -0
  349. package/dist/permissions/trust-prompt.js +34 -0
  350. package/dist/permissions/trust.d.ts +26 -0
  351. package/dist/permissions/trust.js +113 -0
  352. package/dist/permissions/types.d.ts +61 -0
  353. package/dist/permissions/types.js +14 -0
  354. package/dist/print-output.d.ts +98 -0
  355. package/dist/print-output.js +117 -0
  356. package/dist/prompt/compose.d.ts +19 -0
  357. package/dist/prompt/compose.js +110 -0
  358. package/dist/prompt/delegation.d.ts +14 -0
  359. package/dist/prompt/delegation.js +100 -0
  360. package/dist/prompt/environment.d.ts +12 -0
  361. package/dist/prompt/environment.js +55 -0
  362. package/dist/prompt/provider-prompts/anthropic.d.ts +1 -0
  363. package/dist/prompt/provider-prompts/anthropic.js +5 -0
  364. package/dist/prompt/provider-prompts/codex.d.ts +1 -0
  365. package/dist/prompt/provider-prompts/codex.js +5 -0
  366. package/dist/prompt/provider-prompts/deepseek.d.ts +1 -0
  367. package/dist/prompt/provider-prompts/deepseek.js +7 -0
  368. package/dist/prompt/provider-prompts/default.d.ts +1 -0
  369. package/dist/prompt/provider-prompts/default.js +6 -0
  370. package/dist/prompt/provider-prompts/gemini.d.ts +1 -0
  371. package/dist/prompt/provider-prompts/gemini.js +5 -0
  372. package/dist/prompt/provider-prompts/glm.d.ts +1 -0
  373. package/dist/prompt/provider-prompts/glm.js +7 -0
  374. package/dist/prompt/provider-prompts/gpt.d.ts +1 -0
  375. package/dist/prompt/provider-prompts/gpt.js +5 -0
  376. package/dist/prompt/provider-prompts/kimi.d.ts +1 -0
  377. package/dist/prompt/provider-prompts/kimi.js +8 -0
  378. package/dist/prompt/reminders.d.ts +33 -0
  379. package/dist/prompt/reminders.js +135 -0
  380. package/dist/prompt/routing.d.ts +14 -0
  381. package/dist/prompt/routing.js +71 -0
  382. package/dist/prompt/runtime.d.ts +12 -0
  383. package/dist/prompt/runtime.js +40 -0
  384. package/dist/prompt/task-reminders.d.ts +12 -0
  385. package/dist/prompt/task-reminders.js +64 -0
  386. package/dist/provider-ai-sdk.d.ts +59 -0
  387. package/dist/provider-ai-sdk.js +584 -0
  388. package/dist/provider-anthropic.d.ts +126 -0
  389. package/dist/provider-anthropic.js +940 -0
  390. package/dist/provider-ark-responses.d.ts +29 -0
  391. package/dist/provider-ark-responses.js +518 -0
  392. package/dist/provider-artifacts.d.ts +7 -0
  393. package/dist/provider-artifacts.js +60 -0
  394. package/dist/provider-error-record.d.ts +43 -0
  395. package/dist/provider-error-record.js +213 -0
  396. package/dist/provider-grok.d.ts +50 -0
  397. package/dist/provider-grok.js +110 -0
  398. package/dist/provider-model-policy.d.ts +16 -0
  399. package/dist/provider-model-policy.js +33 -0
  400. package/dist/provider-openai-codex.d.ts +66 -0
  401. package/dist/provider-openai-codex.js +781 -0
  402. package/dist/provider-registry.d.ts +197 -0
  403. package/dist/provider-registry.js +1194 -0
  404. package/dist/provider-transform.d.ts +12 -0
  405. package/dist/provider-transform.js +293 -0
  406. package/dist/provider-zen-errors.d.ts +9 -0
  407. package/dist/provider-zen-errors.js +36 -0
  408. package/dist/provider.d.ts +85 -0
  409. package/dist/provider.js +925 -0
  410. package/dist/question/controller.d.ts +22 -0
  411. package/dist/question/controller.js +98 -0
  412. package/dist/question/index.d.ts +2 -0
  413. package/dist/question/index.js +2 -0
  414. package/dist/question/normalize.d.ts +6 -0
  415. package/dist/question/normalize.js +11 -0
  416. package/dist/question/types.d.ts +42 -0
  417. package/dist/question/types.js +6 -0
  418. package/dist/reasoning-debug.d.ts +7 -0
  419. package/dist/reasoning-debug.js +33 -0
  420. package/dist/rewind.d.ts +20 -0
  421. package/dist/rewind.js +29 -0
  422. package/dist/sdk/index.d.ts +319 -0
  423. package/dist/sdk/index.js +1068 -0
  424. package/dist/sdk/replay-event-log.d.ts +26 -0
  425. package/dist/sdk/replay-event-log.js +122 -0
  426. package/dist/sdk/session-turn-coordinator.d.ts +45 -0
  427. package/dist/sdk/session-turn-coordinator.js +227 -0
  428. package/dist/session-context-fence.d.ts +16 -0
  429. package/dist/session-context-fence.js +26 -0
  430. package/dist/session-log.d.ts +25 -0
  431. package/dist/session-log.js +444 -0
  432. package/dist/session-title.d.ts +16 -0
  433. package/dist/session-title.js +131 -0
  434. package/dist/session-types.d.ts +86 -0
  435. package/dist/session-types.js +1 -0
  436. package/dist/session.d.ts +135 -0
  437. package/dist/session.js +664 -0
  438. package/dist/skills/discovery.d.ts +12 -0
  439. package/dist/skills/discovery.js +166 -0
  440. package/dist/skills/format.d.ts +32 -0
  441. package/dist/skills/format.js +68 -0
  442. package/dist/skills/frontmatter.d.ts +5 -0
  443. package/dist/skills/frontmatter.js +60 -0
  444. package/dist/skills/invocation.d.ts +8 -0
  445. package/dist/skills/invocation.js +33 -0
  446. package/dist/skills/registry.d.ts +28 -0
  447. package/dist/skills/registry.js +79 -0
  448. package/dist/skills/types.d.ts +34 -0
  449. package/dist/skills/types.js +1 -0
  450. package/dist/slash-commands/commands.d.ts +10 -0
  451. package/dist/slash-commands/commands.js +1251 -0
  452. package/dist/slash-commands/feishu.d.ts +17 -0
  453. package/dist/slash-commands/feishu.js +400 -0
  454. package/dist/slash-commands/index.d.ts +4 -0
  455. package/dist/slash-commands/index.js +8 -0
  456. package/dist/slash-commands/registry.d.ts +32 -0
  457. package/dist/slash-commands/registry.js +73 -0
  458. package/dist/slash-commands/types.d.ts +109 -0
  459. package/dist/slash-commands/types.js +1 -0
  460. package/dist/slash-commands/unified.d.ts +38 -0
  461. package/dist/slash-commands/unified.js +38 -0
  462. package/dist/stats/usage.d.ts +59 -0
  463. package/dist/stats/usage.js +485 -0
  464. package/dist/stream-json.d.ts +13 -0
  465. package/dist/stream-json.js +74 -0
  466. package/dist/system-prompt.d.ts +40 -0
  467. package/dist/system-prompt.js +7 -0
  468. package/dist/tasks/manager.d.ts +145 -0
  469. package/dist/tasks/manager.js +634 -0
  470. package/dist/tasks/process-utils.d.ts +10 -0
  471. package/dist/tasks/process-utils.js +49 -0
  472. package/dist/tasks/promotion.d.ts +17 -0
  473. package/dist/tasks/promotion.js +30 -0
  474. package/dist/tasks/wake.d.ts +53 -0
  475. package/dist/tasks/wake.js +125 -0
  476. package/dist/text-display.d.ts +3 -0
  477. package/dist/text-display.js +25 -0
  478. package/dist/tools/agent-lifecycle.d.ts +30 -0
  479. package/dist/tools/agent-lifecycle.js +790 -0
  480. package/dist/tools/bash.d.ts +23 -0
  481. package/dist/tools/bash.js +443 -0
  482. package/dist/tools/child-tools.d.ts +41 -0
  483. package/dist/tools/child-tools.js +122 -0
  484. package/dist/tools/edit-apply.d.ts +25 -0
  485. package/dist/tools/edit-apply.js +274 -0
  486. package/dist/tools/edit.d.ts +18 -0
  487. package/dist/tools/edit.js +200 -0
  488. package/dist/tools/exa-mcp.d.ts +3 -0
  489. package/dist/tools/exa-mcp.js +74 -0
  490. package/dist/tools/exit-plan-mode.d.ts +22 -0
  491. package/dist/tools/exit-plan-mode.js +79 -0
  492. package/dist/tools/file-mutation-queue.d.ts +2 -0
  493. package/dist/tools/file-mutation-queue.js +43 -0
  494. package/dist/tools/file-state.d.ts +48 -0
  495. package/dist/tools/file-state.js +76 -0
  496. package/dist/tools/grep.d.ts +9 -0
  497. package/dist/tools/grep.js +387 -0
  498. package/dist/tools/index.d.ts +63 -0
  499. package/dist/tools/index.js +76 -0
  500. package/dist/tools/ls.d.ts +3 -0
  501. package/dist/tools/ls.js +85 -0
  502. package/dist/tools/lsp.d.ts +4 -0
  503. package/dist/tools/lsp.js +95 -0
  504. package/dist/tools/memory.d.ts +8 -0
  505. package/dist/tools/memory.js +77 -0
  506. package/dist/tools/path-utils.d.ts +8 -0
  507. package/dist/tools/path-utils.js +53 -0
  508. package/dist/tools/prompt-metadata.d.ts +3 -0
  509. package/dist/tools/prompt-metadata.js +17 -0
  510. package/dist/tools/question.d.ts +3 -0
  511. package/dist/tools/question.js +177 -0
  512. package/dist/tools/read.d.ts +8 -0
  513. package/dist/tools/read.js +309 -0
  514. package/dist/tools/sensitive-paths.d.ts +11 -0
  515. package/dist/tools/sensitive-paths.js +106 -0
  516. package/dist/tools/server-manager.d.ts +6 -0
  517. package/dist/tools/server-manager.js +6 -0
  518. package/dist/tools/server.d.ts +6 -0
  519. package/dist/tools/server.js +249 -0
  520. package/dist/tools/skill-search.d.ts +10 -0
  521. package/dist/tools/skill-search.js +134 -0
  522. package/dist/tools/skill.d.ts +7 -0
  523. package/dist/tools/skill.js +81 -0
  524. package/dist/tools/task-tools.d.ts +10 -0
  525. package/dist/tools/task-tools.js +133 -0
  526. package/dist/tools/tool-search.d.ts +23 -0
  527. package/dist/tools/tool-search.js +145 -0
  528. package/dist/tools/web-fetch.d.ts +6 -0
  529. package/dist/tools/web-fetch.js +76 -0
  530. package/dist/tools/web-search.d.ts +5 -0
  531. package/dist/tools/web-search.js +50 -0
  532. package/dist/tools/write.d.ts +10 -0
  533. package/dist/tools/write.js +155 -0
  534. package/dist/tui/animation-clock.d.ts +14 -0
  535. package/dist/tui/animation-clock.js +34 -0
  536. package/dist/tui/app.d.ts +176 -0
  537. package/dist/tui/app.js +1659 -0
  538. package/dist/tui/components/approval-dialog.d.ts +43 -0
  539. package/dist/tui/components/approval-dialog.js +212 -0
  540. package/dist/tui/components/bottom-sheet.d.ts +9 -0
  541. package/dist/tui/components/bottom-sheet.js +32 -0
  542. package/dist/tui/components/context-info.d.ts +54 -0
  543. package/dist/tui/components/context-info.js +388 -0
  544. package/dist/tui/components/feedback-dialog.d.ts +56 -0
  545. package/dist/tui/components/feedback-dialog.js +262 -0
  546. package/dist/tui/components/feishu-setup-dialog.d.ts +65 -0
  547. package/dist/tui/components/feishu-setup-dialog.js +332 -0
  548. package/dist/tui/components/image-preview.d.ts +32 -0
  549. package/dist/tui/components/image-preview.js +130 -0
  550. package/dist/tui/components/plan-dialog.d.ts +34 -0
  551. package/dist/tui/components/plan-dialog.js +196 -0
  552. package/dist/tui/components/provider-key-input.d.ts +18 -0
  553. package/dist/tui/components/provider-key-input.js +49 -0
  554. package/dist/tui/components/question-dialog.d.ts +25 -0
  555. package/dist/tui/components/question-dialog.js +263 -0
  556. package/dist/tui/components/responsive-transcript.d.ts +31 -0
  557. package/dist/tui/components/responsive-transcript.js +77 -0
  558. package/dist/tui/components/rewind-picker.d.ts +62 -0
  559. package/dist/tui/components/rewind-picker.js +317 -0
  560. package/dist/tui/components/session-picker.d.ts +49 -0
  561. package/dist/tui/components/session-picker.js +303 -0
  562. package/dist/tui/components/skills-panel.d.ts +63 -0
  563. package/dist/tui/components/skills-panel.js +582 -0
  564. package/dist/tui/components/stats-panel.d.ts +40 -0
  565. package/dist/tui/components/stats-panel.js +301 -0
  566. package/dist/tui/components/streaming-message.d.ts +69 -0
  567. package/dist/tui/components/streaming-message.js +398 -0
  568. package/dist/tui/components/subagent-inspector.d.ts +28 -0
  569. package/dist/tui/components/subagent-inspector.js +127 -0
  570. package/dist/tui/components/task-inspector.d.ts +26 -0
  571. package/dist/tui/components/task-inspector.js +70 -0
  572. package/dist/tui/components/tasks-pane.d.ts +126 -0
  573. package/dist/tui/components/tasks-pane.js +566 -0
  574. package/dist/tui/components/transcript.d.ts +103 -0
  575. package/dist/tui/components/transcript.js +858 -0
  576. package/dist/tui/components/welcome.d.ts +20 -0
  577. package/dist/tui/components/welcome.js +133 -0
  578. package/dist/tui/components/workflow-inspector.d.ts +30 -0
  579. package/dist/tui/components/workflow-inspector.js +136 -0
  580. package/dist/tui/composer-autocomplete.d.ts +76 -0
  581. package/dist/tui/composer-autocomplete.js +465 -0
  582. package/dist/tui/composer-style.d.ts +7 -0
  583. package/dist/tui/composer-style.js +29 -0
  584. package/dist/tui/controller/agent-event-reducer.d.ts +75 -0
  585. package/dist/tui/controller/agent-event-reducer.js +239 -0
  586. package/dist/tui/controller/composer-controller.d.ts +95 -0
  587. package/dist/tui/controller/composer-controller.js +502 -0
  588. package/dist/tui/controller/controller.d.ts +199 -0
  589. package/dist/tui/controller/controller.js +1034 -0
  590. package/dist/tui/controller/effects.d.ts +71 -0
  591. package/dist/tui/controller/effects.js +1 -0
  592. package/dist/tui/controller/goal-runtime-controller.d.ts +47 -0
  593. package/dist/tui/controller/goal-runtime-controller.js +202 -0
  594. package/dist/tui/controller/input-queue-machine.d.ts +71 -0
  595. package/dist/tui/controller/input-queue-machine.js +121 -0
  596. package/dist/tui/controller/intents.d.ts +56 -0
  597. package/dist/tui/controller/intents.js +6 -0
  598. package/dist/tui/controller/overlay-controller.d.ts +64 -0
  599. package/dist/tui/controller/overlay-controller.js +129 -0
  600. package/dist/tui/controller/ports.d.ts +57 -0
  601. package/dist/tui/controller/ports.js +9 -0
  602. package/dist/tui/controller/session-transition.d.ts +54 -0
  603. package/dist/tui/controller/session-transition.js +68 -0
  604. package/dist/tui/controller/state.d.ts +14 -0
  605. package/dist/tui/controller/state.js +36 -0
  606. package/dist/tui/controller/task-runtime-controller.d.ts +66 -0
  607. package/dist/tui/controller/task-runtime-controller.js +158 -0
  608. package/dist/tui/detect-theme.d.ts +4 -0
  609. package/dist/tui/detect-theme.js +116 -0
  610. package/dist/tui/display-history.d.ts +64 -0
  611. package/dist/tui/display-history.js +283 -0
  612. package/dist/tui/display-sanitizer.d.ts +3 -0
  613. package/dist/tui/display-sanitizer.js +38 -0
  614. package/dist/tui/edit-diff.d.ts +11 -0
  615. package/dist/tui/edit-diff.js +57 -0
  616. package/dist/tui/file-mentions.d.ts +29 -0
  617. package/dist/tui/file-mentions.js +174 -0
  618. package/dist/tui/footer.d.ts +37 -0
  619. package/dist/tui/footer.js +80 -0
  620. package/dist/tui/formatting/edit-diff.d.ts +11 -0
  621. package/dist/tui/formatting/edit-diff.js +52 -0
  622. package/dist/tui/formatting/summary.d.ts +43 -0
  623. package/dist/tui/formatting/summary.js +150 -0
  624. package/dist/tui/fullscreen.d.ts +48 -0
  625. package/dist/tui/fullscreen.js +256 -0
  626. package/dist/tui/image-display.d.ts +23 -0
  627. package/dist/tui/image-display.js +92 -0
  628. package/dist/tui/image-paste.d.ts +113 -0
  629. package/dist/tui/image-paste.js +565 -0
  630. package/dist/tui/input-history.d.ts +47 -0
  631. package/dist/tui/input-history.js +250 -0
  632. package/dist/tui/markdown-style.d.ts +5 -0
  633. package/dist/tui/markdown-style.js +23 -0
  634. package/dist/tui/model/composer-buffer.d.ts +55 -0
  635. package/dist/tui/model/composer-buffer.js +317 -0
  636. package/dist/tui/model/composer-types.d.ts +17 -0
  637. package/dist/tui/model/composer-types.js +1 -0
  638. package/dist/tui/model/display-history.d.ts +78 -0
  639. package/dist/tui/model/display-history.js +124 -0
  640. package/dist/tui/model/display-reconstruct.d.ts +3 -0
  641. package/dist/tui/model/display-reconstruct.js +130 -0
  642. package/dist/tui/model/file-mentions.d.ts +31 -0
  643. package/dist/tui/model/file-mentions.js +178 -0
  644. package/dist/tui/model/image-attachment.d.ts +15 -0
  645. package/dist/tui/model/image-attachment.js +1 -0
  646. package/dist/tui/model/image-paste.d.ts +119 -0
  647. package/dist/tui/model/image-paste.js +610 -0
  648. package/dist/tui/model/input-history.d.ts +1 -0
  649. package/dist/tui/model/input-history.js +1 -0
  650. package/dist/tui/model/input-queue.d.ts +12 -0
  651. package/dist/tui/model/input-queue.js +17 -0
  652. package/dist/tui/model/key-events.d.ts +9 -0
  653. package/dist/tui/model/key-events.js +8 -0
  654. package/dist/tui/model/paste-operation-tracker.d.ts +13 -0
  655. package/dist/tui/model/paste-operation-tracker.js +25 -0
  656. package/dist/tui/model/recent-activity.d.ts +8 -0
  657. package/dist/tui/model/recent-activity.js +71 -0
  658. package/dist/tui/model/subagent-view.d.ts +87 -0
  659. package/dist/tui/model/subagent-view.js +336 -0
  660. package/dist/tui/model/submit-dedupe.d.ts +5 -0
  661. package/dist/tui/model/submit-dedupe.js +25 -0
  662. package/dist/tui/model/sync-output.d.ts +17 -0
  663. package/dist/tui/model/sync-output.js +35 -0
  664. package/dist/tui/model/task-lifecycle.d.ts +57 -0
  665. package/dist/tui/model/task-lifecycle.js +124 -0
  666. package/dist/tui/model/terminal-env.d.ts +15 -0
  667. package/dist/tui/model/terminal-env.js +22 -0
  668. package/dist/tui/model/terminal-mouse.d.ts +28 -0
  669. package/dist/tui/model/terminal-mouse.js +82 -0
  670. package/dist/tui/model/theme-style.d.ts +10 -0
  671. package/dist/tui/model/theme-style.js +79 -0
  672. package/dist/tui/model/theme.d.ts +72 -0
  673. package/dist/tui/model/theme.js +121 -0
  674. package/dist/tui/model/trace-groups.d.ts +45 -0
  675. package/dist/tui/model/trace-groups.js +558 -0
  676. package/dist/tui/model/trace-interaction.d.ts +63 -0
  677. package/dist/tui/model/trace-interaction.js +87 -0
  678. package/dist/tui/model/width.d.ts +18 -0
  679. package/dist/tui/model/width.js +130 -0
  680. package/dist/tui/model-picker-data.d.ts +9 -0
  681. package/dist/tui/model-picker-data.js +39 -0
  682. package/dist/tui/model-switch.d.ts +49 -0
  683. package/dist/tui/model-switch.js +67 -0
  684. package/dist/tui/paste-placeholder.d.ts +11 -0
  685. package/dist/tui/paste-placeholder.js +52 -0
  686. package/dist/tui/recent-activity.d.ts +8 -0
  687. package/dist/tui/recent-activity.js +71 -0
  688. package/dist/tui/run-session-picker.d.ts +9 -0
  689. package/dist/tui/run-session-picker.js +64 -0
  690. package/dist/tui/run.d.ts +72 -0
  691. package/dist/tui/run.js +139 -0
  692. package/dist/tui/session-display.d.ts +6 -0
  693. package/dist/tui/session-display.js +12 -0
  694. package/dist/tui/session-picker-data.d.ts +18 -0
  695. package/dist/tui/session-picker-data.js +21 -0
  696. package/dist/tui/terminal/multiplexer.d.ts +5 -0
  697. package/dist/tui/terminal/multiplexer.js +14 -0
  698. package/dist/tui/testing/fake-agent.d.ts +24 -0
  699. package/dist/tui/testing/fake-agent.js +22 -0
  700. package/dist/tui/testing/spy-host.d.ts +21 -0
  701. package/dist/tui/testing/spy-host.js +55 -0
  702. package/dist/tui/trace-groups.d.ts +43 -0
  703. package/dist/tui/trace-groups.js +554 -0
  704. package/dist/tui/wordmark.d.ts +18 -0
  705. package/dist/tui/wordmark.js +208 -0
  706. package/dist/types.d.ts +503 -0
  707. package/dist/types.js +4 -0
  708. package/dist/update/index.d.ts +61 -0
  709. package/dist/update/index.js +267 -0
  710. package/dist/variant/thinking-level.d.ts +5 -0
  711. package/dist/variant/thinking-level.js +26 -0
  712. package/dist/variant/variant-resolver.d.ts +28 -0
  713. package/dist/variant/variant-resolver.js +62 -0
  714. package/node_modules/@bubblebrain-ai/pi-tui/LICENSE +21 -0
  715. package/node_modules/@bubblebrain-ai/pi-tui/README.md +854 -0
  716. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts +26 -0
  717. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.d.ts.map +1 -0
  718. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js +121 -0
  719. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/alt-screen-search.js.map +1 -0
  720. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts +86 -0
  721. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.d.ts.map +1 -0
  722. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js +649 -0
  723. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/autocomplete.js.map +1 -0
  724. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts +13 -0
  725. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.d.ts.map +1 -0
  726. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js +36 -0
  727. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/alt-screen-flash.js.map +1 -0
  728. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts +22 -0
  729. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.d.ts.map +1 -0
  730. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js +99 -0
  731. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/box.js.map +1 -0
  732. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts +22 -0
  733. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.d.ts.map +1 -0
  734. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js +36 -0
  735. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/cancellable-loader.js.map +1 -0
  736. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts +330 -0
  737. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.d.ts.map +1 -0
  738. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js +2344 -0
  739. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/editor.js.map +1 -0
  740. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts +7 -0
  741. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.d.ts.map +1 -0
  742. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js +43 -0
  743. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/h-stack.js.map +1 -0
  744. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts +28 -0
  745. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.d.ts.map +1 -0
  746. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js +82 -0
  747. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/image.js.map +1 -0
  748. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts +48 -0
  749. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.d.ts.map +1 -0
  750. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js +390 -0
  751. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/input.js.map +1 -0
  752. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts +31 -0
  753. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.d.ts.map +1 -0
  754. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js +67 -0
  755. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/loader.js.map +1 -0
  756. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts +103 -0
  757. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.d.ts.map +1 -0
  758. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js +797 -0
  759. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/markdown.js.map +1 -0
  760. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts +56 -0
  761. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.d.ts.map +1 -0
  762. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js +179 -0
  763. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/scroll-view.js.map +1 -0
  764. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts +53 -0
  765. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.d.ts.map +1 -0
  766. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js +175 -0
  767. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/select-list.js.map +1 -0
  768. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts +50 -0
  769. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.d.ts.map +1 -0
  770. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js +174 -0
  771. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/settings-list.js.map +1 -0
  772. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts +12 -0
  773. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.d.ts.map +1 -0
  774. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js +22 -0
  775. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/spacer.js.map +1 -0
  776. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts +32 -0
  777. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.d.ts.map +1 -0
  778. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js +109 -0
  779. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/stack.js.map +1 -0
  780. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts +19 -0
  781. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.d.ts.map +1 -0
  782. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js +81 -0
  783. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/text.js.map +1 -0
  784. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts +13 -0
  785. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.d.ts.map +1 -0
  786. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js +48 -0
  787. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/truncated-text.js.map +1 -0
  788. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts +8 -0
  789. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.d.ts.map +1 -0
  790. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js +26 -0
  791. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/components/v-stack.js.map +1 -0
  792. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts +39 -0
  793. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.d.ts.map +1 -0
  794. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js +2 -0
  795. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/editor-component.js.map +1 -0
  796. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts +16 -0
  797. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.d.ts.map +1 -0
  798. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js +110 -0
  799. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/fuzzy.js.map +1 -0
  800. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts +31 -0
  801. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.d.ts.map +1 -0
  802. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js +42 -0
  803. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/index.js.map +1 -0
  804. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts +273 -0
  805. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.d.ts.map +1 -0
  806. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js +231 -0
  807. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keybindings.js.map +1 -0
  808. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts +184 -0
  809. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.d.ts.map +1 -0
  810. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js +1174 -0
  811. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/keys.js.map +1 -0
  812. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts +28 -0
  813. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.d.ts.map +1 -0
  814. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js +46 -0
  815. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/kill-ring.js.map +1 -0
  816. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts +10 -0
  817. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.d.ts.map +1 -0
  818. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js +1268 -0
  819. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/latex.js.map +1 -0
  820. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts +40 -0
  821. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.d.ts.map +1 -0
  822. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js +6 -0
  823. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout-node.js.map +1 -0
  824. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts +42 -0
  825. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.d.ts.map +1 -0
  826. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js +335 -0
  827. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/layout.js.map +1 -0
  828. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts +3 -0
  829. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.d.ts.map +1 -0
  830. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js +60 -0
  831. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/native-modifiers.js.map +1 -0
  832. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts +56 -0
  833. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.d.ts.map +1 -0
  834. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js +363 -0
  835. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/stdin-buffer.js.map +1 -0
  836. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts +10 -0
  837. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.d.ts.map +1 -0
  838. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js +59 -0
  839. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-colors.js.map +1 -0
  840. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts +116 -0
  841. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.d.ts.map +1 -0
  842. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js +518 -0
  843. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal-image.js.map +1 -0
  844. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts +142 -0
  845. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.d.ts.map +1 -0
  846. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js +544 -0
  847. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/terminal.js.map +1 -0
  848. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts +11 -0
  849. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.d.ts.map +1 -0
  850. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js +11 -0
  851. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/testing.js.map +1 -0
  852. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts +141 -0
  853. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.d.ts.map +1 -0
  854. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js +1340 -0
  855. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-alt-screen.js.map +1 -0
  856. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts +39 -0
  857. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.d.ts.map +1 -0
  858. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js +536 -0
  859. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui-main-screen.js.map +1 -0
  860. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts +340 -0
  861. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.d.ts.map +1 -0
  862. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js +1020 -0
  863. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/tui.js.map +1 -0
  864. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts +17 -0
  865. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.d.ts.map +1 -0
  866. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js +27 -0
  867. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/undo-stack.js.map +1 -0
  868. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts +96 -0
  869. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.d.ts.map +1 -0
  870. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js +1193 -0
  871. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/utils.js.map +1 -0
  872. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts +25 -0
  873. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.d.ts.map +1 -0
  874. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js +96 -0
  875. package/node_modules/@bubblebrain-ai/pi-tui/dist/src/word-navigation.js.map +1 -0
  876. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts +73 -0
  877. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.d.ts.map +1 -0
  878. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js +188 -0
  879. package/node_modules/@bubblebrain-ai/pi-tui/dist/test/virtual-terminal.js.map +1 -0
  880. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/README.md +20 -0
  881. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/build.sh +62 -0
  882. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-arm64/darwin-modifiers.node +0 -0
  883. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/prebuilds/darwin-x64/darwin-modifiers.node +0 -0
  884. package/node_modules/@bubblebrain-ai/pi-tui/native/darwin/src/darwin-modifiers.c +70 -0
  885. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/README.md +22 -0
  886. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/build.mjs +229 -0
  887. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  888. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  889. package/node_modules/@bubblebrain-ai/pi-tui/native/win32/src/win32-console-mode.c +119 -0
  890. package/node_modules/@bubblebrain-ai/pi-tui/package.json +66 -0
  891. package/node_modules/get-east-asian-width/index.d.ts +60 -0
  892. package/node_modules/get-east-asian-width/index.js +30 -0
  893. package/node_modules/get-east-asian-width/license +9 -0
  894. package/node_modules/get-east-asian-width/lookup-data.js +21 -0
  895. package/node_modules/get-east-asian-width/lookup.js +138 -0
  896. package/node_modules/get-east-asian-width/package.json +71 -0
  897. package/node_modules/get-east-asian-width/readme.md +65 -0
  898. package/node_modules/get-east-asian-width/utilities.js +24 -0
  899. package/node_modules/marked/LICENSE +44 -0
  900. package/node_modules/marked/README.md +115 -0
  901. package/node_modules/marked/bin/main.js +284 -0
  902. package/node_modules/marked/bin/marked.js +16 -0
  903. package/node_modules/marked/lib/marked.d.ts +760 -0
  904. package/node_modules/marked/lib/marked.esm.js +77 -0
  905. package/node_modules/marked/lib/marked.esm.js.map +7 -0
  906. package/node_modules/marked/lib/marked.umd.js +79 -0
  907. package/node_modules/marked/lib/marked.umd.js.map +7 -0
  908. package/node_modules/marked/man/marked.1 +113 -0
  909. package/node_modules/marked/man/marked.1.md +93 -0
  910. package/node_modules/marked/package.json +103 -0
  911. package/package.json +96 -17
  912. package/bin/bubble.js +0 -39
@@ -0,0 +1,635 @@
1
+ import { isInternalBlockContent, sanitizeInternalReminderBlocks } from "../agent/internal-reminder-sanitizer.js";
2
+ import { appendFileBlocks, extractFileOps, mergeFileOps, parseFileBlocks, stripFileBlocks, } from "./compaction-files.js";
3
+ /**
4
+ * Compaction must never summarize away what the user actually asked for:
5
+ * requirements that appear late in a long instruction ("commit when done",
6
+ * "write the report in French") would otherwise vanish once the heuristic
7
+ * summary truncates the goal line. Messages larger than this cap are pinned
8
+ * in truncated form (e.g. a pasted megabyte of logs as the opening message).
9
+ */
10
+ export const PINNED_INSTRUCTION_MAX_CHARS = 8192;
11
+ export const COMPACTION_SUMMARY_PREFIX = "Previous conversation summary:";
12
+ export const SUBTURN_SUMMARY_PREFIX = "Earlier in this turn (compacted to free context):";
13
+ // llm-compactor.ts's LLM_SUMMARY_PREFIX must start with this literal — a unit
14
+ // test locks the two together (importing it here would create a module cycle).
15
+ const LLM_ENVELOPE_PREFIX = "Another language model previously worked on this task";
16
+ // Projected forms: the projector wraps meta messages into user-role internal
17
+ // blocks, and the resident-history path writes that projected form back, so a
18
+ // summary emitted as meta can come back around as one of these.
19
+ const PROJECTED_SUMMARY_PREFIXES = [
20
+ `<bubble_internal_context kind="compaction-summary">`,
21
+ `<bubble_internal_context kind="subturn-compaction-summary">`,
22
+ // Legacy: summaries emitted as raw system messages by ≤0.0.42 got projected
23
+ // into runtime-system blocks.
24
+ `<bubble_internal_context kind="runtime-system">\n${COMPACTION_SUMMARY_PREFIX}`,
25
+ `<bubble_internal_context kind="runtime-system">\n${SUBTURN_SUMMARY_PREFIX}`,
26
+ ];
27
+ export function messageText(message) {
28
+ if (typeof message.content === "string")
29
+ return message.content;
30
+ if (Array.isArray(message.content)) {
31
+ return message.content
32
+ .filter((part) => part.type === "text")
33
+ .map((part) => part.text)
34
+ .join(" ");
35
+ }
36
+ return "";
37
+ }
38
+ /**
39
+ * Identity check for compaction summaries across every form they can take:
40
+ * the first-class meta form, the legacy raw-system form, and the projected
41
+ * user-role internal-block forms (the resident path rewrites projections back
42
+ * into history, so role/position are not conserved).
43
+ */
44
+ export function isCompactionSummaryMessage(message) {
45
+ if (message.role === "meta") {
46
+ return message.kind === "compaction-summary" || message.kind === "subturn-compaction-summary";
47
+ }
48
+ const text = messageText(message);
49
+ if (message.role === "system") {
50
+ return text.startsWith(COMPACTION_SUMMARY_PREFIX) || text.startsWith(SUBTURN_SUMMARY_PREFIX);
51
+ }
52
+ if (message.role === "user") {
53
+ const trimmed = text.trimStart();
54
+ if (trimmed.startsWith(LLM_ENVELOPE_PREFIX))
55
+ return true;
56
+ return PROJECTED_SUMMARY_PREFIXES.some((prefix) => trimmed.startsWith(prefix));
57
+ }
58
+ return false;
59
+ }
60
+ /** A message the user actually typed (not a projected reminder, not a summary). */
61
+ export function isRealUserMessage(message) {
62
+ // Tool screenshots ride in a user-role message for the provider, but they
63
+ // belong to the tool turn: never a turn boundary.
64
+ if (message.role !== "user" || message.toolObservation)
65
+ return false;
66
+ const text = messageText(message);
67
+ if (!text.trim() || isInternalBlockContent(text))
68
+ return false;
69
+ if (text.trimStart().startsWith(LLM_ENVELOPE_PREFIX))
70
+ return false;
71
+ return true;
72
+ }
73
+ /**
74
+ * Split history into the leading system/meta context prefix (system prompt,
75
+ * startup reminders) and the conversational body. Positional, mirroring the
76
+ * projector's leading-prefix semantics: mid-history system/meta messages
77
+ * belong to the body and are foldable — preserving them by role forever is
78
+ * how stale reminders and relocated summaries used to pile up at the head.
79
+ */
80
+ export function splitLeadingContext(messages) {
81
+ let split = 0;
82
+ while (split < messages.length) {
83
+ const message = messages[split];
84
+ if ((message.role === "system" || message.role === "meta") && !isCompactionSummaryMessage(message)) {
85
+ split += 1;
86
+ continue;
87
+ }
88
+ break;
89
+ }
90
+ return { leading: messages.slice(0, split), body: messages.slice(split) };
91
+ }
92
+ /** Index of the first message the user actually wrote. */
93
+ export function findFirstRealUserIndex(messages) {
94
+ for (let index = 0; index < messages.length; index++) {
95
+ if (isRealUserMessage(messages[index]))
96
+ return index;
97
+ }
98
+ return -1;
99
+ }
100
+ /**
101
+ * Clone a message for pinning; oversized content is truncated rather than
102
+ * losing the pin entirely (P0.5: a truncated original beats a 140-char
103
+ * summary line).
104
+ */
105
+ export function clonePinnedUserMessage(message) {
106
+ const text = messageText(message);
107
+ if (text.length <= PINNED_INSTRUCTION_MAX_CHARS)
108
+ return cloneMessage(message);
109
+ return {
110
+ role: "user",
111
+ content: `${text.slice(0, PINNED_INSTRUCTION_MAX_CHARS)}\n[...original message truncated for context management...]`,
112
+ };
113
+ }
114
+ export function buildCompactionSummaryMessage(summary) {
115
+ return {
116
+ role: "meta",
117
+ kind: "compaction-summary",
118
+ content: `${COMPACTION_SUMMARY_PREFIX}\n${summary}`,
119
+ };
120
+ }
121
+ export function planSessionCompaction(entries, options = {}) {
122
+ const keepRecentTurns = options.keepRecentTurns ?? 2;
123
+ // Provider errors are diagnostics, not model context. Keep the latest audit
124
+ // records across compaction without allowing repeated failures to grow the
125
+ // compacted session forever.
126
+ const metadataEntries = [
127
+ ...entries.filter((entry) => entry.type === "metadata"),
128
+ ...entries.filter((entry) => entry.type === "provider_error").slice(-20),
129
+ ];
130
+ const nonMetadataEntries = entries.filter((entry) => entry.type !== "metadata" && entry.type !== "provider_error");
131
+ const latestSummaryIndex = findLatestSummaryIndex(nonMetadataEntries);
132
+ const baseIndex = latestSummaryIndex >= 0 ? latestSummaryIndex + 1 : 0;
133
+ const activeEntries = nonMetadataEntries.slice(baseIndex);
134
+ const turnStartIndexes = activeEntries
135
+ .map((entry, index) => (entry.type === "user_message" ? index : -1))
136
+ .filter((index) => index >= 0);
137
+ if (turnStartIndexes.length <= keepRecentTurns) {
138
+ return { compactable: false };
139
+ }
140
+ const keepStartIndex = turnStartIndexes[Math.max(0, turnStartIndexes.length - keepRecentTurns)];
141
+ if (keepStartIndex <= 0) {
142
+ return { compactable: false };
143
+ }
144
+ return {
145
+ compactable: true,
146
+ metadataEntries,
147
+ oldEntries: activeEntries.slice(0, keepStartIndex),
148
+ keptEntries: activeEntries.slice(keepStartIndex),
149
+ };
150
+ }
151
+ /**
152
+ * Cumulative file ops for a compaction: the blocks prior summaries carried,
153
+ * unioned with the ops found in the messages being evicted now. Every
154
+ * compaction path — LLM, heuristic, sub-turn, session-entry — must thread
155
+ * this through, or the "cumulative" record resets on that path.
156
+ */
157
+ export function collectCompactionFileOps(evicted, priorSummaries) {
158
+ return mergeFileOps(...priorSummaries.map((message) => parseFileBlocks(messageText(message))), extractFileOps(evicted));
159
+ }
160
+ /**
161
+ * Assemble the post-compaction entry list from a plan and a (possibly
162
+ * LLM-generated) summary string. The summary entry is keyed off the full
163
+ * original `entries` so its id never collides with a prior summary.
164
+ */
165
+ export function buildCompactedEntries(entries, plan, summary) {
166
+ const summaryEntry = {
167
+ id: nextSummaryId(entries),
168
+ type: "summary",
169
+ // Sink-level backstop: whatever producer built this string (LLM or
170
+ // heuristic), internal markup never lands in the session file.
171
+ summary: sanitizeInternalReminderBlocks(summary),
172
+ timestamp: Date.now(),
173
+ };
174
+ return [...plan.metadataEntries, summaryEntry, ...plan.keptEntries];
175
+ }
176
+ /** Flatten a plan's old entries into messages for an external summarizer. */
177
+ export function planOldMessages(plan) {
178
+ return entriesToMessages(plan.oldEntries);
179
+ }
180
+ export function compactSessionEntries(entries, options = {}) {
181
+ const maxSummaryItems = options.maxSummaryItems ?? 4;
182
+ const plan = planSessionCompaction(entries, options);
183
+ if (!plan.compactable) {
184
+ return { compacted: false };
185
+ }
186
+ const summary = buildCompactionSummary(plan.oldEntries, maxSummaryItems);
187
+ if (!summary) {
188
+ return { compacted: false };
189
+ }
190
+ const oldMessages = entriesToMessages(plan.oldEntries);
191
+ const summaryWithFiles = appendFileBlocks(summary, collectCompactionFileOps(oldMessages.filter((message) => !isCompactionSummaryMessage(message)), oldMessages.filter(isCompactionSummaryMessage)));
192
+ return {
193
+ compacted: true,
194
+ summary: summaryWithFiles,
195
+ entries: buildCompactedEntries(entries, plan, summaryWithFiles),
196
+ droppedEntries: plan.oldEntries.length,
197
+ };
198
+ }
199
+ export function compactMessages(messages, options = {}) {
200
+ const keepRecentTurns = options.keepRecentTurns ?? 2;
201
+ const maxSummaryItems = options.maxSummaryItems ?? 4;
202
+ // Replace envelopes, not their contents: prior LLM summaries can be the only
203
+ // surviving record of decisions and constraints. Merge their prose below.
204
+ const { leading, body } = splitLeadingContext(messages);
205
+ const priorSummaries = body.filter(isCompactionSummaryMessage);
206
+ const bodyMessages = body.filter((message) => !isCompactionSummaryMessage(message));
207
+ // Turn boundaries anchor on REAL user messages only. Projected reminders
208
+ // and summary envelopes used to inflate the turn count, shrinking the keep
209
+ // window to nothing and firing compaction almost every turn.
210
+ const turnStartIndexes = bodyMessages
211
+ .map((message, index) => (isRealUserMessage(message) ? index : -1))
212
+ .filter((index) => index >= 0);
213
+ if (turnStartIndexes.length <= keepRecentTurns) {
214
+ return { compacted: false };
215
+ }
216
+ const keepStartIndex = turnStartIndexes[Math.max(0, turnStartIndexes.length - keepRecentTurns)];
217
+ if (keepStartIndex <= 0) {
218
+ return { compacted: false };
219
+ }
220
+ const oldMessages = bodyMessages.slice(0, keepStartIndex);
221
+ const keptMessages = bodyMessages.slice(keepStartIndex);
222
+ // Pin the original instruction: it stays verbatim above the summary instead
223
+ // of being crushed into the summary's 140-char goal line.
224
+ const pinnedIndex = findFirstRealUserIndex(oldMessages);
225
+ const pinnedMessage = pinnedIndex >= 0 ? oldMessages[pinnedIndex] : undefined;
226
+ // Summary fodder: real conversational content only — no pinned original,
227
+ // no projected reminder blocks (they used to pollute Goal/Progress lines).
228
+ const summaryInput = oldMessages.filter((message, index) => index !== pinnedIndex
229
+ && message.role !== "meta"
230
+ && !(message.role === "user" && !isRealUserMessage(message)));
231
+ const summary = buildMessageSummary(summaryInput, maxSummaryItems);
232
+ if (!summary) {
233
+ return { compacted: false };
234
+ }
235
+ // Flatten prior envelopes and dedupe lines instead of nesting summaries on
236
+ // every pass. Keep an explicitly bounded prose record (head + recent tail),
237
+ // with a durable warning when the heuristic cannot retain everything.
238
+ const pinOverflow = pinnedMessage
239
+ ? messageText(pinnedMessage).slice(PINNED_INSTRUCTION_MAX_CHARS)
240
+ : "";
241
+ const summaryLines = [
242
+ ...priorSummaries.map((message) => stripFileBlocks(messageText(message))),
243
+ ...(pinOverflow ? [`Original instruction beyond retained pin:\n${pinOverflow}`] : []),
244
+ summary,
245
+ ].join("\n")
246
+ .replace(/<\/?bubble_internal_(?:context|reminder)\b[^>]*>/g, "")
247
+ .split("\n")
248
+ .map((line) => line.trim()
249
+ .replace(/^Another language model previously worked on this task[^\n]*?Summary:\s*/, "")
250
+ .replace(/^Previous conversation summary:\s*/, "")
251
+ .replace(/^Earlier in this turn \(compacted to free context\):\s*/, ""))
252
+ .filter(Boolean);
253
+ const mergedSummary = [...new Set(summaryLines)].join("\n");
254
+ const proseLimit = 8192;
255
+ const overflowNotice = "\n[Heuristic compaction degraded: accumulated summary exceeded 8192 characters; middle omitted.]\n";
256
+ const boundedSummary = mergedSummary.length <= proseLimit ? mergedSummary
257
+ : mergedSummary.slice(0, 4096) + overflowNotice
258
+ + mergedSummary.slice(-(proseLimit - 4096 - overflowNotice.length));
259
+ const summaryWithFiles = appendFileBlocks(boundedSummary, collectCompactionFileOps(oldMessages, priorSummaries));
260
+ const compactedMessages = [
261
+ ...leading.map((message) => cloneMessage(message)),
262
+ ...(pinnedMessage ? [clonePinnedUserMessage(pinnedMessage)] : []),
263
+ buildCompactionSummaryMessage(summaryWithFiles),
264
+ ...keptMessages.map((message) => cloneMessage(message)),
265
+ ];
266
+ return {
267
+ compacted: true,
268
+ summary: summaryWithFiles,
269
+ messages: compactedMessages,
270
+ // The pin survives verbatim only up to its cap; the tail beyond it exists
271
+ // nowhere else, so an external summarizer must see it in the pin's place.
272
+ evictedMessages: [...priorSummaries, ...oldMessages.flatMap((message, index) => index !== pinnedIndex ? [message]
273
+ : pinOverflow ? [{ role: "user", content: `Original instruction beyond retained pin:\n${pinOverflow}` }] : [])],
274
+ summaryIndex: leading.length + (pinnedMessage ? 1 : 0),
275
+ droppedEntries: summaryInput.length,
276
+ };
277
+ }
278
+ export function compactCurrentTurnToolGroups(messages, options = {}) {
279
+ const keepRecentGroups = options.keepRecentGroups ?? 2;
280
+ const maxSummaryItems = options.maxSummaryItems ?? 8;
281
+ const { leading, body } = splitLeadingContext(messages);
282
+ // Anchor the "current turn" on the last REAL user message — a projected
283
+ // reminder must not shrink the turn to a sliver.
284
+ let lastUserIndex = -1;
285
+ for (let i = body.length - 1; i >= 0; i--) {
286
+ if (isRealUserMessage(body[i])) {
287
+ lastUserIndex = i;
288
+ break;
289
+ }
290
+ }
291
+ if (lastUserIndex < 0)
292
+ return { compacted: false };
293
+ const preTurn = body.slice(0, lastUserIndex + 1);
294
+ const rawTurnBody = body.slice(lastUserIndex + 1);
295
+ // Replace semantics within the turn: fold prior sub-turn summaries' lines
296
+ // into the new one instead of stacking marker messages.
297
+ const priorSubturnSummaries = rawTurnBody.filter((m) => m.role === "meta" ? m.kind === "subturn-compaction-summary" : isCompactionSummaryMessage(m) && messageText(m).includes(SUBTURN_SUMMARY_PREFIX.slice(0, 20)));
298
+ const turnBody = rawTurnBody.filter((m) => !priorSubturnSummaries.includes(m));
299
+ const groups = [];
300
+ let current = null;
301
+ for (const msg of turnBody) {
302
+ if (msg.role === "assistant") {
303
+ if (current)
304
+ groups.push(current);
305
+ current = { assistant: msg, toolResults: [] };
306
+ }
307
+ else if ((msg.role === "tool" || (msg.role === "user" && msg.toolObservation)) && current) {
308
+ // A screenshot observation follows its tool result: it lives and dies
309
+ // with that group instead of vanishing from kept groups.
310
+ current.toolResults.push(msg);
311
+ }
312
+ }
313
+ if (current)
314
+ groups.push(current);
315
+ if (groups.length <= keepRecentGroups)
316
+ return { compacted: false };
317
+ // Only drop groups that have tool_calls — text-only assistant messages don't
318
+ // free much context, and dropping them confuses the conversation flow.
319
+ const evictable = groups.slice(0, groups.length - keepRecentGroups)
320
+ .filter((g) => g.assistant.role === "assistant" && (g.assistant.toolCalls?.length ?? 0) > 0);
321
+ if (evictable.length === 0)
322
+ return { compacted: false };
323
+ const freshSummary = buildToolGroupsSummary(evictable, maxSummaryItems);
324
+ if (!freshSummary)
325
+ return { compacted: false };
326
+ const summary = mergeSubturnSummaryLines(priorSubturnSummaries, freshSummary, maxSummaryItems);
327
+ // Evicted groups' file ops would otherwise vanish before any multi-turn
328
+ // compactor runs; blocks on the sub-turn summary get merged upward later.
329
+ const summaryWithFiles = appendFileBlocks(summary, collectCompactionFileOps(evictable.flatMap((g) => [g.assistant, ...g.toolResults]), priorSubturnSummaries));
330
+ const survivingGroups = groups.filter((g) => !evictable.includes(g));
331
+ const flatSurvivors = [];
332
+ for (const g of survivingGroups) {
333
+ flatSurvivors.push(cloneMessage(g.assistant));
334
+ for (const t of g.toolResults)
335
+ flatSurvivors.push(cloneMessage(t));
336
+ }
337
+ const compactedMessages = [
338
+ ...leading.map(cloneMessage),
339
+ ...preTurn.map(cloneMessage),
340
+ {
341
+ role: "meta",
342
+ kind: "subturn-compaction-summary",
343
+ content: `${SUBTURN_SUMMARY_PREFIX}\n${summaryWithFiles}`,
344
+ },
345
+ ...flatSurvivors,
346
+ ];
347
+ return {
348
+ compacted: true,
349
+ summary,
350
+ messages: compactedMessages,
351
+ evictedMessages: [...priorSubturnSummaries, ...evictable.flatMap((g) => [g.assistant, ...g.toolResults])],
352
+ summaryIndex: leading.length + preTurn.length,
353
+ droppedEntries: evictable.length,
354
+ };
355
+ }
356
+ /**
357
+ * Merge prior sub-turn summary lines with the fresh one: line-level dedupe,
358
+ * prior lines first (chronological), capped. Structured merge of tool-name /
359
+ * file lists — not freetext concatenation.
360
+ */
361
+ function mergeSubturnSummaryLines(priorSummaries, freshSummary, maxItems) {
362
+ if (priorSummaries.length === 0)
363
+ return freshSummary;
364
+ const seen = new Set();
365
+ const merged = [];
366
+ const push = (line) => {
367
+ const normalized = line.trim();
368
+ if (!normalized || seen.has(normalized))
369
+ return;
370
+ seen.add(normalized);
371
+ merged.push(line);
372
+ };
373
+ for (const prior of priorSummaries) {
374
+ // File blocks are merged structurally by collectCompactionFileOps, not as
375
+ // prose lines — strip them so paths don't leak into the line dedupe.
376
+ for (const line of stripFileBlocks(messageText(prior)).split("\n")) {
377
+ if (line.startsWith(SUBTURN_SUMMARY_PREFIX) || line.startsWith("<bubble_internal_"))
378
+ continue;
379
+ push(line);
380
+ }
381
+ }
382
+ for (const line of freshSummary.split("\n"))
383
+ push(line);
384
+ const cap = Math.max(maxItems * 4, 24);
385
+ return merged.slice(-cap).join("\n");
386
+ }
387
+ function buildToolGroupsSummary(groups, maxItems) {
388
+ const toolCounts = new Map();
389
+ const fileSet = new Set();
390
+ let totalResultChars = 0;
391
+ const findings = [];
392
+ for (const group of groups) {
393
+ if (group.assistant.role !== "assistant" || !group.assistant.toolCalls)
394
+ continue;
395
+ const toolNameByCallId = new Map();
396
+ for (const tc of group.assistant.toolCalls) {
397
+ toolCounts.set(tc.name, (toolCounts.get(tc.name) ?? 0) + 1);
398
+ toolNameByCallId.set(tc.id, tc.name);
399
+ try {
400
+ const parsed = JSON.parse(tc.arguments || "{}");
401
+ for (const key of ["file_path", "path", "paths", "file"]) {
402
+ const v = parsed[key];
403
+ if (typeof v === "string" && v)
404
+ fileSet.add(v);
405
+ else if (Array.isArray(v)) {
406
+ for (const item of v)
407
+ if (typeof item === "string" && item)
408
+ fileSet.add(item);
409
+ }
410
+ }
411
+ }
412
+ catch {
413
+ // ignore unparseable args
414
+ }
415
+ }
416
+ for (const r of group.toolResults) {
417
+ if (r.role !== "tool")
418
+ continue;
419
+ const content = typeof r.content === "string" ? r.content : "";
420
+ totalResultChars += content.length;
421
+ if (findings.length < maxItems) {
422
+ const toolName = toolNameByCallId.get(r.toolCallId) ?? "tool";
423
+ findings.push(`${toolName}: ${summarizeText(content)}`);
424
+ }
425
+ }
426
+ }
427
+ const lines = [];
428
+ const toolList = [...toolCounts.entries()]
429
+ .map(([name, n]) => (n > 1 ? `${name}×${n}` : name))
430
+ .join(", ");
431
+ lines.push(`Tools used: ${toolList || "none"}`);
432
+ if (fileSet.size > 0) {
433
+ const fileList = [...fileSet].slice(0, 12);
434
+ lines.push(`Files touched: ${fileList.join(", ")}${fileSet.size > 12 ? ` (+${fileSet.size - 12} more)` : ""}`);
435
+ }
436
+ lines.push(`Discarded ~${formatChars(totalResultChars)} of earlier tool output. Re-run the relevant tool if you need specifics.`);
437
+ if (findings.length > 0) {
438
+ lines.push("");
439
+ lines.push("Earlier findings:");
440
+ for (const f of findings)
441
+ lines.push(`- ${f}`);
442
+ }
443
+ return lines.join("\n");
444
+ }
445
+ function formatChars(count) {
446
+ if (count < 1000)
447
+ return `${count} chars`;
448
+ if (count < 1_000_000)
449
+ return `${(count / 1000).toFixed(1)}K chars`;
450
+ return `${(count / 1_000_000).toFixed(2)}M chars`;
451
+ }
452
+ function buildCompactionSummary(entries, maxSummaryItems) {
453
+ const messages = entriesToMessages(entries);
454
+ return buildMessageSummary(messages, maxSummaryItems);
455
+ }
456
+ function buildMessageSummary(messages, maxSummaryItems) {
457
+ if (messages.length === 0) {
458
+ return "";
459
+ }
460
+ // Internal blocks (goal kicks, task wakes, projected reminders) must not
461
+ // become the Goal/Progress lines: 140-char truncation would turn them into
462
+ // markup FRAGMENTS, which defeat the anchored display filters downstream.
463
+ const userMessages = messages.filter((message) => message.role === "user"
464
+ && typeof message.content === "string"
465
+ && !isInternalBlockContent(message.content));
466
+ const assistantMessages = messages.filter((message) => message.role === "assistant");
467
+ const toolCalls = collectToolCalls(messages);
468
+ const relevantFiles = collectRelevantFiles(toolCalls);
469
+ const toolFindings = collectToolFindings(messages, maxSummaryItems);
470
+ const goal = userMessages[0] ? summarizeContent(userMessages[0].content) : "Unknown";
471
+ const progress = userMessages.slice(0, maxSummaryItems).map((message) => `- ${summarizeContent(message.content)}`);
472
+ const decisions = assistantMessages
473
+ .map((message) => message.content.trim())
474
+ .filter(Boolean)
475
+ .slice(0, maxSummaryItems)
476
+ .map((content) => `- ${summarizeText(content)}`);
477
+ const lines = [
478
+ "Goal:",
479
+ `- ${goal}`,
480
+ "",
481
+ "Progress:",
482
+ ...(progress.length > 0 ? progress : ["- No user progress recorded"]),
483
+ "",
484
+ "Key Decisions:",
485
+ ...(decisions.length > 0 ? decisions : ["- No assistant decisions recorded"]),
486
+ "",
487
+ "Next Steps:",
488
+ ["- Continue from the most recent preserved turn"],
489
+ "",
490
+ "Relevant Files:",
491
+ ...(relevantFiles.length > 0 ? relevantFiles.map((file) => `- ${file}`) : ["- None captured"]),
492
+ "",
493
+ "Tool Findings:",
494
+ ...(toolFindings.length > 0 ? toolFindings.map((item) => `- ${item}`) : ["- None captured"]),
495
+ ];
496
+ return lines.flat().join("\n");
497
+ }
498
+ function entriesToMessages(entries) {
499
+ const messages = [];
500
+ for (const entry of entries) {
501
+ switch (entry.type) {
502
+ case "user_message":
503
+ messages.push({ ...entry.message });
504
+ break;
505
+ case "assistant_message":
506
+ messages.push({
507
+ ...entry.message,
508
+ role: "assistant",
509
+ });
510
+ break;
511
+ case "tool_call": {
512
+ const last = messages[messages.length - 1];
513
+ if (last?.role === "assistant") {
514
+ last.toolCalls = [...(last.toolCalls ?? []), { ...entry.toolCall }];
515
+ }
516
+ else {
517
+ messages.push({
518
+ role: "assistant",
519
+ content: "",
520
+ toolCalls: [{ ...entry.toolCall }],
521
+ });
522
+ }
523
+ break;
524
+ }
525
+ case "tool_result":
526
+ messages.push({ ...entry.message });
527
+ break;
528
+ default:
529
+ break;
530
+ }
531
+ }
532
+ return messages;
533
+ }
534
+ function collectToolCalls(messages) {
535
+ return messages.flatMap((message) => message.role === "assistant" ? (message.toolCalls ?? []) : []);
536
+ }
537
+ function collectRelevantFiles(toolCalls) {
538
+ const files = new Set();
539
+ for (const toolCall of toolCalls) {
540
+ let parsed = {};
541
+ try {
542
+ parsed = JSON.parse(toolCall.arguments || "{}");
543
+ }
544
+ catch {
545
+ parsed = {};
546
+ }
547
+ for (const key of ["file", "path", "paths"]) {
548
+ const value = parsed[key];
549
+ if (typeof value === "string" && value) {
550
+ files.add(value);
551
+ }
552
+ if (Array.isArray(value)) {
553
+ for (const item of value) {
554
+ if (typeof item === "string" && item) {
555
+ files.add(item);
556
+ }
557
+ }
558
+ }
559
+ }
560
+ }
561
+ return [...files].slice(0, 12);
562
+ }
563
+ function collectToolFindings(messages, maxItems) {
564
+ const findings = [];
565
+ const toolNameByCallId = new Map();
566
+ for (const message of messages) {
567
+ if (message.role === "assistant" && message.toolCalls) {
568
+ for (const toolCall of message.toolCalls) {
569
+ toolNameByCallId.set(toolCall.id, toolCall.name);
570
+ }
571
+ continue;
572
+ }
573
+ if (message.role !== "tool") {
574
+ continue;
575
+ }
576
+ const toolName = toolNameByCallId.get(message.toolCallId) ?? "tool";
577
+ findings.push(`${toolName}: ${summarizeText(message.content)}`);
578
+ if (findings.length >= maxItems) {
579
+ break;
580
+ }
581
+ }
582
+ return findings;
583
+ }
584
+ function summarizeContent(content) {
585
+ if (typeof content === "string") {
586
+ return summarizeText(content);
587
+ }
588
+ const textParts = content
589
+ .filter((part) => part.type === "text")
590
+ .map((part) => part.text);
591
+ return summarizeText(textParts.join(" "));
592
+ }
593
+ function summarizeText(value) {
594
+ const normalized = value.replace(/\s+/g, " ").trim();
595
+ if (normalized.length <= 140) {
596
+ return normalized || "(empty)";
597
+ }
598
+ return `${normalized.slice(0, 137)}...`;
599
+ }
600
+ function findLatestSummaryIndex(entries) {
601
+ for (let index = entries.length - 1; index >= 0; index--) {
602
+ if (entries[index].type === "summary") {
603
+ return index;
604
+ }
605
+ }
606
+ return -1;
607
+ }
608
+ function nextSummaryId(entries) {
609
+ let max = 0;
610
+ for (const entry of entries) {
611
+ const match = /^(\d+)/.exec(entry.id);
612
+ if (!match)
613
+ continue;
614
+ max = Math.max(max, Number(match[1]));
615
+ }
616
+ return `${max + 1}`;
617
+ }
618
+ function cloneMessage(message) {
619
+ if (message.role === "assistant") {
620
+ return {
621
+ ...message,
622
+ toolCalls: message.toolCalls?.map((toolCall) => ({ ...toolCall })),
623
+ };
624
+ }
625
+ if (message.role === "user" && Array.isArray(message.content)) {
626
+ return {
627
+ ...message,
628
+ content: message.content.map((part) => ({
629
+ ...part,
630
+ ...(part.type === "image_url" ? { image_url: { ...part.image_url } } : {}),
631
+ })),
632
+ };
633
+ }
634
+ return { ...message };
635
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Cumulative file-operation tracking across compactions.
3
+ *
4
+ * The LLM summary handles semantics (progress, decisions, next steps); which
5
+ * files were touched is an enumerable fact the model reliably drops after a
6
+ * couple of rolling summaries. So it never goes through the model: at each
7
+ * compaction, deterministic code extracts file ops from the evicted messages,
8
+ * unions them with the lists the previous summary carried, and appends the
9
+ * result as structured blocks after the summary text.
10
+ *
11
+ * Robustness rules (each earned by a review finding):
12
+ * - appendFileBlocks sanitizes its input first, so a summary can never carry
13
+ * two generations of blocks — or model-echoed tags — at once.
14
+ * - Only tool calls with a successful result count: a rejected or failed edit
15
+ * must not report the file as modified.
16
+ * - Lists are capped; modified entries are the ones worth keeping complete.
17
+ * - Serialization is sorted and deduped so identical sets are identical bytes.
18
+ */
19
+ import type { Message } from "../types.js";
20
+ export interface CompactionFileOps {
21
+ read: string[];
22
+ modified: string[];
23
+ }
24
+ /**
25
+ * File ops mentioned by tool calls in the given (about-to-be-evicted)
26
+ * messages. A call only counts when its tool result is present and not an
27
+ * error — a rejected edit or failed read must not enter the record.
28
+ */
29
+ export declare function extractFileOps(messages: Message[]): CompactionFileOps;
30
+ /** Parse every block a previous compaction summary carried (empty when absent). */
31
+ export declare function parseFileBlocks(text: string): CompactionFileOps;
32
+ /**
33
+ * Remove all blocks AND stray tags, e.g. before feeding a prior summary back
34
+ * to the model. Whitespace is only reflowed when something was removed.
35
+ */
36
+ export declare function stripFileBlocks(text: string): string;
37
+ /** Union, deduped and sorted; a file that was ever modified never lists as read-only. */
38
+ export declare function mergeFileOps(...ops: CompactionFileOps[]): CompactionFileOps;
39
+ /**
40
+ * Append the blocks to a summary text. Sanitizes the summary first so the
41
+ * output always contains exactly one generation of blocks, even when the
42
+ * model echoed tags into its own prose. No-op when both lists are empty.
43
+ */
44
+ export declare function appendFileBlocks(summary: string, ops: CompactionFileOps): string;