@astralyn/pi 0.84.14 → 0.84.16

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 (185) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cli.js +2435 -18
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +12 -6
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/extensions/types.d.ts +4 -1
  7. package/dist/core/extensions/types.d.ts.map +1 -1
  8. package/dist/core/extensions/types.js.map +1 -1
  9. package/dist/core/tools/bash.d.ts +1 -0
  10. package/dist/core/tools/bash.d.ts.map +1 -1
  11. package/dist/core/tools/bash.js +4 -1
  12. package/dist/core/tools/bash.js.map +1 -1
  13. package/dist/core/tools/find.d.ts +2 -0
  14. package/dist/core/tools/find.d.ts.map +1 -1
  15. package/dist/core/tools/find.js +18 -15
  16. package/dist/core/tools/find.js.map +1 -1
  17. package/dist/extensions/background/actions.d.ts.map +1 -1
  18. package/dist/extensions/background/actions.js +3 -2
  19. package/dist/extensions/background/actions.js.map +1 -1
  20. package/dist/extensions/background/index.d.ts +5 -4
  21. package/dist/extensions/background/index.d.ts.map +1 -1
  22. package/dist/extensions/background/index.js +9 -5
  23. package/dist/extensions/background/index.js.map +1 -1
  24. package/dist/extensions/background/manager.d.ts.map +1 -1
  25. package/dist/extensions/background/manager.js +8 -9
  26. package/dist/extensions/background/manager.js.map +1 -1
  27. package/dist/extensions/background/registry.d.ts +4 -1
  28. package/dist/extensions/background/registry.d.ts.map +1 -1
  29. package/dist/extensions/background/registry.js +30 -17
  30. package/dist/extensions/background/registry.js.map +1 -1
  31. package/dist/extensions/background/task-view.d.ts +6 -0
  32. package/dist/extensions/background/task-view.d.ts.map +1 -1
  33. package/dist/extensions/background/task-view.js +11 -6
  34. package/dist/extensions/background/task-view.js.map +1 -1
  35. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  36. package/dist/extensions/deepwiki/client.js +3 -0
  37. package/dist/extensions/deepwiki/client.js.map +1 -1
  38. package/dist/extensions/deepwiki/execute.d.ts +2 -1
  39. package/dist/extensions/deepwiki/execute.d.ts.map +1 -1
  40. package/dist/extensions/deepwiki/execute.js +17 -2
  41. package/dist/extensions/deepwiki/execute.js.map +1 -1
  42. package/dist/extensions/deepwiki/http.d.ts +1 -0
  43. package/dist/extensions/deepwiki/http.d.ts.map +1 -1
  44. package/dist/extensions/deepwiki/http.js +16 -2
  45. package/dist/extensions/deepwiki/http.js.map +1 -1
  46. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  47. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  48. package/dist/extensions/deepwiki/schema.js +8 -2
  49. package/dist/extensions/deepwiki/schema.js.map +1 -1
  50. package/dist/extensions/question/dialog.d.ts.map +1 -1
  51. package/dist/extensions/question/dialog.js +80 -9
  52. package/dist/extensions/question/dialog.js.map +1 -1
  53. package/dist/extensions/question/index.d.ts.map +1 -1
  54. package/dist/extensions/question/index.js +8 -0
  55. package/dist/extensions/question/index.js.map +1 -1
  56. package/dist/extensions/question/schema.d.ts +2 -2
  57. package/dist/extensions/question/schema.d.ts.map +1 -1
  58. package/dist/extensions/question/schema.js +41 -11
  59. package/dist/extensions/question/schema.js.map +1 -1
  60. package/dist/extensions/question/types.d.ts +1 -1
  61. package/dist/extensions/question/types.d.ts.map +1 -1
  62. package/dist/extensions/question/types.js.map +1 -1
  63. package/dist/extensions/router/probe.d.ts.map +1 -1
  64. package/dist/extensions/router/probe.js +10 -29
  65. package/dist/extensions/router/probe.js.map +1 -1
  66. package/dist/extensions/router/register.d.ts.map +1 -1
  67. package/dist/extensions/router/register.js +16 -6
  68. package/dist/extensions/router/register.js.map +1 -1
  69. package/dist/extensions/router/store.d.ts.map +1 -1
  70. package/dist/extensions/router/store.js +108 -51
  71. package/dist/extensions/router/store.js.map +1 -1
  72. package/dist/extensions/router/ui.d.ts +6 -0
  73. package/dist/extensions/router/ui.d.ts.map +1 -1
  74. package/dist/extensions/router/ui.js +14 -6
  75. package/dist/extensions/router/ui.js.map +1 -1
  76. package/dist/extensions/statusline/index.d.ts.map +1 -1
  77. package/dist/extensions/statusline/index.js +40 -43
  78. package/dist/extensions/statusline/index.js.map +1 -1
  79. package/dist/extensions/subagent/activity.d.ts +7 -1
  80. package/dist/extensions/subagent/activity.d.ts.map +1 -1
  81. package/dist/extensions/subagent/activity.js +69 -6
  82. package/dist/extensions/subagent/activity.js.map +1 -1
  83. package/dist/extensions/subagent/agents-command.js +1 -1
  84. package/dist/extensions/subagent/agents-command.js.map +1 -1
  85. package/dist/extensions/subagent/agents.d.ts.map +1 -1
  86. package/dist/extensions/subagent/agents.js +0 -3
  87. package/dist/extensions/subagent/agents.js.map +1 -1
  88. package/dist/extensions/subagent/budget.d.ts.map +1 -1
  89. package/dist/extensions/subagent/budget.js +29 -2
  90. package/dist/extensions/subagent/budget.js.map +1 -1
  91. package/dist/extensions/subagent/cancellation.d.ts +4 -4
  92. package/dist/extensions/subagent/cancellation.d.ts.map +1 -1
  93. package/dist/extensions/subagent/cancellation.js +31 -13
  94. package/dist/extensions/subagent/cancellation.js.map +1 -1
  95. package/dist/extensions/subagent/constants.d.ts +1 -0
  96. package/dist/extensions/subagent/constants.d.ts.map +1 -1
  97. package/dist/extensions/subagent/constants.js +1 -0
  98. package/dist/extensions/subagent/constants.js.map +1 -1
  99. package/dist/extensions/subagent/index.d.ts.map +1 -1
  100. package/dist/extensions/subagent/index.js +1 -0
  101. package/dist/extensions/subagent/index.js.map +1 -1
  102. package/dist/extensions/subagent/render.d.ts +8 -1
  103. package/dist/extensions/subagent/render.d.ts.map +1 -1
  104. package/dist/extensions/subagent/render.js +155 -178
  105. package/dist/extensions/subagent/render.js.map +1 -1
  106. package/dist/extensions/subagent/runner.d.ts +1 -0
  107. package/dist/extensions/subagent/runner.d.ts.map +1 -1
  108. package/dist/extensions/subagent/runner.js +53 -44
  109. package/dist/extensions/subagent/runner.js.map +1 -1
  110. package/dist/extensions/subagent/sdk-runner.d.ts.map +1 -1
  111. package/dist/extensions/subagent/sdk-runner.js +0 -3
  112. package/dist/extensions/subagent/sdk-runner.js.map +1 -1
  113. package/dist/extensions/subagent/settings.d.ts +1 -1
  114. package/dist/extensions/subagent/settings.d.ts.map +1 -1
  115. package/dist/extensions/subagent/settings.js +74 -25
  116. package/dist/extensions/subagent/settings.js.map +1 -1
  117. package/dist/extensions/subagent/state.d.ts +1 -0
  118. package/dist/extensions/subagent/state.d.ts.map +1 -1
  119. package/dist/extensions/subagent/state.js +46 -16
  120. package/dist/extensions/subagent/state.js.map +1 -1
  121. package/dist/extensions/subagent/types.d.ts +0 -7
  122. package/dist/extensions/subagent/types.d.ts.map +1 -1
  123. package/dist/extensions/subagent/types.js.map +1 -1
  124. package/dist/extensions/subagent/ui/agents-dialog.js +1 -1
  125. package/dist/extensions/subagent/ui/agents-dialog.js.map +1 -1
  126. package/dist/extensions/subagent/ui/model-list.d.ts.map +1 -1
  127. package/dist/extensions/subagent/ui/model-list.js +3 -4
  128. package/dist/extensions/subagent/ui/model-list.js.map +1 -1
  129. package/dist/extensions/subagent/ui/model-picker.d.ts.map +1 -1
  130. package/dist/extensions/subagent/ui/model-picker.js +2 -1
  131. package/dist/extensions/subagent/ui/model-picker.js.map +1 -1
  132. package/dist/extensions/web-search/format.d.ts.map +1 -1
  133. package/dist/extensions/web-search/format.js +36 -15
  134. package/dist/extensions/web-search/format.js.map +1 -1
  135. package/dist/extensions/web-search/index.d.ts.map +1 -1
  136. package/dist/extensions/web-search/index.js +11 -8
  137. package/dist/extensions/web-search/index.js.map +1 -1
  138. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  139. package/dist/extensions/web-search/providers/deepseek.js +36 -5
  140. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  141. package/dist/extensions/web-search/providers/http.d.ts +2 -7
  142. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  143. package/dist/extensions/web-search/providers/http.js +12 -57
  144. package/dist/extensions/web-search/providers/http.js.map +1 -1
  145. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  146. package/dist/extensions/web-search/providers/minimax.js +18 -6
  147. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  148. package/dist/extensions/web-search/render.d.ts.map +1 -1
  149. package/dist/extensions/web-search/render.js +16 -5
  150. package/dist/extensions/web-search/render.js.map +1 -1
  151. package/dist/extensions/web-search/results.d.ts +10 -3
  152. package/dist/extensions/web-search/results.d.ts.map +1 -1
  153. package/dist/extensions/web-search/results.js +25 -7
  154. package/dist/extensions/web-search/results.js.map +1 -1
  155. package/dist/image-resize-worker.js +2 -0
  156. package/dist/modes/interactive/components/tool-execution.d.ts +1 -0
  157. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/tool-execution.js +7 -0
  159. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  160. package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
  161. package/dist/modes/interactive/components/tool-group.js +10 -0
  162. package/dist/modes/interactive/components/tool-group.js.map +1 -1
  163. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  164. package/dist/modes/interactive/interactive-mode.js +3 -40
  165. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  166. package/dist/modes/interactive/theme/theme.d.ts +0 -4
  167. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  168. package/dist/modes/interactive/theme/theme.js +16 -23
  169. package/dist/modes/interactive/theme/theme.js.map +1 -1
  170. package/dist/rpc-entry.js +2435 -10
  171. package/dist/utils/http-response.d.ts +10 -0
  172. package/dist/utils/http-response.d.ts.map +1 -0
  173. package/dist/utils/http-response.js +68 -0
  174. package/dist/utils/http-response.js.map +1 -0
  175. package/docs/bundled/extensions/background.md +4 -3
  176. package/docs/bundled/extensions/deepwiki.md +7 -5
  177. package/docs/bundled/extensions/question.md +6 -4
  178. package/docs/bundled/extensions/router.md +1 -1
  179. package/docs/bundled/extensions/statusline.md +1 -0
  180. package/docs/bundled/extensions/subagent.md +29 -39
  181. package/docs/bundled/extensions/web-search.md +3 -3
  182. package/docs/development.md +8 -3
  183. package/docs/extensions.md +2 -2
  184. package/npm-shrinkwrap.json +110 -109
  185. package/package.json +4 -2
