@bastani/atomic 0.8.31-alpha.4 → 0.9.0-alpha.1

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 (1361) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/dist/builtin/cursor/CHANGELOG.md +4 -1
  3. package/dist/builtin/cursor/package.json +2 -2
  4. package/dist/builtin/cursor/src/proto/protobuf-codec-json.ts +44 -0
  5. package/dist/builtin/cursor/src/proto/protobuf-codec-request.ts +271 -0
  6. package/dist/builtin/cursor/src/proto/protobuf-codec-wire.ts +231 -0
  7. package/dist/builtin/cursor/src/proto/protobuf-codec.ts +5 -523
  8. package/dist/builtin/cursor/src/stream.ts +6 -70
  9. package/dist/builtin/cursor/src/transport-errors.ts +74 -0
  10. package/dist/builtin/cursor/src/transport-frame.ts +56 -0
  11. package/dist/builtin/cursor/src/transport-http2.ts +122 -0
  12. package/dist/builtin/cursor/src/transport-native-client.ts +161 -0
  13. package/dist/builtin/cursor/src/transport-run-stream.ts +188 -0
  14. package/dist/builtin/cursor/src/transport-timeouts.ts +87 -0
  15. package/dist/builtin/cursor/src/transport-types.ts +140 -0
  16. package/dist/builtin/cursor/src/transport.ts +24 -790
  17. package/dist/builtin/intercom/CHANGELOG.md +3 -0
  18. package/dist/builtin/intercom/broker/client.ts +0 -35
  19. package/dist/builtin/intercom/contact-supervisor-tool.ts +289 -0
  20. package/dist/builtin/intercom/index-heavy.ts +77 -1336
  21. package/dist/builtin/intercom/intercom-tool.ts +409 -0
  22. package/dist/builtin/intercom/intercom-utils.ts +401 -0
  23. package/dist/builtin/intercom/lifecycle.ts +133 -0
  24. package/dist/builtin/intercom/overlay.ts +96 -0
  25. package/dist/builtin/intercom/package.json +1 -1
  26. package/dist/builtin/intercom/subagent-relay.ts +137 -0
  27. package/dist/builtin/mcp/CHANGELOG.md +3 -0
  28. package/dist/builtin/mcp/config-write-utils.ts +104 -0
  29. package/dist/builtin/mcp/config.ts +4 -180
  30. package/dist/builtin/mcp/mcp-panel-renderer.ts +243 -0
  31. package/dist/builtin/mcp/mcp-panel-state.ts +227 -0
  32. package/dist/builtin/mcp/mcp-panel-types.ts +86 -0
  33. package/dist/builtin/mcp/mcp-panel.ts +145 -579
  34. package/dist/builtin/mcp/mcp-setup-panel.ts +4 -81
  35. package/dist/builtin/mcp/package.json +1 -1
  36. package/dist/builtin/mcp/proxy-auth.ts +61 -0
  37. package/dist/builtin/mcp/proxy-call.ts +373 -0
  38. package/dist/builtin/mcp/proxy-connect.ts +58 -0
  39. package/dist/builtin/mcp/proxy-info-modes.ts +326 -0
  40. package/dist/builtin/mcp/proxy-modes.ts +3 -805
  41. package/dist/builtin/mcp/proxy-types.ts +3 -0
  42. package/dist/builtin/mcp/ui-server-http.ts +81 -0
  43. package/dist/builtin/mcp/ui-server.ts +2 -127
  44. package/dist/builtin/subagents/CHANGELOG.md +3 -0
  45. package/dist/builtin/subagents/package.json +1 -1
  46. package/dist/builtin/subagents/src/agents/agent-discovery.ts +127 -0
  47. package/dist/builtin/subagents/src/agents/agent-loaders.ts +175 -0
  48. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +310 -0
  49. package/dist/builtin/subagents/src/agents/agent-management.ts +3 -309
  50. package/dist/builtin/subagents/src/agents/agent-overrides.ts +397 -0
  51. package/dist/builtin/subagents/src/agents/agent-paths.ts +88 -0
  52. package/dist/builtin/subagents/src/agents/agent-types.ts +136 -0
  53. package/dist/builtin/subagents/src/agents/agents.ts +22 -895
  54. package/dist/builtin/subagents/src/agents/skills-paths.ts +333 -0
  55. package/dist/builtin/subagents/src/agents/skills.ts +3 -326
  56. package/dist/builtin/subagents/src/extension/index.ts +4 -118
  57. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +13 -0
  58. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +401 -0
  59. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +131 -0
  60. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +213 -0
  61. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +84 -0
  62. package/dist/builtin/subagents/src/runs/background/async-execution.ts +13 -795
  63. package/dist/builtin/subagents/src/runs/background/subagent-runner-dynamic.ts +215 -0
  64. package/dist/builtin/subagents/src/runs/background/subagent-runner-finalize.ts +136 -0
  65. package/dist/builtin/subagents/src/runs/background/subagent-runner-output.ts +105 -0
  66. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel-helpers.ts +112 -0
  67. package/dist/builtin/subagents/src/runs/background/subagent-runner-parallel.ts +159 -0
  68. package/dist/builtin/subagents/src/runs/background/subagent-runner-sequential.ts +127 -0
  69. package/dist/builtin/subagents/src/runs/background/subagent-runner-state.ts +427 -0
  70. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +273 -0
  71. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +269 -0
  72. package/dist/builtin/subagents/src/runs/background/subagent-runner-types.ts +196 -0
  73. package/dist/builtin/subagents/src/runs/background/subagent-runner-utils.ts +70 -0
  74. package/dist/builtin/subagents/src/runs/background/subagent-runner.ts +44 -2233
  75. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +75 -0
  76. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +202 -0
  77. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +97 -0
  78. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +160 -0
  79. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +72 -0
  80. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +161 -0
  81. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +203 -0
  82. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +234 -0
  83. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +103 -0
  84. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +29 -0
  85. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +4 -1328
  86. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +117 -0
  87. package/dist/builtin/subagents/src/runs/foreground/chain-execution-details.ts +35 -0
  88. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +194 -0
  89. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +183 -0
  90. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +185 -0
  91. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +229 -0
  92. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +194 -0
  93. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +94 -1043
  94. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-control.ts +135 -0
  95. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +107 -0
  96. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-types.ts +17 -0
  97. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +454 -0
  98. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +219 -0
  99. package/dist/builtin/subagents/src/runs/foreground/execution-structured-retries.ts +77 -0
  100. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +34 -0
  101. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +56 -0
  102. package/dist/builtin/subagents/src/runs/foreground/execution.ts +6 -1082
  103. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +207 -0
  104. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +140 -0
  105. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +266 -0
  106. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +270 -0
  107. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +157 -0
  108. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +375 -0
  109. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +463 -0
  110. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +17 -0
  111. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +320 -0
  112. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +207 -0
  113. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +121 -0
  114. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +113 -0
  115. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +150 -2522
  116. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +0 -16
  117. package/dist/builtin/subagents/src/runs/shared/nested-events-control.ts +167 -0
  118. package/dist/builtin/subagents/src/runs/shared/nested-events-core.ts +219 -0
  119. package/dist/builtin/subagents/src/runs/shared/nested-events-projection.ts +121 -0
  120. package/dist/builtin/subagents/src/runs/shared/nested-events-registry.ts +289 -0
  121. package/dist/builtin/subagents/src/runs/shared/nested-events-sanitize.ts +201 -0
  122. package/dist/builtin/subagents/src/runs/shared/nested-events.ts +50 -935
  123. package/dist/builtin/subagents/src/runs/shared/worktree.ts +0 -78
  124. package/dist/builtin/subagents/src/shared/types-async.ts +265 -0
  125. package/dist/builtin/subagents/src/shared/types-config.ts +125 -0
  126. package/dist/builtin/subagents/src/shared/types-depth.ts +121 -0
  127. package/dist/builtin/subagents/src/shared/types-output.ts +63 -0
  128. package/dist/builtin/subagents/src/shared/types-results.ts +318 -0
  129. package/dist/builtin/subagents/src/shared/types-runtime.ts +136 -0
  130. package/dist/builtin/subagents/src/shared/types.ts +10 -975
  131. package/dist/builtin/subagents/src/slash/slash-commands.ts +0 -12
  132. package/dist/builtin/subagents/src/tui/render-chain-graph.ts +247 -0
  133. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +259 -0
  134. package/dist/builtin/subagents/src/tui/render-layout.ts +120 -0
  135. package/dist/builtin/subagents/src/tui/render-result-animation.ts +56 -0
  136. package/dist/builtin/subagents/src/tui/render-result-compact.ts +154 -0
  137. package/dist/builtin/subagents/src/tui/render-result.ts +390 -0
  138. package/dist/builtin/subagents/src/tui/render-stable-output.ts +83 -0
  139. package/dist/builtin/subagents/src/tui/render-status-progress.ts +133 -0
  140. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +166 -0
  141. package/dist/builtin/subagents/src/tui/render-widget.ts +273 -0
  142. package/dist/builtin/subagents/src/tui/render.ts +14 -1801
  143. package/dist/builtin/web-access/CHANGELOG.md +3 -0
  144. package/dist/builtin/web-access/content-tools.ts +348 -0
  145. package/dist/builtin/web-access/curator-page-assets/script-1.ts +400 -0
  146. package/dist/builtin/web-access/curator-page-assets/script-2.ts +400 -0
  147. package/dist/builtin/web-access/curator-page-assets/script-3.ts +400 -0
  148. package/dist/builtin/web-access/curator-page-assets/script-4.ts +400 -0
  149. package/dist/builtin/web-access/curator-page-assets/script-5.ts +398 -0
  150. package/dist/builtin/web-access/curator-page-assets/styles-1.ts +394 -0
  151. package/dist/builtin/web-access/curator-page-assets/styles-2.ts +394 -0
  152. package/dist/builtin/web-access/curator-page-assets/styles-3.ts +393 -0
  153. package/dist/builtin/web-access/curator-page.ts +17 -3180
  154. package/dist/builtin/web-access/curator-server-helpers.ts +115 -0
  155. package/dist/builtin/web-access/curator-server.ts +2 -113
  156. package/dist/builtin/web-access/exa-mcp.ts +218 -0
  157. package/dist/builtin/web-access/exa.ts +2 -207
  158. package/dist/builtin/web-access/extract-frames.ts +228 -0
  159. package/dist/builtin/web-access/extract.ts +13 -214
  160. package/dist/builtin/web-access/github-config.ts +156 -0
  161. package/dist/builtin/web-access/github-extract.ts +3 -154
  162. package/dist/builtin/web-access/index-heavy.ts +8 -1904
  163. package/dist/builtin/web-access/package.json +2 -1
  164. package/dist/builtin/web-access/web-search-activity.ts +102 -0
  165. package/dist/builtin/web-access/web-search-browser.ts +116 -0
  166. package/dist/builtin/web-access/web-search-command.ts +242 -0
  167. package/dist/builtin/web-access/web-search-config.ts +163 -0
  168. package/dist/builtin/web-access/web-search-curator.ts +214 -0
  169. package/dist/builtin/web-access/web-search-features.ts +165 -0
  170. package/dist/builtin/web-access/web-search-formatting.ts +117 -0
  171. package/dist/builtin/web-access/web-search-return.ts +136 -0
  172. package/dist/builtin/web-access/web-search-summary.ts +170 -0
  173. package/dist/builtin/web-access/web-search-tool.ts +290 -0
  174. package/dist/builtin/web-access/web-search-types.ts +50 -0
  175. package/dist/builtin/workflows/CHANGELOG.md +8 -1
  176. package/dist/builtin/workflows/builtin/deep-research-codebase-runner.ts +492 -0
  177. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +346 -0
  178. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +6 -822
  179. package/dist/builtin/workflows/builtin/goal-artifacts.ts +43 -0
  180. package/dist/builtin/workflows/builtin/goal-ledger.ts +54 -0
  181. package/dist/builtin/workflows/builtin/goal-prompts.ts +360 -0
  182. package/dist/builtin/workflows/builtin/goal-reducer.ts +141 -0
  183. package/dist/builtin/workflows/builtin/goal-reports.ts +56 -0
  184. package/dist/builtin/workflows/builtin/goal-review.ts +84 -0
  185. package/dist/builtin/workflows/builtin/goal-runner.ts +343 -0
  186. package/dist/builtin/workflows/builtin/goal-schemas.ts +60 -0
  187. package/dist/builtin/workflows/builtin/goal-types.ts +132 -0
  188. package/dist/builtin/workflows/builtin/goal.ts +4 -1160
  189. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +432 -0
  190. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +477 -0
  191. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +312 -0
  192. package/dist/builtin/workflows/builtin/open-claude-design.ts +7 -1083
  193. package/dist/builtin/workflows/builtin/ralph-core.ts +408 -0
  194. package/dist/builtin/workflows/builtin/ralph-models.ts +123 -0
  195. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +89 -0
  196. package/dist/builtin/workflows/builtin/ralph-runner.ts +499 -0
  197. package/dist/builtin/workflows/builtin/ralph.ts +7 -1015
  198. package/dist/builtin/workflows/package.json +1 -1
  199. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +2 -2
  200. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +2 -2
  201. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +2 -2
  202. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +8 -1
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +13 -15
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live-manual-edit-evidence.mjs +2 -2
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +9 -0
  206. package/dist/builtin/workflows/src/extension/atomic-stage-session.ts +186 -0
  207. package/dist/builtin/workflows/src/extension/config-file-loader.ts +152 -0
  208. package/dist/builtin/workflows/src/extension/config-loader.ts +2 -167
  209. package/dist/builtin/workflows/src/extension/discovery-loaders.ts +115 -0
  210. package/dist/builtin/workflows/src/extension/discovery.ts +3 -117
  211. package/dist/builtin/workflows/src/extension/dispatcher.ts +3 -0
  212. package/dist/builtin/workflows/src/extension/extension-factory.ts +120 -0
  213. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +109 -0
  214. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +270 -0
  215. package/dist/builtin/workflows/src/extension/index.ts +42 -4151
  216. package/dist/builtin/workflows/src/extension/public-types.ts +295 -0
  217. package/dist/builtin/workflows/src/extension/render-component.ts +14 -0
  218. package/dist/builtin/workflows/src/extension/runtime-direct.ts +96 -0
  219. package/dist/builtin/workflows/src/extension/runtime.ts +8 -92
  220. package/dist/builtin/workflows/src/extension/ui-surface.ts +286 -0
  221. package/dist/builtin/workflows/src/extension/wiring.ts +6 -475
  222. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +111 -0
  223. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +213 -0
  224. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +81 -0
  225. package/dist/builtin/workflows/src/extension/workflow-command-utils.ts +181 -0
  226. package/dist/builtin/workflows/src/extension/workflow-policy.ts +15 -0
  227. package/dist/builtin/workflows/src/extension/workflow-ports.ts +41 -0
  228. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +23 -0
  229. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +286 -0
  230. package/dist/builtin/workflows/src/extension/workflow-schema.ts +1 -1
  231. package/dist/builtin/workflows/src/extension/workflow-stage-results.ts +264 -0
  232. package/dist/builtin/workflows/src/extension/workflow-targets.ts +181 -0
  233. package/dist/builtin/workflows/src/extension/workflow-tool-content.ts +175 -0
  234. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +205 -0
  235. package/dist/builtin/workflows/src/extension/workflow-tool-helpers.ts +66 -0
  236. package/dist/builtin/workflows/src/extension/workflow-tool-inspection.ts +164 -0
  237. package/dist/builtin/workflows/src/extension/workflow-tool-registration.ts +54 -0
  238. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +164 -0
  239. package/dist/builtin/workflows/src/extension/workflow-tool.ts +102 -0
  240. package/dist/builtin/workflows/src/runs/foreground/executor-abort.ts +431 -0
  241. package/dist/builtin/workflows/src/runs/foreground/executor-child-boundary.ts +232 -0
  242. package/dist/builtin/workflows/src/runs/foreground/executor-child-helpers.ts +74 -0
  243. package/dist/builtin/workflows/src/runs/foreground/executor-child-workflow.ts +158 -0
  244. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +167 -0
  245. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +450 -0
  246. package/dist/builtin/workflows/src/runs/foreground/executor-direct.ts +233 -0
  247. package/dist/builtin/workflows/src/runs/foreground/executor-exit-manager.ts +195 -0
  248. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +368 -0
  249. package/dist/builtin/workflows/src/runs/foreground/executor-inputs.ts +83 -0
  250. package/dist/builtin/workflows/src/runs/foreground/executor-lifecycle.ts +441 -0
  251. package/dist/builtin/workflows/src/runs/foreground/executor-outputs.ts +160 -0
  252. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +274 -0
  253. package/dist/builtin/workflows/src/runs/foreground/executor-run-finalizers.ts +122 -0
  254. package/dist/builtin/workflows/src/runs/foreground/executor-run.ts +359 -0
  255. package/dist/builtin/workflows/src/runs/foreground/executor-scheduler.ts +204 -0
  256. package/dist/builtin/workflows/src/runs/foreground/executor-stage-call.ts +197 -0
  257. package/dist/builtin/workflows/src/runs/foreground/executor-stage-context.ts +120 -0
  258. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +126 -0
  259. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +351 -0
  260. package/dist/builtin/workflows/src/runs/foreground/executor-stage-replay.ts +134 -0
  261. package/dist/builtin/workflows/src/runs/foreground/executor-stage-types.ts +54 -0
  262. package/dist/builtin/workflows/src/runs/foreground/executor-task-context.ts +132 -0
  263. package/dist/builtin/workflows/src/runs/foreground/executor-task-prompts.ts +293 -0
  264. package/dist/builtin/workflows/src/runs/foreground/executor-types.ts +109 -0
  265. package/dist/builtin/workflows/src/runs/foreground/executor.ts +19 -5258
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +219 -0
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +500 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +129 -0
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-options.ts +53 -0
  270. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +146 -0
  271. package/dist/builtin/workflows/src/runs/foreground/stage-runner-session.ts +55 -0
  272. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +82 -0
  273. package/dist/builtin/workflows/src/runs/foreground/stage-runner-types.ts +141 -0
  274. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +13 -1342
  275. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +453 -0
  276. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +442 -0
  277. package/dist/builtin/workflows/src/runs/shared/model-fallback.ts +2 -836
  278. package/dist/builtin/workflows/src/runs/shared/worktree-diff.ts +165 -0
  279. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +220 -0
  280. package/dist/builtin/workflows/src/runs/shared/worktree-setup.ts +335 -0
  281. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +92 -0
  282. package/dist/builtin/workflows/src/runs/shared/worktree.ts +18 -791
  283. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +365 -0
  284. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +425 -0
  285. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +236 -0
  286. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +354 -0
  287. package/dist/builtin/workflows/src/shared/authoring-contract.d.ts +5 -598
  288. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +428 -0
  289. package/dist/builtin/workflows/src/shared/persistence-restore.ts +11 -431
  290. package/dist/builtin/workflows/src/shared/store-factory.ts +16 -0
  291. package/dist/builtin/workflows/src/shared/store-internal.ts +219 -0
  292. package/dist/builtin/workflows/src/shared/store-prompt-methods.ts +219 -0
  293. package/dist/builtin/workflows/src/shared/store-public-types.ts +215 -0
  294. package/dist/builtin/workflows/src/shared/store-run-methods.ts +223 -0
  295. package/dist/builtin/workflows/src/shared/store-stage-methods.ts +305 -0
  296. package/dist/builtin/workflows/src/shared/store.ts +11 -1138
  297. package/dist/builtin/workflows/src/shared/workflow-failures-classifier.ts +266 -0
  298. package/dist/builtin/workflows/src/shared/workflow-failures-contract.ts +75 -0
  299. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +477 -0
  300. package/dist/builtin/workflows/src/shared/workflow-failures-signals.ts +248 -0
  301. package/dist/builtin/workflows/src/shared/workflow-failures.ts +13 -1001
  302. package/dist/builtin/workflows/src/tui/chat-surface.ts +0 -66
  303. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +45 -0
  304. package/dist/builtin/workflows/src/tui/graph-view-graph-render.ts +161 -0
  305. package/dist/builtin/workflows/src/tui/graph-view-input.ts +333 -0
  306. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +336 -0
  307. package/dist/builtin/workflows/src/tui/graph-view-render.ts +194 -0
  308. package/dist/builtin/workflows/src/tui/graph-view-state.ts +306 -0
  309. package/dist/builtin/workflows/src/tui/graph-view-types.ts +70 -0
  310. package/dist/builtin/workflows/src/tui/graph-view.ts +4 -1386
  311. package/dist/builtin/workflows/src/tui/inline-form-editor-text.ts +121 -0
  312. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +11 -223
  313. package/dist/builtin/workflows/src/tui/inputs-picker-editing.ts +151 -0
  314. package/dist/builtin/workflows/src/tui/inputs-picker-input.ts +305 -0
  315. package/dist/builtin/workflows/src/tui/inputs-picker-render.ts +300 -0
  316. package/dist/builtin/workflows/src/tui/inputs-picker-types.ts +190 -0
  317. package/dist/builtin/workflows/src/tui/inputs-picker.ts +19 -997
  318. package/dist/builtin/workflows/src/tui/prompt-card-input.ts +226 -0
  319. package/dist/builtin/workflows/src/tui/prompt-card-render.ts +373 -0
  320. package/dist/builtin/workflows/src/tui/prompt-card-select.ts +116 -0
  321. package/dist/builtin/workflows/src/tui/prompt-card-state.ts +61 -0
  322. package/dist/builtin/workflows/src/tui/prompt-card-text.ts +129 -0
  323. package/dist/builtin/workflows/src/tui/prompt-card.ts +8 -910
  324. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +315 -0
  325. package/dist/builtin/workflows/src/tui/stage-chat-view-custom-ui.ts +127 -0
  326. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +187 -0
  327. package/dist/builtin/workflows/src/tui/stage-chat-view-input.ts +222 -0
  328. package/dist/builtin/workflows/src/tui/stage-chat-view-render-helpers.ts +152 -0
  329. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +464 -0
  330. package/dist/builtin/workflows/src/tui/stage-chat-view-transcript.ts +242 -0
  331. package/dist/builtin/workflows/src/tui/stage-chat-view-types.ts +151 -0
  332. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +141 -1777
  333. package/dist/builtin/workflows/src/tui/workflow-attach-pane-types.ts +85 -0
  334. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +1 -129
  335. package/dist/config-self-update.d.ts +21 -0
  336. package/dist/config-self-update.d.ts.map +1 -0
  337. package/dist/config-self-update.js +265 -0
  338. package/dist/config-self-update.js.map +1 -0
  339. package/dist/config.d.ts +3 -12
  340. package/dist/config.d.ts.map +1 -1
  341. package/dist/config.js +15 -252
  342. package/dist/config.js.map +1 -1
  343. package/dist/core/agent-session-accessors.d.ts +3 -0
  344. package/dist/core/agent-session-accessors.d.ts.map +1 -0
  345. package/dist/core/agent-session-accessors.js +36 -0
  346. package/dist/core/agent-session-accessors.js.map +1 -0
  347. package/dist/core/agent-session-auto-compaction.d.ts +32 -0
  348. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -0
  349. package/dist/core/agent-session-auto-compaction.js +214 -0
  350. package/dist/core/agent-session-auto-compaction.js.map +1 -0
  351. package/dist/core/agent-session-bash.d.ts +30 -0
  352. package/dist/core/agent-session-bash.d.ts.map +1 -0
  353. package/dist/core/agent-session-bash.js +84 -0
  354. package/dist/core/agent-session-bash.js.map +1 -0
  355. package/dist/core/agent-session-compaction.d.ts +44 -0
  356. package/dist/core/agent-session-compaction.d.ts.map +1 -0
  357. package/dist/core/agent-session-compaction.js +282 -0
  358. package/dist/core/agent-session-compaction.js.map +1 -0
  359. package/dist/core/agent-session-events.d.ts +65 -0
  360. package/dist/core/agent-session-events.d.ts.map +1 -0
  361. package/dist/core/agent-session-events.js +373 -0
  362. package/dist/core/agent-session-events.js.map +1 -0
  363. package/dist/core/agent-session-export.d.ts +42 -0
  364. package/dist/core/agent-session-export.d.ts.map +1 -0
  365. package/dist/core/agent-session-export.js +199 -0
  366. package/dist/core/agent-session-export.js.map +1 -0
  367. package/dist/core/agent-session-extension-bindings.d.ts +37 -0
  368. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -0
  369. package/dist/core/agent-session-extension-bindings.js +231 -0
  370. package/dist/core/agent-session-extension-bindings.js.map +1 -0
  371. package/dist/core/agent-session-message-queue.d.ts +85 -0
  372. package/dist/core/agent-session-message-queue.d.ts.map +1 -0
  373. package/dist/core/agent-session-message-queue.js +264 -0
  374. package/dist/core/agent-session-message-queue.js.map +1 -0
  375. package/dist/core/agent-session-methods.d.ts +302 -0
  376. package/dist/core/agent-session-methods.d.ts.map +1 -0
  377. package/dist/core/agent-session-methods.js +2 -0
  378. package/dist/core/agent-session-methods.js.map +1 -0
  379. package/dist/core/agent-session-models.d.ts +111 -0
  380. package/dist/core/agent-session-models.d.ts.map +1 -0
  381. package/dist/core/agent-session-models.js +368 -0
  382. package/dist/core/agent-session-models.js.map +1 -0
  383. package/dist/core/agent-session-prompt.d.ts +61 -0
  384. package/dist/core/agent-session-prompt.d.ts.map +1 -0
  385. package/dist/core/agent-session-prompt.js +330 -0
  386. package/dist/core/agent-session-prompt.js.map +1 -0
  387. package/dist/core/agent-session-retry.d.ts +62 -0
  388. package/dist/core/agent-session-retry.d.ts.map +1 -0
  389. package/dist/core/agent-session-retry.js +202 -0
  390. package/dist/core/agent-session-retry.js.map +1 -0
  391. package/dist/core/agent-session-skill-block.d.ts +13 -0
  392. package/dist/core/agent-session-skill-block.d.ts.map +1 -0
  393. package/dist/core/agent-session-skill-block.js +37 -0
  394. package/dist/core/agent-session-skill-block.js.map +1 -0
  395. package/dist/core/agent-session-state.d.ts +48 -0
  396. package/dist/core/agent-session-state.d.ts.map +1 -0
  397. package/dist/core/agent-session-state.js +129 -0
  398. package/dist/core/agent-session-state.js.map +1 -0
  399. package/dist/core/agent-session-tool-hooks.d.ts +7 -0
  400. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -0
  401. package/dist/core/agent-session-tool-hooks.js +72 -0
  402. package/dist/core/agent-session-tool-hooks.js.map +1 -0
  403. package/dist/core/agent-session-tool-registry.d.ts +15 -0
  404. package/dist/core/agent-session-tool-registry.d.ts.map +1 -0
  405. package/dist/core/agent-session-tool-registry.js +151 -0
  406. package/dist/core/agent-session-tool-registry.js.map +1 -0
  407. package/dist/core/agent-session-tree.d.ts +46 -0
  408. package/dist/core/agent-session-tree.d.ts.map +1 -0
  409. package/dist/core/agent-session-tree.js +217 -0
  410. package/dist/core/agent-session-tree.js.map +1 -0
  411. package/dist/core/agent-session-types.d.ts +159 -0
  412. package/dist/core/agent-session-types.d.ts.map +1 -0
  413. package/dist/core/agent-session-types.js +41 -0
  414. package/dist/core/agent-session-types.js.map +1 -0
  415. package/dist/core/agent-session.d.ts +68 -688
  416. package/dist/core/agent-session.d.ts.map +1 -1
  417. package/dist/core/agent-session.js +26 -3152
  418. package/dist/core/agent-session.js.map +1 -1
  419. package/dist/core/auth-storage-backends.d.ts +49 -0
  420. package/dist/core/auth-storage-backends.d.ts.map +1 -0
  421. package/dist/core/auth-storage-backends.js +185 -0
  422. package/dist/core/auth-storage-backends.js.map +1 -0
  423. package/dist/core/auth-storage.d.ts +2 -49
  424. package/dist/core/auth-storage.d.ts.map +1 -1
  425. package/dist/core/auth-storage.js +3 -183
  426. package/dist/core/auth-storage.js.map +1 -1
  427. package/dist/core/compaction/context-compaction-metrics.d.ts +16 -0
  428. package/dist/core/compaction/context-compaction-metrics.d.ts.map +1 -0
  429. package/dist/core/compaction/context-compaction-metrics.js +58 -0
  430. package/dist/core/compaction/context-compaction-metrics.js.map +1 -0
  431. package/dist/core/compaction/context-compaction-prompt.d.ts +9 -0
  432. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -0
  433. package/dist/core/compaction/context-compaction-prompt.js +161 -0
  434. package/dist/core/compaction/context-compaction-prompt.js.map +1 -0
  435. package/dist/core/compaction/context-compaction-runner.d.ts +5 -0
  436. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -0
  437. package/dist/core/compaction/context-compaction-runner.js +181 -0
  438. package/dist/core/compaction/context-compaction-runner.js.map +1 -0
  439. package/dist/core/compaction/context-compaction-strategy.d.ts +5 -0
  440. package/dist/core/compaction/context-compaction-strategy.d.ts.map +1 -0
  441. package/dist/core/compaction/context-compaction-strategy.js +27 -0
  442. package/dist/core/compaction/context-compaction-strategy.js.map +1 -0
  443. package/dist/core/compaction/context-compaction-types.d.ts +73 -0
  444. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -0
  445. package/dist/core/compaction/context-compaction-types.js +6 -0
  446. package/dist/core/compaction/context-compaction-types.js.map +1 -0
  447. package/dist/core/compaction/context-compaction.d.ts +9 -200
  448. package/dist/core/compaction/context-compaction.d.ts.map +1 -1
  449. package/dist/core/compaction/context-compaction.js +7 -1943
  450. package/dist/core/compaction/context-compaction.js.map +1 -1
  451. package/dist/core/compaction/context-deletion-application.d.ts +13 -0
  452. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -0
  453. package/dist/core/compaction/context-deletion-application.js +259 -0
  454. package/dist/core/compaction/context-deletion-application.js.map +1 -0
  455. package/dist/core/compaction/context-deletion-store.d.ts +78 -0
  456. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -0
  457. package/dist/core/compaction/context-deletion-store.js +162 -0
  458. package/dist/core/compaction/context-deletion-store.js.map +1 -0
  459. package/dist/core/compaction/context-deletion-targets.d.ts +40 -0
  460. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -0
  461. package/dist/core/compaction/context-deletion-targets.js +267 -0
  462. package/dist/core/compaction/context-deletion-targets.js.map +1 -0
  463. package/dist/core/compaction/context-deletion-tool-definitions.d.ts +187 -0
  464. package/dist/core/compaction/context-deletion-tool-definitions.d.ts.map +1 -0
  465. package/dist/core/compaction/context-deletion-tool-definitions.js +98 -0
  466. package/dist/core/compaction/context-deletion-tool-definitions.js.map +1 -0
  467. package/dist/core/compaction/context-deletion-tool-helpers.d.ts +19 -0
  468. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -0
  469. package/dist/core/compaction/context-deletion-tool-helpers.js +137 -0
  470. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -0
  471. package/dist/core/compaction/context-deletion-tools.d.ts +4 -0
  472. package/dist/core/compaction/context-deletion-tools.d.ts.map +1 -0
  473. package/dist/core/compaction/context-deletion-tools.js +395 -0
  474. package/dist/core/compaction/context-deletion-tools.js.map +1 -0
  475. package/dist/core/compaction/context-transcript-analysis.d.ts +9 -0
  476. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -0
  477. package/dist/core/compaction/context-transcript-analysis.js +234 -0
  478. package/dist/core/compaction/context-transcript-analysis.js.map +1 -0
  479. package/dist/core/export-html/index.d.ts.map +1 -1
  480. package/dist/core/export-html/index.js +2 -1
  481. package/dist/core/export-html/index.js.map +1 -1
  482. package/dist/core/export-html/template-js/data-tree.js +287 -0
  483. package/dist/core/export-html/template-js/entries-navigation.js +424 -0
  484. package/dist/core/export-html/template-js/initialization.js +312 -0
  485. package/dist/core/export-html/template-js/message-tools.js +415 -0
  486. package/dist/core/export-html/template-js/tree-filter-render.js +421 -0
  487. package/dist/core/export-html/template-script.d.ts +3 -0
  488. package/dist/core/export-html/template-script.d.ts.map +1 -0
  489. package/dist/core/export-html/template-script.js +13 -0
  490. package/dist/core/export-html/template-script.js.map +1 -0
  491. package/dist/core/export-html/template.js +3 -1
  492. package/dist/core/extensions/agent-events.d.ts +159 -0
  493. package/dist/core/extensions/agent-events.d.ts.map +1 -0
  494. package/dist/core/extensions/agent-events.js +2 -0
  495. package/dist/core/extensions/agent-events.js.map +1 -0
  496. package/dist/core/extensions/api-types.d.ts +189 -0
  497. package/dist/core/extensions/api-types.d.ts.map +1 -0
  498. package/dist/core/extensions/api-types.js +2 -0
  499. package/dist/core/extensions/api-types.js.map +1 -0
  500. package/dist/core/extensions/command-types.d.ts +14 -0
  501. package/dist/core/extensions/command-types.d.ts.map +1 -0
  502. package/dist/core/extensions/command-types.js +2 -0
  503. package/dist/core/extensions/command-types.js.map +1 -0
  504. package/dist/core/extensions/context-types.d.ts +130 -0
  505. package/dist/core/extensions/context-types.d.ts.map +1 -0
  506. package/dist/core/extensions/context-types.js +2 -0
  507. package/dist/core/extensions/context-types.js.map +1 -0
  508. package/dist/core/extensions/event-results.d.ts +61 -0
  509. package/dist/core/extensions/event-results.d.ts.map +1 -0
  510. package/dist/core/extensions/event-results.js +2 -0
  511. package/dist/core/extensions/event-results.js.map +1 -0
  512. package/dist/core/extensions/event-types.d.ts +6 -0
  513. package/dist/core/extensions/event-types.d.ts.map +1 -0
  514. package/dist/core/extensions/event-types.js +2 -0
  515. package/dist/core/extensions/event-types.js.map +1 -0
  516. package/dist/core/extensions/loader-api.d.ts +10 -0
  517. package/dist/core/extensions/loader-api.d.ts.map +1 -0
  518. package/dist/core/extensions/loader-api.js +143 -0
  519. package/dist/core/extensions/loader-api.js.map +1 -0
  520. package/dist/core/extensions/loader-core.d.ts +12 -0
  521. package/dist/core/extensions/loader-core.d.ts.map +1 -0
  522. package/dist/core/extensions/loader-core.js +91 -0
  523. package/dist/core/extensions/loader-core.js.map +1 -0
  524. package/dist/core/extensions/loader-discovery.d.ts +7 -0
  525. package/dist/core/extensions/loader-discovery.d.ts.map +1 -0
  526. package/dist/core/extensions/loader-discovery.js +139 -0
  527. package/dist/core/extensions/loader-discovery.js.map +1 -0
  528. package/dist/core/extensions/loader-resources.d.ts +11 -0
  529. package/dist/core/extensions/loader-resources.d.ts.map +1 -0
  530. package/dist/core/extensions/loader-resources.js +10 -0
  531. package/dist/core/extensions/loader-resources.js.map +1 -0
  532. package/dist/core/extensions/loader-runtime.d.ts +7 -0
  533. package/dist/core/extensions/loader-runtime.d.ts.map +1 -0
  534. package/dist/core/extensions/loader-runtime.js +51 -0
  535. package/dist/core/extensions/loader-runtime.js.map +1 -0
  536. package/dist/core/extensions/loader-virtual-modules.d.ts +3 -0
  537. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -0
  538. package/dist/core/extensions/loader-virtual-modules.js +92 -0
  539. package/dist/core/extensions/loader-virtual-modules.js.map +1 -0
  540. package/dist/core/extensions/loader.d.ts +4 -28
  541. package/dist/core/extensions/loader.d.ts.map +1 -1
  542. package/dist/core/extensions/loader.js +3 -542
  543. package/dist/core/extensions/loader.js.map +1 -1
  544. package/dist/core/extensions/message-types.d.ts +34 -0
  545. package/dist/core/extensions/message-types.d.ts.map +1 -0
  546. package/dist/core/extensions/message-types.js +2 -0
  547. package/dist/core/extensions/message-types.js.map +1 -0
  548. package/dist/core/extensions/provider-types.d.ts +71 -0
  549. package/dist/core/extensions/provider-types.d.ts.map +1 -0
  550. package/dist/core/extensions/provider-types.js +2 -0
  551. package/dist/core/extensions/provider-types.js.map +1 -0
  552. package/dist/core/extensions/runner-context.d.ts +42 -0
  553. package/dist/core/extensions/runner-context.d.ts.map +1 -0
  554. package/dist/core/extensions/runner-context.js +112 -0
  555. package/dist/core/extensions/runner-context.js.map +1 -0
  556. package/dist/core/extensions/runner-events.d.ts +47 -0
  557. package/dist/core/extensions/runner-events.d.ts.map +1 -0
  558. package/dist/core/extensions/runner-events.js +280 -0
  559. package/dist/core/extensions/runner-events.js.map +1 -0
  560. package/dist/core/extensions/runner-handlers.d.ts +32 -0
  561. package/dist/core/extensions/runner-handlers.d.ts.map +1 -0
  562. package/dist/core/extensions/runner-handlers.js +2 -0
  563. package/dist/core/extensions/runner-handlers.js.map +1 -0
  564. package/dist/core/extensions/runner-project-trust.d.ts +6 -0
  565. package/dist/core/extensions/runner-project-trust.d.ts.map +1 -0
  566. package/dist/core/extensions/runner-project-trust.js +27 -0
  567. package/dist/core/extensions/runner-project-trust.js.map +1 -0
  568. package/dist/core/extensions/runner-registries.d.ts +8 -0
  569. package/dist/core/extensions/runner-registries.d.ts.map +1 -0
  570. package/dist/core/extensions/runner-registries.js +76 -0
  571. package/dist/core/extensions/runner-registries.js.map +1 -0
  572. package/dist/core/extensions/runner-shortcuts.d.ts +10 -0
  573. package/dist/core/extensions/runner-shortcuts.d.ts.map +1 -0
  574. package/dist/core/extensions/runner-shortcuts.js +71 -0
  575. package/dist/core/extensions/runner-shortcuts.js.map +1 -0
  576. package/dist/core/extensions/runner-ui.d.ts +3 -0
  577. package/dist/core/extensions/runner-ui.d.ts.map +1 -0
  578. package/dist/core/extensions/runner-ui.js +50 -0
  579. package/dist/core/extensions/runner-ui.js.map +1 -0
  580. package/dist/core/extensions/runner.d.ts +7 -74
  581. package/dist/core/extensions/runner.d.ts.map +1 -1
  582. package/dist/core/extensions/runner.js +67 -673
  583. package/dist/core/extensions/runner.js.map +1 -1
  584. package/dist/core/extensions/runtime-types.d.ts +179 -0
  585. package/dist/core/extensions/runtime-types.d.ts.map +1 -0
  586. package/dist/core/extensions/runtime-types.js +2 -0
  587. package/dist/core/extensions/runtime-types.js.map +1 -0
  588. package/dist/core/extensions/session-events.d.ts +89 -0
  589. package/dist/core/extensions/session-events.d.ts.map +1 -0
  590. package/dist/core/extensions/session-events.js +2 -0
  591. package/dist/core/extensions/session-events.js.map +1 -0
  592. package/dist/core/extensions/tool-events.d.ts +127 -0
  593. package/dist/core/extensions/tool-events.d.ts.map +1 -0
  594. package/dist/core/extensions/tool-events.js +26 -0
  595. package/dist/core/extensions/tool-events.js.map +1 -0
  596. package/dist/core/extensions/tool-types.d.ts +100 -0
  597. package/dist/core/extensions/tool-types.d.ts.map +1 -0
  598. package/dist/core/extensions/tool-types.js +11 -0
  599. package/dist/core/extensions/tool-types.js.map +1 -0
  600. package/dist/core/extensions/types.d.ts +20 -1288
  601. package/dist/core/extensions/types.d.ts.map +1 -1
  602. package/dist/core/extensions/types.js +4 -34
  603. package/dist/core/extensions/types.js.map +1 -1
  604. package/dist/core/extensions/ui-types.d.ts +200 -0
  605. package/dist/core/extensions/ui-types.d.ts.map +1 -0
  606. package/dist/core/extensions/ui-types.js +2 -0
  607. package/dist/core/extensions/ui-types.js.map +1 -0
  608. package/dist/core/model-registry-auth.d.ts +7 -0
  609. package/dist/core/model-registry-auth.d.ts.map +1 -0
  610. package/dist/core/model-registry-auth.js +64 -0
  611. package/dist/core/model-registry-auth.js.map +1 -0
  612. package/dist/core/model-registry-builtins.d.ts +9 -0
  613. package/dist/core/model-registry-builtins.d.ts.map +1 -0
  614. package/dist/core/model-registry-builtins.js +120 -0
  615. package/dist/core/model-registry-builtins.js.map +1 -0
  616. package/dist/core/model-registry-custom-loader.d.ts +3 -0
  617. package/dist/core/model-registry-custom-loader.d.ts.map +1 -0
  618. package/dist/core/model-registry-custom-loader.js +213 -0
  619. package/dist/core/model-registry-custom-loader.js.map +1 -0
  620. package/dist/core/model-registry-dynamic.d.ts +6 -0
  621. package/dist/core/model-registry-dynamic.d.ts.map +1 -0
  622. package/dist/core/model-registry-dynamic.js +155 -0
  623. package/dist/core/model-registry-dynamic.js.map +1 -0
  624. package/dist/core/model-registry-loader.d.ts +4 -0
  625. package/dist/core/model-registry-loader.d.ts.map +1 -0
  626. package/dist/core/model-registry-loader.js +20 -0
  627. package/dist/core/model-registry-loader.js.map +1 -0
  628. package/dist/core/model-registry-schemas.d.ts +1084 -0
  629. package/dist/core/model-registry-schemas.d.ts.map +1 -0
  630. package/dist/core/model-registry-schemas.js +161 -0
  631. package/dist/core/model-registry-schemas.js.map +1 -0
  632. package/dist/core/model-registry-types.d.ts +74 -0
  633. package/dist/core/model-registry-types.d.ts.map +1 -0
  634. package/dist/core/model-registry-types.js +2 -0
  635. package/dist/core/model-registry-types.js.map +1 -0
  636. package/dist/core/model-registry.d.ts +3 -76
  637. package/dist/core/model-registry.d.ts.map +1 -1
  638. package/dist/core/model-registry.js +24 -733
  639. package/dist/core/model-registry.js.map +1 -1
  640. package/dist/core/model-resolver-cli.d.ts +19 -0
  641. package/dist/core/model-resolver-cli.d.ts.map +1 -0
  642. package/dist/core/model-resolver-cli.js +118 -0
  643. package/dist/core/model-resolver-cli.js.map +1 -0
  644. package/dist/core/model-resolver-defaults.d.ts +5 -0
  645. package/dist/core/model-resolver-defaults.d.ts.map +1 -0
  646. package/dist/core/model-resolver-defaults.js +47 -0
  647. package/dist/core/model-resolver-defaults.js.map +1 -0
  648. package/dist/core/model-resolver-initial.d.ts +31 -0
  649. package/dist/core/model-resolver-initial.d.ts.map +1 -0
  650. package/dist/core/model-resolver-initial.js +116 -0
  651. package/dist/core/model-resolver-initial.js.map +1 -0
  652. package/dist/core/model-resolver-patterns.d.ts +26 -0
  653. package/dist/core/model-resolver-patterns.d.ts.map +1 -0
  654. package/dist/core/model-resolver-patterns.js +139 -0
  655. package/dist/core/model-resolver-patterns.js.map +1 -0
  656. package/dist/core/model-resolver-scope.d.ts +15 -0
  657. package/dist/core/model-resolver-scope.d.ts.map +1 -0
  658. package/dist/core/model-resolver-scope.js +66 -0
  659. package/dist/core/model-resolver-scope.js.map +1 -0
  660. package/dist/core/model-resolver-types.d.ts +29 -0
  661. package/dist/core/model-resolver-types.d.ts.map +1 -0
  662. package/dist/core/model-resolver-types.js +2 -0
  663. package/dist/core/model-resolver-types.js.map +1 -0
  664. package/dist/core/model-resolver.d.ts +6 -107
  665. package/dist/core/model-resolver.d.ts.map +1 -1
  666. package/dist/core/model-resolver.js +5 -549
  667. package/dist/core/model-resolver.js.map +1 -1
  668. package/dist/core/package-manager-auto-resources.d.ts +5 -0
  669. package/dist/core/package-manager-auto-resources.d.ts.map +1 -0
  670. package/dist/core/package-manager-auto-resources.js +109 -0
  671. package/dist/core/package-manager-auto-resources.js.map +1 -0
  672. package/dist/core/package-manager-command.d.ts +11 -0
  673. package/dist/core/package-manager-command.d.ts.map +1 -0
  674. package/dist/core/package-manager-command.js +102 -0
  675. package/dist/core/package-manager-command.js.map +1 -0
  676. package/dist/core/package-manager-constants.d.ts +4 -0
  677. package/dist/core/package-manager-constants.d.ts.map +1 -0
  678. package/dist/core/package-manager-constants.js +4 -0
  679. package/dist/core/package-manager-constants.js.map +1 -0
  680. package/dist/core/package-manager-env.d.ts +4 -0
  681. package/dist/core/package-manager-env.d.ts.map +1 -0
  682. package/dist/core/package-manager-env.js +40 -0
  683. package/dist/core/package-manager-env.js.map +1 -0
  684. package/dist/core/package-manager-git.d.ts +10 -0
  685. package/dist/core/package-manager-git.d.ts.map +1 -0
  686. package/dist/core/package-manager-git.js +271 -0
  687. package/dist/core/package-manager-git.js.map +1 -0
  688. package/dist/core/package-manager-manifest.d.ts +7 -0
  689. package/dist/core/package-manager-manifest.d.ts.map +1 -0
  690. package/dist/core/package-manager-manifest.js +45 -0
  691. package/dist/core/package-manager-manifest.js.map +1 -0
  692. package/dist/core/package-manager-npm.d.ts +25 -0
  693. package/dist/core/package-manager-npm.d.ts.map +1 -0
  694. package/dist/core/package-manager-npm.js +252 -0
  695. package/dist/core/package-manager-npm.js.map +1 -0
  696. package/dist/core/package-manager-operations.d.ts +11 -0
  697. package/dist/core/package-manager-operations.d.ts.map +1 -0
  698. package/dist/core/package-manager-operations.js +196 -0
  699. package/dist/core/package-manager-operations.js.map +1 -0
  700. package/dist/core/package-manager-paths.d.ts +14 -0
  701. package/dist/core/package-manager-paths.d.ts.map +1 -0
  702. package/dist/core/package-manager-paths.js +61 -0
  703. package/dist/core/package-manager-paths.js.map +1 -0
  704. package/dist/core/package-manager-progress.d.ts +4 -0
  705. package/dist/core/package-manager-progress.d.ts.map +1 -0
  706. package/dist/core/package-manager-progress.js +16 -0
  707. package/dist/core/package-manager-progress.js.map +1 -0
  708. package/dist/core/package-manager-resolver.d.ts +5 -0
  709. package/dist/core/package-manager-resolver.d.ts.map +1 -0
  710. package/dist/core/package-manager-resolver.js +149 -0
  711. package/dist/core/package-manager-resolver.js.map +1 -0
  712. package/dist/core/package-manager-resource-accumulator.d.ts +6 -0
  713. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -0
  714. package/dist/core/package-manager-resource-accumulator.js +67 -0
  715. package/dist/core/package-manager-resource-accumulator.js.map +1 -0
  716. package/dist/core/package-manager-resource-collector.d.ts +5 -0
  717. package/dist/core/package-manager-resource-collector.d.ts.map +1 -0
  718. package/dist/core/package-manager-resource-collector.js +148 -0
  719. package/dist/core/package-manager-resource-collector.js.map +1 -0
  720. package/dist/core/package-manager-resource-files.d.ts +14 -0
  721. package/dist/core/package-manager-resource-files.d.ts.map +1 -0
  722. package/dist/core/package-manager-resource-files.js +265 -0
  723. package/dist/core/package-manager-resource-files.js.map +1 -0
  724. package/dist/core/package-manager-resource-patterns.d.ts +12 -0
  725. package/dist/core/package-manager-resource-patterns.d.ts.map +1 -0
  726. package/dist/core/package-manager-resource-patterns.js +136 -0
  727. package/dist/core/package-manager-resource-patterns.js.map +1 -0
  728. package/dist/core/package-manager-settings.d.ts +10 -0
  729. package/dist/core/package-manager-settings.d.ts.map +1 -0
  730. package/dist/core/package-manager-settings.js +91 -0
  731. package/dist/core/package-manager-settings.js.map +1 -0
  732. package/dist/core/package-manager-source.d.ts +21 -0
  733. package/dist/core/package-manager-source.d.ts.map +1 -0
  734. package/dist/core/package-manager-source.js +146 -0
  735. package/dist/core/package-manager-source.js.map +1 -0
  736. package/dist/core/package-manager-types.d.ts +169 -0
  737. package/dist/core/package-manager-types.d.ts.map +1 -0
  738. package/dist/core/package-manager-types.js +9 -0
  739. package/dist/core/package-manager-types.js.map +1 -0
  740. package/dist/core/package-manager.d.ts +9 -174
  741. package/dist/core/package-manager.d.ts.map +1 -1
  742. package/dist/core/package-manager.js +56 -2100
  743. package/dist/core/package-manager.js.map +1 -1
  744. package/dist/core/resource-loader-assets.d.ts +6 -0
  745. package/dist/core/resource-loader-assets.d.ts.map +1 -0
  746. package/dist/core/resource-loader-assets.js +209 -0
  747. package/dist/core/resource-loader-assets.js.map +1 -0
  748. package/dist/core/resource-loader-context-files.d.ts +10 -0
  749. package/dist/core/resource-loader-context-files.d.ts.map +1 -0
  750. package/dist/core/resource-loader-context-files.js +74 -0
  751. package/dist/core/resource-loader-context-files.js.map +1 -0
  752. package/dist/core/resource-loader-core.d.ts +82 -0
  753. package/dist/core/resource-loader-core.d.ts.map +1 -0
  754. package/dist/core/resource-loader-core.js +168 -0
  755. package/dist/core/resource-loader-core.js.map +1 -0
  756. package/dist/core/resource-loader-discovery.d.ts +4 -0
  757. package/dist/core/resource-loader-discovery.d.ts.map +1 -0
  758. package/dist/core/resource-loader-discovery.js +28 -0
  759. package/dist/core/resource-loader-discovery.js.map +1 -0
  760. package/dist/core/resource-loader-extensions.d.ts +13 -0
  761. package/dist/core/resource-loader-extensions.d.ts.map +1 -0
  762. package/dist/core/resource-loader-extensions.js +110 -0
  763. package/dist/core/resource-loader-extensions.js.map +1 -0
  764. package/dist/core/resource-loader-helpers.d.ts +4 -0
  765. package/dist/core/resource-loader-helpers.d.ts.map +1 -0
  766. package/dist/core/resource-loader-helpers.js +23 -0
  767. package/dist/core/resource-loader-helpers.js.map +1 -0
  768. package/dist/core/resource-loader-internals.d.ts +96 -0
  769. package/dist/core/resource-loader-internals.d.ts.map +1 -0
  770. package/dist/core/resource-loader-internals.js +4 -0
  771. package/dist/core/resource-loader-internals.js.map +1 -0
  772. package/dist/core/resource-loader-package-resources.d.ts +31 -0
  773. package/dist/core/resource-loader-package-resources.d.ts.map +1 -0
  774. package/dist/core/resource-loader-package-resources.js +112 -0
  775. package/dist/core/resource-loader-package-resources.js.map +1 -0
  776. package/dist/core/resource-loader-paths.d.ts +4 -0
  777. package/dist/core/resource-loader-paths.d.ts.map +1 -0
  778. package/dist/core/resource-loader-paths.js +22 -0
  779. package/dist/core/resource-loader-paths.js.map +1 -0
  780. package/dist/core/resource-loader-reload.d.ts +6 -0
  781. package/dist/core/resource-loader-reload.d.ts.map +1 -0
  782. package/dist/core/resource-loader-reload.js +226 -0
  783. package/dist/core/resource-loader-reload.js.map +1 -0
  784. package/dist/core/resource-loader-source-info.d.ts +9 -0
  785. package/dist/core/resource-loader-source-info.d.ts.map +1 -0
  786. package/dist/core/resource-loader-source-info.js +101 -0
  787. package/dist/core/resource-loader-source-info.js.map +1 -0
  788. package/dist/core/resource-loader-types.d.ts +130 -0
  789. package/dist/core/resource-loader-types.d.ts.map +1 -0
  790. package/dist/core/resource-loader-types.js +2 -0
  791. package/dist/core/resource-loader-types.js.map +1 -0
  792. package/dist/core/resource-loader.d.ts +3 -242
  793. package/dist/core/resource-loader.d.ts.map +1 -1
  794. package/dist/core/resource-loader.js +2 -976
  795. package/dist/core/resource-loader.js.map +1 -1
  796. package/dist/core/sdk-exports.d.ts +7 -0
  797. package/dist/core/sdk-exports.d.ts.map +1 -0
  798. package/dist/core/sdk-exports.js +5 -0
  799. package/dist/core/sdk-exports.js.map +1 -0
  800. package/dist/core/sdk-types.d.ts +86 -0
  801. package/dist/core/sdk-types.d.ts.map +1 -0
  802. package/dist/core/sdk-types.js +2 -0
  803. package/dist/core/sdk-types.js.map +1 -0
  804. package/dist/core/sdk.d.ts +3 -91
  805. package/dist/core/sdk.d.ts.map +1 -1
  806. package/dist/core/sdk.js +2 -6
  807. package/dist/core/sdk.js.map +1 -1
  808. package/dist/core/session-manager-archive.d.ts +27 -0
  809. package/dist/core/session-manager-archive.d.ts.map +1 -0
  810. package/dist/core/session-manager-archive.js +114 -0
  811. package/dist/core/session-manager-archive.js.map +1 -0
  812. package/dist/core/session-manager-core.d.ts +104 -0
  813. package/dist/core/session-manager-core.d.ts.map +1 -0
  814. package/dist/core/session-manager-core.js +346 -0
  815. package/dist/core/session-manager-core.js.map +1 -0
  816. package/dist/core/session-manager-entries.d.ts +38 -0
  817. package/dist/core/session-manager-entries.d.ts.map +1 -0
  818. package/dist/core/session-manager-entries.js +124 -0
  819. package/dist/core/session-manager-entries.js.map +1 -0
  820. package/dist/core/session-manager-history.d.ts +38 -0
  821. package/dist/core/session-manager-history.d.ts.map +1 -0
  822. package/dist/core/session-manager-history.js +378 -0
  823. package/dist/core/session-manager-history.js.map +1 -0
  824. package/dist/core/session-manager-list.d.ts +5 -0
  825. package/dist/core/session-manager-list.d.ts.map +1 -0
  826. package/dist/core/session-manager-list.js +196 -0
  827. package/dist/core/session-manager-list.js.map +1 -0
  828. package/dist/core/session-manager-migrations.d.ts +11 -0
  829. package/dist/core/session-manager-migrations.d.ts.map +1 -0
  830. package/dist/core/session-manager-migrations.js +80 -0
  831. package/dist/core/session-manager-migrations.js.map +1 -0
  832. package/dist/core/session-manager-paths.d.ts +7 -0
  833. package/dist/core/session-manager-paths.d.ts.map +1 -0
  834. package/dist/core/session-manager-paths.js +22 -0
  835. package/dist/core/session-manager-paths.js.map +1 -0
  836. package/dist/core/session-manager-storage.d.ts +15 -0
  837. package/dist/core/session-manager-storage.d.ts.map +1 -0
  838. package/dist/core/session-manager-storage.js +127 -0
  839. package/dist/core/session-manager-storage.js.map +1 -0
  840. package/dist/core/session-manager-types.d.ts +172 -0
  841. package/dist/core/session-manager-types.d.ts.map +1 -0
  842. package/dist/core/session-manager-types.js +2 -0
  843. package/dist/core/session-manager-types.js.map +1 -0
  844. package/dist/core/session-manager-validation.d.ts +7 -0
  845. package/dist/core/session-manager-validation.d.ts.map +1 -0
  846. package/dist/core/session-manager-validation.js +34 -0
  847. package/dist/core/session-manager-validation.js.map +1 -0
  848. package/dist/core/session-manager.d.ts +8 -390
  849. package/dist/core/session-manager.d.ts.map +1 -1
  850. package/dist/core/session-manager.js +7 -1418
  851. package/dist/core/session-manager.js.map +1 -1
  852. package/dist/core/settings-manager-basic-accessors.d.ts +65 -0
  853. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -0
  854. package/dist/core/settings-manager-basic-accessors.js +253 -0
  855. package/dist/core/settings-manager-basic-accessors.js.map +1 -0
  856. package/dist/core/settings-manager-core.d.ts +57 -0
  857. package/dist/core/settings-manager-core.d.ts.map +1 -0
  858. package/dist/core/settings-manager-core.js +387 -0
  859. package/dist/core/settings-manager-core.js.map +1 -0
  860. package/dist/core/settings-manager-internals.d.ts +13 -0
  861. package/dist/core/settings-manager-internals.d.ts.map +1 -0
  862. package/dist/core/settings-manager-internals.js +4 -0
  863. package/dist/core/settings-manager-internals.js.map +1 -0
  864. package/dist/core/settings-manager-resource-accessors.d.ts +43 -0
  865. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -0
  866. package/dist/core/settings-manager-resource-accessors.js +172 -0
  867. package/dist/core/settings-manager-resource-accessors.js.map +1 -0
  868. package/dist/core/settings-manager-ui-accessors.d.ts +44 -0
  869. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -0
  870. package/dist/core/settings-manager-ui-accessors.js +208 -0
  871. package/dist/core/settings-manager-ui-accessors.js.map +1 -0
  872. package/dist/core/settings-manager.d.ts +6 -321
  873. package/dist/core/settings-manager.d.ts.map +1 -1
  874. package/dist/core/settings-manager.js +5 -1060
  875. package/dist/core/settings-manager.js.map +1 -1
  876. package/dist/core/settings-merge.d.ts +4 -0
  877. package/dist/core/settings-merge.d.ts.map +1 -0
  878. package/dist/core/settings-merge.js +26 -0
  879. package/dist/core/settings-merge.js.map +1 -0
  880. package/dist/core/settings-storage.d.ts +20 -0
  881. package/dist/core/settings-storage.d.ts.map +1 -0
  882. package/dist/core/settings-storage.js +100 -0
  883. package/dist/core/settings-storage.js.map +1 -0
  884. package/dist/core/settings-types.d.ts +123 -0
  885. package/dist/core/settings-types.d.ts.map +1 -0
  886. package/dist/core/settings-types.js +2 -0
  887. package/dist/core/settings-types.js.map +1 -0
  888. package/dist/core/system-prompt.d.ts.map +1 -1
  889. package/dist/core/system-prompt.js +7 -0
  890. package/dist/core/system-prompt.js.map +1 -1
  891. package/dist/core/tools/bash-policy-compile.d.ts +5 -0
  892. package/dist/core/tools/bash-policy-compile.d.ts.map +1 -0
  893. package/dist/core/tools/bash-policy-compile.js +241 -0
  894. package/dist/core/tools/bash-policy-compile.js.map +1 -0
  895. package/dist/core/tools/bash-policy-evaluate.d.ts +3 -0
  896. package/dist/core/tools/bash-policy-evaluate.d.ts.map +1 -0
  897. package/dist/core/tools/bash-policy-evaluate.js +92 -0
  898. package/dist/core/tools/bash-policy-evaluate.js.map +1 -0
  899. package/dist/core/tools/bash-policy-format.d.ts +5 -0
  900. package/dist/core/tools/bash-policy-format.d.ts.map +1 -0
  901. package/dist/core/tools/bash-policy-format.js +49 -0
  902. package/dist/core/tools/bash-policy-format.js.map +1 -0
  903. package/dist/core/tools/bash-policy-parser.d.ts +4 -0
  904. package/dist/core/tools/bash-policy-parser.d.ts.map +1 -0
  905. package/dist/core/tools/bash-policy-parser.js +155 -0
  906. package/dist/core/tools/bash-policy-parser.js.map +1 -0
  907. package/dist/core/tools/bash-policy-segment.d.ts +3 -0
  908. package/dist/core/tools/bash-policy-segment.d.ts.map +1 -0
  909. package/dist/core/tools/bash-policy-segment.js +275 -0
  910. package/dist/core/tools/bash-policy-segment.js.map +1 -0
  911. package/dist/core/tools/bash-policy-shell.d.ts +11 -0
  912. package/dist/core/tools/bash-policy-shell.d.ts.map +1 -0
  913. package/dist/core/tools/bash-policy-shell.js +267 -0
  914. package/dist/core/tools/bash-policy-shell.js.map +1 -0
  915. package/dist/core/tools/bash-policy-types.d.ts +146 -0
  916. package/dist/core/tools/bash-policy-types.d.ts.map +1 -0
  917. package/dist/core/tools/bash-policy-types.js +2 -0
  918. package/dist/core/tools/bash-policy-types.js.map +1 -0
  919. package/dist/core/tools/bash-policy.d.ts +5 -61
  920. package/dist/core/tools/bash-policy.d.ts.map +1 -1
  921. package/dist/core/tools/bash-policy.js +4 -1068
  922. package/dist/core/tools/bash-policy.js.map +1 -1
  923. package/dist/core/tools/todos-execute.d.ts +5 -0
  924. package/dist/core/tools/todos-execute.d.ts.map +1 -0
  925. package/dist/core/tools/todos-execute.js +200 -0
  926. package/dist/core/tools/todos-execute.js.map +1 -0
  927. package/dist/core/tools/todos-locks.d.ts +4 -0
  928. package/dist/core/tools/todos-locks.d.ts.map +1 -0
  929. package/dist/core/tools/todos-locks.js +80 -0
  930. package/dist/core/tools/todos-locks.js.map +1 -0
  931. package/dist/core/tools/todos-model.d.ts +21 -0
  932. package/dist/core/tools/todos-model.d.ts.map +1 -0
  933. package/dist/core/tools/todos-model.js +71 -0
  934. package/dist/core/tools/todos-model.js.map +1 -0
  935. package/dist/core/tools/todos-mutations.d.ts +6 -0
  936. package/dist/core/tools/todos-mutations.d.ts.map +1 -0
  937. package/dist/core/tools/todos-mutations.js +85 -0
  938. package/dist/core/tools/todos-mutations.js.map +1 -0
  939. package/dist/core/tools/todos-paths.d.ts +5 -0
  940. package/dist/core/tools/todos-paths.d.ts.map +1 -0
  941. package/dist/core/tools/todos-paths.js +25 -0
  942. package/dist/core/tools/todos-paths.js.map +1 -0
  943. package/dist/core/tools/todos-render.d.ts +10 -0
  944. package/dist/core/tools/todos-render.d.ts.map +1 -0
  945. package/dist/core/tools/todos-render.js +159 -0
  946. package/dist/core/tools/todos-render.js.map +1 -0
  947. package/dist/core/tools/todos-storage.d.ts +9 -0
  948. package/dist/core/tools/todos-storage.d.ts.map +1 -0
  949. package/dist/core/tools/todos-storage.js +183 -0
  950. package/dist/core/tools/todos-storage.js.map +1 -0
  951. package/dist/core/tools/todos-types.d.ts +46 -0
  952. package/dist/core/tools/todos-types.d.ts.map +1 -0
  953. package/dist/core/tools/todos-types.js +27 -0
  954. package/dist/core/tools/todos-types.js.map +1 -0
  955. package/dist/core/tools/todos.d.ts +12 -32
  956. package/dist/core/tools/todos.d.ts.map +1 -1
  957. package/dist/core/tools/todos.js +7 -893
  958. package/dist/core/tools/todos.js.map +1 -1
  959. package/dist/index-extensions.d.ts +3 -0
  960. package/dist/index-extensions.d.ts.map +1 -0
  961. package/dist/index-extensions.js +2 -0
  962. package/dist/index-extensions.js.map +1 -0
  963. package/dist/index.d.ts +1 -2
  964. package/dist/index.d.ts.map +1 -1
  965. package/dist/index.js +1 -1
  966. package/dist/index.js.map +1 -1
  967. package/dist/main-app-mode.d.ts +15 -0
  968. package/dist/main-app-mode.d.ts.map +1 -0
  969. package/dist/main-app-mode.js +51 -0
  970. package/dist/main-app-mode.js.map +1 -0
  971. package/dist/main-session-options.d.ts +12 -0
  972. package/dist/main-session-options.d.ts.map +1 -0
  973. package/dist/main-session-options.js +87 -0
  974. package/dist/main-session-options.js.map +1 -0
  975. package/dist/main-session.d.ts +9 -0
  976. package/dist/main-session.d.ts.map +1 -0
  977. package/dist/main-session.js +188 -0
  978. package/dist/main-session.js.map +1 -0
  979. package/dist/main-stdio.d.ts +12 -0
  980. package/dist/main-stdio.d.ts.map +1 -0
  981. package/dist/main-stdio.js +68 -0
  982. package/dist/main-stdio.js.map +1 -0
  983. package/dist/main.d.ts +2 -3
  984. package/dist/main.d.ts.map +1 -1
  985. package/dist/main.js +11 -388
  986. package/dist/main.js.map +1 -1
  987. package/dist/migrations-config-values.d.ts +9 -0
  988. package/dist/migrations-config-values.d.ts.map +1 -0
  989. package/dist/migrations-config-values.js +298 -0
  990. package/dist/migrations-config-values.js.map +1 -0
  991. package/dist/migrations.d.ts.map +1 -1
  992. package/dist/migrations.js +2 -296
  993. package/dist/migrations.js.map +1 -1
  994. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  995. package/dist/modes/interactive/components/chat-message-renderer.js +0 -7
  996. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  997. package/dist/modes/interactive/components/chat-session-host-actions.d.ts +9 -0
  998. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -0
  999. package/dist/modes/interactive/components/chat-session-host-actions.js +244 -0
  1000. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -0
  1001. package/dist/modes/interactive/components/chat-session-host-editor.d.ts +18 -0
  1002. package/dist/modes/interactive/components/chat-session-host-editor.d.ts.map +1 -0
  1003. package/dist/modes/interactive/components/chat-session-host-editor.js +165 -0
  1004. package/dist/modes/interactive/components/chat-session-host-editor.js.map +1 -0
  1005. package/dist/modes/interactive/components/chat-session-host-events.d.ts +5 -0
  1006. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -0
  1007. package/dist/modes/interactive/components/chat-session-host-events.js +200 -0
  1008. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -0
  1009. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts +13 -0
  1010. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -0
  1011. package/dist/modes/interactive/components/chat-session-host-rendering.js +185 -0
  1012. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -0
  1013. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts +13 -0
  1014. package/dist/modes/interactive/components/chat-session-host-runtime.d.ts.map +1 -0
  1015. package/dist/modes/interactive/components/chat-session-host-runtime.js +101 -0
  1016. package/dist/modes/interactive/components/chat-session-host-runtime.js.map +1 -0
  1017. package/dist/modes/interactive/components/chat-session-host-state.d.ts +53 -0
  1018. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -0
  1019. package/dist/modes/interactive/components/chat-session-host-state.js +42 -0
  1020. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -0
  1021. package/dist/modes/interactive/components/chat-session-host-types.d.ts +63 -0
  1022. package/dist/modes/interactive/components/chat-session-host-types.d.ts.map +1 -0
  1023. package/dist/modes/interactive/components/chat-session-host-types.js +2 -0
  1024. package/dist/modes/interactive/components/chat-session-host-types.js.map +1 -0
  1025. package/dist/modes/interactive/components/chat-session-host-utils.d.ts +28 -0
  1026. package/dist/modes/interactive/components/chat-session-host-utils.d.ts.map +1 -0
  1027. package/dist/modes/interactive/components/chat-session-host-utils.js +103 -0
  1028. package/dist/modes/interactive/components/chat-session-host-utils.js.map +1 -0
  1029. package/dist/modes/interactive/components/chat-session-host.d.ts +6 -129
  1030. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  1031. package/dist/modes/interactive/components/chat-session-host.js +50 -1022
  1032. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  1033. package/dist/modes/interactive/components/config-selector-list.d.ts +65 -0
  1034. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -0
  1035. package/dist/modes/interactive/components/config-selector-list.js +458 -0
  1036. package/dist/modes/interactive/components/config-selector-list.js.map +1 -0
  1037. package/dist/modes/interactive/components/config-selector.d.ts +3 -58
  1038. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  1039. package/dist/modes/interactive/components/config-selector.js +2 -457
  1040. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  1041. package/dist/modes/interactive/components/session-selector-delete.d.ts +10 -0
  1042. package/dist/modes/interactive/components/session-selector-delete.d.ts.map +1 -0
  1043. package/dist/modes/interactive/components/session-selector-delete.js +40 -0
  1044. package/dist/modes/interactive/components/session-selector-delete.js.map +1 -0
  1045. package/dist/modes/interactive/components/session-selector-header.d.ts +33 -0
  1046. package/dist/modes/interactive/components/session-selector-header.d.ts.map +1 -0
  1047. package/dist/modes/interactive/components/session-selector-header.js +117 -0
  1048. package/dist/modes/interactive/components/session-selector-header.js.map +1 -0
  1049. package/dist/modes/interactive/components/session-selector-list.d.ts +49 -0
  1050. package/dist/modes/interactive/components/session-selector-list.d.ts.map +1 -0
  1051. package/dist/modes/interactive/components/session-selector-list.js +307 -0
  1052. package/dist/modes/interactive/components/session-selector-list.js.map +1 -0
  1053. package/dist/modes/interactive/components/session-selector-tree.d.ts +25 -0
  1054. package/dist/modes/interactive/components/session-selector-tree.d.ts.map +1 -0
  1055. package/dist/modes/interactive/components/session-selector-tree.js +53 -0
  1056. package/dist/modes/interactive/components/session-selector-tree.js.map +1 -0
  1057. package/dist/modes/interactive/components/session-selector-types.d.ts +4 -0
  1058. package/dist/modes/interactive/components/session-selector-types.d.ts.map +1 -0
  1059. package/dist/modes/interactive/components/session-selector-types.js +2 -0
  1060. package/dist/modes/interactive/components/session-selector-types.js.map +1 -0
  1061. package/dist/modes/interactive/components/session-selector-utils.d.ts +4 -0
  1062. package/dist/modes/interactive/components/session-selector-utils.d.ts.map +1 -0
  1063. package/dist/modes/interactive/components/session-selector-utils.js +37 -0
  1064. package/dist/modes/interactive/components/session-selector-utils.js.map +1 -0
  1065. package/dist/modes/interactive/components/session-selector.d.ts +3 -49
  1066. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  1067. package/dist/modes/interactive/components/session-selector.js +5 -542
  1068. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  1069. package/dist/modes/interactive/components/settings-selector-handlers.d.ts +3 -0
  1070. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -0
  1071. package/dist/modes/interactive/components/settings-selector-handlers.js +84 -0
  1072. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -0
  1073. package/dist/modes/interactive/components/settings-selector-items.d.ts +4 -0
  1074. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -0
  1075. package/dist/modes/interactive/components/settings-selector-items.js +211 -0
  1076. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -0
  1077. package/dist/modes/interactive/components/settings-selector-options.d.ts +6 -0
  1078. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -0
  1079. package/dist/modes/interactive/components/settings-selector-options.js +14 -0
  1080. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -0
  1081. package/dist/modes/interactive/components/settings-selector-submenus.d.ts +44 -0
  1082. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -0
  1083. package/dist/modes/interactive/components/settings-selector-submenus.js +228 -0
  1084. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -0
  1085. package/dist/modes/interactive/components/settings-selector-types.d.ts +67 -0
  1086. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -0
  1087. package/dist/modes/interactive/components/settings-selector-types.js +2 -0
  1088. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -0
  1089. package/dist/modes/interactive/components/settings-selector.d.ts +2 -63
  1090. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  1091. package/dist/modes/interactive/components/settings-selector.js +5 -538
  1092. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  1093. package/dist/modes/interactive/components/tree-selector-component.d.ts +21 -0
  1094. package/dist/modes/interactive/components/tree-selector-component.d.ts.map +1 -0
  1095. package/dist/modes/interactive/components/tree-selector-component.js +80 -0
  1096. package/dist/modes/interactive/components/tree-selector-component.js.map +1 -0
  1097. package/dist/modes/interactive/components/tree-selector-content.d.ts +8 -0
  1098. package/dist/modes/interactive/components/tree-selector-content.d.ts.map +1 -0
  1099. package/dist/modes/interactive/components/tree-selector-content.js +263 -0
  1100. package/dist/modes/interactive/components/tree-selector-content.js.map +1 -0
  1101. package/dist/modes/interactive/components/tree-selector-help.d.ts +16 -0
  1102. package/dist/modes/interactive/components/tree-selector-help.d.ts.map +1 -0
  1103. package/dist/modes/interactive/components/tree-selector-help.js +103 -0
  1104. package/dist/modes/interactive/components/tree-selector-help.js.map +1 -0
  1105. package/dist/modes/interactive/components/tree-selector-label-input.d.ts +16 -0
  1106. package/dist/modes/interactive/components/tree-selector-label-input.d.ts.map +1 -0
  1107. package/dist/modes/interactive/components/tree-selector-label-input.js +46 -0
  1108. package/dist/modes/interactive/components/tree-selector-label-input.js.map +1 -0
  1109. package/dist/modes/interactive/components/tree-selector-list.d.ts +33 -0
  1110. package/dist/modes/interactive/components/tree-selector-list.d.ts.map +1 -0
  1111. package/dist/modes/interactive/components/tree-selector-list.js +336 -0
  1112. package/dist/modes/interactive/components/tree-selector-list.js.map +1 -0
  1113. package/dist/modes/interactive/components/tree-selector-model.d.ts +7 -0
  1114. package/dist/modes/interactive/components/tree-selector-model.d.ts.map +1 -0
  1115. package/dist/modes/interactive/components/tree-selector-model.js +358 -0
  1116. package/dist/modes/interactive/components/tree-selector-model.js.map +1 -0
  1117. package/dist/modes/interactive/components/tree-selector-types.d.ts +57 -0
  1118. package/dist/modes/interactive/components/tree-selector-types.d.ts.map +1 -0
  1119. package/dist/modes/interactive/components/tree-selector-types.js +6 -0
  1120. package/dist/modes/interactive/components/tree-selector-types.js.map +1 -0
  1121. package/dist/modes/interactive/components/tree-selector-viewport.d.ts +10 -0
  1122. package/dist/modes/interactive/components/tree-selector-viewport.d.ts.map +1 -0
  1123. package/dist/modes/interactive/components/tree-selector-viewport.js +32 -0
  1124. package/dist/modes/interactive/components/tree-selector-viewport.js.map +1 -0
  1125. package/dist/modes/interactive/components/tree-selector.d.ts +2 -88
  1126. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  1127. package/dist/modes/interactive/components/tree-selector.js +1 -1200
  1128. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  1129. package/dist/modes/interactive/interactive-agent-events.d.ts +2 -0
  1130. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -0
  1131. package/dist/modes/interactive/interactive-agent-events.js +370 -0
  1132. package/dist/modes/interactive/interactive-agent-events.js.map +1 -0
  1133. package/dist/modes/interactive/interactive-auth-login.d.ts +2 -0
  1134. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -0
  1135. package/dist/modes/interactive/interactive-auth-login.js +214 -0
  1136. package/dist/modes/interactive/interactive-auth-login.js.map +1 -0
  1137. package/dist/modes/interactive/interactive-auth-routing.d.ts +2 -0
  1138. package/dist/modes/interactive/interactive-auth-routing.d.ts.map +1 -0
  1139. package/dist/modes/interactive/interactive-auth-routing.js +128 -0
  1140. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -0
  1141. package/dist/modes/interactive/interactive-autocomplete.d.ts +2 -0
  1142. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -0
  1143. package/dist/modes/interactive/interactive-autocomplete.js +140 -0
  1144. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -0
  1145. package/dist/modes/interactive/interactive-bash-compact.d.ts +2 -0
  1146. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -0
  1147. package/dist/modes/interactive/interactive-bash-compact.js +112 -0
  1148. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -0
  1149. package/dist/modes/interactive/interactive-editor-actions.d.ts +2 -0
  1150. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -0
  1151. package/dist/modes/interactive/interactive-editor-actions.js +131 -0
  1152. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -0
  1153. package/dist/modes/interactive/interactive-extension-context.d.ts +2 -0
  1154. package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -0
  1155. package/dist/modes/interactive/interactive-extension-context.js +159 -0
  1156. package/dist/modes/interactive/interactive-extension-context.js.map +1 -0
  1157. package/dist/modes/interactive/interactive-extension-custom-ui.d.ts +2 -0
  1158. package/dist/modes/interactive/interactive-extension-custom-ui.d.ts.map +1 -0
  1159. package/dist/modes/interactive/interactive-extension-custom-ui.js +208 -0
  1160. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -0
  1161. package/dist/modes/interactive/interactive-extension-dialogs.d.ts +2 -0
  1162. package/dist/modes/interactive/interactive-extension-dialogs.d.ts.map +1 -0
  1163. package/dist/modes/interactive/interactive-extension-dialogs.js +162 -0
  1164. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -0
  1165. package/dist/modes/interactive/interactive-extension-runtime.d.ts +2 -0
  1166. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -0
  1167. package/dist/modes/interactive/interactive-extension-runtime.js +179 -0
  1168. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -0
  1169. package/dist/modes/interactive/interactive-extension-widgets.d.ts +2 -0
  1170. package/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -0
  1171. package/dist/modes/interactive/interactive-extension-widgets.js +113 -0
  1172. package/dist/modes/interactive/interactive-extension-widgets.js.map +1 -0
  1173. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts +2 -0
  1174. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -0
  1175. package/dist/modes/interactive/interactive-hotkeys-debug.js +186 -0
  1176. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -0
  1177. package/dist/modes/interactive/interactive-input-handling.d.ts +2 -0
  1178. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -0
  1179. package/dist/modes/interactive/interactive-input-handling.js +275 -0
  1180. package/dist/modes/interactive/interactive-input-handling.js.map +1 -0
  1181. package/dist/modes/interactive/interactive-mode-base.d.ts +103 -0
  1182. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -0
  1183. package/dist/modes/interactive/interactive-mode-base.js +130 -0
  1184. package/dist/modes/interactive/interactive-mode-base.js.map +1 -0
  1185. package/dist/modes/interactive/interactive-mode-deps.d.ts +81 -0
  1186. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -0
  1187. package/dist/modes/interactive/interactive-mode-deps.js +74 -0
  1188. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -0
  1189. package/dist/modes/interactive/interactive-mode-helpers.d.ts +21 -0
  1190. package/dist/modes/interactive/interactive-mode-helpers.d.ts.map +1 -0
  1191. package/dist/modes/interactive/interactive-mode-helpers.js +77 -0
  1192. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -0
  1193. package/dist/modes/interactive/interactive-mode-surface.d.ts +313 -0
  1194. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -0
  1195. package/dist/modes/interactive/interactive-mode-surface.js +2 -0
  1196. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -0
  1197. package/dist/modes/interactive/interactive-mode-types.d.ts +29 -0
  1198. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -0
  1199. package/dist/modes/interactive/interactive-mode-types.js +2 -0
  1200. package/dist/modes/interactive/interactive-mode-types.js.map +1 -0
  1201. package/dist/modes/interactive/interactive-mode.d.ts +30 -404
  1202. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  1203. package/dist/modes/interactive/interactive-mode.js +29 -5260
  1204. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  1205. package/dist/modes/interactive/interactive-model-routing.d.ts +2 -0
  1206. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -0
  1207. package/dist/modes/interactive/interactive-model-routing.js +269 -0
  1208. package/dist/modes/interactive/interactive-model-routing.js.map +1 -0
  1209. package/dist/modes/interactive/interactive-process-lifecycle.d.ts +2 -0
  1210. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -0
  1211. package/dist/modes/interactive/interactive-process-lifecycle.js +189 -0
  1212. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -0
  1213. package/dist/modes/interactive/interactive-queueing.d.ts +2 -0
  1214. package/dist/modes/interactive/interactive-queueing.d.ts.map +1 -0
  1215. package/dist/modes/interactive/interactive-queueing.js +163 -0
  1216. package/dist/modes/interactive/interactive-queueing.js.map +1 -0
  1217. package/dist/modes/interactive/interactive-render-chat.d.ts +2 -0
  1218. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -0
  1219. package/dist/modes/interactive/interactive-render-chat.js +170 -0
  1220. package/dist/modes/interactive/interactive-render-chat.js.map +1 -0
  1221. package/dist/modes/interactive/interactive-resource-disclosure.d.ts +2 -0
  1222. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -0
  1223. package/dist/modes/interactive/interactive-resource-disclosure.js +101 -0
  1224. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -0
  1225. package/dist/modes/interactive/interactive-resource-paths.d.ts +2 -0
  1226. package/dist/modes/interactive/interactive-resource-paths.d.ts.map +1 -0
  1227. package/dist/modes/interactive/interactive-resource-paths.js +228 -0
  1228. package/dist/modes/interactive/interactive-resource-paths.js.map +1 -0
  1229. package/dist/modes/interactive/interactive-resource-rendering.d.ts +2 -0
  1230. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -0
  1231. package/dist/modes/interactive/interactive-resource-rendering.js +181 -0
  1232. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -0
  1233. package/dist/modes/interactive/interactive-selectors.d.ts +2 -0
  1234. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -0
  1235. package/dist/modes/interactive/interactive-selectors.js +198 -0
  1236. package/dist/modes/interactive/interactive-selectors.js.map +1 -0
  1237. package/dist/modes/interactive/interactive-session-routing.d.ts +2 -0
  1238. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -0
  1239. package/dist/modes/interactive/interactive-session-routing.js +232 -0
  1240. package/dist/modes/interactive/interactive-session-routing.js.map +1 -0
  1241. package/dist/modes/interactive/interactive-session-runtime.d.ts +2 -0
  1242. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -0
  1243. package/dist/modes/interactive/interactive-session-runtime.js +131 -0
  1244. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -0
  1245. package/dist/modes/interactive/interactive-slash-commands.d.ts +2 -0
  1246. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -0
  1247. package/dist/modes/interactive/interactive-slash-commands.js +338 -0
  1248. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -0
  1249. package/dist/modes/interactive/interactive-startup.d.ts +2 -0
  1250. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -0
  1251. package/dist/modes/interactive/interactive-startup.js +348 -0
  1252. package/dist/modes/interactive/interactive-startup.js.map +1 -0
  1253. package/dist/modes/interactive/theme/color-utils.d.ts +20 -0
  1254. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -0
  1255. package/dist/modes/interactive/theme/color-utils.js +204 -0
  1256. package/dist/modes/interactive/theme/color-utils.js.map +1 -0
  1257. package/dist/modes/interactive/theme/export-colors.d.ts +19 -0
  1258. package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -0
  1259. package/dist/modes/interactive/theme/export-colors.js +69 -0
  1260. package/dist/modes/interactive/theme/export-colors.js.map +1 -0
  1261. package/dist/modes/interactive/theme/global-theme.d.ts +12 -0
  1262. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -0
  1263. package/dist/modes/interactive/theme/global-theme.js +150 -0
  1264. package/dist/modes/interactive/theme/global-theme.js.map +1 -0
  1265. package/dist/modes/interactive/theme/terminal-detection.d.ts +30 -0
  1266. package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -0
  1267. package/dist/modes/interactive/theme/terminal-detection.js +89 -0
  1268. package/dist/modes/interactive/theme/terminal-detection.js.map +1 -0
  1269. package/dist/modes/interactive/theme/theme-class.d.ts +30 -0
  1270. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -0
  1271. package/dist/modes/interactive/theme/theme-class.js +83 -0
  1272. package/dist/modes/interactive/theme/theme-class.js.map +1 -0
  1273. package/dist/modes/interactive/theme/theme-loading.d.ts +17 -0
  1274. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -0
  1275. package/dist/modes/interactive/theme/theme-loading.js +155 -0
  1276. package/dist/modes/interactive/theme/theme-loading.js.map +1 -0
  1277. package/dist/modes/interactive/theme/theme-parse.d.ts +5 -0
  1278. package/dist/modes/interactive/theme/theme-parse.d.ts.map +1 -0
  1279. package/dist/modes/interactive/theme/theme-parse.js +52 -0
  1280. package/dist/modes/interactive/theme/theme-parse.js.map +1 -0
  1281. package/dist/modes/interactive/theme/theme-schema.d.ts +255 -0
  1282. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  1283. package/dist/modes/interactive/theme/theme-schema.js +78 -0
  1284. package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  1285. package/dist/modes/interactive/theme/theme.d.ts +6 -108
  1286. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  1287. package/dist/modes/interactive/theme/theme.js +6 -1065
  1288. package/dist/modes/interactive/theme/theme.js.map +1 -1
  1289. package/dist/modes/interactive/theme/tui-theme.d.ts +15 -0
  1290. package/dist/modes/interactive/theme/tui-theme.d.ts.map +1 -0
  1291. package/dist/modes/interactive/theme/tui-theme.js +199 -0
  1292. package/dist/modes/interactive/theme/tui-theme.js.map +1 -0
  1293. package/dist/modes/rpc/rpc-client.d.ts +1 -61
  1294. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  1295. package/dist/modes/rpc/rpc-client.js +1 -72
  1296. package/dist/modes/rpc/rpc-client.js.map +1 -1
  1297. package/dist/modes/rpc/rpc-command-handler.d.ts +14 -0
  1298. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -0
  1299. package/dist/modes/rpc/rpc-command-handler.js +226 -0
  1300. package/dist/modes/rpc/rpc-command-handler.js.map +1 -0
  1301. package/dist/modes/rpc/rpc-extension-ui.d.ts +15 -0
  1302. package/dist/modes/rpc/rpc-extension-ui.d.ts.map +1 -0
  1303. package/dist/modes/rpc/rpc-extension-ui.js +196 -0
  1304. package/dist/modes/rpc/rpc-extension-ui.js.map +1 -0
  1305. package/dist/modes/rpc/rpc-input.d.ts +12 -0
  1306. package/dist/modes/rpc/rpc-input.d.ts.map +1 -0
  1307. package/dist/modes/rpc/rpc-input.js +54 -0
  1308. package/dist/modes/rpc/rpc-input.js.map +1 -0
  1309. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  1310. package/dist/modes/rpc/rpc-mode.js +43 -607
  1311. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  1312. package/dist/modes/rpc/rpc-responses.d.ts +8 -0
  1313. package/dist/modes/rpc/rpc-responses.d.ts.map +1 -0
  1314. package/dist/modes/rpc/rpc-responses.js +27 -0
  1315. package/dist/modes/rpc/rpc-responses.js.map +1 -0
  1316. package/dist/modes/rpc/rpc-session-binding.d.ts +25 -0
  1317. package/dist/modes/rpc/rpc-session-binding.d.ts.map +1 -0
  1318. package/dist/modes/rpc/rpc-session-binding.js +70 -0
  1319. package/dist/modes/rpc/rpc-session-binding.js.map +1 -0
  1320. package/dist/package-manager-cli-parser.d.ts +28 -0
  1321. package/dist/package-manager-cli-parser.d.ts.map +1 -0
  1322. package/dist/package-manager-cli-parser.js +269 -0
  1323. package/dist/package-manager-cli-parser.js.map +1 -0
  1324. package/dist/package-manager-cli.d.ts +0 -1
  1325. package/dist/package-manager-cli.d.ts.map +1 -1
  1326. package/dist/package-manager-cli.js +2 -267
  1327. package/dist/package-manager-cli.js.map +1 -1
  1328. package/dist/utils/git.d.ts.map +1 -1
  1329. package/dist/utils/git.js +10 -0
  1330. package/dist/utils/git.js.map +1 -1
  1331. package/dist/utils/version-check.d.ts +1 -0
  1332. package/dist/utils/version-check.d.ts.map +1 -1
  1333. package/dist/utils/version-check.js +17 -0
  1334. package/dist/utils/version-check.js.map +1 -1
  1335. package/docs/development.md +4 -0
  1336. package/docs/sessions.md +4 -0
  1337. package/docs/workflows.md +13 -7
  1338. package/examples/extensions/custom-provider-anthropic/index.ts +1 -106
  1339. package/examples/extensions/gondolin/index.ts +0 -23
  1340. package/examples/extensions/gondolin/package-lock.json +183 -183
  1341. package/examples/extensions/overlay-qa-animation-components.ts +255 -0
  1342. package/examples/extensions/overlay-qa-focus-components.ts +222 -0
  1343. package/examples/extensions/overlay-qa-position-components.ts +433 -0
  1344. package/examples/extensions/overlay-qa-shared.ts +37 -0
  1345. package/examples/extensions/overlay-qa-streaming-input-components.ts +205 -0
  1346. package/examples/extensions/overlay-qa-tests.ts +17 -1156
  1347. package/examples/extensions/overlay-qa-toggle-passive-components.ts +169 -0
  1348. package/examples/extensions/space-invaders.ts +0 -60
  1349. package/examples/extensions/subagent/display.ts +148 -0
  1350. package/examples/extensions/subagent/index.ts +11 -858
  1351. package/examples/extensions/subagent/render.ts +383 -0
  1352. package/examples/extensions/subagent/runner.ts +252 -0
  1353. package/examples/extensions/subagent/schemas.ts +59 -0
  1354. package/examples/extensions/subagent/types.ts +36 -0
  1355. package/examples/extensions/tic-tac-toe-instructions.ts +65 -0
  1356. package/examples/extensions/tic-tac-toe-rendering.ts +414 -0
  1357. package/examples/extensions/tic-tac-toe-state.ts +158 -0
  1358. package/examples/extensions/tic-tac-toe.ts +92 -754
  1359. package/examples/rpc-extension-ui-components.ts +189 -0
  1360. package/examples/rpc-extension-ui.ts +2 -179
  1361. package/package.json +4 -4
