@astralyn/pi 0.84.2 → 0.84.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/cli/args.js +1 -1
  3. package/dist/cli/args.js.map +1 -1
  4. package/dist/cli/config-selector.d.ts.map +1 -1
  5. package/dist/cli/config-selector.js +2 -3
  6. package/dist/cli/config-selector.js.map +1 -1
  7. package/dist/cli/project-trust.d.ts.map +1 -1
  8. package/dist/cli/project-trust.js +1 -4
  9. package/dist/cli/project-trust.js.map +1 -1
  10. package/dist/cli/startup-ui.d.ts.map +1 -1
  11. package/dist/cli/startup-ui.js +3 -5
  12. package/dist/cli/startup-ui.js.map +1 -1
  13. package/dist/config.d.ts +5 -0
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +8 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/core/agent-session.d.ts +1 -25
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +29 -408
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/compaction-controller.d.ts +89 -0
  22. package/dist/core/compaction-controller.d.ts.map +1 -0
  23. package/dist/core/compaction-controller.js +428 -0
  24. package/dist/core/compaction-controller.js.map +1 -0
  25. package/dist/core/extensions/index.d.ts +1 -1
  26. package/dist/core/extensions/index.d.ts.map +1 -1
  27. package/dist/core/extensions/index.js.map +1 -1
  28. package/dist/core/extensions/loader.js +3 -3
  29. package/dist/core/extensions/loader.js.map +1 -1
  30. package/dist/core/extensions/types.d.ts +2 -27
  31. package/dist/core/extensions/types.d.ts.map +1 -1
  32. package/dist/core/extensions/types.js.map +1 -1
  33. package/dist/core/provider-attribution.js +2 -2
  34. package/dist/core/provider-attribution.js.map +1 -1
  35. package/dist/core/settings-manager.js +1 -1
  36. package/dist/core/settings-manager.js.map +1 -1
  37. package/dist/core/telemetry.d.ts +1 -1
  38. package/dist/core/telemetry.d.ts.map +1 -1
  39. package/dist/core/telemetry.js +1 -1
  40. package/dist/core/telemetry.js.map +1 -1
  41. package/dist/extensions/deepwiki/index.d.ts.map +1 -1
  42. package/dist/extensions/deepwiki/index.js +23 -1
  43. package/dist/extensions/deepwiki/index.js.map +1 -1
  44. package/dist/extensions/deepwiki/render.d.ts +1 -1
  45. package/dist/extensions/deepwiki/render.d.ts.map +1 -1
  46. package/dist/extensions/deepwiki/render.js +4 -2
  47. package/dist/extensions/deepwiki/render.js.map +1 -1
  48. package/dist/extensions/question/index.d.ts.map +1 -1
  49. package/dist/extensions/question/index.js +0 -1
  50. package/dist/extensions/question/index.js.map +1 -1
  51. package/dist/extensions/subagent/agents-command.d.ts +4 -0
  52. package/dist/extensions/subagent/agents-command.d.ts.map +1 -0
  53. package/dist/extensions/subagent/agents-command.js +230 -0
  54. package/dist/extensions/subagent/agents-command.js.map +1 -0
  55. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  56. package/dist/extensions/subagent/agents.js +2 -0
  57. package/dist/extensions/subagent/agents.js.map +1 -1
  58. package/dist/extensions/subagent/display-name.d.ts +6 -0
  59. package/dist/extensions/subagent/display-name.d.ts.map +1 -0
  60. package/dist/extensions/subagent/display-name.js +13 -0
  61. package/dist/extensions/subagent/display-name.js.map +1 -0
  62. package/dist/extensions/subagent/index.d.ts.map +1 -1
  63. package/dist/extensions/subagent/index.js +19 -126
  64. package/dist/extensions/subagent/index.js.map +1 -1
  65. package/dist/extensions/subagent/render.d.ts.map +1 -1
  66. package/dist/extensions/subagent/render.js +1 -10
  67. package/dist/extensions/subagent/render.js.map +1 -1
  68. package/dist/extensions/subagent/settings.d.ts +0 -1
  69. package/dist/extensions/subagent/settings.d.ts.map +1 -1
  70. package/dist/extensions/subagent/settings.js +3 -7
  71. package/dist/extensions/subagent/settings.js.map +1 -1
  72. package/dist/extensions/subagent/types.d.ts +2 -0
  73. package/dist/extensions/subagent/types.d.ts.map +1 -1
  74. package/dist/extensions/subagent/types.js.map +1 -1
  75. package/dist/extensions/subagent/ui/model-list.d.ts +67 -0
  76. package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -0
  77. package/dist/extensions/subagent/ui/model-list.js +242 -0
  78. package/dist/extensions/subagent/ui/model-list.js.map +1 -0
  79. package/dist/extensions/subagent/ui/profile-editor.d.ts +54 -0
  80. package/dist/extensions/subagent/ui/profile-editor.d.ts.map +1 -0
  81. package/dist/extensions/subagent/ui/profile-editor.js +154 -0
  82. package/dist/extensions/subagent/ui/profile-editor.js.map +1 -0
  83. package/dist/extensions/subagent/ui/profile-picker.d.ts +32 -0
  84. package/dist/extensions/subagent/ui/profile-picker.d.ts.map +1 -0
  85. package/dist/extensions/subagent/ui/profile-picker.js +149 -0
  86. package/dist/extensions/subagent/ui/profile-picker.js.map +1 -0
  87. package/dist/extensions/todo/constants.d.ts +6 -17
  88. package/dist/extensions/todo/constants.d.ts.map +1 -1
  89. package/dist/extensions/todo/constants.js +20 -31
  90. package/dist/extensions/todo/constants.js.map +1 -1
  91. package/dist/extensions/todo/index.d.ts.map +1 -1
  92. package/dist/extensions/todo/index.js +36 -57
  93. package/dist/extensions/todo/index.js.map +1 -1
  94. package/dist/extensions/todo/schema.d.ts +20 -59
  95. package/dist/extensions/todo/schema.d.ts.map +1 -1
  96. package/dist/extensions/todo/schema.js +23 -69
  97. package/dist/extensions/todo/schema.js.map +1 -1
  98. package/dist/extensions/todo/state.d.ts +23 -65
  99. package/dist/extensions/todo/state.d.ts.map +1 -1
  100. package/dist/extensions/todo/state.js +238 -1262
  101. package/dist/extensions/todo/state.js.map +1 -1
  102. package/dist/extensions/todo/view.d.ts +19 -10
  103. package/dist/extensions/todo/view.d.ts.map +1 -1
  104. package/dist/extensions/todo/view.js +411 -463
  105. package/dist/extensions/todo/view.js.map +1 -1
  106. package/dist/extensions/todo/widget.d.ts +15 -0
  107. package/dist/extensions/todo/widget.d.ts.map +1 -0
  108. package/dist/extensions/todo/widget.js +50 -0
  109. package/dist/extensions/todo/widget.js.map +1 -0
  110. package/dist/modes/interactive/components/extension-selector.d.ts +1 -4
  111. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  112. package/dist/modes/interactive/components/extension-selector.js +6 -12
  113. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  114. package/dist/modes/interactive/components/settings-selector.js +1 -1
  115. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  116. package/dist/modes/interactive/components/tool-chrome.d.ts +28 -0
  117. package/dist/modes/interactive/components/tool-chrome.d.ts.map +1 -0
  118. package/dist/modes/interactive/components/tool-chrome.js +81 -0
  119. package/dist/modes/interactive/components/tool-chrome.js.map +1 -0
  120. package/dist/modes/interactive/components/tool-execution.d.ts +0 -3
  121. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/tool-execution.js +11 -108
  123. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  124. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  125. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  126. package/dist/modes/interactive/interactive-mode.js +35 -52
  127. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  128. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  129. package/dist/modes/rpc/rpc-mode.js +1 -8
  130. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  131. package/docs/bundled/README.md +1 -1
  132. package/docs/bundled/extensions/subagent.md +20 -5
  133. package/docs/bundled/extensions/todo.md +84 -24
  134. package/docs/bundled/tool-presentation.md +3 -3
  135. package/docs/extensions.md +6 -23
  136. package/docs/settings.md +1 -1
  137. package/docs/usage.md +1 -1
  138. package/npm-shrinkwrap.json +2 -2
  139. package/package.json +1 -1
  140. package/dist/extensions/subagent/picker.d.ts +0 -31
  141. package/dist/extensions/subagent/picker.d.ts.map +0 -1
  142. package/dist/extensions/subagent/picker.js +0 -109
  143. package/dist/extensions/subagent/picker.js.map +0 -1
  144. package/dist/extensions/todo/overlay.d.ts +0 -24
  145. package/dist/extensions/todo/overlay.d.ts.map +0 -1
  146. package/dist/extensions/todo/overlay.js +0 -135
  147. package/dist/extensions/todo/overlay.js.map +0 -1
  148. package/dist/utils/coalescing-terminal.d.ts +0 -132
  149. package/dist/utils/coalescing-terminal.d.ts.map +0 -1
  150. package/dist/utils/coalescing-terminal.js +0 -292
  151. package/dist/utils/coalescing-terminal.js.map +0 -1
