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.
- package/README.md +44 -18
- package/dist/acp/acp-agent.d.ts +42 -0
- package/dist/acp/acp-agent.js +336 -47
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/approvals.js +11 -10
- package/dist/acp/approvals.js.map +1 -1
- package/dist/acp/browser.d.ts +9 -0
- package/dist/acp/browser.js +23 -0
- package/dist/acp/browser.js.map +1 -0
- package/dist/acp/meta/vscode.d.ts +8 -7
- package/dist/acp/meta/vscode.js +10 -11
- package/dist/acp/meta/vscode.js.map +1 -1
- package/dist/acp/session-config.d.ts +2 -2
- package/dist/acp/session-config.js +24 -20
- package/dist/acp/session-config.js.map +1 -1
- package/dist/acp/sessions/store.d.ts +3 -3
- package/dist/acp/utils/tool-kind.js +8 -6
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/chat/app.js +91 -11
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/approvals.js +3 -0
- package/dist/chat/approvals.js.map +1 -1
- package/dist/chat/components/ApprovalPrompt.js +15 -25
- package/dist/chat/components/ApprovalPrompt.js.map +1 -1
- package/dist/chat/components/BackgroundJobsPanel.d.ts +10 -0
- package/dist/chat/components/BackgroundJobsPanel.js +15 -0
- package/dist/chat/components/BackgroundJobsPanel.js.map +1 -0
- package/dist/chat/components/BottomChrome.d.ts +6 -1
- package/dist/chat/components/BottomChrome.js +3 -2
- package/dist/chat/components/BottomChrome.js.map +1 -1
- package/dist/chat/components/ChromePicker.d.ts +7 -2
- package/dist/chat/components/ChromePicker.js +18 -2
- package/dist/chat/components/ChromePicker.js.map +1 -1
- package/dist/chat/components/Composer.js +3 -2
- package/dist/chat/components/Composer.js.map +1 -1
- package/dist/chat/components/DownloadPanel.js +2 -1
- package/dist/chat/components/DownloadPanel.js.map +1 -1
- package/dist/chat/components/EmptyChatBanner.js +2 -1
- package/dist/chat/components/EmptyChatBanner.js.map +1 -1
- package/dist/chat/components/PromptInput.js +2 -1
- package/dist/chat/components/PromptInput.js.map +1 -1
- package/dist/chat/components/QuestionPrompt.js +5 -4
- package/dist/chat/components/QuestionPrompt.js.map +1 -1
- package/dist/chat/components/QueuedPrompts.js +3 -2
- package/dist/chat/components/QueuedPrompts.js.map +1 -1
- package/dist/chat/components/ReasoningStrip.js +2 -1
- package/dist/chat/components/ReasoningStrip.js.map +1 -1
- package/dist/chat/components/RetryEvent.js +2 -1
- package/dist/chat/components/RetryEvent.js.map +1 -1
- package/dist/chat/components/SelectPicker.js +2 -1
- package/dist/chat/components/SelectPicker.js.map +1 -1
- package/dist/chat/components/ShellToolEvent.d.ts +12 -0
- package/dist/chat/components/ShellToolEvent.js +94 -0
- package/dist/chat/components/ShellToolEvent.js.map +1 -0
- package/dist/chat/components/SlashCommands.js +2 -1
- package/dist/chat/components/SlashCommands.js.map +1 -1
- package/dist/chat/components/Spinner.js +2 -1
- package/dist/chat/components/Spinner.js.map +1 -1
- package/dist/chat/components/StatusBar.js +19 -15
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/chat/components/ThinkingStatus.js +2 -1
- package/dist/chat/components/ThinkingStatus.js.map +1 -1
- package/dist/chat/components/ThoughtEvent.js +2 -1
- package/dist/chat/components/ThoughtEvent.js.map +1 -1
- package/dist/chat/components/TodoPanel.js +2 -1
- package/dist/chat/components/TodoPanel.js.map +1 -1
- package/dist/chat/components/ToolEvent.d.ts +2 -1
- package/dist/chat/components/ToolEvent.js +9 -2
- package/dist/chat/components/ToolEvent.js.map +1 -1
- package/dist/chat/components/ToolEventFileResult.js +8 -7
- package/dist/chat/components/ToolEventFileResult.js.map +1 -1
- package/dist/chat/components/Transcript.d.ts +4 -2
- package/dist/chat/components/Transcript.js +4 -4
- package/dist/chat/components/Transcript.js.map +1 -1
- package/dist/chat/components/markdown/BlockRenderer.js +3 -2
- package/dist/chat/components/markdown/BlockRenderer.js.map +1 -1
- package/dist/chat/components/markdown/CodeBlock.js +3 -2
- package/dist/chat/components/markdown/CodeBlock.js.map +1 -1
- package/dist/chat/components/markdown/InlineRenderer.js +6 -5
- package/dist/chat/components/markdown/InlineRenderer.js.map +1 -1
- package/dist/chat/components/shared.js +7 -6
- package/dist/chat/components/shared.js.map +1 -1
- package/dist/chat/types.d.ts +7 -0
- package/dist/cli.js +162 -44
- package/dist/cli.js.map +1 -1
- package/dist/configure/app.js +46 -29
- package/dist/configure/app.js.map +1 -1
- package/dist/configure/components/BusyScreen.js +2 -1
- package/dist/configure/components/BusyScreen.js.map +1 -1
- package/dist/configure/components/MenuScreen.js +3 -2
- package/dist/configure/components/MenuScreen.js.map +1 -1
- package/dist/configure/components/PromptForm.js +2 -1
- package/dist/configure/components/PromptForm.js.map +1 -1
- package/dist/configure/components/SelectMenuItem.js +4 -3
- package/dist/configure/components/SelectMenuItem.js.map +1 -1
- package/dist/configure/utils.js +4 -3
- package/dist/configure/utils.js.map +1 -1
- package/dist/core/agent/default-retry-strategy.js +46 -12
- package/dist/core/agent/default-retry-strategy.js.map +1 -1
- package/dist/core/agent/gitignore-guard-plugin.js +17 -2
- package/dist/core/agent/gitignore-guard-plugin.js.map +1 -1
- package/dist/core/agent/index.js +38 -7
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/approvals/allowlist.js +1 -0
- package/dist/core/approvals/allowlist.js.map +1 -1
- package/dist/core/approvals/intervention.d.ts +10 -2
- package/dist/core/approvals/intervention.js +46 -8
- package/dist/core/approvals/intervention.js.map +1 -1
- package/dist/core/config.d.ts +9 -2
- package/dist/core/config.js +8 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +2 -2
- package/dist/core/mcp/oauth/service.js +2 -2
- package/dist/core/mcp/oauth/service.js.map +1 -1
- package/dist/core/models/bedrock.js +6 -0
- package/dist/core/models/bedrock.js.map +1 -1
- package/dist/core/models/groq.js +34 -14
- package/dist/core/models/groq.js.map +1 -1
- package/dist/core/models/minimax.js +1 -1
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/types.d.ts +10 -2
- package/dist/core/models/types.js +1 -0
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/modes/definitions.d.ts +4 -2
- package/dist/core/modes/definitions.js +77 -9
- package/dist/core/modes/definitions.js.map +1 -1
- package/dist/core/modes/index.d.ts +1 -1
- package/dist/core/modes/index.js +1 -1
- package/dist/core/modes/index.js.map +1 -1
- package/dist/core/modes/registry.js +4 -9
- package/dist/core/modes/registry.js.map +1 -1
- package/dist/core/modes/schema.d.ts +1 -1
- package/dist/core/modes/schema.js +1 -1
- package/dist/core/modes/schema.js.map +1 -1
- package/dist/core/prompts/agents/{review.md → code-review.md} +2 -2
- package/dist/core/prompts/agents/design-review.md +35 -0
- package/dist/core/prompts/agents/{test-investigator.md → quality-analyst.md} +2 -2
- package/dist/core/prompts/modes/agent.md +2 -0
- package/dist/core/prompts/modes/ask.md +2 -2
- package/dist/core/prompts/modes/design.md +37 -0
- package/dist/core/prompts/modes/plan.md +5 -5
- package/dist/core/prompts/{runtime.js → runtime/agents.js} +2 -2
- package/dist/core/prompts/runtime/agents.js.map +1 -0
- package/dist/core/prompts/runtime/design.d.ts +11 -0
- package/dist/core/prompts/runtime/design.js +78 -0
- package/dist/core/prompts/runtime/design.js.map +1 -0
- package/dist/core/prompts/{session-mode-appendix.js → session-mode.js} +1 -1
- package/dist/core/prompts/session-mode.js.map +1 -0
- package/dist/core/prompts/static/ask-user.md +3 -2
- package/dist/core/prompts/static/fetch.md +2 -1
- package/dist/core/prompts/static/filesystem.md +2 -1
- package/dist/core/prompts/static/shell.md +21 -1
- package/dist/core/prompts/static/subagents.md +2 -1
- package/dist/core/prompts/static/switch-mode.md +10 -0
- package/dist/core/prompts/system.d.ts +1 -0
- package/dist/core/prompts/system.js +11 -3
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/shell/index.d.ts +7 -0
- package/dist/core/shell/index.js +6 -0
- package/dist/core/shell/index.js.map +1 -0
- package/dist/core/shell/manager.d.ts +23 -0
- package/dist/core/shell/manager.js +604 -0
- package/dist/core/shell/manager.js.map +1 -0
- package/dist/core/shell/output-buffer.d.ts +30 -0
- package/dist/core/shell/output-buffer.js +116 -0
- package/dist/core/shell/output-buffer.js.map +1 -0
- package/dist/core/shell/registry.d.ts +5 -0
- package/dist/core/shell/registry.js +24 -0
- package/dist/core/shell/registry.js.map +1 -0
- package/dist/core/{tools/shell.d.ts → shell/terminal-backend.d.ts} +20 -18
- package/dist/core/shell/terminal-backend.js +18 -0
- package/dist/core/shell/terminal-backend.js.map +1 -0
- package/dist/core/shell/tools.d.ts +41 -0
- package/dist/core/{tools/shell.js → shell/tools.js} +186 -11
- package/dist/core/shell/tools.js.map +1 -0
- package/dist/core/shell/types.d.ts +95 -0
- package/dist/core/shell/types.js +2 -0
- package/dist/core/shell/types.js.map +1 -0
- package/dist/core/skills/built-in/hooman-config/SKILL.md +30 -35
- package/dist/core/skills/built-in/hooman-config/search.md +5 -3
- package/dist/core/skills/built-in/hooman-design/SKILL.md +97 -0
- package/dist/core/skills/built-in/hooman-design/assets/article-shell.html +87 -0
- package/dist/core/skills/built-in/hooman-design/assets/auth-shell.html +143 -0
- package/dist/core/skills/built-in/hooman-design/assets/business-card-shell.html +112 -0
- package/dist/core/skills/built-in/hooman-design/assets/contact-shell.html +181 -0
- package/dist/core/skills/built-in/hooman-design/assets/dashboard-shell.html +90 -0
- package/dist/core/skills/built-in/hooman-design/assets/data-table-shell.html +114 -0
- package/dist/core/skills/built-in/hooman-design/assets/deck-shell.html +187 -0
- package/dist/core/skills/built-in/hooman-design/assets/dialog-shell.html +98 -0
- package/dist/core/skills/built-in/hooman-design/assets/email-shell.html +101 -0
- package/dist/core/skills/built-in/hooman-design/assets/empty-state-shell.html +92 -0
- package/dist/core/skills/built-in/hooman-design/assets/flyer-shell.html +168 -0
- package/dist/core/skills/built-in/hooman-design/assets/invite-shell.html +167 -0
- package/dist/core/skills/built-in/hooman-design/assets/landing-shell.html +184 -0
- package/dist/core/skills/built-in/hooman-design/assets/mobile-frame-shell.html +109 -0
- package/dist/core/skills/built-in/hooman-design/assets/newsletter-shell.html +141 -0
- package/dist/core/skills/built-in/hooman-design/assets/onboarding-shell.html +131 -0
- package/dist/core/skills/built-in/hooman-design/assets/pricing-shell.html +160 -0
- package/dist/core/skills/built-in/hooman-design/assets/prototype-shell.html +83 -0
- package/dist/core/skills/built-in/hooman-design/assets/resume-shell.html +228 -0
- package/dist/core/skills/built-in/hooman-design/assets/settings-shell.html +196 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/botanical-calm.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/copper-ledger.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/editorial-ink.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/fintech-clear.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/harbor-navy.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/midnight-editorial.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/night-console.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/paper-mono.css +35 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/signal-mono.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/soft-product.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/swiss-grid.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/tokens/warm-atelier.css +34 -0
- package/dist/core/skills/built-in/hooman-design/assets/waitlist-shell.html +139 -0
- package/dist/core/skills/built-in/hooman-design/craft/accessibility-baseline.md +32 -0
- package/dist/core/skills/built-in/hooman-design/craft/anti-ai-slop.md +27 -0
- package/dist/core/skills/built-in/hooman-design/craft/color-surfaces.md +45 -0
- package/dist/core/skills/built-in/hooman-design/craft/data-viz.md +24 -0
- package/dist/core/skills/built-in/hooman-design/craft/deck-slides.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/forms-validation.md +35 -0
- package/dist/core/skills/built-in/hooman-design/craft/iconography.md +19 -0
- package/dist/core/skills/built-in/hooman-design/craft/layout-overflow.md +31 -0
- package/dist/core/skills/built-in/hooman-design/craft/motion.md +41 -0
- package/dist/core/skills/built-in/hooman-design/craft/print.md +37 -0
- package/dist/core/skills/built-in/hooman-design/craft/responsive.md +30 -0
- package/dist/core/skills/built-in/hooman-design/craft/spacing-density.md +46 -0
- package/dist/core/skills/built-in/hooman-design/craft/state-coverage.md +21 -0
- package/dist/core/skills/built-in/hooman-design/craft/typography.md +73 -0
- package/dist/core/skills/built-in/hooman-design/directions.md +115 -0
- package/dist/core/skills/built-in/hooman-design/references/artifact-layout.md +15 -0
- package/dist/core/skills/built-in/hooman-design/references/export.md +47 -0
- package/dist/core/skills/built-in/hooman-design/references/workflow.md +80 -0
- package/dist/core/skills/built-in/hooman-mcp/SKILL.md +2 -2
- package/dist/core/state/llm-modality.d.ts +13 -0
- package/dist/core/state/llm-modality.js +19 -0
- package/dist/core/state/llm-modality.js.map +1 -0
- package/dist/core/state/plan.d.ts +1 -1
- package/dist/core/state/plan.js +1 -1
- package/dist/core/state/shell-jobs.d.ts +9 -0
- package/dist/core/state/shell-jobs.js +20 -0
- package/dist/core/state/shell-jobs.js.map +1 -0
- package/dist/core/state/tool-approvals.d.ts +12 -9
- package/dist/core/state/tool-approvals.js +94 -52
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/state/turn-boundaries.d.ts +33 -0
- package/dist/core/state/turn-boundaries.js +49 -0
- package/dist/core/state/turn-boundaries.js.map +1 -0
- package/dist/core/subagents/index.d.ts +1 -1
- package/dist/core/subagents/index.js +1 -1
- package/dist/core/subagents/registry.js +15 -6
- package/dist/core/subagents/registry.js.map +1 -1
- package/dist/core/subagents/tool.d.ts +8 -2
- package/dist/core/subagents/tool.js +93 -44
- package/dist/core/subagents/tool.js.map +1 -1
- package/dist/core/theme.d.ts +14 -0
- package/dist/core/theme.js +14 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/tools/ask-user.d.ts +1 -1
- package/dist/core/tools/ask-user.js +1 -1
- package/dist/core/tools/export.d.ts +8 -0
- package/dist/core/tools/export.js +202 -0
- package/dist/core/tools/export.js.map +1 -0
- package/dist/core/tools/fetch.d.ts +2 -0
- package/dist/core/tools/fetch.js +92 -55
- package/dist/core/tools/fetch.js.map +1 -1
- package/dist/core/tools/filesystem.d.ts +2 -1
- package/dist/core/tools/filesystem.js +38 -4
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/index.d.ts +3 -2
- package/dist/core/tools/index.js +3 -2
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/preview.d.ts +10 -0
- package/dist/core/tools/preview.js +147 -0
- package/dist/core/tools/preview.js.map +1 -0
- package/dist/core/tools/switch-mode.d.ts +6 -0
- package/dist/core/tools/switch-mode.js +188 -0
- package/dist/core/tools/switch-mode.js.map +1 -0
- package/dist/core/tools/web-search.js +176 -0
- package/dist/core/tools/web-search.js.map +1 -1
- package/dist/core/utils/browser.d.ts +8 -1
- package/dist/core/utils/browser.js +17 -1
- package/dist/core/utils/browser.js.map +1 -1
- package/dist/core/utils/export-design.d.ts +40 -0
- package/dist/core/utils/export-design.js +188 -0
- package/dist/core/utils/export-design.js.map +1 -0
- package/dist/core/utils/export-figma.d.ts +17 -0
- package/dist/core/utils/export-figma.js +189 -0
- package/dist/core/utils/export-figma.js.map +1 -0
- package/dist/core/utils/export-sketch.d.ts +11 -0
- package/dist/core/utils/export-sketch.js +456 -0
- package/dist/core/utils/export-sketch.js.map +1 -0
- package/dist/core/utils/fig-archive.d.ts +47 -0
- package/dist/core/utils/fig-archive.js +181 -0
- package/dist/core/utils/fig-archive.js.map +1 -0
- package/dist/core/utils/metadata.d.ts +30 -0
- package/dist/core/utils/metadata.js +122 -0
- package/dist/core/utils/metadata.js.map +1 -1
- package/dist/core/utils/models-prefetch.d.ts +53 -0
- package/dist/core/utils/models-prefetch.js +469 -0
- package/dist/core/utils/models-prefetch.js.map +1 -0
- package/dist/core/utils/onboarding-config.d.ts +48 -0
- package/dist/core/utils/onboarding-config.js +373 -0
- package/dist/core/utils/onboarding-config.js.map +1 -0
- package/dist/core/utils/paths.d.ts +9 -7
- package/dist/core/utils/paths.js +12 -10
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/core/utils/preview-server.d.ts +20 -0
- package/dist/core/utils/preview-server.js +212 -0
- package/dist/core/utils/preview-server.js.map +1 -0
- package/dist/core/utils/search-probe.d.ts +19 -0
- package/dist/core/utils/search-probe.js +165 -0
- package/dist/core/utils/search-probe.js.map +1 -0
- package/dist/core/utils/seeds/empty-slides.deck +0 -0
- package/dist/core/utils/url-safety.d.ts +2 -0
- package/dist/core/utils/url-safety.js +47 -0
- package/dist/core/utils/url-safety.js.map +1 -0
- package/dist/core/utils/zstd.d.ts +6 -0
- package/dist/core/utils/zstd.js +39 -0
- package/dist/core/utils/zstd.js.map +1 -0
- package/dist/exec/approvals.js +5 -5
- package/dist/exec/approvals.js.map +1 -1
- package/dist/index.d.ts +11 -5
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/onboarding/app.d.ts +5 -0
- package/dist/onboarding/app.js +255 -0
- package/dist/onboarding/app.js.map +1 -0
- package/dist/onboarding/index.d.ts +5 -0
- package/dist/onboarding/index.js +27 -0
- package/dist/onboarding/index.js.map +1 -0
- package/package.json +16 -3
- package/dist/core/prompts/runtime.js.map +0 -1
- package/dist/core/prompts/session-mode-appendix.js.map +0 -1
- package/dist/core/prompts/static/planning.md +0 -3
- package/dist/core/tools/plan.d.ts +0 -5
- package/dist/core/tools/plan.js +0 -150
- package/dist/core/tools/plan.js.map +0 -1
- package/dist/core/tools/shell.js.map +0 -1
- /package/dist/core/prompts/{runtime.d.ts → runtime/agents.d.ts} +0 -0
- /package/dist/core/prompts/{session-mode-appendix.d.ts → session-mode.d.ts} +0 -0
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { getModeTools } from "../modes/definitions.js";
|
|
1
|
+
import { getModeTools, isModeListedTool } from "../modes/definitions.js";
|
|
2
|
+
import { builtInSkillsPath } from "../skills/plugin.js";
|
|
2
3
|
import { getModeState } from "./session-mode.js";
|
|
3
4
|
import { isResolvedPathInsideDir, normalizeUserPath, } from "../utils/normalize-user-path.js";
|
|
4
5
|
import { getCwd } from "../utils/cwd-context.js";
|
|
5
|
-
import { attachmentsPath, plansPath } from "../utils/paths.js";
|
|
6
|
+
import { attachmentsPath, designArtifactsPath, plansPath, } from "../utils/paths.js";
|
|
7
|
+
import { EXPORT_DESIGN_TOOL_NAME } from "../tools/export.js";
|
|
8
|
+
import { PREVIEW_DESIGN_TOOL_NAME, STOP_DESIGN_PREVIEW_TOOL_NAME, } from "../tools/preview.js";
|
|
6
9
|
const READ_FILE_TOOL = "read_file";
|
|
7
10
|
const READ_MULTIPLE_FILES_TOOL = "read_multiple_files";
|
|
8
11
|
const WRITE_FILE_TOOL = "write_file";
|
|
9
12
|
const EDIT_FILE_TOOL = "edit_file";
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
const FETCH_TOOL = "fetch";
|
|
14
|
+
/** Session mode switch; always requires explicit approval (never yolo / always-allow). */
|
|
15
|
+
export const SWITCH_MODE_TOOL = "switch_mode";
|
|
12
16
|
const ASK_USER_TOOL = "ask_user";
|
|
13
17
|
const SEARCH_TOOLS_TOOL = "search_tools";
|
|
14
18
|
const ACTIVATE_TOOLS_TOOL = "activate_tools";
|
|
@@ -23,11 +27,12 @@ export const INTERNAL_ALWAYS_ALLOWED = new Set([
|
|
|
23
27
|
// Thinking
|
|
24
28
|
"think",
|
|
25
29
|
// Subagents (read-only)
|
|
26
|
-
"
|
|
27
|
-
"subagent_review",
|
|
28
|
-
"subagent_test_investigator",
|
|
30
|
+
"launch_subagent",
|
|
29
31
|
// Sleep
|
|
30
32
|
"sleep",
|
|
33
|
+
// Background shell job management (safe to use in any mode once a job exists)
|
|
34
|
+
"shell_output",
|
|
35
|
+
"shell_stop",
|
|
31
36
|
// Asking the user a question IS the interaction — no separate approval gate.
|
|
32
37
|
ASK_USER_TOOL,
|
|
33
38
|
SEARCH_TOOLS_TOOL,
|
|
@@ -40,64 +45,86 @@ export const INTERNAL_ALWAYS_ALLOWED = new Set([
|
|
|
40
45
|
"get_file_info",
|
|
41
46
|
"list_directory",
|
|
42
47
|
"grep",
|
|
43
|
-
//
|
|
44
|
-
// to leave planning and move toward implementation, so it flows through the
|
|
45
|
-
// approval prompt where the user can approve or decline (and keep refining).
|
|
46
|
-
ENTER_PLAN_MODE_TOOL,
|
|
48
|
+
// switch_mode is intentionally NOT always-allowed — see intervention.ts.
|
|
47
49
|
]);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
const PLAN_MODE_WRITE_EDIT_TOOLS = [WRITE_FILE_TOOL, EDIT_FILE_TOOL];
|
|
51
|
+
function toolInputPath(toolInput) {
|
|
52
|
+
if (!toolInput || typeof toolInput !== "object") {
|
|
53
|
+
return "";
|
|
54
|
+
}
|
|
55
|
+
const path = toolInput.path;
|
|
56
|
+
return typeof path === "string" ? path.trim() : "";
|
|
57
|
+
}
|
|
58
|
+
function toolInputSaveAs(toolInput) {
|
|
59
|
+
if (!toolInput || typeof toolInput !== "object") {
|
|
60
|
+
return "";
|
|
61
|
+
}
|
|
62
|
+
const saveAs = toolInput.save_as;
|
|
63
|
+
return typeof saveAs === "string" ? saveAs.trim() : "";
|
|
50
64
|
}
|
|
51
65
|
/**
|
|
52
|
-
* In
|
|
53
|
-
* under the
|
|
54
|
-
*
|
|
66
|
+
* In plan mode, reject `write_file` / `edit_file` unless the destination path
|
|
67
|
+
* is under the plans directory, and reject `fetch` with `save_as` entirely.
|
|
68
|
+
* Runs before any “always allow” grant.
|
|
55
69
|
*/
|
|
56
70
|
export function planModeWriteEditRejectionMessage(agent, toolName, toolInput) {
|
|
57
71
|
if (getModeState(agent).mode !== "plan") {
|
|
58
72
|
return null;
|
|
59
73
|
}
|
|
60
|
-
if (toolName
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
74
|
+
if (PLAN_MODE_WRITE_EDIT_TOOLS.includes(toolName)) {
|
|
75
|
+
const plansRoot = plansPath();
|
|
76
|
+
const raw = toolInputPath(toolInput);
|
|
77
|
+
if (raw && isResolvedPathInsideDir(normalizeUserPath(raw), plansRoot)) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return `In plan mode, "${toolName}" was rejected automatically: path must be under the plans directory (${plansRoot}).`;
|
|
66
81
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return `In plan mode, "${toolName}" requires a path under the plans directory (${plansRoot}).`;
|
|
82
|
+
if (toolName === FETCH_TOOL && toolInputSaveAs(toolInput)) {
|
|
83
|
+
return `In plan mode, "${toolName}" with save_as was rejected automatically: downloading files is not allowed.`;
|
|
70
84
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const DESIGN_ARTIFACT_IMPLICIT_TOOLS = [
|
|
88
|
+
PREVIEW_DESIGN_TOOL_NAME,
|
|
89
|
+
STOP_DESIGN_PREVIEW_TOOL_NAME,
|
|
90
|
+
EXPORT_DESIGN_TOOL_NAME,
|
|
91
|
+
];
|
|
92
|
+
function isDesignToolImplicitlyAllowed(toolName, toolInput) {
|
|
93
|
+
if (!DESIGN_ARTIFACT_IMPLICIT_TOOLS.includes(toolName)) {
|
|
94
|
+
return false;
|
|
74
95
|
}
|
|
75
|
-
|
|
96
|
+
const raw = toolInputPath(toolInput);
|
|
97
|
+
return (Boolean(raw) &&
|
|
98
|
+
isResolvedPathInsideDir(normalizeUserPath(raw), designArtifactsPath()));
|
|
76
99
|
}
|
|
77
100
|
/**
|
|
78
101
|
* Skip approval for filesystem tools when targets stay inside trusted roots.
|
|
79
102
|
* In ask/plan mode, read_file/read_multiple_files are also auto-allowed under
|
|
80
103
|
* the session cwd so the narrowed surfaces can inspect the workspace without
|
|
81
|
-
* repeated approval prompts.
|
|
104
|
+
* repeated approval prompts. Built-in skill assets are readable in every mode.
|
|
82
105
|
*/
|
|
83
106
|
function isImplicitPathAllowed(toolName, toolInput, mode) {
|
|
84
107
|
const attachments = attachmentsPath();
|
|
85
108
|
const plans = plansPath();
|
|
86
|
-
const readRoots = [attachments, plans];
|
|
87
|
-
if (mode === "ask" || mode === "plan") {
|
|
109
|
+
const readRoots = [attachments, plans, builtInSkillsPath()];
|
|
110
|
+
if (mode === "ask" || mode === "plan" || mode === "design") {
|
|
88
111
|
readRoots.push(getCwd());
|
|
89
112
|
}
|
|
90
113
|
if (toolName === READ_FILE_TOOL) {
|
|
91
|
-
const raw = toolInput
|
|
92
|
-
if (
|
|
114
|
+
const raw = toolInputPath(toolInput);
|
|
115
|
+
if (!raw) {
|
|
93
116
|
return false;
|
|
94
117
|
}
|
|
95
118
|
const resolved = normalizeUserPath(raw);
|
|
96
119
|
return readRoots.some((root) => isResolvedPathInsideDir(resolved, root));
|
|
97
120
|
}
|
|
98
121
|
if (toolName === READ_MULTIPLE_FILES_TOOL) {
|
|
99
|
-
const paths = toolInput
|
|
100
|
-
|
|
122
|
+
const paths = toolInput &&
|
|
123
|
+
typeof toolInput === "object" &&
|
|
124
|
+
Array.isArray(toolInput.paths)
|
|
125
|
+
? toolInput.paths
|
|
126
|
+
: null;
|
|
127
|
+
if (!paths || paths.length === 0) {
|
|
101
128
|
return false;
|
|
102
129
|
}
|
|
103
130
|
for (const item of paths) {
|
|
@@ -113,37 +140,52 @@ function isImplicitPathAllowed(toolName, toolInput, mode) {
|
|
|
113
140
|
return true;
|
|
114
141
|
}
|
|
115
142
|
if (toolName === WRITE_FILE_TOOL || toolName === EDIT_FILE_TOOL) {
|
|
116
|
-
const raw = toolInput
|
|
117
|
-
if (
|
|
143
|
+
const raw = toolInputPath(toolInput);
|
|
144
|
+
if (!raw) {
|
|
118
145
|
return false;
|
|
119
146
|
}
|
|
120
147
|
const resolved = normalizeUserPath(raw);
|
|
121
|
-
|
|
148
|
+
if (isResolvedPathInsideDir(resolved, plans)) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
// Design mode: artifact writes under `.hooman/design/` are the whole point.
|
|
152
|
+
if (mode === "design" &&
|
|
153
|
+
isResolvedPathInsideDir(resolved, designArtifactsPath())) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
122
157
|
}
|
|
123
158
|
return false;
|
|
124
159
|
}
|
|
125
160
|
/**
|
|
126
161
|
* Implicit, always-on allow for filesystem tools whose targets stay inside
|
|
127
|
-
* trusted roots: reads under attachments or
|
|
128
|
-
* under the session cwd in ask/plan
|
|
129
|
-
* plans directory
|
|
130
|
-
*
|
|
162
|
+
* trusted roots: reads under attachments, plans, or bundled skills in every
|
|
163
|
+
* mode, plus reads under the session cwd in ask/plan/design; writes/edits under
|
|
164
|
+
* the plans directory in every mode, and under `.hooman/design/` in design mode.
|
|
165
|
+
* Design tools (`preview_design`, `stop_design_preview`, `export_design`) are
|
|
166
|
+
* also auto-allowed when `path` is under `.hooman/design/`. Persistent "always
|
|
167
|
+
* allow" grants are handled separately by the on-disk {@link Allowlist}
|
|
168
|
+
* (see `../approvals/allowlist.ts`).
|
|
131
169
|
*/
|
|
132
170
|
export function isImplicitlyAllowed(toolName, toolInput, mode) {
|
|
133
|
-
return (
|
|
171
|
+
return (isDesignToolImplicitlyAllowed(toolName, toolInput) ||
|
|
134
172
|
isImplicitPathAllowed(toolName, toolInput, mode));
|
|
135
173
|
}
|
|
136
174
|
export function isToolVisible(mode, toolName, options) {
|
|
137
|
-
const
|
|
138
|
-
if (
|
|
175
|
+
const visibleTools = getModeTools(mode);
|
|
176
|
+
if (!visibleTools) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
if (visibleTools.includes(toolName)) {
|
|
139
180
|
return true;
|
|
140
181
|
}
|
|
141
|
-
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
182
|
+
// Read-only MCP tools stay available in every mode.
|
|
183
|
+
if (options?.mcpReadOnlyHint === true) {
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
// Dynamic / MCP tools (not on any mode allowlist) remain available in agent.
|
|
187
|
+
if (mode === "agent" && !isModeListedTool(toolName)) {
|
|
188
|
+
return true;
|
|
147
189
|
}
|
|
148
190
|
return false;
|
|
149
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-approvals.js","sourceRoot":"","sources":["../../../src/core/state/tool-approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-approvals.js","sourceRoot":"","sources":["../../../src/core/state/tool-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-turn message-index bookmarks, keyed by the ACP `messageId` the agent
|
|
3
|
+
* generates for that turn's user message.
|
|
4
|
+
*
|
|
5
|
+
* Per the ACP MessageId RFD, only the Agent generates protocol message ids —
|
|
6
|
+
* a client never mints its own. Clients that support turn "revert"
|
|
7
|
+
* capture the `messageId`
|
|
8
|
+
* from the turn's `user_message_chunk` echo and pass it back via the custom
|
|
9
|
+
* `_hoomanjs/rewind_session` method. We record `agent.messages.length` right
|
|
10
|
+
* before the turn's messages are appended, so a later rewind can splice
|
|
11
|
+
* history back to exactly that point. Stored on `appState` (persisted with
|
|
12
|
+
* the snapshot) so it survives across turns within a session; entries are
|
|
13
|
+
* dropped once their turn (or a later one) is rewound.
|
|
14
|
+
*/
|
|
15
|
+
export declare const TURN_BOUNDARIES_STATE_KEY = "hooman.turnBoundaries";
|
|
16
|
+
type AppStateLike = {
|
|
17
|
+
get<T = unknown>(key: string): T;
|
|
18
|
+
set(key: string, value: unknown): void;
|
|
19
|
+
};
|
|
20
|
+
type AgentLike = {
|
|
21
|
+
appState: AppStateLike;
|
|
22
|
+
};
|
|
23
|
+
/** Record the message-index boundary for a turn about to start. */
|
|
24
|
+
export declare function recordTurnBoundary(agent: AgentLike, messageId: string, messageIndex: number): void;
|
|
25
|
+
/** Message-index boundary for `messageId`, or `undefined` if unknown (e.g. replayed history). */
|
|
26
|
+
export declare function getTurnBoundary(agent: AgentLike, messageId: string): number | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Drop the boundary for `messageId` and every turn recorded after it (their
|
|
29
|
+
* messages are being spliced away by the rewind, so their bookmarks are no
|
|
30
|
+
* longer meaningful).
|
|
31
|
+
*/
|
|
32
|
+
export declare function dropTurnBoundariesFrom(agent: AgentLike, messageId: string): void;
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-turn message-index bookmarks, keyed by the ACP `messageId` the agent
|
|
3
|
+
* generates for that turn's user message.
|
|
4
|
+
*
|
|
5
|
+
* Per the ACP MessageId RFD, only the Agent generates protocol message ids —
|
|
6
|
+
* a client never mints its own. Clients that support turn "revert"
|
|
7
|
+
* capture the `messageId`
|
|
8
|
+
* from the turn's `user_message_chunk` echo and pass it back via the custom
|
|
9
|
+
* `_hoomanjs/rewind_session` method. We record `agent.messages.length` right
|
|
10
|
+
* before the turn's messages are appended, so a later rewind can splice
|
|
11
|
+
* history back to exactly that point. Stored on `appState` (persisted with
|
|
12
|
+
* the snapshot) so it survives across turns within a session; entries are
|
|
13
|
+
* dropped once their turn (or a later one) is rewound.
|
|
14
|
+
*/
|
|
15
|
+
export const TURN_BOUNDARIES_STATE_KEY = "hooman.turnBoundaries";
|
|
16
|
+
function readTurnBoundaries(agent) {
|
|
17
|
+
const raw = agent.appState.get(TURN_BOUNDARIES_STATE_KEY);
|
|
18
|
+
return raw && typeof raw === "object" ? raw : {};
|
|
19
|
+
}
|
|
20
|
+
/** Record the message-index boundary for a turn about to start. */
|
|
21
|
+
export function recordTurnBoundary(agent, messageId, messageIndex) {
|
|
22
|
+
const boundaries = readTurnBoundaries(agent);
|
|
23
|
+
boundaries[messageId] = messageIndex;
|
|
24
|
+
agent.appState.set(TURN_BOUNDARIES_STATE_KEY, boundaries);
|
|
25
|
+
}
|
|
26
|
+
/** Message-index boundary for `messageId`, or `undefined` if unknown (e.g. replayed history). */
|
|
27
|
+
export function getTurnBoundary(agent, messageId) {
|
|
28
|
+
return readTurnBoundaries(agent)[messageId];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Drop the boundary for `messageId` and every turn recorded after it (their
|
|
32
|
+
* messages are being spliced away by the rewind, so their bookmarks are no
|
|
33
|
+
* longer meaningful).
|
|
34
|
+
*/
|
|
35
|
+
export function dropTurnBoundariesFrom(agent, messageId) {
|
|
36
|
+
const boundaries = readTurnBoundaries(agent);
|
|
37
|
+
const cutoff = boundaries[messageId];
|
|
38
|
+
if (cutoff === undefined) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const next = {};
|
|
42
|
+
for (const [id, index] of Object.entries(boundaries)) {
|
|
43
|
+
if (index < cutoff) {
|
|
44
|
+
next[id] = index;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
agent.appState.set(TURN_BOUNDARIES_STATE_KEY, next);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=turn-boundaries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-boundaries.js","sourceRoot":"","sources":["../../../src/core/state/turn-boundaries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAajE,SAAS,kBAAkB,CAAC,KAAgB;IAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAC5B,yBAAyB,CAC1B,CAAC;IACF,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAChC,KAAgB,EAChB,SAAiB,EACjB,YAAoB;IAEpB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,UAAU,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;IACrC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,eAAe,CAC7B,KAAgB,EAChB,SAAiB;IAEjB,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgB,EAChB,SAAiB;IAEjB,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAmB,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { createSubagentRegistry, type SubagentKindConfig, type SubagentKindDefinition, type SubagentRegistry, } from "./registry.js";
|
|
2
|
-
export {
|
|
2
|
+
export { LAUNCH_SUBAGENT_TOOL_NAME, createSubagentTools } from "./tool.js";
|
|
@@ -25,23 +25,32 @@ const BUILTIN_SUBAGENT_KINDS = [
|
|
|
25
25
|
inheritBasePrompt: true,
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
|
-
id: "review",
|
|
29
|
-
name: "Review",
|
|
30
|
-
promptPath: "agents/review.md",
|
|
28
|
+
id: "code-review",
|
|
29
|
+
name: "Code Review",
|
|
30
|
+
promptPath: "agents/code-review.md",
|
|
31
31
|
description: "reviews code, changes, and plans for risks and regressions",
|
|
32
32
|
allowedTools: DEFAULT_ALLOWED_TOOLS,
|
|
33
33
|
readOnly: true,
|
|
34
34
|
inheritBasePrompt: true,
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
|
-
id: "
|
|
38
|
-
name: "
|
|
39
|
-
promptPath: "agents/
|
|
37
|
+
id: "quality-analyst",
|
|
38
|
+
name: "Quality Analyst",
|
|
39
|
+
promptPath: "agents/quality-analyst.md",
|
|
40
40
|
description: "investigates test/build behaviors and likely failure causes",
|
|
41
41
|
allowedTools: DEFAULT_ALLOWED_TOOLS,
|
|
42
42
|
readOnly: true,
|
|
43
43
|
inheritBasePrompt: true,
|
|
44
44
|
},
|
|
45
|
+
{
|
|
46
|
+
id: "design-review",
|
|
47
|
+
name: "Design Review",
|
|
48
|
+
promptPath: "agents/design-review.md",
|
|
49
|
+
description: "reviews HTML design artifacts (and screenshots) against DESIGN.md and craft rules",
|
|
50
|
+
allowedTools: DEFAULT_ALLOWED_TOOLS,
|
|
51
|
+
readOnly: true,
|
|
52
|
+
inheritBasePrompt: true,
|
|
53
|
+
},
|
|
45
54
|
];
|
|
46
55
|
function promptContext(config) {
|
|
47
56
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;AAC/B,MAAM,aAAa,GAAG,aAAa,CAAC;AAsBpC,MAAM,qBAAqB,GAAG;IAC5B,WAAW;IACX,qBAAqB;IACrB,gBAAgB;IAChB,gBAAgB;IAChB,MAAM;IACN,eAAe;IACf,OAAO;IACP,YAAY;IACZ,OAAO;CACC,CAAC;AAEX,MAAM,sBAAsB,GAAkC;IAC5D;QACE,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,UAAU;QAChB,UAAU,EAAE,oBAAoB;QAChC,WAAW,EAAE,8CAA8C;QAC3D,YAAY,EAAE,qBAAqB;QACnC,QAAQ,EAAE,IAAI;QACd,iBAAiB,EAAE,IAAI;KACxB;IACD;QACE,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/subagents/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
import { type Tool } from "@strands-agents/sdk";
|
|
2
2
|
import type { BaseModelConfig, Model } from "@strands-agents/sdk";
|
|
3
|
+
import type { ResolvedLlmInputModality } from "../utils/model-metadata.js";
|
|
3
4
|
import { type SubagentRegistry } from "./registry.js";
|
|
4
|
-
export declare const
|
|
5
|
+
export declare const LAUNCH_SUBAGENT_TOOL_NAME = "launch_subagent";
|
|
5
6
|
type CreateSubagentToolsOptions = {
|
|
6
7
|
parent: string;
|
|
7
8
|
registry: SubagentRegistry;
|
|
8
9
|
tools: readonly Tool[];
|
|
9
|
-
|
|
10
|
+
/** Configured LLM names (`config.llms[].name`) offered as the optional `model` arg. */
|
|
11
|
+
modelNames: readonly string[];
|
|
12
|
+
/** Create a model; omit `name` to use the session's current model. */
|
|
13
|
+
createModel: (name?: string) => Model<BaseModelConfig>;
|
|
14
|
+
/** Resolve input modality for a named (or current) model. */
|
|
15
|
+
resolveModality: (name?: string) => Promise<ResolvedLlmInputModality | null | undefined>;
|
|
10
16
|
};
|
|
11
17
|
export declare function createSubagentTools(options: CreateSubagentToolsOptions): Tool[];
|
|
12
18
|
export {};
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Agent, tool } from "@strands-agents/sdk";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
|
|
4
|
-
const
|
|
3
|
+
import { getLlmModality, LLM_MODALITY_STATE_KEY, setLlmModality, } from "../state/llm-modality.js";
|
|
4
|
+
export const LAUNCH_SUBAGENT_TOOL_NAME = "launch_subagent";
|
|
5
|
+
const LaunchSubagentBaseSchema = z.object({
|
|
5
6
|
query: z.string().trim().min(1),
|
|
6
7
|
});
|
|
7
8
|
function readAppStateString(context, key) {
|
|
@@ -22,9 +23,6 @@ function extractText(response) {
|
|
|
22
23
|
.join("")
|
|
23
24
|
.trim();
|
|
24
25
|
}
|
|
25
|
-
function subagentToolName(kindId) {
|
|
26
|
-
return `${SUBAGENT_TOOL_NAME_PREFIX}${kindId.replace(/-/g, "_")}`;
|
|
27
|
-
}
|
|
28
26
|
function selectTools(kind, tools) {
|
|
29
27
|
const byName = new Map();
|
|
30
28
|
for (const tool of tools) {
|
|
@@ -40,45 +38,96 @@ function selectTools(kind, tools) {
|
|
|
40
38
|
}
|
|
41
39
|
return selected;
|
|
42
40
|
}
|
|
41
|
+
function asNonEmptyEnum(values) {
|
|
42
|
+
if (values.length === 0) {
|
|
43
|
+
throw new Error("Expected at least one value for enum schema.");
|
|
44
|
+
}
|
|
45
|
+
return values;
|
|
46
|
+
}
|
|
47
|
+
function buildInputSchema(kindIds, modelNames) {
|
|
48
|
+
const kind = z
|
|
49
|
+
.enum(asNonEmptyEnum(kindIds))
|
|
50
|
+
.describe("Subagent specialist to launch.");
|
|
51
|
+
if (modelNames.length === 0) {
|
|
52
|
+
return LaunchSubagentBaseSchema.extend({ kind });
|
|
53
|
+
}
|
|
54
|
+
return LaunchSubagentBaseSchema.extend({
|
|
55
|
+
kind,
|
|
56
|
+
model: z
|
|
57
|
+
.enum(asNonEmptyEnum(modelNames))
|
|
58
|
+
.optional()
|
|
59
|
+
.describe("Optional configured model name. When omitted, uses the current session model."),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function kindCatalog(registry) {
|
|
63
|
+
return registry.kinds
|
|
64
|
+
.map((kind) => `- ${kind.id}: ${kind.description}`)
|
|
65
|
+
.join("\n");
|
|
66
|
+
}
|
|
43
67
|
export function createSubagentTools(options) {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
const kindIds = options.registry.kinds.map((kind) => kind.id);
|
|
69
|
+
if (kindIds.length === 0) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
const baseTools = options.tools.filter((entry) => entry.name !== LAUNCH_SUBAGENT_TOOL_NAME);
|
|
73
|
+
const inputSchema = buildInputSchema(kindIds, options.modelNames);
|
|
74
|
+
const description = [
|
|
75
|
+
"Delegate a focused task to a specialized read-only subagent.",
|
|
76
|
+
"Pass `kind` to select the specialist; optionally pass `model` (a configured LLM name) to override the current session model.",
|
|
77
|
+
"For design-review: pass every reviews/*.png path in the query and require binary reads — do not skip after export_design format:images.",
|
|
78
|
+
"Kinds:",
|
|
79
|
+
kindCatalog(options.registry),
|
|
80
|
+
].join("\n");
|
|
81
|
+
return [
|
|
82
|
+
tool({
|
|
83
|
+
name: LAUNCH_SUBAGENT_TOOL_NAME,
|
|
84
|
+
description,
|
|
85
|
+
inputSchema,
|
|
86
|
+
callback: async (input, context) => {
|
|
87
|
+
if (!context) {
|
|
88
|
+
throw new Error(`${LAUNCH_SUBAGENT_TOOL_NAME} requires execution context.`);
|
|
89
|
+
}
|
|
90
|
+
const kind = options.registry.byId.get(input.kind);
|
|
91
|
+
if (!kind) {
|
|
92
|
+
return `Unknown subagent kind '${input.kind}'.`;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
const modelName = input.model?.trim() || undefined;
|
|
96
|
+
const modality = (await options.resolveModality(modelName)) ??
|
|
97
|
+
(modelName ? null : getLlmModality(context.agent));
|
|
98
|
+
const child = new Agent({
|
|
99
|
+
name: `${options.parent}-${kind.id}`,
|
|
100
|
+
systemPrompt: kind.instructions,
|
|
101
|
+
model: options.createModel(modelName),
|
|
102
|
+
appState: {
|
|
103
|
+
...(readAppStateString(context, "userId")
|
|
104
|
+
? { userId: readAppStateString(context, "userId") }
|
|
105
|
+
: {}),
|
|
106
|
+
...(readAppStateString(context, "sessionId")
|
|
107
|
+
? { sessionId: readAppStateString(context, "sessionId") }
|
|
108
|
+
: {}),
|
|
109
|
+
"hooman.subagentKind": kind.id,
|
|
110
|
+
...(modality ? { [LLM_MODALITY_STATE_KEY]: modality } : {}),
|
|
111
|
+
},
|
|
112
|
+
tools: [...selectTools(kind, baseTools)],
|
|
113
|
+
printer: false,
|
|
114
|
+
});
|
|
115
|
+
if (modality) {
|
|
116
|
+
setLlmModality(child, modality);
|
|
117
|
+
}
|
|
118
|
+
const response = context.agent.cancelSignal
|
|
119
|
+
? await child.invoke(input.query, {
|
|
120
|
+
cancelSignal: context.agent.cancelSignal,
|
|
121
|
+
})
|
|
122
|
+
: await child.invoke(input.query);
|
|
123
|
+
return extractText(response);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
127
|
+
return `Subagent '${kind.id}' failed: ${detail}`;
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
}),
|
|
131
|
+
];
|
|
83
132
|
}
|
|
84
133
|
//# sourceMappingURL=tool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/core/subagents/tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAA+B,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/core/subagents/tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared brand palette for CLI Ink surfaces (and any other non-webview UI).
|
|
3
|
+
* VS Code webviews mirror these values in `src/vscode/webview/index.css`.
|
|
4
|
+
*/
|
|
5
|
+
export declare const theme: {
|
|
6
|
+
readonly primary: "#0091cd";
|
|
7
|
+
readonly secondary: "#56a0d3";
|
|
8
|
+
readonly warning: "#ecb731";
|
|
9
|
+
readonly error: "#ee4c58";
|
|
10
|
+
readonly success: "#8ec06c";
|
|
11
|
+
readonly info: "#c4dff6";
|
|
12
|
+
readonly muted: "#9ba5a8";
|
|
13
|
+
};
|
|
14
|
+
export type ThemeColor = (typeof theme)[keyof typeof theme];
|