@@ -1,1919 +1,23 @@
1
- import type { ExtensionAPI, ExtensionContext } from "@bastani/atomic";
2
- import { Text, truncateToWidth } from "@mariozechner/pi-tui";
3
- import { Type } from "typebox";
4
- import {
5
- renderCodeSearchResult,
6
- renderFetchContentResult,
7
- renderGetSearchContentResult,
8
- renderWebSearchResult,
9
- } from "./result-renderers.js";
10
- import { StringEnum, complete, getModel, type Model } from "@mariozechner/pi-ai";
11
- import { fetchAllContent, type ExtractedContent } from "./extract.js";
12
- import { clearCloneCache } from "./github-extract.js";
13
- import { search, type SearchProvider, type ResolvedSearchProvider } from "./gemini-search.js";
14
- import { executeCodeSearch } from "./code-search.js";
15
- import type { SearchResult } from "./perplexity.js";
16
- import {
17
- clearResults,
18
- deleteResult,
19
- generateId,
20
- getAllResults,
21
- getResult,
22
- restoreFromSession,
23
- storeResult,
24
- type QueryResultData,
25
- type StoredSearchData,
26
- } from "./storage.js";
27
- import { activityMonitor, type ActivityEntry } from "./activity.js";
28
- import { startCuratorServer, type CuratorServerHandle } from "./curator-server.js";
29
- import {
30
- buildDeterministicSummary,
31
- generateSummaryDraft,
32
- type SummaryGenerationContext,
33
- type SummaryMeta,
34
- } from "./summary-review.js";
35
- import { randomUUID } from "node:crypto";
1
+ import type { ExtensionAPI } from "@bastani/atomic";
2
+ import { CONFIG_DIR_NAME } from "@bastani/atomic";
36
3
  import { appendFileSync } from "node:fs";