@@ -1,94 +1,30 @@
1
1
  import { join } from "node:path";
2
- import { getSupportedThinkingLevels } from "@earendil-works/pi-ai/compat";
3
2
  import { getAgentDir } from "../../config.js";
4
3
  import { ModelRuntime } from "../../core/model-runtime.js";
5
4
  import { emptyUsage } from "./activity.js";
6
5
  import { discoverAgents, subagentToolDescription } from "./agents.js";
7
- import { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME, THINKING_LEVELS } from "./constants.js";
8
- import { SearchPickerComponent } from "./picker.js";
6
+ import { showAgentsCommand } from "./agents-command.js";
7
+ import { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME } from "./constants.js";
9
8
  import { renderSubagentCall, renderSubagentResult } from "./render.js";
10
9
  import { ConcurrencyGate, isSubagentError, runSubagentInvocation, statusSummary } from "./runner.js";
11
10
  import { SubagentParamsSchema } from "./schema.js";
12
- import { loadSubagentConfig, resetProfileOverrides, updateProfileOverride } from "./settings.js";
13
- function formatParentModel(model) {
14
- return model ? `${model.provider}/${model.id}` : "none";
15
- }
16
- // Settings resolve in two layers: a saved override wins, otherwise the
17
- // profile inherits the parent session. Inherited rows show the value
18
- // currently in effect so the menu doubles as a status view.
19
- function effectiveSettings(override, ctx, parentThinking) {
20
- return {
21
- model: override?.model ?? `inherit (${formatParentModel(ctx.model)})`,
22
- thinking: override?.thinking ?? `inherit (${parentThinking})`,
23
- };
24
- }
25
- // The thinking picker lists what the effective model actually supports;
26
- // if the saved override names a model that is unavailable right now,
27
- // every level shows and the runtime clamp decides.
28
- function effectiveModelFor(ctx, override) {
29
- if (override?.model) {
30
- const separator = override.model.indexOf("/");
31
- if (separator <= 0)
32
- return undefined;
33
- return ctx.modelRegistry.find(override.model.slice(0, separator), override.model.slice(separator + 1));
34
- }
35
- return ctx.model;
36
- }
37
- async function pickModel(ctx, profileName, override) {
38
- const items = [
39
- {
40
- value: null,
41
- label: "inherit",
42
- detail: `Follow the parent session (${formatParentModel(ctx.model)})`,
43
- current: !override?.model,
44
- },
45
- ...ctx.modelRegistry.getAvailable().map((model) => ({
46
- value: `${model.provider}/${model.id}`,
47
- label: `${model.provider}/${model.id}`,
48
- detail: model.name && model.name !== model.id ? model.name : undefined,
49
- current: override?.model === `${model.provider}/${model.id}`,
50
- })),
51
- ];
52
- const selected = await ctx.ui.custom((_tui, theme, _keybindings, done) => new SearchPickerComponent(theme, `Model for ${profileName}`, items, done));
53
- if (selected === undefined)
54
- return;
55
- await updateProfileOverride(profileName, { model: selected ?? undefined }, getAgentDir());
56
- }
57
- async function pickThinking(ctx, profileName, override, parentThinking) {
58
- const model = effectiveModelFor(ctx, override);
59
- const levels = model ? getSupportedThinkingLevels(model) : [...THINKING_LEVELS];
60
- const items = [
61
- {
62
- value: null,
63
- label: "inherit",
64
- detail: `Follow the parent session (${parentThinking})`,
65
- current: !override?.thinking,
66
- },
67
- ...levels.map((level) => ({ value: level, label: level, current: override?.thinking === level })),
68
- ];
69
- const selected = await ctx.ui.custom((_tui, theme, _keybindings, done) => new SearchPickerComponent(theme, `Thinking for ${profileName}`, items, done));
70
- if (selected === undefined)
71
- return;
72
- await updateProfileOverride(profileName, { thinking: selected ?? undefined }, getAgentDir());
73
- }
74
- async function configureProfile(ctx, agent, parentThinking) {
75
- const agentDir = getAgentDir();
76
- while (true) {
77
- const config = await loadSubagentConfig(agentDir);
78
- const override = config.profiles[agent.name];
79
- const effective = effectiveSettings(override, ctx, parentThinking);
80
- const action = await ctx.ui.select(`${agent.name} — ${agent.description}`, [
81
- `Model: ${effective.model}`,
82
- `Thinking: ${effective.thinking}`,
83
- "Back",
84
- ]);
85
- if (!action || action === "Back")
86
- return;
87
- if (action.startsWith("Model:")) {
88
- await pickModel(ctx, agent.name, override);
89
- continue;
11
+ // Re-render live elapsed time and activity tails once per second while the
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?.();
90
22
  }
91
- await pickThinking(ctx, agent.name, override, parentThinking);
23
+ return;
24
+ }
25
+ if (state.refreshTimer !== undefined) {
26
+ clearTimeout(state.refreshTimer);
27
+ state.refreshTimer = undefined;
92
28
  }
93
29
  }
