@esso0428/pi-subagents 0.17.5 → 0.17.7

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 (263) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/CONTRIBUTING.md +4 -0
  3. package/README.md +1 -1
  4. package/dist/abortable.d.ts +13 -0
  5. package/dist/abortable.d.ts.map +1 -0
  6. package/dist/abortable.js +43 -0
  7. package/dist/abortable.js.map +1 -0
  8. package/dist/agent-color.d.ts +36 -0
  9. package/dist/agent-color.d.ts.map +1 -0
  10. package/dist/agent-color.js +124 -0
  11. package/dist/agent-color.js.map +1 -0
  12. package/dist/agent-file-toggle.d.ts +126 -0
  13. package/dist/agent-file-toggle.d.ts.map +1 -0
  14. package/dist/agent-file-toggle.js +259 -0
  15. package/dist/agent-file-toggle.js.map +1 -0
  16. package/dist/agent-history.d.ts +4 -0
  17. package/dist/agent-history.d.ts.map +1 -1
  18. package/dist/agent-history.js +47 -1
  19. package/dist/agent-history.js.map +1 -1
  20. package/dist/agent-manager.d.ts +370 -56
  21. package/dist/agent-manager.d.ts.map +1 -1
  22. package/dist/agent-manager.js +1123 -409
  23. package/dist/agent-manager.js.map +1 -1
  24. package/dist/agent-runner.d.ts +100 -10
  25. package/dist/agent-runner.d.ts.map +1 -1
  26. package/dist/agent-runner.js +166 -21
  27. package/dist/agent-runner.js.map +1 -1
  28. package/dist/agent-types.d.ts +57 -5
  29. package/dist/agent-types.d.ts.map +1 -1
  30. package/dist/agent-types.js +164 -32
  31. package/dist/agent-types.js.map +1 -1
  32. package/dist/child-context.d.ts +3 -0
  33. package/dist/child-context.d.ts.map +1 -0
  34. package/dist/child-context.js +13 -0
  35. package/dist/child-context.js.map +1 -0
  36. package/dist/cross-extension-rpc.d.ts +23 -3
  37. package/dist/cross-extension-rpc.d.ts.map +1 -1
  38. package/dist/cross-extension-rpc.js +79 -17
  39. package/dist/cross-extension-rpc.js.map +1 -1
  40. package/dist/custom-agents.d.ts +38 -1
  41. package/dist/custom-agents.d.ts.map +1 -1
  42. package/dist/custom-agents.js +164 -12
  43. package/dist/custom-agents.js.map +1 -1
  44. package/dist/index.d.ts +34 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1908 -495
  47. package/dist/index.js.map +1 -1
  48. package/dist/invocation-config.d.ts +87 -2
  49. package/dist/invocation-config.d.ts.map +1 -1
  50. package/dist/invocation-config.js +71 -3
  51. package/dist/invocation-config.js.map +1 -1
  52. package/dist/mention-clone.d.ts +88 -0
  53. package/dist/mention-clone.d.ts.map +1 -0
  54. package/dist/mention-clone.js +154 -0
  55. package/dist/mention-clone.js.map +1 -0
  56. package/dist/mention.d.ts +82 -0
  57. package/dist/mention.d.ts.map +1 -0
  58. package/dist/mention.js +132 -0
  59. package/dist/mention.js.map +1 -0
  60. package/dist/model-resolver.d.ts +17 -0
  61. package/dist/model-resolver.d.ts.map +1 -1
  62. package/dist/model-resolver.js +15 -0
  63. package/dist/model-resolver.js.map +1 -1
  64. package/dist/model-scope.d.ts +50 -0
  65. package/dist/model-scope.d.ts.map +1 -0
  66. package/dist/model-scope.js +49 -0
  67. package/dist/model-scope.js.map +1 -0
  68. package/dist/nested-tools.d.ts +57 -0
  69. package/dist/nested-tools.d.ts.map +1 -0
  70. package/dist/nested-tools.js +301 -0
  71. package/dist/nested-tools.js.map +1 -0
  72. package/dist/output-file.d.ts +22 -3
  73. package/dist/output-file.d.ts.map +1 -1
  74. package/dist/output-file.js +58 -7
  75. package/dist/output-file.js.map +1 -1
  76. package/dist/prompts.d.ts +23 -0
  77. package/dist/prompts.d.ts.map +1 -1
  78. package/dist/prompts.js +20 -2
  79. package/dist/prompts.js.map +1 -1
  80. package/dist/schedule.d.ts.map +1 -1
  81. package/dist/schedule.js +36 -15
  82. package/dist/schedule.js.map +1 -1
  83. package/dist/settings.d.ts +228 -2
  84. package/dist/settings.d.ts.map +1 -1
  85. package/dist/settings.js +94 -0
  86. package/dist/settings.js.map +1 -1
  87. package/dist/status-note.d.ts +49 -1
  88. package/dist/status-note.d.ts.map +1 -1
  89. package/dist/status-note.js +62 -1
  90. package/dist/status-note.js.map +1 -1
  91. package/dist/structured-output.d.ts +62 -0
  92. package/dist/structured-output.d.ts.map +1 -0
  93. package/dist/structured-output.js +113 -0
  94. package/dist/structured-output.js.map +1 -0
  95. package/dist/types.d.ts +176 -10
  96. package/dist/types.d.ts.map +1 -1
  97. package/dist/ui/agent-mention.d.ts +83 -0
  98. package/dist/ui/agent-mention.d.ts.map +1 -0
  99. package/dist/ui/agent-mention.js +188 -0
  100. package/dist/ui/agent-mention.js.map +1 -0
  101. package/dist/ui/agent-widget.d.ts +96 -75
  102. package/dist/ui/agent-widget.d.ts.map +1 -1
  103. package/dist/ui/agent-widget.js +397 -420
  104. package/dist/ui/agent-widget.js.map +1 -1
  105. package/dist/ui/conversation-blocks.d.ts.map +1 -1
  106. package/dist/ui/conversation-blocks.js +6 -0
  107. package/dist/ui/conversation-blocks.js.map +1 -1
  108. package/dist/ui/conversation-timeline.d.ts +10 -2
  109. package/dist/ui/conversation-timeline.d.ts.map +1 -1
  110. package/dist/ui/conversation-timeline.js +130 -23
  111. package/dist/ui/conversation-timeline.js.map +1 -1
  112. package/dist/ui/conversation-viewer.d.ts +20 -5
  113. package/dist/ui/conversation-viewer.d.ts.map +1 -1
  114. package/dist/ui/conversation-viewer.js +274 -73
  115. package/dist/ui/conversation-viewer.js.map +1 -1
  116. package/dist/ui/fleet-list.d.ts +198 -0
  117. package/dist/ui/fleet-list.d.ts.map +1 -0
  118. package/dist/ui/fleet-list.js +487 -0
  119. package/dist/ui/fleet-list.js.map +1 -0
  120. package/dist/ui/schedule-menu.d.ts.map +1 -1
  121. package/dist/ui/schedule-menu.js +6 -7
  122. package/dist/ui/schedule-menu.js.map +1 -1
  123. package/dist/ui/select-item.d.ts +28 -0
  124. package/dist/ui/select-item.d.ts.map +1 -0
  125. package/dist/ui/select-item.js +35 -0
  126. package/dist/ui/select-item.js.map +1 -0
  127. package/dist/ui/workflow-card.d.ts +176 -0
  128. package/dist/ui/workflow-card.d.ts.map +1 -0
  129. package/dist/ui/workflow-card.js +333 -0
  130. package/dist/ui/workflow-card.js.map +1 -0
  131. package/dist/ui/workflow-dialog.d.ts +306 -0
  132. package/dist/ui/workflow-dialog.d.ts.map +1 -0
  133. package/dist/ui/workflow-dialog.js +844 -0
  134. package/dist/ui/workflow-dialog.js.map +1 -0
  135. package/dist/ui/workflow-menu.d.ts +61 -0
  136. package/dist/ui/workflow-menu.d.ts.map +1 -0
  137. package/dist/ui/workflow-menu.js +148 -0
  138. package/dist/ui/workflow-menu.js.map +1 -0
  139. package/dist/usage.d.ts +86 -1
  140. package/dist/usage.d.ts.map +1 -1
  141. package/dist/usage.js +72 -1
  142. package/dist/usage.js.map +1 -1
  143. package/dist/workflow/collisions.d.ts +96 -0
  144. package/dist/workflow/collisions.d.ts.map +1 -0
  145. package/dist/workflow/collisions.js +89 -0
  146. package/dist/workflow/collisions.js.map +1 -0
  147. package/dist/workflow/entry.d.ts +33 -0
  148. package/dist/workflow/entry.d.ts.map +1 -0
  149. package/dist/workflow/entry.js +30 -0
  150. package/dist/workflow/entry.js.map +1 -0
  151. package/dist/workflow/host.d.ts +63 -0
  152. package/dist/workflow/host.d.ts.map +1 -0
  153. package/dist/workflow/host.js +363 -0
  154. package/dist/workflow/host.js.map +1 -0
  155. package/dist/workflow/journal.d.ts +98 -0
  156. package/dist/workflow/journal.d.ts.map +1 -0
  157. package/dist/workflow/journal.js +121 -0
  158. package/dist/workflow/journal.js.map +1 -0
  159. package/dist/workflow/json-schema.d.ts +52 -0
  160. package/dist/workflow/json-schema.d.ts.map +1 -0
  161. package/dist/workflow/json-schema.js +112 -0
  162. package/dist/workflow/json-schema.js.map +1 -0
  163. package/dist/workflow/meta.d.ts +68 -0
  164. package/dist/workflow/meta.d.ts.map +1 -0
  165. package/dist/workflow/meta.js +318 -0
  166. package/dist/workflow/meta.js.map +1 -0
  167. package/dist/workflow/progress.d.ts +225 -0
  168. package/dist/workflow/progress.d.ts.map +1 -0
  169. package/dist/workflow/progress.js +362 -0
  170. package/dist/workflow/progress.js.map +1 -0
  171. package/dist/workflow/runtime.d.ts +335 -0
  172. package/dist/workflow/runtime.d.ts.map +1 -0
  173. package/dist/workflow/runtime.js +831 -0
  174. package/dist/workflow/runtime.js.map +1 -0
  175. package/dist/workflow/saved.d.ts +91 -0
  176. package/dist/workflow/saved.d.ts.map +1 -0
  177. package/dist/workflow/saved.js +204 -0
  178. package/dist/workflow/saved.js.map +1 -0
  179. package/dist/workflow/task.d.ts +137 -0
  180. package/dist/workflow/task.d.ts.map +1 -0
  181. package/dist/workflow/task.js +208 -0
  182. package/dist/workflow/task.js.map +1 -0
  183. package/dist/workflow/tool-description.d.ts +39 -0
  184. package/dist/workflow/tool-description.d.ts.map +1 -0
  185. package/dist/workflow/tool-description.js +200 -0
  186. package/dist/workflow/tool-description.js.map +1 -0
  187. package/dist/workflow/worker-source.d.ts +48 -0
  188. package/dist/workflow/worker-source.d.ts.map +1 -0
  189. package/dist/workflow/worker-source.js +779 -0
  190. package/dist/workflow/worker-source.js.map +1 -0
  191. package/dist/worktree.d.ts +10 -3
  192. package/dist/worktree.d.ts.map +1 -1
  193. package/dist/worktree.js +58 -54
  194. package/dist/worktree.js.map +1 -1
  195. package/dist/xml.d.ts +11 -0
  196. package/dist/xml.d.ts.map +1 -0
  197. package/dist/xml.js +13 -0
  198. package/dist/xml.js.map +1 -0
  199. package/docs/rpc.md +183 -0
  200. package/docs/superpowers/plans/2026-09-30-conversation-viewer-scrollbar.md +216 -0
  201. package/docs/superpowers/plans/2026-09-30-upstream-event-workflow-partial-history.md +195 -0
  202. package/docs/superpowers/specs/2026-09-30-conversation-viewer-scrollbar-design.md +82 -0
  203. package/docs/superpowers/specs/2026-09-30-upstream-event-workflow-partial-history-design.md +49 -0
  204. package/docs/workflows.md +437 -0
  205. package/examples/agent-tool-description.md +7 -7
  206. package/examples/workflows/compose.js +51 -0
  207. package/examples/workflows/fan-out-audit.js +47 -0
  208. package/examples/workflows/gated-fix.js +60 -0
  209. package/examples/workflows/lib/count-child.js +27 -0
  210. package/examples/workflows/review-panel.js +63 -0
  211. package/examples/workflows/structured-findings.js +78 -0
  212. package/package.json +1 -1
  213. package/src/abortable.ts +43 -0
  214. package/src/agent-color.ts +161 -0
  215. package/src/agent-file-toggle.ts +269 -0
  216. package/src/agent-history.ts +54 -2
  217. package/src/agent-manager.ts +1263 -402
  218. package/src/agent-runner.ts +251 -27
  219. package/src/agent-types.ts +188 -32
  220. package/src/child-context.ts +15 -0
  221. package/src/cross-extension-rpc.ts +96 -20
  222. package/src/custom-agents.ts +170 -13
  223. package/src/index.ts +2024 -537
  224. package/src/invocation-config.ts +118 -3
  225. package/src/mention-clone.ts +196 -0
  226. package/src/mention.ts +141 -0
  227. package/src/model-resolver.ts +18 -0
  228. package/src/model-scope.ts +70 -0
  229. package/src/nested-tools.ts +424 -0
  230. package/src/output-file.ts +61 -6
  231. package/src/prompts.ts +45 -2
  232. package/src/schedule.ts +35 -14
  233. package/src/settings.ts +312 -2
  234. package/src/status-note.ts +66 -1
  235. package/src/structured-output.ts +130 -0
  236. package/src/types.ts +177 -10
  237. package/src/ui/agent-mention.ts +216 -0
  238. package/src/ui/agent-widget.ts +389 -441
  239. package/src/ui/conversation-blocks.ts +6 -0
  240. package/src/ui/conversation-timeline.ts +139 -25
  241. package/src/ui/conversation-viewer.ts +284 -69
  242. package/src/ui/fleet-list.ts +558 -0
  243. package/src/ui/schedule-menu.ts +9 -8
  244. package/src/ui/select-item.ts +45 -0
  245. package/src/ui/workflow-card.ts +470 -0
  246. package/src/ui/workflow-dialog.ts +1115 -0
  247. package/src/ui/workflow-menu.ts +193 -0
  248. package/src/usage.ts +109 -2
  249. package/src/workflow/collisions.ts +123 -0
  250. package/src/workflow/entry.ts +47 -0
  251. package/src/workflow/host.ts +403 -0
  252. package/src/workflow/journal.ts +164 -0
  253. package/src/workflow/json-schema.ts +128 -0
  254. package/src/workflow/meta.ts +325 -0
  255. package/src/workflow/progress.ts +550 -0
  256. package/src/workflow/runtime.ts +1219 -0
  257. package/src/workflow/saved.ts +217 -0
  258. package/src/workflow/task.ts +302 -0
  259. package/src/workflow/tool-description.ts +200 -0
  260. package/src/workflow/worker-source.ts +781 -0
  261. package/src/worktree.ts +69 -55
  262. package/src/xml.ts +13 -0
  263. package/vitest.config.ts +0 -18
