@femtomc/mu-agent 26.2.90 → 26.2.92

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 (40) hide show
  1. package/README.md +7 -10
  2. package/dist/backend.d.ts +0 -2
  3. package/dist/backend.d.ts.map +1 -1
  4. package/dist/backend.js +2 -3
  5. package/dist/command_context.d.ts.map +1 -1
  6. package/dist/command_context.js +3 -14
  7. package/dist/default_prompts.d.ts +0 -3
  8. package/dist/default_prompts.d.ts.map +1 -1
  9. package/dist/default_prompts.js +0 -6
  10. package/dist/extensions/branding.d.ts.map +1 -1
  11. package/dist/extensions/branding.js +3 -4
  12. package/dist/extensions/index.d.ts +0 -6
  13. package/dist/extensions/index.d.ts.map +1 -1
  14. package/dist/extensions/index.js +0 -6
  15. package/dist/extensions/planning-ui.d.ts.map +1 -1
  16. package/dist/extensions/planning-ui.js +32 -20
  17. package/dist/extensions/subagents-ui.d.ts.map +1 -1
  18. package/dist/extensions/subagents-ui.js +42 -53
  19. package/dist/index.d.ts +1 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -2
  22. package/dist/operator.d.ts +0 -33
  23. package/dist/operator.d.ts.map +1 -1
  24. package/dist/operator.js +1 -72
  25. package/dist/self_documentation.d.ts.map +1 -1
  26. package/dist/self_documentation.js +0 -2
  27. package/dist/session_turn.d.ts +5 -3
  28. package/dist/session_turn.d.ts.map +1 -1
  29. package/dist/session_turn.js +27 -44
  30. package/package.json +3 -3
  31. package/prompts/roles/operator.md +1 -1
  32. package/prompts/skills/planning/SKILL.md +3 -3
  33. package/prompts/skills/subagents/SKILL.md +227 -106
  34. package/dist/mu_roles.d.ts +0 -13
  35. package/dist/mu_roles.d.ts.map +0 -1
  36. package/dist/mu_roles.js +0 -29
  37. package/prompts/roles/orchestrator.md +0 -43
  38. package/prompts/roles/reviewer.md +0 -35
  39. package/prompts/roles/worker.md +0 -38
  40. package/prompts/skills/reviewer/SKILL.md +0 -65
package/README.md CHANGED
@@ -2,23 +2,20 @@
2
2
 
3
3
  Shared agent runtime package for mu.
4
4
 
5
- This package provides reusable runtime pieces for chat, orchestration, and serve-mode tooling, including:
5
+ This package provides reusable runtime pieces for operator sessions and serve-mode tooling, including:
6
6
 
7
7
  - Messaging operator runtime + backend
8
8
  - Command context resolution for operator command proposals
9
- - Role prompt loading/defaults for operator/orchestrator/worker/reviewer
10
- - pi CLI/SDK orchestration backends and resource loader helpers
11
- - Prompt/template helpers used by orchestration roles
9
+ - Operator prompt loading/defaults
10
+ - pi CLI/SDK backend and resource loader helpers
11
+ - Prompt/template helpers
12
12
 
13
13
  ## Bundled default prompts
14
14
 
15
15
  Bundled defaults now live as markdown files under `packages/agent/prompts/`:
16
16
 
17
17
  - `operator.md`
18
- - `orchestrator.md`
19
- - `worker.md`
20
- - `reviewer.md`
21
- - `soul.md` (shared tail appended to all role prompts)
18
+ - `soul.md` (shared tail appended to the operator prompt)
22
19
 
23
20
  These are loaded by runtime code and are the single source of truth for default system prompts.
24
21
 
@@ -48,7 +45,7 @@ Current stack:
48
45
 
49
46
  - `brandingExtension` — mu compact header/footer branding + default theme
50
47
  - `eventLogExtension` — event tail + watch widget
51
- - `planningUiExtension` — planning mode: compact HUD for next-step/approval flow plus footer-ready incidental status metadata (`/mu plan ...`)
48
+ - `planningUiExtension` — planning mode: compact HUD for next-step/approval flow in widget/status surfaces while keeping the branding footer unchanged (`/mu plan ...`)
52
49
  - `subagentsUiExtension` — subagents mode: compact HUD with activity sentences from issue/forum events plus footer-ready queue/health metadata (`/mu subagents ...`)
53
50
 
54
51
  Default operator UI theme is `mu-gruvbox-dark`.
@@ -58,7 +55,7 @@ Default operator UI theme is `mu-gruvbox-dark`.
58
55
  - `/mu events [n]` / `/mu events tail [n]` — event log tail
59
56
  - `/mu events watch on|off` — toggle event watch widget
60
57
  - `/mu brand on|off|toggle` — enable/disable UI branding
61
- - `/mu plan ...` — planning HUD (phases, checklist editing, communication state, snapshots)
58
+ - `/mu plan ...` — planning HUD (phases, checklist editing, communication state, snapshots); does not inject planning metadata into branding footer
62
59
  - `/mu subagents ...` — tmux + issue queue monitor/spawner (profiles, spawn pause, stale/refresh controls, snapshots)
63
60
  - `/mu help` — dispatcher catalog of registered `/mu` subcommands
64
61
 
package/dist/backend.d.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  import type { Model } from "@mariozechner/pi-ai";
2
2
  import { AuthStorage, DefaultResourceLoader, SettingsManager } from "@mariozechner/pi-coding-agent";
