hoomanjs 1.46.0 → 1.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/README.md +44 -18
  2. package/dist/acp/acp-agent.d.ts +42 -0
  3. package/dist/acp/acp-agent.js +336 -47
  4. package/dist/acp/acp-agent.js.map +1 -1
  5. package/dist/acp/approvals.js +11 -10
  6. package/dist/acp/approvals.js.map +1 -1
  7. package/dist/acp/browser.d.ts +9 -0
  8. package/dist/acp/browser.js +23 -0
  9. package/dist/acp/browser.js.map +1 -0
  10. package/dist/acp/meta/vscode.d.ts +8 -7
  11. package/dist/acp/meta/vscode.js +10 -11
  12. package/dist/acp/meta/vscode.js.map +1 -1
  13. package/dist/acp/session-config.d.ts +2 -2
  14. package/dist/acp/session-config.js +24 -20
  15. package/dist/acp/session-config.js.map +1 -1
  16. package/dist/acp/sessions/store.d.ts +3 -3
  17. package/dist/acp/utils/tool-kind.js +8 -6
  18. package/dist/acp/utils/tool-kind.js.map +1 -1
  19. package/dist/chat/app.js +91 -11
  20. package/dist/chat/app.js.map +1 -1
  21. package/dist/chat/approvals.js +3 -0
  22. package/dist/chat/approvals.js.map +1 -1
  23. package/dist/chat/components/ApprovalPrompt.js +15 -25
  24. package/dist/chat/components/ApprovalPrompt.js.map +1 -1
  25. package/dist/chat/components/BackgroundJobsPanel.d.ts +10 -0
  26. package/dist/chat/components/BackgroundJobsPanel.js +15 -0
  27. package/dist/chat/components/BackgroundJobsPanel.js.map +1 -0
  28. package/dist/chat/components/BottomChrome.d.ts +6 -1
  29. package/dist/chat/components/BottomChrome.js +3 -2
  30. package/dist/chat/components/BottomChrome.js.map +1 -1
  31. package/dist/chat/components/ChromePicker.d.ts +7 -2
  32. package/dist/chat/components/ChromePicker.js +18 -2
  33. package/dist/chat/components/ChromePicker.js.map +1 -1
  34. package/dist/chat/components/Composer.js +3 -2
  35. package/dist/chat/components/Composer.js.map +1 -1
  36. package/dist/chat/components/DownloadPanel.js +2 -1
  37. package/dist/chat/components/DownloadPanel.js.map +1 -1
  38. package/dist/chat/components/EmptyChatBanner.js +2 -1
  39. package/dist/chat/components/EmptyChatBanner.js.map +1 -1
  40. package/dist/chat/components/PromptInput.js +2 -1
  41. package/dist/chat/components/PromptInput.js.map +1 -1
  42. package/dist/chat/components/QuestionPrompt.js +5 -4
  43. package/dist/chat/components/QuestionPrompt.js.map +1 -1
  44. package/dist/chat/components/QueuedPrompts.js +3 -2
  45. package/dist/chat/components/QueuedPrompts.js.map +1 -1
  46. package/dist/chat/components/ReasoningStrip.js +2 -1
  47. package/dist/chat/components/ReasoningStrip.js.map +1 -1
  48. package/dist/chat/components/RetryEvent.js +2 -1
  49. package/dist/chat/components/RetryEvent.js.map +1 -1
  50. package/dist/chat/components/SelectPicker.js +2 -1
  51. package/dist/chat/components/SelectPicker.js.map +1 -1
  52. package/dist/chat/components/ShellToolEvent.d.ts +12 -0
  53. package/dist/chat/components/ShellToolEvent.js +94 -0
  54. package/dist/chat/components/ShellToolEvent.js.map +1 -0
  55. package/dist/chat/components/SlashCommands.js +2 -1
  56. package/dist/chat/components/SlashCommands.js.map +1 -1
  57. package/dist/chat/components/Spinner.js +2 -1
  58. package/dist/chat/components/Spinner.js.map +1 -1
  59. package/dist/chat/components/StatusBar.js +19 -15
  60. package/dist/chat/components/StatusBar.js.map +1 -1
  61. package/dist/chat/components/ThinkingStatus.js +2 -1
  62. package/dist/chat/components/ThinkingStatus.js.map +1 -1
  63. package/dist/chat/components/ThoughtEvent.js +2 -1
  64. package/dist/chat/components/ThoughtEvent.js.map +1 -1
  65. package/dist/chat/components/TodoPanel.js +2 -1
  66. package/dist/chat/components/TodoPanel.js.map +1 -1
  67. package/dist/chat/components/ToolEvent.d.ts +2 -1
  68. package/dist/chat/components/ToolEvent.js +9 -2
  69. package/dist/chat/components/ToolEvent.js.map +1 -1
  70. package/dist/chat/components/ToolEventFileResult.js +8 -7
  71. package/dist/chat/components/ToolEventFileResult.js.map +1 -1
  72. package/dist/chat/components/Transcript.d.ts +4 -2
  73. package/dist/chat/components/Transcript.js +4 -4
  74. package/dist/chat/components/Transcript.js.map +1 -1
  75. package/dist/chat/components/markdown/BlockRenderer.js +3 -2
  76. package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
  77. package/dist/chat/components/markdown/CodeBlock.js +3 -2
  78. package/dist/chat/components/markdown/CodeBlock.js.map +1 -1
  79. package/dist/chat/components/markdown/InlineRenderer.js +6 -5
  80. package/dist/chat/components/markdown/InlineRenderer.js.map +1 -1
  81. package/dist/chat/components/shared.js +7 -6
  82. package/dist/chat/components/shared.js.map +1 -1
  83. package/dist/chat/types.d.ts +7 -0
  84. package/dist/cli.js +162 -44
  85. package/dist/cli.js.map +1 -1
  86. package/dist/configure/app.js +46 -29
  87. package/dist/configure/app.js.map +1 -1
  88. package/dist/configure/components/BusyScreen.js +2 -1
  89. package/dist/configure/components/BusyScreen.js.map +1 -1
  90. package/dist/configure/components/MenuScreen.js +3 -2
  91. package/dist/configure/components/MenuScreen.js.map +1 -1
  92. package/dist/configure/components/PromptForm.js +2 -1
  93. package/dist/configure/components/PromptForm.js.map +1 -1
  94. package/dist/configure/components/SelectMenuItem.js +4 -3
  95. package/dist/configure/components/SelectMenuItem.js.map +1 -1
  96. package/dist/configure/utils.js +4 -3
  97. package/dist/configure/utils.js.map +1 -1
  98. package/dist/core/agent/default-retry-strategy.js +46 -12
  99. package/dist/core/agent/default-retry-strategy.js.map +1 -1
  100. package/dist/core/agent/gitignore-guard-plugin.js +17 -2
  101. package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
  102. package/dist/core/agent/index.js +38 -7
  103. package/dist/core/agent/index.js.map +1 -1
  104. package/dist/core/approvals/allowlist.js +1 -0
  105. package/dist/core/approvals/allowlist.js.map +1 -1
  106. package/dist/core/approvals/intervention.d.ts +10 -2
  107. package/dist/core/approvals/intervention.js +46 -8
  108. package/dist/core/approvals/intervention.js.map +1 -1
  109. package/dist/core/config.d.ts +9 -2
  110. package/dist/core/config.js +8 -4
  111. package/dist/core/config.js.map +1 -1
  112. package/dist/core/index.d.ts +2 -2
  113. package/dist/core/mcp/oauth/service.js +2 -2
  114. package/dist/core/mcp/oauth/service.js.map +1 -1
  115. package/dist/core/models/bedrock.js +6 -0
  116. package/dist/core/models/bedrock.js.map +1 -1
  117. package/dist/core/models/groq.js +34 -14
  118. package/dist/core/models/groq.js.map +1 -1
  119. package/dist/core/models/minimax.js +1 -1
  120. package/dist/core/models/minimax.js.map +1 -1
  121. package/dist/core/models/types.d.ts +10 -2
  122. package/dist/core/models/types.js +1 -0
  123. package/dist/core/models/types.js.map +1 -1
  124. package/dist/core/modes/definitions.d.ts +4 -2
  125. package/dist/core/modes/definitions.js +77 -9
  126. package/dist/core/modes/definitions.js.map +1 -1
  127. package/dist/core/modes/index.d.ts +1 -1
  128. package/dist/core/modes/index.js +1 -1
  129. package/dist/core/modes/index.js.map +1 -1
  130. package/dist/core/modes/registry.js +4 -9
  131. package/dist/core/modes/registry.js.map +1 -1
  132. package/dist/core/modes/schema.d.ts +1 -1
  133. package/dist/core/modes/schema.js +1 -1
  134. package/dist/core/modes/schema.js.map +1 -1
  135. package/dist/core/prompts/agents/{review.md → code-review.md} +2 -2
  136. package/dist/core/prompts/agents/design-review.md +35 -0
  137. package/dist/core/prompts/agents/{test-investigator.md → quality-analyst.md} +2 -2
  138. package/dist/core/prompts/modes/agent.md +2 -0
  139. package/dist/core/prompts/modes/ask.md +2 -2
  140. package/dist/core/prompts/modes/design.md +37 -0
  141. package/dist/core/prompts/modes/plan.md +5 -5
  142. package/dist/core/prompts/{runtime.js → runtime/agents.js} +2 -2
  143. package/dist/core/prompts/runtime/agents.js.map +1 -0
  144. package/dist/core/prompts/runtime/design.d.ts +11 -0
  145. package/dist/core/prompts/runtime/design.js +78 -0
  146. package/dist/core/prompts/runtime/design.js.map +1 -0
  147. package/dist/core/prompts/{session-mode-appendix.js → session-mode.js} +1 -1
  148. package/dist/core/prompts/session-mode.js.map +1 -0
  149. package/dist/core/prompts/static/ask-user.md +3 -2
  150. package/dist/core/prompts/static/fetch.md +2 -1
  151. package/dist/core/prompts/static/filesystem.md +2 -1
  152. package/dist/core/prompts/static/shell.md +21 -1
  153. package/dist/core/prompts/static/subagents.md +2 -1
  154. package/dist/core/prompts/static/switch-mode.md +10 -0
  155. package/dist/core/prompts/system.d.ts +1 -0
  156. package/dist/core/prompts/system.js +11 -3
  157. package/dist/core/prompts/system.js.map +1 -1
  158. package/dist/core/shell/index.d.ts +7 -0
  159. package/dist/core/shell/index.js +6 -0
  160. package/dist/core/shell/index.js.map +1 -0
  161. package/dist/core/shell/manager.d.ts +23 -0
  162. package/dist/core/shell/manager.js +604 -0
  163. package/dist/core/shell/manager.js.map +1 -0
  164. package/dist/core/shell/output-buffer.d.ts +30 -0
  165. package/dist/core/shell/output-buffer.js +116 -0
  166. package/dist/core/shell/output-buffer.js.map +1 -0
  167. package/dist/core/shell/registry.d.ts +5 -0
  168. package/dist/core/shell/registry.js +24 -0
  169. package/dist/core/shell/registry.js.map +1 -0
  170. package/dist/core/{tools/shell.d.ts → shell/terminal-backend.d.ts} +20 -18
  171. package/dist/core/shell/terminal-backend.js +18 -0
  172. package/dist/core/shell/terminal-backend.js.map +1 -0
  173. package/dist/core/shell/tools.d.ts +41 -0
  174. package/dist/core/{tools/shell.js → shell/tools.js} +186 -11
  175. package/dist/core/shell/tools.js.map +1 -0
  176. package/dist/core/shell/types.d.ts +95 -0
  177. package/dist/core/shell/types.js +2 -0
  178. package/dist/core/shell/types.js.map +1 -0
  179. package/dist/core/skills/built-in/hooman-config/SKILL.md +30 -35
  180. package/dist/core/skills/built-in/hooman-config/search.md +5 -3
  181. package/dist/core/skills/built-in/hooman-design/SKILL.md +97 -0
  182. package/dist/core/skills/built-in/hooman-design/assets/article-shell.html +87 -0
  183. package/dist/core/skills/built-in/hooman-design/assets/auth-shell.html +143 -0
  184. package/dist/core/skills/built-in/hooman-design/assets/business-card-shell.html +112 -0
  185. package/dist/core/skills/built-in/hooman-design/assets/contact-shell.html +181 -0
  186. package/dist/core/skills/built-in/hooman-design/assets/dashboard-shell.html +90 -0
  187. package/dist/core/skills/built-in/hooman-design/assets/data-table-shell.html +114 -0
  188. package/dist/core/skills/built-in/hooman-design/assets/deck-shell.html +187 -0
  189. package/dist/core/skills/built-in/hooman-design/assets/dialog-shell.html +98 -0
  190. package/dist/core/skills/built-in/hooman-design/assets/email-shell.html +101 -0
  191. package/dist/core/skills/built-in/hooman-design/assets/empty-state-shell.html +92 -0
  192. package/dist/core/skills/built-in/hooman-design/assets/flyer-shell.html +168 -0
  193. package/dist/core/skills/built-in/hooman-design/assets/invite-shell.html +167 -0
  194. package/dist/core/skills/built-in/hooman-design/assets/landing-shell.html +184 -0
  195. package/dist/core/skills/built-in/hooman-design/assets/mobile-frame-shell.html +109 -0
  196. package/dist/core/skills/built-in/hooman-design/assets/newsletter-shell.html +141 -0
  197. package/dist/core/skills/built-in/hooman-design/assets/onboarding-shell.html +131 -0
  198. package/dist/core/skills/built-in/hooman-design/assets/pricing-shell.html +160 -0
  199. package/dist/core/skills/built-in/hooman-design/assets/prototype-shell.html +83 -0
  200. package/dist/core/skills/built-in/hooman-design/assets/resume-shell.html +228 -0
  201. package/dist/core/skills/built-in/hooman-design/assets/settings-shell.html +196 -0
  202. package/dist/core/skills/built-in/hooman-design/assets/tokens/botanical-calm.css +34 -0
  203. package/dist/core/skills/built-in/hooman-design/assets/tokens/copper-ledger.css +34 -0
  204. package/dist/core/skills/built-in/hooman-design/assets/tokens/editorial-ink.css +34 -0
  205. package/dist/core/skills/built-in/hooman-design/assets/tokens/fintech-clear.css +34 -0
  206. package/dist/core/skills/built-in/hooman-design/assets/tokens/harbor-navy.css +35 -0
  207. package/dist/core/skills/built-in/hooman-design/assets/tokens/midnight-editorial.css +34 -0
  208. package/dist/core/skills/built-in/hooman-design/assets/tokens/night-console.css +34 -0
  209. package/dist/core/skills/built-in/hooman-design/assets/tokens/paper-mono.css +35 -0
  210. package/dist/core/skills/built-in/hooman-design/assets/tokens/signal-mono.css +34 -0
  211. package/dist/core/skills/built-in/hooman-design/assets/tokens/soft-product.css +34 -0
  212. package/dist/core/skills/built-in/hooman-design/assets/tokens/swiss-grid.css +34 -0
  213. package/dist/core/skills/built-in/hooman-design/assets/tokens/warm-atelier.css +34 -0
  214. package/dist/core/skills/built-in/hooman-design/assets/waitlist-shell.html +139 -0
  215. package/dist/core/skills/built-in/hooman-design/craft/accessibility-baseline.md +32 -0
  216. package/dist/core/skills/built-in/hooman-design/craft/anti-ai-slop.md +27 -0
  217. package/dist/core/skills/built-in/hooman-design/craft/color-surfaces.md +45 -0
  218. package/dist/core/skills/built-in/hooman-design/craft/data-viz.md +24 -0
  219. package/dist/core/skills/built-in/hooman-design/craft/deck-slides.md +46 -0
  220. package/dist/core/skills/built-in/hooman-design/craft/forms-validation.md +35 -0
  221. package/dist/core/skills/built-in/hooman-design/craft/iconography.md +19 -0
  222. package/dist/core/skills/built-in/hooman-design/craft/layout-overflow.md +31 -0
  223. package/dist/core/skills/built-in/hooman-design/craft/motion.md +41 -0
  224. package/dist/core/skills/built-in/hooman-design/craft/print.md +37 -0
  225. package/dist/core/skills/built-in/hooman-design/craft/responsive.md +30 -0
  226. package/dist/core/skills/built-in/hooman-design/craft/spacing-density.md +46 -0
  227. package/dist/core/skills/built-in/hooman-design/craft/state-coverage.md +21 -0
  228. package/dist/core/skills/built-in/hooman-design/craft/typography.md +73 -0
  229. package/dist/core/skills/built-in/hooman-design/directions.md +115 -0
  230. package/dist/core/skills/built-in/hooman-design/references/artifact-layout.md +15 -0
  231. package/dist/core/skills/built-in/hooman-design/references/export.md +47 -0
  232. package/dist/core/skills/built-in/hooman-design/references/workflow.md +80 -0
  233. package/dist/core/skills/built-in/hooman-mcp/SKILL.md +2 -2
  234. package/dist/core/state/llm-modality.d.ts +13 -0
  235. package/dist/core/state/llm-modality.js +19 -0
  236. package/dist/core/state/llm-modality.js.map +1 -0
  237. package/dist/core/state/plan.d.ts +1 -1
  238. package/dist/core/state/plan.js +1 -1
  239. package/dist/core/state/shell-jobs.d.ts +9 -0
  240. package/dist/core/state/shell-jobs.js +20 -0
  241. package/dist/core/state/shell-jobs.js.map +1 -0
  242. package/dist/core/state/tool-approvals.d.ts +12 -9
  243. package/dist/core/state/tool-approvals.js +94 -52
  244. package/dist/core/state/tool-approvals.js.map +1 -1
  245. package/dist/core/state/turn-boundaries.d.ts +33 -0
  246. package/dist/core/state/turn-boundaries.js +49 -0
  247. package/dist/core/state/turn-boundaries.js.map +1 -0
  248. package/dist/core/subagents/index.d.ts +1 -1
  249. package/dist/core/subagents/index.js +1 -1
  250. package/dist/core/subagents/registry.js +15 -6
  251. package/dist/core/subagents/registry.js.map +1 -1
  252. package/dist/core/subagents/tool.d.ts +8 -2
  253. package/dist/core/subagents/tool.js +93 -44
  254. package/dist/core/subagents/tool.js.map +1 -1
  255. package/dist/core/theme.d.ts +14 -0
  256. package/dist/core/theme.js +14 -0
  257. package/dist/core/theme.js.map +1 -0
  258. package/dist/core/tools/ask-user.d.ts +1 -1
  259. package/dist/core/tools/ask-user.js +1 -1
  260. package/dist/core/tools/export.d.ts +8 -0
  261. package/dist/core/tools/export.js +202 -0
  262. package/dist/core/tools/export.js.map +1 -0
  263. package/dist/core/tools/fetch.d.ts +2 -0
  264. package/dist/core/tools/fetch.js +92 -55
  265. package/dist/core/tools/fetch.js.map +1 -1
  266. package/dist/core/tools/filesystem.d.ts +2 -1
  267. package/dist/core/tools/filesystem.js +38 -4
  268. package/dist/core/tools/filesystem.js.map +1 -1
  269. package/dist/core/tools/index.d.ts +3 -2
  270. package/dist/core/tools/index.js +3 -2
  271. package/dist/core/tools/index.js.map +1 -1
  272. package/dist/core/tools/preview.d.ts +10 -0
  273. package/dist/core/tools/preview.js +147 -0
  274. package/dist/core/tools/preview.js.map +1 -0
  275. package/dist/core/tools/switch-mode.d.ts +6 -0
  276. package/dist/core/tools/switch-mode.js +188 -0
  277. package/dist/core/tools/switch-mode.js.map +1 -0
  278. package/dist/core/tools/web-search.js +176 -0
  279. package/dist/core/tools/web-search.js.map +1 -1
  280. package/dist/core/utils/browser.d.ts +8 -1
  281. package/dist/core/utils/browser.js +17 -1
  282. package/dist/core/utils/browser.js.map +1 -1
  283. package/dist/core/utils/export-design.d.ts +40 -0
  284. package/dist/core/utils/export-design.js +188 -0
  285. package/dist/core/utils/export-design.js.map +1 -0
  286. package/dist/core/utils/export-figma.d.ts +17 -0
  287. package/dist/core/utils/export-figma.js +189 -0
  288. package/dist/core/utils/export-figma.js.map +1 -0
  289. package/dist/core/utils/export-sketch.d.ts +11 -0
  290. package/dist/core/utils/export-sketch.js +456 -0
  291. package/dist/core/utils/export-sketch.js.map +1 -0
  292. package/dist/core/utils/fig-archive.d.ts +47 -0
  293. package/dist/core/utils/fig-archive.js +181 -0
  294. package/dist/core/utils/fig-archive.js.map +1 -0
  295. package/dist/core/utils/metadata.d.ts +30 -0
  296. package/dist/core/utils/metadata.js +122 -0
  297. package/dist/core/utils/metadata.js.map +1 -1
  298. package/dist/core/utils/models-prefetch.d.ts +53 -0
  299. package/dist/core/utils/models-prefetch.js +469 -0
  300. package/dist/core/utils/models-prefetch.js.map +1 -0
  301. package/dist/core/utils/onboarding-config.d.ts +48 -0
  302. package/dist/core/utils/onboarding-config.js +373 -0
  303. package/dist/core/utils/onboarding-config.js.map +1 -0
  304. package/dist/core/utils/paths.d.ts +9 -7
  305. package/dist/core/utils/paths.js +12 -10
  306. package/dist/core/utils/paths.js.map +1 -1
  307. package/dist/core/utils/preview-server.d.ts +20 -0
  308. package/dist/core/utils/preview-server.js +212 -0
  309. package/dist/core/utils/preview-server.js.map +1 -0
  310. package/dist/core/utils/search-probe.d.ts +19 -0
  311. package/dist/core/utils/search-probe.js +165 -0
  312. package/dist/core/utils/search-probe.js.map +1 -0
  313. package/dist/core/utils/seeds/empty-slides.deck +0 -0
  314. package/dist/core/utils/url-safety.d.ts +2 -0
  315. package/dist/core/utils/url-safety.js +47 -0
  316. package/dist/core/utils/url-safety.js.map +1 -0
  317. package/dist/core/utils/zstd.d.ts +6 -0
  318. package/dist/core/utils/zstd.js +39 -0
  319. package/dist/core/utils/zstd.js.map +1 -0
  320. package/dist/exec/approvals.js +5 -5
  321. package/dist/exec/approvals.js.map +1 -1
  322. package/dist/index.d.ts +11 -5
  323. package/dist/index.js +8 -5
  324. package/dist/index.js.map +1 -1
  325. package/dist/onboarding/app.d.ts +5 -0
  326. package/dist/onboarding/app.js +255 -0
  327. package/dist/onboarding/app.js.map +1 -0
  328. package/dist/onboarding/index.d.ts +5 -0
  329. package/dist/onboarding/index.js +27 -0
  330. package/dist/onboarding/index.js.map +1 -0
  331. package/package.json +16 -3
  332. package/dist/core/prompts/runtime.js.map +0 -1
  333. package/dist/core/prompts/session-mode-appendix.js.map +0 -1
  334. package/dist/core/prompts/static/planning.md +0 -3
  335. package/dist/core/tools/plan.d.ts +0 -5
  336. package/dist/core/tools/plan.js +0 -150
  337. package/dist/core/tools/plan.js.map +0 -1
  338. package/dist/core/tools/shell.js.map +0 -1
  339. /package/dist/core/prompts/{runtime.d.ts → runtime/agents.d.ts} +0 -0
  340. /package/dist/core/prompts/{session-mode-appendix.d.ts → session-mode.d.ts} +0 -0
