@selesai/code 0.13.3 → 0.13.5

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 (511) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/compaction/utils.js +2 -2
  5. package/dist/core/export-html/template.css +1066 -1066
  6. package/dist/core/export-html/template.html +55 -55
  7. package/dist/core/export-html/template.js +1864 -1864
  8. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  9. package/dist/core/export-html/vendor/marked.min.js +78 -78
  10. package/dist/core/messages.js +7 -7
  11. package/dist/defaults/models.json +17 -1
  12. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  13. package/dist/extensions/context-compaction-reminder.ts +28 -28
  14. package/dist/extensions/cost-reconcile.test.ts +24 -5
  15. package/dist/extensions/cost-reconcile.ts +14 -7
  16. package/dist/extensions/pi-hermes-memory/scripts/check-min-sdk.mjs +0 -0
  17. package/dist/extensions/pi-hermes-memory/tests/run-all.sh +0 -0
  18. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  19. package/dist/extensions/pi-intercom/LICENSE +21 -21
  20. package/dist/extensions/pi-intercom/README.md +4 -5
  21. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  22. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  23. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  24. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  25. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  26. package/dist/extensions/pi-intercom/config.test.ts +3 -31
  27. package/dist/extensions/pi-intercom/config.ts +0 -15
  28. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  29. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  30. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  31. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  32. package/dist/extensions/pi-intercom/index.ts +9 -46
  33. package/dist/extensions/pi-intercom/intercom.integration.test.ts +49 -57
  34. package/dist/extensions/pi-intercom/package.json +1 -1
  35. package/dist/extensions/pi-intercom/reply-tracker.test.ts +20 -0
  36. package/dist/extensions/pi-intercom/reply-tracker.ts +8 -0
  37. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  38. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  39. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  40. package/dist/extensions/pi-subagents/CHANGELOG.md +27 -0
  41. package/dist/extensions/pi-subagents/docs/tool-reference.md +4 -1
  42. package/dist/extensions/pi-subagents/docs/workflows.md +2 -2
  43. package/dist/extensions/pi-subagents/install.mjs +0 -0
  44. package/dist/extensions/pi-subagents/package-lock.json +2 -2
  45. package/dist/extensions/pi-subagents/package.json +1 -1
  46. package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +48 -243
  47. package/dist/extensions/pi-subagents/skills/council-mode/references/pass-contracts.md +150 -0
  48. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +87 -37
  49. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +29 -233
  50. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +49 -8
  51. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -2
  52. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +13 -1
  53. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +34 -27
  54. package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +73 -0
  55. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +157 -28
  56. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
  57. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +1 -0
  58. package/dist/extensions/pi-subagents/src/extension/schemas.ts +1 -0
  59. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +4 -1
  60. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +2 -2
  61. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +3 -0
  62. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +45 -2
  63. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +3 -2
  64. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +13 -2
  65. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +5 -1
  66. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +10 -2
  67. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +3 -0
  68. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +11 -2
  69. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +98 -1
  70. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +138 -4
  71. package/dist/extensions/pi-subagents/src/runs/shared/background-process-options.ts +9 -0
  72. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +2 -5
  73. package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +52 -3
  74. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +47 -1
  75. package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +45 -18
  76. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +21 -2
  77. package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +15 -0
  78. package/dist/extensions/pi-subagents/src/shared/types.ts +34 -1
  79. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +11 -3
  80. package/dist/extensions/pi-subagents/src/tui/render-helpers.ts +31 -0
  81. package/dist/extensions/pi-subagents/src/tui/render.ts +597 -112
  82. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +40 -1
  83. package/dist/extensions/pi-subagents/src/workflows/host-command.ts +6 -1
  84. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +53 -2
  85. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +55 -6
  86. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +111 -1
  87. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +206 -38
  88. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +522 -31
  89. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +123 -0
  90. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +48 -0
  91. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +57 -1
  92. package/dist/extensions/pi-subagents/test/unit/background-process-options.test.ts +17 -0
  93. package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +1 -1
  94. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +44 -4
  95. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +91 -0
  96. package/dist/extensions/pi-subagents/test/unit/host-command.test.ts +1 -0
  97. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +0 -1
  98. package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +20 -3
  99. package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +27 -0
  100. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +93 -17
  101. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +1 -0
  102. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +103 -26
  103. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +58 -0
  104. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +22 -2
  105. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +21 -0
  106. package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -0
  107. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +54 -0
  108. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +2 -0
  109. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +32 -0
  110. package/dist/extensions/pi-subagents/test/unit/watchdog-change-signature.test.ts +48 -1
  111. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +21 -6
  112. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +11 -0
  113. package/dist/extensions/pi-web-agent/CHANGELOG.md +410 -0
  114. package/dist/extensions/pi-web-agent/README.md +131 -0
  115. package/dist/extensions/pi-web-agent/package.json +4 -2
  116. package/dist/extensions/pi-web-agent/src/backends/config.ts +62 -5
  117. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -0
  118. package/dist/extensions/pi-web-agent/src/backends/factory.ts +96 -6
  119. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  120. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  121. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  122. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +183 -47
  123. package/dist/extensions/pi-web-agent/src/extension.ts +62 -25
  124. package/dist/extensions/pi-web-agent/src/extract/readability.ts +19 -11
  125. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  126. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  127. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  128. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  129. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  130. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +5 -4
  131. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +2 -25
  132. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +5 -2
  133. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +2 -0
  134. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  135. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  136. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +72 -7
  137. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +8 -1
  138. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +28 -3
  139. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +4 -0
  140. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  141. package/dist/extensions/pi-web-agent/src/orchestration/url.ts +35 -0
  142. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  143. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  144. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +18 -6
  145. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  146. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +14 -2
  147. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  148. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  149. package/dist/extensions/pi-web-agent/src/readers/github-reader.ts +150 -0
  150. package/dist/extensions/pi-web-agent/src/readers/limits.ts +3 -0
  151. package/dist/extensions/pi-web-agent/src/readers/pdf-reader.ts +87 -0
  152. package/dist/extensions/pi-web-agent/src/readers/resolver.ts +25 -0
  153. package/dist/extensions/pi-web-agent/src/readers/types.ts +11 -0
  154. package/dist/extensions/pi-web-agent/src/readers/youtube-reader.ts +79 -0
  155. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  156. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +32 -5
  157. package/dist/extensions/pi-web-agent/src/search/exa.ts +109 -0
  158. package/dist/extensions/pi-web-agent/src/search/fanout.ts +154 -0
  159. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  160. package/dist/extensions/pi-web-agent/src/search/tavily.ts +113 -0
  161. package/dist/extensions/pi-web-agent/src/search/youcom.ts +109 -0
  162. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  163. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  164. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  165. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +22 -9
  166. package/dist/extensions/pi-web-agent/src/types.ts +19 -4
  167. package/dist/extensions/pi-zentui/extensions/zentui/format.ts +7 -1
  168. package/dist/extensions/ponytail/package.json +8 -8
  169. package/dist/extensions/question/constants.ts +30 -30
  170. package/dist/extensions/question/helpers.ts +58 -58
  171. package/dist/extensions/question/navigation.ts +14 -14
  172. package/dist/extensions/question/package.json +19 -19
  173. package/dist/extensions/question/selection-mode.ts +46 -46
  174. package/dist/extensions/question/shortcuts.ts +44 -44
  175. package/dist/extensions/question/types.ts +132 -132
  176. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  177. package/dist/extensions/test-resolve-hook.mjs +6 -6
  178. package/dist/extensions/web-agent-onboarding.ts +222 -222
  179. package/dist/package-manager-cli.js +71 -71
  180. package/dist/rpc-entry.js +0 -0
  181. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  182. package/docs/compaction.md +396 -396
  183. package/docs/containerization.md +111 -111
  184. package/docs/development.md +71 -71
  185. package/docs/docs.json +164 -164
  186. package/docs/environment-variables.md +86 -86
  187. package/docs/index.md +83 -83
  188. package/docs/json.md +82 -82
  189. package/docs/models.md +502 -502
  190. package/docs/packages.md +227 -227
  191. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  192. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  193. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  194. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  195. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  196. package/docs/prompt-templates.md +95 -95
  197. package/docs/providers.md +293 -293
  198. package/docs/security.md +59 -59
  199. package/docs/session-format.md +414 -414
  200. package/docs/sessions.md +145 -145
  201. package/docs/shared-host-extensions.md +109 -109
  202. package/docs/shell-aliases.md +13 -13
  203. package/docs/skills.md +231 -231
  204. package/docs/terminal-setup.md +142 -142
  205. package/docs/termux.md +127 -127
  206. package/docs/themes.md +295 -295
  207. package/docs/tmux.md +63 -63
  208. package/docs/tui.md +927 -927
  209. package/docs/windows.md +17 -17
  210. package/examples/README.md +25 -25
  211. package/examples/extensions/README.md +211 -211
  212. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  213. package/examples/extensions/bash-spawn-hook.ts +30 -30
  214. package/examples/extensions/bookmark.ts +50 -50
  215. package/examples/extensions/border-status-editor.ts +150 -150
  216. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  217. package/examples/extensions/claude-rules.ts +86 -86
  218. package/examples/extensions/commands.ts +72 -72
  219. package/examples/extensions/confirm-destructive.ts +59 -59
  220. package/examples/extensions/custom-compaction.ts +130 -130
  221. package/examples/extensions/custom-footer.ts +64 -64
  222. package/examples/extensions/custom-header.ts +73 -73
  223. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  224. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  225. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  226. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  227. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  228. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  229. package/examples/extensions/dirty-repo-guard.ts +56 -56
  230. package/examples/extensions/doom-overlay/README.md +46 -46
  231. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  232. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  233. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  234. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  235. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  236. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  237. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  238. package/examples/extensions/doom-overlay/index.ts +74 -74
  239. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  240. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  241. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  242. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  243. package/examples/extensions/dynamic-resources/index.ts +15 -15
  244. package/examples/extensions/dynamic-tools.ts +74 -74
  245. package/examples/extensions/event-bus.ts +43 -43
  246. package/examples/extensions/file-trigger.ts +41 -41
  247. package/examples/extensions/git-checkpoint.ts +53 -53
  248. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  249. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  250. package/examples/extensions/gondolin/index.ts +531 -531
  251. package/examples/extensions/gondolin/package-lock.json +185 -185
  252. package/examples/extensions/gondolin/package.json +19 -19
  253. package/examples/extensions/handoff.ts +199 -199
  254. package/examples/extensions/hello.ts +26 -26
  255. package/examples/extensions/hidden-thinking-label.ts +53 -53
  256. package/examples/extensions/inline-bash.ts +94 -94
  257. package/examples/extensions/input-transform-streaming.ts +39 -39
  258. package/examples/extensions/input-transform.ts +43 -43
  259. package/examples/extensions/interactive-shell.ts +196 -196
  260. package/examples/extensions/mac-system-theme.ts +47 -47
  261. package/examples/extensions/message-renderer.ts +59 -59
  262. package/examples/extensions/minimal-mode.ts +426 -426
  263. package/examples/extensions/modal-editor.ts +85 -85
  264. package/examples/extensions/model-status.ts +31 -31
  265. package/examples/extensions/notify.ts +55 -55
  266. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  267. package/examples/extensions/overlay-test.ts +153 -153
  268. package/examples/extensions/permission-gate.ts +34 -34
  269. package/examples/extensions/pirate.ts +47 -47
  270. package/examples/extensions/plan-mode/README.md +66 -66
  271. package/examples/extensions/plan-mode/index.ts +390 -390
  272. package/examples/extensions/plan-mode/utils.ts +168 -168
  273. package/examples/extensions/preset.ts +436 -436
  274. package/examples/extensions/project-trust.ts +64 -64
  275. package/examples/extensions/prompt-customizer.ts +97 -97
  276. package/examples/extensions/protected-paths.ts +30 -30
  277. package/examples/extensions/provider-payload.ts +18 -18
  278. package/examples/extensions/qna.ts +122 -122
  279. package/examples/extensions/question.ts +285 -285
  280. package/examples/extensions/questionnaire.ts +448 -448
  281. package/examples/extensions/rainbow-editor.ts +88 -88
  282. package/examples/extensions/reload-runtime.ts +37 -37
  283. package/examples/extensions/rpc-demo.ts +118 -118
  284. package/examples/extensions/sandbox/index.ts +321 -321
  285. package/examples/extensions/sandbox/package-lock.json +92 -92
  286. package/examples/extensions/sandbox/package.json +19 -19
  287. package/examples/extensions/send-user-message.ts +97 -97
  288. package/examples/extensions/session-name.ts +27 -27
  289. package/examples/extensions/shutdown-command.ts +63 -63
  290. package/examples/extensions/snake.ts +343 -343
  291. package/examples/extensions/space-invaders.ts +560 -560
  292. package/examples/extensions/ssh.ts +220 -220
  293. package/examples/extensions/status-line.ts +32 -32
  294. package/examples/extensions/structured-output.ts +65 -65
  295. package/examples/extensions/subagent/README.md +175 -175
  296. package/examples/extensions/subagent/agents/planner.md +37 -37
  297. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  298. package/examples/extensions/subagent/agents/scout.md +50 -50
  299. package/examples/extensions/subagent/agents/worker.md +24 -24
  300. package/examples/extensions/subagent/agents.ts +126 -126
  301. package/examples/extensions/subagent/index.ts +1015 -1015
  302. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  303. package/examples/extensions/subagent/prompts/implement.md +10 -10
  304. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  305. package/examples/extensions/summarize.ts +209 -209
  306. package/examples/extensions/system-prompt-header.ts +17 -17
  307. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  308. package/examples/extensions/timed-confirm.ts +70 -70
  309. package/examples/extensions/titlebar-spinner.ts +58 -58
  310. package/examples/extensions/todo.ts +297 -297
  311. package/examples/extensions/tool-override.ts +144 -144
  312. package/examples/extensions/tools.ts +146 -146
  313. package/examples/extensions/trigger-compact.ts +50 -50
  314. package/examples/extensions/truncated-tool.ts +195 -195
  315. package/examples/extensions/widget-placement.ts +9 -9
  316. package/examples/extensions/with-deps/index.ts +32 -32
  317. package/examples/extensions/with-deps/package-lock.json +31 -31
  318. package/examples/extensions/with-deps/package.json +22 -22
  319. package/examples/extensions/working-indicator.ts +123 -123
  320. package/examples/extensions/working-message-test.ts +25 -25
  321. package/examples/rpc-extension-ui.ts +632 -632
  322. package/examples/sdk/01-minimal.ts +26 -26
  323. package/examples/sdk/02-custom-model.ts +53 -53
  324. package/examples/sdk/03-custom-prompt.ts +75 -75
  325. package/examples/sdk/04-skills.ts +55 -55
  326. package/examples/sdk/05-tools.ts +48 -48
  327. package/examples/sdk/06-extensions.ts +99 -99
  328. package/examples/sdk/07-context-files.ts +47 -47
  329. package/examples/sdk/08-prompt-templates.ts +51 -51
  330. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  331. package/examples/sdk/10-settings.ts +53 -53
  332. package/examples/sdk/11-sessions.ts +52 -52
  333. package/examples/sdk/12-full-control.ts +79 -79
  334. package/examples/sdk/13-session-runtime.ts +67 -67
  335. package/examples/sdk/README.md +144 -144
  336. package/package.json +3 -2
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
  364. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
  365. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
  366. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
  367. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
  368. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
  369. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
  370. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
  371. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
  372. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
  373. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
  374. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
  375. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
  376. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
  377. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
  378. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
  379. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
  380. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
  381. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
  382. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
  383. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
  384. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
  385. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
  386. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
  387. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
  388. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
  389. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
  390. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
  391. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
  392. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
  393. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
  394. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
  395. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
  396. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
  397. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
  398. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
  399. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
  400. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
  401. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
  402. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
  403. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
  404. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
  405. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
  406. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
  407. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
  408. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
  409. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
  410. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
  411. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
  412. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
  413. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
  414. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
  415. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
  416. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
  417. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
  418. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
  419. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
  420. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
  421. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
  422. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +0 -3
  423. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
  424. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
  425. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
  426. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
  427. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
  428. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
  429. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
  430. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
  431. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
  432. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
  433. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
  434. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
  435. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
  436. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
  437. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
  438. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
  439. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
  440. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
  441. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
  442. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
  443. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
  444. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
  445. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
  446. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
  447. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
  448. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
  449. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
  450. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
  451. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
  452. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
  453. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
  454. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
  455. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
  456. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
  457. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
  458. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
  459. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
  460. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
  461. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
  462. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
  463. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
  464. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
  465. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
  466. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
  467. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
  468. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
  469. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
  470. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
  471. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
  472. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
  473. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
  474. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
  475. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
  476. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
  477. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
  478. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
  479. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
  480. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
  481. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
  482. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
  483. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
  484. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
  485. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
  486. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
  487. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
  488. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
  489. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
  490. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
  491. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
  492. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
  493. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
  494. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
  495. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
  496. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
  497. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
  498. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
  499. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
  500. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
  501. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
  502. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
  503. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
  504. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
  505. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
  506. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
  507. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
  508. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
  509. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
  510. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
  511. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