94
30
  // Parent tool calls execute in parallel by default, so every sync targeting
@@ -184,48 +120,6 @@ export async function syncParentProviders(runtime, registry, syncedIds, syncedAp
184
120
  providerSyncQueues.delete(runtime);
185
121
  }
186
122
  }
187
- async function showAgentsCommand(ctx, parentThinking) {
188
- if (!ctx.hasUI) {
189
- ctx.ui.notify("/agents requires an interactive UI.", "warning");
190
- return;
191
- }
192
- const agentDir = getAgentDir();
193
- const reset = "Reset all overrides";
194
- const done = "Done";
195
- while (true) {
196
- const discovery = discoverAgents(ctx.cwd, { projectTrusted: ctx.isProjectTrusted(), agentDir });
197
- const config = await loadSubagentConfig(agentDir);
198
- const rows = discovery.agents.map((agent) => {
199
- const effective = effectiveSettings(config.profiles[agent.name], ctx, parentThinking);
200
- return `${agent.name} — model: ${effective.model} · thinking: ${effective.thinking}`;
201
- });
202
- const issueCount = discovery.diagnostics.length;
203
- const issues = issueCount ? [`Show ${issueCount} agent file issue${issueCount === 1 ? "" : "s"}`] : [];
204
- const action = await ctx.ui.select("Subagent profiles — select one to configure", [
205
- ...rows,
206
- ...issues,
207
- reset,
208
- done,
209
- ]);
210
- if (!action || action === done)
211
- return;
212
- if (action === reset) {
213
- const confirmed = await ctx.ui.confirm("Reset profile overrides?", "Clear every saved Subagent model and thinking override?");
214
- if (confirmed) {
215
- await resetProfileOverrides(agentDir);
216
- ctx.ui.notify("All profiles now inherit the parent session.", "info");
217
- }
218
- continue;
219
- }
220
- if (issues.length > 0 && action === issues[0]) {
221
- ctx.ui.notify(discovery.diagnostics.map((diagnostic) => `${diagnostic.path}: ${diagnostic.message}`).join("\n"), "warning");
222
- continue;
223
- }
224
- const agent = discovery.agents.find((candidate) => action.startsWith(`${candidate.name} — `));
225
- if (agent)
226
- await configureProfile(ctx, agent, parentThinking);
227
- }
228
- }
229
123
  export default function subagent(pi) {
230
124
  const gate = new ConcurrencyGate();
231
125
  const activeAborters = new Set();
@@ -257,8 +151,6 @@ export default function subagent(pi) {
257
151
  name: SUBAGENT_TOOL_NAME,
258
152
  label: SUBAGENT_TOOL_LABEL,
259
153
  description: subagentToolDescription(discovery),
260
- rendersOwnProgress: true,
261
- renderRefreshIntervalMs: 1000,
262
154
  promptSnippet: "Delegate focused research, review, or implementation tasks to isolated subagents",
263
155
  promptGuidelines: [
264
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.",
@@ -316,6 +208,7 @@ export default function subagent(pi) {
316
208
  return renderSubagentCall(args, theme);
317
209
  },
318
210
  renderResult(result, options, theme, context) {
211
+ scheduleLiveRefresh(context, options.isPartial);
319
212
  return renderSubagentResult(result, options, theme, context.isError);
320
213
  },
321
214
  });
@@ -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 type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { getSupportedThinkingLevels } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type {\n\tAgentToolResult,\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\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 { SUBAGENT_COMMAND_NAME, SUBAGENT_TOOL_LABEL, SUBAGENT_TOOL_NAME, THINKING_LEVELS } from \"./constants.ts\";\nimport { type PickerItem, SearchPickerComponent } from \"./picker.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 { loadSubagentConfig, resetProfileOverrides, updateProfileOverride } from \"./settings.ts\";\nimport type { AgentDefinition, AgentDiscoveryResult, SubagentDetails, SubagentProfileOverride } from \"./types.ts\";\n\nfunction formatParentModel(model: { provider: string; id: string } | undefined): string {\n\treturn model ? `${model.provider}/${model.id}` : \"none\";\n}\n\n// Settings resolve in two layers: a saved override wins, otherwise the\n// profile inherits the parent session. Inherited rows show the value\n// currently in effect so the menu doubles as a status view.\nfunction effectiveSettings(\n\toverride: SubagentProfileOverride | undefined,\n\tctx: ExtensionCommandContext,\n\tparentThinking: string,\n): { model: string; thinking: string } {\n\treturn {\n\t\tmodel: override?.model ?? `inherit (${formatParentModel(ctx.model)})`,\n\t\tthinking: override?.thinking ?? `inherit (${parentThinking})`,\n\t};\n}\n\n// The thinking picker lists what the effective model actually supports;\n// if the saved override names a model that is unavailable right now,\n// every level shows and the runtime clamp decides.\nfunction effectiveModelFor(\n\tctx: ExtensionCommandContext,\n\toverride: SubagentProfileOverride | undefined,\n): Model<Api> | undefined {\n\tif (override?.model) {\n\t\tconst separator = override.model.indexOf(\"/\");\n\t\tif (separator <= 0) return undefined;\n\t\treturn ctx.modelRegistry.find(override.model.slice(0, separator), override.model.slice(separator + 1));\n\t}\n\treturn ctx.model;\n}\n\nasync function pickModel(\n\tctx: ExtensionCommandContext,\n\tprofileName: string,\n\toverride: SubagentProfileOverride | undefined,\n): Promise<void> {\n\tconst items: PickerItem<string | null>[] = [\n\t\t{\n\t\t\tvalue: null,\n\t\t\tlabel: \"inherit\",\n\t\t\tdetail: `Follow the parent session (${formatParentModel(ctx.model)})`,\n\t\t\tcurrent: !override?.model,\n\t\t},\n\t\t...ctx.modelRegistry.getAvailable().map((model) => ({\n\t\t\tvalue: `${model.provider}/${model.id}`,\n\t\t\tlabel: `${model.provider}/${model.id}`,\n\t\t\tdetail: model.name && model.name !== model.id ? model.name : undefined,\n\t\t\tcurrent: override?.model === `${model.provider}/${model.id}`,\n\t\t})),\n\t];\n\tconst selected = await ctx.ui.custom<string | null | undefined>(\n\t\t(_tui, theme, _keybindings, done) => new SearchPickerComponent(theme, `Model for ${profileName}`, items, done),\n\t);\n\tif (selected === undefined) return;\n\tawait updateProfileOverride(profileName, { model: selected ?? undefined }, getAgentDir());\n}\n\nasync function pickThinking(\n\tctx: ExtensionCommandContext,\n\tprofileName: string,\n\toverride: SubagentProfileOverride | undefined,\n\tparentThinking: string,\n): Promise<void> {\n\tconst model = effectiveModelFor(ctx, override);\n\tconst levels = model ? (getSupportedThinkingLevels(model) as ThinkingLevel[]) : [...THINKING_LEVELS];\n\tconst items: PickerItem<ThinkingLevel | null>[] = [\n\t\t{\n\t\t\tvalue: null,\n\t\t\tlabel: \"inherit\",\n\t\t\tdetail: `Follow the parent session (${parentThinking})`,\n\t\t\tcurrent: !override?.thinking,\n\t\t},\n\t\t...levels.map((level) => ({ value: level, label: level, current: override?.thinking === level })),\n\t];\n\tconst selected = await ctx.ui.custom<ThinkingLevel | null | undefined>(\n\t\t(_tui, theme, _keybindings, done) => new SearchPickerComponent(theme, `Thinking for ${profileName}`, items, done),\n\t);\n\tif (selected === undefined) return;\n\tawait updateProfileOverride(profileName, { thinking: selected ?? undefined }, getAgentDir());\n}\n\nasync function configureProfile(\n\tctx: ExtensionCommandContext,\n\tagent: AgentDefinition,\n\tparentThinking: string,\n): Promise<void> {\n\tconst agentDir = getAgentDir();\n\twhile (true) {\n\t\tconst config = await loadSubagentConfig(agentDir);\n\t\tconst override = config.profiles[agent.name];\n\t\tconst effective = effectiveSettings(override, ctx, parentThinking);\n\t\tconst action = await ctx.ui.select(`${agent.name} — ${agent.description}`, [\n\t\t\t`Model: ${effective.model}`,\n\t\t\t`Thinking: ${effective.thinking}`,\n\t\t\t\"Back\",\n\t\t]);\n\t\tif (!action || action === \"Back\") return;\n\t\tif (action.startsWith(\"Model:\")) {\n\t\t\tawait pickModel(ctx, agent.name, override);\n\t\t\tcontinue;\n\t\t}\n\t\tawait pickThinking(ctx, agent.name, override, parentThinking);\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\nasync function showAgentsCommand(ctx: ExtensionCommandContext, parentThinking: string): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/agents requires an interactive UI.\", \"warning\");\n\t\treturn;\n\t}\n\tconst agentDir = getAgentDir();\n\tconst reset = \"Reset all overrides\";\n\tconst done = \"Done\";\n\twhile (true) {\n\t\tconst discovery = discoverAgents(ctx.cwd, { projectTrusted: ctx.isProjectTrusted(), agentDir });\n\t\tconst config = await loadSubagentConfig(agentDir);\n\t\tconst rows = discovery.agents.map((agent) => {\n\t\t\tconst effective = effectiveSettings(config.profiles[agent.name], ctx, parentThinking);\n\t\t\treturn `${agent.name} — model: ${effective.model} · thinking: ${effective.thinking}`;\n\t\t});\n\t\tconst issueCount = discovery.diagnostics.length;\n\t\tconst issues = issueCount ? [`Show ${issueCount} agent file issue${issueCount === 1 ? \"\" : \"s\"}`] : [];\n\t\tconst action = await ctx.ui.select(\"Subagent profiles — select one to configure\", [\n\t\t\t...rows,\n\t\t\t...issues,\n\t\t\treset,\n\t\t\tdone,\n\t\t]);\n\t\tif (!action || action === done) return;\n\t\tif (action === reset) {\n\t\t\tconst confirmed = await ctx.ui.confirm(\n\t\t\t\t\"Reset profile overrides?\",\n\t\t\t\t\"Clear every saved Subagent model and thinking override?\",\n\t\t\t);\n\t\t\tif (confirmed) {\n\t\t\t\tawait resetProfileOverrides(agentDir);\n\t\t\t\tctx.ui.notify(\"All profiles now inherit the parent session.\", \"info\");\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tif (issues.length > 0 && action === issues[0]) {\n\t\t\tctx.ui.notify(\n\t\t\t\tdiscovery.diagnostics.map((diagnostic) => `${diagnostic.path}: ${diagnostic.message}`).join(\"\\n\"),\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\tconst agent = discovery.agents.find((candidate) => action.startsWith(`${candidate.name} — `));\n\t\tif (agent) await configureProfile(ctx, agent, parentThinking);\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>({\n\t\t\tname: SUBAGENT_TOOL_NAME,\n\t\t\tlabel: SUBAGENT_TOOL_LABEL,\n\t\t\tdescription: subagentToolDescription(discovery),\n\t\t\trendersOwnProgress: true,\n\t\t\trenderRefreshIntervalMs: 1000,\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\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 { 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 +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;AAE/F,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAGtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAyC,MAAM,YAAY,CAAC;AA6kBzF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAqBhF;AAED,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,GACd,SAAS,CAiEX"}
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;AAE/F,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAItF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAyC,MAAM,YAAY,CAAC;AAkkBzF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAqBhF;AAED,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,eAAe,CAAC,eAAe,CAAC,EACxC,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,GACd,SAAS,CAiEX"}
@@ -1,6 +1,7 @@
1
1
  import { Container, Markdown, Spacer, Text } from "@earendil-works/pi-tui";
2
2
  import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
3
3
  import { getMarkdownTheme } from "../../modes/interactive/theme/theme.js";
4
+ import { displayAgentName } from "./display-name.js";
4
5
  import { getSubagentRetryView } from "./retry.js";
5
6
  import { statusSummary } from "./runner.js";
6
7
  const SINGLE_EXCERPT_LIMIT = 200;
@@ -31,16 +32,6 @@ class IndentedText {
31
32
  this.text.invalidate();
32
33
  }
33
34
  }
34
- // Display-only: profile names stay lowercase everywhere the model sees
35
- // them; the transcript shows "general" as "General", "code-reviewer" as
36
- // "Code Reviewer".
37
- function displayAgentName(name) {
38
- return name
39
- .split(/[-_]/u)
40
- .filter(Boolean)
41
- .map((word) => `${word[0]?.toUpperCase() ?? ""}${word.slice(1)}`)
42
- .join(" ");
43
- }
44
35
  function singleAgentName(args) {
45
36
  return displayAgentName(args.agent ?? "general");
46
37
  }