@@ -0,0 +1,212 @@
1
+ import { createServer, } from "node:http";
2
+ import { watch, createReadStream as fsCreateReadStream, } from "node:fs";
3
+ import { access, readFile } from "node:fs/promises";
4
+ import { relative, resolve, sep } from "node:path";
5
+ import { PassThrough } from "node:stream";
6
+ import serveHandler from "serve-handler";
7
+ import { isResolvedPathInsideDir } from "./normalize-user-path.js";
8
+ const LIVE_RELOAD_PATH = "/__hooman_live_reload";
9
+ const LIVE_RELOAD_SNIPPET = `
10
+ <script data-hooman-live-reload>
11
+ (function () {
12
+ try {
13
+ var es = new EventSource(${JSON.stringify(LIVE_RELOAD_PATH)});
14
+ es.onmessage = function () { location.reload(); };
15
+ es.onerror = function () { /* browser will retry */ };
16
+ } catch (e) {}
17
+ })();
18
+ </script>
19
+ `;
20
+ /** Live preview servers keyed by absolute serve root. */
21
+ const serversByRoot = new Map();
22
+ function injectLiveReload(html) {
23
+ if (html.includes("data-hooman-live-reload")) {
24
+ return html;
25
+ }
26
+ if (/<\/body>/i.test(html)) {
27
+ return html.replace(/<\/body>/i, `${LIVE_RELOAD_SNIPPET}</body>`);
28
+ }
29
+ return `${html}\n${LIVE_RELOAD_SNIPPET}`;
30
+ }
31
+ function broadcastReload(active) {
32
+ for (const res of active.clients) {
33
+ try {
34
+ res.write(`data: reload\n\n`);
35
+ }
36
+ catch {
37
+ active.clients.delete(res);
38
+ }
39
+ }
40
+ }
41
+ async function listen(server, port) {
42
+ return new Promise((resolveListen, reject) => {
43
+ server.once("error", reject);
44
+ server.listen(port, "127.0.0.1", () => {
45
+ server.off("error", reject);
46
+ const addr = server.address();
47
+ if (!addr || typeof addr === "string") {
48
+ reject(new Error("Preview server failed to bind a port."));
49
+ return;
50
+ }
51
+ resolveListen(addr.port);
52
+ });
53
+ });
54
+ }
55
+ function requestPathname(req) {
56
+ try {
57
+ return new URL(req.url ?? "/", "http://127.0.0.1").pathname;
58
+ }
59
+ catch {
60
+ return "/";
61
+ }
62
+ }
63
+ async function handleRequest(active, req, res) {
64
+ if (requestPathname(req) === LIVE_RELOAD_PATH) {
65
+ res.writeHead(200, {
66
+ "Content-Type": "text/event-stream; charset=utf-8",
67
+ "Cache-Control": "no-cache, no-transform",
68
+ Connection: "keep-alive",
69
+ "Access-Control-Allow-Origin": "*",
70
+ });
71
+ res.write("\n");
72
+ active.clients.add(res);
73
+ req.on("close", () => {
74
+ active.clients.delete(res);
75
+ });
76
+ return;
77
+ }
78
+ await serveHandler(req, res, {
79
+ public: active.rootDir,
80
+ cleanUrls: false,
81
+ directoryListing: false,
82
+ headers: [
83
+ {
84
+ source: "**",
85
+ headers: [{ key: "Cache-Control", value: "no-store" }],
86
+ },
87
+ {
88
+ // Injected HTML length differs from on-disk size — drop Content-Length.
89
+ source: "**/*.@(html|htm)",
90
+ headers: [
91
+ {
92
+ key: "Content-Length",
93
+ value: null,
94
+ },
95
+ ],
96
+ },
97
+ ],
98
+ }, {
99
+ createReadStream(filePath, options) {
100
+ const path = typeof filePath === "string"
101
+ ? filePath
102
+ : Buffer.isBuffer(filePath)
103
+ ? filePath.toString("utf8")
104
+ : filePath.toString();
105
+ if (/\.html?$/i.test(path)) {
106
+ const stream = new PassThrough();
107
+ void readFile(path, "utf8")
108
+ .then((raw) => {
109
+ stream.end(Buffer.from(injectLiveReload(raw), "utf8"));
110
+ })
111
+ .catch((error) => {
112
+ stream.destroy(error instanceof Error ? error : new Error(String(error)));
113
+ });
114
+ return stream;
115
+ }
116
+ return fsCreateReadStream(filePath, options);
117
+ },
118
+ });
119
+ }
120
+ /**
121
+ * Start a localhost static file server with SSE live-reload.
122
+ * Servers are keyed by absolute `rootDir`; calling again for the same root
123
+ * returns the existing server.
124
+ *
125
+ * @param rootDir Absolute directory to serve.
126
+ * @param port Bind port; `0` (default) picks an ephemeral free port.
127
+ */
128
+ export async function createPreviewServer(rootDirRaw, port = 0) {
129
+ const rootDir = resolve(rootDirRaw);
130
+ await access(rootDir);
131
+ const existing = serversByRoot.get(rootDir);
132
+ if (existing) {
133
+ return existing;
134
+ }
135
+ const clients = new Set();
136
+ const server = createServer((req, res) => {
137
+ void handleRequest(active, req, res).catch(() => {
138
+ if (!res.headersSent) {
139
+ res.writeHead(500).end("Preview server error");
140
+ }
141
+ else {
142
+ res.end();
143
+ }
144
+ });
145
+ });
146
+ const boundPort = await listen(server, port);
147
+ const baseUrl = `http://127.0.0.1:${boundPort}`;
148
+ let debounce;
149
+ const watcher = watch(rootDir, { recursive: true }, () => {
150
+ if (debounce) {
151
+ clearTimeout(debounce);
152
+ }
153
+ debounce = setTimeout(() => broadcastReload(active), 80);
154
+ });
155
+ watcher.on("error", () => {
156
+ /* ignore watcher errors on some platforms */
157
+ });
158
+ const active = {
159
+ rootDir,
160
+ port: boundPort,
161
+ baseUrl,
162
+ server,
163
+ watcher,
164
+ clients,
165
+ urlFor(filePath) {
166
+ const resolved = resolve(filePath);
167
+ if (!isResolvedPathInsideDir(resolved, rootDir)) {
168
+ throw new Error(`Preview file must stay under the served root (${rootDir}).`);
169
+ }
170
+ const rel = relative(rootDir, resolved).split(sep).join("/");
171
+ return `${baseUrl}/${rel}`;
172
+ },
173
+ async close() {
174
+ if (debounce) {
175
+ clearTimeout(debounce);
176
+ }
177
+ for (const res of clients) {
178
+ try {
179
+ res.end();
180
+ }
181
+ catch {
182
+ /* ignore */
183
+ }
184
+ }
185
+ clients.clear();
186
+ watcher.close();
187
+ await new Promise((resolveClose, reject) => {
188
+ server.close((err) => (err ? reject(err) : resolveClose()));
189
+ });
190
+ if (serversByRoot.get(rootDir) === active) {
191
+ serversByRoot.delete(rootDir);
192
+ }
193
+ },
194
+ };
195
+ serversByRoot.set(rootDir, active);
196
+ return active;
197
+ }
198
+ export function getPreviewServer(rootDirRaw) {
199
+ return serversByRoot.get(resolve(rootDirRaw));
200
+ }
201
+ export async function stopPreviewServer(rootDirRaw) {
202
+ const active = serversByRoot.get(resolve(rootDirRaw));
203
+ if (!active) {
204
+ return false;
205
+ }
206
+ await active.close();
207
+ return true;
208
+ }
209
+ export function listPreviewServerRoots() {
210
+ return [...serversByRoot.keys()];
211
+ }
212
+ //# sourceMappingURL=preview-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-server.js","sourceRoot":"","sources":["../../../src/core/utils/preview-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lightweight credential probe for search providers (one-result test query).
3
+ * Kept free of the web_search tool / Strands SDK so the VS Code extension can
4
+ * import it without pulling those into the extension host bundle.
5
+ */
6
+ export type SearchProbeProvider = "brave" | "duckduckgo" | "exa" | "firecrawl" | "litellm" | "serper" | "tavily";
7
+ export type SearchProbeOptions = {
8
+ provider: SearchProbeProvider;
9
+ apiKey?: string;
10
+ baseURL?: string;
11
+ /** LiteLLM search tool id (e.g. `perplexity-search`). */
12
+ tool?: string;
13
+ signal?: AbortSignal;
14
+ };
15
+ /**
16
+ * Run a one-result test search to validate search provider credentials.
17
+ * DuckDuckGo has no API key and succeeds without a network call.
18
+ */
19
+ export declare function probeSearchProvider(options: SearchProbeOptions): Promise<void>;
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Lightweight credential probe for search providers (one-result test query).
3
+ * Kept free of the web_search tool / Strands SDK so the VS Code extension can
4
+ * import it without pulling those into the extension host bundle.
5
+ */
6
+ const BRAVE_ENDPOINT = "https://api.search.brave.com/res/v1/web/search";
7
+ const SERPER_ENDPOINT = "https://google.serper.dev/search";
8
+ const TAVILY_ENDPOINT = "https://api.tavily.com/search";
9
+ const EXA_ENDPOINT = "https://api.exa.ai/search";
10
+ const FIRECRAWL_ENDPOINT = "https://api.firecrawl.dev/v2/search";
11
+ const DEFAULT_TIMEOUT_MS = 20_000;
12
+ const FIRECRAWL_TIMEOUT_MS = 60_000;
13
+ const PROBE_QUERY = "hooman";
14
+ /**
15
+ * Run a one-result test search to validate search provider credentials.
16
+ * DuckDuckGo has no API key and succeeds without a network call.
17
+ */
18
+ export async function probeSearchProvider(options) {
19
+ if (options.provider === "duckduckgo") {
20
+ return;
21
+ }
22
+ const timeoutMs = options.provider === "firecrawl" || options.provider === "litellm"
23
+ ? FIRECRAWL_TIMEOUT_MS
24
+ : DEFAULT_TIMEOUT_MS;
25
+ const timeoutSignal = AbortSignal.timeout(timeoutMs);
26
+ const signal = options.signal
27
+ ? AbortSignal.any([timeoutSignal, options.signal])
28
+ : timeoutSignal;
29
+ switch (options.provider) {
30
+ case "brave":
31
+ await probeBrave(requireApiKey(options.apiKey), signal);
32
+ return;
33
+ case "exa":
34
+ await probeExa(requireApiKey(options.apiKey), signal);
35
+ return;
36
+ case "firecrawl":
37
+ await probeFirecrawl(requireApiKey(options.apiKey), signal);
38
+ return;
39
+ case "litellm":
40
+ await probeLiteLLM({
41
+ baseURL: requireValue(options.baseURL, "Base URL is required."),
42
+ apiKey: requireApiKey(options.apiKey),
43
+ tool: requireValue(options.tool, "Search tool is required."),
44
+ }, signal);
45
+ return;
46
+ case "serper":
47
+ await probeSerper(requireApiKey(options.apiKey), signal);
48
+ return;
49
+ case "tavily":
50
+ await probeTavily(requireApiKey(options.apiKey), signal);
51
+ return;
52
+ default: {
53
+ const _exhaustive = options.provider;
54
+ throw new Error(`Unsupported search provider: ${_exhaustive}`);
55
+ }
56
+ }
57
+ }
58
+ function requireApiKey(apiKey) {
59
+ return requireValue(apiKey, "API key is required.");
60
+ }
61
+ function requireValue(value, message) {
62
+ const trimmed = value?.trim();
63
+ if (!trimmed) {
64
+ throw new Error(message);
65
+ }
66
+ return trimmed;
67
+ }
68
+ async function readErrorBody(response) {
69
+ const body = await response.text().catch(() => "");
70
+ return body.slice(0, 200);
71
+ }
72
+ async function probeBrave(apiKey, signal) {
73
+ const url = new URL(BRAVE_ENDPOINT);
74
+ url.searchParams.set("q", PROBE_QUERY);
75
+ url.searchParams.set("count", "1");
76
+ const response = await fetch(url, {
77
+ method: "GET",
78
+ signal,
79
+ headers: {
80
+ accept: "application/json",
81
+ "x-subscription-token": apiKey,
82
+ },
83
+ });
84
+ if (!response.ok) {
85
+ throw new Error(`Brave search failed (${response.status}): ${await readErrorBody(response)}`);
86
+ }
87
+ }
88
+ async function probeSerper(apiKey, signal) {
89
+ const response = await fetch(SERPER_ENDPOINT, {
90
+ method: "POST",
91
+ signal,
92
+ headers: {
93
+ "Content-Type": "application/json",
94
+ "X-API-KEY": apiKey,
95
+ },
96
+ body: JSON.stringify({ q: PROBE_QUERY, num: 1 }),
97
+ });
98
+ if (!response.ok) {
99
+ throw new Error(`Serper search failed (${response.status}): ${await readErrorBody(response)}`);
100
+ }
101
+ }
102
+ async function probeTavily(apiKey, signal) {
103
+ const response = await fetch(TAVILY_ENDPOINT, {
104
+ method: "POST",
105
+ signal,
106
+ headers: { "Content-Type": "application/json" },
107
+ body: JSON.stringify({
108
+ api_key: apiKey,
109
+ query: PROBE_QUERY,
110
+ max_results: 1,
111
+ }),
112
+ });
113
+ if (!response.ok) {
114
+ throw new Error(`Tavily search failed (${response.status}): ${await readErrorBody(response)}`);
115
+ }
116
+ }
117
+ async function probeExa(apiKey, signal) {
118
+ const response = await fetch(EXA_ENDPOINT, {
119
+ method: "POST",
120
+ signal,
121
+ headers: {
122
+ "Content-Type": "application/json",
123
+ "x-api-key": apiKey,
124
+ },
125
+ body: JSON.stringify({
126
+ query: PROBE_QUERY,
127
+ numResults: 1,
128
+ type: "auto",
129
+ }),
130
+ });
131
+ if (!response.ok) {
132
+ throw new Error(`Exa search failed (${response.status}): ${await readErrorBody(response)}`);
133
+ }
134
+ }
135
+ async function probeFirecrawl(apiKey, signal) {
136
+ const response = await fetch(FIRECRAWL_ENDPOINT, {
137
+ method: "POST",
138
+ signal,
139
+ headers: {
140
+ "Content-Type": "application/json",
141
+ Authorization: `Bearer ${apiKey}`,
142
+ },
143
+ body: JSON.stringify({ query: PROBE_QUERY, limit: 1 }),
144
+ });
145
+ if (!response.ok) {
146
+ throw new Error(`Firecrawl search failed (${response.status}): ${await readErrorBody(response)}`);
147
+ }
148
+ }
149
+ async function probeLiteLLM(options, signal) {
150
+ const base = options.baseURL.replace(/\/+$/, "");
151
+ const url = `${base}/v1/search/${encodeURIComponent(options.tool)}`;
152
+ const response = await fetch(url, {
153
+ method: "POST",
154
+ signal,
155
+ headers: {
156
+ "Content-Type": "application/json",
157
+ Authorization: `Bearer ${options.apiKey}`,
158
+ },
159
+ body: JSON.stringify({ query: PROBE_QUERY, max_results: 1 }),
160
+ });
161
+ if (!response.ok) {
162
+ throw new Error(`LiteLLM search failed (${response.status}): ${await readErrorBody(response)}`);
163
+ }
164
+ }
165
+ //# sourceMappingURL=search-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-probe.js","sourceRoot":"","sources":["../../../src/core/utils/search-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isHttpUrl(value: string): URL;
2
+ export declare function assertRemoteUrl(url: URL): Promise<void>;
@@ -0,0 +1,47 @@
1
+ import dns from "node:dns/promises";
2
+ import net from "node:net";
3
+ export function isHttpUrl(value) {
4
+ const url = new URL(value);
5
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
6
+ throw new Error("Only http:// and https:// URLs are supported.");
7
+ }
8
+ return url;
9
+ }
10
+ function isPrivateHostname(hostname) {
11
+ const normalized = hostname.toLowerCase();
12
+ return (normalized === "localhost" ||
13
+ normalized === "127.0.0.1" ||
14
+ normalized === "::1" ||
15
+ normalized.endsWith(".localhost"));
16
+ }
17
+ function isPrivateIp(address) {
18
+ const version = net.isIP(address);
19
+ if (version === 4) {
20
+ const parts = address.split(".").map((part) => Number(part));
21
+ const a = parts[0] ?? -1;
22
+ const b = parts[1] ?? -1;
23
+ return (a === 10 ||
24
+ a === 127 ||
25
+ (a === 172 && b >= 16 && b <= 31) ||
26
+ (a === 192 && b === 168) ||
27
+ (a === 169 && b === 254));
28
+ }
29
+ if (version === 6) {
30
+ const normalized = address.toLowerCase();
31
+ return (normalized === "::1" ||
32
+ normalized.startsWith("fc") ||
33
+ normalized.startsWith("fd") ||
34
+ normalized.startsWith("fe80:"));
35
+ }
36
+ return false;
37
+ }
38
+ export async function assertRemoteUrl(url) {
39
+ if (isPrivateHostname(url.hostname)) {
40
+ throw new Error("Fetching localhost or loopback URLs is not allowed.");
41
+ }
42
+ const resolved = await dns.lookup(url.hostname, { all: true });
43
+ if (resolved.some((entry) => isPrivateIp(entry.address))) {
44
+ throw new Error("Fetching private-network URLs is not allowed.");
45
+ }
46
+ }
47
+ //# sourceMappingURL=url-safety.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-safety.js","sourceRoot":"","sources":["../../../src/core/utils/url-safety.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,mBAAmB,CAAC;AACpC,OAAO,GAAG,MAAM,UAAU,CAAC;AAE3B,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC1C,OAAO,CACL,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,WAAW;QAC1B,UAAU,KAAK,KAAK;QACpB,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAClC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzB,OAAO,CACL,CAAC,KAAK,EAAE;YACR,CAAC,KAAK,GAAG;YACT,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YACjC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;YACxB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CACzB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACzC,OAAO,CACL,UAAU,KAAK,KAAK;YACpB,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;YAC3B,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAC/B,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAQ;IAC5C,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * zstd compress wrapper for openfig message chunk 1.
3
+ * openfig-core only decompresses (fzstd); Figma requires zstd on write.
4
+ */
5
+ /** Compress bytes with zstd level 3 (Figma-compatible). */
6
+ export declare function zstdCompress(data: Uint8Array, level?: number): Promise<Uint8Array>;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * zstd compress wrapper for openfig message chunk 1.
3
+ * openfig-core only decompresses (fzstd); Figma requires zstd on write.
4
+ */
5
+ let codecPromise;
6
+ async function loadZstdCodec() {
7
+ if (!codecPromise) {
8
+ codecPromise = (async () => {
9
+ const mod = (await import("zstd-codec"));
10
+ const codec = mod.ZstdCodec ?? mod.default?.ZstdCodec;
11
+ if (!codec?.run) {
12
+ throw new Error("zstd-codec: ZstdCodec.run not found");
13
+ }
14
+ return codec;
15
+ })();
16
+ }
17
+ return codecPromise;
18
+ }
19
+ /** Compress bytes with zstd level 3 (Figma-compatible). */
20
+ export async function zstdCompress(data, level = 3) {
21
+ const codec = await loadZstdCodec();
22
+ return new Promise((resolve, reject) => {
23
+ try {
24
+ codec.run((zstd) => {
25
+ try {
26
+ const simple = new zstd.Simple();
27
+ resolve(simple.compress(data, level));
28
+ }
29
+ catch (err) {
30
+ reject(err);
31
+ }
32
+ });
33
+ }
34
+ catch (err) {
35
+ reject(err);
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=zstd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zstd.js","sourceRoot":"","sources":["../../../src/core/utils/zstd.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,IAAI,YAA8C,CAAC;AAEnD,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;YACzB,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,CAAC,CAGtC,CAAC;YACF,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC;YACtD,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,KAAK,GAAG,CAAC;IAET,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBACjB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,12 +1,12 @@
1
1
  import { createInterface } from "node:readline/promises";
2
2
  import { stdin, stdout } from "node:process";
3
3
  import { HoomanToolApprovalIntervention } from "../core/approvals/intervention.js";
4
- import { EXIT_PLAN_MODE_TOOL } from "../core/state/tool-approvals.js";
4
+ import { SWITCH_MODE_TOOL } from "../core/state/tool-approvals.js";
5
5
  function canPromptForApproval() {
6
6
  return Boolean(stdin.isTTY && stdout.isTTY);
7
7
  }
8
8
  async function promptForApproval(toolName, description, inputPreview) {
9
- const isPlanExit = toolName === EXIT_PLAN_MODE_TOOL;
9
+ const isSwitchMode = toolName === SWITCH_MODE_TOOL;
10
10
  const rl = createInterface({ input: stdin, output: stdout });
11
11
  try {
12
12
  stdout.write(`\nTool approval required\n`);
@@ -15,7 +15,7 @@ async function promptForApproval(toolName, description, inputPreview) {
15
15
  stdout.write(`Description: ${description}\n`);
16
16
  }
17
17
  stdout.write(`Input:\n${inputPreview}\n`);
18
- stdout.write(isPlanExit
18
+ stdout.write(isSwitchMode
19
19
  ? `Options: [a]llow once, [r]eject\n`
20
20
  : `Options: [a]llow once, [r]eject, [A]lways allow\n`);
21
21
  while (true) {
@@ -26,10 +26,10 @@ async function promptForApproval(toolName, description, inputPreview) {
26
26
  if (answer === "r" || answer === "reject") {
27
27
  return "reject";
28
28
  }
29
- if (!isPlanExit && (answer === "A" || answer === "always")) {
29
+ if (!isSwitchMode && (answer === "A" || answer === "always")) {
30
30
  return "always";
31
31
  }
32
- stdout.write(isPlanExit ? "Enter a or r.\n" : "Enter a, r, or A.\n");
32
+ stdout.write(isSwitchMode ? "Enter a or r.\n" : "Enter a, r, or A.\n");
33
33
  }
34
34
  }
35
35
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/exec/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,SAAS,oBAAoB;IAC3B,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,WAA+B,EAC/B,YAAoB;IAEpB,MAAM,UAAU,GAAG,QAAQ,KAAK,mBAAmB,CAAC;IACpD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC,CAAC;QACpC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,WAAW,YAAY,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CACV,UAAU;YACR,CAAC,CAAC,mCAAmC;YACrC,CAAC,CAAC,mDAAmD,CACxD,CAAC;QACF,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAC1D,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC3D,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,IAAI,8BAA8B,CAAC;QACxC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrB,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,SAAS,OAAO,CAAC,QAAQ,gEAAgE;iBAClG,CAAC;YACJ,CAAC;YACD,OAAO,iBAAiB,CACtB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,YAAY,CACrB,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/exec/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,mCAAmC,CAAC;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE,SAAS,oBAAoB;IAC3B,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,WAA+B,EAC/B,YAAoB;IAEpB,MAAM,YAAY,GAAG,QAAQ,KAAK,gBAAgB,CAAC;IACnD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC,CAAC;QACpC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,gBAAgB,WAAW,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,WAAW,YAAY,IAAI,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CACV,YAAY;YACV,CAAC,CAAC,mCAAmC;YACrC,CAAC,CAAC,mDAAmD,CACxD,CAAC;QACF,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAC1D,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1C,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC7D,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B;IAC5C,OAAO,IAAI,8BAA8B,CAAC;QACxC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACrB,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,SAAS,OAAO,CAAC,QAAQ,gEAAgE;iBAClG,CAAC;YACJ,CAAC;YACD,OAAO,iBAAiB,CACtB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,YAAY,CACrB,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@ export { createRuntimeConfig, createRuntimeMcpConfig, runtimeConfigOptions, runt
6
6
  export type { RuntimeConfigSources } from "./core/runtime-config.js";
7
7
  export { attachmentsPath, basePath, configJsonPath, instructionsMdPath, mcpJsonPath, mcpOauthJsonPath, localSkillsPath, memoryPath, offloadedContentPath, plansPath, sessionsPath, skillsPath, } from "./core/utils/paths.js";
8
8
  export { currentProjectRoot, projectId, projectPath, projectRegistryPath, projectsPath, } from "./core/utils/project-registry.js";
9
- export { openBrowser } from "./core/utils/browser.js";
9
+ export { openExternalBrowser } from "./core/utils/browser.js";
10
10
  export { attachmentDiagnosticBlock, attachmentPathsToPromptBlocks, normalizeAttachmentPaths, readAttachmentAsBlocksOrBase64, } from "./core/utils/attachments.js";
11
11
  export type { AttachmentBinaryFallback, AttachmentMediaBlocks, AttachmentReadResult, } from "./core/utils/attachments.js";
12
12
  export { detectDocumentFormat, detectImageFormat, detectVideoFormat, } from "./core/utils/file-formats.js";
@@ -23,10 +23,10 @@ export type { BeginAuthorizationResult as McpBeginAuthorizationResult, McpOAuthC
23
23
  export { McpTransportSchema, SseSchema, StdioSchema, StreamableHttpSchema, } from "./core/mcp/types.js";
24
24
  export type { McpTransport, Sse, Stdio, StreamableHttp, } from "./core/mcp/types.js";
25
25
  export { PrefixedMcpTool } from "./core/mcp/prefixed-mcp-tool.js";
26
- export { createAskUserTools, createFetchTools, createFilesystemTools, createGrepTools, createShellTools, createSleepTools, createThinkingTools, createTimeTools, createTodoTools, createWebSearchTools, } from "./core/tools/index.js";
26
+ export { createAskUserTools, createFetchTools, createFilesystemTools, createGrepTools, createSleepTools, createThinkingTools, createTimeTools, createTodoTools, createWebSearchTools, } from "./core/tools/index.js";
27
27
  export { UPDATE_TODOS_TOOL_NAME } from "./core/tools/todo.js";
28
28
  export { ASK_USER_TOOL_NAME, getAskUserBackend, setAskUserBackend, type AskUserBackend, type AskUserRequest, type AskUserResponse, } from "./core/tools/ask-user.js";
29
- export { getTerminalBackend, setTerminalBackend, type TerminalBackend, type TerminalRunRequest, type TerminalRunResult, } from "./core/tools/shell.js";
29
+ export { clearShellJobManager, createShellTools, getShellJobManager, getTerminalBackend, peekShellJobManager, setTerminalBackend, ShellJobManager, SHELL_OUTPUT_TOOL_NAME, SHELL_STOP_TOOL_NAME, SHELL_TOOL_NAME, type ShellJobEvent, type ShellJobInfo, type ShellJobOutputSnapshot, type ShellJobStatus, type TerminalBackend, type TerminalOutputSnapshot, type TerminalRunRequest, type TerminalRunResult, type TerminalSpawnResult, } from "./core/shell/index.js";
30
30
  export { getTextFsBackend, setTextFsBackend, type TextFsBackend, type TextFsReadOptions, } from "./core/tools/filesystem.js";
31
31
  export { AGENT_SKILLS_STATE_KEY, Registry as SkillsRegistry, builtInSkillsPath, clearAgentSkillsPromptInjectionState, createAgentSkillsPlugin, createAgentSkillSources, createSkillsRegistry, } from "./core/skills/index.js";
32
32
  export type { SkillListEntry, SkillSearchResult, } from "./core/skills/registry.js";
@@ -36,6 +36,12 @@ export { modelProviders } from "./core/models/index.js";
36
36
  export type { ModelProvider } from "./core/models/index.js";
37
37
  export { createModelDownloadLogger, downloadRatio, formatBytes, formatBytesPerSecond, formatEtaSeconds, formatModelDownloadLine, renderDownloadBar, subscribeModelDownloadProgress, } from "./core/utils/download-progress.js";
38
38
  export type { ModelDownloadProgress, ModelDownloadProgressListener, } from "./core/utils/download-progress.js";
39
+ export { DEFAULT_PREFETCH_MODEL_BY_PROVIDER, defaultPrefetchedModel, hasPrefetchCredentials, prefetchProviderModels, providerRequiresCredentials, resolvePrefetchModels, } from "./core/utils/models-prefetch.js";
40
+ export type { PrefetchModelsOptions, PrefetchProviderId, PrefetchedModel, } from "./core/utils/models-prefetch.js";
41
+ export { probeSearchProvider } from "./core/utils/search-probe.js";
42
+ export type { SearchProbeOptions, SearchProbeProvider, } from "./core/utils/search-probe.js";
43
+ export { completeOnboardingConfig, hasOnboardingConfig, validateOnboardingProvider, validateOnboardingSearch, } from "./core/utils/onboarding-config.js";
44
+ export type { OnboardingInput, OnboardingProviderId, OnboardingProviderInput, OnboardingSearchProvider, } from "./core/utils/onboarding-config.js";
39
45
  export { subscribeModelRetryProgress } from "./core/agent/retry-progress.js";
40
46
  export type { ModelRetryProgress, ModelRetryProgressListener, } from "./core/agent/retry-progress.js";
41
47
  export { create as createAnthropicModelProvider, type AnthropicModelParams, } from "./core/models/anthropic.js";
@@ -56,7 +62,7 @@ export { FlatFileStorage } from "./core/sessions/flat-file-storage.js";
56
62
  export { LazySessionManager, type LazySessionManagerConfig, } from "./core/sessions/lazy-session-manager.js";
57
63
  export { TolerantFileStorage } from "./core/sessions/tolerant-file-storage.js";
58
64
  export { latestCliSession, listCliSessions, type CliSessionSummary, } from "./core/sessions/list-cli-sessions.js";
59
- export { SUBAGENT_TOOL_NAME_PREFIX, createSubagentTools, createSubagentRegistry, } from "./core/subagents/index.js";
65
+ export { LAUNCH_SUBAGENT_TOOL_NAME, createSubagentTools, createSubagentRegistry, } from "./core/subagents/index.js";
60
66
  export type { SubagentKindConfig, SubagentKindDefinition, SubagentRegistry, } from "./core/subagents/index.js";
61
67
  export { INTERNAL_ALWAYS_ALLOWED as TOOL_APPROVAL_INTERNAL_ALWAYS_ALLOWED, isImplicitlyAllowed, isToolVisible, planModeWriteEditRejectionMessage, } from "./core/state/tool-approvals.js";
62
68
  export { Allowlist, getAllowlist, type AllowlistOptions, type AllowlistRule, } from "./core/approvals/allowlist.js";
@@ -67,7 +73,7 @@ export { createChannelPermissionAsk, readChannelOrigin, type ChannelOrigin as To
67
73
  export { ChatTurnSteeringController, ChatTurnSteeringIntervention, createChatTurnSteeringIntervention, type QueuedSteeringPrompt, } from "./core/agent/turn-steering.js";
68
74
  export { YOLO_STATE_KEY, isYoloEnabled, setYoloEnabled, } from "./core/state/yolo.js";
69
75
  export { MODE_STATE_KEY, getModeState, setSessionMode, type SessionMode, } from "./core/state/session-mode.js";
70
- export { DEFAULT_SESSION_MODE, MODE_DEFINITIONS, MODE_IDS, formatModeNames, getModeDefinition, getModeIds, getModeOptions, getModeTools, isKnownSessionMode, isModeDefinition, loadModeDefinitions, type KnownSessionMode, type ModeDefinition, } from "./core/modes/index.js";
76
+ export { DEFAULT_SESSION_MODE, MODE_DEFINITIONS, MODE_IDS, formatModeNames, getModeDefinition, getModeIds, getModeOptions, getModeTools, isKnownSessionMode, isModeDefinition, isModeListedTool, loadModeDefinitions, type KnownSessionMode, type ModeDefinition, } from "./core/modes/index.js";
71
77
  export type { LoadedModeDefinition } from "./core/modes/registry.js";
72
78
  export { TODO_ITEMS_STATE_KEY, TODO_VISIBLE_STATE_KEY, TodoItemSchema, TodoStatusSchema, clearTodoState, getTodoViewState, setTodoState, summarizeTodos, } from "./core/state/todos.js";
73
79
  export type { TodoItem, TodoStatus, TodoViewState, } from "./core/state/todos.js";