4
+ import { getActiveGoogleEmail, isGeminiWebAvailable } from "./gemini-web.js";
5
+ import { isBrowserCookieAccessAllowed } from "./gemini-web-config.ts";
6
+ import { deleteResult, getAllResults } from "./storage.js";
7
+ import { loadConfigForExtensionInit, resolveWorkflow, saveConfig, type WebSearchWorkflow } from "./web-search-config.js";
37
8
 
38
9
  if (process.env.ATOMIC_TEST_LAZY_IMPORT_SENTINEL_FILE) {
39
10
  appendFileSync(process.env.ATOMIC_TEST_LAZY_IMPORT_SENTINEL_FILE, "web-access\n");
40
11
  }
41
- import { execFileSync } from "node:child_process";
42
- import { createRequire } from "node:module";
43
- import { platform, homedir } from "node:os";
44
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
45
- import { join } from "node:path";
46
- import { CONFIG_DIR_NAME, getUserConfigPaths } from "@bastani/atomic";
47
- import { findReadableConfigPath } from "./config-paths.ts";
48
- import { isPerplexityAvailable } from "./perplexity.js";
49
- import { isExaAvailable } from "./exa.js";
50
- import { isGeminiApiAvailable } from "./gemini-api.js";
51
12
 
52
13
  if (process.env.ATOMIC_TEST_LAZY_IMPORT_SENTINEL === "1") {
53
14
  process.env.ATOMIC_WEB_ACCESS_HEAVY_IMPORTED = "1";
54
15
  }
