@astralyn/pi 0.84.3 → 0.84.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -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/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/project-trust.js +1 -4
- package/dist/cli/project-trust.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 +7 -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.map +1 -1
- package/dist/core/extensions/runner.js +4 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -14
- 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 +2 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +3 -1
- 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 +74 -0
- package/dist/extensions/background/index.d.ts.map +1 -0
- package/dist/extensions/background/index.js +332 -0
- package/dist/extensions/background/index.js.map +1 -0
- package/dist/extensions/background/manager.d.ts +81 -0
- package/dist/extensions/background/manager.d.ts.map +1 -0
- package/dist/extensions/background/manager.js +320 -0
- package/dist/extensions/background/manager.js.map +1 -0
- package/dist/extensions/background/registry.d.ts +138 -0
- package/dist/extensions/background/registry.d.ts.map +1 -0
- package/dist/extensions/background/registry.js +358 -0
- package/dist/extensions/background/registry.js.map +1 -0
- package/dist/extensions/background/render.d.ts +26 -0
- package/dist/extensions/background/render.d.ts.map +1 -0
- package/dist/extensions/background/render.js +118 -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 +0 -1
- package/dist/extensions/subagent/activity.d.ts.map +1 -1
- package/dist/extensions/subagent/activity.js +2 -5
- package/dist/extensions/subagent/activity.js.map +1 -1
- package/dist/extensions/subagent/agents-command.d.ts +4 -0
- package/dist/extensions/subagent/agents-command.d.ts.map +1 -0
- package/dist/extensions/subagent/agents-command.js +385 -0
- package/dist/extensions/subagent/agents-command.js.map +1 -0
- package/dist/extensions/subagent/agents.d.ts +3 -6
- package/dist/extensions/subagent/agents.d.ts.map +1 -1
- package/dist/extensions/subagent/agents.js +22 -190
- package/dist/extensions/subagent/agents.js.map +1 -1
- 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 +58 -315
- package/dist/extensions/subagent/index.js.map +1 -1
- package/dist/extensions/subagent/render.d.ts +1 -1
- package/dist/extensions/subagent/render.d.ts.map +1 -1
- package/dist/extensions/subagent/render.js +208 -585
- 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 +23 -15
- package/dist/extensions/subagent/resolve.js.map +1 -1
- package/dist/extensions/subagent/runner.d.ts +1 -2
- package/dist/extensions/subagent/runner.d.ts.map +1 -1
- package/dist/extensions/subagent/runner.js +109 -131
- 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.map +1 -1
- package/dist/extensions/subagent/sdk-runner.js +9 -20
- package/dist/extensions/subagent/sdk-runner.js.map +1 -1
- package/dist/extensions/subagent/settings.d.ts +2 -3
- package/dist/extensions/subagent/settings.d.ts.map +1 -1
- package/dist/extensions/subagent/settings.js +30 -21
- package/dist/extensions/subagent/settings.js.map +1 -1
- package/dist/extensions/subagent/text.d.ts +3 -0
- package/dist/extensions/subagent/text.d.ts.map +1 -0
- package/dist/extensions/subagent/text.js +16 -0
- package/dist/extensions/subagent/text.js.map +1 -0
- package/dist/extensions/subagent/types.d.ts +13 -33
- package/dist/extensions/subagent/types.d.ts.map +1 -1
- package/dist/extensions/subagent/types.js.map +1 -1
- package/dist/extensions/subagent/ui/model-list.d.ts +68 -0
- package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -0
- package/dist/extensions/subagent/ui/model-list.js +248 -0
- package/dist/extensions/subagent/ui/model-list.js.map +1 -0
- package/dist/extensions/todo/constants.d.ts +6 -17
- package/dist/extensions/todo/constants.d.ts.map +1 -1
- package/dist/extensions/todo/constants.js +20 -31
- package/dist/extensions/todo/constants.js.map +1 -1
- package/dist/extensions/todo/index.d.ts.map +1 -1
- package/dist/extensions/todo/index.js +36 -57
- package/dist/extensions/todo/index.js.map +1 -1
- package/dist/extensions/todo/schema.d.ts +20 -59
- package/dist/extensions/todo/schema.d.ts.map +1 -1
- package/dist/extensions/todo/schema.js +23 -69
- package/dist/extensions/todo/schema.js.map +1 -1
- package/dist/extensions/todo/state.d.ts +23 -65
- package/dist/extensions/todo/state.d.ts.map +1 -1
- package/dist/extensions/todo/state.js +238 -1262
- package/dist/extensions/todo/state.js.map +1 -1
- package/dist/extensions/todo/view.d.ts +19 -10
- package/dist/extensions/todo/view.d.ts.map +1 -1
- package/dist/extensions/todo/view.js +411 -463
- package/dist/extensions/todo/view.js.map +1 -1
- package/dist/extensions/todo/widget.d.ts +15 -0
- package/dist/extensions/todo/widget.d.ts.map +1 -0
- package/dist/extensions/todo/widget.js +50 -0
- package/dist/extensions/todo/widget.js.map +1 -0
- package/dist/index.d.ts +1 -1
- 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/extension-selector.d.ts +1 -2
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +5 -11
- package/dist/modes/interactive/components/extension-selector.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/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +1 -8
- package/dist/modes/rpc/rpc-mode.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 +2 -1
- package/docs/bundled/extensions/background.md +64 -0
- package/docs/bundled/extensions/subagent.md +84 -57
- package/docs/bundled/extensions/todo.md +84 -24
- package/docs/bundled/tool-presentation.md +1 -1
- 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 +6 -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/picker.d.ts +0 -31
- package/dist/extensions/subagent/picker.d.ts.map +0 -1
- package/dist/extensions/subagent/picker.js +0 -109
- package/dist/extensions/subagent/picker.js.map +0 -1
- package/dist/extensions/todo/overlay.d.ts +0 -24
- package/dist/extensions/todo/overlay.d.ts.map +0 -1
- package/dist/extensions/todo/overlay.js +0 -135
- package/dist/extensions/todo/overlay.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
|
@@ -11,7 +11,6 @@ export declare function tailText(text: string, maxBytes: number): string;
|
|
|
11
11
|
export declare function assistantText(message: AgentMessage | undefined): string;
|
|
12
12
|
export declare function finalAssistantText(messages: readonly AgentMessage[]): string;
|
|
13
13
|
export declare function appendActivity(activities: ToolActivity[], activity: ToolActivity): void;
|
|
14
|
-
export declare function setLiveText(text: string): string;
|
|
15
14
|
export declare function activitySummary(toolName: string, args: unknown): string;
|
|
16
15
|
export declare function resultSummary(result: unknown): string;
|
|
17
16
|
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,UAAU,IAAI,aAAa,CAW1C;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAW9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAY7E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAezD;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBhE;AAgBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAMvE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAM5E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAUvF;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/activity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,UAAU,IAAI,aAAa,CAW1C;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAW9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAY7E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,KAAK,CAezD;AAGD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYjE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBhE;AAgBD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS/D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,CAMvE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAM5E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAUvF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAWvE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAoBrD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT,
|
|
1
|
+
import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, TASK_OUTPUT_LIMIT } from "./constants.js";
|
|
2
2
|
export function emptyUsage() {
|
|
3
3
|
return {
|
|
4
4
|
turns: 0,
|
|
@@ -133,7 +133,7 @@ export function finalAssistantText(messages) {
|
|
|
133
133
|
for (let index = messages.length - 1; index >= 0; index--) {
|
|
134
134
|
const text = assistantText(messages[index]);
|
|
135
135
|
if (text)
|
|
136
|
-
return boundText(text,
|
|
136
|
+
return boundText(text, TASK_OUTPUT_LIMIT);
|
|
137
137
|
}
|
|
138
138
|
return "";
|
|
139
139
|
}
|
|
@@ -148,9 +148,6 @@ export function appendActivity(activities, activity) {
|
|
|
148
148
|
activities.shift();
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
export function setLiveText(text) {
|
|
152
|
-
return tailText(text, LIVE_TEXT_LIMIT);
|
|
153
|
-
}
|
|
154
151
|
export function activitySummary(toolName, args) {
|
|
155
152
|
if (!args || typeof args !== "object" || Array.isArray(args))
|
|
156
153
|
return toolName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/extensions/subagent/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, LIVE_TEXT_LIMIT, SINGLE_OUTPUT_LIMIT } from \"./constants.ts\";\nimport type { SubagentUsage, ToolActivity } from \"./types.ts\";\n\nexport function emptyUsage(): SubagentUsage {\n\treturn {\n\t\tturns: 0,\n\t\ttoolUses: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: 0,\n\t};\n}\n\nexport function addUsage(target: SubagentUsage, usage: Usage | undefined): void {\n\tif (!usage) return;\n\ttarget.input += usage.input ?? 0;\n\ttarget.output += usage.output ?? 0;\n\ttarget.cacheRead += usage.cacheRead ?? 0;\n\ttarget.cacheWrite += usage.cacheWrite ?? 0;\n\ttarget.totalTokens += usage.totalTokens ?? 0;\n\ttarget.cost += usage.cost?.total ?? 0;\n\t// Watermark, not a sum: the latest request's total is the context size,\n\t// and it can shrink again after the worker auto-compacts.\n\tif (usage.totalTokens) target.contextTokens = usage.totalTokens;\n}\n\nexport function mergeUsage(target: SubagentUsage, source: SubagentUsage): void {\n\ttarget.turns += source.turns;\n\ttarget.toolUses += source.toolUses;\n\ttarget.input += source.input;\n\ttarget.output += source.output;\n\ttarget.cacheRead += source.cacheRead;\n\ttarget.cacheWrite += source.cacheWrite;\n\ttarget.totalTokens += source.totalTokens;\n\ttarget.cost += source.cost;\n\tif (source.contextTokens) {\n\t\ttarget.contextTokens = Math.max(target.contextTokens ?? 0, source.contextTokens);\n\t}\n}\n\nexport function toNestedUsage(usage: SubagentUsage): Usage {\n\treturn {\n\t\tinput: usage.input,\n\t\toutput: usage.output,\n\t\tcacheRead: usage.cacheRead,\n\t\tcacheWrite: usage.cacheWrite,\n\t\ttotalTokens: usage.totalTokens,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: usage.cost,\n\t\t},\n\t};\n}\n\n// Iterates code points so a surrogate pair is never split in half.\nexport function utf8Prefix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = \"\";\n\tlet bytes = 0;\n\tfor (const character of text) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\toutput += character;\n\t\tbytes += characterBytes;\n\t}\n\treturn output;\n}\n\nexport function boundText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = utf8Prefix(text, maxBytes);\n\tfor (let attempt = 0; attempt < 8; attempt++) {\n\t\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\t\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\t\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\t\tif (available <= 0) return utf8Prefix(\"[Output truncated.]\", maxBytes);\n\t\tconst next = utf8Prefix(text, available);\n\t\tif (next === output) return `${output}${notice}`;\n\t\toutput = next;\n\t}\n\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\treturn `${utf8Prefix(output, Math.max(0, maxBytes - Buffer.byteLength(notice, \"utf8\")))}${notice}`;\n}\n\nfunction utf8Suffix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tconst characters: string[] = [];\n\tlet bytes = 0;\n\tfor (const character of Array.from(text).reverse()) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\tcharacters.push(character);\n\t\tbytes += characterBytes;\n\t}\n\treturn characters.reverse().join(\"\");\n}\n\nexport function tailText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tconst noticeText = \"[Earlier output omitted.]\";\n\tconst notice = `${noticeText}\\n`;\n\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\tif (available <= 0) return utf8Prefix(noticeText, maxBytes);\n\tconst output = utf8Suffix(text, available);\n\treturn output ? `${notice}${output}` : utf8Prefix(noticeText, maxBytes);\n}\n\nexport function assistantText(message: AgentMessage | undefined): string {\n\tif (!message || message.role !== \"assistant\") return \"\";\n\treturn message.content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nexport function finalAssistantText(messages: readonly AgentMessage[]): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst text = assistantText(messages[index]);\n\t\tif (text) return boundText(text, SINGLE_OUTPUT_LIMIT);\n\t}\n\treturn \"\";\n}\n\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nexport function setLiveText(text: string): string {\n\treturn tailText(text, LIVE_TEXT_LIMIT);\n}\n\nexport function activitySummary(toolName: string, args: unknown): string {\n\tif (!args || typeof args !== \"object\" || Array.isArray(args)) return toolName;\n\tconst input = args as Record<string, unknown>;\n\tconst path =\n\t\ttypeof input.path === \"string\" ? input.path : typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tif (toolName === \"bash\" && typeof input.command === \"string\")\n\t\treturn `Run ${boundText(input.command.replace(/\\s+/gu, \" \"), 160)}`;\n\tif (path) return `${toolName} ${boundText(path, 180)}`;\n\tif (toolName === \"grep\" && typeof input.pattern === \"string\") return `Search ${boundText(input.pattern, 120)}`;\n\tif (toolName === \"find\" && typeof input.pattern === \"string\") return `Find ${boundText(input.pattern, 120)}`;\n\treturn toolName;\n}\n\nexport function resultSummary(result: unknown): string {\n\tif (!result || typeof result !== \"object\") return \"\";\n\tconst content = (result as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn boundText(\n\t\tcontent\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => {\n\t\t\t\treturn Boolean(\n\t\t\t\t\tpart &&\n\t\t\t\t\t\ttypeof part === \"object\" &&\n\t\t\t\t\t\t(part as { type?: unknown }).type === \"text\" &&\n\t\t\t\t\t\ttypeof (part as { text?: unknown }).text === \"string\",\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\")\n\t\t\t.replace(/\\s+/gu, \" \")\n\t\t\t.trim(),\n\t\t240,\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"activity.js","sourceRoot":"","sources":["../../../src/extensions/subagent/activity.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, TASK_OUTPUT_LIMIT } from \"./constants.ts\";\nimport type { SubagentUsage, ToolActivity } from \"./types.ts\";\n\nexport function emptyUsage(): SubagentUsage {\n\treturn {\n\t\tturns: 0,\n\t\ttoolUses: 0,\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t\ttotalTokens: 0,\n\t\tcost: 0,\n\t};\n}\n\nexport function addUsage(target: SubagentUsage, usage: Usage | undefined): void {\n\tif (!usage) return;\n\ttarget.input += usage.input ?? 0;\n\ttarget.output += usage.output ?? 0;\n\ttarget.cacheRead += usage.cacheRead ?? 0;\n\ttarget.cacheWrite += usage.cacheWrite ?? 0;\n\ttarget.totalTokens += usage.totalTokens ?? 0;\n\ttarget.cost += usage.cost?.total ?? 0;\n\t// Watermark, not a sum: the latest request's total is the context size,\n\t// and it can shrink again after the worker auto-compacts.\n\tif (usage.totalTokens) target.contextTokens = usage.totalTokens;\n}\n\nexport function mergeUsage(target: SubagentUsage, source: SubagentUsage): void {\n\ttarget.turns += source.turns;\n\ttarget.toolUses += source.toolUses;\n\ttarget.input += source.input;\n\ttarget.output += source.output;\n\ttarget.cacheRead += source.cacheRead;\n\ttarget.cacheWrite += source.cacheWrite;\n\ttarget.totalTokens += source.totalTokens;\n\ttarget.cost += source.cost;\n\tif (source.contextTokens) {\n\t\ttarget.contextTokens = Math.max(target.contextTokens ?? 0, source.contextTokens);\n\t}\n}\n\nexport function toNestedUsage(usage: SubagentUsage): Usage {\n\treturn {\n\t\tinput: usage.input,\n\t\toutput: usage.output,\n\t\tcacheRead: usage.cacheRead,\n\t\tcacheWrite: usage.cacheWrite,\n\t\ttotalTokens: usage.totalTokens,\n\t\tcost: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotal: usage.cost,\n\t\t},\n\t};\n}\n\n// Iterates code points so a surrogate pair is never split in half.\nexport function utf8Prefix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = \"\";\n\tlet bytes = 0;\n\tfor (const character of text) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\toutput += character;\n\t\tbytes += characterBytes;\n\t}\n\treturn output;\n}\n\nexport function boundText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tlet output = utf8Prefix(text, maxBytes);\n\tfor (let attempt = 0; attempt < 8; attempt++) {\n\t\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\t\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\t\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\t\tif (available <= 0) return utf8Prefix(\"[Output truncated.]\", maxBytes);\n\t\tconst next = utf8Prefix(text, available);\n\t\tif (next === output) return `${output}${notice}`;\n\t\toutput = next;\n\t}\n\tconst omitted = Buffer.byteLength(text, \"utf8\") - Buffer.byteLength(output, \"utf8\");\n\tconst notice = `\\n\\n[Output truncated: ${omitted} bytes omitted.]`;\n\treturn `${utf8Prefix(output, Math.max(0, maxBytes - Buffer.byteLength(notice, \"utf8\")))}${notice}`;\n}\n\nfunction utf8Suffix(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tconst characters: string[] = [];\n\tlet bytes = 0;\n\tfor (const character of Array.from(text).reverse()) {\n\t\tconst characterBytes = Buffer.byteLength(character, \"utf8\");\n\t\tif (bytes + characterBytes > maxBytes) break;\n\t\tcharacters.push(character);\n\t\tbytes += characterBytes;\n\t}\n\treturn characters.reverse().join(\"\");\n}\n\nexport function tailText(text: string, maxBytes: number): string {\n\tif (maxBytes <= 0) return \"\";\n\tif (Buffer.byteLength(text, \"utf8\") <= maxBytes) return text;\n\tconst noticeText = \"[Earlier output omitted.]\";\n\tconst notice = `${noticeText}\\n`;\n\tconst available = maxBytes - Buffer.byteLength(notice, \"utf8\");\n\tif (available <= 0) return utf8Prefix(noticeText, maxBytes);\n\tconst output = utf8Suffix(text, available);\n\treturn output ? `${notice}${output}` : utf8Prefix(noticeText, maxBytes);\n}\n\nexport function assistantText(message: AgentMessage | undefined): string {\n\tif (!message || message.role !== \"assistant\") return \"\";\n\treturn message.content\n\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nexport function finalAssistantText(messages: readonly AgentMessage[]): string {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst text = assistantText(messages[index]);\n\t\tif (text) return boundText(text, TASK_OUTPUT_LIMIT);\n\t}\n\treturn \"\";\n}\n\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\twhile (activities.length > ACTIVITY_LIMIT) activities.shift();\n\twhile (\n\t\tactivities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >\n\t\tACTIVITY_TEXT_LIMIT\n\t) {\n\t\tif (activities.length <= 1) break;\n\t\tactivities.shift();\n\t}\n}\n\nexport function activitySummary(toolName: string, args: unknown): string {\n\tif (!args || typeof args !== \"object\" || Array.isArray(args)) return toolName;\n\tconst input = args as Record<string, unknown>;\n\tconst path =\n\t\ttypeof input.path === \"string\" ? input.path : typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tif (toolName === \"bash\" && typeof input.command === \"string\")\n\t\treturn `Run ${boundText(input.command.replace(/\\s+/gu, \" \"), 160)}`;\n\tif (path) return `${toolName} ${boundText(path, 180)}`;\n\tif (toolName === \"grep\" && typeof input.pattern === \"string\") return `Search ${boundText(input.pattern, 120)}`;\n\tif (toolName === \"find\" && typeof input.pattern === \"string\") return `Find ${boundText(input.pattern, 120)}`;\n\treturn toolName;\n}\n\nexport function resultSummary(result: unknown): string {\n\tif (!result || typeof result !== \"object\") return \"\";\n\tconst content = (result as { content?: unknown }).content;\n\tif (!Array.isArray(content)) return \"\";\n\treturn boundText(\n\t\tcontent\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => {\n\t\t\t\treturn Boolean(\n\t\t\t\t\tpart &&\n\t\t\t\t\t\ttypeof part === \"object\" &&\n\t\t\t\t\t\t(part as { type?: unknown }).type === \"text\" &&\n\t\t\t\t\t\ttypeof (part as { text?: unknown }).text === \"string\",\n\t\t\t\t);\n\t\t\t})\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\\n\")\n\t\t\t.replace(/\\s+/gu, \" \")\n\t\t\t.trim(),\n\t\t240,\n\t);\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
|
|
2
|
+
import type { ExtensionCommandContext } from "../../core/extensions/types.ts";
|
|
3
|
+
export declare function showAgentsCommand(ctx: ExtensionCommandContext, currentThinking: ThinkingLevel): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=agents-command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-command.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/agents-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAanE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAwd9E,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,uBAAuB,EAAE,eAAe,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnH"}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { clampThinkingLevel, getSupportedThinkingLevels } from "@earendil-works/pi-ai/compat";
|
|
2
|
+
import { Container, Spacer, Text, TruncatedText, } from "@earendil-works/pi-tui";
|
|
3
|
+
import { getAgentDir } from "../../config.js";
|
|
4
|
+
import { DynamicBorder } from "../../modes/interactive/components/dynamic-border.js";
|
|
5
|
+
import { keyLabel } from "../../modes/interactive/components/keybinding-hints.js";
|
|
6
|
+
import { AGENT_PROFILES } from "./agents.js";
|
|
7
|
+
import { THINKING_LEVELS } from "./constants.js";
|
|
8
|
+
import { loadSubagentConfig, updateProfileOverride } from "./settings.js";
|
|
9
|
+
import { ProfileModelListComponent } from "./ui/model-list.js";
|
|
10
|
+
const MODEL_REFRESH_TIMEOUT_MS = 15_000;
|
|
11
|
+
const MAX_REFRESH_ERROR_LENGTH = 240;
|
|
12
|
+
// Static display titles for the two built-in profiles; agents.ts owns the
|
|
13
|
+
// model-facing copy.
|
|
14
|
+
const PROFILE_LABELS = {
|
|
15
|
+
explorer: "Explorer",
|
|
16
|
+
general: "General",
|
|
17
|
+
};
|
|
18
|
+
function modelId(model) {
|
|
19
|
+
return model ? `${model.provider}/${model.id}` : "none";
|
|
20
|
+
}
|
|
21
|
+
function findModel(models, value) {
|
|
22
|
+
if (!value)
|
|
23
|
+
return undefined;
|
|
24
|
+
return models.find((model) => `${model.provider}/${model.id}` === value);
|
|
25
|
+
}
|
|
26
|
+
function boundText(value, limit) {
|
|
27
|
+
const characters = [...value];
|
|
28
|
+
return characters.length <= limit ? value : `${characters.slice(0, Math.max(0, limit - 1)).join("")}…`;
|
|
29
|
+
}
|
|
30
|
+
// Capability checks use the saved model when it is still in the catalog,
|
|
31
|
+
// falling back to the parent session model otherwise.
|
|
32
|
+
function effectiveModel(currentSessionModel, models, override) {
|
|
33
|
+
if (override?.model) {
|
|
34
|
+
const saved = findModel(models, override.model);
|
|
35
|
+
if (saved)
|
|
36
|
+
return saved;
|
|
37
|
+
}
|
|
38
|
+
return currentSessionModel;
|
|
39
|
+
}
|
|
40
|
+
function inheritedThinking(effective, currentThinking) {
|
|
41
|
+
return effective ? clampThinkingLevel(effective, currentThinking) : currentThinking;
|
|
42
|
+
}
|
|
43
|
+
function refreshFailureMessage(providerIds) {
|
|
44
|
+
if (providerIds.length === 1)
|
|
45
|
+
return `Could not refresh ${providerIds[0]}; showing cached models.`;
|
|
46
|
+
const visible = providerIds.slice(0, 3);
|
|
47
|
+
const omitted = providerIds.length - visible.length;
|
|
48
|
+
const suffix = omitted > 0 ? `, +${omitted} more` : "";
|
|
49
|
+
return `Could not refresh ${providerIds.length} model catalogs (${visible.join(", ")}${suffix}); showing cached models.`;
|
|
50
|
+
}
|
|
51
|
+
function hint(theme, keybindings, binding, description) {
|
|
52
|
+
const key = keyLabel(binding, { keybindings });
|
|
53
|
+
return key ? `${theme.fg("dim", key)}${theme.fg("muted", ` ${description}`)}` : "";
|
|
54
|
+
}
|
|
55
|
+
function navigationHint(theme, keybindings) {
|
|
56
|
+
const keys = [keyLabel("tui.select.up", { keybindings }), keyLabel("tui.select.down", { keybindings })]
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.join("/");
|
|
59
|
+
return keys ? `${theme.fg("dim", keys)}${theme.fg("muted", " navigate")}` : "";
|
|
60
|
+
}
|
|
61
|
+
/** Compact Model/Thinking settings menu for one profile; every confirm persists immediately. */
|
|
62
|
+
class ProfileSettingsMenuComponent extends Container {
|
|
63
|
+
get focused() {
|
|
64
|
+
return this._focused;
|
|
65
|
+
}
|
|
66
|
+
set focused(value) {
|
|
67
|
+
this._focused = value;
|
|
68
|
+
}
|
|
69
|
+
constructor(options) {
|
|
70
|
+
super();
|
|
71
|
+
this.selectedIndex = 0;
|
|
72
|
+
this._focused = false;
|
|
73
|
+
this.theme = options.theme;
|
|
74
|
+
this.keybindings = options.keybindings;
|
|
75
|
+
this.onDone = options.onDone;
|
|
76
|
+
const effective = effectiveModel(options.currentSessionModel, options.models, options.override);
|
|
77
|
+
this.rows = [
|
|
78
|
+
{
|
|
79
|
+
action: "model",
|
|
80
|
+
label: "Model",
|
|
81
|
+
value: options.override?.model
|
|
82
|
+
? `override — ${options.override.model}${findModel(options.models, options.override.model) ? "" : " [unavailable]"}`
|
|
83
|
+
: `inherit — ${modelId(options.currentSessionModel)}`,
|
|
84
|
+
override: options.override?.model !== undefined,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
action: "thinking",
|
|
88
|
+
label: "Thinking",
|
|
89
|
+
value: options.override?.thinking
|
|
90
|
+
? `override — ${options.override.thinking}`
|
|
91
|
+
: `inherit — ${inheritedThinking(effective, options.currentThinking)}`,
|
|
92
|
+
override: options.override?.thinking !== undefined,
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
this.addChild(new DynamicBorder());
|
|
96
|
+
this.addChild(new Spacer(1));
|
|
97
|
+
this.addChild(new Text(this.theme.fg("accent", this.theme.bold(PROFILE_LABELS[options.profile.name])), 1, 0));
|
|
98
|
+
this.addChild(new Spacer(1));
|
|
99
|
+
this.listContainer = new Container();
|
|
100
|
+
this.addChild(this.listContainer);
|
|
101
|
+
this.addChild(new Spacer(1));
|
|
102
|
+
const hints = [
|
|
103
|
+
navigationHint(this.theme, options.keybindings),
|
|
104
|
+
hint(this.theme, options.keybindings, "tui.select.confirm", "select"),
|
|
105
|
+
hint(this.theme, options.keybindings, "tui.select.cancel", "back"),
|
|
106
|
+
].filter(Boolean);
|
|
107
|
+
this.addChild(new Text(hints.join(this.theme.fg("muted", " • ")), 1, 0));
|
|
108
|
+
this.addChild(new Spacer(1));
|
|
109
|
+
this.addChild(new DynamicBorder());
|
|
110
|
+
this.updateList();
|
|
111
|
+
}
|
|
112
|
+
updateList() {
|
|
113
|
+
this.listContainer.clear();
|
|
114
|
+
for (const [index, row] of this.rows.entries()) {
|
|
115
|
+
const selected = index === this.selectedIndex;
|
|
116
|
+
const prefix = selected ? this.theme.fg("accent", "→ ") : " ";
|
|
117
|
+
const label = selected ? this.theme.fg("accent", row.label) : this.theme.fg("text", row.label);
|
|
118
|
+
const value = this.theme.fg("muted", `— ${row.value}`);
|
|
119
|
+
const checkmark = row.override ? this.theme.fg("success", " ✓") : "";
|
|
120
|
+
this.listContainer.addChild(new TruncatedText(`${prefix}${label} ${value}${checkmark}`, 1, 0));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
moveSelection(offset) {
|
|
124
|
+
this.selectedIndex = (this.selectedIndex + offset + this.rows.length) % this.rows.length;
|
|
125
|
+
this.updateList();
|
|
126
|
+
}
|
|
127
|
+
handleInput(data) {
|
|
128
|
+
if (this.keybindings.matches(data, "tui.select.up")) {
|
|
129
|
+
this.moveSelection(-1);
|
|
130
|
+
}
|
|
131
|
+
else if (this.keybindings.matches(data, "tui.select.down")) {
|
|
132
|
+
this.moveSelection(1);
|
|
133
|
+
}
|
|
134
|
+
else if (this.keybindings.matches(data, "tui.select.confirm")) {
|
|
135
|
+
this.onDone(this.rows[this.selectedIndex]?.action);
|
|
136
|
+
}
|
|
137
|
+
else if (this.keybindings.matches(data, "tui.select.cancel")) {
|
|
138
|
+
this.onDone(undefined);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Standalone searchable model picker for one profile; confirm saves immediately. */
|
|
143
|
+
class ModelPickerComponent extends Container {
|
|
144
|
+
get focused() {
|
|
145
|
+
return this._focused;
|
|
146
|
+
}
|
|
147
|
+
set focused(value) {
|
|
148
|
+
this._focused = value;
|
|
149
|
+
this.modelList.focused = value;
|
|
150
|
+
}
|
|
151
|
+
constructor(options) {
|
|
152
|
+
super();
|
|
153
|
+
this.refreshAbortController = new AbortController();
|
|
154
|
+
this.closed = false;
|
|
155
|
+
this._focused = false;
|
|
156
|
+
this.tui = options.tui;
|
|
157
|
+
this.theme = options.theme;
|
|
158
|
+
this.keybindings = options.keybindings;
|
|
159
|
+
this.addChild(new DynamicBorder());
|
|
160
|
+
this.addChild(new Spacer(1));
|
|
161
|
+
this.addChild(new Text(this.theme.fg("accent", this.theme.bold(`Model — ${PROFILE_LABELS[options.profile.name]}`)), 1, 0));
|
|
162
|
+
this.addChild(new Spacer(1));
|
|
163
|
+
this.modelList = new ProfileModelListComponent({
|
|
164
|
+
theme: options.theme,
|
|
165
|
+
keybindings: options.keybindings,
|
|
166
|
+
models: options.models,
|
|
167
|
+
scopedModels: options.scopedModels,
|
|
168
|
+
currentSessionModel: options.currentSessionModel,
|
|
169
|
+
savedModelId: options.savedModelId,
|
|
170
|
+
onDone: options.onDone,
|
|
171
|
+
});
|
|
172
|
+
this.addChild(this.modelList);
|
|
173
|
+
this.addChild(new Spacer(1));
|
|
174
|
+
const hints = [
|
|
175
|
+
navigationHint(this.theme, options.keybindings),
|
|
176
|
+
options.scopedModels.length > 0 ? hint(this.theme, options.keybindings, "tui.input.tab", "scope") : "",
|
|
177
|
+
hint(this.theme, options.keybindings, "tui.select.confirm", "select"),
|
|
178
|
+
hint(this.theme, options.keybindings, "tui.select.cancel", "back"),
|
|
179
|
+
].filter(Boolean);
|
|
180
|
+
this.addChild(new Text(hints.join(this.theme.fg("muted", " • ")), 1, 0));
|
|
181
|
+
this.addChild(new Spacer(1));
|
|
182
|
+
this.addChild(new DynamicBorder());
|
|
183
|
+
}
|
|
184
|
+
get refreshSignal() {
|
|
185
|
+
return this.refreshAbortController.signal;
|
|
186
|
+
}
|
|
187
|
+
cancelRefresh() {
|
|
188
|
+
this.refreshAbortController.abort();
|
|
189
|
+
}
|
|
190
|
+
get isClosed() {
|
|
191
|
+
return this.closed;
|
|
192
|
+
}
|
|
193
|
+
dispose() {
|
|
194
|
+
this.closed = true;
|
|
195
|
+
this.refreshAbortController.abort();
|
|
196
|
+
}
|
|
197
|
+
updateModels(models) {
|
|
198
|
+
if (this.closed)
|
|
199
|
+
return;
|
|
200
|
+
this.modelList.updateModels(models);
|
|
201
|
+
this.tui.requestRender();
|
|
202
|
+
}
|
|
203
|
+
setRefreshStatus(message, tone = "muted") {
|
|
204
|
+
if (this.closed)
|
|
205
|
+
return;
|
|
206
|
+
this.modelList.setStatus(message, tone);
|
|
207
|
+
this.tui.requestRender();
|
|
208
|
+
}
|
|
209
|
+
handleInput(data) {
|
|
210
|
+
this.modelList.handleInput(data);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/** Persist a single override atomically; the UI only reflects the value on success. */
|
|
214
|
+
async function persistOverride(ctx, profile, patch, current) {
|
|
215
|
+
const next = "model" in patch ? patch.model : patch.thinking;
|
|
216
|
+
if (next === current)
|
|
217
|
+
return;
|
|
218
|
+
try {
|
|
219
|
+
await updateProfileOverride(profile.name, patch, getAgentDir());
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
ctx.ui.notify(`Could not save ${PROFILE_LABELS[profile.name]} settings: ${error instanceof Error ? error.message : String(error)}`, "error");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async function refreshPickerModels(ctx, picker) {
|
|
226
|
+
let timedOut = false;
|
|
227
|
+
const timeout = setTimeout(() => {
|
|
228
|
+
timedOut = true;
|
|
229
|
+
picker.cancelRefresh();
|
|
230
|
+
}, MODEL_REFRESH_TIMEOUT_MS);
|
|
231
|
+
timeout.unref?.();
|
|
232
|
+
try {
|
|
233
|
+
const result = await ctx.modelRegistry.refresh({ signal: picker.refreshSignal });
|
|
234
|
+
if (picker.isClosed || (picker.refreshSignal.aborted && !timedOut))
|
|
235
|
+
return;
|
|
236
|
+
picker.updateModels(ctx.modelRegistry.getAvailable());
|
|
237
|
+
if (result.aborted && timedOut) {
|
|
238
|
+
picker.setRefreshStatus("Model refresh timed out; showing cached models.", "error");
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const providerIds = [...result.errors.keys()];
|
|
242
|
+
if (providerIds.length > 0) {
|
|
243
|
+
picker.setRefreshStatus(refreshFailureMessage(providerIds), "error");
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const registryError = ctx.modelRegistry.getError();
|
|
247
|
+
if (registryError) {
|
|
248
|
+
picker.setRefreshStatus(boundText(registryError, MAX_REFRESH_ERROR_LENGTH), "error");
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
picker.setRefreshStatus(undefined);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
if (picker.isClosed || (picker.refreshSignal.aborted && !timedOut))
|
|
255
|
+
return;
|
|
256
|
+
const message = timedOut
|
|
257
|
+
? "Model refresh timed out; showing cached models."
|
|
258
|
+
: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`;
|
|
259
|
+
picker.setRefreshStatus(boundText(message, MAX_REFRESH_ERROR_LENGTH), "error");
|
|
260
|
+
}
|
|
261
|
+
finally {
|
|
262
|
+
clearTimeout(timeout);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
async function selectProfile(ctx) {
|
|
266
|
+
const labels = AGENT_PROFILES.map((profile) => PROFILE_LABELS[profile.name]);
|
|
267
|
+
const label = await ctx.ui.select("Agents", labels);
|
|
268
|
+
return label === undefined ? undefined : AGENT_PROFILES.find((profile) => PROFILE_LABELS[profile.name] === label);
|
|
269
|
+
}
|
|
270
|
+
async function showTuiSettingsMenu(ctx, profile, override, currentThinking) {
|
|
271
|
+
return ctx.ui.custom((_tui, theme, keybindings, done) => new ProfileSettingsMenuComponent({
|
|
272
|
+
theme,
|
|
273
|
+
keybindings,
|
|
274
|
+
profile,
|
|
275
|
+
override,
|
|
276
|
+
models: ctx.modelRegistry.getAvailable(),
|
|
277
|
+
currentSessionModel: ctx.model,
|
|
278
|
+
currentThinking,
|
|
279
|
+
onDone: done,
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
async function showDialogSettingsMenu(ctx, profile, override, currentThinking) {
|
|
283
|
+
const models = ctx.modelRegistry.getAvailable();
|
|
284
|
+
const effective = effectiveModel(ctx.model, models, override);
|
|
285
|
+
const modelValue = override?.model
|
|
286
|
+
? `override — ${override.model}${findModel(models, override.model) ? "" : " [unavailable]"}`
|
|
287
|
+
: `inherit — ${modelId(ctx.model)}`;
|
|
288
|
+
const thinkingValue = override?.thinking
|
|
289
|
+
? `override — ${override.thinking}`
|
|
290
|
+
: `inherit — ${inheritedThinking(effective, currentThinking)}`;
|
|
291
|
+
const options = new Map();
|
|
292
|
+
options.set(`Model — ${modelValue}`, "model");
|
|
293
|
+
options.set(`Thinking — ${thinkingValue}`, "thinking");
|
|
294
|
+
const label = await ctx.ui.select(PROFILE_LABELS[profile.name], [...options.keys()]);
|
|
295
|
+
return label === undefined ? undefined : options.get(label);
|
|
296
|
+
}
|
|
297
|
+
async function showTuiModelPicker(ctx, profile, override) {
|
|
298
|
+
const chosen = await ctx.ui.custom((tui, theme, keybindings, done) => {
|
|
299
|
+
const picker = new ModelPickerComponent({
|
|
300
|
+
tui,
|
|
301
|
+
theme,
|
|
302
|
+
keybindings,
|
|
303
|
+
profile,
|
|
304
|
+
savedModelId: override?.model,
|
|
305
|
+
models: ctx.modelRegistry.getAvailable(),
|
|
306
|
+
scopedModels: ctx.scopedModels,
|
|
307
|
+
currentSessionModel: ctx.model,
|
|
308
|
+
onDone: done,
|
|
309
|
+
});
|
|
310
|
+
picker.setRefreshStatus("Refreshing model catalogs…");
|
|
311
|
+
void refreshPickerModels(ctx, picker);
|
|
312
|
+
return picker;
|
|
313
|
+
});
|
|
314
|
+
return chosen === undefined ? undefined : { modelId: chosen.modelId };
|
|
315
|
+
}
|
|
316
|
+
async function showDialogModelPicker(ctx, profile, override) {
|
|
317
|
+
const models = ctx.modelRegistry.getAvailable().sort((left, right) => {
|
|
318
|
+
const provider = left.provider.localeCompare(right.provider);
|
|
319
|
+
return provider !== 0 ? provider : left.id.localeCompare(right.id);
|
|
320
|
+
});
|
|
321
|
+
const choices = new Map();
|
|
322
|
+
choices.set(`inherit (${modelId(ctx.model)})${override?.model ? "" : " ✓"}`, undefined);
|
|
323
|
+
if (override?.model && !findModel(models, override.model)) {
|
|
324
|
+
choices.set(`${override.model} [unavailable] ✓`, override.model);
|
|
325
|
+
}
|
|
326
|
+
for (const model of models) {
|
|
327
|
+
const id = modelId(model);
|
|
328
|
+
choices.set(`${id}${override?.model === id ? " ✓" : ""}`, id);
|
|
329
|
+
}
|
|
330
|
+
const label = await ctx.ui.select(`Model — ${PROFILE_LABELS[profile.name]}`, [...choices.keys()]);
|
|
331
|
+
return label === undefined ? undefined : { modelId: choices.get(label) };
|
|
332
|
+
}
|
|
333
|
+
async function showThinkingPicker(ctx, profile, override, currentThinking) {
|
|
334
|
+
const models = ctx.modelRegistry.getAvailable();
|
|
335
|
+
const effective = effectiveModel(ctx.model, models, override);
|
|
336
|
+
const levels = effective ? getSupportedThinkingLevels(effective) : [...THINKING_LEVELS];
|
|
337
|
+
const inherited = inheritedThinking(effective, currentThinking);
|
|
338
|
+
const choices = new Map();
|
|
339
|
+
choices.set(`inherit (${inherited})${override?.thinking ? "" : " ✓"}`, undefined);
|
|
340
|
+
for (const level of levels) {
|
|
341
|
+
choices.set(`${level}${override?.thinking === level ? " ✓" : ""}`, level);
|
|
342
|
+
}
|
|
343
|
+
const label = await ctx.ui.select(`Thinking — ${PROFILE_LABELS[profile.name]}`, [...choices.keys()]);
|
|
344
|
+
return label === undefined ? undefined : { level: choices.get(label) };
|
|
345
|
+
}
|
|
346
|
+
async function runProfileSettings(ctx, profile, currentThinking) {
|
|
347
|
+
const agentDir = getAgentDir();
|
|
348
|
+
const isTui = ctx.mode === "tui";
|
|
349
|
+
while (true) {
|
|
350
|
+
const config = await loadSubagentConfig(agentDir);
|
|
351
|
+
const override = config.profiles[profile.name];
|
|
352
|
+
const action = isTui
|
|
353
|
+
? await showTuiSettingsMenu(ctx, profile, override, currentThinking)
|
|
354
|
+
: await showDialogSettingsMenu(ctx, profile, override, currentThinking);
|
|
355
|
+
if (!action)
|
|
356
|
+
return;
|
|
357
|
+
if (action === "model") {
|
|
358
|
+
const chosen = isTui
|
|
359
|
+
? await showTuiModelPicker(ctx, profile, override)
|
|
360
|
+
: await showDialogModelPicker(ctx, profile, override);
|
|
361
|
+
if (!chosen)
|
|
362
|
+
continue;
|
|
363
|
+
await persistOverride(ctx, profile, { model: chosen.modelId }, override?.model);
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
const chosen = await showThinkingPicker(ctx, profile, override, currentThinking);
|
|
367
|
+
if (!chosen)
|
|
368
|
+
continue;
|
|
369
|
+
await persistOverride(ctx, profile, { thinking: chosen.level }, override?.thinking);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export async function showAgentsCommand(ctx, currentThinking) {
|
|
374
|
+
if (!ctx.hasUI) {
|
|
375
|
+
ctx.ui.notify("/agents requires an interactive UI.", "warning");
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
while (true) {
|
|
379
|
+
const profile = await selectProfile(ctx);
|
|
380
|
+
if (!profile)
|
|
381
|
+
return;
|
|
382
|
+
await runProfileSettings(ctx, profile, currentThinking);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
//# sourceMappingURL=agents-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-command.js","sourceRoot":"","sources":["../../../src/extensions/subagent/agents-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC9F,OAAO,EACN,SAAS,EAGT,MAAM,EACN,IAAI,EACJ,aAAa,GAEb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,sDAAsD,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,wDAAwD,CAAC;AAElF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAA0B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE1E,OAAO,EAA2B,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAExF,MAAM,wBAAwB,GAAG,MAAM,CAAC;AACxC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,0EAA0E;AAC1E,qBAAqB;AACrB,MAAM,cAAc,GAAsC;IACzD,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;CAClB,CAAC;AAIF,SAAS,OAAO,CAAC,KAAsD;IACtE,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,MAA6B,EAAE,KAAyB;IAC1E,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC9C,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAC9B,OAAO,UAAU,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC;AACxG,CAAC;AAED,yEAAyE;AACzE,sDAAsD;AACtD,SAAS,cAAc,CACtB,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,SAAS,iBAAiB,CAAC,SAAiC,EAAE,eAA8B;IAC3F,OAAO,SAAS,CAAC,CAAC,CAAE,kBAAkB,CAAC,SAAS,EAAE,eAAe,CAAmB,CAAC,CAAC,CAAC,eAAe,CAAC;AACxG,CAAC;AAED,SAAS,qBAAqB,CAAC,WAA8B;IAC5D,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,qBAAqB,WAAW,CAAC,CAAC,CAAC,0BAA0B,CAAC;IACnG,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,qBAAqB,WAAW,CAAC,MAAM,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,2BAA2B,CAAC;AAC1H,CAAC;AAED,SAAS,IAAI,CACZ,KAAY,EACZ,WAA+B,EAC/B,OAAqD,EACrD,WAAmB;IAEnB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,cAAc,CAAC,KAAY,EAAE,WAA+B;IACpE,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;SACrG,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,gGAAgG;AAChG,MAAM,4BAA6B,SAAQ,SAAS;IASnD,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,YAAY,OASX;QACA,KAAK,EAAE,CAAC;QArBD,kBAAa,GAAG,CAAC,CAAC;QAClB,aAAQ,GAAG,KAAK,CAAC;QAqBxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChG,IAAI,CAAC,IAAI,GAAG;YACX;gBACC,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK;oBAC7B,CAAC,CAAC,cAAc,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE;oBACpH,CAAC,CAAC,aAAa,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE;gBACtD,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,KAAK,SAAS;aAC/C;YACD;gBACC,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ;oBAChC,CAAC,CAAC,cAAc,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE;oBAC3C,CAAC,CAAC,aAAa,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE;gBACvE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,KAAK,SAAS;aAClD;SACD,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9G,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG;YACb,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,oBAAoB,EAAE,QAAQ,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,CAAC;SAClE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAEO,UAAU;QACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC;YAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,GAAG,MAAM,GAAG,KAAK,IAAI,KAAK,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChG,CAAC;IACF,CAAC;IAEO,aAAa,CAAC,MAAc;QACnC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACzF,IAAI,CAAC,UAAU,EAAE,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;CACD;AAED,qFAAqF;AACrF,MAAM,oBAAqB,SAAQ,SAAS;IAS3C,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,KAAc;QACzB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,YAAY,OAUX;QACA,KAAK,EAAE,CAAC;QAxBQ,2BAAsB,GAAG,IAAI,eAAe,EAAE,CAAC;QACxD,WAAM,GAAG,KAAK,CAAC;QACf,aAAQ,GAAG,KAAK,CAAC;QAuBxB,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAC3G,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAyB,CAAC;YAC9C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG;YACb,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;YAC/C,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YACtG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,oBAAoB,EAAE,QAAQ,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,mBAAmB,EAAE,MAAM,CAAC;SAClE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,aAAa;QAChB,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;IAC3C,CAAC;IAED,aAAa;QACZ,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,OAAO;QACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,YAAY,CAAC,MAA6B;QACzC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED,gBAAgB,CAAC,OAA2B,EAAE,OAAsC,OAAO;QAC1F,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;CACD;AAED,uFAAuF;AACvF,KAAK,UAAU,eAAe,CAC7B,GAA4B,EAC5B,OAAqB,EACrB,KAAuC,EACvC,OAA2C;IAE3C,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7D,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO;IAC7B,IAAI,CAAC;QACJ,MAAM,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CACZ,kBAAkB,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACpH,OAAO,CACP,CAAC;IACH,CAAC;AACF,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,GAA4B,EAAE,MAA4B;IAC5F,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;QAC/B,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,CAAC,aAAa,EAAE,CAAC;IACxB,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAClB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACjF,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC3E,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,CAAC,gBAAgB,CAAC,iDAAiD,EAAE,OAAO,CAAC,CAAC;YACpF,OAAO;QACR,CAAC;QACD,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;YACrE,OAAO;QACR,CAAC;QACD,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACnD,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,aAAa,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CAAC;YACrF,OAAO;QACR,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAO;QAC3E,MAAM,OAAO,GAAG,QAAQ;YACvB,CAAC,CAAC,iDAAiD;YACnD,CAAC,CAAC,qCAAqC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACjG,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAA4B;IACxD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC;AACnH,CAAC;AAED,KAAK,UAAU,mBAAmB,CACjC,GAA4B,EAC5B,OAAqB,EACrB,QAA6C,EAC7C,eAA8B;IAE9B,OAAO,GAAG,CAAC,EAAE,CAAC,MAAM,CACnB,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAClC,IAAI,4BAA4B,CAAC;QAChC,KAAK;QACL,WAAW;QACX,OAAO;QACP,QAAQ;QACR,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE;QACxC,mBAAmB,EAAE,GAAG,CAAC,KAAK;QAC9B,eAAe;QACf,MAAM,EAAE,IAAI;KACZ,CAAC,CACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACpC,GAA4B,EAC5B,OAAqB,EACrB,QAA6C,EAC7C,eAA8B;IAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,QAAQ,EAAE,KAAK;QACjC,CAAC,CAAC,cAAc,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,EAAE;QAC5F,CAAC,CAAC,aAAa,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IACrC,MAAM,aAAa,GAAG,QAAQ,EAAE,QAAQ;QACvC,CAAC,CAAC,cAAc,QAAQ,CAAC,QAAQ,EAAE;QACnC,CAAC,CAAC,aAAa,iBAAiB,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,WAAW,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,EAAE,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,GAA4B,EAC5B,OAAqB,EACrB,QAA6C;IAE7C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAiC,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;QACpG,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC;YACvC,GAAG;YACH,KAAK;YACL,WAAW;YACX,OAAO;YACP,YAAY,EAAE,QAAQ,EAAE,KAAK;YAC7B,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE;YACxC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,mBAAmB,EAAE,GAAG,CAAC,KAAK;YAC9B,MAAM,EAAE,IAAI;SACZ,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CAAC;QACtD,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC;IACf,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,qBAAqB,CACnC,GAA4B,EAC5B,OAAqB,EACrB,QAA6C;IAE7C,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC7D,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,GAAG,EAA8B,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACxF,IAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,kBAAkB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClG,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,GAA4B,EAC5B,OAAqB,EACrB,QAA6C,EAC7C,eAA8B;IAE9B,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,0BAA0B,CAAC,SAAS,CAAqB,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,IAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAClF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrG,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,kBAAkB,CAChC,GAA4B,EAC5B,OAAqB,EACrB,eAA8B;IAE9B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC;IACjC,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,KAAK;YACnB,CAAC,CAAC,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC;YACpE,CAAC,CAAC,MAAM,sBAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK;gBACnB,CAAC,CAAC,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC;gBAClD,CAAC,CAAC,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;YACjF,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrF,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAA4B,EAAE,eAA8B;IACnG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,qCAAqC,EAAE,SAAS,CAAC,CAAC;QAChE,OAAO;IACR,CAAC;IACD,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;AACF,CAAC","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { clampThinkingLevel, getSupportedThinkingLevels } from \"@earendil-works/pi-ai/compat\";\nimport {\n\tContainer,\n\ttype Focusable,\n\ttype KeybindingsManager,\n\tSpacer,\n\tText,\n\tTruncatedText,\n\ttype TUI,\n} from \"@earendil-works/pi-tui\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { ExtensionCommandContext } from \"../../core/extensions/types.ts\";\nimport { DynamicBorder } from \"../../modes/interactive/components/dynamic-border.ts\";\nimport { keyLabel } from \"../../modes/interactive/components/keybinding-hints.ts\";\nimport type { Theme } from \"../../modes/interactive/theme/theme.ts\";\nimport { AGENT_PROFILES } from \"./agents.ts\";\nimport { type SubagentAgentName, THINKING_LEVELS } from \"./constants.ts\";\nimport { loadSubagentConfig, updateProfileOverride } from \"./settings.ts\";\nimport type { AgentProfile, SubagentProfileOverride } from \"./types.ts\";\nimport { type ProfileModelChoice, ProfileModelListComponent } from \"./ui/model-list.ts\";\n\nconst MODEL_REFRESH_TIMEOUT_MS = 15_000;\nconst MAX_REFRESH_ERROR_LENGTH = 240;\n\n// Static display titles for the two built-in profiles; agents.ts owns the\n// model-facing copy.\nconst PROFILE_LABELS: Record<SubagentAgentName, string> = {\n\texplorer: \"Explorer\",\n\tgeneral: \"General\",\n};\n\ntype SettingsAction = \"model\" | \"thinking\";\n\nfunction modelId(model: Pick<Model<Api>, \"provider\" | \"id\"> | undefined): string {\n\treturn model ? `${model.provider}/${model.id}` : \"none\";\n}\n\nfunction findModel(models: readonly Model<Api>[], value: string | undefined): Model<Api> | undefined {\n\tif (!value) return undefined;\n\treturn models.find((model) => `${model.provider}/${model.id}` === value);\n}\n\nfunction boundText(value: string, limit: number): string {\n\tconst characters = [...value];\n\treturn characters.length <= limit ? value : `${characters.slice(0, Math.max(0, limit - 1)).join(\"\")}…`;\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.\nfunction 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\nfunction inheritedThinking(effective: Model<Api> | undefined, currentThinking: ThinkingLevel): ThinkingLevel {\n\treturn effective ? (clampThinkingLevel(effective, currentThinking) as ThinkingLevel) : currentThinking;\n}\n\nfunction refreshFailureMessage(providerIds: readonly string[]): string {\n\tif (providerIds.length === 1) return `Could not refresh ${providerIds[0]}; showing cached models.`;\n\tconst visible = providerIds.slice(0, 3);\n\tconst omitted = providerIds.length - visible.length;\n\tconst suffix = omitted > 0 ? `, +${omitted} more` : \"\";\n\treturn `Could not refresh ${providerIds.length} model catalogs (${visible.join(\", \")}${suffix}); showing cached models.`;\n}\n\nfunction hint(\n\ttheme: Theme,\n\tkeybindings: KeybindingsManager,\n\tbinding: Parameters<KeybindingsManager[\"getKeys\"]>[0],\n\tdescription: string,\n): string {\n\tconst key = keyLabel(binding, { keybindings });\n\treturn key ? `${theme.fg(\"dim\", key)}${theme.fg(\"muted\", ` ${description}`)}` : \"\";\n}\n\nfunction navigationHint(theme: Theme, keybindings: KeybindingsManager): string {\n\tconst keys = [keyLabel(\"tui.select.up\", { keybindings }), keyLabel(\"tui.select.down\", { keybindings })]\n\t\t.filter(Boolean)\n\t\t.join(\"/\");\n\treturn keys ? `${theme.fg(\"dim\", keys)}${theme.fg(\"muted\", \" navigate\")}` : \"\";\n}\n\n/** Compact Model/Thinking settings menu for one profile; every confirm persists immediately. */\nclass ProfileSettingsMenuComponent extends Container implements Focusable {\n\tprivate readonly theme: Theme;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly rows: Array<{ action: SettingsAction; label: string; value: string; override: boolean }>;\n\tprivate readonly onDone: (action: SettingsAction | undefined) => void;\n\tprivate readonly listContainer: Container;\n\tprivate selectedIndex = 0;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t}\n\n\tconstructor(options: {\n\t\ttheme: Theme;\n\t\tkeybindings: KeybindingsManager;\n\t\tprofile: AgentProfile;\n\t\toverride: SubagentProfileOverride | undefined;\n\t\tmodels: readonly Model<Api>[];\n\t\tcurrentSessionModel: Model<Api> | undefined;\n\t\tcurrentThinking: ThinkingLevel;\n\t\tonDone: (action: SettingsAction | undefined) => void;\n\t}) {\n\t\tsuper();\n\t\tthis.theme = options.theme;\n\t\tthis.keybindings = options.keybindings;\n\t\tthis.onDone = options.onDone;\n\t\tconst effective = effectiveModel(options.currentSessionModel, options.models, options.override);\n\t\tthis.rows = [\n\t\t\t{\n\t\t\t\taction: \"model\",\n\t\t\t\tlabel: \"Model\",\n\t\t\t\tvalue: options.override?.model\n\t\t\t\t\t? `override — ${options.override.model}${findModel(options.models, options.override.model) ? \"\" : \" [unavailable]\"}`\n\t\t\t\t\t: `inherit — ${modelId(options.currentSessionModel)}`,\n\t\t\t\toverride: options.override?.model !== undefined,\n\t\t\t},\n\t\t\t{\n\t\t\t\taction: \"thinking\",\n\t\t\t\tlabel: \"Thinking\",\n\t\t\t\tvalue: options.override?.thinking\n\t\t\t\t\t? `override — ${options.override.thinking}`\n\t\t\t\t\t: `inherit — ${inheritedThinking(effective, options.currentThinking)}`,\n\t\t\t\toverride: options.override?.thinking !== undefined,\n\t\t\t},\n\t\t];\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new Text(this.theme.fg(\"accent\", this.theme.bold(PROFILE_LABELS[options.profile.name])), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tconst hints = [\n\t\t\tnavigationHint(this.theme, options.keybindings),\n\t\t\thint(this.theme, options.keybindings, \"tui.select.confirm\", \"select\"),\n\t\t\thint(this.theme, options.keybindings, \"tui.select.cancel\", \"back\"),\n\t\t].filter(Boolean);\n\t\tthis.addChild(new Text(hints.join(this.theme.fg(\"muted\", \" • \")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.updateList();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (const [index, row] of this.rows.entries()) {\n\t\t\tconst selected = index === this.selectedIndex;\n\t\t\tconst prefix = selected ? this.theme.fg(\"accent\", \"→ \") : \" \";\n\t\t\tconst label = selected ? this.theme.fg(\"accent\", row.label) : this.theme.fg(\"text\", row.label);\n\t\t\tconst value = this.theme.fg(\"muted\", `— ${row.value}`);\n\t\t\tconst checkmark = row.override ? this.theme.fg(\"success\", \" ✓\") : \"\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(`${prefix}${label} ${value}${checkmark}`, 1, 0));\n\t\t}\n\t}\n\n\tprivate moveSelection(offset: -1 | 1): void {\n\t\tthis.selectedIndex = (this.selectedIndex + offset + this.rows.length) % this.rows.length;\n\t\tthis.updateList();\n\t}\n\n\thandleInput(data: string): void {\n\t\tif (this.keybindings.matches(data, \"tui.select.up\")) {\n\t\t\tthis.moveSelection(-1);\n\t\t} else if (this.keybindings.matches(data, \"tui.select.down\")) {\n\t\t\tthis.moveSelection(1);\n\t\t} else if (this.keybindings.matches(data, \"tui.select.confirm\")) {\n\t\t\tthis.onDone(this.rows[this.selectedIndex]?.action);\n\t\t} else if (this.keybindings.matches(data, \"tui.select.cancel\")) {\n\t\t\tthis.onDone(undefined);\n\t\t}\n\t}\n}\n\n/** Standalone searchable model picker for one profile; confirm saves immediately. */\nclass ModelPickerComponent extends Container implements Focusable {\n\tprivate readonly tui: TUI;\n\tprivate readonly theme: Theme;\n\tprivate readonly keybindings: KeybindingsManager;\n\tprivate readonly modelList: ProfileModelListComponent;\n\tprivate readonly refreshAbortController = new AbortController();\n\tprivate closed = false;\n\tprivate _focused = false;\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.modelList.focused = value;\n\t}\n\n\tconstructor(options: {\n\t\ttui: TUI;\n\t\ttheme: Theme;\n\t\tkeybindings: KeybindingsManager;\n\t\tprofile: AgentProfile;\n\t\tsavedModelId: string | undefined;\n\t\tmodels: readonly Model<Api>[];\n\t\tscopedModels: readonly { model: Model<Api> }[];\n\t\tcurrentSessionModel: Model<Api> | undefined;\n\t\tonDone: (choice: ProfileModelChoice | undefined) => void;\n\t}) {\n\t\tsuper();\n\t\tthis.tui = options.tui;\n\t\tthis.theme = options.theme;\n\t\tthis.keybindings = options.keybindings;\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(this.theme.fg(\"accent\", this.theme.bold(`Model — ${PROFILE_LABELS[options.profile.name]}`)), 1, 0),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.modelList = new ProfileModelListComponent({\n\t\t\ttheme: options.theme,\n\t\t\tkeybindings: options.keybindings,\n\t\t\tmodels: options.models,\n\t\t\tscopedModels: options.scopedModels,\n\t\t\tcurrentSessionModel: options.currentSessionModel,\n\t\t\tsavedModelId: options.savedModelId,\n\t\t\tonDone: options.onDone,\n\t\t});\n\t\tthis.addChild(this.modelList);\n\t\tthis.addChild(new Spacer(1));\n\t\tconst hints = [\n\t\t\tnavigationHint(this.theme, options.keybindings),\n\t\t\toptions.scopedModels.length > 0 ? hint(this.theme, options.keybindings, \"tui.input.tab\", \"scope\") : \"\",\n\t\t\thint(this.theme, options.keybindings, \"tui.select.confirm\", \"select\"),\n\t\t\thint(this.theme, options.keybindings, \"tui.select.cancel\", \"back\"),\n\t\t].filter(Boolean);\n\t\tthis.addChild(new Text(hints.join(this.theme.fg(\"muted\", \" • \")), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tget refreshSignal(): AbortSignal {\n\t\treturn this.refreshAbortController.signal;\n\t}\n\n\tcancelRefresh(): void {\n\t\tthis.refreshAbortController.abort();\n\t}\n\n\tget isClosed(): boolean {\n\t\treturn this.closed;\n\t}\n\n\tdispose(): void {\n\t\tthis.closed = true;\n\t\tthis.refreshAbortController.abort();\n\t}\n\n\tupdateModels(models: readonly Model<Api>[]): void {\n\t\tif (this.closed) return;\n\t\tthis.modelList.updateModels(models);\n\t\tthis.tui.requestRender();\n\t}\n\n\tsetRefreshStatus(message: string | undefined, tone: \"muted\" | \"success\" | \"error\" = \"muted\"): void {\n\t\tif (this.closed) return;\n\t\tthis.modelList.setStatus(message, tone);\n\t\tthis.tui.requestRender();\n\t}\n\n\thandleInput(data: string): void {\n\t\tthis.modelList.handleInput(data);\n\t}\n}\n\n/** Persist a single override atomically; the UI only reflects the value on success. */\nasync function persistOverride(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\tpatch: Partial<SubagentProfileOverride>,\n\tcurrent: string | ThinkingLevel | undefined,\n): Promise<void> {\n\tconst next = \"model\" in patch ? patch.model : patch.thinking;\n\tif (next === current) return;\n\ttry {\n\t\tawait updateProfileOverride(profile.name, patch, getAgentDir());\n\t} catch (error) {\n\t\tctx.ui.notify(\n\t\t\t`Could not save ${PROFILE_LABELS[profile.name]} settings: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\"error\",\n\t\t);\n\t}\n}\n\nasync function refreshPickerModels(ctx: ExtensionCommandContext, picker: ModelPickerComponent): Promise<void> {\n\tlet timedOut = false;\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tpicker.cancelRefresh();\n\t}, MODEL_REFRESH_TIMEOUT_MS);\n\ttimeout.unref?.();\n\ttry {\n\t\tconst result = await ctx.modelRegistry.refresh({ signal: picker.refreshSignal });\n\t\tif (picker.isClosed || (picker.refreshSignal.aborted && !timedOut)) return;\n\t\tpicker.updateModels(ctx.modelRegistry.getAvailable());\n\t\tif (result.aborted && timedOut) {\n\t\t\tpicker.setRefreshStatus(\"Model refresh timed out; showing cached models.\", \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst providerIds = [...result.errors.keys()];\n\t\tif (providerIds.length > 0) {\n\t\t\tpicker.setRefreshStatus(refreshFailureMessage(providerIds), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tconst registryError = ctx.modelRegistry.getError();\n\t\tif (registryError) {\n\t\t\tpicker.setRefreshStatus(boundText(registryError, MAX_REFRESH_ERROR_LENGTH), \"error\");\n\t\t\treturn;\n\t\t}\n\t\tpicker.setRefreshStatus(undefined);\n\t} catch (error) {\n\t\tif (picker.isClosed || (picker.refreshSignal.aborted && !timedOut)) return;\n\t\tconst message = timedOut\n\t\t\t? \"Model refresh timed out; showing cached models.\"\n\t\t\t: `Could not refresh model catalogs: ${error instanceof Error ? error.message : String(error)}`;\n\t\tpicker.setRefreshStatus(boundText(message, MAX_REFRESH_ERROR_LENGTH), \"error\");\n\t} finally {\n\t\tclearTimeout(timeout);\n\t}\n}\n\nasync function selectProfile(ctx: ExtensionCommandContext): Promise<AgentProfile | undefined> {\n\tconst labels = AGENT_PROFILES.map((profile) => PROFILE_LABELS[profile.name]);\n\tconst label = await ctx.ui.select(\"Agents\", labels);\n\treturn label === undefined ? undefined : AGENT_PROFILES.find((profile) => PROFILE_LABELS[profile.name] === label);\n}\n\nasync function showTuiSettingsMenu(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n\tcurrentThinking: ThinkingLevel,\n): Promise<SettingsAction | undefined> {\n\treturn ctx.ui.custom<SettingsAction | undefined>(\n\t\t(_tui, theme, keybindings, done) =>\n\t\t\tnew ProfileSettingsMenuComponent({\n\t\t\t\ttheme,\n\t\t\t\tkeybindings,\n\t\t\t\tprofile,\n\t\t\t\toverride,\n\t\t\t\tmodels: ctx.modelRegistry.getAvailable(),\n\t\t\t\tcurrentSessionModel: ctx.model,\n\t\t\t\tcurrentThinking,\n\t\t\t\tonDone: done,\n\t\t\t}),\n\t);\n}\n\nasync function showDialogSettingsMenu(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n\tcurrentThinking: ThinkingLevel,\n): Promise<SettingsAction | undefined> {\n\tconst models = ctx.modelRegistry.getAvailable();\n\tconst effective = effectiveModel(ctx.model, models, override);\n\tconst modelValue = override?.model\n\t\t? `override — ${override.model}${findModel(models, override.model) ? \"\" : \" [unavailable]\"}`\n\t\t: `inherit — ${modelId(ctx.model)}`;\n\tconst thinkingValue = override?.thinking\n\t\t? `override — ${override.thinking}`\n\t\t: `inherit — ${inheritedThinking(effective, currentThinking)}`;\n\tconst options = new Map<string, SettingsAction>();\n\toptions.set(`Model — ${modelValue}`, \"model\");\n\toptions.set(`Thinking — ${thinkingValue}`, \"thinking\");\n\tconst label = await ctx.ui.select(PROFILE_LABELS[profile.name], [...options.keys()]);\n\treturn label === undefined ? undefined : options.get(label);\n}\n\nasync function showTuiModelPicker(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n): Promise<{ modelId: string | undefined } | undefined> {\n\tconst chosen = await ctx.ui.custom<ProfileModelChoice | undefined>((tui, theme, keybindings, done) => {\n\t\tconst picker = new ModelPickerComponent({\n\t\t\ttui,\n\t\t\ttheme,\n\t\t\tkeybindings,\n\t\t\tprofile,\n\t\t\tsavedModelId: override?.model,\n\t\t\tmodels: ctx.modelRegistry.getAvailable(),\n\t\t\tscopedModels: ctx.scopedModels,\n\t\t\tcurrentSessionModel: ctx.model,\n\t\t\tonDone: done,\n\t\t});\n\t\tpicker.setRefreshStatus(\"Refreshing model catalogs…\");\n\t\tvoid refreshPickerModels(ctx, picker);\n\t\treturn picker;\n\t});\n\treturn chosen === undefined ? undefined : { modelId: chosen.modelId };\n}\n\nasync function showDialogModelPicker(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n): Promise<{ modelId: string | undefined } | undefined> {\n\tconst models = ctx.modelRegistry.getAvailable().sort((left, right) => {\n\t\tconst provider = left.provider.localeCompare(right.provider);\n\t\treturn provider !== 0 ? provider : left.id.localeCompare(right.id);\n\t});\n\tconst choices = new Map<string, string | undefined>();\n\tchoices.set(`inherit (${modelId(ctx.model)})${override?.model ? \"\" : \" ✓\"}`, undefined);\n\tif (override?.model && !findModel(models, override.model)) {\n\t\tchoices.set(`${override.model} [unavailable] ✓`, override.model);\n\t}\n\tfor (const model of models) {\n\t\tconst id = modelId(model);\n\t\tchoices.set(`${id}${override?.model === id ? \" ✓\" : \"\"}`, id);\n\t}\n\tconst label = await ctx.ui.select(`Model — ${PROFILE_LABELS[profile.name]}`, [...choices.keys()]);\n\treturn label === undefined ? undefined : { modelId: choices.get(label) };\n}\n\nasync function showThinkingPicker(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\toverride: SubagentProfileOverride | undefined,\n\tcurrentThinking: ThinkingLevel,\n): Promise<{ level: ThinkingLevel | undefined } | undefined> {\n\tconst models = ctx.modelRegistry.getAvailable();\n\tconst effective = effectiveModel(ctx.model, models, override);\n\tconst levels = effective ? (getSupportedThinkingLevels(effective) as ThinkingLevel[]) : [...THINKING_LEVELS];\n\tconst inherited = inheritedThinking(effective, currentThinking);\n\tconst choices = new Map<string, ThinkingLevel | undefined>();\n\tchoices.set(`inherit (${inherited})${override?.thinking ? \"\" : \" ✓\"}`, undefined);\n\tfor (const level of levels) {\n\t\tchoices.set(`${level}${override?.thinking === level ? \" ✓\" : \"\"}`, level);\n\t}\n\tconst label = await ctx.ui.select(`Thinking — ${PROFILE_LABELS[profile.name]}`, [...choices.keys()]);\n\treturn label === undefined ? undefined : { level: choices.get(label) };\n}\n\nasync function runProfileSettings(\n\tctx: ExtensionCommandContext,\n\tprofile: AgentProfile,\n\tcurrentThinking: ThinkingLevel,\n): Promise<void> {\n\tconst agentDir = getAgentDir();\n\tconst isTui = ctx.mode === \"tui\";\n\twhile (true) {\n\t\tconst config = await loadSubagentConfig(agentDir);\n\t\tconst override = config.profiles[profile.name];\n\t\tconst action = isTui\n\t\t\t? await showTuiSettingsMenu(ctx, profile, override, currentThinking)\n\t\t\t: await showDialogSettingsMenu(ctx, profile, override, currentThinking);\n\t\tif (!action) return;\n\t\tif (action === \"model\") {\n\t\t\tconst chosen = isTui\n\t\t\t\t? await showTuiModelPicker(ctx, profile, override)\n\t\t\t\t: await showDialogModelPicker(ctx, profile, override);\n\t\t\tif (!chosen) continue;\n\t\t\tawait persistOverride(ctx, profile, { model: chosen.modelId }, override?.model);\n\t\t} else {\n\t\t\tconst chosen = await showThinkingPicker(ctx, profile, override, currentThinking);\n\t\t\tif (!chosen) continue;\n\t\t\tawait persistOverride(ctx, profile, { thinking: chosen.level }, override?.thinking);\n\t\t}\n\t}\n}\n\nexport async function showAgentsCommand(ctx: ExtensionCommandContext, currentThinking: ThinkingLevel): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/agents requires an interactive UI.\", \"warning\");\n\t\treturn;\n\t}\n\twhile (true) {\n\t\tconst profile = await selectProfile(ctx);\n\t\tif (!profile) return;\n\t\tawait runProfileSettings(ctx, profile, currentThinking);\n\t}\n}\n"]}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
agentDir?: string;
|
|
5
|
-
}): AgentDiscoveryResult;
|
|
6
|
-
export declare function subagentToolDescription(discovery: AgentDiscoveryResult): string;
|
|
1
|
+
import type { AgentProfile } from "./types.ts";
|
|
2
|
+
export declare const AGENT_PROFILES: readonly AgentProfile[];
|
|
3
|
+
export declare function subagentToolDescription(): string;
|
|
7
4
|
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/agents.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EA6BjD,CAAC;AAIF,wBAAgB,uBAAuB,IAAI,MAAM,CAYhD"}
|