@@ -5,6 +5,20 @@ import { existsSync, readdirSync, readFileSync } from "node:fs";
5
5
  import { basename, join } from "node:path";
6
6
  import { getAgentDir, parseFrontmatter } from "@earendil-works/pi-coding-agent";
7
7
  import { BUILTIN_TOOL_NAMES } from "./agent-types.js";
8
+ /**
9
+ * The one thing a declared `name:` may not contain, matching Claude Code
10
+ * exactly: it reserves `:` for plugin-scoped identifiers (`my-plugin:reviewer`)
11
+ * and refuses to load a file whose name uses one.
12
+ *
13
+ * Nothing else is rejected. Claude Code's docs describe names as "lowercase
14
+ * letters and hyphens", but that is guidance — the only stated load failure is
15
+ * the colon, so `name: Code Reviewer` must work here too. (The stricter
16
+ * letters/digits/underscore/hyphen regex in Claude Code applies to the Agent
17
+ * tool's spawn-time `name` parameter, which is a different field.) Mixed case
18
+ * has to be allowed regardless: the built-in types `Explore` and `Plan` use it,
19
+ * and a file must be able to override one.
20
+ */
21
+ const RESERVED_IN_TYPE = ":";
8
22
  /**
9
23
  * Scan for custom agent .md files from multiple locations.
10
24
  * Discovery hierarchy (higher priority wins):
@@ -16,19 +30,27 @@ import { BUILTIN_TOOL_NAMES } from "./agent-types.js";
16
30
  * between the two project locations, .pi/agents wins — .pi stays the project
17
31
  * authority; .agents/agents is an additional read location.
18
32
  * Any name is allowed — names matching defaults (e.g. "Explore") override them.
33
+ *
34
+ * An agent's type comes from its frontmatter `name:`, falling back to the
35
+ * filename — Claude Code's rule, where "the filename doesn't have to match".
36
+ * Because the type is now declared rather than derived from a unique path, two
37
+ * files can claim the same one; the later load wins, as it always has for a
38
+ * filename clash, and `warnSkippedOverride` reports the substitution.
19
39
  */
