@femtomc/mu-agent 26.2.99 → 26.2.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,6 +27,7 @@ into `~/.mu/skills/` (or `$MU_HOME/skills/`) when missing:
27
27
  - `mu`
28
28
  - `memory`
29
29
  - `planning`
30
+ - `hud`
30
31
  - `hierarchical-work-protocol`
31
32
  - `subagents`
32
33
  - `heartbeats`
@@ -36,6 +37,9 @@ into `~/.mu/skills/` (or `$MU_HOME/skills/`) when missing:
36
37
  - `setup-telegram`
37
38
  - `setup-neovim`
38
39
 
40
+ Starter skills are version-synced by the CLI bootstrap path when users run `mu`
41
+ commands after upgrading.
42
+
39
43
  ## Install
40
44
 
41
45
  ```bash
@@ -62,8 +66,9 @@ Current stack:
62
66
 
63
67
  - `brandingExtension` — mu compact header/footer branding + default theme
64
68
  - `eventLogExtension` — event tail + watch widget
65
- - `planningUiExtension` — planning mode: compact HUD for next-step/approval flow in widget/status surfaces while keeping the branding footer unchanged (`/mu plan ...`)
66
- - `subagentsUiExtension` — subagents mode: compact HUD with activity sentences from issue/forum events, with state kept in widget/status surfaces while branding footer stays unchanged (`/mu subagents ...`)
69
+ - `hudExtension` — HUD surface for skill-directed planning/subagents communication (`/mu hud ...`, `mu_hud`)
70
+
71
+ Extensions emit contract-valid `hud_docs` (`HudDoc`) so control-plane/server renderers can provide a consistent cross-surface HUD experience.
67
72
 
68
73
  Default operator UI theme is `mu-gruvbox-dark`.
69
74
 
@@ -72,8 +77,7 @@ Default operator UI theme is `mu-gruvbox-dark`.
72
77
  - `/mu events [n]` / `/mu events tail [n]` — event log tail
73
78
  - `/mu events watch on|off` — toggle event watch widget
74
79
  - `/mu brand on|off|toggle` — enable/disable UI branding
75
- - `/mu plan ...` — planning HUD (phases, checklist editing, communication state, snapshots); does not inject planning metadata into branding footer
76
- - `/mu subagents ...` — tmux + issue queue monitor/spawner (profiles, spawn pause, stale/refresh controls, snapshots); does not inject subagents metadata into branding footer
80
+ - `/mu hud ...` — HUD command for enabling/inspecting/clearing HUD docs; does not inject HUD metadata into branding footer
77
81
  - `/mu help` — dispatcher catalog of registered `/mu` subcommands
78
82
 
79
83
  ## Tooling model (CLI-first)
@@ -0,0 +1,4 @@
1
+ import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
+ export declare function hudExtension(pi: ExtensionAPI): void;
3
+ export default hudExtension;
4
+ //# sourceMappingURL=hud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hud.d.ts","sourceRoot":"","sources":["../../src/extensions/hud.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,+BAA+B,CAAC;AA8QpF,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,QAuE5C;AAED,eAAe,YAAY,CAAC"}
@@ -0,0 +1,282 @@
1
+ import { HudDocSchema, normalizeHudDocs, serializeHudDocsTextFallback } from "@femtomc/mu-core";
2
+ import { registerMuSubcommand } from "./mu-command-dispatcher.js";
3
+ const HUD_DISPLAY_DOCS_MAX = 16;
4
+ const HUD_STORE_DOCS_MAX = 64;
5
+ const HUD_LINE_MAX = 120;
6
+ function createDefaultState() {
7
+ return {
8
+ enabled: false,
9
+ docsById: new Map(),
10
+ };
11
+ }
12
+ function parseSnapshotFormat(raw) {
13
+ const value = (raw ?? "compact").trim().toLowerCase();
14
+ return value === "multiline" ? "multiline" : "compact";
15
+ }
16
+ function short(text, max = HUD_LINE_MAX) {
17
+ const normalized = text.replace(/\s+/g, " ").trim();
18
+ if (normalized.length <= max) {
19
+ return normalized;
20
+ }
21
+ if (max <= 1) {
22
+ return "…";
23
+ }
24
+ return `${normalized.slice(0, max - 1)}…`;
25
+ }
26
+ function activeDocs(state, maxDocs = HUD_DISPLAY_DOCS_MAX) {
27
+ return normalizeHudDocs([...state.docsById.values()], { maxDocs });
28
+ }
29
+ function statusSummary(state) {
30
+ const docs = activeDocs(state, HUD_STORE_DOCS_MAX);
31
+ const ids = docs.map((doc) => doc.hud_id).join(", ") || "(none)";
32
+ return [
33
+ `HUD: ${state.enabled ? "enabled" : "disabled"}`,
34
+ `docs: ${docs.length}`,
35
+ `ids: ${ids}`,
36
+ ].join("\n");
37
+ }
38
+ function renderHud(ctx, state) {
39
+ if (!ctx.hasUI) {
40
+ return;
41
+ }
42
+ const docs = activeDocs(state);
43
+ if (!state.enabled || docs.length === 0) {
44
+ ctx.ui.setStatus("mu-hud", undefined);
45
+ ctx.ui.setWidget("mu-hud", undefined);
46
+ return;
47
+ }
48
+ const idLabel = short(docs.map((doc) => doc.hud_id).join(", "), 64);
49
+ ctx.ui.setStatus("mu-hud", [
50
+ ctx.ui.theme.fg("dim", "hud"),
51
+ ctx.ui.theme.fg("muted", "·"),
52
+ ctx.ui.theme.fg("accent", `${docs.length}`),
53
+ ctx.ui.theme.fg("muted", "·"),
54
+ ctx.ui.theme.fg("dim", idLabel),
55
+ ].join(" "));
56
+ const snapshot = serializeHudDocsTextFallback(docs, {
57
+ mode: "multiline",
58
+ maxDocs: HUD_DISPLAY_DOCS_MAX,
59
+ maxSectionItems: 6,
60
+ maxActions: 4,
61
+ maxChars: 8_000,
62
+ });
63
+ const lines = snapshot
64
+ .split(/\r?\n/)
65
+ .map((line) => short(line, HUD_LINE_MAX))
66
+ .filter((line) => line.length > 0);
67
+ ctx.ui.setWidget("mu-hud", lines.length > 0 ? lines : ["(hud enabled, no docs)"], { placement: "belowEditor" });
68
+ }
69
+ function parseHudDoc(input) {
70
+ const parsed = HudDocSchema.safeParse(input);
71
+ if (!parsed.success) {
72
+ return { ok: false, error: parsed.error.issues[0]?.message ?? "Invalid HUD doc." };
73
+ }
74
+ return { ok: true, doc: parsed.data };
75
+ }
76
+ function parseHudDocList(input) {
77
+ if (!Array.isArray(input)) {
78
+ return { ok: false, error: "docs must be an array." };
79
+ }
80
+ const docs = [];
81
+ for (let idx = 0; idx < input.length; idx += 1) {
82
+ const parsed = parseHudDoc(input[idx]);
83
+ if (!parsed.ok) {
84
+ return { ok: false, error: `docs[${idx}]: ${parsed.error}` };
85
+ }
86
+ docs.push(parsed.doc);
87
+ }
88
+ return { ok: true, docs: normalizeHudDocs(docs, { maxDocs: HUD_STORE_DOCS_MAX }) };
89
+ }
90
+ function hudToolResult(opts) {
91
+ const docs = activeDocs(opts.state, HUD_STORE_DOCS_MAX);
92
+ return {
93
+ content: [{ type: "text", text: opts.message }],
94
+ hud_docs: docs,
95
+ details: {
96
+ ok: opts.ok,
97
+ action: opts.action,
98
+ enabled: opts.state.enabled,
99
+ doc_count: docs.length,
100
+ hud_ids: docs.map((doc) => doc.hud_id),
101
+ ...(opts.ok ? {} : { error: opts.message }),
102
+ ...(opts.extra ?? {}),
103
+ },
104
+ };
105
+ }
106
+ function applyHudAction(params, state) {
107
+ switch (params.action) {
108
+ case "status": {
109
+ return {
110
+ ok: true,
111
+ action: "status",
112
+ message: statusSummary(state),
113
+ };
114
+ }
115
+ case "snapshot": {
116
+ const mode = parseSnapshotFormat(params.snapshot_format);
117
+ const docs = activeDocs(state, HUD_STORE_DOCS_MAX);
118
+ const message = docs.length
119
+ ? serializeHudDocsTextFallback(docs, { mode, maxDocs: HUD_STORE_DOCS_MAX, maxSectionItems: 8, maxActions: 6 })
120
+ : "(no HUD docs)";
121
+ return {
122
+ ok: true,
123
+ action: "snapshot",
124
+ message,
125
+ extra: { snapshot_format: mode },
126
+ };
127
+ }
128
+ case "on":
129
+ state.enabled = true;
130
+ return { ok: true, action: "on", message: "HUD enabled." };
131
+ case "off":
132
+ state.enabled = false;
133
+ return { ok: true, action: "off", message: "HUD disabled." };
134
+ case "toggle":
135
+ state.enabled = !state.enabled;
136
+ return { ok: true, action: "toggle", message: `HUD ${state.enabled ? "enabled" : "disabled"}.` };
137
+ case "set":
138
+ case "update": {
139
+ const parsed = parseHudDoc(params.doc);
140
+ if (!parsed.ok) {
141
+ return { ok: false, action: params.action, message: parsed.error };
142
+ }
143
+ state.enabled = true;
144
+ state.docsById.set(parsed.doc.hud_id, parsed.doc);
145
+ return {
146
+ ok: true,
147
+ action: params.action,
148
+ message: `HUD doc set: ${parsed.doc.hud_id}`,
149
+ extra: { hud_id: parsed.doc.hud_id },
150
+ };
151
+ }
152
+ case "replace": {
153
+ const parsed = parseHudDocList(params.docs);
154
+ if (!parsed.ok) {
155
+ return { ok: false, action: "replace", message: parsed.error };
156
+ }
157
+ state.docsById.clear();
158
+ for (const doc of parsed.docs) {
159
+ state.docsById.set(doc.hud_id, doc);
160
+ }
161
+ state.enabled = true;
162
+ return { ok: true, action: "replace", message: `HUD docs replaced (${parsed.docs.length}).` };
163
+ }
164
+ case "remove": {
165
+ const hudId = (params.hud_id ?? "").trim();
166
+ if (!hudId) {
167
+ return { ok: false, action: "remove", message: "Missing hud_id." };
168
+ }
169
+ const removed = state.docsById.delete(hudId);
170
+ if (!removed) {
171
+ return { ok: false, action: "remove", message: `HUD doc not found: ${hudId}` };
172
+ }
173
+ return { ok: true, action: "remove", message: `HUD doc removed: ${hudId}` };
174
+ }
175
+ case "clear":
176
+ state.docsById.clear();
177
+ return { ok: true, action: "clear", message: "HUD docs cleared." };
178
+ }
179
+ }
180
+ function usageText() {
181
+ return [
182
+ "Usage:",
183
+ " /mu hud status|snapshot",
184
+ " /mu hud on|off|toggle",
185
+ " /mu hud clear",
186
+ " /mu hud remove <hud-id>",
187
+ "",
188
+ "For setting/updating docs, use the mu_hud tool with action=set|update|replace.",
189
+ ].join("\n");
190
+ }
191
+ function parseCommandAction(args) {
192
+ const tokens = args
193
+ .trim()
194
+ .split(/\s+/)
195
+ .filter((token) => token.length > 0);
196
+ const command = tokens[0] ?? "status";
197
+ switch (command) {
198
+ case "status":
199
+ return { action: "status" };
200
+ case "snapshot":
201
+ return { action: "snapshot", snapshot_format: tokens[1] };
202
+ case "on":
203
+ return { action: "on" };
204
+ case "off":
205
+ return { action: "off" };
206
+ case "toggle":
207
+ return { action: "toggle" };
208
+ case "clear":
209
+ return { action: "clear" };
210
+ case "remove":
211
+ return { action: "remove", hud_id: tokens[1] };
212
+ default:
213
+ return null;
214
+ }
215
+ }
216
+ export function hudExtension(pi) {
217
+ const state = createDefaultState();
218
+ const refresh = (ctx) => {
219
+ renderHud(ctx, state);
220
+ };
221
+ pi.on("session_start", async (_event, ctx) => {
222
+ refresh(ctx);
223
+ });
224
+ pi.on("session_switch", async (_event, ctx) => {
225
+ refresh(ctx);
226
+ });
227
+ pi.on("session_shutdown", async (_event, ctx) => {
228
+ if (!ctx.hasUI) {
229
+ return;
230
+ }
231
+ ctx.ui.setStatus("mu-hud", undefined);
232
+ ctx.ui.setWidget("mu-hud", undefined);
233
+ });
234
+ registerMuSubcommand(pi, {
235
+ subcommand: "hud",
236
+ summary: "HUD status and rendering controls",
237
+ usage: "/mu hud status|snapshot|on|off|toggle|clear|remove <hud-id>",
238
+ handler: async (args, ctx) => {
239
+ const parsed = parseCommandAction(args);
240
+ if (!parsed) {
241
+ ctx.ui.notify(usageText(), "error");
242
+ return;
243
+ }
244
+ const result = applyHudAction(parsed, state);
245
+ refresh(ctx);
246
+ ctx.ui.notify(result.message, result.ok ? "info" : "error");
247
+ },
248
+ });
249
+ pi.registerTool({
250
+ name: "mu_hud",
251
+ label: "mu HUD",
252
+ description: "Control or inspect HUD docs rendered in the TUI and shared across channel renderers.",
253
+ parameters: {
254
+ type: "object",
255
+ properties: {
256
+ action: {
257
+ type: "string",
258
+ enum: ["status", "snapshot", "on", "off", "toggle", "set", "update", "replace", "remove", "clear"],
259
+ },
260
+ doc: { type: "object", additionalProperties: true },
261
+ docs: { type: "array", items: { type: "object", additionalProperties: true } },
262
+ hud_id: { type: "string" },
263
+ snapshot_format: { type: "string", enum: ["compact", "multiline"] },
264
+ },
265
+ required: ["action"],
266
+ additionalProperties: false,
267
+ },
268
+ execute: async (_toolCallId, paramsRaw, _signal, _onUpdate, ctx) => {
269
+ const params = paramsRaw;
270
+ const result = applyHudAction(params, state);
271
+ refresh(ctx);
272
+ return hudToolResult({
273
+ state,
274
+ ok: result.ok,
275
+ action: result.action,
276
+ message: result.message,
277
+ extra: result.extra,
278
+ });
279
+ },
280
+ });
281
+ }
282
+ export default hudExtension;
@@ -1,9 +1,8 @@
1
1
  export { brandingExtension } from "./branding.js";
2
2
  export { eventLogExtension } from "./event-log.js";
3
+ export { hudExtension } from "./hud.js";
3
4
  export { muOperatorExtension } from "./mu-operator.js";
4
5
  export { muServeExtension } from "./mu-serve.js";
5
- export { planningUiExtension } from "./planning-ui.js";
6
- export { subagentsUiExtension } from "./subagents-ui.js";
7
6
  /**
8
7
  * Serve-mode extension — single facade that bundles all serve extensions.
9
8
  */
@@ -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"}
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,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAQjD;;GAEG;AACH,eAAO,MAAM,mBAAmB,UAA4C,CAAC;AAE7E;;GAEG;AACH,eAAO,MAAM,sBAAsB,UAA+C,CAAC"}
@@ -1,9 +1,8 @@
1
1
  export { brandingExtension } from "./branding.js";
2
2
  export { eventLogExtension } from "./event-log.js";
3
+ export { hudExtension } from "./hud.js";
3
4
  export { muOperatorExtension } from "./mu-operator.js";
4
5
  export { muServeExtension } from "./mu-serve.js";
5
- export { planningUiExtension } from "./planning-ui.js";
6
- export { subagentsUiExtension } from "./subagents-ui.js";
7
6
  const RUNTIME_EXTENSION = import.meta.url.endsWith(".ts") ? "ts" : "js";
8
7
  function resolveBundledExtensionPath(moduleBasename) {
9
8
  return new URL(`./${moduleBasename}.${RUNTIME_EXTENSION}`, import.meta.url).pathname;
@@ -1 +1 @@
1
- {"version":3,"file":"mu-operator.d.ts","sourceRoot":"","sources":["../../src/extensions/mu-operator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,QAKnD;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"mu-operator.d.ts","sourceRoot":"","sources":["../../src/extensions/mu-operator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,QAInD;AAED,eAAe,mBAAmB,CAAC"}
@@ -6,12 +6,10 @@
6
6
  */
7
7
  import { brandingExtension } from "./branding.js";
8
8
  import { eventLogExtension } from "./event-log.js";
9
- import { planningUiExtension } from "./planning-ui.js";
10
- import { subagentsUiExtension } from "./subagents-ui.js";
9
+ import { hudExtension } from "./hud.js";
11
10
  export function muOperatorExtension(pi) {
11
+ hudExtension(pi);
12
12
  brandingExtension(pi);
13
13
  eventLogExtension(pi);
14
- planningUiExtension(pi);
15
- subagentsUiExtension(pi);
16
14
  }
17
15
  export default muOperatorExtension;
@@ -1 +1 @@
1
- {"version":3,"file":"mu-serve.d.ts","sourceRoot":"","sources":["../../src/extensions/mu-serve.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAMlE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,QAKhD;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"mu-serve.d.ts","sourceRoot":"","sources":["../../src/extensions/mu-serve.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAKlE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,YAAY,QAIhD;AAED,eAAe,gBAAgB,CAAC"}
@@ -6,12 +6,10 @@
6
6
  */
7
7
  import { brandingExtension } from "./branding.js";
8
8
  import { eventLogExtension } from "./event-log.js";
9
- import { planningUiExtension } from "./planning-ui.js";
10
- import { subagentsUiExtension } from "./subagents-ui.js";
9
+ import { hudExtension } from "./hud.js";
11
10
  export function muServeExtension(pi) {
11
+ hudExtension(pi);
12
12
  brandingExtension(pi);
13
13
  eventLogExtension(pi);
14
- planningUiExtension(pi);
15
- subagentsUiExtension(pi);
16
14
  }
17
15
  export default muServeExtension;
@@ -1,3 +1,4 @@
1
+ import { type HudDoc } from "@femtomc/mu-core";
1
2
  import { z } from "zod";
2
3
  import { CommandContextResolver } from "./command_context.js";
3
4
  import { type CreateMuSessionOpts, type MuSession } from "./session_factory.js";
@@ -58,6 +59,82 @@ export type OperatorApprovedCommand = z.infer<typeof OperatorApprovedCommandSche
58
59
  export declare const OperatorBackendTurnResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
59
60
  kind: z.ZodLiteral<"respond">;
60
61
  message: z.ZodString;
62
+ hud_docs: z.ZodOptional<z.ZodArray<z.ZodObject<{
63
+ v: z.ZodDefault<z.ZodLiteral<1>>;
64
+ hud_id: z.ZodString;
65
+ title: z.ZodString;
66
+ scope: z.ZodDefault<z.ZodNullable<z.ZodString>>;
67
+ chips: z.ZodDefault<z.ZodArray<z.ZodObject<{
68
+ key: z.ZodString;
69
+ label: z.ZodString;
70
+ tone: z.ZodOptional<z.ZodEnum<{
71
+ error: "error";
72
+ info: "info";
73
+ success: "success";
74
+ warning: "warning";
75
+ muted: "muted";
76
+ accent: "accent";
77
+ dim: "dim";
78
+ }>>;
79
+ }, z.core.$strict>>>;
80
+ sections: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
81
+ kind: z.ZodLiteral<"kv">;
82
+ title: z.ZodOptional<z.ZodString>;
83
+ items: z.ZodDefault<z.ZodArray<z.ZodObject<{
84
+ key: z.ZodString;
85
+ label: z.ZodString;
86
+ value: z.ZodString;
87
+ tone: z.ZodOptional<z.ZodEnum<{
88
+ error: "error";
89
+ info: "info";
90
+ success: "success";
91
+ warning: "warning";
92
+ muted: "muted";
93
+ accent: "accent";
94
+ dim: "dim";
95
+ }>>;
96
+ }, z.core.$strict>>>;
97
+ }, z.core.$strict>, z.ZodObject<{
98
+ kind: z.ZodLiteral<"checklist">;
99
+ title: z.ZodOptional<z.ZodString>;
100
+ items: z.ZodDefault<z.ZodArray<z.ZodObject<{
101
+ id: z.ZodString;
102
+ label: z.ZodString;
103
+ done: z.ZodBoolean;
104
+ }, z.core.$strict>>>;
105
+ }, z.core.$strict>, z.ZodObject<{
106
+ kind: z.ZodLiteral<"activity">;
107
+ title: z.ZodOptional<z.ZodString>;
108
+ lines: z.ZodDefault<z.ZodArray<z.ZodString>>;
109
+ }, z.core.$strict>, z.ZodObject<{
110
+ kind: z.ZodLiteral<"text">;
111
+ title: z.ZodOptional<z.ZodString>;
112
+ text: z.ZodString;
113
+ tone: z.ZodOptional<z.ZodEnum<{
114
+ error: "error";
115
+ info: "info";
116
+ success: "success";
117
+ warning: "warning";
118
+ muted: "muted";
119
+ accent: "accent";
120
+ dim: "dim";
121
+ }>>;
122
+ }, z.core.$strict>], "kind">>>;
123
+ actions: z.ZodDefault<z.ZodArray<z.ZodObject<{
124
+ id: z.ZodString;
125
+ label: z.ZodString;
126
+ command_text: z.ZodString;
127
+ kind: z.ZodOptional<z.ZodEnum<{
128
+ primary: "primary";
129
+ secondary: "secondary";
130
+ danger: "danger";
131
+ }>>;
132
+ }, z.core.$strict>>>;
133
+ snapshot_compact: z.ZodString;
134
+ snapshot_multiline: z.ZodOptional<z.ZodString>;
135
+ updated_at_ms: z.ZodNumber;
136
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
137
+ }, z.core.$strict>>>;
61
138
  }, z.core.$strip>, z.ZodObject<{
62
139
  kind: z.ZodLiteral<"command">;
63
140
  command: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -95,6 +172,82 @@ export declare const OperatorBackendTurnResultSchema: z.ZodDiscriminatedUnion<[z
95
172
  kind: z.ZodLiteral<"operator_thinking_set">;
96
173
  thinking: z.ZodString;
97
174
  }, z.core.$strip>], "kind">;
175
+ hud_docs: z.ZodOptional<z.ZodArray<z.ZodObject<{
176
+ v: z.ZodDefault<z.ZodLiteral<1>>;
177
+ hud_id: z.ZodString;
178
+ title: z.ZodString;
179
+ scope: z.ZodDefault<z.ZodNullable<z.ZodString>>;
180
+ chips: z.ZodDefault<z.ZodArray<z.ZodObject<{
181
+ key: z.ZodString;
182
+ label: z.ZodString;
183
+ tone: z.ZodOptional<z.ZodEnum<{
184
+ error: "error";
185
+ info: "info";
186
+ success: "success";
187
+ warning: "warning";
188
+ muted: "muted";
189
+ accent: "accent";
190
+ dim: "dim";
191
+ }>>;
192
+ }, z.core.$strict>>>;
193
+ sections: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
194
+ kind: z.ZodLiteral<"kv">;
195
+ title: z.ZodOptional<z.ZodString>;
196
+ items: z.ZodDefault<z.ZodArray<z.ZodObject<{
197
+ key: z.ZodString;
198
+ label: z.ZodString;
199
+ value: z.ZodString;
200
+ tone: z.ZodOptional<z.ZodEnum<{
201
+ error: "error";
202
+ info: "info";
203
+ success: "success";
204
+ warning: "warning";
205
+ muted: "muted";
206
+ accent: "accent";
207
+ dim: "dim";
208
+ }>>;
209
+ }, z.core.$strict>>>;
210
+ }, z.core.$strict>, z.ZodObject<{
211
+ kind: z.ZodLiteral<"checklist">;
212
+ title: z.ZodOptional<z.ZodString>;
213
+ items: z.ZodDefault<z.ZodArray<z.ZodObject<{
214
+ id: z.ZodString;
215
+ label: z.ZodString;
216
+ done: z.ZodBoolean;
217
+ }, z.core.$strict>>>;
218
+ }, z.core.$strict>, z.ZodObject<{
219
+ kind: z.ZodLiteral<"activity">;
220
+ title: z.ZodOptional<z.ZodString>;
221
+ lines: z.ZodDefault<z.ZodArray<z.ZodString>>;
222
+ }, z.core.$strict>, z.ZodObject<{
223
+ kind: z.ZodLiteral<"text">;
224
+ title: z.ZodOptional<z.ZodString>;
225
+ text: z.ZodString;
226
+ tone: z.ZodOptional<z.ZodEnum<{
227
+ error: "error";
228
+ info: "info";
229
+ success: "success";
230
+ warning: "warning";
231
+ muted: "muted";
232
+ accent: "accent";
233
+ dim: "dim";
234
+ }>>;
235
+ }, z.core.$strict>], "kind">>>;
236
+ actions: z.ZodDefault<z.ZodArray<z.ZodObject<{
237
+ id: z.ZodString;
238
+ label: z.ZodString;
239
+ command_text: z.ZodString;
240
+ kind: z.ZodOptional<z.ZodEnum<{
241
+ primary: "primary";
242
+ secondary: "secondary";
243
+ danger: "danger";
244
+ }>>;
245
+ }, z.core.$strict>>>;
246
+ snapshot_compact: z.ZodString;
247
+ snapshot_multiline: z.ZodOptional<z.ZodString>;
248
+ updated_at_ms: z.ZodNumber;
249
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
250
+ }, z.core.$strict>>>;
98
251
  }, z.core.$strip>], "kind">;
99
252
  export type OperatorBackendTurnResult = z.infer<typeof OperatorBackendTurnResultSchema>;
100
253
  export type OperatorBackendTurnInput = {
@@ -111,11 +264,13 @@ export interface MessagingOperatorBackend {
111
264
  export type OperatorDecision = {
112
265
  kind: "response";
113
266
  message: string;
267
+ hud_docs?: HudDoc[];
114
268
  operatorSessionId: string;
115
269
  operatorTurnId: string;
116
270
  } | {
117
271
  kind: "command";
118
272
  commandText: string;
273
+ hud_docs?: HudDoc[];
119
274
  operatorSessionId: string;
120
275
  operatorTurnId: string;
121
276
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}