@@ -0,0 +1,131 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/demigodmode/pi-web-agent/main/docs/public/pi-web-agent-banner.png" alt="pi-web-agent: bounded web research for Pi" width="100%">
3
+ </p>
4
+
5
+ # pi-web-agent
6
+
7
+ [![CI](https://github.com/demigodmode/pi-web-agent/actions/workflows/ci.yml/badge.svg)](https://github.com/demigodmode/pi-web-agent/actions/workflows/ci.yml)
8
+ [![npm version](https://img.shields.io/npm/v/@demigodmode/pi-web-agent)](https://www.npmjs.com/package/@demigodmode/pi-web-agent)
9
+ [![Docs](https://img.shields.io/badge/docs-github%20pages-blue)](https://demigodmode.github.io/pi-web-agent/)
10
+
11
+ One public tool, `web_explore`, that does bounded web research for Pi: search, fetch, targeted browser rendering, ranking, and honest caveats, all behind a single call.
12
+
13
+ > Most agent web tooling blurs search, fetch, rendering, and synthesis into one vague thing. `pi-web-agent` keeps that boundary simple, and it is stricter about what it actually did: bot-check pages, narrow source sets, unreadable threads, and conflicting evidence show up as caveats instead of fake confidence.
14
+
15
+ ## What you get
16
+
17
+ - **One tool.** `web_explore` handles direct links, discovery, HTTP reads, targeted headless rendering, source ranking, source-quality checks, and caveats internally.
18
+ - **Reads the real content behind links.** Paste a GitHub, PDF, or YouTube URL and it pulls the actual thing (GitHub files/issues/PRs from the API, PDF text, YouTube transcripts), keyless. So "summarize this PDF" or "what does this repo do" works off the source, not the page shell.
19
+ - **Six search backends.** DuckDuckGo (keyless default), SearXNG, Brave, You.com, Exa, Tavily.
20
+ - **Optional search fanout.** Query several backends at once, dedupe, and rank pages that more than one provider agreed on to the top. Off by default; flip it to `on` or `auto`.
21
+ - **Honest by default.** Weak, narrow, blocked, or cautionary evidence gets flagged instead of dressed up as confidence.
22
+ - **Bounded output.** `compact` / `preview` / `verbose` transcript modes.
23
+ - **Zero-config to start.** Runs keyless out of the box (DuckDuckGo search, local browser, the built-in readers). Opt into hosted backends, fallback, search fanout, and per-tool output modes through config when you want more control.
24
+
25
+ ## Why pi-web-agent
26
+
27
+ Compared to other web tooling for agents:
28
+
29
+ - **Hands-off.** No curator, no browser windows to approve, no step that pops you out of your session. Ask `web_explore` once and the answer comes back with caveats. Nothing to babysit.
30
+ - **Keyless by default.** Search, page reads, and the GitHub/PDF/YouTube readers all work with no API keys. Add hosted providers only when you want them.
31
+ - **Bounded and honest.** Compact output by default, and it says when a read was not good enough instead of returning fake confidence.
32
+
33
+ ## Install
34
+
35
+ > `pi-web-agent` requires Pi 0.74+ (Pi packages moved to the `@earendil-works/*` scope). Update Pi before updating this package. On older Pi, stay on `@demigodmode/pi-web-agent@0.6.x`.
36
+
37
+ ```bash
38
+ pi install npm:@demigodmode/pi-web-agent
39
+ ```
40
+
41
+ Reload or restart Pi after installing, then:
42
+
43
+ ```text
44
+ /web-agent doctor # check it loaded and show configured backends
45
+ /web-agent # action menu
46
+ ```
47
+
48
+ Update later with `pi update --extensions`.
49
+
50
+ **Browser rendering:** headless first tries a detected Chromium-family browser (Chrome, Chromium, Edge, Brave). If none is found, it falls back to Playwright-managed Chromium. Firefox/Safari-only systems still get search and plain HTTP reads.
51
+
52
+ ## Usage
53
+
54
+ Ask `web_explore` a web question:
55
+
56
+ > Find current docs and discussions on configuring Vitest coverage with the v8 provider.
57
+
58
+ Or hand it a link to read:
59
+
60
+ > Summarize this PDF: https://arxiv.org/pdf/1706.03762
61
+
62
+ If a pass comes back thin, call `web_explore` again with a narrower query.
63
+
64
+ ## Backends
65
+
66
+ Defaults are DuckDuckGo search, plain HTTP fetch, and local-browser headless. Switch providers from `/web-agent settings → Backends`. API keys stay in environment variables, never in config files.
67
+
68
+ | Backend | Role | Enable with |
69
+ | --- | --- | --- |
70
+ | DuckDuckGo | search (default) | nothing, keyless |
71
+ | SearXNG | search (self-hosted) | base URL |
72
+ | Brave | search (hosted) | `PI_WEB_AGENT_BRAVE_API_KEY` |
73
+ | You.com | search (hosted) | `YDC_API_KEY` |
74
+ | Exa | search (hosted) | `EXA_API_KEY` |
75
+ | Tavily | search (hosted) | `TAVILY_API_KEY` |
76
+ | Firecrawl | fetch (self-hosted) | base URL + `PI_WEB_AGENT_FIRECRAWL_API_KEY` |
77
+ | GitHub reader | content | `GITHUB_TOKEN` (optional, raises the rate limit) |
78
+
79
+ Full config shape (fallback, SearXNG/Firecrawl options, fanout): see the [self-hosted backends docs](https://demigodmode.github.io/pi-web-agent/self-hosted-backends).
80
+
81
+ ## Settings
82
+
83
+ ```text
84
+ /web-agent settings # main UI
85
+ /web-agent doctor # health check
86
+ /web-agent show # effective config
87
+ /web-agent changelog
88
+ /web-agent mode web_explore verbose # per-tool presentation mode
89
+ /web-agent reset project | global
90
+ ```
91
+
92
+ Config is JSON, and project config overrides global:
93
+
94
+ ```text
95
+ Global: ~/.pi/agent/extensions/pi-web-agent/config.json
96
+ Project: .pi/extensions/pi-web-agent/config.json
97
+ ```
98
+
99
+ ```json
100
+ {
101
+ "presentation": {
102
+ "defaultMode": "compact",
103
+ "tools": { "web_explore": { "mode": "verbose" } }
104
+ }
105
+ }
106
+ ```
107
+
108
+ Presentation modes:
109
+
110
+ - `compact`: short summary, the default everywhere
111
+ - `preview`: slightly richer bounded view
112
+ - `verbose`: fuller bounded view
113
+
114
+ ## Docs
115
+
116
+ Full docs: <https://demigodmode.github.io/pi-web-agent/>. Work on them locally with `npm run docs:dev`.
117
+
118
+ ## Development
119
+
120
+ ```bash
121
+ npm install
122
+ npm test
123
+ npm run lint
124
+ npm run build
125
+ ```
126
+
127
+ Local Pi work uses `.pi/extensions/pi-web-agent.ts`; run `/reload` after changes.
128
+
129
+ ## License
130
+
131
+ AGPL-3.0-only. See [LICENSE](LICENSE).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@selesai/bundled-pi-web-agent",
3
- "version": "1.5.1",
3
+ "version": "1.10.0",
4
4
  "private": true,
5
5
  "description": "Bundled pi-web-agent extension for reliable web access with explicit search, fetch, and headless boundaries. Vendored source-first from @demigodmode/pi-web-agent.",
6
6
  "type": "module",
@@ -22,7 +22,9 @@
22
22
  "cheerio": "^1.1.0",
23
23
  "jsdom": "^26.0.0",
24
24
  "playwright": "^1.60.0",
25
- "typebox": "^1.1.37"
25
+ "typebox": "^1.1.37",
26
+ "unpdf": "^1.8.1",
27
+ "youtube-caption-extractor": "^1.10.2"
26
28
  },
27
29
  "peerDependencies": {
28
30
  "@selesai/code": "*",
@@ -1,19 +1,27 @@
1
+ import type { FanoutMode, SearchProviderName } from '../types.js';
2
+
1
3
  export type SearxngOptions = {
2
4
  categories?: string[];
3
5
  language?: string;
4
6
  safesearch?: 0 | 1 | 2;
5
7
  };
6
8
 
9
+ export type FanoutConfig = {
10
+ mode: FanoutMode;
11
+ providers?: SearchProviderName[];
12
+ };
13
+
7
14
  export type FirecrawlOptions = {
8
15
  formats?: string[];
9
16
  onlyMainContent?: boolean;
10
17
  };
11
18
 
12
19
  export type SearchBackendConfig = {
13
- provider: 'duckduckgo' | 'searxng' | 'brave';
20
+ provider: 'duckduckgo' | 'searxng' | 'brave' | 'youcom' | 'exa' | 'tavily';
14
21
  baseUrl?: string;
15
22
  fallback?: 'duckduckgo';
16
23
  options?: SearxngOptions;
24
+ fanout?: FanoutConfig;
17
25
  };
18
26
 
19
27
  export type FetchBackendConfig = {
@@ -39,7 +47,7 @@ export type BackendConfigOverride = {
39
47
 
40
48
  export type BackendConfigFile = {
41
49
  backends?: {
42
- search?: { provider?: unknown; baseUrl?: unknown; fallback?: unknown; options?: unknown };
50
+ search?: { provider?: unknown; baseUrl?: unknown; fallback?: unknown; options?: unknown; fanout?: unknown };
43
51
  fetch?: { provider?: unknown; baseUrl?: unknown; apiKey?: unknown; fallback?: unknown; options?: unknown };
44
52
  headless?: { provider?: unknown };
45
53
  };
@@ -78,6 +86,37 @@ function extractFirecrawlOptions(value: unknown): FirecrawlOptions | undefined {
78
86
  return Object.keys(options).length > 0 ? options : undefined;
79
87
  }
80
88
 
89
+ const PROVIDER_NAMES: SearchProviderName[] = ['duckduckgo', 'searxng', 'brave', 'youcom', 'exa', 'tavily'];
90
+
91
+ export function usableSearchProviders(
92
+ search: SearchBackendConfig,
93
+ env: NodeJS.ProcessEnv = process.env
94
+ ): SearchProviderName[] {
95
+ // Match the provider implementations, which treat a blank/whitespace key as unconfigured.
96
+ const usable: SearchProviderName[] = ['duckduckgo']; // keyless, always usable
97
+ if (search.baseUrl?.trim()) usable.push('searxng');
98
+ if (env.PI_WEB_AGENT_BRAVE_API_KEY?.trim()) usable.push('brave');
99
+ if (env.YDC_API_KEY?.trim()) usable.push('youcom');
100
+ if (env.EXA_API_KEY?.trim()) usable.push('exa');
101
+ if (env.TAVILY_API_KEY?.trim()) usable.push('tavily');
102
+ return usable;
103
+ }
104
+
105
+ function extractFanoutConfig(value: unknown): FanoutConfig | undefined {
106
+ if (!value || typeof value !== 'object') return undefined;
107
+ const raw = value as { mode?: unknown; providers?: unknown };
108
+ if (raw.mode !== 'off' && raw.mode !== 'on' && raw.mode !== 'auto') return undefined;
109
+ const config: FanoutConfig = { mode: raw.mode };
110
+ if (Array.isArray(raw.providers)) {
111
+ const providers = raw.providers.filter(
112
+ (p): p is SearchProviderName => typeof p === 'string' && (PROVIDER_NAMES as string[]).includes(p)
113
+ );
114
+ if (providers.length !== raw.providers.length) return undefined; // fail loud on any invalid entry
115
+ if (providers.length > 0) config.providers = providers;
116
+ }
117
+ return config;
118
+ }
119
+
81
120
  export function extractBackendConfigOverride(
82
121
  file: BackendConfigFile | null | undefined
83
122
  ): BackendConfigOverride {
@@ -87,7 +126,10 @@ export function extractBackendConfigOverride(
87
126
  if (
88
127
  backends?.search?.provider === 'duckduckgo' ||
89
128
  backends?.search?.provider === 'searxng' ||
90
- backends?.search?.provider === 'brave'
129
+ backends?.search?.provider === 'brave' ||
130
+ backends?.search?.provider === 'youcom' ||
131
+ backends?.search?.provider === 'exa' ||
132
+ backends?.search?.provider === 'tavily'
91
133
  ) {
92
134
  override.search = { provider: backends.search.provider };
93
135
  if (backends.search.provider === 'searxng' && typeof backends.search.baseUrl === 'string') {
@@ -104,6 +146,11 @@ export function extractBackendConfigOverride(
104
146
  }
105
147
  }
106
148
 
149
+ const fanout = extractFanoutConfig(backends?.search?.fanout);
150
+ if (fanout) {
151
+ override.search = { ...(override.search ?? {}), fanout };
152
+ }
153
+
107
154
  if (backends?.fetch?.provider === 'http' || backends?.fetch?.provider === 'firecrawl') {
108
155
  override.fetch = { provider: backends.fetch.provider };
109
156
  if (typeof backends.fetch.baseUrl === 'string') {
@@ -139,8 +186,8 @@ export function validateBackendConfig(config: BackendConfig): string[] {
139
186
  issues.push('fetch provider firecrawl requires backends.fetch.baseUrl');
140
187
  }
141
188
 
142
- if (config.search.fallback === 'duckduckgo' && config.search.provider !== 'searxng' && config.search.provider !== 'brave') {
143
- issues.push('search fallback duckduckgo is only supported when search provider is searxng or brave');
189
+ if (config.search.fallback === 'duckduckgo' && config.search.provider !== 'searxng' && config.search.provider !== 'brave' && config.search.provider !== 'youcom' && config.search.provider !== 'exa' && config.search.provider !== 'tavily') {
190
+ issues.push('search fallback duckduckgo is only supported when search provider is searxng, brave, youcom, exa, or tavily');
144
191
  }
145
192
 
146
193
  if (config.fetch.fallback === 'http' && config.fetch.provider !== 'firecrawl') {
@@ -166,6 +213,16 @@ export function validateBackendConfig(config: BackendConfig): string[] {
166
213
  issues.push('fetch options.formats must contain at least one format when provided');
167
214
  }
168
215
 
216
+ const fanout = config.search.fanout;
217
+ if (fanout) {
218
+ if (fanout.mode !== 'off' && fanout.mode !== 'on' && fanout.mode !== 'auto') {
219
+ issues.push('search fanout.mode must be off, on, or auto');
220
+ }
221
+ if (fanout.providers?.includes('searxng') && !config.search.baseUrl) {
222
+ issues.push('search fanout with searxng requires backends.search.baseUrl');
223
+ }
224
+ }
225
+
169
226
  return issues;
170
227
  }
171
228
 
@@ -18,6 +18,18 @@ function braveDoctorUrl() {
18
18
  return url.toString();
19
19
  }
20
20
 
21
+ function youcomDoctorBody() {
22
+ return JSON.stringify({ query: 'pi-web-agent-doctor', max_results: 1 });
23
+ }
24
+
25
+ function exaDoctorBody() {
26
+ return JSON.stringify({ query: 'pi-web-agent-doctor', numResults: 1 });
27
+ }
28
+
29
+ function tavilyDoctorBody() {
30
+ return JSON.stringify({ query: 'pi-web-agent-doctor', max_results: 1 });
31
+ }
32
+
21
33
  function searxngDoctorUrl(baseUrl: string, options: SearxngOptions = {}) {
22
34
  const url = new URL('/search', baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`);
23
35
  url.searchParams.set('q', 'pi-web-agent-doctor');
@@ -78,6 +90,99 @@ export async function checkBackendHealth(
78
90
  timeout.done();
79
91
  }
80
92
  }
93
+ } else if (config.search.provider === 'youcom') {
94
+ const apiKey = process.env.YDC_API_KEY;
95
+ if (!apiKey?.trim()) {
96
+ lines.push('search backend: youcom warning (missing YDC_API_KEY)');
97
+ } else {
98
+ const timeout = withTimeout(timeoutMs);
99
+ try {
100
+ const response = await fetchImpl('https://api.you.com/v1/agents/search', {
101
+ method: 'POST',
102
+ headers: {
103
+ Accept: 'application/json',
104
+ 'Content-Type': 'application/json',
105
+ 'X-API-Key': apiKey
106
+ },
107
+ body: youcomDoctorBody(),
108
+ signal: timeout.signal
109
+ });
110
+ if (!response.ok) {
111
+ lines.push(`search backend: youcom warning (HTTP ${response.status})`);
112
+ } else {
113
+ const json = (await response.json()) as { results?: unknown };
114
+ lines.push(Array.isArray(json.results)
115
+ ? 'search backend: youcom ok'
116
+ : 'search backend: youcom warning (unexpected response)');
117
+ }
118
+ } catch (error) {
119
+ lines.push(`search backend: youcom warning (${message(error)})`);
120
+ } finally {
121
+ timeout.done();
122
+ }
123
+ }
124
+ } else if (config.search.provider === 'exa') {
125
+ const apiKey = process.env.EXA_API_KEY;
126
+ if (!apiKey?.trim()) {
127
+ lines.push('search backend: exa warning (missing EXA_API_KEY)');
128
+ } else {
129
+ const timeout = withTimeout(timeoutMs);
130
+ try {
131
+ const response = await fetchImpl('https://api.exa.ai/search', {
132
+ method: 'POST',
133
+ headers: {
134
+ Accept: 'application/json',
135
+ 'Content-Type': 'application/json',
136
+ 'x-api-key': apiKey
137
+ },
138
+ body: exaDoctorBody(),
139
+ signal: timeout.signal
140
+ });
141
+ if (!response.ok) {
142
+ lines.push(`search backend: exa warning (HTTP ${response.status})`);
143
+ } else {
144
+ const json = (await response.json()) as { results?: unknown };
145
+ lines.push(Array.isArray(json.results)
146
+ ? 'search backend: exa ok'
147
+ : 'search backend: exa warning (unexpected response)');
148
+ }
149
+ } catch (error) {
150
+ lines.push(`search backend: exa warning (${message(error)})`);
151
+ } finally {
152
+ timeout.done();
153
+ }
154
+ }
155
+ } else if (config.search.provider === 'tavily') {
156
+ const apiKey = process.env.TAVILY_API_KEY;
157
+ if (!apiKey?.trim()) {
158
+ lines.push('search backend: tavily warning (missing TAVILY_API_KEY)');
159
+ } else {
160
+ const timeout = withTimeout(timeoutMs);
161
+ try {
162
+ const response = await fetchImpl('https://api.tavily.com/search', {
163
+ method: 'POST',
164
+ headers: {
165
+ Accept: 'application/json',
166
+ 'Content-Type': 'application/json',
167
+ Authorization: `Bearer ${apiKey}`
168
+ },
169
+ body: tavilyDoctorBody(),
170
+ signal: timeout.signal
171
+ });
172
+ if (!response.ok) {
173
+ lines.push(`search backend: tavily warning (HTTP ${response.status})`);
174
+ } else {
175
+ const json = (await response.json()) as { results?: unknown };
176
+ lines.push(Array.isArray(json.results)
177
+ ? 'search backend: tavily ok'
178
+ : 'search backend: tavily warning (unexpected response)');
179
+ }
180
+ } catch (error) {
181
+ lines.push(`search backend: tavily warning (${message(error)})`);
182
+ } finally {
183
+ timeout.done();
184
+ }
185
+ }
81
186
  } else if (!config.search.baseUrl) {
82
187
  lines.push('search backend: searxng warning (missing baseUrl)');
83
188
  } else {
@@ -99,6 +204,37 @@ export async function checkBackendHealth(
99
204
  lines.push(`search fallback: ${config.search.fallback}`);
100
205
  }
101
206
 
207
+ if (config.search.fanout && config.search.fanout.mode !== 'off') {
208
+ const providers = config.search.fanout.providers || ['duckduckgo', 'searxng', 'brave', 'youcom', 'exa', 'tavily'];
209
+ lines.push(`search fanout: ${config.search.fanout.mode} (${providers.join(', ')})`);
210
+
211
+ for (const provider of providers) {
212
+ if (provider === 'searxng' && !config.search.baseUrl) {
213
+ lines.push('search fanout provider searxng warning (missing baseUrl)');
214
+ } else if (provider === 'brave') {
215
+ const apiKey = process.env.PI_WEB_AGENT_BRAVE_API_KEY ?? readBraveKeyFromSettings();
216
+ if (!apiKey?.trim()) {
217
+ lines.push('search fanout provider brave warning (missing Brave API key — set webAgent.braveApiKey in settings.json or PI_WEB_AGENT_BRAVE_API_KEY env var)');
218
+ }
219
+ } else if (provider === 'youcom') {
220
+ const apiKey = process.env.YDC_API_KEY;
221
+ if (!apiKey?.trim()) {
222
+ lines.push('search fanout provider youcom warning (missing YDC_API_KEY)');
223
+ }
224
+ } else if (provider === 'exa') {
225
+ const apiKey = process.env.EXA_API_KEY;
226
+ if (!apiKey?.trim()) {
227
+ lines.push('search fanout provider exa warning (missing EXA_API_KEY)');
228
+ }
229
+ } else if (provider === 'tavily') {
230
+ const apiKey = process.env.TAVILY_API_KEY;
231
+ if (!apiKey?.trim()) {
232
+ lines.push('search fanout provider tavily warning (missing TAVILY_API_KEY)');
233
+ }
234
+ }
235
+ }
236
+ }
237
+
102
238
  if (config.fetch.provider === 'http') {
103
239
  lines.push('fetch backend: http');
104
240
  } else if (!config.fetch.baseUrl) {
@@ -1,14 +1,22 @@
1
1
  import { createFirecrawlFetcher } from '../fetch/firecrawl-fetch.js';
2
2
  import { createBraveSearchTool } from '../search/brave.js';
3
+ import { createYouComSearchTool } from '../search/youcom.js';
4
+ import { createExaSearchTool } from '../search/exa.js';
5
+ import { createTavilySearchTool } from '../search/tavily.js';
3
6
  import { createSearxngSearchTool } from '../search/searxng.js';
7
+ import { createFanoutSearch } from '../search/fanout.js';
4
8
  import { buildFetchPresentation } from '../presentation/fetch-presentation.js';
5
9
  import { buildSearchPresentation } from '../presentation/search-presentation.js';
6
10
  import { createWebFetchHeadlessTool } from '../tools/web-fetch-headless.js';
7
11
  import { createWebFetchTool } from '../tools/web-fetch.js';
8
12
  import { createWebSearchTool } from '../tools/web-search.js';
9
13
  import { readBraveKeyFromSettings } from './settings-reader.js';
10
- import type { WebFetchHeadlessResponse, WebFetchResponse, WebSearchResponse } from '../types.js';
11
- import { DEFAULT_BACKEND_CONFIG, type BackendConfig } from './config.js';
14
+ import type { SearchProviderName, WebFetchHeadlessResponse, WebFetchResponse, WebSearchResponse } from '../types.js';
15
+ import { DEFAULT_BACKEND_CONFIG, type BackendConfig, usableSearchProviders } from './config.js';
16
+ import { createSpecialContentResolver } from '../readers/resolver.js';
17
+ import { createGithubReader } from '../readers/github-reader.js';
18
+ import { createPdfReader } from '../readers/pdf-reader.js';
19
+ import { createYoutubeReader } from '../readers/youtube-reader.js';
12
20
 
13
21
  export type BackendSet = {
14
22
  search: (input: { query: string }) => Promise<WebSearchResponse>;
@@ -20,6 +28,9 @@ export type BackendFactoryDeps = {
20
28
  createDuckDuckGoSearch?: typeof createWebSearchTool;
21
29
  createSearxngSearch?: typeof createSearxngSearchTool;
22
30
  createBraveSearch?: typeof createBraveSearchTool;
31
+ createYouComSearch?: typeof createYouComSearchTool;
32
+ createExaSearch?: typeof createExaSearchTool;
33
+ createTavilySearch?: typeof createTavilySearchTool;
23
34
  createHttpFetch?: typeof createWebFetchTool;
24
35
  createFirecrawlFetch?: typeof createFirecrawlFetcher;
25
36
  createHeadlessFetch?: typeof createWebFetchHeadlessTool;
@@ -60,7 +71,7 @@ function invalidFirecrawlFetch() {
60
71
  function withSearchFallback(
61
72
  primary: BackendSet['search'],
62
73
  fallback: BackendSet['search'],
63
- fallbackFrom: 'searxng' | 'brave'
74
+ fallbackFrom: 'searxng' | 'brave' | 'youcom' | 'exa' | 'tavily' | 'duckduckgo'
64
75
  ): BackendSet['search'] {
65
76
  return async (input) => {
66
77
  const first = await primary(input);
@@ -72,7 +83,10 @@ function withSearchFallback(
72
83
  metadata: {
73
84
  ...second.metadata,
74
85
  fallbackFrom,
75
- fallbackReason: first.error?.message ?? `${fallbackFrom} search failed.`
86
+ fallbackReason: first.error?.message ?? `${fallbackFrom} search failed.`,
87
+ // Keep the primary's fanout provenance (which providers were tried/skipped) even though
88
+ // the answer came from the fallback backend.
89
+ ...(first.metadata.fanout ? { fanout: first.metadata.fanout } : {})
76
90
  }
77
91
  };
78
92
  return { ...result, presentation: buildSearchPresentation(result) };
@@ -107,17 +121,46 @@ export function createBackendSet(
107
121
  const createDuckDuckGoSearch = deps.createDuckDuckGoSearch ?? createWebSearchTool;
108
122
  const createSearxngSearch = deps.createSearxngSearch ?? createSearxngSearchTool;
109
123
  const createBraveSearch = deps.createBraveSearch ?? createBraveSearchTool;
124
+ const createYouComSearch = deps.createYouComSearch ?? createYouComSearchTool;
125
+ const createExaSearch = deps.createExaSearch ?? createExaSearchTool;
126
+ const createTavilySearch = deps.createTavilySearch ?? createTavilySearchTool;
110
127
  const createHttpFetch = deps.createHttpFetch ?? createWebFetchTool;
111
128
  const createFirecrawlFetch = deps.createFirecrawlFetch ?? createFirecrawlFetcher;
112
129
  const createHeadlessFetch = deps.createHeadlessFetch ?? createWebFetchHeadlessTool;
113
130
 
131
+ function buildProviderSearch(name: SearchProviderName): BackendSet['search'] {
132
+ switch (name) {
133
+ case 'searxng':
134
+ return config.search.baseUrl
135
+ ? createSearxngSearch({ baseUrl: config.search.baseUrl, options: config.search.options })
136
+ : invalidSearxngSearch();
137
+ case 'brave':
138
+ return createBraveSearch({ apiKey: process.env.PI_WEB_AGENT_BRAVE_API_KEY ?? readBraveKeyFromSettings() });
139
+ case 'youcom':
140
+ return createYouComSearch({ apiKey: process.env.YDC_API_KEY });
141
+ case 'exa':
142
+ return createExaSearch({ apiKey: process.env.EXA_API_KEY });
143
+ case 'tavily':
144
+ return createTavilySearch({ apiKey: process.env.TAVILY_API_KEY });
145
+ case 'duckduckgo':
146
+ default:
147
+ return createDuckDuckGoSearch();
148
+ }
149
+ }
150
+
114
151
  let search = config.search.provider === 'searxng'
115
152
  ? config.search.baseUrl
116
153
  ? createSearxngSearch({ baseUrl: config.search.baseUrl, options: config.search.options })
117
154
  : invalidSearxngSearch()
118
155
  : config.search.provider === 'brave'
119
156
  ? createBraveSearch({ apiKey: process.env.PI_WEB_AGENT_BRAVE_API_KEY ?? readBraveKeyFromSettings() })
120
- : createDuckDuckGoSearch();
157
+ : config.search.provider === 'youcom'
158
+ ? createYouComSearch({ apiKey: process.env.YDC_API_KEY })
159
+ : config.search.provider === 'exa'
160
+ ? createExaSearch({ apiKey: process.env.EXA_API_KEY })
161
+ : config.search.provider === 'tavily'
162
+ ? createTavilySearch({ apiKey: process.env.TAVILY_API_KEY })
163
+ : createDuckDuckGoSearch();
121
164
 
122
165
  if (config.search.provider === 'searxng' && config.search.fallback === 'duckduckgo') {
123
166
  search = withSearchFallback(search, createDuckDuckGoSearch(), 'searxng');
@@ -127,6 +170,48 @@ export function createBackendSet(
127
170
  search = withSearchFallback(search, createDuckDuckGoSearch(), 'brave');
128
171
  }
129
172
 
173
+ if (config.search.provider === 'youcom' && config.search.fallback === 'duckduckgo') {
174
+ search = withSearchFallback(search, createDuckDuckGoSearch(), 'youcom');
175
+ }
176
+
177
+ if (config.search.provider === 'exa' && config.search.fallback === 'duckduckgo') {
178
+ search = withSearchFallback(search, createDuckDuckGoSearch(), 'exa');
179
+ }
180
+
181
+ if (config.search.provider === 'tavily' && config.search.fallback === 'duckduckgo') {
182
+ search = withSearchFallback(search, createDuckDuckGoSearch(), 'tavily');
183
+ }
184
+
185
+ const fanoutConfig = config.search.fanout;
186
+ if (fanoutConfig && fanoutConfig.mode !== 'off') {
187
+ const baseNames =
188
+ fanoutConfig.providers && fanoutConfig.providers.length > 0
189
+ ? fanoutConfig.providers
190
+ : usableSearchProviders(config.search);
191
+ // A configured DuckDuckGo fallback must still be honored under fanout: fold it into the set.
192
+ const providerNames =
193
+ config.search.fallback === 'duckduckgo' && !baseNames.includes('duckduckgo')
194
+ ? [...baseNames, 'duckduckgo' as SearchProviderName]
195
+ : baseNames;
196
+ const ordered = [config.search.provider, ...providerNames.filter((n) => n !== config.search.provider)].filter(
197
+ (n, i, arr) => arr.indexOf(n) === i
198
+ );
199
+ search = createFanoutSearch({
200
+ providers: ordered.map((name) => ({ name, search: buildProviderSearch(name) })),
201
+ mode: fanoutConfig.mode
202
+ });
203
+ }
204
+
205
+ // Keep the keyless Tavily safety net for the no-key DuckDuckGo default, even under fanout —
206
+ // it wraps whatever search ended up being (plain DDG or the fanout set) so a total failure
207
+ // still has somewhere to go. Opt out with PI_WEB_AGENT_DISABLE_KEYLESS_FALLBACK=1.
208
+ const keylessFallbackDisabled = process.env.PI_WEB_AGENT_DISABLE_KEYLESS_FALLBACK === '1';
209
+ const usingDuckDuckGoDefault =
210
+ config.search.provider === 'duckduckgo' || !config.search.provider;
211
+ if (usingDuckDuckGoDefault && !keylessFallbackDisabled) {
212
+ search = withSearchFallback(search, createTavilySearch({ keyless: true }), 'duckduckgo');
213
+ }
214
+
130
215
  const httpFetch = createHttpFetch();
131
216
  let fetchPage = config.fetch.provider === 'firecrawl'
132
217
  ? config.fetch.baseUrl
@@ -144,9 +229,14 @@ export function createBackendSet(
144
229
  fetchPage = withFetchFallback(fetchPage, httpFetch);
145
230
  }
146
231
 
232
+ const fetchPageWithReaders = createSpecialContentResolver({
233
+ readers: [createGithubReader(), createPdfReader(), createYoutubeReader()],
234
+ fallback: fetchPage
235
+ });
236
+
147
237
  return {
148
238
  search,
149
- fetchPage,
239
+ fetchPage: fetchPageWithReaders,
150
240
  headlessFetch: createHeadlessFetch()
151
241
  };
152
242
  }
@@ -1,25 +1,25 @@
1
- // ponytail: selesai stores the Brave API key in settings.json (webAgent.braveApiKey),
2
- // set by the bundled web-agent-onboarding extension. Upstream pi-web-agent reads the
3
- // key only from PI_WEB_AGENT_BRAVE_API_KEY env var. This helper bridges that gap with a
4
- // minimal settings.json read. Ceiling: if selesai moves web search config elsewhere, this
5
- // helper needs updating; upgrade path = upstream pi-web-agent adopting a settings hook.
6
- import { existsSync, readFileSync } from 'node:fs';
7
- import { getSettingsPath } from '@selesai/code';
8
-
9
- /**
10
- * Read the Brave API key from selesai settings.json (webAgent.braveApiKey).
11
- * Returns undefined if settings.json or the key is absent. Never throws.
12
- */
13
- export function readBraveKeyFromSettings(settingsPath: string = getSettingsPath()): string | undefined {
14
- try {
15
- if (!existsSync(settingsPath)) return undefined;
16
- const raw = readFileSync(settingsPath, 'utf-8');
17
- const parsed = JSON.parse(raw) as Record<string, unknown>;
18
- const webAgent = parsed.webAgent;
19
- if (!webAgent || typeof webAgent !== 'object' || Array.isArray(webAgent)) return undefined;
20
- const apiKey = (webAgent as Record<string, unknown>).braveApiKey;
21
- return typeof apiKey === 'string' && apiKey.trim() !== '' ? apiKey : undefined;
22
- } catch {
23
- return undefined;
24
- }
25
- }
1
+ // ponytail: selesai stores the Brave API key in settings.json (webAgent.braveApiKey),
2
+ // set by the bundled web-agent-onboarding extension. Upstream pi-web-agent reads the
3
+ // key only from PI_WEB_AGENT_BRAVE_API_KEY env var. This helper bridges that gap with a
4
+ // minimal settings.json read. Ceiling: if selesai moves web search config elsewhere, this
5
+ // helper needs updating; upgrade path = upstream pi-web-agent adopting a settings hook.
6
+ import { existsSync, readFileSync } from 'node:fs';
7
+ import { getSettingsPath } from '@selesai/code';
8
+
9
+ /**
10
+ * Read the Brave API key from selesai settings.json (webAgent.braveApiKey).
11
+ * Returns undefined if settings.json or the key is absent. Never throws.
12
+ */
13
+ export function readBraveKeyFromSettings(settingsPath: string = getSettingsPath()): string | undefined {
14
+ try {
15
+ if (!existsSync(settingsPath)) return undefined;
16
+ const raw = readFileSync(settingsPath, 'utf-8');
17
+ const parsed = JSON.parse(raw) as Record<string, unknown>;
18
+ const webAgent = parsed.webAgent;
19
+ if (!webAgent || typeof webAgent !== 'object' || Array.isArray(webAgent)) return undefined;
20
+ const apiKey = (webAgent as Record<string, unknown>).braveApiKey;
21
+ return typeof apiKey === 'string' && apiKey.trim() !== '' ? apiKey : undefined;
22
+ } catch {
23
+ return undefined;
24
+ }
25
+ }