3
- import type { MuRole } from "./mu_roles.js";
4
3
  export type BackendRunOpts = {
5
4
  issueId: string;
6
- role: MuRole;
7
5
  systemPrompt: string;
8
6
  prompt: string;
9
7
  provider: string;
@@ -1 +1 @@
1
- {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EACN,WAAW,EAOX,qBAAqB,EAGrB,eAAe,EACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAI5C,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC7B,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4BpD;AAGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,kBAAkB,CAAC,EAAE,MAAM,GACzB,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA6BxB;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,aAAa;IACzC,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAoGhD;AAGD,MAAM,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,0BAA0B,GAAG,qBAAqB,CA+C9F"}
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EACN,WAAW,EAOX,qBAAqB,EAGrB,eAAe,EACf,MAAM,+BAA+B,CAAC;AAIvC,MAAM,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC7B,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4BpD;AAGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,kBAAkB,CAAC,EAAE,MAAM,GACzB,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CA6BxB;AAED;;;;GAIG;AACH,qBAAa,UAAW,YAAW,aAAa;IACzC,GAAG,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAkGhD;AAGD,MAAM,MAAM,0BAA0B,GAAG;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,0BAA0B,GAAG,qBAAqB,CA+C9F"}
package/dist/backend.js CHANGED
@@ -4,7 +4,7 @@ import { basename, dirname, join } from "node:path";
4
4
  import { findRepoRoot, getMuHomeDir, getStorePaths } from "@femtomc/mu-core/node";
5
5
  import { getModels, getProviders } from "@mariozechner/pi-ai";
6
6
  import { AuthStorage, createAgentSession, createBashTool, createEditTool, createReadTool, createWriteTool, DefaultResourceLoader, getAgentDir, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
7
- import { orchestratorToolExtensionPaths, workerToolExtensionPaths } from "./extensions/index.js";
7
+ import { operatorExtensionPaths } from "./extensions/index.js";
8
8
  import { MU_DEFAULT_THEME_NAME, MU_DEFAULT_THEME_PATH } from "./ui_defaults.js";
9
9
  export function streamHasError(line) {
10
10
  let event;
@@ -79,12 +79,11 @@ export class SdkBackend {
79
79
  throw new Error(`Model "${opts.model}" not found${scope} in pi-ai registry.`);
80
80
  }
81
81
  const settingsManager = SettingsManager.inMemory({ theme: MU_DEFAULT_THEME_NAME, quietStartup: true });
82
- const roleExtensionPaths = opts.role === "orchestrator" ? orchestratorToolExtensionPaths : workerToolExtensionPaths;
83
82
  const resourceLoader = createMuResourceLoader({
84
83
  cwd: opts.cwd,
85
84
  systemPrompt: opts.systemPrompt,
86
85
  settingsManager,
87
- additionalExtensionPaths: roleExtensionPaths,
86
+ additionalExtensionPaths: operatorExtensionPaths,
88
87
  });
89
88
  await resourceLoader.reload();
90
89
  const tools = [
@@ -1 +1 @@
1
- {"version":3,"file":"command_context.d.ts","sourceRoot":"","sources":["../src/command_context.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC;AAE3E,MAAM,MAAM,8BAA8B,GACvC,iBAAiB,GACjB,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAClC;IACA,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,uBAAuB,CAAC;CAC/B,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,8BAA8B,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL,MAAM,MAAM,0BAA0B,GAAG;IACxC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AAwJF,qBAAa,sBAAsB;;gBAGf,IAAI,GAAE,0BAA+B;IAQjD,OAAO,CAAC,IAAI,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,yBAAyB;CAqG7B"}
1
+ {"version":3,"file":"command_context.d.ts","sourceRoot":"","sources":["../src/command_context.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,cAAc,GAAG,MAAM,CAAC;AAE3E,MAAM,MAAM,8BAA8B,GACvC,iBAAiB,GACjB,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,CAAC;AAE3B,MAAM,MAAM,yBAAyB,GAClC;IACA,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,uBAAuB,CAAC;CAC/B,GACD;IACA,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,8BAA8B,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEL,MAAM,MAAM,0BAA0B,GAAG;IACxC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC,CAAC;AA2IF,qBAAa,sBAAsB;;gBAGf,IAAI,GAAE,0BAA+B;IAQjD,OAAO,CAAC,IAAI,EAAE;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,yBAAyB;CAqG7B"}
@@ -2,15 +2,7 @@ import { resolve as resolvePath } from "node:path";
2
2
  const ISSUE_ID_RE = /^mu-[a-z0-9][a-z0-9-]*$/;
3
3
  const SAFE_TOPIC_RE = /^[A-Za-z0-9][A-Za-z0-9._:/-]{0,199}$/;
4
4
  const SAFE_TARGET_RE = /^(?!-)[A-Za-z0-9._:@/-]{1,200}$/;
5
- const ISSUE_TARGET_COMMANDS = new Set([
6
- "issue get",
7
- "issue update",
8
- "issue claim",
9
- "issue close",
10
- "run resume",
11
- "run status",
12
- "run interrupt",
13
- ]);
5
+ const ISSUE_TARGET_COMMANDS = new Set(["issue get", "issue update", "issue claim", "issue close"]);
14
6
  const TOPIC_TARGET_COMMANDS = new Set(["forum read", "forum post"]);
15
7
  const GENERIC_TARGET_COMMANDS = new Set(["audit get", "dlq inspect", "dlq replay"]);
16
8
  function readString(value) {
@@ -32,16 +24,13 @@ function collectDistinct(values) {
32
24
  function collectIssueCandidates(opts) {
33
25
  const candidates = [];
34
26
  const targetType = opts.inboundTargetType.toLowerCase();
35
- if (targetType === "issue" ||
36
- targetType === "issue_id" ||
37
- targetType === "run_root" ||
38
- targetType === "root_issue") {
27
+ if (targetType === "issue" || targetType === "issue_id" || targetType === "root_issue") {
39
28
  const fromTarget = readString(opts.inboundTargetId);
40
29
  if (fromTarget) {
41
30
  candidates.push(fromTarget);
42
31
  }
43
32
  }
44
- for (const key of ["issue_id", "root_issue_id", "run_root_id"]) {
33
+ for (const key of ["issue_id", "root_issue_id"]) {
45
34
  const fromMeta = readString(opts.metadata[key]);
46
35
  if (fromMeta) {
47
36
  candidates.push(fromMeta);
@@ -7,8 +7,5 @@
7
7
  export declare function loadBundledPrompt(name: string): string;
8
8
  export declare function appendSharedSoul(basePrompt: string, soulPrompt: string): string;
9
9
  export declare const DEFAULT_SOUL_PROMPT: string;
10
- export declare const DEFAULT_ORCHESTRATOR_PROMPT: string;
11
- export declare const DEFAULT_REVIEWER_PROMPT: string;
12
- export declare const DEFAULT_WORKER_PROMPT: string;
13
10
  export declare const DEFAULT_OPERATOR_SYSTEM_PROMPT: string;
14
11
  //# sourceMappingURL=default_prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"default_prompts.d.ts","sourceRoot":"","sources":["../src/default_prompts.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED,eAAO,MAAM,mBAAmB,QAAqC,CAAC;AAOtE,eAAO,MAAM,2BAA2B,QAAkE,CAAC;AAC3G,eAAO,MAAM,uBAAuB,QAA8D,CAAC;AACnG,eAAO,MAAM,qBAAqB,QAA4D,CAAC;AAC/F,eAAO,MAAM,8BAA8B,QAE1C,CAAC"}
1
+ {"version":3,"file":"default_prompts.d.ts","sourceRoot":"","sources":["../src/default_prompts.ts"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAO/E;AAED,eAAO,MAAM,mBAAmB,QAAqC,CAAC;AAGtE,eAAO,MAAM,8BAA8B,QAE1C,CAAC"}
@@ -32,11 +32,5 @@ export function appendSharedSoul(basePrompt, soulPrompt) {
32
32
  return `${base}\n\n${soul}`;
33
33
  }
34
34
  export const DEFAULT_SOUL_PROMPT = loadBundledPrompt("roles/soul.md");
35
- const BASE_ORCHESTRATOR_PROMPT = loadBundledPrompt("roles/orchestrator.md");
36
- const BASE_REVIEWER_PROMPT = loadBundledPrompt("roles/reviewer.md");
37
- const BASE_WORKER_PROMPT = loadBundledPrompt("roles/worker.md");
38
35
  const BASE_OPERATOR_SYSTEM_PROMPT = loadBundledPrompt("roles/operator.md");
39
- export const DEFAULT_ORCHESTRATOR_PROMPT = appendSharedSoul(BASE_ORCHESTRATOR_PROMPT, DEFAULT_SOUL_PROMPT);
40
- export const DEFAULT_REVIEWER_PROMPT = appendSharedSoul(BASE_REVIEWER_PROMPT, DEFAULT_SOUL_PROMPT);
41
- export const DEFAULT_WORKER_PROMPT = appendSharedSoul(BASE_WORKER_PROMPT, DEFAULT_SOUL_PROMPT);
42
36
  export const DEFAULT_OPERATOR_SYSTEM_PROMPT = appendMuDocumentationSection(appendSharedSoul(BASE_OPERATOR_SYSTEM_PROMPT, DEFAULT_SOUL_PROMPT));
@@ -1 +1 @@
1
- {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/extensions/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAyEpF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,QA8OjD;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"branding.d.ts","sourceRoot":"","sources":["../../src/extensions/branding.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAyEpF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,YAAY,QA6OjD;AAED,eAAe,iBAAiB,CAAC"}
@@ -129,11 +129,10 @@ export function brandingExtension(pi) {
129
129
  parts.push(theme.fg("muted", "·"), theme.fg(barColor, `ctx ${pct}%`), theme.fg(barColor, contextBar(pct, 10)));
130
130
  }
131
131
  const activeHudMode = getActiveHudMode();
132
- if (activeHudMode) {
132
+ if (activeHudMode === "subagents") {
133
133
  const extensionStatuses = footerData.getExtensionStatuses();
134
- const modeMetaKey = activeHudMode === "planning" ? "mu-planning-meta" : "mu-subagents-meta";
135
- const modeMeta = extensionStatuses.get(modeMetaKey) ?? "";
136
- parts.push(theme.fg("muted", "·"), theme.fg("accent", `hud:${activeHudMode}`));
134
+ const modeMeta = extensionStatuses.get("mu-subagents-meta") ?? "";
135
+ parts.push(theme.fg("muted", "·"), theme.fg("accent", "hud:subagents"));
137
136
  if (modeMeta.length > 0) {
138
137
  parts.push(theme.fg("muted", "·"), theme.fg("dim", truncateToWidth(modeMeta, 42)));
139
138
  }
@@ -12,10 +12,4 @@ export declare const serveExtensionPaths: string[];
12
12
  * Operator-mode extension — single facade that bundles operator UI helpers.
13
13
  */
14
14
  export declare const operatorExtensionPaths: string[];
15
- /**
16
- * Orchestrator and worker sessions run with the generic built-in tools
17
- * (bash/read/write/edit) and invoke `mu` CLI directly.
18
- */
19
- export declare const orchestratorToolExtensionPaths: string[];
20
- export declare const workerToolExtensionPaths: string[];
21
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAQzD;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAA4C,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAA+C,CAAC;AAEnF;;;GAGG;AACH,eAAO,MAAM,8BAA8B,EAAE,MAAM,EAAO,CAAC;AAC3D,eAAO,MAAM,wBAAwB,EAAE,MAAM,EAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAQzD;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAA4C,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAA+C,CAAC"}
@@ -16,9 +16,3 @@ export const serveExtensionPaths = [resolveBundledExtensionPath("mu-serve")];
16
16
  * Operator-mode extension — single facade that bundles operator UI helpers.
17
17
  */
18
18
  export const operatorExtensionPaths = [resolveBundledExtensionPath("mu-operator")];
19
- /**
20
- * Orchestrator and worker sessions run with the generic built-in tools
21
- * (bash/read/write/edit) and invoke `mu` CLI directly.
22
- */
23
- export const orchestratorToolExtensionPaths = [];
24
- export const workerToolExtensionPaths = [];
@@ -1 +1 @@
1
- {"version":3,"file":"planning-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/planning-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAigBpF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,QAuenD;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"planning-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/planning-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AA0gBpF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,QAuenD;AAED,eAAe,mBAAmB,CAAC"}
@@ -9,9 +9,9 @@ const DEFAULT_STEPS = [
9
9
  const BAR_CHARS = ["░", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"];
10
10
  const WIDGET_STEP_LIMIT = 4;
11
11
  const WIDGET_STEP_LABEL_MAX = 60;
12
- const WIDGET_ROOT_MAX = 20;
13
- const WIDGET_NEXT_MAX = 56;
14
- const WIDGET_BLOCKER_MAX = 56;
12
+ const WIDGET_ROOT_MAX = 24;
13
+ const WIDGET_NEXT_MAX = 76;
14
+ const WIDGET_BLOCKER_MAX = 76;
15
15
  function phaseTone(phase) {
16
16
  switch (phase) {
17
17
  case "investigating":
@@ -262,41 +262,53 @@ function renderPlanningUi(ctx, state) {
262
262
  const phase = summarizePhase(state.phase);
263
263
  const phaseColor = phaseTone(state.phase);
264
264
  const confidenceColor = confidenceTone(state.confidence);
265
- const rootLabel = state.rootIssueId ?? "(unset)";
266
265
  const meter = progressBar(done, total, 10);
267
- const waitingLabel = state.waitingOnUser ? "yes" : "no";
266
+ const waitingLabel = state.waitingOnUser ? "awaiting-user" : "active";
268
267
  const waitingColor = state.waitingOnUser ? "warning" : "dim";
269
- const rootCompact = shortLabel(rootLabel, "(unset)", WIDGET_ROOT_MAX);
270
- const nextCompact = shortLabel(state.nextAction, "(unset)", WIDGET_NEXT_MAX);
268
+ const rootCompact = state.rootIssueId ? shortLabel(state.rootIssueId, "", WIDGET_ROOT_MAX) : null;
269
+ const nextLabel = state.waitingOnUser ? "ask" : "next";
270
+ const nextFallback = state.waitingOnUser ? "(describe required user input)" : "(unset)";
271
+ const nextTone = state.waitingOnUser ? "warning" : "dim";
272
+ const nextCompact = shortLabel(state.nextAction, nextFallback, WIDGET_NEXT_MAX);
271
273
  const blockerCompact = shortLabel(state.blocker, "(none)", WIDGET_BLOCKER_MAX);
272
274
  const blockerColor = state.blocker ? "warning" : "dim";
273
- ctx.ui.setStatus("mu-planning", [
275
+ const statusParts = [
274
276
  ctx.ui.theme.fg("dim", "plan"),
275
277
  ctx.ui.theme.fg(phaseColor, phase),
276
278
  ctx.ui.theme.fg("dim", `${done}/${total}`),
277
279
  ctx.ui.theme.fg(phaseColor, meter),
278
- ctx.ui.theme.fg(waitingColor, `wait:${waitingLabel}`),
279
- ctx.ui.theme.fg("muted", `root:${rootCompact}`),
280
- ].join(` ${ctx.ui.theme.fg("muted", "·")} `));
281
- ctx.ui.setStatus("mu-planning-meta", `phase:${phase} steps:${done}/${total} wait:${waitingLabel} conf:${state.confidence}`);
280
+ ];
281
+ if (state.waitingOnUser) {
282
+ statusParts.push(ctx.ui.theme.fg("warning", "ask:user"));
283
+ }
284
+ if (state.blocker) {
285
+ statusParts.push(ctx.ui.theme.fg("warning", "blocked"));
286
+ }
287
+ ctx.ui.setStatus("mu-planning", statusParts.join(` ${ctx.ui.theme.fg("muted", "·")} `));
288
+ ctx.ui.setStatus("mu-planning-meta", undefined);
282
289
  const lines = [
283
290
  [
284
291
  ctx.ui.theme.fg("accent", ctx.ui.theme.bold("Planning")),
285
292
  ctx.ui.theme.fg("muted", "·"),
286
293
  ctx.ui.theme.fg(phaseColor, phase),
287
294
  ctx.ui.theme.fg("muted", "·"),
295
+ ctx.ui.theme.fg(waitingColor, waitingLabel),
296
+ ctx.ui.theme.fg("muted", "·"),
288
297
  ctx.ui.theme.fg("dim", `${done}/${total}`),
289
298
  ctx.ui.theme.fg(phaseColor, meter),
290
299
  ].join(" "),
291
- [
292
- ctx.ui.theme.fg("muted", `root:${rootCompact}`),
293
- ctx.ui.theme.fg("muted", "·"),
294
- ctx.ui.theme.fg(waitingColor, `wait:${waitingLabel}`),
295
- ctx.ui.theme.fg("muted", "·"),
296
- ctx.ui.theme.fg(confidenceColor, `conf:${state.confidence}`),
297
- ].join(" "),
298
- `${ctx.ui.theme.fg("muted", "next:")} ${ctx.ui.theme.fg("dim", nextCompact)}`,
299
300
  ];
301
+ const chips = [];
302
+ if (rootCompact) {
303
+ chips.push(ctx.ui.theme.fg("muted", `root:${rootCompact}`));
304
+ }
305
+ if (state.confidence !== "medium") {
306
+ chips.push(ctx.ui.theme.fg(confidenceColor, `conf:${state.confidence}`));
307
+ }
308
+ if (chips.length > 0) {
309
+ lines.push(chips.join(` ${ctx.ui.theme.fg("muted", "·")} `));
310
+ }
311
+ lines.push(`${ctx.ui.theme.fg("muted", `${nextLabel}:`)} ${ctx.ui.theme.fg(nextTone, nextCompact)}`);
300
312
  if (state.blocker) {
301
313
  lines.push(`${ctx.ui.theme.fg("muted", "blocker:")} ${ctx.ui.theme.fg(blockerColor, blockerCompact)}`);
302
314
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subagents-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/subagents-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AAw4BpF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAkoBpD;AAED,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"subagents-ui.d.ts","sourceRoot":"","sources":["../../src/extensions/subagents-ui.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AA63BpF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,QAkoBpD;AAED,eAAe,oBAAoB,CAAC"}
@@ -2,8 +2,8 @@ import { fetchMuJson, muServerUrl } from "./shared.js";
2
2
  import { clearHudMode, setActiveHudMode, syncHudModeStatus } from "./hud-mode.js";
3
3
  import { registerMuSubcommand } from "./mu-command-dispatcher.js";
4
4
  const DEFAULT_PREFIX = "mu-sub-";
5
- const DEFAULT_ROLE_TAG = "role:worker";
6
- const DEFAULT_SPAWN_MODE = "worker";
5
+ const DEFAULT_ISSUE_TAG_FILTER = null;
6
+ const DEFAULT_SPAWN_MODE = "operator";
7
7
  const ISSUE_LIST_LIMIT = 40;
8
8
  const MU_CLI_TIMEOUT_MS = 12_000;
9
9
  const DEFAULT_REFRESH_INTERVAL_MS = 8_000;
@@ -38,21 +38,13 @@ function issueHasSession(sessions, issueId) {
38
38
  }
39
39
  function buildSubagentPrompt(issue, mode) {
40
40
  switch (mode) {
41
- case "worker":
41
+ case "operator":
42
42
  return [
43
43
  `Work issue ${issue.id} (${truncateOneLine(issue.title, 80)}).`,
44
44
  `First run: mu issues claim ${issue.id}.`,
45
45
  `Keep forum updates in topic issue:${issue.id}.`,
46
46
  "When done, close with an explicit outcome and summary.",
47
47
  ].join(" ");
48
- case "reviewer":
49
- return [
50
- `Review issue ${issue.id} (${truncateOneLine(issue.title, 80)}).`,
51
- `First run: mu issues claim ${issue.id}.`,
52
- "Validate acceptance criteria with concrete checks and evidence.",
53
- "Post PASS/FAIL verdict, blockers, and required fixes in topic issue:<id>.",
54
- "Close the issue with explicit outcome and review summary.",
55
- ].join(" ");
56
48
  case "researcher":
57
49
  return [
58
50
  `Research issue ${issue.id} (${truncateOneLine(issue.title, 80)}).`,
@@ -98,7 +90,7 @@ function createDefaultState() {
98
90
  sessions: [],
99
91
  sessionError: null,
100
92
  issueRootId: null,
101
- issueRoleTag: DEFAULT_ROLE_TAG,
93
+ issueTagFilter: DEFAULT_ISSUE_TAG_FILTER,
102
94
  readyIssues: [],
103
95
  activeIssues: [],
104
96
  issueError: null,
@@ -265,16 +257,16 @@ async function listTmuxSessions(prefix) {
265
257
  .sort((left, right) => left.localeCompare(right));
266
258
  return { sessions, error: null };
267
259
  }
268
- async function listIssueSlices(rootId, roleTag) {
260
+ async function listIssueSlices(rootId, tagFilter) {
269
261
  const readyArgs = ["issues", "ready", "--json", "--limit", String(ISSUE_LIST_LIMIT)];
270
262
  const activeArgs = ["issues", "list", "--status", "in_progress", "--json", "--limit", String(ISSUE_LIST_LIMIT)];
271
263
  if (rootId) {
272
264
  readyArgs.push("--root", rootId);
273
265
  activeArgs.push("--root", rootId);
274
266
  }
275
- if (roleTag) {
276
- readyArgs.push("--tag", roleTag);
277
- activeArgs.push("--tag", roleTag);
267
+ if (tagFilter) {
268
+ readyArgs.push("--tag", tagFilter);
269
+ activeArgs.push("--tag", tagFilter);
278
270
  }
279
271
  const [readyOutcome, activeOutcome] = await Promise.all([runMuCli(readyArgs), runMuCli(activeArgs)]);
280
272
  if (readyOutcome.exitCode !== 0 || readyOutcome.error || readyOutcome.timedOut) {
@@ -370,7 +362,7 @@ function renderActivitySentence(event) {
370
362
  if (eventType === "forum.post") {
371
363
  const message = asRecord(payload?.message);
372
364
  const body = typeof message?.body === "string" ? message.body.trim() : "";
373
- const author = typeof message?.author === "string" ? message.author.trim() : "worker";
365
+ const author = typeof message?.author === "string" ? message.author.trim() : "operator";
374
366
  if (body.length === 0) {
375
367
  return null;
376
368
  }
@@ -466,19 +458,16 @@ function computeQueueDrift(sessions, activeIssues) {
466
458
  orphanSessions,
467
459
  };
468
460
  }
469
- function normalizeRoleTag(raw) {
461
+ function normalizeIssueTag(raw) {
470
462
  const trimmed = raw.trim();
471
463
  if (!trimmed || trimmed.toLowerCase() === "clear") {
472
464
  return null;
473
465
  }
474
- if (trimmed === "worker" || trimmed === "orchestrator" || trimmed === "reviewer" || trimmed === "researcher") {
475
- return `role:${trimmed}`;
476
- }
477
466
  return trimmed;
478
467
  }
479
468
  function parseSpawnMode(raw) {
480
469
  const value = raw.trim().toLowerCase();
481
- if (value === "worker" || value === "reviewer" || value === "researcher") {
470
+ if (value === "operator" || value === "researcher") {
482
471
  return value;
483
472
  }
484
473
  return null;
@@ -509,7 +498,7 @@ function parseSecondsBounded(secondsRaw, minSeconds, maxSeconds, field) {
509
498
  }
510
499
  function subagentsSnapshot(state, format) {
511
500
  const issueScope = state.issueRootId ?? "(all roots)";
512
- const roleScope = state.issueRoleTag ?? "(all roles)";
501
+ const tagScope = state.issueTagFilter ?? "(all tags)";
513
502
  const drift = computeQueueDrift(state.sessions, state.activeIssues);
514
503
  const refreshStale = isRefreshStale(state.lastUpdatedMs, state.staleAfterMs);
515
504
  const staleCount = drift.activeWithoutSessionIds.length + drift.orphanSessions.length;
@@ -524,7 +513,7 @@ function subagentsSnapshot(state, format) {
524
513
  `health: ${health}`,
525
514
  `prefix: ${state.prefix || "(all sessions)"}`,
526
515
  `issue_root: ${issueScope}`,
527
- `issue_role: ${roleScope}`,
516
+ `issue_tag_filter: ${tagScope}`,
528
517
  `spawn_mode: ${state.spawnMode}`,
529
518
  `spawn_paused: ${paused}`,
530
519
  `queues: ${state.readyIssues.length} ready / ${state.activeIssues.length} active`,
@@ -542,7 +531,7 @@ function subagentsSnapshot(state, format) {
542
531
  "HUD(subagents)",
543
532
  `health=${health}`,
544
533
  `root=${issueScope}`,
545
- `role=${roleScope}`,
534
+ `tag=${tagScope}`,
546
535
  `mode=${state.spawnMode}`,
547
536
  `paused=${paused}`,
548
537
  `ready=${state.readyIssues.length}`,
@@ -564,8 +553,8 @@ function renderSubagentsUi(ctx, state) {
564
553
  return;
565
554
  }
566
555
  const issueScope = state.issueRootId ? `root:${state.issueRootId}` : "all-roots";
567
- const roleScope = state.issueRoleTag ? state.issueRoleTag : "(all roles)";
568
- const scopeCompact = truncateOneLine(`${issueScope} · ${roleScope}`, WIDGET_SCOPE_MAX);
556
+ const tagScope = state.issueTagFilter ? state.issueTagFilter : "(all tags)";
557
+ const scopeCompact = truncateOneLine(`${issueScope} · ${tagScope}`, WIDGET_SCOPE_MAX);
569
558
  const prefixCompact = truncateOneLine(state.prefix || "(all sessions)", WIDGET_PREFIX_MAX);
570
559
  const refreshStale = isRefreshStale(state.lastUpdatedMs, state.staleAfterMs);
571
560
  const drift = computeQueueDrift(state.sessions, state.activeIssues);
@@ -651,7 +640,7 @@ function renderSubagentsUi(ctx, state) {
651
640
  lines.push(ctx.ui.theme.fg("muted", "(no recent subagent updates yet)"));
652
641
  }
653
642
  else {
654
- lines.push(ctx.ui.theme.fg("muted", "(no active workers)"));
643
+ lines.push(ctx.ui.theme.fg("muted", "(no active operators)"));
655
644
  }
656
645
  }
657
646
  else {
@@ -667,8 +656,8 @@ function subagentsUsageText() {
667
656
  " /mu subagents on|off|toggle|status|refresh|snapshot",
668
657
  " /mu subagents prefix <text|clear>",
669
658
  " /mu subagents root <issue-id|clear>",
670
- " /mu subagents role <tag|clear>",
671
- " /mu subagents mode <worker|reviewer|researcher>",
659
+ " /mu subagents tag <tag|clear>",
660
+ " /mu subagents mode <operator|researcher>",
672
661
  " /mu subagents refresh-interval <seconds>",
673
662
  " /mu subagents stale-after <seconds>",
674
663
  " /mu subagents pause <on|off>",
@@ -681,7 +670,7 @@ function subagentsDetails(state) {
681
670
  enabled: state.enabled,
682
671
  prefix: state.prefix,
683
672
  issue_root_id: state.issueRootId,
684
- issue_role_tag: state.issueRoleTag,
673
+ issue_tag_filter: state.issueTagFilter,
685
674
  spawn_mode: state.spawnMode,
686
675
  spawn_paused: state.spawnPaused,
687
676
  refresh_seconds: Math.round(state.refreshIntervalMs / 1_000),
@@ -722,7 +711,7 @@ export function subagentsUiExtension(pi) {
722
711
  }
723
712
  const [tmux, issues] = await Promise.all([
724
713
  listTmuxSessions(state.prefix),
725
- listIssueSlices(state.issueRootId, state.issueRoleTag),
714
+ listIssueSlices(state.issueRootId, state.issueTagFilter),
726
715
  ]);
727
716
  state.sessions = tmux.sessions;
728
717
  state.sessionError = tmux.error;
@@ -780,7 +769,7 @@ export function subagentsUiExtension(pi) {
780
769
  const when = state.lastUpdatedMs == null ? "never" : new Date(state.lastUpdatedMs).toLocaleTimeString();
781
770
  const status = state.enabled ? "enabled" : "disabled";
782
771
  const issueScope = state.issueRootId ?? "(all roots)";
783
- const issueRole = state.issueRoleTag ?? "(all roles)";
772
+ const issueTag = state.issueTagFilter ?? "(all tags)";
784
773
  const drift = computeQueueDrift(state.sessions, state.activeIssues);
785
774
  const refreshStale = isRefreshStale(state.lastUpdatedMs, state.staleAfterMs);
786
775
  const issueError = state.issueError ? `\nissue_error: ${state.issueError}` : "";
@@ -803,7 +792,7 @@ export function subagentsUiExtension(pi) {
803
792
  `Subagents monitor ${status}`,
804
793
  `prefix: ${state.prefix || "(all sessions)"}`,
805
794
  `issue_root: ${issueScope}`,
806
- `issue_role: ${issueRole}`,
795
+ `issue_tag_filter: ${issueTag}`,
807
796
  `spawn_mode: ${state.spawnMode}`,
808
797
  `spawn_paused: ${state.spawnPaused ? "yes" : "no"}`,
809
798
  `refresh_seconds: ${Math.round(state.refreshIntervalMs / 1_000)}`,
@@ -877,18 +866,18 @@ export function subagentsUiExtension(pi) {
877
866
  await refresh(ctx);
878
867
  return { ok: true, message: `Subagents root set to ${state.issueRootId ?? "(all roots)"}.`, level: "info" };
879
868
  }
880
- case "set_role": {
881
- const value = params.role_tag?.trim();
869
+ case "set_tag": {
870
+ const value = params.issue_tag?.trim();
882
871
  if (!value) {
883
- return { ok: false, message: "Missing role/tag value.", level: "error" };
872
+ return { ok: false, message: "Missing tag value.", level: "error" };
884
873
  }
885
- state.issueRoleTag = normalizeRoleTag(value);
874
+ state.issueTagFilter = normalizeIssueTag(value);
886
875
  state.enabled = true;
887
876
  ensurePolling();
888
877
  await refresh(ctx);
889
878
  return {
890
879
  ok: true,
891
- message: `Subagents issue tag filter set to ${state.issueRoleTag ?? "(all roles)"}.`,
880
+ message: `Subagents issue tag filter set to ${state.issueTagFilter ?? "(all tags)"}.`,
892
881
  level: "info",
893
882
  };
894
883
  }
@@ -973,16 +962,16 @@ export function subagentsUiExtension(pi) {
973
962
  state.issueRootId = trimmed.toLowerCase() === "clear" ? null : trimmed;
974
963
  changed.push("root_issue_id");
975
964
  }
976
- if (params.role_tag !== undefined) {
977
- if (typeof params.role_tag !== "string") {
978
- return { ok: false, message: "role_tag must be a string.", level: "error" };
965
+ if (params.issue_tag !== undefined) {
966
+ if (typeof params.issue_tag !== "string") {
967
+ return { ok: false, message: "issue_tag must be a string.", level: "error" };
979
968
  }
980
- const trimmed = params.role_tag.trim();
969
+ const trimmed = params.issue_tag.trim();
981
970
  if (trimmed.length === 0) {
982
- return { ok: false, message: "role_tag must not be empty.", level: "error" };
971
+ return { ok: false, message: "issue_tag must not be empty.", level: "error" };
983
972
  }
984
- state.issueRoleTag = normalizeRoleTag(trimmed);
985
- changed.push("role_tag");
973
+ state.issueTagFilter = normalizeIssueTag(trimmed);
974
+ changed.push("issue_tag");
986
975
  }
987
976
  if (params.spawn_mode !== undefined) {
988
977
  if (typeof params.spawn_mode !== "string") {
@@ -1056,7 +1045,7 @@ export function subagentsUiExtension(pi) {
1056
1045
  }
1057
1046
  spawnLimit = parsed;
1058
1047
  }
1059
- const issueSlices = await listIssueSlices(state.issueRootId, state.issueRoleTag);
1048
+ const issueSlices = await listIssueSlices(state.issueRootId, state.issueTagFilter);
1060
1049
  state.readyIssues = issueSlices.ready;
1061
1050
  state.activeIssues = issueSlices.active;
1062
1051
  state.issueError = issueSlices.error;
@@ -1153,7 +1142,7 @@ export function subagentsUiExtension(pi) {
1153
1142
  registerMuSubcommand(pi, {
1154
1143
  subcommand: "subagents",
1155
1144
  summary: "Monitor tmux subagent sessions + issue queue, and spawn ready issue sessions",
1156
- usage: "/mu subagents on|off|toggle|status|refresh|snapshot|prefix|root|role|mode|refresh-interval|stale-after|pause|spawn",
1145
+ usage: "/mu subagents on|off|toggle|status|refresh|snapshot|prefix|root|tag|mode|refresh-interval|stale-after|pause|spawn",
1157
1146
  handler: async (args, ctx) => {
1158
1147
  activeCtx = ctx;
1159
1148
  const tokens = args
@@ -1187,8 +1176,8 @@ export function subagentsUiExtension(pi) {
1187
1176
  case "root":
1188
1177
  params = { action: "set_root", root_issue_id: tokens.slice(1).join(" ") };
1189
1178
  break;
1190
- case "role":
1191
- params = { action: "set_role", role_tag: tokens.slice(1).join(" ") };
1179
+ case "tag":
1180
+ params = { action: "set_tag", issue_tag: tokens.slice(1).join(" ") };
1192
1181
  break;
1193
1182
  case "mode":
1194
1183
  params = { action: "set_mode", spawn_mode: tokens[1] };
@@ -1248,7 +1237,7 @@ export function subagentsUiExtension(pi) {
1248
1237
  "refresh",
1249
1238
  "set_prefix",
1250
1239
  "set_root",
1251
- "set_role",
1240
+ "set_tag",
1252
1241
  "set_mode",
1253
1242
  "set_refresh_interval",
1254
1243
  "set_stale_after",
@@ -1259,8 +1248,8 @@ export function subagentsUiExtension(pi) {
1259
1248
  },
1260
1249
  prefix: { type: "string" },
1261
1250
  root_issue_id: { type: "string" },
1262
- role_tag: { type: "string" },
1263
- spawn_mode: { type: "string", enum: ["worker", "reviewer", "researcher"] },
1251
+ issue_tag: { type: "string" },
1252
+ spawn_mode: { type: "string", enum: ["operator", "researcher"] },
1264
1253
  refresh_seconds: { type: "number", minimum: MIN_REFRESH_SECONDS, maximum: MAX_REFRESH_SECONDS },
1265
1254
  stale_after_seconds: { type: "number", minimum: MIN_STALE_SECONDS, maximum: MAX_STALE_SECONDS },
1266
1255
  spawn_paused: { type: "boolean" },
package/dist/index.d.ts CHANGED
@@ -1,9 +1,8 @@
1
1
  export * from "./backend.js";
2
2
  export * from "./command_context.js";
3
- export { DEFAULT_OPERATOR_SYSTEM_PROMPT, DEFAULT_ORCHESTRATOR_PROMPT, DEFAULT_REVIEWER_PROMPT, DEFAULT_SOUL_PROMPT, DEFAULT_WORKER_PROMPT, appendSharedSoul, loadBundledPrompt, } from "./default_prompts.js";
3
+ export { DEFAULT_OPERATOR_SYSTEM_PROMPT, DEFAULT_SOUL_PROMPT, appendSharedSoul, loadBundledPrompt, } from "./default_prompts.js";
4
4
  export * from "./extensions/index.js";
5
5
  export * from "./operator.js";
6
- export * from "./mu_roles.js";
7
6
  export * from "./prompt.js";
8
7
  export * from "./session_factory.js";
9
8
  export * from "./session_turn.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACN,8BAA8B,EAC9B,2BAA2B,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACN,8BAA8B,EAC9B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,9 +1,8 @@
1
1
  export * from "./backend.js";
2
2
  export * from "./command_context.js";
3
- export { DEFAULT_OPERATOR_SYSTEM_PROMPT, DEFAULT_ORCHESTRATOR_PROMPT, DEFAULT_REVIEWER_PROMPT, DEFAULT_SOUL_PROMPT, DEFAULT_WORKER_PROMPT, appendSharedSoul, loadBundledPrompt, } from "./default_prompts.js";
3
+ export { DEFAULT_OPERATOR_SYSTEM_PROMPT, DEFAULT_SOUL_PROMPT, appendSharedSoul, loadBundledPrompt, } from "./default_prompts.js";
4
4
  export * from "./extensions/index.js";
5
5
  export * from "./operator.js";
6
- export * from "./mu_roles.js";
7
6
  export * from "./prompt.js";
8
7
  export * from "./session_factory.js";
9
8
  export * from "./session_turn.js";