@@ -1,8 +1,12 @@
1
1
  import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
+ import lockfile from "proper-lockfile";
3
4
  import { getAgentDir } from "../../config.js";
4
5
  import { withFileMutationQueue } from "../../core/tools/file-mutation-queue.js";
5
6
  import { SUBAGENT_AGENT_NAMES, SUBAGENT_CONFIG_FILE, SUBAGENT_CONFIG_VERSION, THINKING_LEVELS, } from "./constants.js";
7
+ const LOCK_STALE_MS = 10_000;
8
+ const LOCK_RETRY_OPTIONS = { retries: 5, factor: 2, minTimeout: 20, maxTimeout: 200 };
9
+ const BACKUP_ATTEMPTS = 100;
6
10
  function isThinkingLevel(value) {
7
11
  return typeof value === "string" && THINKING_LEVELS.includes(value);
8
12
  }
@@ -59,32 +63,24 @@ export function parseSubagentConfig(raw) {
59
63
  }
60
64
  const profiles = {};
61
65
  for (const [name, value] of Object.entries(root.profiles ?? {})) {
62
- // The only profiles are the two built-in ones; unknown keys are rejected
63
- // outright (no legacy aliases or compatibility mapping).
64
66
  if (!SUBAGENT_AGENT_NAMES.includes(name)) {
65
67
  throw new Error(`${SUBAGENT_CONFIG_FILE} contains unknown profile "${name}".`);
66
68
  }
67
69
  profiles[name] = normalizeOverride(value, name);
68
70
  }
69
71
  const unknownKeys = Object.keys(root).filter((key) => key !== "version" && key !== "profiles");
70
- if (unknownKeys.length > 0)
72
+ if (unknownKeys.length > 0) {
71
73
  throw new Error(`${SUBAGENT_CONFIG_FILE} has unsupported field(s): ${unknownKeys.join(", ")}.`);
74
+ }
72
75
  return { version: SUBAGENT_CONFIG_VERSION, profiles };
73
76
  }
