@astralyn/pi 0.84.4 → 0.84.6
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/CHANGELOG.md +57 -0
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +5 -4
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/core/agent-session.d.ts +6 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +11 -6
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/experimental.d.ts +4 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +10 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +19 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/keybindings.d.ts +29 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +4 -0
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +2 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +4 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/project-trust.js +2 -2
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/sdk.d.ts +5 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.js +2 -2
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +12 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +7 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -0
- package/dist/core/tools/write.js.map +1 -1
- package/dist/extensions/background/index.d.ts +149 -0
- package/dist/extensions/background/index.d.ts.map +1 -0
- package/dist/extensions/background/index.js +666 -0
- package/dist/extensions/background/index.js.map +1 -0
- package/dist/extensions/background/manager.d.ts +95 -0
- package/dist/extensions/background/manager.d.ts.map +1 -0
- package/dist/extensions/background/manager.js +421 -0
- package/dist/extensions/background/manager.js.map +1 -0
- package/dist/extensions/background/registry.d.ts +220 -0
- package/dist/extensions/background/registry.d.ts.map +1 -0
- package/dist/extensions/background/registry.js +589 -0
- package/dist/extensions/background/registry.js.map +1 -0
- package/dist/extensions/background/render.d.ts +50 -0
- package/dist/extensions/background/render.d.ts.map +1 -0
- package/dist/extensions/background/render.js +260 -0
- package/dist/extensions/background/render.js.map +1 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +2 -0
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/subagent/activity.d.ts +3 -6
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +9 -93
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents-command.d.ts.map +1 -1
- package/dist/extensions/subagent/agents-command.js +270 -169
- package/dist/extensions/subagent/agents-command.js.map +1 -1
- package/dist/extensions/subagent/agents.d.ts +5 -6
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +28 -192
- package/dist/extensions/subagent/agents.js.map +1 -1
- package/dist/extensions/subagent/budget.d.ts +15 -0
- package/dist/extensions/subagent/budget.d.ts.map +1 -0
- package/dist/extensions/subagent/budget.js +96 -0
- package/dist/extensions/subagent/budget.js.map +1 -0
- package/dist/extensions/subagent/cancellation.d.ts +29 -0
- package/dist/extensions/subagent/cancellation.d.ts.map +1 -0
- package/dist/extensions/subagent/cancellation.js +73 -0
- package/dist/extensions/subagent/cancellation.js.map +1 -0
- package/dist/extensions/subagent/constants.d.ts +4 -5
- package/dist/extensions/subagent/constants.d.ts.map +1 -1
- package/dist/extensions/subagent/constants.js +11 -7
- package/dist/extensions/subagent/constants.js.map +1 -1
- package/dist/extensions/subagent/index.d.ts +0 -3
- package/dist/extensions/subagent/index.d.ts.map +1 -1
- package/dist/extensions/subagent/index.js +59 -208
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/model-selection.d.ts +16 -0
- package/dist/extensions/subagent/model-selection.d.ts.map +1 -0
- package/dist/extensions/subagent/model-selection.js +51 -0
- package/dist/extensions/subagent/model-selection.js.map +1 -0
- package/dist/extensions/subagent/render.d.ts +7 -2
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +219 -576
- package/dist/extensions/subagent/render.js.map +1 -1
- package/dist/extensions/subagent/resolve.d.ts +2 -2
- package/dist/extensions/subagent/resolve.d.ts.map +1 -1
- package/dist/extensions/subagent/resolve.js +24 -35
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts +4 -6
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +101 -316
- package/dist/extensions/subagent/runner.js.map +1 -1
- package/dist/extensions/subagent/schema.d.ts +4 -10
- package/dist/extensions/subagent/schema.d.ts.map +1 -1
- package/dist/extensions/subagent/schema.js +8 -13
- package/dist/extensions/subagent/schema.js.map +1 -1
- package/dist/extensions/subagent/sdk-runner.d.ts +13 -11
- package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +169 -161
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/settings.d.ts +2 -2
- package/dist/extensions/subagent/settings.d.ts.map +1 -1
- package/dist/extensions/subagent/settings.js +27 -14
- package/dist/extensions/subagent/settings.js.map +1 -1
- package/dist/extensions/subagent/state.d.ts +89 -0
- package/dist/extensions/subagent/state.d.ts.map +1 -0
- package/dist/extensions/subagent/state.js +294 -0
- package/dist/extensions/subagent/state.js.map +1 -0
- package/dist/extensions/subagent/text.d.ts +7 -0
- package/dist/extensions/subagent/text.d.ts.map +1 -0
- package/dist/extensions/subagent/text.js +91 -0
- package/dist/extensions/subagent/text.js.map +1 -0
- package/dist/extensions/subagent/types.d.ts +16 -43
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/subagent/ui/choices.d.ts +36 -0
- package/dist/extensions/subagent/ui/choices.d.ts.map +1 -0
- package/dist/extensions/subagent/ui/choices.js +54 -0
- package/dist/extensions/subagent/ui/choices.js.map +1 -0
- package/dist/extensions/subagent/ui/model-list.d.ts +4 -3
- package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
- package/dist/extensions/subagent/ui/model-list.js +20 -22
- package/dist/extensions/subagent/ui/model-list.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +5 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +2 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +77 -25
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +36 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +23 -10
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +5 -3
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +12 -2
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +4 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +5 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/package-manager-cli.js +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +2 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +14 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/bundled/README.md +1 -0
- package/docs/bundled/extensions/background.md +99 -0
- package/docs/bundled/extensions/subagent.md +83 -71
- package/docs/compaction.md +6 -6
- package/docs/custom-provider.md +1 -1
- package/docs/docs.json +4 -0
- package/docs/environment-variables.md +8 -2
- package/docs/extensions.md +19 -2
- package/docs/json.md +6 -4
- package/docs/keybindings.md +9 -2
- package/docs/rpc.md +15 -4
- package/docs/sdk.md +9 -0
- package/docs/settings.md +31 -0
- package/docs/terminal-setup.md +23 -2
- package/docs/themes.md +24 -3
- package/docs/tui.md +2 -2
- package/docs/usage.md +4 -3
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +0 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +170 -221
- package/package.json +6 -6
- package/dist/extensions/subagent/display-name.d.ts +0 -6
- package/dist/extensions/subagent/display-name.d.ts.map +0 -1
- package/dist/extensions/subagent/display-name.js +0 -13
- package/dist/extensions/subagent/display-name.js.map +0 -1
- package/dist/extensions/subagent/retry.d.ts +0 -17
- package/dist/extensions/subagent/retry.d.ts.map +0 -1
- package/dist/extensions/subagent/retry.js +0 -41
- package/dist/extensions/subagent/retry.js.map +0 -1
- package/dist/extensions/subagent/ui/profile-editor.d.ts +0 -54
- package/dist/extensions/subagent/ui/profile-editor.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/profile-editor.js +0 -154
- package/dist/extensions/subagent/ui/profile-editor.js.map +0 -1
- package/dist/extensions/subagent/ui/profile-picker.d.ts +0 -32
- package/dist/extensions/subagent/ui/profile-picker.d.ts.map +0 -1
- package/dist/extensions/subagent/ui/profile-picker.js +0 -149
- package/dist/extensions/subagent/ui/profile-picker.js.map +0 -1
- package/examples/extensions/subagent/README.md +0 -175
- package/examples/extensions/subagent/agents/planner.md +0 -37
- package/examples/extensions/subagent/agents/reviewer.md +0 -35
- package/examples/extensions/subagent/agents/scout.md +0 -50
- package/examples/extensions/subagent/agents/worker.md +0 -24
- package/examples/extensions/subagent/agents.ts +0 -126
- package/examples/extensions/subagent/index.ts +0 -1009
- package/examples/extensions/subagent/prompts/implement-and-review.md +0 -10
- package/examples/extensions/subagent/prompts/implement.md +0 -10
- package/examples/extensions/subagent/prompts/scout-and-plan.md +0 -9
|
@@ -10,11 +10,14 @@ export const MAX_CONCURRENCY = 5;
|
|
|
10
10
|
// are retried, so a retry never discards partial work.
|
|
11
11
|
export const TASK_RETRY_LIMIT = 2;
|
|
12
12
|
export const TASK_RETRY_BASE_DELAY_MS = 1_000;
|
|
13
|
-
|
|
13
|
+
// The only selectable agents: the schema's agent field restricts task items
|
|
14
|
+
// to these names, resolve.ts defaults an omitted/null agent to explorer.
|
|
15
|
+
export const SUBAGENT_AGENT_NAMES = ["explorer", "general"];
|
|
14
16
|
// Matches the parent session's default toolset; bash covers search needs.
|
|
15
17
|
export const DEFAULT_AGENT_TOOLS = ["read", "bash", "edit", "write"];
|
|
16
|
-
//
|
|
17
|
-
// inspection (git history, counting); the system prompt
|
|
18
|
+
// The read-only explorer profile gets the standalone search tools plus bash
|
|
19
|
+
// for read-only inspection (git history, counting); the system prompt
|
|
20
|
+
// constrains bash.
|
|
18
21
|
export const EXPLORER_TOOLS = ["read", "grep", "find", "ls", "bash"];
|
|
19
22
|
export const THINKING_LEVELS = [
|
|
20
23
|
"off",
|
|
@@ -25,12 +28,13 @@ export const THINKING_LEVELS = [
|
|
|
25
28
|
"xhigh",
|
|
26
29
|
"max",
|
|
27
30
|
];
|
|
28
|
-
export const LIVE_TEXT_LIMIT = 8 * 1024;
|
|
29
31
|
export const ACTIVITY_LIMIT = 80;
|
|
30
32
|
export const ACTIVITY_TEXT_LIMIT = 24 * 1024;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
export const
|
|
33
|
+
// Per-task ceiling for the model-facing report; the total cap below wins
|
|
34
|
+
// when the batch is large enough that a fair share would exceed it.
|
|
35
|
+
export const TASK_OUTPUT_LIMIT = 32 * 1024;
|
|
36
|
+
// Total cap for the model-facing report across every task section.
|
|
37
|
+
export const TOTAL_OUTPUT_LIMIT = 48 * 1024;
|
|
34
38
|
export const ERROR_TEXT_LIMIT = 8 * 1024;
|
|
35
39
|
export const RETRY_ERROR_TEXT_LIMIT = 160;
|
|
36
40
|
export const DETAILS_OUTPUT_LIMIT = 120 * 1024;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/subagent/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AACzE,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/extensions/subagent/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAC9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,yEAAyE;AACzE,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAClC,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU,CAAC;AAGrE,0EAA0E;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,mBAAmB;AACnB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,KAAK;CACuC,CAAC;AAE9C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7C,yEAAyE;AACzE,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC3C,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAC1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC;AAC/C,yEAAyE;AACzE,yEAAyE;AACzE,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\n\nexport const SUBAGENT_TOOL_NAME = \"subagent\";\nexport const SUBAGENT_TOOL_LABEL = \"Subagent\";\nexport const SUBAGENT_COMMAND_NAME = \"agents\";\nexport const SUBAGENT_CONFIG_VERSION = 1;\nexport const SUBAGENT_CONFIG_FILE = \"subagent.json\";\n\nexport const MAX_TASKS = 8;\nexport const MAX_CONCURRENCY = 5;\n\n// Task-level retry for failures that bypass the session's own auto-retry\n// (preflight throws such as auth checks). Only runs that produced nothing\n// are retried, so a retry never discards partial work.\nexport const TASK_RETRY_LIMIT = 2;\nexport const TASK_RETRY_BASE_DELAY_MS = 1_000;\n\n// The only selectable agents: the schema's agent field restricts task items\n// to these names, resolve.ts defaults an omitted/null agent to explorer.\nexport const SUBAGENT_AGENT_NAMES = [\"explorer\", \"general\"] as const;\nexport type SubagentAgentName = (typeof SUBAGENT_AGENT_NAMES)[number];\n\n// Matches the parent session's default toolset; bash covers search needs.\nexport const DEFAULT_AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"] as const;\n// The read-only explorer profile gets the standalone search tools plus bash\n// for read-only inspection (git history, counting); the system prompt\n// constrains bash.\nexport const EXPLORER_TOOLS = [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] as const;\n\nexport const THINKING_LEVELS = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n] as const satisfies readonly ThinkingLevel[];\n\nexport const ACTIVITY_LIMIT = 80;\nexport const ACTIVITY_TEXT_LIMIT = 24 * 1024;\n// Per-task ceiling for the model-facing report; the total cap below wins\n// when the batch is large enough that a fair share would exceed it.\nexport const TASK_OUTPUT_LIMIT = 32 * 1024;\n// Total cap for the model-facing report across every task section.\nexport const TOTAL_OUTPUT_LIMIT = 48 * 1024;\nexport const ERROR_TEXT_LIMIT = 8 * 1024;\nexport const RETRY_ERROR_TEXT_LIMIT = 160;\nexport const DETAILS_OUTPUT_LIMIT = 120 * 1024;\n// Bounded per run inside DETAILS_OUTPUT_LIMIT; each activity costs up to\n// ~600 bytes, so 12 keeps an 8-run parallel batch from starving outputs.\nexport const DETAILS_ACTIVITY_LIMIT = 12;\n"]}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
import type { ExtensionAPI } from "../../core/extensions/types.ts";
|
|
2
|
-
import type { ModelRegistry } from "../../core/model-registry.ts";
|
|
3
|
-
import { ModelRuntime } from "../../core/model-runtime.ts";
|
|
4
|
-
export declare function syncParentProviders(runtime: ModelRuntime, registry: ModelRegistry, syncedIds: Set<string>, syncedApiKeys: Map<string, string>): Promise<void>;
|
|
5
2
|
export default function subagent(pi: ExtensionAPI): void;
|
|
6
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAYpF,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8EvD"}
|
|
@@ -1,221 +1,72 @@
|
|
|
1
|
-
import { join } from "node:path";
|
|
2
1
|
import { getAgentDir } from "../../config.js";
|
|
3
|
-
import { ModelRuntime } from "../../core/model-runtime.js";
|
|
4
2
|
import { emptyUsage } from "./activity.js";
|
|
5
|
-
import {
|
|
3
|
+
import { subagentToolDescription } from "./agents.js";
|
|
6
4
|
import { showAgentsCommand } from "./agents-command.js";
|
|
7
5
|
import { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME } from "./constants.js";
|
|
8
|
-
import { renderSubagentCall, renderSubagentResult } from "./render.js";
|
|
9
|
-
import { ConcurrencyGate, isSubagentError, runSubagentInvocation
|
|
6
|
+
import { renderSubagentCall, renderSubagentResult, scheduleLiveRefresh } from "./render.js";
|
|
7
|
+
import { ConcurrencyGate, isSubagentError, runSubagentInvocation } from "./runner.js";
|
|
10
8
|
import { SubagentParamsSchema } from "./schema.js";
|
|
11
|
-
|
|
12
|
-
// result is still partial; the first settled render clears the timer.
|
|
13
|
-
function scheduleLiveRefresh(context, isPartial) {
|
|
14
|
-
const state = context.state;
|
|
15
|
-
if (isPartial) {
|
|
16
|
-
if (state.refreshTimer === undefined) {
|
|
17
|
-
state.refreshTimer = setTimeout(() => {
|
|
18
|
-
state.refreshTimer = undefined;
|
|
19
|
-
context.invalidate();
|
|
20
|
-
}, 1000);
|
|
21
|
-
state.refreshTimer.unref?.();
|
|
22
|
-
}
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
if (state.refreshTimer !== undefined) {
|
|
26
|
-
clearTimeout(state.refreshTimer);
|
|
27
|
-
state.refreshTimer = undefined;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
// Parent tool calls execute in parallel by default, so every sync targeting
|
|
31
|
-
// the same child runtime must observe and update the tracking state in order.
|
|
32
|
-
const providerSyncQueues = new WeakMap();
|
|
33
|
-
// Provider configs are mostly JSON data, but stream, refresh, and OAuth hooks
|
|
34
|
-
// are functions whose identity is behaviorally significant. Compare enumerable
|
|
35
|
-
// values recursively so callback-only re-registrations propagate as well.
|
|
36
|
-
function providerConfigValuesEqual(left, right, seen = new WeakMap()) {
|
|
37
|
-
if (Object.is(left, right))
|
|
38
|
-
return true;
|
|
39
|
-
if (typeof left !== "object" || left === null || typeof right !== "object" || right === null)
|
|
40
|
-
return false;
|
|
41
|
-
if (Array.isArray(left) !== Array.isArray(right))
|
|
42
|
-
return false;
|
|
43
|
-
if (Array.isArray(left) && left.length !== right.length)
|
|
44
|
-
return false;
|
|
45
|
-
const comparedRights = seen.get(left);
|
|
46
|
-
if (comparedRights?.has(right))
|
|
47
|
-
return true;
|
|
48
|
-
if (comparedRights)
|
|
49
|
-
comparedRights.add(right);
|
|
50
|
-
else
|
|
51
|
-
seen.set(left, new WeakSet([right]));
|
|
52
|
-
const leftRecord = left;
|
|
53
|
-
const rightRecord = right;
|
|
54
|
-
const leftKeys = Object.keys(leftRecord).sort();
|
|
55
|
-
const rightKeys = Object.keys(rightRecord).sort();
|
|
56
|
-
if (leftKeys.length !== rightKeys.length)
|
|
57
|
-
return false;
|
|
58
|
-
for (let index = 0; index < leftKeys.length; index++) {
|
|
59
|
-
const key = leftKeys[index];
|
|
60
|
-
if (key === undefined || key !== rightKeys[index])
|
|
61
|
-
return false;
|
|
62
|
-
if (!providerConfigValuesEqual(leftRecord[key], rightRecord[key], seen))
|
|
63
|
-
return false;
|
|
64
|
-
}
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
async function syncParentProvidersNow(runtime, registry, syncedIds, syncedApiKeys) {
|
|
68
|
-
const nextIds = new Set(registry.getRegisteredProviderIds());
|
|
69
|
-
for (const id of [...syncedIds]) {
|
|
70
|
-
if (!nextIds.has(id)) {
|
|
71
|
-
runtime.unregisterProvider(id);
|
|
72
|
-
if (syncedApiKeys.has(id)) {
|
|
73
|
-
await runtime.removeRuntimeApiKey(id);
|
|
74
|
-
syncedApiKeys.delete(id);
|
|
75
|
-
}
|
|
76
|
-
syncedIds.delete(id);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
for (const id of nextIds) {
|
|
80
|
-
const native = registry.getRegisteredNativeProvider(id);
|
|
81
|
-
if (native) {
|
|
82
|
-
if (runtime.getRegisteredNativeProvider(id) !== native)
|
|
83
|
-
runtime.registerNativeProvider(native);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
const config = registry.getRegisteredProviderConfig(id);
|
|
87
|
-
if (config && !providerConfigValuesEqual(runtime.getRegisteredProviderConfig(id), config)) {
|
|
88
|
-
runtime.registerProvider(id, config);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Record the provider as soon as its registration is known to be in the
|
|
92
|
-
// child runtime. If auth lookup then fails, a later removal can still
|
|
93
|
-
// clean up this partially synchronized provider.
|
|
94
|
-
syncedIds.add(id);
|
|
95
|
-
const auth = await registry.getProviderAuth(id);
|
|
96
|
-
const apiKey = auth?.auth.apiKey;
|
|
97
|
-
if (apiKey && syncedApiKeys.get(id) !== apiKey) {
|
|
98
|
-
// pi-ai 0.84 AuthOperationOptions carries only signal; the runtime's
|
|
99
|
-
// credential sync hardcodes allowNetwork: false.
|
|
100
|
-
await runtime.setRuntimeApiKey(id, apiKey);
|
|
101
|
-
syncedApiKeys.set(id, apiKey);
|
|
102
|
-
}
|
|
103
|
-
else if (!apiKey && syncedApiKeys.has(id)) {
|
|
104
|
-
await runtime.removeRuntimeApiKey(id);
|
|
105
|
-
syncedApiKeys.delete(id);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
export async function syncParentProviders(runtime, registry, syncedIds, syncedApiKeys) {
|
|
110
|
-
const previous = providerSyncQueues.get(runtime) ?? Promise.resolve();
|
|
111
|
-
const current = previous
|
|
112
|
-
.catch(() => undefined)
|
|
113
|
-
.then(() => syncParentProvidersNow(runtime, registry, syncedIds, syncedApiKeys));
|
|
114
|
-
providerSyncQueues.set(runtime, current);
|
|
115
|
-
try {
|
|
116
|
-
await current;
|
|
117
|
-
}
|
|
118
|
-
finally {
|
|
119
|
-
if (providerSyncQueues.get(runtime) === current)
|
|
120
|
-
providerSyncQueues.delete(runtime);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
9
|
+
import { statusSummary } from "./state.js";
|
|
123
10
|
export default function subagent(pi) {
|
|
124
11
|
const gate = new ConcurrencyGate();
|
|
125
12
|
const activeAborters = new Set();
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
13
|
+
pi.registerTool({
|
|
14
|
+
name: SUBAGENT_TOOL_NAME,
|
|
15
|
+
label: SUBAGENT_TOOL_LABEL,
|
|
16
|
+
description: subagentToolDescription(),
|
|
17
|
+
promptSnippet: "Delegate bounded work to isolated Explorer or General workers",
|
|
18
|
+
promptGuidelines: [
|
|
19
|
+
"Use subagent for bounded work that benefits from isolated context or concurrent investigation; default to explorer, and choose general only when the task may modify files or state.",
|
|
20
|
+
],
|
|
21
|
+
parameters: SubagentParamsSchema,
|
|
22
|
+
async execute(toolCallId, params, signal, onUpdate, ctx) {
|
|
23
|
+
// First paint before task preflight so filesystem and model checks
|
|
24
|
+
// cannot leave the transcript card empty.
|
|
25
|
+
onUpdate?.({
|
|
26
|
+
content: [{ type: "text", text: "Initializing…" }],
|
|
27
|
+
details: {
|
|
28
|
+
status: "running",
|
|
29
|
+
runs: [],
|
|
30
|
+
startedAt: Date.now(),
|
|
31
|
+
usage: emptyUsage(),
|
|
32
|
+
},
|
|
135
33
|
});
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
34
|
+
const parent = {
|
|
35
|
+
model: ctx.model,
|
|
36
|
+
thinking: pi.getThinkingLevel(),
|
|
37
|
+
modelRegistry: ctx.modelRegistry,
|
|
38
|
+
};
|
|
39
|
+
const execution = await runSubagentInvocation({
|
|
40
|
+
params,
|
|
41
|
+
parentCwd: ctx.cwd,
|
|
42
|
+
parent,
|
|
43
|
+
modelRuntime: ctx.modelRuntime,
|
|
44
|
+
agentDir: getAgentDir(),
|
|
45
|
+
projectTrusted: ctx.isProjectTrusted(),
|
|
46
|
+
signal,
|
|
47
|
+
gate,
|
|
48
|
+
batchId: toolCallId,
|
|
49
|
+
onUpdate: (details) => {
|
|
50
|
+
onUpdate?.({ content: [{ type: "text", text: statusSummary(details) }], details });
|
|
51
|
+
},
|
|
52
|
+
registerAbort: (abort) => {
|
|
53
|
+
activeAborters.add(abort);
|
|
54
|
+
return () => activeAborters.delete(abort);
|
|
55
|
+
},
|
|
142
56
|
});
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
"Use subagent when a bounded task benefits from isolated context or parallel investigation; choose a profile and write its briefing using the tool description.",
|
|
157
|
-
],
|
|
158
|
-
parameters: SubagentParamsSchema,
|
|
159
|
-
async execute(_toolCallId, params, signal, onUpdate, ctx) {
|
|
160
|
-
// First paint before any await: model-runtime creation and task
|
|
161
|
-
// resolution can stall on first use (network, filesystem), and
|
|
162
|
-
// the transcript card must not sit empty while they do.
|
|
163
|
-
onUpdate?.({
|
|
164
|
-
content: [{ type: "text", text: "Initializing…" }],
|
|
165
|
-
details: {
|
|
166
|
-
mode: params.tasks ? "parallel" : "single",
|
|
167
|
-
status: "running",
|
|
168
|
-
runs: [],
|
|
169
|
-
startedAt: Date.now(),
|
|
170
|
-
usage: emptyUsage(),
|
|
171
|
-
},
|
|
172
|
-
});
|
|
173
|
-
const discovery = discoverAgents(ctx.cwd, {
|
|
174
|
-
projectTrusted: ctx.isProjectTrusted(),
|
|
175
|
-
agentDir: getAgentDir(),
|
|
176
|
-
});
|
|
177
|
-
const runtime = await getModelRuntime(ctx);
|
|
178
|
-
const parent = {
|
|
179
|
-
model: ctx.model,
|
|
180
|
-
thinking: pi.getThinkingLevel(),
|
|
181
|
-
modelRegistry: ctx.modelRegistry,
|
|
182
|
-
};
|
|
183
|
-
const execution = await runSubagentInvocation({
|
|
184
|
-
params,
|
|
185
|
-
parentCwd: ctx.cwd,
|
|
186
|
-
agents: discovery.agents,
|
|
187
|
-
parent,
|
|
188
|
-
modelRuntime: runtime,
|
|
189
|
-
agentDir: getAgentDir(),
|
|
190
|
-
projectTrusted: ctx.isProjectTrusted(),
|
|
191
|
-
signal,
|
|
192
|
-
gate,
|
|
193
|
-
onUpdate: (details) => {
|
|
194
|
-
onUpdate?.({ content: [{ type: "text", text: statusSummary(details) }], details });
|
|
195
|
-
},
|
|
196
|
-
registerAbort: (abort) => {
|
|
197
|
-
activeAborters.add(abort);
|
|
198
|
-
return () => activeAborters.delete(abort);
|
|
199
|
-
},
|
|
200
|
-
});
|
|
201
|
-
return {
|
|
202
|
-
content: [{ type: "text", text: execution.content }],
|
|
203
|
-
details: execution.details,
|
|
204
|
-
usage: execution.usage,
|
|
205
|
-
};
|
|
206
|
-
},
|
|
207
|
-
renderCall(args, theme) {
|
|
208
|
-
return renderSubagentCall(args, theme);
|
|
209
|
-
},
|
|
210
|
-
renderResult(result, options, theme, context) {
|
|
211
|
-
scheduleLiveRefresh(context, options.isPartial);
|
|
212
|
-
return renderSubagentResult(result, options, theme, context.isError);
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
};
|
|
216
|
-
registerSubagentTool(discoverAgents(process.cwd(), { projectTrusted: false, agentDir: getAgentDir() }));
|
|
217
|
-
pi.on("session_start", (_event, ctx) => {
|
|
218
|
-
registerSubagentTool(discoverAgents(ctx.cwd, { projectTrusted: ctx.isProjectTrusted(), agentDir: getAgentDir() }));
|
|
57
|
+
return {
|
|
58
|
+
content: [{ type: "text", text: execution.content }],
|
|
59
|
+
details: execution.details,
|
|
60
|
+
usage: execution.usage,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
renderCall(args, theme) {
|
|
64
|
+
return renderSubagentCall(args, theme);
|
|
65
|
+
},
|
|
66
|
+
renderResult(result, options, theme, context) {
|
|
67
|
+
scheduleLiveRefresh(context, options.isPartial);
|
|
68
|
+
return renderSubagentResult(result, options, theme, context.args, context.isError);
|
|
69
|
+
},
|
|
219
70
|
});
|
|
220
71
|
pi.registerCommand(SUBAGENT_COMMAND_NAME, {
|
|
221
72
|
description: "Configure Subagent profiles, models, and thinking levels",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionContext,\n\tToolRenderContext,\n} from \"../../core/extensions/types.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { emptyUsage } from \"./activity.ts\";\nimport { discoverAgents, subagentToolDescription } from \"./agents.ts\";\nimport { showAgentsCommand } from \"./agents-command.ts\";\nimport { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME } from \"./constants.ts\";\nimport { renderSubagentCall, renderSubagentResult } from \"./render.ts\";\nimport type { ParentModelContext } from \"./resolve.ts\";\nimport { ConcurrencyGate, isSubagentError, runSubagentInvocation, statusSummary } from \"./runner.ts\";\nimport { SubagentParamsSchema } from \"./schema.ts\";\nimport type { AgentDiscoveryResult, SubagentDetails } from \"./types.ts\";\n\ninterface SubagentRenderState {\n\trefreshTimer?: ReturnType<typeof setTimeout>;\n}\n\n// Re-render live elapsed time and activity tails once per second while the\n// result is still partial; the first settled render clears the timer.\nfunction scheduleLiveRefresh(context: ToolRenderContext<SubagentRenderState>, isPartial: boolean): void {\n\tconst state = context.state;\n\tif (isPartial) {\n\t\tif (state.refreshTimer === undefined) {\n\t\t\tstate.refreshTimer = setTimeout(() => {\n\t\t\t\tstate.refreshTimer = undefined;\n\t\t\t\tcontext.invalidate();\n\t\t\t}, 1000);\n\t\t\tstate.refreshTimer.unref?.();\n\t\t}\n\t\treturn;\n\t}\n\tif (state.refreshTimer !== undefined) {\n\t\tclearTimeout(state.refreshTimer);\n\t\tstate.refreshTimer = undefined;\n\t}\n}\n\n// Parent tool calls execute in parallel by default, so every sync targeting\n// the same child runtime must observe and update the tracking state in order.\nconst providerSyncQueues = new WeakMap<ModelRuntime, Promise<void>>();\n\n// Provider configs are mostly JSON data, but stream, refresh, and OAuth hooks\n// are functions whose identity is behaviorally significant. Compare enumerable\n// values recursively so callback-only re-registrations propagate as well.\nfunction providerConfigValuesEqual(\n\tleft: unknown,\n\tright: unknown,\n\tseen = new WeakMap<object, WeakSet<object>>(),\n): boolean {\n\tif (Object.is(left, right)) return true;\n\tif (typeof left !== \"object\" || left === null || typeof right !== \"object\" || right === null) return false;\n\tif (Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left) && left.length !== (right as unknown[]).length) return false;\n\n\tconst comparedRights = seen.get(left);\n\tif (comparedRights?.has(right)) return true;\n\tif (comparedRights) comparedRights.add(right);\n\telse seen.set(left, new WeakSet([right]));\n\n\tconst leftRecord = left as Record<string, unknown>;\n\tconst rightRecord = right as Record<string, unknown>;\n\tconst leftKeys = Object.keys(leftRecord).sort();\n\tconst rightKeys = Object.keys(rightRecord).sort();\n\tif (leftKeys.length !== rightKeys.length) return false;\n\tfor (let index = 0; index < leftKeys.length; index++) {\n\t\tconst key = leftKeys[index];\n\t\tif (key === undefined || key !== rightKeys[index]) return false;\n\t\tif (!providerConfigValuesEqual(leftRecord[key], rightRecord[key], seen)) return false;\n\t}\n\treturn true;\n}\n\nasync function syncParentProvidersNow(\n\truntime: ModelRuntime,\n\tregistry: ModelRegistry,\n\tsyncedIds: Set<string>,\n\tsyncedApiKeys: Map<string, string>,\n): Promise<void> {\n\tconst nextIds = new Set(registry.getRegisteredProviderIds());\n\tfor (const id of [...syncedIds]) {\n\t\tif (!nextIds.has(id)) {\n\t\t\truntime.unregisterProvider(id);\n\t\t\tif (syncedApiKeys.has(id)) {\n\t\t\t\tawait runtime.removeRuntimeApiKey(id);\n\t\t\t\tsyncedApiKeys.delete(id);\n\t\t\t}\n\t\t\tsyncedIds.delete(id);\n\t\t}\n\t}\n\tfor (const id of nextIds) {\n\t\tconst native = registry.getRegisteredNativeProvider(id);\n\t\tif (native) {\n\t\t\tif (runtime.getRegisteredNativeProvider(id) !== native) runtime.registerNativeProvider(native);\n\t\t} else {\n\t\t\tconst config = registry.getRegisteredProviderConfig(id);\n\t\t\tif (config && !providerConfigValuesEqual(runtime.getRegisteredProviderConfig(id), config)) {\n\t\t\t\truntime.registerProvider(id, config);\n\t\t\t}\n\t\t}\n\t\t// Record the provider as soon as its registration is known to be in the\n\t\t// child runtime. If auth lookup then fails, a later removal can still\n\t\t// clean up this partially synchronized provider.\n\t\tsyncedIds.add(id);\n\t\tconst auth = await registry.getProviderAuth(id);\n\t\tconst apiKey = auth?.auth.apiKey;\n\t\tif (apiKey && syncedApiKeys.get(id) !== apiKey) {\n\t\t\t// pi-ai 0.84 AuthOperationOptions carries only signal; the runtime's\n\t\t\t// credential sync hardcodes allowNetwork: false.\n\t\t\tawait runtime.setRuntimeApiKey(id, apiKey);\n\t\t\tsyncedApiKeys.set(id, apiKey);\n\t\t} else if (!apiKey && syncedApiKeys.has(id)) {\n\t\t\tawait runtime.removeRuntimeApiKey(id);\n\t\t\tsyncedApiKeys.delete(id);\n\t\t}\n\t}\n}\n\nexport async function syncParentProviders(\n\truntime: ModelRuntime,\n\tregistry: ModelRegistry,\n\tsyncedIds: Set<string>,\n\tsyncedApiKeys: Map<string, string>,\n): Promise<void> {\n\tconst previous = providerSyncQueues.get(runtime) ?? Promise.resolve();\n\tconst current = previous\n\t\t.catch(() => undefined)\n\t\t.then(() => syncParentProvidersNow(runtime, registry, syncedIds, syncedApiKeys));\n\tproviderSyncQueues.set(runtime, current);\n\ttry {\n\t\tawait current;\n\t} finally {\n\t\tif (providerSyncQueues.get(runtime) === current) providerSyncQueues.delete(runtime);\n\t}\n}\n\nexport default function subagent(pi: ExtensionAPI): void {\n\tconst gate = new ConcurrencyGate();\n\tconst activeAborters = new Set<() => Promise<void>>();\n\tconst syncedProviderIds = new Set<string>();\n\tconst syncedProviderApiKeys = new Map<string, string>();\n\tlet modelRuntimePromise: Promise<ModelRuntime> | undefined;\n\n\tconst getModelRuntime = async (ctx: ExtensionContext): Promise<ModelRuntime> => {\n\t\tif (!modelRuntimePromise) {\n\t\t\tconst agentDir = getAgentDir();\n\t\t\tconst created = ModelRuntime.create({\n\t\t\t\tauthPath: join(agentDir, \"auth.json\"),\n\t\t\t\tmodelsPath: join(agentDir, \"models.json\"),\n\t\t\t});\n\t\t\t// A transient failure (network, filesystem) must not brick the tool\n\t\t\t// for the rest of the session: drop the rejected promise so the\n\t\t\t// next invocation retries creation.\n\t\t\tcreated.catch(() => {\n\t\t\t\tif (modelRuntimePromise === created) modelRuntimePromise = undefined;\n\t\t\t});\n\t\t\tmodelRuntimePromise = created;\n\t\t}\n\t\tconst runtime = await modelRuntimePromise;\n\t\tawait syncParentProviders(runtime, ctx.modelRegistry, syncedProviderIds, syncedProviderApiKeys);\n\t\treturn runtime;\n\t};\n\n\tconst registerSubagentTool = (discovery: AgentDiscoveryResult): void => {\n\t\tpi.registerTool<typeof SubagentParamsSchema, SubagentDetails, SubagentRenderState>({\n\t\t\tname: SUBAGENT_TOOL_NAME,\n\t\t\tlabel: SUBAGENT_TOOL_LABEL,\n\t\t\tdescription: subagentToolDescription(discovery),\n\t\t\tpromptSnippet: \"Delegate focused research, review, or implementation tasks to isolated subagents\",\n\t\t\tpromptGuidelines: [\n\t\t\t\t\"Use subagent when a bounded task benefits from isolated context or parallel investigation; choose a profile and write its briefing using the tool description.\",\n\t\t\t],\n\t\t\tparameters: SubagentParamsSchema,\n\t\t\tasync execute(_toolCallId, params, signal, onUpdate, ctx): Promise<AgentToolResult<SubagentDetails>> {\n\t\t\t\t// First paint before any await: model-runtime creation and task\n\t\t\t\t// resolution can stall on first use (network, filesystem), and\n\t\t\t\t// the transcript card must not sit empty while they do.\n\t\t\t\tonUpdate?.({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Initializing…\" }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tmode: params.tasks ? \"parallel\" : \"single\",\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t\truns: [],\n\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\tusage: emptyUsage(),\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tconst discovery = discoverAgents(ctx.cwd, {\n\t\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\tagentDir: getAgentDir(),\n\t\t\t\t});\n\t\t\t\tconst runtime = await getModelRuntime(ctx);\n\t\t\t\tconst parent: ParentModelContext = {\n\t\t\t\t\tmodel: ctx.model,\n\t\t\t\t\tthinking: pi.getThinkingLevel(),\n\t\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\t};\n\t\t\t\tconst execution = await runSubagentInvocation({\n\t\t\t\t\tparams,\n\t\t\t\t\tparentCwd: ctx.cwd,\n\t\t\t\t\tagents: discovery.agents,\n\t\t\t\t\tparent,\n\t\t\t\t\tmodelRuntime: runtime,\n\t\t\t\t\tagentDir: getAgentDir(),\n\t\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\tsignal,\n\t\t\t\t\tgate,\n\t\t\t\t\tonUpdate: (details) => {\n\t\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: statusSummary(details) }], details });\n\t\t\t\t\t},\n\t\t\t\t\tregisterAbort: (abort) => {\n\t\t\t\t\t\tactiveAborters.add(abort);\n\t\t\t\t\t\treturn () => activeAborters.delete(abort);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: execution.content }],\n\t\t\t\t\tdetails: execution.details,\n\t\t\t\t\tusage: execution.usage,\n\t\t\t\t};\n\t\t\t},\n\t\t\trenderCall(args, theme) {\n\t\t\t\treturn renderSubagentCall(args, theme);\n\t\t\t},\n\t\t\trenderResult(result, options, theme, context) {\n\t\t\t\tscheduleLiveRefresh(context, options.isPartial);\n\t\t\t\treturn renderSubagentResult(result, options, theme, context.isError);\n\t\t\t},\n\t\t});\n\t};\n\n\tregisterSubagentTool(discoverAgents(process.cwd(), { projectTrusted: false, agentDir: getAgentDir() }));\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tregisterSubagentTool(\n\t\t\tdiscoverAgents(ctx.cwd, { projectTrusted: ctx.isProjectTrusted(), agentDir: getAgentDir() }),\n\t\t);\n\t});\n\n\tpi.registerCommand(SUBAGENT_COMMAND_NAME, {\n\t\tdescription: \"Configure Subagent profiles, models, and thinking levels\",\n\t\thandler: async (_args, ctx) => showAgentsCommand(ctx, pi.getThinkingLevel()),\n\t});\n\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== SUBAGENT_TOOL_NAME) return;\n\t\tconst details = event.details as SubagentDetails | undefined;\n\t\tif (details && isSubagentError(details)) return { isError: true };\n\t});\n\n\tpi.on(\"session_shutdown\", async () => {\n\t\tawait Promise.allSettled([...activeAborters].map((abort) => abort()));\n\t\tactiveAborters.clear();\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/subagent/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAgentDir } from \"../../config.ts\";\nimport type { AgentToolResult, ExtensionAPI } from \"../../core/extensions/types.ts\";\nimport { emptyUsage } from \"./activity.ts\";\nimport { subagentToolDescription } from \"./agents.ts\";\nimport { showAgentsCommand } from \"./agents-command.ts\";\nimport { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME } from \"./constants.ts\";\nimport { renderSubagentCall, renderSubagentResult, type SubagentRenderState, scheduleLiveRefresh } from \"./render.ts\";\nimport type { ParentModelContext } from \"./resolve.ts\";\nimport { ConcurrencyGate, isSubagentError, runSubagentInvocation } from \"./runner.ts\";\nimport { SubagentParamsSchema } from \"./schema.ts\";\nimport { statusSummary } from \"./state.ts\";\nimport type { SubagentDetails } from \"./types.ts\";\n\nexport default function subagent(pi: ExtensionAPI): void {\n\tconst gate = new ConcurrencyGate();\n\tconst activeAborters = new Set<() => Promise<void>>();\n\n\tpi.registerTool<typeof SubagentParamsSchema, SubagentDetails, SubagentRenderState>({\n\t\tname: SUBAGENT_TOOL_NAME,\n\t\tlabel: SUBAGENT_TOOL_LABEL,\n\t\tdescription: subagentToolDescription(),\n\t\tpromptSnippet: \"Delegate bounded work to isolated Explorer or General workers\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use subagent for bounded work that benefits from isolated context or concurrent investigation; default to explorer, and choose general only when the task may modify files or state.\",\n\t\t],\n\t\tparameters: SubagentParamsSchema,\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx): Promise<AgentToolResult<SubagentDetails>> {\n\t\t\t// First paint before task preflight so filesystem and model checks\n\t\t\t// cannot leave the transcript card empty.\n\t\t\tonUpdate?.({\n\t\t\t\tcontent: [{ type: \"text\", text: \"Initializing…\" }],\n\t\t\t\tdetails: {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\truns: [],\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\tusage: emptyUsage(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst parent: ParentModelContext = {\n\t\t\t\tmodel: ctx.model,\n\t\t\t\tthinking: pi.getThinkingLevel(),\n\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t};\n\t\t\tconst execution = await runSubagentInvocation({\n\t\t\t\tparams,\n\t\t\t\tparentCwd: ctx.cwd,\n\t\t\t\tparent,\n\t\t\t\tmodelRuntime: ctx.modelRuntime,\n\t\t\t\tagentDir: getAgentDir(),\n\t\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\t\tsignal,\n\t\t\t\tgate,\n\t\t\t\tbatchId: toolCallId,\n\t\t\t\tonUpdate: (details) => {\n\t\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: statusSummary(details) }], details });\n\t\t\t\t},\n\t\t\t\tregisterAbort: (abort) => {\n\t\t\t\t\tactiveAborters.add(abort);\n\t\t\t\t\treturn () => activeAborters.delete(abort);\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: execution.content }],\n\t\t\t\tdetails: execution.details,\n\t\t\t\tusage: execution.usage,\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme) {\n\t\t\treturn renderSubagentCall(args, theme);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tscheduleLiveRefresh(context, options.isPartial);\n\t\t\treturn renderSubagentResult(result, options, theme, context.args, context.isError);\n\t\t},\n\t});\n\n\tpi.registerCommand(SUBAGENT_COMMAND_NAME, {\n\t\tdescription: \"Configure Subagent profiles, models, and thinking levels\",\n\t\thandler: async (_args, ctx) => showAgentsCommand(ctx, pi.getThinkingLevel()),\n\t});\n\n\tpi.on(\"tool_result\", async (event) => {\n\t\tif (event.toolName !== SUBAGENT_TOOL_NAME) return;\n\t\tconst details = event.details as SubagentDetails | undefined;\n\t\tif (details && isSubagentError(details)) return { isError: true };\n\t});\n\n\tpi.on(\"session_shutdown\", async () => {\n\t\tawait Promise.allSettled([...activeAborters].map((abort) => abort()));\n\t\tactiveAborters.clear();\n\t});\n}\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import { type Api, type Model } from "@earendil-works/pi-ai/compat";
|
|
3
|
+
import type { ModelRegistry } from "../../core/model-registry.ts";
|
|
4
|
+
import type { SubagentProfileOverride } from "./types.ts";
|
|
5
|
+
/** The registry surface model selection needs; ParentModelContext satisfies it. */
|
|
6
|
+
export type ModelRegistryLike = Pick<ModelRegistry, "find" | "getAvailable" | "hasConfiguredAuth">;
|
|
7
|
+
export declare function modelId(model: Pick<Model<Api>, "provider" | "id"> | undefined): string;
|
|
8
|
+
export declare function parseModelSpec(value: string): {
|
|
9
|
+
provider: string;
|
|
10
|
+
id: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function findModel(models: readonly Model<Api>[], value: string | undefined): Model<Api> | undefined;
|
|
13
|
+
export declare function findAvailableModel(spec: string, registry: ModelRegistryLike): Model<Api>;
|
|
14
|
+
export declare function effectiveModel(currentSessionModel: Model<Api> | undefined, models: readonly Model<Api>[], override: SubagentProfileOverride | undefined): Model<Api> | undefined;
|
|
15
|
+
export declare function inheritedThinking(effective: Model<Api> | undefined, currentThinking: ThinkingLevel): ThinkingLevel;
|
|
16
|
+
//# sourceMappingURL=model-selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selection.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/model-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,GAAG,EAAsB,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAE1D,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,mBAAmB,CAAC,CAAC;AAEnG,wBAAgB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAEtF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAK9E;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAG1G;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,CAcxF;AAID,wBAAgB,cAAc,CAC7B,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAC3C,MAAM,EAAE,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,EAC7B,QAAQ,EAAE,uBAAuB,GAAG,SAAS,GAC3C,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAMxB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,eAAe,EAAE,aAAa,GAAG,aAAa,CAElH"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { clampThinkingLevel } from "@earendil-works/pi-ai/compat";
|
|
2
|
+
export function modelId(model) {
|
|
3
|
+
return model ? `${model.provider}/${model.id}` : "none";
|
|
4
|
+
}
|
|
5
|
+
export function parseModelSpec(value) {
|
|
6
|
+
const separator = value.indexOf("/");
|
|
7
|
+
return separator > 0
|
|
8
|
+
? { provider: value.slice(0, separator), id: value.slice(separator + 1) }
|
|
9
|
+
: { provider: "", id: value };
|
|
10
|
+
}
|
|
11
|
+
export function findModel(models, value) {
|
|
12
|
+
if (!value)
|
|
13
|
+
return undefined;
|
|
14
|
+
return models.find((model) => modelId(model) === value);
|
|
15
|
+
}
|
|
16
|
+
// Resolves a user/model-facing model spec against the live registry; errors
|
|
17
|
+
// are part of the contract (wording is asserted by config/resolve tests).
|
|
18
|
+
export function findAvailableModel(spec, registry) {
|
|
19
|
+
const normalized = spec.trim();
|
|
20
|
+
let model;
|
|
21
|
+
if (normalized.includes("/")) {
|
|
22
|
+
const { provider, id } = parseModelSpec(normalized);
|
|
23
|
+
model = registry.find(provider, id);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
const matches = registry.getAvailable().filter((candidate) => candidate.id === normalized);
|
|
27
|
+
if (matches.length === 1)
|
|
28
|
+
model = matches[0];
|
|
29
|
+
if (matches.length > 1)
|
|
30
|
+
throw new Error(`Model id "${normalized}" is ambiguous; use provider/model.`);
|
|
31
|
+
}
|
|
32
|
+
if (!model)
|
|
33
|
+
throw new Error(`Model "${normalized}" is not available.`);
|
|
34
|
+
if (!registry.hasConfiguredAuth(model))
|
|
35
|
+
throw new Error(`Model "${normalized}" has no configured authentication.`);
|
|
36
|
+
return model;
|
|
37
|
+
}
|
|
38
|
+
// Capability checks use the saved model when it is still in the catalog,
|
|
39
|
+
// falling back to the parent session model otherwise.
|
|
40
|
+
export function effectiveModel(currentSessionModel, models, override) {
|
|
41
|
+
if (override?.model) {
|
|
42
|
+
const saved = findModel(models, override.model);
|
|
43
|
+
if (saved)
|
|
44
|
+
return saved;
|
|
45
|
+
}
|
|
46
|
+
return currentSessionModel;
|
|
47
|
+
}
|
|
48
|
+
export function inheritedThinking(effective, currentThinking) {
|
|
49
|
+
return effective ? clampThinkingLevel(effective, currentThinking) : currentThinking;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=model-selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-selection.js","sourceRoot":"","sources":["../../../src/extensions/subagent/model-selection.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,kBAAkB,EAAc,MAAM,8BAA8B,CAAC;AAOxF,MAAM,UAAU,OAAO,CAAC,KAAsD;IAC7E,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,SAAS,GAAG,CAAC;QACnB,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE;QACzE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAA6B,EAAE,KAAyB;IACjF,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,4EAA4E;AAC5E,0EAA0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,QAA2B;IAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,KAA6B,CAAC;IAClC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QACpD,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACP,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QAC3F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,UAAU,qCAAqC,CAAC,CAAC;IACvG,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,qBAAqB,CAAC,CAAC;IACvE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,qCAAqC,CAAC,CAAC;IACnH,OAAO,KAAK,CAAC;AACd,CAAC;AAED,yEAAyE;AACzE,sDAAsD;AACtD,MAAM,UAAU,cAAc,CAC7B,mBAA2C,EAC3C,MAA6B,EAC7B,QAA6C;IAE7C,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiC,EAAE,eAA8B;IAClG,OAAO,SAAS,CAAC,CAAC,CAAE,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAmB,CAAC,CAAC,CAAC,eAAe,CAAC;AACxG,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { type Api, clampThinkingLevel, type Model } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport type { SubagentProfileOverride } from \"./types.ts\";\n\n/** The registry surface model selection needs; ParentModelContext satisfies it. */\nexport type ModelRegistryLike = Pick<ModelRegistry, \"find\" | \"getAvailable\" | \"hasConfiguredAuth\">;\n\nexport function modelId(model: Pick<Model<Api>, \"provider\" | \"id\"> | undefined): string {\n\treturn model ? `${model.provider}/${model.id}` : \"none\";\n}\n\nexport function parseModelSpec(value: string): { provider: string; id: string } {\n\tconst separator = value.indexOf(\"/\");\n\treturn separator > 0\n\t\t? { provider: value.slice(0, separator), id: value.slice(separator + 1) }\n\t\t: { provider: \"\", id: value };\n}\n\nexport function findModel(models: readonly Model<Api>[], value: string | undefined): Model<Api> | undefined {\n\tif (!value) return undefined;\n\treturn models.find((model) => modelId(model) === value);\n}\n\n// Resolves a user/model-facing model spec against the live registry; errors\n// are part of the contract (wording is asserted by config/resolve tests).\nexport function findAvailableModel(spec: string, registry: ModelRegistryLike): Model<Api> {\n\tconst normalized = spec.trim();\n\tlet model: Model<Api> | undefined;\n\tif (normalized.includes(\"/\")) {\n\t\tconst { provider, id } = parseModelSpec(normalized);\n\t\tmodel = registry.find(provider, id);\n\t} else {\n\t\tconst matches = registry.getAvailable().filter((candidate) => candidate.id === normalized);\n\t\tif (matches.length === 1) model = matches[0];\n\t\tif (matches.length > 1) throw new Error(`Model id \"${normalized}\" is ambiguous; use provider/model.`);\n\t}\n\tif (!model) throw new Error(`Model \"${normalized}\" is not available.`);\n\tif (!registry.hasConfiguredAuth(model)) throw new Error(`Model \"${normalized}\" has no configured authentication.`);\n\treturn model;\n}\n\n// Capability checks use the saved model when it is still in the catalog,\n// falling back to the parent session model otherwise.\nexport function effectiveModel(\n\tcurrentSessionModel: Model<Api> | undefined,\n\tmodels: readonly Model<Api>[],\n\toverride: SubagentProfileOverride | undefined,\n): Model<Api> | undefined {\n\tif (override?.model) {\n\t\tconst saved = findModel(models, override.model);\n\t\tif (saved) return saved;\n\t}\n\treturn currentSessionModel;\n}\n\nexport function inheritedThinking(effective: Model<Api> | undefined, currentThinking: ThinkingLevel): ThinkingLevel {\n\treturn effective ? (clampThinkingLevel(effective, currentThinking) as ThinkingLevel) : currentThinking;\n}\n"]}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { type Component } from "@earendil-works/pi-tui";
|
|
2
|
-
import type { AgentToolResult, ToolRenderResultOptions } from "../../core/extensions/types.ts";
|
|
2
|
+
import type { AgentToolResult, ToolRenderContext, ToolRenderResultOptions } from "../../core/extensions/types.ts";
|
|
3
3
|
import { type Theme } from "../../modes/interactive/theme/theme.ts";
|
|
4
4
|
import type { SubagentParams } from "./schema.ts";
|
|
5
5
|
import type { SubagentDetails } from "./types.ts";
|
|
6
|
+
/** Per-result live-refresh state owned by the shell's render context. */
|
|
7
|
+
export interface SubagentRenderState {
|
|
8
|
+
refreshTimer?: ReturnType<typeof setTimeout>;
|
|
9
|
+
}
|
|
10
|
+
export declare function scheduleLiveRefresh(context: ToolRenderContext<SubagentRenderState>, isPartial: boolean): void;
|
|
6
11
|
export declare function renderSubagentCall(args: SubagentParams, theme: Theme): Component;
|
|
7
|
-
export declare function renderSubagentResult(result: AgentToolResult<SubagentDetails>, options: ToolRenderResultOptions, theme: Theme, isError: boolean): Component;
|
|
12
|
+
export declare function renderSubagentResult(result: AgentToolResult<SubagentDetails>, options: ToolRenderResultOptions, theme: Theme, args: SubagentParams, isError: boolean): Component;
|
|
8
13
|
//# sourceMappingURL=render.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,OAAO,KAAK,EAAE,eAAe,EAAuD,MAAM,YAAY,CAAC;AAiPvG,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IACnC,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CAC7C;AAID,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,iBAAiB,CAAC,mBAAmB,CAAC,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAgB7G;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAQhF;AAED,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,OAAO,GACd,SAAS,CA6BX"}
|