55
- import { getActiveGoogleEmail, isGeminiWebAvailable } from "./gemini-web.js";
56
- import { isBrowserCookieAccessAllowed } from "./gemini-web-config.ts";
57
-
58
- const WEB_SEARCH_CONFIG_PATH = getUserConfigPaths("web-search.json")[0] ?? join(homedir(), CONFIG_DIR_NAME, "web-search.json");
59
- const WEB_SEARCH_CONFIG_READ_PATH = findReadableConfigPath();
60
-
61
- interface WebSearchConfig {
62
- provider?: string;
63
- workflow?: string;
64
- curatorTimeoutSeconds?: unknown;
65
- summaryModel?: string;
66
- shortcuts?: {
67
- curate?: string;
68
- activity?: string;
69
- };
70
- }
71
-
72
- interface ProviderAvailability {
73
- perplexity: boolean;
74
- exa: boolean;
75
- gemini: boolean;
76
- }
77
-
78
- type WebSearchWorkflow = "none" | "summary-review";
79
- type CuratorWorkflow = "summary-review";
80
-
81
- interface CuratorBootstrap {
82
- availableProviders: ProviderAvailability;
83
- defaultProvider: ResolvedSearchProvider;
84
- timeoutSeconds: number;
85
- }
86
-
87
- function loadConfig(): WebSearchConfig {
88
- if (!existsSync(WEB_SEARCH_CONFIG_READ_PATH)) return {};
89
- const raw = readFileSync(WEB_SEARCH_CONFIG_READ_PATH, "utf-8");
90
- try {
91
- return JSON.parse(raw) as WebSearchConfig;
92
- } catch (err) {
93
- const message = err instanceof Error ? err.message : String(err);
94
- throw new Error(`Failed to parse ${WEB_SEARCH_CONFIG_READ_PATH}: ${message}`);
95
- }
96
- }
97
-
98
- function saveConfig(updates: Partial<WebSearchConfig>): void {
99
- let config: Record<string, unknown> = {};
100
- const existingConfigPath = findReadableConfigPath();
101
- if (existsSync(existingConfigPath)) {
102
- const raw = readFileSync(existingConfigPath, "utf-8");
103
- try {
104
- config = JSON.parse(raw) as Record<string, unknown>;
105
- } catch (err) {
106
- const message = err instanceof Error ? err.message : String(err);
107
- throw new Error(`Failed to parse ${existingConfigPath}: ${message}`);
108
- }
109
- }
110
-
111
- Object.assign(config, updates);
112
- const dir = join(homedir(), CONFIG_DIR_NAME);
113
- if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
114
- writeFileSync(WEB_SEARCH_CONFIG_PATH, JSON.stringify(config, null, 2) + "\n");
115
- }
116
-
117
- const DEFAULT_SHORTCUTS = { curate: "ctrl+shift+s", activity: "ctrl+shift+w" };
118
- const DEFAULT_CURATOR_TIMEOUT_SECONDS = 20;
119
- const MAX_CURATOR_TIMEOUT_SECONDS = 600;
120
-
121
- function loadConfigForExtensionInit(): WebSearchConfig {
122
- try {
123
- return loadConfig();
124
- } catch (err) {
125
- const message = err instanceof Error ? err.message : String(err);
126
- console.error(`[pi-web-access] ${message}`);
127
- return {};
128
- }
129
- }
130
-
131
- function normalizeProviderInput(value: unknown): SearchProvider | undefined {
132
- if (value === undefined) return undefined;
133
- if (typeof value !== "string") return "auto";
134
- const normalized = value.trim().toLowerCase();
135
- if (normalized === "auto" || normalized === "exa" || normalized === "perplexity" || normalized === "gemini") {
136
- return normalized;
137
- }
138
- return "auto";
139
- }
140
-
141
- function normalizeCuratorTimeoutSeconds(value: unknown): number | undefined {
142
- if (typeof value !== "number" || !Number.isFinite(value)) return undefined;
143
- const normalized = Math.floor(value);
144
- if (normalized < 1) return undefined;
145
- return Math.min(normalized, MAX_CURATOR_TIMEOUT_SECONDS);
146
- }
147
-
148
- function resolveWorkflow(input: unknown, hasUI: boolean): WebSearchWorkflow {
149
- if (!hasUI) return "none";
150
- if (typeof input === "string" && input.trim().toLowerCase() === "none") return "none";
151
- return "summary-review";
152
- }
153
-
154
- function normalizeQueryList(queryList: unknown[]): string[] {
155
- const normalized: string[] = [];
156
- for (const query of queryList) {
157
- if (typeof query !== "string") continue;
158
- const trimmed = query.trim();
159
- if (trimmed.length > 0) normalized.push(trimmed);
160
- }
161
- return normalized;
162
- }
163
-
164
- function getCuratorTimeoutSeconds(): number {
165
- const source = loadConfig();
166
- return normalizeCuratorTimeoutSeconds(source.curatorTimeoutSeconds) ?? DEFAULT_CURATOR_TIMEOUT_SECONDS;
167
- }
168
-
169
- async function getProviderAvailability(): Promise<ProviderAvailability> {
170
- const geminiWebAvail = await isGeminiWebAvailable();
171
- return {
172
- perplexity: isPerplexityAvailable(),
173
- exa: isExaAvailable(),
174
- gemini: isGeminiApiAvailable() || !!geminiWebAvail,
175
- };
176
- }
177
-
178
- async function loadCuratorBootstrap(requestedProvider: unknown): Promise<CuratorBootstrap> {
179
- const availableProviders = await getProviderAvailability();
180
- return {
181
- availableProviders,
182
- defaultProvider: resolveProvider(requestedProvider, availableProviders),
183
- timeoutSeconds: getCuratorTimeoutSeconds(),
184
- };
185
- }
186
-
187
- function resolveProvider(
188
- requested: unknown,
189
- available: ProviderAvailability,
190
- ): ResolvedSearchProvider {
191
- const provider = normalizeProviderInput(requested ?? loadConfig().provider ?? "auto") ?? "auto";
192
-
193
- if (provider === "auto") {
194
- if (available.exa) return "exa";
195
- if (available.perplexity) return "perplexity";
196
- if (available.gemini) return "gemini";
197
- return "exa";
198
- }
199
- if (provider === "exa" && !available.exa) {
200
- if (available.perplexity) return "perplexity";
201
- return available.gemini ? "gemini" : "exa";
202
- }
203
- if (provider === "perplexity" && !available.perplexity) {
204
- if (available.exa) return "exa";
205
- return available.gemini ? "gemini" : "perplexity";
206
- }
207
- if (provider === "gemini" && !available.gemini) {
208
- if (available.exa) return "exa";
209
- return available.perplexity ? "perplexity" : "gemini";
210
- }
211
- return provider;
212
- }
213
-
214
- const pendingFetches = new Map<string, AbortController>();
215
- let sessionActive = false;
216
- let widgetVisible = false;
217
- let widgetUnsubscribe: (() => void) | null = null;
218
- let activeCurator: CuratorServerHandle | null = null;
219
- let glimpseWin: GlimpseWindow | null = null;
220
-
221
- interface PendingCurate {
222
- phase: "searching" | "curating";
223
- workflow: CuratorWorkflow;
224
- summaryContext: SummaryGenerationContext;
225
- searchResults: Map<number, QueryResultData>;
226
- allInlineContent: ExtractedContent[];
227
- queryList: string[];
228
- includeContent: boolean;
229
- numResults?: number;
230
- recencyFilter?: "day" | "week" | "month" | "year";
231
- domainFilter?: string[];
232
- availableProviders: ProviderAvailability;
233
- defaultProvider: ResolvedSearchProvider;
234
- summaryModels: Array<{ value: string; label: string }>;
235
- defaultSummaryModel: string | null;
236
- timeoutSeconds: number;
237
- onUpdate: ((update: { content: Array<{ type: string; text: string }>; details?: Record<string, unknown> }) => void) | undefined;
238
- signal: AbortSignal | undefined;
239
- abortSearches: () => void;
240
- finish: (value: unknown) => void;
241
- cancel: (reason?: "user" | "stale") => void;
242
- browserPromise?: Promise<void>;
243
- }
244
-
245
- let pendingCurate: PendingCurate | null = null;
246
-
247
- function cancelPendingCurate(reason: "user" | "stale" = "stale"): void {
248
- pendingCurate?.cancel(reason);
249
- }
250
-
251
- const MAX_INLINE_CONTENT = 30000; // Content returned directly to agent
252
-
253
- function stripThumbnails(results: ExtractedContent[]): ExtractedContent[] {
254
- return results.map(({ thumbnail, frames, ...rest }) => rest);
255
- }
256
-
257
- function formatSearchSummary(results: SearchResult[], answer: string): string {
258
- let output = answer ? `${answer}\n\n---\n\n**Sources:**\n` : "";
259
- output += results.map((r, i) => `${i + 1}. ${r.title}\n ${r.url}`).join("\n\n");
260
- return output;
261
- }
262
-
263
- function duplicateQuerySet(results: QueryResultData[]): Set<string> {
264
- const counts = new Map<string, number>();
265
- for (const result of results) {
266
- counts.set(result.query, (counts.get(result.query) ?? 0) + 1);
267
- }
268
- const duplicates = new Set<string>();
269
- for (const [query, count] of counts) {
270
- if (count > 1) duplicates.add(query);
271
- }
272
- return duplicates;
273
- }
274
-
275
- function formatQueryHeader(query: string, provider: string | undefined, duplicateQueries: Set<string>): string {
276
- const suffix = duplicateQueries.has(query) && provider ? ` (${provider})` : "";
277
- return `## Query: "${query}"${suffix}\n\n`;
278
- }
279
-
280
- function hasFullInlineCoverage(urls: string[], inlineContent: ExtractedContent[] | undefined): boolean {
281
- if (!inlineContent || inlineContent.length === 0) return false;
282
- const coveredUrls = new Set(inlineContent.map(c => c.url));
283
- return urls.every(url => coveredUrls.has(url));
284
- }
285
-
286
- function formatFullResults(queryData: QueryResultData): string {
287
- let output = `## Results for: "${queryData.query}"\n\n`;
288
- if (queryData.answer) {
289
- output += `${queryData.answer}\n\n---\n\n`;
290
- }
291
- for (const r of queryData.results) {
292
- output += `### ${r.title}\n${r.url}\n\n`;
293
- }
294
- return output;
295
- }
296
-
297
- function abortPendingFetches(): void {
298
- for (const controller of pendingFetches.values()) {
299
- controller.abort();
300
- }
301
- pendingFetches.clear();
302
- }
303
-
304
- function closeCurator(): void {
305
- const win = glimpseWin;
306
- glimpseWin = null;
307
- try { win?.close(); } catch {}
308
- cancelPendingCurate();
309
- if (activeCurator) {
310
- activeCurator.close();
311
- activeCurator = null;
312
- }
313
- }
314
-
315
- async function openInBrowser(pi: ExtensionAPI, url: string): Promise<void> {
316
- const plat = platform();
317
- const result = plat === "darwin"
318
- ? await pi.exec("open", [url])
319
- : plat === "win32"
320
- ? await pi.exec("cmd", ["/c", "start", "", url])
321
- : await pi.exec("xdg-open", [url]);
322
- if (result.code !== 0) {
323
- throw new Error(result.stderr || `Failed to open browser (exit code ${result.code})`);
324
- }
325
- }
326
-
327
- interface GlimpseWindow {
328
- on(event: "closed", handler: () => void): void;
329
- on(event: "message", handler: (data: unknown) => void): void;
330
- on(event: "ready", handler: (info: { screen?: { visibleHeight?: number } }) => void): void;
331
- close(): void;
332
- _write(obj: Record<string, unknown>): void;
333
- }
334
-
335
- let glimpseOpen: ((html: string, opts: Record<string, unknown>) => GlimpseWindow) | null | undefined;
336
-
337
- function findGlimpseMjs(): string | null {
338
- try {
339
- const req = createRequire(import.meta.url);
340
- return req.resolve("glimpseui");
341
- } catch {
342
- // Optional dependency.
343
- }
344
- try {
345
- const globalRoot = execFileSync("npm", ["root", "-g"], { encoding: "utf-8" }).trim();
346
- const entry = join(globalRoot, "glimpseui", "src", "glimpse.mjs");
347
- if (existsSync(entry)) return entry;
348
- } catch {
349
- // npm may be unavailable.
350
- }
351
- return null;
352
- }
353
-
354
- async function getGlimpseOpen() {
355
- if (glimpseOpen !== undefined) return glimpseOpen;
356
- const resolved = findGlimpseMjs();
357
- if (resolved) {
358
- try {
359
- glimpseOpen = (await import(resolved)).open;
360
- return glimpseOpen;
361
- } catch {}
362
- }
363
- glimpseOpen = null;
364
- return glimpseOpen;
365
- }
366
-
367
- function openInGlimpse(
368
- open: (html: string, opts: Record<string, unknown>) => GlimpseWindow,
369
- url: string,
370
- title: string,
371
- ): GlimpseWindow {
372
- const shellHTML = `<!DOCTYPE html>
373
- <html>
374
- <head><meta charset="UTF-8"><title>${title}</title></head>
375
- <body style="margin:0; background:#1a1a2e;">
376
- <script>window.location.replace(${JSON.stringify(url)});</script>
377
- </body>
378
- </html>`;
379
- const win = open(shellHTML, {
380
- width: 800,
381
- height: 900,
382
- title,
383
- });
384
-
385
- let maxHeight = 1200;
386
- win.on("ready", (info) => {
387
- const visibleHeight = info?.screen?.visibleHeight;
388
- if (typeof visibleHeight === "number" && visibleHeight > 0) {
389
- maxHeight = Math.floor(visibleHeight * 0.85);
390
- }
391
- });
392
- win.on("message", (data) => {
393
- if (!data || typeof data !== "object") return;
394
- const msg = data as Record<string, unknown>;
395
- if (msg.type !== "resize" || typeof msg.height !== "number") return;
396
- const clamped = Math.max(400, Math.min(Math.round(msg.height), maxHeight));
397
- win._write({ type: "resize", width: 800, height: clamped });
398
- });
399
-
400
- return win;
401
- }
402
-
403
- function extractDomain(url: string): string {
404
- try { return new URL(url).hostname; }
405
- catch { return url; }
406
- }
407
-
408
- function updateWidget(ctx: ExtensionContext): void {
409
- const theme = ctx.ui.theme;
410
- const entries = activityMonitor.getEntries();
411
- const lines: string[] = [];
412
-
413
- lines.push(theme.fg("accent", "─── Web Search Activity " + "─".repeat(36)));
414
-
415
- if (entries.length === 0) {
416
- lines.push(theme.fg("muted", " No activity yet"));
417
- } else {
418
- for (const e of entries) {
419
- lines.push(" " + formatEntryLine(e, theme));
420
- }
421
- }
422
-
423
- lines.push(theme.fg("accent", "─".repeat(60)));
424
-
425
- const rateInfo = activityMonitor.getRateLimitInfo();
426
- const resetMs = rateInfo.oldestTimestamp ? Math.max(0, rateInfo.oldestTimestamp + rateInfo.windowMs - Date.now()) : 0;
427
- const resetSec = Math.ceil(resetMs / 1000);
428
- lines.push(
429
- theme.fg("muted", `Rate: ${rateInfo.used}/${rateInfo.max}`) +
430
- (resetMs > 0 ? theme.fg("dim", ` (resets in ${resetSec}s)`) : ""),
431
- );
432
-
433
- ctx.ui.setWidget("web-activity", new Text(lines.join("\n"), 0, 0));
434
- }
435
-
436
- function formatEntryLine(
437
- entry: ActivityEntry,
438
- theme: { fg: (color: string, text: string) => string },
439
- ): string {
440
- const typeStr = entry.type === "api" ? "API" : "GET";
441
- const target =
442
- entry.type === "api"
443
- ? `"${truncateToWidth(entry.query || "", 28, "")}"`
444
- : truncateToWidth(entry.url?.replace(/^https?:\/\//, "") || "", 30, "");
445
-
446
- const duration = entry.endTime
447
- ? `${((entry.endTime - entry.startTime) / 1000).toFixed(1)}s`
448
- : `${((Date.now() - entry.startTime) / 1000).toFixed(1)}s`;
449
-
450
- let statusStr: string;
451
- let indicator: string;
452
- if (entry.error) {
453
- statusStr = "err";
454
- indicator = theme.fg("error", "✗");
455
- } else if (entry.status === null) {
456
- statusStr = "...";
457
- indicator = theme.fg("warning", "⋯");
458
- } else if (entry.status === 0) {
459
- statusStr = "abort";
460
- indicator = theme.fg("muted", "○");
461
- } else {
462
- statusStr = String(entry.status);
463
- indicator = entry.status >= 200 && entry.status < 300 ? theme.fg("success", "✓") : theme.fg("error", "✗");
464
- }
465
-
466
- return `${typeStr.padEnd(4)} ${target.padEnd(32)} ${statusStr.padStart(5)} ${duration.padStart(5)} ${indicator}`;
467
- }
468
-
469
- function handleSessionChange(ctx: ExtensionContext): void {
470
- abortPendingFetches();
471
- closeCurator();
472
- clearCloneCache();
473
- sessionActive = true;
474
- restoreFromSession(ctx);
475
- // Unsubscribe before clear() to avoid callback with stale ctx
476
- widgetUnsubscribe?.();
477
- widgetUnsubscribe = null;
478
- activityMonitor.clear();
479
- if (widgetVisible) {
480
- // Re-subscribe with new ctx
481
- widgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));
482
- updateWidget(ctx);
483
- }
484
- }
16
+ import { registerWebSearchFeatures } from "./web-search-features.js";
485
17
 