74
- // A stale or invalid config (older formats, unknown profiles, malformed
75
- // JSON) must not block every subagent call: reset it to an empty, fully
76
- // inheriting config. The reset is best-effort — when the write fails the
77
- // caller still gets the empty config and the next load retries the reset.
78
- async function resetSubagentConfigFile(filePath) {
79
- try {
80
- await writeSubagentConfigFile(filePath, emptySubagentConfig());
81
- }
82
- catch {
83
- // Keep the original failure invisible to callers; an unwritable config
84
- // file is a setup problem, not a reason to fail the subagent call.
85
- }
77
+ function errorMessage(error) {
78
+ return error instanceof Error ? error.message : String(error);
79
+ }
80
+ function configWarning(filePath, error) {
81
+ return `Ignoring invalid Subagent settings at ${filePath}; the file was left unchanged. ${errorMessage(error)}`;
86
82
  }
87
- export async function loadSubagentConfig(agentDir = getAgentDir()) {
83
+ export async function loadSubagentConfig(agentDir = getAgentDir(), onWarning) {
88
84
  const filePath = getSubagentConfigPath(agentDir);
89
85
  try {
90
86
  return parseSubagentConfig(await readFile(filePath, "utf8"));
@@ -92,13 +88,10 @@ export async function loadSubagentConfig(agentDir = getAgentDir()) {
92
88
  catch (error) {
93
89
  if (error.code === "ENOENT")
94
90
  return emptySubagentConfig();
95
- await resetSubagentConfigFile(filePath);
91
+ onWarning?.(configWarning(filePath, error));
96
92
  return emptySubagentConfig();
97
93
  }
98
94
  }
99
- // Queue-free write body: read-modify-write callers run their whole
100
- // transaction inside the queue, so saveSubagentConfig must not queue the
101
- // same path again — that would deadlock.
102
95
  async function writeSubagentConfigFile(filePath, config) {
103
96
  const payload = `${JSON.stringify({ version: SUBAGENT_CONFIG_VERSION, profiles: config.profiles }, null, 2)}\n`;
104
97
  await mkdir(dirname(filePath), { recursive: true });
@@ -117,14 +110,68 @@ async function writeSubagentConfigFile(filePath, config) {
117
110
  throw error;
118
111
  }
119
112
  }
113
+ async function backUpInvalidConfig(filePath, raw) {
114
+ for (let attempt = 0; attempt < BACKUP_ATTEMPTS; attempt++) {
115
+ const suffix = attempt === 0 ? "" : `-${attempt}`;
116
+ const backupPath = `${filePath}.invalid-${Date.now()}-${process.pid}${suffix}.bak`;
117
+ try {
118
+ await writeFile(backupPath, raw, { encoding: "utf8", mode: 0o600, flag: "wx" });
119
+ return backupPath;
120
+ }
121
+ catch (error) {
122
+ if (error.code === "EEXIST")
123
+ continue;
124
+ throw new Error(`Could not back up invalid ${SUBAGENT_CONFIG_FILE}: ${errorMessage(error)}`);
125
+ }
126
+ }
127
+ throw new Error(`Could not allocate a backup path for invalid ${SUBAGENT_CONFIG_FILE}.`);
128
+ }
129
+ async function withSubagentConfigLock(filePath, fn) {
130
+ await mkdir(dirname(filePath), { recursive: true });
131
+ let release;
132
+ try {
133
+ release = await lockfile.lock(filePath, {
134
+ realpath: false,
135
+ stale: LOCK_STALE_MS,
136
+ retries: LOCK_RETRY_OPTIONS,
137
+ });
138
+ }
139
+ catch (error) {
140
+ if (error.code === "ELOCKED") {
141
+ throw new Error(`Timed out waiting to update ${SUBAGENT_CONFIG_FILE}; another Pi process is saving it.`);
142
+ }
143
+ throw error;
144
+ }
145
+ try {
146
+ return await fn();
147
+ }
148
+ finally {
149
+ await release();
150
+ }
151
+ }
152
+ async function readConfigForMutation(filePath) {
153
+ let raw;
154
+ try {
155
+ raw = await readFile(filePath, "utf8");
156
+ }
157
+ catch (error) {
158
+ if (error.code === "ENOENT")
159
+ return { config: emptySubagentConfig() };
160
+ throw error;
161
+ }
162
+ try {
163
+ return { config: parseSubagentConfig(raw) };
164
+ }
165
+ catch {
166
+ return { config: emptySubagentConfig(), invalidRaw: raw };
167
+ }
168
+ }
120
169
  // Only keys present in the patch change; a key set to undefined clears
121
170
  // that override (back to inheriting the parent session).
122
171
  export async function updateProfileOverride(profile, patch, agentDir = getAgentDir()) {
123
172
  const filePath = getSubagentConfigPath(agentDir);
124
- // Load and write run inside one queue slot so concurrent updates to
125
- // different profiles cannot overwrite each other.
126
- return withFileMutationQueue(filePath, async () => {
127
- const config = await loadSubagentConfig(agentDir);
173
+ return withFileMutationQueue(filePath, () => withSubagentConfigLock(filePath, async () => {
174
+ const { config, invalidRaw } = await readConfigForMutation(filePath);
128
175
  const currentOverride = config.profiles[profile];
129
176
  const current = currentOverride ?? {};
130
177
  const next = { ...current };
@@ -146,12 +193,14 @@ export async function updateProfileOverride(profile, patch, agentDir = getAgentD
146
193
  current.thinking !== next.thinking;
147
194
  if (!changed)
148
195
  return config;
196
+ if (invalidRaw !== undefined)
197
+ await backUpInvalidConfig(filePath, invalidRaw);
149
198
  if (hasNext)
150
199
  config.profiles[profile] = next;
151
200
  else
152
201
  delete config.profiles[profile];
153
202
  await writeSubagentConfigFile(filePath, config);
154
203
  return config;
155
- });
204
+ }));
156
205
  }
157
206
  //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/subagent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport {\n\tSUBAGENT_AGENT_NAMES,\n\tSUBAGENT_CONFIG_FILE,\n\tSUBAGENT_CONFIG_VERSION,\n\ttype SubagentAgentName,\n\tTHINKING_LEVELS,\n} from \"./constants.ts\";\nimport type { SubagentConfigFile, SubagentProfileOverride } from \"./types.ts\";\n\nfunction isThinkingLevel(value: unknown): boolean {\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n// Overrides hold concrete values only; absence means \"inherit the parent\n// session\". The file format has no compatibility aliases.\nfunction normalizeOverride(value: unknown, profile: string): SubagentProfileOverride {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`Profile override for \"${profile}\" must be an object.`);\n\t}\n\tconst input = value as Record<string, unknown>;\n\tconst output: SubagentProfileOverride = {};\n\tif (input.model !== undefined) {\n\t\tif (typeof input.model !== \"string\" || input.model.trim().length === 0 || input.model === \"inherit\") {\n\t\t\tthrow new Error(`Profile \"${profile}\" model override must be a concrete model id.`);\n\t\t}\n\t\toutput.model = input.model.trim();\n\t}\n\tif (input.thinking !== undefined) {\n\t\tif (!isThinkingLevel(input.thinking)) {\n\t\t\tthrow new Error(`Profile \"${profile}\" thinking override is invalid.`);\n\t\t}\n\t\toutput.thinking = input.thinking as SubagentProfileOverride[\"thinking\"];\n\t}\n\tconst unknownKeys = Object.keys(input).filter((key) => key !== \"model\" && key !== \"thinking\");\n\tif (unknownKeys.length > 0) {\n\t\tthrow new Error(`Profile \"${profile}\" has unsupported setting(s): ${unknownKeys.join(\", \")}.`);\n\t}\n\treturn output;\n}\n\nexport function getSubagentConfigPath(agentDir = getAgentDir()): string {\n\treturn join(agentDir, SUBAGENT_CONFIG_FILE);\n}\n\nexport function emptySubagentConfig(): SubagentConfigFile {\n\treturn { version: SUBAGENT_CONFIG_VERSION, profiles: {} };\n}\n\nexport function parseSubagentConfig(raw: string): SubagentConfigFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} is not valid JSON.`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} must be a JSON object.`);\n\t}\n\tconst root = parsed as Record<string, unknown>;\n\tif (root.version !== SUBAGENT_CONFIG_VERSION) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} has unsupported version ${String(root.version)}.`);\n\t}\n\tif (\n\t\troot.profiles !== undefined &&\n\t\t(!root.profiles || typeof root.profiles !== \"object\" || Array.isArray(root.profiles))\n\t) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} profiles must be an object.`);\n\t}\n\tconst profiles: Record<string, SubagentProfileOverride> = {};\n\tfor (const [name, value] of Object.entries((root.profiles as Record<string, unknown> | undefined) ?? {})) {\n\t\t// The only profiles are the two built-in ones; unknown keys are rejected\n\t\t// outright (no legacy aliases or compatibility mapping).\n\t\tif (!(SUBAGENT_AGENT_NAMES as readonly string[]).includes(name)) {\n\t\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} contains unknown profile \"${name}\".`);\n\t\t}\n\t\tprofiles[name] = normalizeOverride(value, name);\n\t}\n\tconst unknownKeys = Object.keys(root).filter((key) => key !== \"version\" && key !== \"profiles\");\n\tif (unknownKeys.length > 0)\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} has unsupported field(s): ${unknownKeys.join(\", \")}.`);\n\treturn { version: SUBAGENT_CONFIG_VERSION, profiles };\n}\n\n// A stale or invalid config (older formats, unknown profiles, malformed\n// JSON) must not block every subagent call: reset it to an empty, fully\n// inheriting config. The reset is best-effort — when the write fails the\n// caller still gets the empty config and the next load retries the reset.\nasync function resetSubagentConfigFile(filePath: string): Promise<void> {\n\ttry {\n\t\tawait writeSubagentConfigFile(filePath, emptySubagentConfig());\n\t} catch {\n\t\t// Keep the original failure invisible to callers; an unwritable config\n\t\t// file is a setup problem, not a reason to fail the subagent call.\n\t}\n}\n\nexport async function loadSubagentConfig(agentDir = getAgentDir()): Promise<SubagentConfigFile> {\n\tconst filePath = getSubagentConfigPath(agentDir);\n\ttry {\n\t\treturn parseSubagentConfig(await readFile(filePath, \"utf8\"));\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptySubagentConfig();\n\t\tawait resetSubagentConfigFile(filePath);\n\t\treturn emptySubagentConfig();\n\t}\n}\n\n// Queue-free write body: read-modify-write callers run their whole\n// transaction inside the queue, so saveSubagentConfig must not queue the\n// same path again — that would deadlock.\nasync function writeSubagentConfigFile(filePath: string, config: SubagentConfigFile): Promise<void> {\n\tconst payload = `${JSON.stringify({ version: SUBAGENT_CONFIG_VERSION, profiles: config.profiles }, null, 2)}\\n`;\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n\ttry {\n\t\tawait writeFile(tempPath, payload, { encoding: \"utf8\", mode: 0o600 });\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait unlink(tempPath);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors and preserve the original failure.\n\t\t}\n\t\tthrow error;\n\t}\n}\n\n// Only keys present in the patch change; a key set to undefined clears\n// that override (back to inheriting the parent session).\nexport async function updateProfileOverride(\n\tprofile: SubagentAgentName,\n\tpatch: Partial<SubagentProfileOverride>,\n\tagentDir = getAgentDir(),\n): Promise<SubagentConfigFile> {\n\tconst filePath = getSubagentConfigPath(agentDir);\n\t// Load and write run inside one queue slot so concurrent updates to\n\t// different profiles cannot overwrite each other.\n\treturn withFileMutationQueue(filePath, async () => {\n\t\tconst config = await loadSubagentConfig(agentDir);\n\t\tconst currentOverride = config.profiles[profile];\n\t\tconst current = currentOverride ?? {};\n\t\tconst next: SubagentProfileOverride = { ...current };\n\t\tif (\"model\" in patch) {\n\t\t\tif (patch.model === undefined) delete next.model;\n\t\t\telse next.model = patch.model;\n\t\t}\n\t\tif (\"thinking\" in patch) {\n\t\t\tif (patch.thinking === undefined) delete next.thinking;\n\t\t\telse next.thinking = patch.thinking;\n\t\t}\n\t\tconst hasNext = Object.keys(next).length > 0;\n\t\tconst changed =\n\t\t\t(currentOverride !== undefined) !== hasNext ||\n\t\t\tcurrent.model !== next.model ||\n\t\t\tcurrent.thinking !== next.thinking;\n\t\tif (!changed) return config;\n\t\tif (hasNext) config.profiles[profile] = next;\n\t\telse delete config.profiles[profile];\n\t\tawait writeSubagentConfigFile(filePath, config);\n\t\treturn config;\n\t});\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/extensions/subagent/settings.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport lockfile from \"proper-lockfile\";\nimport { getAgentDir } from \"../../config.ts\";\nimport { withFileMutationQueue } from \"../../core/tools/file-mutation-queue.ts\";\nimport {\n\tSUBAGENT_AGENT_NAMES,\n\tSUBAGENT_CONFIG_FILE,\n\tSUBAGENT_CONFIG_VERSION,\n\ttype SubagentAgentName,\n\tTHINKING_LEVELS,\n} from \"./constants.ts\";\nimport type { SubagentConfigFile, SubagentProfileOverride } from \"./types.ts\";\n\nconst LOCK_STALE_MS = 10_000;\nconst LOCK_RETRY_OPTIONS = { retries: 5, factor: 2, minTimeout: 20, maxTimeout: 200 } as const;\nconst BACKUP_ATTEMPTS = 100;\n\nfunction isThinkingLevel(value: unknown): boolean {\n\treturn typeof value === \"string\" && (THINKING_LEVELS as readonly string[]).includes(value);\n}\n\n// Overrides hold concrete values only; absence means \"inherit the parent\n// session\". The file format has no compatibility aliases.\nfunction normalizeOverride(value: unknown, profile: string): SubagentProfileOverride {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(`Profile override for \"${profile}\" must be an object.`);\n\t}\n\tconst input = value as Record<string, unknown>;\n\tconst output: SubagentProfileOverride = {};\n\tif (input.model !== undefined) {\n\t\tif (typeof input.model !== \"string\" || input.model.trim().length === 0 || input.model === \"inherit\") {\n\t\t\tthrow new Error(`Profile \"${profile}\" model override must be a concrete model id.`);\n\t\t}\n\t\toutput.model = input.model.trim();\n\t}\n\tif (input.thinking !== undefined) {\n\t\tif (!isThinkingLevel(input.thinking)) {\n\t\t\tthrow new Error(`Profile \"${profile}\" thinking override is invalid.`);\n\t\t}\n\t\toutput.thinking = input.thinking as SubagentProfileOverride[\"thinking\"];\n\t}\n\tconst unknownKeys = Object.keys(input).filter((key) => key !== \"model\" && key !== \"thinking\");\n\tif (unknownKeys.length > 0) {\n\t\tthrow new Error(`Profile \"${profile}\" has unsupported setting(s): ${unknownKeys.join(\", \")}.`);\n\t}\n\treturn output;\n}\n\nexport function getSubagentConfigPath(agentDir = getAgentDir()): string {\n\treturn join(agentDir, SUBAGENT_CONFIG_FILE);\n}\n\nexport function emptySubagentConfig(): SubagentConfigFile {\n\treturn { version: SUBAGENT_CONFIG_VERSION, profiles: {} };\n}\n\nexport function parseSubagentConfig(raw: string): SubagentConfigFile {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} is not valid JSON.`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} must be a JSON object.`);\n\t}\n\tconst root = parsed as Record<string, unknown>;\n\tif (root.version !== SUBAGENT_CONFIG_VERSION) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} has unsupported version ${String(root.version)}.`);\n\t}\n\tif (\n\t\troot.profiles !== undefined &&\n\t\t(!root.profiles || typeof root.profiles !== \"object\" || Array.isArray(root.profiles))\n\t) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} profiles must be an object.`);\n\t}\n\tconst profiles: Record<string, SubagentProfileOverride> = {};\n\tfor (const [name, value] of Object.entries((root.profiles as Record<string, unknown> | undefined) ?? {})) {\n\t\tif (!(SUBAGENT_AGENT_NAMES as readonly string[]).includes(name)) {\n\t\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} contains unknown profile \"${name}\".`);\n\t\t}\n\t\tprofiles[name] = normalizeOverride(value, name);\n\t}\n\tconst unknownKeys = Object.keys(root).filter((key) => key !== \"version\" && key !== \"profiles\");\n\tif (unknownKeys.length > 0) {\n\t\tthrow new Error(`${SUBAGENT_CONFIG_FILE} has unsupported field(s): ${unknownKeys.join(\", \")}.`);\n\t}\n\treturn { version: SUBAGENT_CONFIG_VERSION, profiles };\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction configWarning(filePath: string, error: unknown): string {\n\treturn `Ignoring invalid Subagent settings at ${filePath}; the file was left unchanged. ${errorMessage(error)}`;\n}\n\nexport async function loadSubagentConfig(\n\tagentDir = getAgentDir(),\n\tonWarning?: (message: string) => void,\n): Promise<SubagentConfigFile> {\n\tconst filePath = getSubagentConfigPath(agentDir);\n\ttry {\n\t\treturn parseSubagentConfig(await readFile(filePath, \"utf8\"));\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptySubagentConfig();\n\t\tonWarning?.(configWarning(filePath, error));\n\t\treturn emptySubagentConfig();\n\t}\n}\n\nasync function writeSubagentConfigFile(filePath: string, config: SubagentConfigFile): Promise<void> {\n\tconst payload = `${JSON.stringify({ version: SUBAGENT_CONFIG_VERSION, profiles: config.profiles }, null, 2)}\\n`;\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;\n\ttry {\n\t\tawait writeFile(tempPath, payload, { encoding: \"utf8\", mode: 0o600 });\n\t\tawait rename(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait unlink(tempPath);\n\t\t} catch {\n\t\t\t// Ignore cleanup errors and preserve the original failure.\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nasync function backUpInvalidConfig(filePath: string, raw: string): Promise<string> {\n\tfor (let attempt = 0; attempt < BACKUP_ATTEMPTS; attempt++) {\n\t\tconst suffix = attempt === 0 ? \"\" : `-${attempt}`;\n\t\tconst backupPath = `${filePath}.invalid-${Date.now()}-${process.pid}${suffix}.bak`;\n\t\ttry {\n\t\t\tawait writeFile(backupPath, raw, { encoding: \"utf8\", mode: 0o600, flag: \"wx\" });\n\t\t\treturn backupPath;\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"EEXIST\") continue;\n\t\t\tthrow new Error(`Could not back up invalid ${SUBAGENT_CONFIG_FILE}: ${errorMessage(error)}`);\n\t\t}\n\t}\n\tthrow new Error(`Could not allocate a backup path for invalid ${SUBAGENT_CONFIG_FILE}.`);\n}\n\nasync function withSubagentConfigLock<T>(filePath: string, fn: () => Promise<T>): Promise<T> {\n\tawait mkdir(dirname(filePath), { recursive: true });\n\tlet release: (() => Promise<void>) | undefined;\n\ttry {\n\t\trelease = await lockfile.lock(filePath, {\n\t\t\trealpath: false,\n\t\t\tstale: LOCK_STALE_MS,\n\t\t\tretries: LOCK_RETRY_OPTIONS,\n\t\t});\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ELOCKED\") {\n\t\t\tthrow new Error(`Timed out waiting to update ${SUBAGENT_CONFIG_FILE}; another Pi process is saving it.`);\n\t\t}\n\t\tthrow error;\n\t}\n\ttry {\n\t\treturn await fn();\n\t} finally {\n\t\tawait release();\n\t}\n}\n\ninterface MutationConfigRead {\n\tconfig: SubagentConfigFile;\n\tinvalidRaw?: string;\n}\n\nasync function readConfigForMutation(filePath: string): Promise<MutationConfigRead> {\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(filePath, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return { config: emptySubagentConfig() };\n\t\tthrow error;\n\t}\n\ttry {\n\t\treturn { config: parseSubagentConfig(raw) };\n\t} catch {\n\t\treturn { config: emptySubagentConfig(), invalidRaw: raw };\n\t}\n}\n\n// Only keys present in the patch change; a key set to undefined clears\n// that override (back to inheriting the parent session).\nexport async function updateProfileOverride(\n\tprofile: SubagentAgentName,\n\tpatch: Partial<SubagentProfileOverride>,\n\tagentDir = getAgentDir(),\n): Promise<SubagentConfigFile> {\n\tconst filePath = getSubagentConfigPath(agentDir);\n\treturn withFileMutationQueue(filePath, () =>\n\t\twithSubagentConfigLock(filePath, async () => {\n\t\t\tconst { config, invalidRaw } = await readConfigForMutation(filePath);\n\t\t\tconst currentOverride = config.profiles[profile];\n\t\t\tconst current = currentOverride ?? {};\n\t\t\tconst next: SubagentProfileOverride = { ...current };\n\t\t\tif (\"model\" in patch) {\n\t\t\t\tif (patch.model === undefined) delete next.model;\n\t\t\t\telse next.model = patch.model;\n\t\t\t}\n\t\t\tif (\"thinking\" in patch) {\n\t\t\t\tif (patch.thinking === undefined) delete next.thinking;\n\t\t\t\telse next.thinking = patch.thinking;\n\t\t\t}\n\t\t\tconst hasNext = Object.keys(next).length > 0;\n\t\t\tconst changed =\n\t\t\t\t(currentOverride !== undefined) !== hasNext ||\n\t\t\t\tcurrent.model !== next.model ||\n\t\t\t\tcurrent.thinking !== next.thinking;\n\t\t\tif (!changed) return config;\n\t\t\tif (invalidRaw !== undefined) await backUpInvalidConfig(filePath, invalidRaw);\n\t\t\tif (hasNext) config.profiles[profile] = next;\n\t\t\telse delete config.profiles[profile];\n\t\t\tawait writeSubagentConfigFile(filePath, config);\n\t\t\treturn config;\n\t\t}),\n\t);\n}\n"]}
@@ -77,6 +77,7 @@ export declare function createRunState(task: ResolvedSubagentTask, index: number
77
77
  /** Strips internal fields for projection into the public details shape. */
78
78
  export declare function toRunDetails(state: SubagentRunState): SubagentRunDetails;
79
79
  export declare function deriveCurrentActivity(state: SubagentRunState): string | undefined;
80
+ /** Append one bounded activity while preserving the display tail. */
80
81
  export declare function appendActivity(activities: ToolActivity[], activity: ToolActivity): void;
81
82
  /**
82
83
  * Pure transition function; timestamps and deadlines arrive in the event.
@@ -1 +1 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAqBnD,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1G;;;;GAIG;AACH,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB;IAC3D,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC5C;IACA,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,GACD;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,2BAA2B,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAA;CAAE,GAC/D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAChG;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACjD;IACA,IAAI,EAAE,kBAAkB,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACf,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACf,GACD;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAsBrD,wBAAgB,cAAc,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,SAAS,EAAE,MAAM,GACf,gBAAgB,CAgBlB;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,gBAAgB,GAAG,kBAAkB,CAGxE;AAKD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAQjF;AAyDD,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,UAAU,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAGvF;AAqBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAY5F;AAsMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM,CAIpE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,CASvF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,OAAO,CAK1F;AAiBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAE9D;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,SAAa,GAAG,iBAAiB,GAAG,SAAS,CAY7G"}
@@ -1,6 +1,6 @@
1
1
  import { relative } from "node:path";
2
- import { activitySummary, addUsage, compactionError, compactionSummary, emptyUsage, resultSummary, } from "./activity.js";
3
- import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, COMPACTION_ACTIVITY_ID, ERROR_TEXT_LIMIT, RETRY_ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT, } from "./constants.js";
2
+ import { activitySummary, addUsage, compactionError, compactionSummary, emptyUsage, isDisplayableActivity, resultSummary, } from "./activity.js";
3
+ import { ACTIVITY_LIMIT, ACTIVITY_TEXT_LIMIT, COMPACTION_ACTIVITY_ID, DISPLAY_ACTIVITY_LIMIT, ERROR_TEXT_LIMIT, RETRY_ERROR_TEXT_LIMIT, TASK_OUTPUT_LIMIT, } from "./constants.js";
4
4
  import { modelId } from "./model-selection.js";
5
5
  import { boundText } from "./text.js";
6
6
  function runId(batchId, index) {
@@ -75,22 +75,48 @@ function makeRetry(attempt, maxAttempts, deadline, error) {
75
75
  error: retryError(error),
76
76
  };
77
77
  }
78
- // The in-memory activity log keeps the newest entries within both the count
79
- // and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces
80
- // incremental byte bookkeeping. Exported for direct budget tests: real
81
- // events bound every summary, so the text-budget eviction is otherwise
82
- // purely defensive.
83
- export function appendActivity(activities, activity) {
84
- activities.push(activity);
85
- while (activities.length > ACTIVITY_LIMIT)
86
- activities.shift();
87
- while (activities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0) >
88
- ACTIVITY_TEXT_LIMIT) {
89
- if (activities.length <= 1)
78
+ // Prefer evicting entries outside the latest three real tool calls so a run
79
+ // with repeated synthetic compactions still retains the Activity tail the UI
80
+ // promises. The defensive fallback preserves the hard text budget when an
81
+ // adversarial caller bypasses normal per-event summary bounds.
82
+ function oldestEvictableActivityIndex(activities) {
83
+ const protectedIndexes = new Set();
84
+ for (let index = activities.length - 1; index >= 0 && protectedIndexes.size < DISPLAY_ACTIVITY_LIMIT; index--) {
85
+ const activity = activities[index];
86
+ if (activity && isDisplayableActivity(activity))
87
+ protectedIndexes.add(index);
88
+ }
89
+ const unprotected = activities.findIndex((_activity, index) => !protectedIndexes.has(index));
90
+ if (unprotected >= 0)
91
+ return unprotected;
92
+ return activities.length > 1 ? 0 : -1;
93
+ }
94
+ function activityTextSize(activities) {
95
+ return activities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0);
96
+ }
97
+ // The in-memory activity log stays within both count and text budgets; a
98
+ // bounded O(ACTIVITY_LIMIT) rescan per event replaces incremental byte
99
+ // bookkeeping. Real events bound every individual summary, so retaining one
100
+ // oversized adversarial entry is the only permitted budget exception.
101
+ function enforceActivityLimits(activities) {
102
+ while (activities.length > ACTIVITY_LIMIT) {
103
+ const index = oldestEvictableActivityIndex(activities);
104
+ if (index < 0)
105
+ break;
106
+ activities.splice(index, 1);
107
+ }
108
+ while (activityTextSize(activities) > ACTIVITY_TEXT_LIMIT) {
109
+ const index = oldestEvictableActivityIndex(activities);
110
+ if (index < 0)
90
111
  break;
91
- activities.shift();
112
+ activities.splice(index, 1);
92
113
  }
93
114
  }
115
+ /** Append one bounded activity while preserving the display tail. */
116
+ export function appendActivity(activities, activity) {
117
+ activities.push(activity);
118
+ enforceActivityLimits(activities);
119
+ }
94
120
  function isTerminal(state) {
95
121
  return state.status === "completed" || state.status === "failed" || state.status === "aborted";
96
122
  }
@@ -178,8 +204,10 @@ function handleToolUpdated(draft, event) {
178
204
  const summary = activitySummary(event.toolName, event.args);
179
205
  const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === "running") ??
180
206
  [...draft.activities].reverse().find((candidate) => candidate.status === "running");
181
- if (activity)
207
+ if (activity) {
182
208
  activity.summary = summary;
209
+ enforceActivityLimits(draft.activities);
210
+ }
183
211
  }
184
212
  function handleToolEnded(draft, event) {
185
213
  const activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);
@@ -187,6 +215,7 @@ function handleToolEnded(draft, event) {
187
215
  activity.status = event.isError ? "failed" : "succeeded";
188
216
  activity.endedAt = event.endedAt;
189
217
  activity.resultSummary = resultSummary(event.result) || undefined;
218
+ enforceActivityLimits(draft.activities);
190
219
  }
191
220
  }
192
221
  function handleCompactionStarted(draft, event) {
@@ -207,6 +236,7 @@ function handleCompactionEnded(draft, event) {
207
236
  activity.endedAt = event.endedAt;
208
237
  activity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);
209
238
  activity.resultSummary = event.error ? compactionError(event.error) : undefined;
239
+ enforceActivityLimits(draft.activities);
210
240
  }
211
241
  }
212
242
  function handleSettle(draft, event) {
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tcompactionError,\n\tcompactionSummary,\n\temptyUsage,\n\tresultSummary,\n} from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tCOMPACTION_ACTIVITY_ID,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| { type: \"compaction_started\"; startedAt: number }\n\t| {\n\t\t\ttype: \"compaction_ended\";\n\t\t\ttokensBefore: number | undefined;\n\t\t\ttokensAfter: number | undefined;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// The in-memory activity log keeps the newest entries within both the count\n// and text budgets; a bounded O(ACTIVITY_LIMIT) rescan per event replaces\n// incremental byte bookkeeping. Exported for direct budget tests: real\n// events bound every summary, so the text-budget eviction is otherwise\n// purely defensive.\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\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\treturn withRevision(state, (draft) => {\n\t\t// Cross-cutting pre-hook: every event clears the retry view except\n\t\t// retry_scheduled (which sets it) and the two abort-terminal events\n\t\t// (which clear it explicitly in their own body).\n\t\tif (event.type !== \"retry_scheduled\") clearRetry(draft);\n\t\tapplyEvent(draft, event);\n\t\t// Cross-cutting post-hook: derive the live activity line from the\n\t\t// new state. Terminal abort events override this to undefined.\n\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t});\n}\n\n// ─── Individual event handlers ───────────────────────────────────────────────\n// Each handler mutates the draft in place. Cross-cutting clearRetry and\n// deriveCurrentActivity are handled by the dispatch layer above.\n\nfunction handleSlotAcquired(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"slot_acquired\" }>,\n): void {\n\tdraft.status = \"running\";\n\tdraft.startedAt = event.startedAt;\n}\n\nfunction handleRetryScheduled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"retry_scheduled\" }>,\n): void {\n\t// Full reset: only runs that produced nothing are retried, so nothing of\n\t// value is discarded. The retry view stays visible through the backoff.\n\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\tdraft.status = \"queued\";\n\tdraft.error = undefined;\n\tdraft.startedAt = undefined;\n\tdraft.endedAt = undefined;\n\tdraft.report = \"\";\n\tdraft.activities = [];\n\tdraft.usage = emptyUsage();\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n}\n\nfunction handleRetryStarted(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleAutoRetryStart(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"auto_retry_start\" }>,\n): void {\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n}\n\nfunction handleAutoRetryEnd(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleTurnEnd(draft: SubagentRunState): void {\n\tdraft.usage.turns++;\n}\n\nfunction handleAssistantMessageSettled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"assistant_message_settled\" }>,\n): void {\n\taddUsage(draft.usage, event.usage);\n}\n\nfunction handleToolStarted(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_started\" }>): void {\n\tdraft.usage.toolUses++;\n\tappendActivity(draft.activities, {\n\t\tid: event.toolCallId,\n\t\ttoolName: event.toolName,\n\t\tsummary: activitySummary(event.toolName, event.args),\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleToolUpdated(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_updated\" }>): void {\n\tconst summary = activitySummary(event.toolName, event.args);\n\tconst activity =\n\t\tdraft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === \"running\") ??\n\t\t[...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\tif (activity) activity.summary = summary;\n}\n\nfunction handleToolEnded(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_ended\" }>): void {\n\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\tif (activity && activity.status === \"running\") {\n\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t}\n}\n\nfunction handleCompactionStarted(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_started\" }>,\n): void {\n\tappendActivity(draft.activities, {\n\t\tid: COMPACTION_ACTIVITY_ID,\n\t\ttoolName: COMPACTION_ACTIVITY_ID,\n\t\tsummary: \"Compacting context…\",\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleCompactionEnded(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_ended\" }>,\n): void {\n\tconst activity = [...draft.activities]\n\t\t.reverse()\n\t\t.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === \"running\");\n\tif (activity) {\n\t\tactivity.status = event.error ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);\n\t\tactivity.resultSummary = event.error ? compactionError(event.error) : undefined;\n\t}\n}\n\nfunction handleSettle(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"settle\" }>): void {\n\tdraft.status = event.verdict;\n\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileQueued(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_queued\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while queued.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileRetrying(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_retrying\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction applyEvent(draft: SubagentRunState, event: SubagentRunEvent): void {\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\thandleSlotAcquired(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_scheduled\":\n\t\t\thandleRetryScheduled(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_started\":\n\t\t\thandleRetryStarted(draft);\n\t\t\tbreak;\n\t\tcase \"auto_retry_start\":\n\t\t\thandleAutoRetryStart(draft, event);\n\t\t\tbreak;\n\t\tcase \"auto_retry_end\":\n\t\t\thandleAutoRetryEnd(draft);\n\t\t\tbreak;\n\t\tcase \"turn_end\":\n\t\t\thandleTurnEnd(draft);\n\t\t\tbreak;\n\t\tcase \"assistant_message_settled\":\n\t\t\thandleAssistantMessageSettled(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_started\":\n\t\t\thandleToolStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_updated\":\n\t\t\thandleToolUpdated(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_ended\":\n\t\t\thandleToolEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_started\":\n\t\t\thandleCompactionStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_ended\":\n\t\t\thandleCompactionEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"settle\":\n\t\t\thandleSettle(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_queued\":\n\t\t\thandleAbortWhileQueued(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_retrying\":\n\t\t\thandleAbortWhileRetrying(draft, event);\n\t\t\tbreak;\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/extensions/subagent/state.ts"],"names":[],"mappings":"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","sourcesContent":["import { relative } from \"node:path\";\nimport type { Usage } from \"@earendil-works/pi-ai\";\nimport {\n\tactivitySummary,\n\taddUsage,\n\tcompactionError,\n\tcompactionSummary,\n\temptyUsage,\n\tisDisplayableActivity,\n\tresultSummary,\n} from \"./activity.ts\";\nimport {\n\tACTIVITY_LIMIT,\n\tACTIVITY_TEXT_LIMIT,\n\tCOMPACTION_ACTIVITY_ID,\n\tDISPLAY_ACTIVITY_LIMIT,\n\tERROR_TEXT_LIMIT,\n\tRETRY_ERROR_TEXT_LIMIT,\n\tTASK_OUTPUT_LIMIT,\n} from \"./constants.ts\";\nimport { modelId } from \"./model-selection.ts\";\nimport { boundText } from \"./text.ts\";\nimport type { ResolvedSubagentTask, SubagentDetails, SubagentRunDetails, ToolActivity } from \"./types.ts\";\n\n/**\n * Mutable-run state plus an internal revision counter. All transitions go\n * through {@link reduceRun}; the batch runner compares version sums instead\n * of diffing rendered fields.\n */\nexport interface SubagentRunState extends SubagentRunDetails {\n\t/** Monotonic per-run revision; bumped by every applied event. */\n\tversion: number;\n}\n\n/** The adapter layer's only output and the reducer's only input. */\nexport type SubagentRunEvent =\n\t| { type: \"slot_acquired\"; startedAt: number }\n\t| {\n\t\t\ttype: \"retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdeadline: number;\n\t\t\terror: string | undefined;\n\t }\n\t| { type: \"retry_started\" }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; deadline: number; error: string }\n\t| { type: \"auto_retry_end\" }\n\t| { type: \"turn_end\" }\n\t| { type: \"assistant_message_settled\"; usage: Usage | undefined }\n\t| { type: \"tool_started\"; toolCallId: string; toolName: string; args: unknown; startedAt: number }\n\t| { type: \"tool_updated\"; toolCallId: string; toolName: string; args: unknown }\n\t| { type: \"tool_ended\"; toolCallId: string; result: unknown; isError: boolean; endedAt: number }\n\t| { type: \"compaction_started\"; startedAt: number }\n\t| {\n\t\t\ttype: \"compaction_ended\";\n\t\t\ttokensBefore: number | undefined;\n\t\t\ttokensAfter: number | undefined;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| {\n\t\t\ttype: \"settle\";\n\t\t\tverdict: \"completed\" | \"failed\" | \"aborted\";\n\t\t\treport: string;\n\t\t\terror: string | undefined;\n\t\t\tendedAt: number;\n\t }\n\t| { type: \"abort_while_queued\"; endedAt: number }\n\t| { type: \"abort_while_retrying\"; endedAt: number };\n\nfunction runId(batchId: string | undefined, index: number): string {\n\tif (!batchId) return `subagent-${index + 1}`;\n\t// toolCallIds are provider-shaped (\"call_ABC...\"); keep the readable\n\t// prefix, then disambiguate truncated collisions with a deterministic\n\t// hash of the full id.\n\tconst sanitized = batchId.replace(/[^A-Za-z0-9-]+/gu, \"-\").replace(/^-+|-+$/gu, \"\");\n\tconst hash = hashRunId(batchId);\n\tconst prefix = sanitized.length > 24 ? `${sanitized.slice(0, 24)}-${hash}` : sanitized || `run-${hash}`;\n\treturn `${prefix}-${index + 1}`;\n}\n\nfunction hashRunId(value: string): string {\n\tlet hash = 0x811c9dc5;\n\tfor (let index = 0; index < value.length; index++) {\n\t\thash ^= value.charCodeAt(index);\n\t\thash = Math.imul(hash, 0x01000193);\n\t}\n\treturn (hash >>> 0).toString(36).padStart(6, \"0\").slice(0, 6);\n}\n\nexport function createRunState(\n\ttask: ResolvedSubagentTask,\n\tindex: number,\n\tbatchId: string | undefined,\n\tparentCwd: string,\n): SubagentRunState {\n\treturn {\n\t\tid: runId(batchId, index),\n\t\tagent: task.agent.name,\n\t\tdescription: task.description,\n\t\t// Display-only relative path; the worker session itself uses the\n\t\t// resolved absolute task.cwd. Empty means \"same as the parent\".\n\t\tcwd: relative(parentCwd, task.cwd),\n\t\tmodel: modelId(task.model),\n\t\tthinking: task.thinking,\n\t\tstatus: \"queued\",\n\t\tactivities: [],\n\t\treport: \"\",\n\t\tusage: emptyUsage(),\n\t\tversion: 0,\n\t};\n}\n\n/** Strips internal fields for projection into the public details shape. */\nexport function toRunDetails(state: SubagentRunState): SubagentRunDetails {\n\tconst { version: _version, ...details } = state;\n\treturn details;\n}\n\n// The live \"current activity\" line is derived, never imperative: a pending\n// retry wins, then the most recent still-running tool. This is what keeps a\n// parallel batch's line correct when tools end out of order.\nexport function deriveCurrentActivity(state: SubagentRunState): string | undefined {\n\tif (state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\") return undefined;\n\tif (state.retry) return `Retrying (${state.retry.attempt}/${state.retry.maxAttempts})…`;\n\tfor (let index = state.activities.length - 1; index >= 0; index--) {\n\t\tconst activity = state.activities[index];\n\t\tif (activity?.status === \"running\") return activity.summary;\n\t}\n\treturn undefined;\n}\n\nfunction positiveInteger(value: number, fallback: number): number {\n\treturn Number.isFinite(value) ? Math.max(1, Math.floor(value)) : fallback;\n}\n\nfunction retryError(error: string): string {\n\tconst normalized = error.replace(/\\s+/gu, \" \").trim();\n\treturn boundText(normalized, RETRY_ERROR_TEXT_LIMIT).replace(/\\s+/gu, \" \").trim();\n}\n\nfunction makeRetry(attempt: number, maxAttempts: number, deadline: number, error: string): SubagentRunState[\"retry\"] {\n\tconst normalizedAttempt = positiveInteger(attempt, 1);\n\treturn {\n\t\tattempt: normalizedAttempt,\n\t\tmaxAttempts: Math.max(normalizedAttempt, positiveInteger(maxAttempts, normalizedAttempt)),\n\t\tdeadline,\n\t\terror: retryError(error),\n\t};\n}\n\n// Prefer evicting entries outside the latest three real tool calls so a run\n// with repeated synthetic compactions still retains the Activity tail the UI\n// promises. The defensive fallback preserves the hard text budget when an\n// adversarial caller bypasses normal per-event summary bounds.\nfunction oldestEvictableActivityIndex(activities: readonly ToolActivity[]): number {\n\tconst protectedIndexes = new Set<number>();\n\tfor (let index = activities.length - 1; index >= 0 && protectedIndexes.size < DISPLAY_ACTIVITY_LIMIT; index--) {\n\t\tconst activity = activities[index];\n\t\tif (activity && isDisplayableActivity(activity)) protectedIndexes.add(index);\n\t}\n\tconst unprotected = activities.findIndex((_activity, index) => !protectedIndexes.has(index));\n\tif (unprotected >= 0) return unprotected;\n\treturn activities.length > 1 ? 0 : -1;\n}\n\nfunction activityTextSize(activities: readonly ToolActivity[]): number {\n\treturn activities.reduce((total, item) => total + item.summary.length + (item.resultSummary?.length ?? 0), 0);\n}\n\n// The in-memory activity log stays within both count and text budgets; a\n// bounded O(ACTIVITY_LIMIT) rescan per event replaces incremental byte\n// bookkeeping. Real events bound every individual summary, so retaining one\n// oversized adversarial entry is the only permitted budget exception.\nfunction enforceActivityLimits(activities: ToolActivity[]): void {\n\twhile (activities.length > ACTIVITY_LIMIT) {\n\t\tconst index = oldestEvictableActivityIndex(activities);\n\t\tif (index < 0) break;\n\t\tactivities.splice(index, 1);\n\t}\n\twhile (activityTextSize(activities) > ACTIVITY_TEXT_LIMIT) {\n\t\tconst index = oldestEvictableActivityIndex(activities);\n\t\tif (index < 0) break;\n\t\tactivities.splice(index, 1);\n\t}\n}\n\n/** Append one bounded activity while preserving the display tail. */\nexport function appendActivity(activities: ToolActivity[], activity: ToolActivity): void {\n\tactivities.push(activity);\n\tenforceActivityLimits(activities);\n}\n\nfunction isTerminal(state: SubagentRunState): boolean {\n\treturn state.status === \"completed\" || state.status === \"failed\" || state.status === \"aborted\";\n}\n\nfunction withRevision(state: SubagentRunState, mutate: (draft: SubagentRunState) => void): SubagentRunState {\n\tconst draft: SubagentRunState = {\n\t\t...state,\n\t\tactivities: state.activities.map((activity) => ({ ...activity })),\n\t\tusage: { ...state.usage },\n\t};\n\tmutate(draft);\n\tdraft.version = state.version + 1;\n\treturn draft;\n}\n\nfunction clearRetry(draft: SubagentRunState): void {\n\tdraft.retry = undefined;\n}\n\n/**\n * Pure transition function; timestamps and deadlines arrive in the event.\n * Events applied after a terminal verdict are ignored (settle is idempotent)\n * — except retry_scheduled, the one sanctioned reopening transition.\n */\nexport function reduceRun(state: SubagentRunState, event: SubagentRunEvent): SubagentRunState {\n\tif (isTerminal(state) && event.type !== \"retry_scheduled\") return state;\n\treturn withRevision(state, (draft) => {\n\t\t// Cross-cutting pre-hook: every event clears the retry view except\n\t\t// retry_scheduled (which sets it) and the two abort-terminal events\n\t\t// (which clear it explicitly in their own body).\n\t\tif (event.type !== \"retry_scheduled\") clearRetry(draft);\n\t\tapplyEvent(draft, event);\n\t\t// Cross-cutting post-hook: derive the live activity line from the\n\t\t// new state. Terminal abort events override this to undefined.\n\t\tdraft.currentActivity = deriveCurrentActivity(draft);\n\t});\n}\n\n// ─── Individual event handlers ───────────────────────────────────────────────\n// Each handler mutates the draft in place. Cross-cutting clearRetry and\n// deriveCurrentActivity are handled by the dispatch layer above.\n\nfunction handleSlotAcquired(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"slot_acquired\" }>,\n): void {\n\tdraft.status = \"running\";\n\tdraft.startedAt = event.startedAt;\n}\n\nfunction handleRetryScheduled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"retry_scheduled\" }>,\n): void {\n\t// Full reset: only runs that produced nothing are retried, so nothing of\n\t// value is discarded. The retry view stays visible through the backoff.\n\tconst error = draft.error ?? \"Subagent failed before retry.\";\n\tdraft.status = \"queued\";\n\tdraft.error = undefined;\n\tdraft.startedAt = undefined;\n\tdraft.endedAt = undefined;\n\tdraft.report = \"\";\n\tdraft.activities = [];\n\tdraft.usage = emptyUsage();\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, error);\n}\n\nfunction handleRetryStarted(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleAutoRetryStart(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"auto_retry_start\" }>,\n): void {\n\tdraft.retry = makeRetry(event.attempt, event.maxAttempts, event.deadline, event.error);\n}\n\nfunction handleAutoRetryEnd(draft: SubagentRunState): void {\n\t// No-op beyond the cross-cutting clearRetry already applied.\n\tvoid draft;\n}\n\nfunction handleTurnEnd(draft: SubagentRunState): void {\n\tdraft.usage.turns++;\n}\n\nfunction handleAssistantMessageSettled(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"assistant_message_settled\" }>,\n): void {\n\taddUsage(draft.usage, event.usage);\n}\n\nfunction handleToolStarted(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_started\" }>): void {\n\tdraft.usage.toolUses++;\n\tappendActivity(draft.activities, {\n\t\tid: event.toolCallId,\n\t\ttoolName: event.toolName,\n\t\tsummary: activitySummary(event.toolName, event.args),\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleToolUpdated(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_updated\" }>): void {\n\tconst summary = activitySummary(event.toolName, event.args);\n\tconst activity =\n\t\tdraft.activities.find((candidate) => candidate.id === event.toolCallId && candidate.status === \"running\") ??\n\t\t[...draft.activities].reverse().find((candidate) => candidate.status === \"running\");\n\tif (activity) {\n\t\tactivity.summary = summary;\n\t\tenforceActivityLimits(draft.activities);\n\t}\n}\n\nfunction handleToolEnded(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"tool_ended\" }>): void {\n\tconst activity = draft.activities.find((candidate) => candidate.id === event.toolCallId);\n\tif (activity && activity.status === \"running\") {\n\t\tactivity.status = event.isError ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.resultSummary = resultSummary(event.result) || undefined;\n\t\tenforceActivityLimits(draft.activities);\n\t}\n}\n\nfunction handleCompactionStarted(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_started\" }>,\n): void {\n\tappendActivity(draft.activities, {\n\t\tid: COMPACTION_ACTIVITY_ID,\n\t\ttoolName: COMPACTION_ACTIVITY_ID,\n\t\tsummary: \"Compacting context…\",\n\t\tstatus: \"running\",\n\t\tstartedAt: event.startedAt,\n\t});\n}\n\nfunction handleCompactionEnded(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"compaction_ended\" }>,\n): void {\n\tconst activity = [...draft.activities]\n\t\t.reverse()\n\t\t.find((candidate) => candidate.id === COMPACTION_ACTIVITY_ID && candidate.status === \"running\");\n\tif (activity) {\n\t\tactivity.status = event.error ? \"failed\" : \"succeeded\";\n\t\tactivity.endedAt = event.endedAt;\n\t\tactivity.summary = compactionSummary(event.tokensBefore, event.tokensAfter);\n\t\tactivity.resultSummary = event.error ? compactionError(event.error) : undefined;\n\t\tenforceActivityLimits(draft.activities);\n\t}\n}\n\nfunction handleSettle(draft: SubagentRunState, event: Extract<SubagentRunEvent, { type: \"settle\" }>): void {\n\tdraft.status = event.verdict;\n\tdraft.report = boundText(event.report, TASK_OUTPUT_LIMIT);\n\tdraft.error = event.error ? boundText(event.error, ERROR_TEXT_LIMIT) : undefined;\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileQueued(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_queued\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while queued.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction handleAbortWhileRetrying(\n\tdraft: SubagentRunState,\n\tevent: Extract<SubagentRunEvent, { type: \"abort_while_retrying\" }>,\n): void {\n\tdraft.status = \"aborted\";\n\tdraft.error = \"Subagent was aborted while waiting to retry.\";\n\tdraft.endedAt = event.endedAt;\n\tdraft.retry = undefined;\n}\n\nfunction applyEvent(draft: SubagentRunState, event: SubagentRunEvent): void {\n\tswitch (event.type) {\n\t\tcase \"slot_acquired\":\n\t\t\thandleSlotAcquired(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_scheduled\":\n\t\t\thandleRetryScheduled(draft, event);\n\t\t\tbreak;\n\t\tcase \"retry_started\":\n\t\t\thandleRetryStarted(draft);\n\t\t\tbreak;\n\t\tcase \"auto_retry_start\":\n\t\t\thandleAutoRetryStart(draft, event);\n\t\t\tbreak;\n\t\tcase \"auto_retry_end\":\n\t\t\thandleAutoRetryEnd(draft);\n\t\t\tbreak;\n\t\tcase \"turn_end\":\n\t\t\thandleTurnEnd(draft);\n\t\t\tbreak;\n\t\tcase \"assistant_message_settled\":\n\t\t\thandleAssistantMessageSettled(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_started\":\n\t\t\thandleToolStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_updated\":\n\t\t\thandleToolUpdated(draft, event);\n\t\t\tbreak;\n\t\tcase \"tool_ended\":\n\t\t\thandleToolEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_started\":\n\t\t\thandleCompactionStarted(draft, event);\n\t\t\tbreak;\n\t\tcase \"compaction_ended\":\n\t\t\thandleCompactionEnded(draft, event);\n\t\t\tbreak;\n\t\tcase \"settle\":\n\t\t\thandleSettle(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_queued\":\n\t\t\thandleAbortWhileQueued(draft, event);\n\t\t\tbreak;\n\t\tcase \"abort_while_retrying\":\n\t\t\thandleAbortWhileRetrying(draft, event);\n\t\t\tbreak;\n\t}\n}\n\nexport function versionSum(runs: readonly SubagentRunState[]): number {\n\tlet total = 0;\n\tfor (const run of runs) total += run.version;\n\treturn total;\n}\n\nexport function statusOf(runs: readonly SubagentRunDetails[]): SubagentDetails[\"status\"] {\n\tif (runs.length === 0) return \"running\";\n\t// Active beats terminal: any queued or running run keeps the batch\n\t// \"running\" regardless of what the others have settled to.\n\tif (runs.some((run) => run.status === \"queued\" || run.status === \"running\")) return \"running\";\n\tif (runs.every((run) => run.status === \"completed\")) return \"completed\";\n\tif (runs.some((run) => run.status === \"completed\")) return \"partial\";\n\tif (runs.every((run) => run.status === \"aborted\")) return \"aborted\";\n\treturn \"failed\";\n}\n\nexport function isSubagentError(details: Pick<SubagentDetails, \"status\" | \"runs\">): boolean {\n\tif (details.status !== \"failed\" && details.status !== \"aborted\") return false;\n\t// A batch with any successful run is a partial result, not an error:\n\t// per-run status is already reported in the content sections.\n\treturn !details.runs.some((run) => run.status === \"completed\");\n}\n\nfunction statusText(details: SubagentDetails): string {\n\tif (details.runs.length === 0) return \"Initializing…\";\n\tconst running = details.runs.filter((run) => run.status === \"running\").length;\n\tconst queued = details.runs.filter((run) => run.status === \"queued\").length;\n\tconst completed = details.runs.filter((run) => run.status === \"completed\").length;\n\tconst failed = details.runs.filter((run) => run.status === \"failed\").length;\n\tconst aborted = details.runs.filter((run) => run.status === \"aborted\").length;\n\tconst parts = [`${completed}/${details.runs.length} complete`];\n\tif (running) parts.push(`${running} running`);\n\tif (queued) parts.push(`${queued} queued`);\n\tif (failed) parts.push(`${failed} failed`);\n\tif (aborted) parts.push(`${aborted} aborted`);\n\treturn parts.join(\" · \");\n}\n\nexport function statusSummary(details: SubagentDetails): string {\n\treturn statusText(details);\n}\n\nexport interface SubagentRetryView {\n\tattempt: number;\n\tmaxAttempts: number;\n\tremainingSeconds: number;\n\terror: string;\n}\n\nexport function getSubagentRetryView(run: SubagentRunDetails, now = Date.now()): SubagentRetryView | undefined {\n\tconst retry = run.retry;\n\tif (!retry || !Number.isFinite(retry.deadline)) return undefined;\n\tconst attempt = positiveInteger(retry.attempt, 1);\n\tconst maxAttempts = Math.max(attempt, positiveInteger(retry.maxAttempts, attempt));\n\tconst currentTime = Number.isFinite(now) ? now : retry.deadline;\n\treturn {\n\t\tattempt,\n\t\tmaxAttempts,\n\t\tremainingSeconds: Math.max(0, Math.ceil((retry.deadline - currentTime) / 1000)),\n\t\terror: retryError(typeof retry.error === \"string\" ? retry.error : \"\"),\n\t};\n}\n"]}
@@ -3,15 +3,8 @@ import type { Api, Model, Usage } from "@earendil-works/pi-ai";
3
3
  import type { SubagentAgentName } from "./constants.ts";
4
4
  export interface AgentProfile {
5
5
  name: SubagentAgentName;
6
- description: string;
7
6
  tools: string[];
8
7
  systemPrompt: string;
9
- /**
10
- * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.
11
- * Read-only exploration doesn't need commit/PR/style rules; the parent
12
- * has full context to interpret results.
13
- */
14
- omitContextFiles?: boolean;
15
8
  }
16
9
  export interface SubagentProfileOverride {
17
10
  model?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\nimport type { SubagentAgentName } from \"./constants.ts\";\n\n// Static built-in subagent profile; the only agents a task can select.\nexport interface AgentProfile {\n\tname: SubagentAgentName;\n\tdescription: string;\n\ttools: string[];\n\tsystemPrompt: string;\n\t/**\n\t * Skip loading AGENTS.md/CLAUDE.md into the worker's system prompt.\n\t * Read-only exploration doesn't need commit/PR/style rules; the parent\n\t * has full context to interpret results.\n\t */\n\tomitContextFiles?: boolean;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\t// Absence means \"inherit the parent session\"; only the two built-in\n\t// profiles exist, so unknown keys are rejected by settings.ts.\n\tprofiles: Partial<Record<SubagentAgentName, SubagentProfileOverride>>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentProfile;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n}\n\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\n/** Aggregate batch status; active runs beat every terminal verdict. */\nexport type SubagentBatchStatus = \"running\" | \"completed\" | \"partial\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\n// Flat projection of pi-ai's Usage: the cost breakdown collapses to a\n// scalar total (renderers need one number; toNestedUsage rebuilds the nested\n// shape for the parent transcript), and turns/toolUses/contextTokens track\n// worker progress. The optional pi-ai fields (reasoning, cacheWrite1h) stay\n// optional here and are not aggregated.\nexport type SubagentUsage = Omit<Usage, \"cost\"> & {\n\tcost: number;\n\tturns: number;\n\ttoolUses: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n};\n\nexport interface SubagentRetryDetails {\n\tattempt: number;\n\tmaxAttempts: number;\n\tdeadline: number;\n\terror: string;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tdescription: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tretry?: SubagentRetryDetails;\n\tactivities: ToolActivity[];\n\t/** Final assistant report; empty until the worker settles. */\n\treport: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tstatus: SubagentBatchStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/extensions/subagent/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model, Usage } from \"@earendil-works/pi-ai\";\nimport type { SubagentAgentName } from \"./constants.ts\";\n\n// Static built-in subagent profile; the only agents a task can select.\nexport interface AgentProfile {\n\tname: SubagentAgentName;\n\ttools: string[];\n\tsystemPrompt: string;\n}\n\nexport interface SubagentProfileOverride {\n\tmodel?: string;\n\tthinking?: ThinkingLevel;\n}\n\nexport interface SubagentConfigFile {\n\tversion: 1;\n\t// Absence means \"inherit the parent session\"; only the two built-in\n\t// profiles exist, so unknown keys are rejected by settings.ts.\n\tprofiles: Partial<Record<SubagentAgentName, SubagentProfileOverride>>;\n}\n\nexport interface ResolvedSubagentTask {\n\tagent: AgentProfile;\n\tdescription: string;\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<Api>;\n\tthinking: ThinkingLevel;\n}\n\nexport type SubagentRunStatus = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"aborted\";\n/** Aggregate batch status; active runs beat every terminal verdict. */\nexport type SubagentBatchStatus = \"running\" | \"completed\" | \"partial\" | \"failed\" | \"aborted\";\nexport type ToolActivityStatus = \"running\" | \"succeeded\" | \"failed\";\n\nexport interface ToolActivity {\n\tid: string;\n\ttoolName: string;\n\tsummary: string;\n\tstatus: ToolActivityStatus;\n\tstartedAt: number;\n\tendedAt?: number;\n\tresultSummary?: string;\n}\n\n// Flat projection of pi-ai's Usage: the cost breakdown collapses to a\n// scalar total (renderers need one number; toNestedUsage rebuilds the nested\n// shape for the parent transcript), and turns/toolUses/contextTokens track\n// worker progress. The optional pi-ai fields (reasoning, cacheWrite1h) stay\n// optional here and are not aggregated.\nexport type SubagentUsage = Omit<Usage, \"cost\"> & {\n\tcost: number;\n\tturns: number;\n\ttoolUses: number;\n\t/** Context watermark: total tokens of the latest request, not a running sum. */\n\tcontextTokens?: number;\n};\n\nexport interface SubagentRetryDetails {\n\tattempt: number;\n\tmaxAttempts: number;\n\tdeadline: number;\n\terror: string;\n}\n\nexport interface SubagentRunDetails {\n\tid: string;\n\tagent: string;\n\tdescription: string;\n\tcwd: string;\n\tmodel: string;\n\tthinking: ThinkingLevel;\n\tstatus: SubagentRunStatus;\n\tstartedAt?: number;\n\tendedAt?: number;\n\tcurrentActivity?: string;\n\tretry?: SubagentRetryDetails;\n\tactivities: ToolActivity[];\n\t/** Final assistant report; empty until the worker settles. */\n\treport: string;\n\terror?: string;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentDetails {\n\tstatus: SubagentBatchStatus;\n\truns: SubagentRunDetails[];\n\tstartedAt: number;\n\tendedAt?: number;\n\tusage: SubagentUsage;\n}\n\nexport interface SubagentExecutionResult {\n\tcontent: string;\n\tdetails: SubagentDetails;\n\tusage?: Usage;\n}\n"]}
@@ -54,7 +54,7 @@ async function showDialogThinkingPicker(ctx, profile, override, currentThinking)
54
54
  async function runDialogProfileSettings(ctx, profile, currentThinking) {
55
55
  const agentDir = getAgentDir();
56
56
  while (true) {
57
- const config = await loadSubagentConfig(agentDir);
57
+ const config = await loadSubagentConfig(agentDir, (message) => ctx.ui.notify(message, "warning"));
58
58
  const override = config.profiles[profile.name];
59
59
  const action = await showDialogSettingsMenu(ctx, profile, override, currentThinking);
60
60
  if (!action)