20
- export function loadCustomAgents(cwd) {
40
+ export function loadCustomAgents(cwd, strict = false) {
21
41
  const globalDir = join(getAgentDir(), "agents");
22
42
  const workspaceProjectDir = join(cwd, ".agents", "agents");
23
43
  const projectDir = join(cwd, ".pi", "agents");
24
44
  const agents = new Map();
25
- loadFromDir(globalDir, agents, "global"); // lowest priority
26
- loadFromDir(workspaceProjectDir, agents, "project"); // shared workspace
27
- loadFromDir(projectDir, agents, "project"); // highest priority (overwrites)
45
+ loadFromDir(globalDir, agents, "global", strict); // lowest priority
46
+ loadFromDir(workspaceProjectDir, agents, "project", strict); // shared workspace
47
+ loadFromDir(projectDir, agents, "project", strict); // highest priority (overwrites)
48
+ warnedLastLoad = warnedThisLoad;
49
+ warnedThisLoad = new Set();
28
50
  return agents;
29
51
  }
30
52
  /** Load agent configs from a directory into the map. */
31
- function loadFromDir(dir, agents, source) {
53
+ function loadFromDir(dir, agents, source, strict) {
32
54
  if (!existsSync(dir))
33
55
  return;
34
56
  let files;
@@ -39,19 +61,42 @@ function loadFromDir(dir, agents, source) {
39
61
  return;
40
62
  }
41
63
  for (const file of files) {
42
- const name = basename(file, ".md");
43
- let content;
44
- try {
45
- content = readFileSync(join(dir, file), "utf-8");
64
+ const filenameType = basename(file, ".md");
65
+ const path = join(dir, file);
66
+ const parsed = readAgentFile(path, strict);
67
+ if (!parsed) {
68
+ warnSkippedOverride(filenameType, agents);
69
+ continue;
46
70
  }
47
- catch {
71
+ const { frontmatter: fm, body } = parsed;
72
+ // Claude Code's rule: `name:` IS the agent type, and the filename need not
73
+ // match. Absent, the filename stands in — Claude Code requires the field,
74
+ // but most files here predate it and must keep loading.
75
+ const declared = str(fm.name)?.trim();
76
+ if (declared?.includes(RESERVED_IN_TYPE)) {
77
+ // Refusing beats silently substituting: the file would otherwise load
78
+ // under its filename, so `Agent({subagent_type})` would succeed against
79
+ // an agent whose declared identity nothing honoured.
80
+ warnIfNew(`Agent file ${path} declares name "${declared}", which contains "${RESERVED_IN_TYPE}" — reserved for `
81
+ + "plugin-scoped identifiers. Rename it, or move the label to `display_name:`. Skipping.");
82
+ // No `warnSkippedOverride`: this file would have registered under its
83
+ // *declared* name, which nothing else can hold (a colon keeps it out of
84
+ // the registry), so it shadowed nothing. Passing the filename instead
85
+ // would report a substitution of an unrelated agent that never happened.
48
86
  continue;
49
87
  }
50
- const { frontmatter: fm, body } = parseFrontmatter(content);
88
+ // `||`, not `??`: a quoted empty or all-whitespace `name:` would otherwise
89
+ // register the agent under the empty type — unspawnable, and it takes the
90
+ // filename-derived one down with it.
91
+ const name = declared || filenameType;
51
92
  const { builtinToolNames, extSelectors } = parseToolsField(fm.tools);
52
93
  agents.set(name, {
53
94
  name,
95
+ // Only `display_name` now: `name` is the type, and `getConfig` already
96
+ // falls back to the type when no label is set — so a Claude Code file
97
+ // with `name: code-reviewer` still badges as "code-reviewer".
54
98
  displayName: str(fm.display_name),
99
+ color: str(fm.color),
55
100
  description: str(fm.description) ?? name,
56
101
  builtinToolNames,
57
102
  extSelectors,
@@ -65,18 +110,89 @@ function loadFromDir(dir, agents, source) {
65
110
  persistSession: fm.persist_session != null ? fm.persist_session === true : undefined,
66
111
  outputTranscript: fm.output_transcript != null ? fm.output_transcript !== false : undefined,
67
112
  sessionDir: str(fm.session_dir),
113
+ allowedSubagents: parseAllowedSubagents(fm.allowed_subagents),
68
114
  systemPrompt: body.trim(),
69
115
  promptMode: fm.prompt_mode === "append" ? "append" : "replace",
70
116
  inheritContext: fm.inherit_context != null ? fm.inherit_context === true : undefined,
71
117
  runInBackground: fm.run_in_background != null ? fm.run_in_background === true : undefined,
72
118
  isolated: fm.isolated != null ? fm.isolated === true : undefined,
73
119
  memory: parseMemory(fm.memory),
74
- isolation: fm.isolation === "worktree" ? "worktree" : undefined,
120
+ isolation: parseIsolation(fm.isolation),
75
121
  enabled: fm.enabled !== false, // default true; explicitly false disables
76
122
  source,
123
+ sourcePath: path,
77
124
  });
78
125
  }
79
126
  }
127
+ /**
128
+ * Read and parse one agent file, or warn and return undefined for the caller to
129
+ * skip. One bad file must not take the whole extension down with it — an
130
+ * unparseable `.md` used to abort activation, so pi exited before the TUI.
131
+ *
132
+ * The path is as much of the fix as the recovery: a bare YAML error ("line 2,
133
+ * column 14") is unactionable when agents come from three directories at once,
134
+ * and the only other symptom is `Unknown agent type`, which reads like a typo.
135
+ *
136
+ * Under `strict` the same failure rethrows, still naming the path, so callers
137
+ * that opted into failing closed stop rather than run a substituted agent.
138
+ */
139
+ /**
140
+ * Parse an agent file's frontmatter, tolerating a leading UTF-8 BOM.
141
+ *
142
+ * Editors across the Windows/CJK world write UTF-8 with a BOM by default, and
143
+ * pi's parser did not look past one before 0.84.3: the fence never matched, so
144
+ * the frontmatter came back empty and the *whole file* — YAML and all — became
145
+ * the body. An agent authored that way silently lost every field. `tools: none`
146
+ * going missing is the sharp edge: the agent registers with the default
147
+ * toolset rather than none, which is a wider grant than its author wrote.
148
+ *
149
+ * Stripped here rather than detected per pi version, because this is the only
150
+ * place agent files are read and the BOM is a file-encoding artifact, not
151
+ * content — normalising it at the boundary keeps one behaviour across the whole
152
+ * supported peer range instead of forking on what happens to be installed.
153
+ */
154
+ export function parseAgentFrontmatter(content) {
155
+ return parseFrontmatter(content.startsWith("\uFEFF") ? content.slice(1) : content);
156
+ }
157
+ function readAgentFile(path, strict) {
158
+ try {
159
+ return parseAgentFrontmatter(readFileSync(path, "utf-8"));
160
+ }
161
+ catch (err) {
162
+ const reason = err instanceof Error ? err.message : String(err);
163
+ if (strict)
164
+ throw new Error(`${path}: ${reason}`);
165
+ warnIfNew(`Skipping agent file ${path}: ${reason}`);
166
+ return undefined;
167
+ }
168
+ }
169
+ /**
170
+ * A skipped file that was overriding an already-loaded agent leaves the name
171
+ * pointing at a *different* file — its own prompt, model and tools. Nothing
172
+ * downstream can flag that: unlike an unknown type, the `Agent` call succeeds.
173
+ */
174
+ function warnSkippedOverride(name, agents) {
175
+ const surviving = agents.get(name);
176
+ // Nothing shadowed, or what it shadowed is disabled: dispatch refuses the type
177
+ // either way (see resolveEnabledTypeIn), so there is no substitution to report.
178
+ if (!surviving?.sourcePath || surviving.enabled === false)
179
+ return;
180
+ warnIfNew(`Agent "${name}" now loads from ${surviving.sourcePath} instead`);
181
+ }
182
+ let warnedLastLoad = new Set();
183
+ let warnedThisLoad = new Set();
184
+ /**
185
+ * Agents reload on activation and again on every `Agent` call, so an unchanged
186
+ * problem would re-warn all session — over a painted TUI, since pi does not
187
+ * redirect console output. Compare against the previous load rather than every
188
+ * load ever, so a file that is fixed and then broken again still reports.
189
+ */
190
+ function warnIfNew(message) {
191
+ warnedThisLoad.add(message);
192
+ if (warnedLastLoad.has(message))
193
+ return;
194
+ console.warn(`[pi-subagents] ${message}`);
195
+ }
80
196
  // ---- Field parsers ----
81
197
  // All follow the same convention: omitted → default, "none"/empty → nothing, value → exact.
82
198
  /** Extract a string or undefined. */
@@ -99,6 +215,23 @@ function parseCsvField(val) {
99
215
  const items = s.split(",").map(t => t.trim()).filter(Boolean);
100
216
  return items.length > 0 ? items : undefined;
101
217
  }
218
+ /**
219
+ * Parse the nested-delegation allowlist. Single field, default-off:
220
+ * omitted/empty/"none"/`false` → undefined (no nested tools); "all"/"*"/`true`
221
+ * → "all" (any enabled agent); csv → only the listed types.
222
+ *
223
+ * Booleans are accepted because `extensions:`/`skills:` take them and users
224
+ * generalize: without this, YAML's `true` stringifies into an agent type
225
+ * literally named "true", so the tools appear and every spawn is refused.
226
+ */
227
+ function parseAllowedSubagents(val) {
228
+ if (typeof val === "boolean")
229
+ return val ? "all" : undefined;
230
+ const items = parseCsvField(val);
231
+ if (!items)
232
+ return undefined;
233
+ return items.some(i => i === "*" || i.toLowerCase() === "all") ? "all" : items;
234
+ }
102
235
  /**
103
236
  * Parse a comma-separated list field with defaults.
104
237
  * omitted → defaults; "none"/empty → []; csv → listed items.
@@ -142,6 +275,25 @@ function parseMemory(val) {
142
275
  return val;
143
276
  return undefined;
144
277
  }
278
+ /**
279
+ * Parse the `isolation` frontmatter field.
280
+ *
281
+ * `off` is kept as a value rather than folded into `undefined` because the two
282
+ * do not mean the same thing here: agent config outranks tool-call params, so
283
+ * `off` vetoes a caller's `worktree` while an absent field lets it through.
284
+ *
285
+ * pi's frontmatter parser is not YAML 1.1 — bare `off` and `no` arrive as
286
+ * strings and only `false` becomes a boolean — so all three spellings are
287
+ * accepted rather than leaving an author's intent silently dropped. Anything
288
+ * else stays `undefined`, as before.
289
+ */
290
+ function parseIsolation(val) {
291
+ if (val === "worktree")
292
+ return "worktree";
293
+ if (val === "off" || val === "none" || val === "no" || val === false)
294
+ return "off";
295
+ return undefined;
296
+ }
145
297
  /**
146
298
  * Parse an inherit field (extensions, skills).
147
299
  * omitted/true → true (inherit all); false/"none"/empty → false; csv → listed names.
@@ -1 +1 @@
1
- {"version":3,"file":"custom-agents.js","sourceRoot":"","sources":["../src/custom-agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"custom-agents.js","sourceRoot":"","sources":["../src/custom-agents.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,7 +11,41 @@
11
11
  */
12
12
  import { type ExtensionAPI } from "@earendil-works/pi-coding-agent";
13
13
  import { Container } from "@earendil-works/pi-tui";
14
+ import { type AgentConfig } from "./types.js";
14
15
  import { type Theme } from "./ui/agent-widget.js";
16
+ import { FOREIGN_WORKFLOW_TOOL_NAMES } from "./workflow/collisions.js";
17
+ import { WORKFLOW_ENTRY_TYPE, type WorkflowEntryData, workflowEntryData } from "./workflow/entry.js";
15
18
  export declare function renderRunningAgentStatus(frame: string, statsText: string, activity: string, theme: Pick<Theme, "fg">): Container;
19
+ /**
20
+ * Format an agent's tool scope for the Agent tool description.
21
+ *
22
+ * This suffix describes BUILT-IN scope only — extension tools are resolved when
23
+ * the agent runs (extensions can register asynchronously), so they cannot be
24
+ * enumerated while the description is being built. That is why an agent with
25
+ * `tools: "*, ext:mcp/search"` renders "*" and always has.
26
+ *
27
+ * Two distinctions matter, both of them capability claims the orchestrator acts on:
28
+ *
29
+ * - absent vs empty. `builtinToolNames: undefined` means the agent never narrowed
30
+ * its tools (the shipped defaults); `[]` is what `tools: none` and an `ext:`-only
31
+ * `tools:` parse to, and the runtime really does hand those agents no built-ins.
32
+ * Rendering both "*" tells the orchestrator a tool-less agent can run `bash`.
33
+ * - empty-with-extensions vs empty-without. Zero built-ins does NOT imply zero
34
+ * tools: `tools: none` alongside `extensions:` still surfaces every extension
35
+ * tool (see test/fixtures/.pi/agents/tools-none.md, which expects three). Calling
36
+ * that "none" understates the agent instead of overstating it — better, but still
37
+ * wrong, and it would route work away from the only agent able to do it. "none"
38
+ * is therefore reserved for agents that genuinely can call nothing: `isolated`
39
+ * agents and those with `extensions: false`.
40
+ */
41
+ export declare function formatToolsSuffix(cfg: AgentConfig | undefined): string;
42
+ /** CLI flag that runs a workflow script at session start. */
43
+ export declare const WORKFLOW_FILE_FLAG = "subagents-workflow-file";
44
+ /**
45
+ * Re-exported from where they now live, because this is where they were
46
+ * defined and a consumer (or a test) that matched a session entry on
47
+ * {@link WORKFLOW_ENTRY_TYPE} imports it from here.
48
+ */
49
+ export { FOREIGN_WORKFLOW_TOOL_NAMES, WORKFLOW_ENTRY_TYPE, type WorkflowEntryData, workflowEntryData };
16
50
  export default function (pi: ExtensionAPI): void;
17
51
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAc,KAAK,YAAY,EAA8G,MAAM,iCAAiC,CAAC;AAC5L,OAAO,EAAE,SAAS,EAA6E,MAAM,wBAAwB,CAAC;AAmB9H,OAAO,EAcL,KAAK,KAAK,EAEX,MAAM,sBAAsB,CAAC;AA4C9B,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GACvB,SAAS,CAKX;AAkKD,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAuvExC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAc,KAAK,YAAY,EAA0F,MAAM,iCAAiC,CAAC;AACxK,OAAO,EAAE,SAAS,EAAiE,MAAM,wBAAwB,CAAC;AAyBlH,OAAO,EAAE,KAAK,WAAW,EAAuK,MAAM,YAAY,CAAC;AAEnN,OAAO,EAeL,KAAK,KAAK,EAEX,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAA2B,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAmBrG,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GACvB,SAAS,CAKX;AAgKD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAatE;AAED,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAE5D;;;;GAIG;AACH,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;AAEvG,MAAM,CAAC,OAAO,WAAW,EAAE,EAAE,YAAY,QAkqHxC"}