486
18
  export default function (pi: ExtensionAPI) {
487
19
  const initConfig = loadConfigForExtensionInit();
488
- const curateKey = initConfig.shortcuts?.curate || DEFAULT_SHORTCUTS.curate;
489
- const activityKey = initConfig.shortcuts?.activity || DEFAULT_SHORTCUTS.activity;
490
-
491
- function startBackgroundFetch(urls: string[]): string | null {
492
- if (urls.length === 0) return null;
493
- const fetchId = generateId();
494
- const controller = new AbortController();
495
- pendingFetches.set(fetchId, controller);
496
- fetchAllContent(urls, controller.signal)
497
- .then((fetched) => {
498
- if (!sessionActive || !pendingFetches.has(fetchId)) return;
499
- const data: StoredSearchData = {
500
- id: fetchId,
501
- type: "fetch",
502
- timestamp: Date.now(),
503
- urls: stripThumbnails(fetched),
504
- };
505
- storeResult(fetchId, data);
506
- pi.appendEntry("web-search-results", data);
507
- const ok = fetched.filter(f => !f.error).length;
508
- pi.sendMessage(
509
- {
510
- customType: "web-search-content-ready",
511
- content: `Content fetched for ${ok}/${fetched.length} URLs [${fetchId}]. Full page content now available.`,
512
- display: true,
513
- },
514
- { triggerTurn: true },
515
- );
516
- })
517
- .catch((err) => {
518
- if (!sessionActive || !pendingFetches.has(fetchId)) return;
519
- const message = err instanceof Error ? err.message : String(err);
520
- const isAbort = (err instanceof Error && err.name === "AbortError") || message.toLowerCase().includes("abort");
521
- if (!isAbort) {
522
- pi.sendMessage(
523
- {
524
- customType: "web-search-error",
525
- content: `Content fetch failed [${fetchId}]: ${message}`,
526
- display: true,
527
- },
528
- { triggerTurn: false },
529
- );
530
- }
531
- })
532
- .finally(() => { pendingFetches.delete(fetchId); });
533
- return fetchId;
534
- }
535
-
536
- function storeAndPublishSearch(results: QueryResultData[]): string {
537
- const id = generateId();
538
- const data: StoredSearchData = {
539
- id, type: "search", timestamp: Date.now(), queries: results,
540
- };
541
- storeResult(id, data);
542
- pi.appendEntry("web-search-results", data);
543
- return id;
544
- }
545
-
546
- interface SearchReturnOptions {
547
- queryList: string[];
548
- results: QueryResultData[];
549
- urls: string[];
550
- includeContent: boolean;
551
- inlineContent?: ExtractedContent[];
552
- curated?: boolean;
553
- curatedFrom?: number;
554
- workflow?: CuratorWorkflow;
555
- approvedSummary?: string;
556
- summaryMeta?: SummaryMeta;
557
- }
558
-
559
- function normalizeSummaryMeta(meta: SummaryMeta | undefined, summaryText: string): SummaryMeta {
560
- const normalizedText = summaryText.trim();
561
- if (!meta) {
562
- return {
563
- model: null,
564
- durationMs: 0,
565
- tokenEstimate: normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0,
566
- fallbackUsed: false,
567
- edited: false,
568
- };
569
- }
570
-
571
- return {
572
- model: meta.model,
573
- durationMs: Number.isFinite(meta.durationMs) && meta.durationMs >= 0 ? meta.durationMs : 0,
574
- tokenEstimate: Number.isFinite(meta.tokenEstimate) && meta.tokenEstimate >= 0
575
- ? meta.tokenEstimate
576
- : (normalizedText.length > 0 ? Math.max(1, Math.ceil(normalizedText.length / 4)) : 0),
577
- fallbackUsed: meta.fallbackUsed === true,
578
- fallbackReason: meta.fallbackReason,
579
- edited: meta.edited === true,
580
- };
581
- }
582
-
583
- function buildCurationCancelledReturn(reason: "user" | "stale") {
584
- const message = `Search curation cancelled (${reason}).`;
585
- return {
586
- content: [{ type: "text", text: message }],
587
- details: {
588
- error: message,
589
- cancelled: true,
590
- cancelReason: reason,
591
- },
592
- };
593
- }
594
-
595
- async function resolveFirstAvailableModel(
596
- ctx: SummaryGenerationContext,
597
- candidates: Array<{ provider: string; id: string }>,
598
- ): Promise<{ model: Model; apiKey: string; headers?: Record<string, string> }> {
599
- for (const { provider, id } of candidates) {
600
- const model = getModel(provider, id);
601
- if (!model) continue;
602
- const auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);
603
- if (auth.ok && auth.apiKey) return { model, apiKey: auth.apiKey, headers: auth.headers };
604
- }
605
- throw new Error(`No model available: ${candidates.map(c => `${c.provider}/${c.id}`).join(", ")}`);
606
- }
607
-
608
- async function rewriteSearchQuery(query: string, ctx: SummaryGenerationContext, signal: AbortSignal): Promise<string> {
609
- const { model, apiKey, headers } = await resolveFirstAvailableModel(ctx, [
610
- { provider: "anthropic", id: "claude-haiku-4-5" },
611
- { provider: "google", id: "gemini-2.5-flash" },
612
- { provider: "openai", id: "gpt-4.1-mini" },
613
- ]);
614
- const response = await complete(
615
- model,
616
- {
617
- messages: [{
618
- role: "user",
619
- content: [{ type: "text", text: `Rewrite this web search query to get better, more specific results. Add relevant year qualifiers, precise technical terms, and specificity. Return ONLY the improved query text, nothing else.\n\nQuery: ${query}` }],
620
- timestamp: Date.now(),
621
- }],
622
- },
623
- { apiKey, headers, signal },
624
- );
625
- if (response.stopReason === "aborted") throw new Error("Aborted");
626
- const contentParts = Array.isArray(response.content) ? response.content : [];
627
- const text = contentParts
628
- .map(p => {
629
- if (!p || typeof p !== "object") return "";
630
- const part = p as Record<string, unknown>;
631
- return typeof part.text === "string" ? part.text : "";
632
- })
633
- .join("")
634
- .trim();
635
- if (!text) throw new Error("Rewrite returned empty response");
636
- return text;
637
- }
638
-
639
- async function generateSummaryForSelectedIndices(
640
- selectedQueryIndices: number[],
641
- resultsByIndex: Map<number, QueryResultData>,
642
- summaryContext: SummaryGenerationContext,
643
- signal?: AbortSignal,
644
- modelOverride?: string,
645
- feedback?: string,
646
- ): Promise<{ summary: string; meta: SummaryMeta }> {
647
- const selectedResults: QueryResultData[] = [];
648
- for (const qi of selectedQueryIndices) {
649
- const result = resultsByIndex.get(qi);
650
- if (result) selectedResults.push(result);
651
- }
652
- if (selectedResults.length === 0) {
653
- throw new Error("No selected results available for summary generation");
654
- }
655
- try {
656
- return await generateSummaryDraft(selectedResults, summaryContext, signal, modelOverride, feedback);
657
- } catch (err) {
658
- const isEmptyResponse = err instanceof Error && err.message.includes("Summary model returned empty response");
659
- if (!isEmptyResponse) throw err;
660
- const deterministic = buildDeterministicSummary(selectedResults);
661
- return {
662
- summary: deterministic.summary,
663
- meta: {
664
- ...deterministic.meta,
665
- fallbackReason: "summary-model-empty-response",
666
- },
667
- };
668
- }
669
- }
670
-
671
- async function loadSummaryModelChoices(
672
- summaryContext: SummaryGenerationContext,
673
- ): Promise<{ summaryModels: Array<{ value: string; label: string }>; defaultSummaryModel: string | null }> {
674
- const summaryModels: Array<{ value: string; label: string }> = [];
675
- const seen = new Set<string>();
676
- const availableValues = new Set<string>();
677
-
678
- const addModel = (provider: string, id: string) => {
679
- const value = `${provider}/${id}`;
680
- if (seen.has(value)) return;
681
- seen.add(value);
682
- summaryModels.push({ value, label: value });
683
- };
684
-
685
- try {
686
- const availableModels = summaryContext.modelRegistry.getAvailable();
687
- for (const model of availableModels) {
688
- const value = `${model.provider}/${model.id}`;
689
- availableValues.add(value);
690
- addModel(model.provider, model.id);
691
- }
692
- } catch (err) {
693
- const message = err instanceof Error ? err.message : String(err);
694
- console.error(`Failed to load summary models: ${message}`);
695
- }
696
-
697
- const currentModelValue = summaryContext.model
698
- ? `${summaryContext.model.provider}/${summaryContext.model.id}`
699
- : null;
700
- if (summaryContext.model && currentModelValue && !seen.has(currentModelValue)) {
701
- addModel(summaryContext.model.provider, summaryContext.model.id);
702
- }
703
-
704
- const config = loadConfig();
705
- const configuredSummaryModel = typeof config.summaryModel === "string" ? config.summaryModel.trim() : "";
706
- const preferredDefaults = [
707
- "anthropic/claude-haiku-4-5",
708
- "openai-codex/gpt-5.3-codex-spark",
709
- ];
710
-
711
- let defaultSummaryModel: string | null = null;
712
- if (configuredSummaryModel.length > 0 && availableValues.has(configuredSummaryModel)) {
713
- defaultSummaryModel = configuredSummaryModel;
714
- }
715
- if (!defaultSummaryModel) {
716
- for (const preferred of preferredDefaults) {
717
- if (availableValues.has(preferred)) {
718
- defaultSummaryModel = preferred;
719
- break;
720
- }
721
- }
722
- }
723
- if (!defaultSummaryModel && summaryModels.length > 0) {
724
- defaultSummaryModel = summaryModels[0].value;
725
- }
726
-
727
- return { summaryModels, defaultSummaryModel };
728
- }
729
-
730
- function resolveSummaryForSubmit(
731
- payload: { selectedQueryIndices: number[]; summary?: string; summaryMeta?: SummaryMeta },
732
- resultsByIndex: Map<number, QueryResultData>,
733
- ): { approvedSummary: string; summaryMeta: SummaryMeta } {
734
- const submittedSummary = typeof payload.summary === "string" ? payload.summary.trim() : "";
735
- if (submittedSummary.length > 0) {
736
- return {
737
- approvedSummary: submittedSummary,
738
- summaryMeta: normalizeSummaryMeta(payload.summaryMeta, submittedSummary),
739
- };
740
- }
741
-
742
- const selected = filterByQueryIndices(payload.selectedQueryIndices, resultsByIndex).results;
743
- const fallbackResults = selected.length > 0 ? selected : [...resultsByIndex.values()];
744
- const deterministic = buildDeterministicSummary(fallbackResults);
745
- return {
746
- approvedSummary: deterministic.summary,
747
- summaryMeta: deterministic.meta,
748
- };
749
- }
750
-
751
- function buildSearchReturn(opts: SearchReturnOptions) {
752
- const sc = opts.results.filter(r => !r.error).length;
753
- const tr = opts.results.reduce((sum, r) => sum + r.results.length, 0);
754
-
755
- const hasApprovedSummary = typeof opts.approvedSummary === "string" && opts.approvedSummary.trim().length > 0;
756
- let output = "";
757
- if (hasApprovedSummary) {
758
- output = opts.approvedSummary!.trim();
759
- } else {
760
- if (opts.curated) {
761
- output += "[These results were manually curated by the user in the browser. Use them as-is — do not re-search or discard.]\n\n";
762
- }
763
- const duplicateQueries = opts.curated ? duplicateQuerySet(opts.results) : new Set<string>();
764
- for (const { query, answer, results, error, provider } of opts.results) {
765
- if (opts.queryList.length > 1) {
766
- output += opts.curated
767
- ? formatQueryHeader(query, provider, duplicateQueries)
768
- : `## Query: "${query}"\n\n`;
769
- }
770
- if (error) output += `Error: ${error}\n\n`;
771
- else if (results.length === 0) output += "No results found.\n\n";
772
- else output += formatSearchSummary(results, answer) + "\n\n";
773
- }
774
- }
775
-
776
- const hasInlineReady = hasFullInlineCoverage(opts.urls, opts.inlineContent);
777
- let fetchId: string | null = null;
778
- if (hasInlineReady && opts.inlineContent) {
779
- fetchId = generateId();
780
- const data: StoredSearchData = {
781
- id: fetchId,
782
- type: "fetch",
783
- timestamp: Date.now(),
784
- urls: opts.inlineContent,
785
- };
786
- storeResult(fetchId, data);
787
- pi.appendEntry("web-search-results", data);
788
- if (!hasApprovedSummary) {
789
- output += `---\nFull content for ${opts.inlineContent.length} sources available [${fetchId}].`;
790
- }
791
- } else if (opts.includeContent) {
792
- fetchId = startBackgroundFetch(opts.urls);
793
- if (fetchId && !hasApprovedSummary) {
794
- output += `---\nContent fetching in background [${fetchId}]. Will notify when ready.`;
795
- }
796
- }
797
-
798
- const searchId = storeAndPublishSearch(opts.results);
799
- const isBackgroundFetch = fetchId !== null && !hasInlineReady;
800
-
801
- return {
802
- content: [{ type: "text", text: output.trim() }],
803
- details: {
804
- queries: opts.queryList,
805
- queryCount: opts.queryList.length,
806
- successfulQueries: sc,
807
- totalResults: tr,
808
- includeContent: opts.includeContent,
809
- fetchId,
810
- fetchUrls: isBackgroundFetch ? opts.urls : undefined,
811
- searchId,
812
- ...(opts.curated ? {
813
- curated: true,
814
- curatedFrom: opts.curatedFrom,
815
- curatedQueries: opts.results.map(r => ({
816
- query: r.query,
817
- provider: r.provider || null,
818
- answer: r.answer || null,
819
- sources: r.results.map(s => ({ title: s.title, url: s.url })),
820
- error: r.error,
821
- })),
822
- } : {}),
823
- ...((opts.workflow && hasApprovedSummary)
824
- ? {
825
- summary: {
826
- text: opts.approvedSummary!.trim(),
827
- workflow: opts.workflow,
828
- model: opts.summaryMeta?.model ?? null,
829
- durationMs: opts.summaryMeta?.durationMs ?? 0,
830
- tokenEstimate: opts.summaryMeta?.tokenEstimate ?? 0,
831
- fallbackUsed: opts.summaryMeta?.fallbackUsed === true,
832
- fallbackReason: opts.summaryMeta?.fallbackReason,
833
- edited: opts.summaryMeta?.edited === true,
834
- },
835
- }
836
- : {}),
837
- },
838
- };
839
- }
840
-
841
- function filterByQueryIndices(selectedQueryIndices: number[], results: Map<number, QueryResultData>) {
842
- const filteredResults: QueryResultData[] = [];
843
- const filteredUrls: string[] = [];
844
- for (const qi of selectedQueryIndices) {
845
- const r = results.get(qi);
846
- if (r) {
847
- filteredResults.push(r);
848
- for (const res of r.results) {
849
- if (!filteredUrls.includes(res.url)) filteredUrls.push(res.url);
850
- }
851
- }
852
- }
853
- return { results: filteredResults, urls: filteredUrls };
854
- }
855
-
856
- function collectAllResultsAndUrls(resultsByIndex: Map<number, QueryResultData>) {
857
- const results = [...resultsByIndex.values()];
858
- const urls: string[] = [];
859
- for (const result of results) {
860
- for (const source of result.results) {
861
- if (!urls.includes(source.url)) urls.push(source.url);
862
- }
863
- }
864
- return { results, urls };
865
- }
866
-
867
- async function openCuratorBrowser(pc: PendingCurate, searchesComplete = true): Promise<void> {
868
- let handle: CuratorServerHandle | null = null;
869
- try {
870
- pc.phase = "curating";
871
-
872
- const searchAbort = new AbortController();
873
- const addSearchSignal = pc.signal
874
- ? AbortSignal.any([pc.signal, searchAbort.signal])
875
- : searchAbort.signal;
876
-
877
- const sessionToken = randomUUID();
878
- handle = await startCuratorServer(
879
- {
880
- queries: pc.queryList,
881
- sessionToken,
882
- timeout: pc.timeoutSeconds,
883
- availableProviders: pc.availableProviders,
884
- defaultProvider: pc.defaultProvider,
885
- summaryModels: pc.summaryModels,
886
- defaultSummaryModel: pc.defaultSummaryModel,
887
- },
888
- {
889
- async onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {
890
- if (pendingCurate !== pc) throw new Error("Curator session is no longer active.");
891
- pc.onUpdate?.({
892
- content: [{ type: "text", text: "Generating summary draft..." }],
893
- details: { phase: "generating-summary", progress: 0.9 },
894
- });
895
- const draft = await generateSummaryForSelectedIndices(
896
- selectedQueryIndices,
897
- pc.searchResults,
898
- pc.summaryContext,
899
- summarizeSignal,
900
- model,
901
- feedback,
902
- );
903
- if (pendingCurate !== pc) throw new Error("Curator session is no longer active.");
904
- pc.onUpdate?.({
905
- content: [{ type: "text", text: "Summary draft ready — waiting for approval..." }],
906
- details: { phase: "waiting-for-approval", progress: 1 },
907
- });
908
- return draft;
909
- },
910
- onSubmit(payload) {
911
- if (pendingCurate !== pc) return;
912
- searchAbort.abort();
913
- const filtered = payload.selectedQueryIndices.length > 0
914
- ? filterByQueryIndices(payload.selectedQueryIndices, pc.searchResults)
915
- : collectAllResultsAndUrls(pc.searchResults);
916
- const filteredInline = pc.allInlineContent.filter(c => filtered.urls.includes(c.url));
917
- const base: SearchReturnOptions = {
918
- queryList: filtered.results.map(r => r.query),
919
- results: filtered.results,
920
- urls: filtered.urls,
921
- includeContent: pc.includeContent,
922
- inlineContent: filteredInline.length > 0 ? filteredInline : undefined,
923
- curated: true,
924
- curatedFrom: pc.searchResults.size,
925
- };
926
- if (!payload.rawResults) {
927
- const resolvedSummary = resolveSummaryForSubmit(payload, pc.searchResults);
928
- base.workflow = pc.workflow;
929
- base.approvedSummary = resolvedSummary.approvedSummary;
930
- base.summaryMeta = resolvedSummary.summaryMeta;
931
- }
932
- pc.finish(buildSearchReturn(base));
933
- closeCurator();
934
- },
935
- onCancel(reason) {
936
- if (pendingCurate !== pc) return;
937
- searchAbort.abort();
938
- if (reason === "timeout") {
939
- const resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, pc.searchResults);
940
- const all = collectAllResultsAndUrls(pc.searchResults);
941
- const filteredInline = pc.allInlineContent.filter(c => all.urls.includes(c.url));
942
- pc.finish(buildSearchReturn({
943
- queryList: all.results.map(r => r.query),
944
- results: all.results,
945
- urls: all.urls,
946
- includeContent: pc.includeContent,
947
- inlineContent: filteredInline.length > 0 ? filteredInline : undefined,
948
- curated: true,
949
- curatedFrom: pc.searchResults.size,
950
- workflow: pc.workflow,
951
- approvedSummary: resolvedSummary.approvedSummary,
952
- summaryMeta: resolvedSummary.summaryMeta,
953
- }));
954
- } else {
955
- pc.finish(buildCurationCancelledReturn(reason));
956
- }
957
- closeCurator();
958
- },
959
- onProviderChange(provider) {
960
- if (pendingCurate !== pc) return;
961
- const normalized = normalizeProviderInput(provider);
962
- if (!normalized || normalized === "auto") return;
963
- pc.defaultProvider = normalized;
964
- try {
965
- saveConfig({ provider: normalized });
966
- } catch (err) {
967
- const message = err instanceof Error ? err.message : String(err);
968
- console.error(`Failed to persist default provider: ${message}`);
969
- }
970
- },
971
- async onAddSearch(query, queryIndex, provider) {
972
- if (pendingCurate !== pc) throw new Error("Curator session is no longer active.");
973
- const normalizedProvider = normalizeProviderInput(provider);
974
- const requestedProvider = !normalizedProvider || normalizedProvider === "auto"
975
- ? pc.defaultProvider
976
- : normalizedProvider;
977
- try {
978
- const { answer, results, inlineContent, provider: actualProvider } = await search(query, {
979
- provider: requestedProvider,
980
- numResults: pc.numResults,
981
- recencyFilter: pc.recencyFilter,
982
- domainFilter: pc.domainFilter,
983
- includeContent: pc.includeContent,
984
- signal: addSearchSignal,
985
- });
986
- if (pendingCurate !== pc) throw new Error("Curator session is no longer active.");
987
- pc.searchResults.set(queryIndex, { query, answer, results, error: null, provider: actualProvider });
988
- if (inlineContent) pc.allInlineContent.push(...inlineContent);
989
- return {
990
- answer,
991
- results: results.map(r => ({ title: r.title, url: r.url, domain: extractDomain(r.url) })),
992
- provider: actualProvider,
993
- };
994
- } catch (err) {
995
- const message = err instanceof Error ? err.message : String(err);
996
- if (pendingCurate === pc) {
997
- pc.searchResults.set(queryIndex, { query, answer: "", results: [], error: message, provider: requestedProvider });
998
- }
999
- throw err;
1000
- }
1001
- },
1002
- async onRewriteQuery(query, rewriteSignal) {
1003
- if (pendingCurate !== pc) throw new Error("Curator session is no longer active.");
1004
- return rewriteSearchQuery(query, pc.summaryContext, rewriteSignal);
1005
- },
1006
- },
1007
- );
1008
-
1009
- if (pendingCurate !== pc) {
1010
- handle.close();
1011
- return;
1012
- }
1013
-
1014
- activeCurator = handle;
1015
-
1016
- for (const [qi, data] of pc.searchResults) {
1017
- if (data.error) {
1018
- handle.pushError(qi, data.error, data.provider);
1019
- } else {
1020
- handle.pushResult(qi, {
1021
- answer: data.answer,
1022
- results: data.results.map(r => ({ title: r.title, url: r.url, domain: extractDomain(r.url) })),
1023
- provider: data.provider || pc.defaultProvider,
1024
- });
1025
- }
1026
- }
1027
- if (searchesComplete) handle.searchesDone();
1028
-
1029
- pc.onUpdate?.({
1030
- content: [{ type: "text", text: searchesComplete ? "Waiting for summary approval in browser..." : "Searches streaming to browser..." }],
1031
- details: { phase: "curating", progress: searchesComplete ? 1 : 0.5 },
1032
- });
1033
-
1034
- const open = platform() === "darwin" ? await getGlimpseOpen() : null;
1035
- if (open) {
1036
- try {
1037
- const win = openInGlimpse(open, handle.url, "Search Curator");
1038
- glimpseWin = win;
1039
- win.on("closed", () => {
1040
- if (glimpseWin === win) {
1041
- glimpseWin = null;
1042
- closeCurator();
1043
- }
1044
- });
1045
- return;
1046
- } catch (err) {
1047
- const message = err instanceof Error ? err.message : String(err);
1048
- console.error(`Failed to open Glimpse curator window: ${message}`);
1049
- glimpseWin = null;
1050
- }
1051
- }
1052
- await openInBrowser(pi, handle.url);
1053
- } catch (err) {
1054
- const message = err instanceof Error ? err.message : String(err);
1055
- console.error(`Failed to open curator UI: ${message}`);
1056
- if (pendingCurate === pc || (handle && activeCurator === handle)) {
1057
- closeCurator();
1058
- }
1059
- }
1060
- }
1061
-
1062
- pi.registerShortcut(curateKey, {
1063
- description: "Review search results",
1064
- handler: async (ctx) => {
1065
- if (!pendingCurate) return;
1066
-
1067
- if (pendingCurate.phase === "searching") {
1068
- pendingCurate.browserPromise = openCuratorBrowser(pendingCurate, false);
1069
- ctx.ui.notify("Opening curator — remaining searches will stream in", "info");
1070
- return;
1071
- }
1072
- },
1073
- });
1074
-
1075
- pi.registerShortcut(activityKey, {
1076
- description: "Toggle web search activity",
1077
- handler: async (ctx) => {
1078
- widgetVisible = !widgetVisible;
1079
- if (widgetVisible) {
1080
- widgetUnsubscribe = activityMonitor.onUpdate(() => updateWidget(ctx));
1081
- updateWidget(ctx);
1082
- } else {
1083
- widgetUnsubscribe?.();
1084
- widgetUnsubscribe = null;
1085
- ctx.ui.setWidget("web-activity", null);
1086
- }
1087
- },
1088
- });
1089
-
1090
- pi.on("session_start", async (_event, ctx) => handleSessionChange(ctx));
1091
- pi.on("session_tree", async (_event, ctx) => handleSessionChange(ctx));
1092
-
1093
- pi.on("session_shutdown", () => {
1094
- sessionActive = false;
1095
- abortPendingFetches();
1096
- closeCurator();
1097
- clearCloneCache();
1098
- clearResults();
1099
- // Unsubscribe before clear() to avoid callback with stale ctx
1100
- widgetUnsubscribe?.();
1101
- widgetUnsubscribe = null;
1102
- activityMonitor.clear();
1103
- widgetVisible = false;
1104
- });
1105
-
1106
- pi.registerTool({
1107
- name: "web_search",
1108
- label: "Web Search",
1109
- description:
1110
- `Search the web using Perplexity AI, Exa, or Gemini. Returns an AI-synthesized answer with source citations. For comprehensive research, prefer queries (plural) with 2-4 varied angles over a single query — each query gets its own synthesized answer, so varying phrasing and scope gives much broader coverage. When includeContent is true, full page content is fetched in the background. Searches auto-open the interactive browser curator and stream results live; set workflow to "none" to skip curation. Provider auto-selects: Exa (direct API with key, MCP fallback without), else Perplexity (needs key), else Gemini API (needs key), else Gemini Web (needs a supported Chromium-based browser login).`,
1111
- promptSnippet:
1112
- "Use for web research questions. Prefer {queries:[...]} with 2-4 varied angles over a single query for broader coverage.",
1113
- parameters: Type.Object({
1114
- query: Type.Optional(Type.String({ description: "Single search query. For research tasks, prefer 'queries' with multiple varied angles instead." })),
1115
- queries: Type.Optional(Type.Array(Type.String(), { description: "Multiple queries searched in sequence, each returning its own synthesized answer. Prefer this for research — vary phrasing, scope, and angle across 2-4 queries to maximize coverage. Good: ['React vs Vue performance benchmarks 2026', 'React vs Vue developer experience comparison', 'React ecosystem size vs Vue ecosystem']. Bad: ['React vs Vue', 'React vs Vue comparison', 'React vs Vue review'] (too similar, redundant results)." })),
1116
- numResults: Type.Optional(Type.Number({ description: "Results per query (default: 5, max: 20)" })),
1117
- includeContent: Type.Optional(Type.Boolean({ description: "Fetch full page content (async)" })),
1118
- recencyFilter: Type.Optional(
1119
- StringEnum(["day", "week", "month", "year"], { description: "Filter by recency" }),
1120
- ),
1121
- domainFilter: Type.Optional(Type.Array(Type.String(), { description: "Limit to domains (prefix with - to exclude)" })),
1122
- provider: Type.Optional(
1123
- StringEnum(["auto", "perplexity", "gemini", "exa"], { description: "Search provider (default: auto)" }),
1124
- ),
1125
- workflow: Type.Optional(
1126
- StringEnum(["none", "summary-review"], {
1127
- description: "Search workflow mode: none = no curator, summary-review = open curator with auto summary draft (default)",
1128
- }),
1129
- ),
1130
- }),
1131
-
1132
- async execute(_toolCallId, params, signal, onUpdate, ctx) {
1133
- const rawQueryList: unknown[] = Array.isArray(params.queries)
1134
- ? params.queries
1135
- : (params.query !== undefined ? [params.query] : []);
1136
- const queryList = normalizeQueryList(rawQueryList);
1137
- const configWorkflow = loadConfigForExtensionInit().workflow;
1138
- const workflow = resolveWorkflow(params.workflow ?? configWorkflow, ctx?.hasUI !== false);
1139
- const shouldCurate = workflow !== "none";
1140
-
1141
- if (queryList.length === 0) {
1142
- return {
1143
- content: [{ type: "text", text: "Error: No query provided. Use 'query' or 'queries' parameter." }],
1144
- details: { error: "No query provided" },
1145
- };
1146
- }
1147
-
1148
- if (shouldCurate && !ctx) {
1149
- return {
1150
- content: [{ type: "text", text: "Error: Curation requires an active extension context." }],
1151
- details: { error: "Missing extension context" },
1152
- };
1153
- }
1154
-
1155
- if (shouldCurate) {
1156
- closeCurator();
1157
-
1158
- let resolvePromise: (value: unknown) => void = () => {};
1159
- const promise = new Promise<unknown>((resolve) => {
1160
- resolvePromise = resolve;
1161
- });
1162
- const includeContent = params.includeContent ?? false;
1163
- const searchResults = new Map<number, QueryResultData>();
1164
- const allInlineContent: ExtractedContent[] = [];
1165
- const searchAbort = new AbortController();
1166
- const searchSignal = signal
1167
- ? AbortSignal.any([signal, searchAbort.signal])
1168
- : searchAbort.signal;
1169
- let cancelled = false;
1170
-
1171
- const bootstrap = await loadCuratorBootstrap(params.provider);
1172
- const availableProviders = bootstrap.availableProviders;
1173
- const defaultProvider = bootstrap.defaultProvider;
1174
- const curatorTimeoutSeconds = bootstrap.timeoutSeconds;
1175
- const curatorWorkflow: CuratorWorkflow = "summary-review";
1176
-
1177
- const summaryContext: SummaryGenerationContext = {
1178
- model: ctx.model,
1179
- modelRegistry: ctx.modelRegistry,
1180
- };
1181
- const summaryModelChoices = await loadSummaryModelChoices(summaryContext);
1182
-
1183
- const pc: PendingCurate = {
1184
- phase: "searching",
1185
- workflow: curatorWorkflow,
1186
- summaryContext,
1187
- searchResults,
1188
- allInlineContent,
1189
- queryList,
1190
- includeContent,
1191
- numResults: params.numResults,
1192
- recencyFilter: params.recencyFilter,
1193
- domainFilter: params.domainFilter,
1194
- availableProviders,
1195
- defaultProvider,
1196
- summaryModels: summaryModelChoices.summaryModels,
1197
- defaultSummaryModel: summaryModelChoices.defaultSummaryModel,
1198
- timeoutSeconds: curatorTimeoutSeconds,
1199
- onUpdate: onUpdate as PendingCurate["onUpdate"],
1200
- signal,
1201
- abortSearches: () => {
1202
- if (!searchAbort.signal.aborted) searchAbort.abort();
1203
- },
1204
- finish: () => {},
1205
- cancel: () => {},
1206
- };
1207
-
1208
- const finish = (value: unknown) => {
1209
- if (cancelled) return;
1210
- cancelled = true;
1211
- pc.abortSearches();
1212
- signal?.removeEventListener("abort", onAbort);
1213
- pendingCurate = null;
1214
- resolvePromise(value);
1215
- };
1216
-
1217
- const cancel = (reason: "user" | "stale" = "stale") => {
1218
- if (cancelled) return;
1219
- finish(buildCurationCancelledReturn(reason));
1220
- };
1221
-
1222
- pc.finish = finish;
1223
- pc.cancel = cancel;
1224
-
1225
- const onAbort = () => closeCurator();
1226
- pendingCurate = pc;
1227
- signal?.addEventListener("abort", onAbort, { once: true });
1228
- pc.browserPromise = openCuratorBrowser(pc, false);
1229
-
1230
- for (let qi = 0; qi < queryList.length; qi++) {
1231
- if (signal?.aborted || cancelled || searchAbort.signal.aborted) break;
1232
- onUpdate?.({
1233
- content: [{ type: "text", text: `Searching ${qi + 1}/${queryList.length}: "${queryList[qi]}"...` }],
1234
- details: { phase: "searching", progress: qi / queryList.length, currentQuery: queryList[qi] },
1235
- });
1236
- const requestedProvider = pc.defaultProvider;
1237
- try {
1238
- const { answer, results, inlineContent, provider } = await search(queryList[qi], {
1239
- provider: requestedProvider,
1240
- numResults: params.numResults,
1241
- recencyFilter: params.recencyFilter,
1242
- domainFilter: params.domainFilter,
1243
- includeContent: params.includeContent,
1244
- signal: searchSignal,
1245
- });
1246
- if (signal?.aborted || cancelled || searchAbort.signal.aborted) break;
1247
- searchResults.set(qi, { query: queryList[qi], answer, results, error: null, provider });
1248
- if (inlineContent) allInlineContent.push(...inlineContent);
1249
- if (activeCurator) {
1250
- activeCurator.pushResult(qi, {
1251
- answer,
1252
- results: results.map(r => ({ title: r.title, url: r.url, domain: extractDomain(r.url) })),
1253
- provider,
1254
- });
1255
- }
1256
- } catch (err) {
1257
- if (signal?.aborted || cancelled || searchAbort.signal.aborted) break;
1258
- const message = err instanceof Error ? err.message : String(err);
1259
- searchResults.set(qi, { query: queryList[qi], answer: "", results: [], error: message, provider: requestedProvider });
1260
- if (activeCurator) {
1261
- activeCurator.pushError(qi, message, requestedProvider);
1262
- }
1263
- }
1264
- }
1265
-
1266
- if (signal?.aborted || cancelled || searchAbort.signal.aborted) {
1267
- cancel();
1268
- return promise;
1269
- }
1270
-
1271
- await pc.browserPromise;
1272
- if (activeCurator) {
1273
- activeCurator.searchesDone();
1274
- pc.onUpdate?.({
1275
- content: [{ type: "text", text: "All searches complete — waiting for summary approval in browser..." }],
1276
- details: { phase: "curating", progress: 1 },
1277
- });
1278
- }
1279
-
1280
- return promise;
1281
- }
1282
-
1283
- const searchResults: QueryResultData[] = [];
1284
- const allUrls: string[] = [];
1285
- const allInlineContent: ExtractedContent[] = [];
1286
- const resolvedProvider = normalizeProviderInput(params.provider ?? loadConfig().provider);
1287
-
1288
- for (let i = 0; i < queryList.length; i++) {
1289
- const query = queryList[i];
1290
-
1291
- onUpdate?.({
1292
- content: [{ type: "text", text: `Searching ${i + 1}/${queryList.length}: "${query}"...` }],
1293
- details: { phase: "search", progress: i / queryList.length, currentQuery: query },
1294
- });
1295
-
1296
- try {
1297
- const { answer, results, inlineContent, provider } = await search(query, {
1298
- provider: resolvedProvider,
1299
- numResults: params.numResults,
1300
- recencyFilter: params.recencyFilter,
1301
- domainFilter: params.domainFilter,
1302
- includeContent: params.includeContent,
1303
- signal,
1304
- });
1305
-
1306
- searchResults.push({ query, answer, results, error: null, provider });
1307
- for (const r of results) {
1308
- if (!allUrls.includes(r.url)) {
1309
- allUrls.push(r.url);
1310
- }
1311
- }
1312
- if (inlineContent) allInlineContent.push(...inlineContent);
1313
- } catch (err) {
1314
- const message = err instanceof Error ? err.message : String(err);
1315
- const requestedProvider = typeof resolvedProvider === "string" && resolvedProvider !== "auto"
1316
- ? resolvedProvider
1317
- : undefined;
1318
- searchResults.push({ query, answer: "", results: [], error: message, provider: requestedProvider });
1319
- }
1320
- }
1321
-
1322
- return buildSearchReturn({
1323
- queryList,
1324
- results: searchResults,
1325
- urls: allUrls,
1326
- includeContent: params.includeContent ?? false,
1327
- inlineContent: allInlineContent.length > 0 ? allInlineContent : undefined,
1328
- });
1329
- },
1330
-
1331
- renderCall(args, theme) {
1332
- const input = args as { query?: unknown; queries?: unknown };
1333
- const rawQueryList: unknown[] = Array.isArray(input.queries)
1334
- ? input.queries
1335
- : (input.query !== undefined ? [input.query] : []);
1336
- const queryList = normalizeQueryList(rawQueryList);
1337
- if (queryList.length === 0) {
1338
- return new Text(theme.fg("toolTitle", theme.bold("search ")) + theme.fg("error", "(no query)"), 0, 0);
1339
- }
1340
- if (queryList.length === 1) {
1341
- const q = queryList[0];
1342
- const display = q.length > 60 ? q.slice(0, 57) + "..." : q;
1343
- return new Text(theme.fg("toolTitle", theme.bold("search ")) + theme.fg("accent", `"${display}"`), 0, 0);
1344
- }
1345
- const lines = [theme.fg("toolTitle", theme.bold("search ")) + theme.fg("accent", `${queryList.length} queries`)];
1346
- for (const q of queryList.slice(0, 5)) {
1347
- const display = q.length > 50 ? q.slice(0, 47) + "..." : q;
1348
- lines.push(theme.fg("muted", ` "${display}"`));
1349
- }
1350
- if (queryList.length > 5) {
1351
- lines.push(theme.fg("muted", ` ... and ${queryList.length - 5} more`));
1352
- }
1353
- return new Text(lines.join("\n"), 0, 0);
1354
- },
1355
-
1356
- renderResult: renderWebSearchResult,
1357
- });
1358
-
1359
- pi.registerTool({
1360
- name: "code_search",
1361
- label: "Code Search",
1362
- description: "Search for code examples, documentation, and API references. Returns relevant code snippets and docs from GitHub, Stack Overflow, and official documentation. Use for any programming question — API usage, library examples, debugging help.",
1363
- promptSnippet:
1364
- "Use for programming/API/library questions to retrieve concrete examples and docs before implementing or debugging code.",
1365
- parameters: Type.Object({
1366
- query: Type.String({ description: "Programming question, API, library, or debugging topic to search for" }),
1367
- maxTokens: Type.Optional(Type.Integer({
1368
- minimum: 1000,
1369
- maximum: 50000,
1370
- description: "Maximum tokens of code/documentation context to return (default: 5000)",
1371
- })),
1372
- }),
1373
-
1374
- async execute(toolCallId, params, signal) {
1375
- return executeCodeSearch(toolCallId, params, signal);
1376
- },
1377
-
1378
- renderCall(args, theme) {
1379
- const { query } = args as { query?: string };
1380
- const display = !query
1381
- ? "(no query)"
1382
- : query.length > 70 ? query.slice(0, 67) + "..." : query;
1383
- return new Text(theme.fg("toolTitle", theme.bold("code_search ")) + theme.fg("accent", display), 0, 0);
1384
- },
1385
-
1386
- renderResult: renderCodeSearchResult,
1387
- });
1388
-
1389
- pi.registerTool({
1390
- name: "fetch_content",
1391
- label: "Fetch Content",
1392
- description: "Fetch URL(s) and extract readable content as markdown. Supports YouTube video transcripts (with thumbnail), GitHub repository contents, and local video files (with frame thumbnail). Video frames can be extracted via timestamp/range or sampled across the entire video with frames alone. Falls back to Gemini for pages that block bots or fail Readability extraction. For YouTube and video files: ALWAYS pass the user's specific question via the prompt parameter — this directs the AI to focus on that aspect of the video, producing much better results than a generic extraction. Content is always stored and can be retrieved with get_search_content.",
1393
- promptSnippet:
1394
- "Use to extract readable content from URL(s), YouTube, GitHub repos, or local videos. For video questions, pass the user's exact question in prompt.",
1395
- parameters: Type.Object({
1396
- url: Type.Optional(Type.String({ description: "Single URL to fetch" })),
1397
- urls: Type.Optional(Type.Array(Type.String(), { description: "Multiple URLs (parallel)" })),
1398
- forceClone: Type.Optional(Type.Boolean({
1399
- description: "Force cloning large GitHub repositories that exceed the size threshold",
1400
- })),
1401
- prompt: Type.Optional(Type.String({
1402
- description: "Question or instruction for video analysis (YouTube and video files). Pass the user's specific question here — e.g. 'describe the book shown at the advice for beginners section'. Without this, a generic transcript extraction is used which may miss what the user is asking about.",
1403
- })),
1404
- timestamp: Type.Optional(Type.String({
1405
- description: "Extract video frame(s) at a timestamp or time range. Single: '1:23:45', '23:45', or '85' (seconds). Range: '23:41-25:00' extracts evenly-spaced frames across that span (default 6). Use frames with ranges to control density; single+frames uses a fixed 5s interval. YouTube requires yt-dlp + ffmpeg; local videos require ffmpeg. Use a range when you know the approximate area but not the exact moment — you'll get a contact sheet to visually identify the right frame.",
1406
- })),
1407
- frames: Type.Optional(Type.Integer({
1408
- minimum: 1,
1409
- maximum: 12,
1410
- description: "Number of frames to extract. Use with timestamp range for custom density, with single timestamp to get N frames at 5s intervals, or alone to sample across the entire video. Requires yt-dlp + ffmpeg for YouTube, ffmpeg for local video.",
1411
- })),
1412
- model: Type.Optional(Type.String({
1413
- description: "Override the Gemini model for video/YouTube analysis (e.g. 'gemini-2.5-flash', 'gemini-3-flash-preview'). Defaults to config or gemini-3-flash-preview.",
1414
- })),
1415
- }),
1416
-
1417
- async execute(_toolCallId, params, signal, onUpdate) {
1418
- const urlList = params.urls ?? (params.url ? [params.url] : []);
1419
- if (urlList.length === 0) {
1420
- return {
1421
- content: [{ type: "text", text: "Error: No URL provided." }],
1422
- details: { error: "No URL provided" },
1423
- };
1424
- }
1425
-
1426
- onUpdate?.({
1427
- content: [{ type: "text", text: `Fetching ${urlList.length} URL(s)...` }],
1428
- details: { phase: "fetch", progress: 0 },
1429
- });
1430
-
1431
- const fetchResults = await fetchAllContent(urlList, signal, {
1432
- forceClone: params.forceClone,
1433
- prompt: params.prompt,
1434
- timestamp: params.timestamp,
1435
- frames: params.frames,
1436
- model: params.model,
1437
- });
1438
- const successful = fetchResults.filter((r) => !r.error).length;
1439
- const totalChars = fetchResults.reduce((sum, r) => sum + r.content.length, 0);
1440
-
1441
- // ALWAYS store results (even for single URL)
1442
- const responseId = generateId();
1443
- const data: StoredSearchData = {
1444
- id: responseId,
1445
- type: "fetch",
1446
- timestamp: Date.now(),
1447
- urls: stripThumbnails(fetchResults),
1448
- };
1449
- storeResult(responseId, data);
1450
- pi.appendEntry("web-search-results", data);
1451
-
1452
- // Single URL: return content directly (possibly truncated) with responseId
1453
- if (urlList.length === 1) {
1454
- const result = fetchResults[0];
1455
- if (result.error) {
1456
- return {
1457
- content: [{ type: "text", text: `Error: ${result.error}` }],
1458
- details: { urls: urlList, urlCount: 1, successful: 0, error: result.error, responseId, prompt: params.prompt, timestamp: params.timestamp, frames: params.frames },
1459
- };
1460
- }
1461
-
1462
- const fullLength = result.content.length;
1463
- const truncated = fullLength > MAX_INLINE_CONTENT;
1464
- let output = truncated
1465
- ? result.content.slice(0, MAX_INLINE_CONTENT) + "\n\n[Content truncated...]"
1466
- : result.content;
1467
-
1468
- if (truncated) {
1469
- output += `\n\n---\nShowing ${MAX_INLINE_CONTENT} of ${fullLength} chars. ` +
1470
- `Use get_search_content({ responseId: "${responseId}", urlIndex: 0 }) for full content.`;
1471
- }
1472
-
1473
- const content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [];
1474
- if (result.frames?.length) {
1475
- for (const frame of result.frames) {
1476
- content.push({ type: "image", data: frame.data, mimeType: frame.mimeType });
1477
- content.push({ type: "text", text: `Frame at ${frame.timestamp}` });
1478
- }
1479
- } else if (result.thumbnail) {
1480
- content.push({ type: "image", data: result.thumbnail.data, mimeType: result.thumbnail.mimeType });
1481
- }
1482
- content.push({ type: "text", text: output });
1483
-
1484
- const imageCount = (result.frames?.length ?? 0) + (result.thumbnail ? 1 : 0);
1485
- return {
1486
- content,
1487
- details: {
1488
- urls: urlList,
1489
- urlCount: 1,
1490
- successful: 1,
1491
- totalChars: fullLength,
1492
- title: result.title,
1493
- responseId,
1494
- truncated,
1495
- hasImage: imageCount > 0,
1496
- imageCount,
1497
- prompt: params.prompt,
1498
- timestamp: params.timestamp,
1499
- frames: params.frames,
1500
- duration: result.duration,
1501
- },
1502
- };
1503
- }
1504
-
1505
- // Multi-URL: existing behavior (summary + responseId)
1506
- let output = "## Fetched URLs\n\n";
1507
- for (const { url, title, content, error } of fetchResults) {
1508
- if (error) {
1509
- output += `- ${url}: Error - ${error}\n`;
1510
- } else {
1511
- output += `- ${title || url} (${content.length} chars)\n`;
1512
- }
1513
- }
1514
- output += `\n---\nUse get_search_content({ responseId: "${responseId}", urlIndex: 0 }) to retrieve full content.`;
1515
-
1516
- return {
1517
- content: [{ type: "text", text: output }],
1518
- details: { urls: urlList, urlCount: urlList.length, successful, totalChars, responseId },
1519
- };
1520
- },
1521
-
1522
- renderCall(args, theme) {
1523
- const { url, urls, prompt, timestamp, frames, model } = args as { url?: string; urls?: string[]; prompt?: string; timestamp?: string; frames?: number; model?: string };
1524
- const urlList = urls ?? (url ? [url] : []);
1525
- if (urlList.length === 0) {
1526
- return new Text(theme.fg("toolTitle", theme.bold("fetch ")) + theme.fg("error", "(no URL)"), 0, 0);
1527
- }
1528
- const lines: string[] = [];
1529
- if (urlList.length === 1) {
1530
- const display = urlList[0].length > 60 ? urlList[0].slice(0, 57) + "..." : urlList[0];
1531
- lines.push(theme.fg("toolTitle", theme.bold("fetch ")) + theme.fg("accent", display));
1532
- } else {
1533
- lines.push(theme.fg("toolTitle", theme.bold("fetch ")) + theme.fg("accent", `${urlList.length} URLs`));
1534
- for (const u of urlList.slice(0, 5)) {
1535
- const display = u.length > 60 ? u.slice(0, 57) + "..." : u;
1536
- lines.push(theme.fg("muted", " " + display));
1537
- }
1538
- if (urlList.length > 5) {
1539
- lines.push(theme.fg("muted", ` ... and ${urlList.length - 5} more`));
1540
- }
1541
- }
1542
- if (timestamp) {
1543
- lines.push(theme.fg("dim", " timestamp: ") + theme.fg("warning", timestamp));
1544
- }
1545
- if (typeof frames === "number") {
1546
- lines.push(theme.fg("dim", " frames: ") + theme.fg("warning", String(frames)));
1547
- }
1548
- if (prompt) {
1549
- const display = prompt.length > 250 ? prompt.slice(0, 247) + "..." : prompt;
1550
- lines.push(theme.fg("dim", " prompt: ") + theme.fg("muted", `"${display}"`));
1551
- }
1552
- if (model) {
1553
- lines.push(theme.fg("dim", " model: ") + theme.fg("warning", model));
1554
- }
1555
- return new Text(lines.join("\n"), 0, 0);
1556
- },
1557
-
1558
- renderResult: renderFetchContentResult,
1559
- });
1560
-
1561
- pi.registerTool({
1562
- name: "get_search_content",
1563
- label: "Get Search Content",
1564
- description: "Retrieve full content from a previous web_search or fetch_content call.",
1565
- promptSnippet:
1566
- "Use after web_search/fetch_content when full stored content is needed via responseId plus query/url selectors.",
1567
- parameters: Type.Object({
1568
- responseId: Type.String({ description: "The responseId from web_search or fetch_content" }),
1569
- query: Type.Optional(Type.String({ description: "Get content for this query (web_search)" })),
1570
- queryIndex: Type.Optional(Type.Number({ description: "Get content for query at index" })),
1571
- url: Type.Optional(Type.String({ description: "Get content for this URL" })),
1572
- urlIndex: Type.Optional(Type.Number({ description: "Get content for URL at index" })),
1573
- }),
1574
-
1575
- async execute(_toolCallId, params) {
1576
- const data = getResult(params.responseId);
1577
- if (!data) {
1578
- return {
1579
- content: [{ type: "text", text: `Error: No stored results for "${params.responseId}"` }],
1580
- details: { error: "Not found", responseId: params.responseId },
1581
- };
1582
- }
1583
-
1584
- if (data.type === "search" && data.queries) {
1585
- let queryData: QueryResultData | undefined;
1586
-
1587
- if (params.query !== undefined) {
1588
- queryData = data.queries.find((q) => q.query === params.query);
1589
- if (!queryData) {
1590
- const available = data.queries.map((q) => `"${q.query}"`).join(", ");
1591
- return {
1592
- content: [{ type: "text", text: `Query "${params.query}" not found. Available: ${available}` }],
1593
- details: { error: "Query not found" },
1594
- };
1595
- }
1596
- } else if (params.queryIndex !== undefined) {
1597
- queryData = data.queries[params.queryIndex];
1598
- if (!queryData) {
1599
- return {
1600
- content: [{ type: "text", text: `Index ${params.queryIndex} out of range (0-${data.queries.length - 1})` }],
1601
- details: { error: "Index out of range" },
1602
- };
1603
- }
1604
- } else {
1605
- const available = data.queries.map((q, i) => `${i}: "${q.query}"`).join(", ");
1606
- return {
1607
- content: [{ type: "text", text: `Specify query or queryIndex. Available: ${available}` }],
1608
- details: { error: "No query specified" },
1609
- };
1610
- }
1611
-
1612
- if (queryData.error) {
1613
- return {
1614
- content: [{ type: "text", text: `Error for "${queryData.query}": ${queryData.error}` }],
1615
- details: { error: queryData.error, query: queryData.query },
1616
- };
1617
- }
1618
-
1619
- return {
1620
- content: [{ type: "text", text: formatFullResults(queryData) }],
1621
- details: { query: queryData.query, resultCount: queryData.results.length },
1622
- };
1623
- }
1624
-
1625
- if (data.type === "fetch" && data.urls) {
1626
- let urlData: ExtractedContent | undefined;
1627
-
1628
- if (params.url !== undefined) {
1629
- urlData = data.urls.find((u) => u.url === params.url);
1630
- if (!urlData) {
1631
- const available = data.urls.map((u) => u.url).join("\n ");
1632
- return {
1633
- content: [{ type: "text", text: `URL not found. Available:\n ${available}` }],
1634
- details: { error: "URL not found" },
1635
- };
1636
- }
1637
- } else if (params.urlIndex !== undefined) {
1638
- urlData = data.urls[params.urlIndex];
1639
- if (!urlData) {
1640
- return {
1641
- content: [{ type: "text", text: `Index ${params.urlIndex} out of range (0-${data.urls.length - 1})` }],
1642
- details: { error: "Index out of range" },
1643
- };
1644
- }
1645
- } else {
1646
- const available = data.urls.map((u, i) => `${i}: ${u.url}`).join("\n ");
1647
- return {
1648
- content: [{ type: "text", text: `Specify url or urlIndex. Available:\n ${available}` }],
1649
- details: { error: "No URL specified" },
1650
- };
1651
- }
1652
-
1653
- if (urlData.error) {
1654
- return {
1655
- content: [{ type: "text", text: `Error for ${urlData.url}: ${urlData.error}` }],
1656
- details: { error: urlData.error, url: urlData.url },
1657
- };
1658
- }
1659
-
1660
- return {
1661
- content: [{ type: "text", text: `# ${urlData.title}\n\n${urlData.content}` }],
1662
- details: { url: urlData.url, title: urlData.title, contentLength: urlData.content.length },
1663
- };
1664
- }
1665
-
1666
- return {
1667
- content: [{ type: "text", text: "Invalid stored data format" }],
1668
- details: { error: "Invalid data" },
1669
- };
1670
- },
1671
-
1672
- renderCall(args, theme) {
1673
- const { responseId, query, queryIndex, url, urlIndex } = args as {
1674
- responseId: string;
1675
- query?: string;
1676
- queryIndex?: number;
1677
- url?: string;
1678
- urlIndex?: number;
1679
- };
1680
- let target = "";
1681
- if (query) target = `query="${query}"`;
1682
- else if (queryIndex !== undefined) target = `queryIndex=${queryIndex}`;
1683
- else if (url) target = url.length > 30 ? url.slice(0, 27) + "..." : url;
1684
- else if (urlIndex !== undefined) target = `urlIndex=${urlIndex}`;
1685
- return new Text(theme.fg("toolTitle", theme.bold("get_content ")) + theme.fg("accent", target || responseId.slice(0, 8)), 0, 0);
1686
- },
1687
-
1688
- renderResult: renderGetSearchContentResult,
1689
- });
1690
-
1691
- pi.registerCommand("websearch", {
1692
- description: "Open web search curator",
1693
- handler: async (args, ctx) => {
1694
- closeCurator();
1695
- const sessionToken = randomUUID();
1696
-
1697
- const raw = args.trim();
1698
- const queries = raw.length > 0
1699
- ? normalizeQueryList(raw.split(","))
1700
- : [];
1701
-
1702
- let bootstrap: CuratorBootstrap;
1703
- try {
1704
- bootstrap = await loadCuratorBootstrap(undefined);
1705
- } catch (err) {
1706
- const message = err instanceof Error ? err.message : String(err);
1707
- ctx.ui.notify(`Failed to load web search config: ${message}`, "error");
1708
- return;
1709
- }
1710
- const availableProviders = bootstrap.availableProviders;
1711
- const initialProvider = bootstrap.defaultProvider;
1712
- const curatorTimeoutSeconds = bootstrap.timeoutSeconds;
1713
- let currentProvider = initialProvider;
1714
- const summaryContext: SummaryGenerationContext = {
1715
- model: ctx.model,
1716
- modelRegistry: ctx.modelRegistry,
1717
- };
1718
- const summaryModelChoices = await loadSummaryModelChoices(summaryContext);
1719
-
1720
- ctx.ui.notify("Opening web search curator...", "info");
1721
-
1722
- const collected = new Map<number, QueryResultData>();
1723
- const searchAbort = new AbortController();
1724
- let aborted = false;
1725
- let commandHandle: CuratorServerHandle | null = null;
1726
-
1727
- function sendFollowUpFromReturn(payload: ReturnType<typeof buildSearchReturn>) {
1728
- pi.sendMessage({
1729
- customType: "web-search-results",
1730
- content: payload.content,
1731
- display: "tool",
1732
- details: payload.details,
1733
- }, { triggerTurn: true, deliverAs: "followUp" });
1734
- }
1735
-
1736
- try {
1737
- const handle = await startCuratorServer(
1738
- {
1739
- queries,
1740
- sessionToken,
1741
- timeout: curatorTimeoutSeconds,
1742
- availableProviders,
1743
- defaultProvider: initialProvider,
1744
- summaryModels: summaryModelChoices.summaryModels,
1745
- defaultSummaryModel: summaryModelChoices.defaultSummaryModel,
1746
- },
1747
- {
1748
- async onSummarize(selectedQueryIndices, summarizeSignal, model, feedback) {
1749
- if (commandHandle && activeCurator !== commandHandle) {
1750
- throw new Error("Curator session is no longer active.");
1751
- }
1752
- return generateSummaryForSelectedIndices(
1753
- selectedQueryIndices,
1754
- collected,
1755
- summaryContext,
1756
- summarizeSignal,
1757
- model,
1758
- feedback,
1759
- );
1760
- },
1761
- onSubmit(payload) {
1762
- if (commandHandle && activeCurator !== commandHandle) return;
1763
- aborted = true;
1764
- searchAbort.abort();
1765
- const filtered = payload.selectedQueryIndices.length > 0
1766
- ? filterByQueryIndices(payload.selectedQueryIndices, collected)
1767
- : collectAllResultsAndUrls(collected);
1768
- const base: SearchReturnOptions = {
1769
- queryList: filtered.results.map(r => r.query),
1770
- results: filtered.results,
1771
- urls: filtered.urls,
1772
- includeContent: false,
1773
- curated: true,
1774
- curatedFrom: collected.size,
1775
- };
1776
- if (!payload.rawResults) {
1777
- const resolvedSummary = resolveSummaryForSubmit(payload, collected);
1778
- base.workflow = "summary-review";
1779
- base.approvedSummary = resolvedSummary.approvedSummary;
1780
- base.summaryMeta = resolvedSummary.summaryMeta;
1781
- }
1782
- sendFollowUpFromReturn(buildSearchReturn(base));
1783
- closeCurator();
1784
- },
1785
- onCancel(reason) {
1786
- if (commandHandle && activeCurator !== commandHandle) return;
1787
- aborted = true;
1788
- searchAbort.abort();
1789
- if (reason === "timeout") {
1790
- const all = collectAllResultsAndUrls(collected);
1791
- const resolvedSummary = resolveSummaryForSubmit({ selectedQueryIndices: [], summary: undefined, summaryMeta: undefined }, collected);
1792
- sendFollowUpFromReturn(buildSearchReturn({
1793
- queryList: all.results.map(r => r.query),
1794
- results: all.results,
1795
- urls: all.urls,
1796
- includeContent: false,
1797
- curated: true,
1798
- curatedFrom: collected.size,
1799
- workflow: "summary-review",
1800
- approvedSummary: resolvedSummary.approvedSummary,
1801
- summaryMeta: resolvedSummary.summaryMeta,
1802
- }));
1803
- }
1804
- closeCurator();
1805
- },
1806
- onProviderChange(provider) {
1807
- if (commandHandle && activeCurator !== commandHandle) return;
1808
- const normalized = normalizeProviderInput(provider);
1809
- if (!normalized || normalized === "auto") return;
1810
- currentProvider = normalized;
1811
- try {
1812
- saveConfig({ provider: normalized });
1813
- } catch (err) {
1814
- const message = err instanceof Error ? err.message : String(err);
1815
- console.error(`Failed to persist default provider: ${message}`);
1816
- }
1817
- },
1818
- async onAddSearch(query, queryIndex, provider) {
1819
- if (commandHandle && activeCurator !== commandHandle) {
1820
- throw new Error("Curator session is no longer active.");
1821
- }
1822
- const normalizedProvider = normalizeProviderInput(provider);
1823
- const requestedProvider = !normalizedProvider || normalizedProvider === "auto"
1824
- ? currentProvider
1825
- : normalizedProvider;
1826
- try {
1827
- const { answer, results, provider: actualProvider } = await search(query, {
1828
- provider: requestedProvider,
1829
- signal: searchAbort.signal,
1830
- });
1831
- if (commandHandle && activeCurator !== commandHandle) {
1832
- throw new Error("Curator session is no longer active.");
1833
- }
1834
- collected.set(queryIndex, { query, answer, results, error: null, provider: actualProvider });
1835
- return {
1836
- answer,
1837
- results: results.map(r => ({ title: r.title, url: r.url, domain: extractDomain(r.url) })),
1838
- provider: actualProvider,
1839
- };
1840
- } catch (err) {
1841
- const message = err instanceof Error ? err.message : String(err);
1842
- if (!commandHandle || activeCurator === commandHandle) {
1843
- collected.set(queryIndex, { query, answer: "", results: [], error: message, provider: requestedProvider });
1844
- }
1845
- throw err;
1846
- }
1847
- },
1848
- async onRewriteQuery(query, rewriteSignal) {
1849
- if (commandHandle && activeCurator !== commandHandle) {
1850
- throw new Error("Curator session is no longer active.");
1851
- }
1852
- return rewriteSearchQuery(query, summaryContext, rewriteSignal);
1853
- },
1854
- },
1855
- );
1856
-
1857
- commandHandle = handle;
1858
- activeCurator = handle;
1859
- const open = platform() === "darwin" ? await getGlimpseOpen() : null;
1860
- if (open) {
1861
- try {
1862
- const win = openInGlimpse(open, handle.url, "Search Curator");
1863
- glimpseWin = win;
1864
- win.on("closed", () => {
1865
- if (glimpseWin === win) {
1866
- glimpseWin = null;
1867
- closeCurator();
1868
- }
1869
- });
1870
- } catch (err) {
1871
- const message = err instanceof Error ? err.message : String(err);
1872
- console.error(`Failed to open Glimpse curator window: ${message}`);
1873
- glimpseWin = null;
1874
- await openInBrowser(pi, handle.url);
1875
- }
1876
- } else {
1877
- await openInBrowser(pi, handle.url);
1878
- }
1879
-
1880
- if (queries.length > 0) {
1881
- (async () => {
1882
- for (let qi = 0; qi < queries.length; qi++) {
1883
- if (aborted || activeCurator !== handle) break;
1884
- const requestedProvider = currentProvider;
1885
- try {
1886
- const { answer, results, provider } = await search(queries[qi], {
1887
- provider: requestedProvider,
1888
- signal: searchAbort.signal,
1889
- });
1890
- if (aborted || activeCurator !== handle) break;
1891
- handle.pushResult(qi, {
1892
- answer,
1893
- results: results.map(r => ({ title: r.title, url: r.url, domain: extractDomain(r.url) })),
1894
- provider,
1895
- });
1896
- collected.set(qi, { query: queries[qi], answer, results, error: null, provider });
1897
- } catch (err) {
1898
- if (aborted || activeCurator !== handle) break;
1899
- const message = err instanceof Error ? err.message : String(err);
1900
- handle.pushError(qi, message, requestedProvider);
1901
- collected.set(qi, { query: queries[qi], answer: "", results: [], error: message, provider: requestedProvider });
1902
- }
1903
- }
1904
- if (!aborted && activeCurator === handle) handle.searchesDone();
1905
- })();
1906
- } else {
1907
- if (activeCurator === handle) handle.searchesDone();
1908
- }
1909
- } catch (err) {
1910
- closeCurator();
1911
- const message = err instanceof Error ? err.message : String(err);
1912
- ctx.ui.notify(`Failed to open curator: ${message}`, "error");
1913
- }
1914
- },
1915
- });
1916
-
20
+ registerWebSearchFeatures(pi, initConfig);
1917
21
  pi.registerCommand("curator", {
1918
22
  description: "Toggle or configure the search curator workflow",
1919
23
  handler: async (args, ctx) => {