@femtomc/mu-agent 26.2.71 → 26.2.73

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 (83) hide show
  1. package/README.md +27 -37
  2. package/dist/extensions/branding.d.ts +1 -1
  3. package/dist/extensions/branding.js +1 -1
  4. package/dist/extensions/index.d.ts +5 -13
  5. package/dist/extensions/index.d.ts.map +1 -1
  6. package/dist/extensions/index.js +7 -15
  7. package/dist/extensions/mu-operator.d.ts +2 -2
  8. package/dist/extensions/mu-operator.js +4 -4
  9. package/dist/extensions/mu-serve.d.ts +2 -2
  10. package/dist/extensions/mu-serve.d.ts.map +1 -1
  11. package/dist/extensions/mu-serve.js +6 -14
  12. package/dist/extensions/mu-tools.d.ts +9 -0
  13. package/dist/extensions/mu-tools.d.ts.map +1 -0
  14. package/dist/extensions/mu-tools.js +12 -0
  15. package/dist/extensions/operator-command.d.ts +3 -4
  16. package/dist/extensions/operator-command.d.ts.map +1 -1
  17. package/dist/extensions/operator-command.js +58 -115
  18. package/dist/extensions/query.d.ts +4 -0
  19. package/dist/extensions/query.d.ts.map +1 -0
  20. package/dist/extensions/query.js +402 -0
  21. package/dist/operator.d.ts +15 -0
  22. package/dist/operator.d.ts.map +1 -1
  23. package/dist/operator.js +130 -10
  24. package/dist/session_factory.d.ts +7 -0
  25. package/dist/session_factory.d.ts.map +1 -1
  26. package/dist/session_factory.js +21 -2
  27. package/package.json +2 -2
  28. package/prompts/roles/operator.md +22 -40
  29. package/prompts/roles/orchestrator.md +18 -12
  30. package/prompts/roles/reviewer.md +8 -7
  31. package/prompts/roles/worker.md +8 -11
  32. package/dist/extensions/activities.d.ts +0 -7
  33. package/dist/extensions/activities.d.ts.map +0 -1
  34. package/dist/extensions/activities.js +0 -236
  35. package/dist/extensions/cron.d.ts +0 -7
  36. package/dist/extensions/cron.d.ts.map +0 -1
  37. package/dist/extensions/cron.js +0 -247
  38. package/dist/extensions/heartbeats.d.ts +0 -7
  39. package/dist/extensions/heartbeats.d.ts.map +0 -1
  40. package/dist/extensions/heartbeats.js +0 -192
  41. package/dist/extensions/messaging-setup/actions.d.ts +0 -22
  42. package/dist/extensions/messaging-setup/actions.d.ts.map +0 -1
  43. package/dist/extensions/messaging-setup/actions.js +0 -229
  44. package/dist/extensions/messaging-setup/adapters.d.ts +0 -24
  45. package/dist/extensions/messaging-setup/adapters.d.ts.map +0 -1
  46. package/dist/extensions/messaging-setup/adapters.js +0 -170
  47. package/dist/extensions/messaging-setup/index.d.ts +0 -17
  48. package/dist/extensions/messaging-setup/index.d.ts.map +0 -1
  49. package/dist/extensions/messaging-setup/index.js +0 -261
  50. package/dist/extensions/messaging-setup/parser.d.ts +0 -33
  51. package/dist/extensions/messaging-setup/parser.d.ts.map +0 -1
  52. package/dist/extensions/messaging-setup/parser.js +0 -240
  53. package/dist/extensions/messaging-setup/runtime.d.ts +0 -16
  54. package/dist/extensions/messaging-setup/runtime.d.ts.map +0 -1
  55. package/dist/extensions/messaging-setup/runtime.js +0 -110
  56. package/dist/extensions/messaging-setup/types.d.ts +0 -157
  57. package/dist/extensions/messaging-setup/types.d.ts.map +0 -1
  58. package/dist/extensions/messaging-setup/types.js +0 -4
  59. package/dist/extensions/messaging-setup/ui.d.ts +0 -15
  60. package/dist/extensions/messaging-setup/ui.d.ts.map +0 -1
  61. package/dist/extensions/messaging-setup/ui.js +0 -173
  62. package/dist/extensions/messaging-setup.d.ts +0 -3
  63. package/dist/extensions/messaging-setup.d.ts.map +0 -1
  64. package/dist/extensions/messaging-setup.js +0 -2
  65. package/dist/extensions/mu-full-tools.d.ts +0 -10
  66. package/dist/extensions/mu-full-tools.d.ts.map +0 -1
  67. package/dist/extensions/mu-full-tools.js +0 -25
  68. package/dist/extensions/mu-query-tools.d.ts +0 -10
  69. package/dist/extensions/mu-query-tools.d.ts.map +0 -1
  70. package/dist/extensions/mu-query-tools.js +0 -11
  71. package/dist/extensions/orchestration-runs-readonly.d.ts +0 -4
  72. package/dist/extensions/orchestration-runs-readonly.d.ts.map +0 -1
  73. package/dist/extensions/orchestration-runs-readonly.js +0 -226
  74. package/dist/extensions/orchestration-runs.d.ts +0 -4
  75. package/dist/extensions/orchestration-runs.d.ts.map +0 -1
  76. package/dist/extensions/orchestration-runs.js +0 -315
  77. package/dist/extensions/server-tools-readonly.d.ts +0 -4
  78. package/dist/extensions/server-tools-readonly.d.ts.map +0 -1
  79. package/dist/extensions/server-tools-readonly.js +0 -5
  80. package/dist/extensions/server-tools.d.ts +0 -25
  81. package/dist/extensions/server-tools.d.ts.map +0 -1
  82. package/dist/extensions/server-tools.js +0 -833
  83. package/prompts/skills/messaging-setup-brief.md +0 -25
@@ -1,226 +0,0 @@
1
- import { StringEnum } from "@mariozechner/pi-ai";
2
- import { Type } from "@sinclair/typebox";
3
- import { asArray, asNumber, asRecord, asString, clampInt, fetchMuJson, parseFieldPaths, previewLines, previewText, selectFields, textResult, toJsonText, } from "./shared.js";
4
- function trimOrNull(value) {
5
- if (value == null)
6
- return null;
7
- const trimmed = value.trim();
8
- return trimmed.length > 0 ? trimmed : null;
9
- }
10
- function summarizeRun(run) {
11
- return {
12
- job_id: asString(run.job_id),
13
- root_issue_id: asString(run.root_issue_id),
14
- status: asString(run.status),
15
- source: asString(run.source),
16
- started_at_ms: asNumber(run.started_at_ms),
17
- finished_at_ms: asNumber(run.finished_at_ms),
18
- exit_code: asNumber(run.exit_code),
19
- provider: asString(run.provider),
20
- model: asString(run.model),
21
- reasoning: asString(run.reasoning),
22
- prompt_preview: previewText(run.prompt, 140),
23
- };
24
- }
25
- function summarizeTrace(trace, lineLimit) {
26
- const run = asRecord(trace.run);
27
- return {
28
- run: run ? summarizeRun(run) : null,
29
- stdout: previewLines(trace.stdout, { maxLines: lineLimit, maxCharsPerLine: 220 }),
30
- stderr: previewLines(trace.stderr, { maxLines: lineLimit, maxCharsPerLine: 220 }),
31
- log_hints: asArray(trace.log_hints).slice(0, 20),
32
- trace_files: asArray(trace.trace_files).slice(0, 20),
33
- };
34
- }
35
- function runFromStartEvent(event) {
36
- const runId = asString(event.run_id);
37
- if (!runId) {
38
- return null;
39
- }
40
- const payload = asRecord(event.payload);
41
- const issueId = asString(event.issue_id);
42
- const role = payload ? asString(payload.role) : null;
43
- const explicitRoot = payload ? asString(payload.root_issue_id) : null;
44
- const rootIssueId = explicitRoot ?? (role === "orchestrator" ? issueId : null);
45
- return {
46
- job_id: runId,
47
- root_issue_id: rootIssueId,
48
- issue_id: issueId,
49
- role,
50
- status: "history",
51
- source: "event_log",
52
- started_at_ms: asNumber(event.ts_ms),
53
- finished_at_ms: null,
54
- exit_code: null,
55
- provider: payload ? asString(payload.provider) : null,
56
- model: payload ? asString(payload.model) : null,
57
- reasoning: payload ? asString(payload.reasoning) : null,
58
- prompt: payload ? asString(payload.prompt) : null,
59
- };
60
- }
61
- async function fetchHistoricalRuns(limit) {
62
- const payload = await fetchMuJson(`/api/events?type=backend.run.start&limit=${Math.max(limit * 4, 80)}`);
63
- const payloadRecord = asRecord(payload);
64
- const events = Array.isArray(payload) ? payload : asArray(payloadRecord?.events);
65
- const runIndex = new Map();
66
- const runs = [];
67
- for (let index = events.length - 1; index >= 0; index -= 1) {
68
- const event = asRecord(events[index]);
69
- if (!event) {
70
- continue;
71
- }
72
- const run = runFromStartEvent(event);
73
- if (!run) {
74
- continue;
75
- }
76
- const runId = asString(run.job_id);
77
- if (!runId) {
78
- continue;
79
- }
80
- const existingIdx = runIndex.get(runId);
81
- if (existingIdx == null) {
82
- if (runs.length >= limit) {
83
- continue;
84
- }
85
- runIndex.set(runId, runs.length);
86
- runs.push(run);
87
- continue;
88
- }
89
- const existing = runs[existingIdx];
90
- if (!asString(existing.root_issue_id)) {
91
- existing.root_issue_id = asString(run.root_issue_id) ?? asString(run.issue_id);
92
- }
93
- if (!asString(existing.provider)) {
94
- existing.provider = asString(run.provider);
95
- }
96
- if (!asString(existing.model)) {
97
- existing.model = asString(run.model);
98
- }
99
- if (!asString(existing.reasoning)) {
100
- existing.reasoning = asString(run.reasoning);
101
- }
102
- if (!asString(existing.prompt)) {
103
- existing.prompt = asString(run.prompt);
104
- }
105
- }
106
- return runs;
107
- }
108
- async function findHistoricalRun(idOrRoot) {
109
- const payload = await fetchMuJson("/api/events?type=backend.run.start&limit=200");
110
- const payloadRecord = asRecord(payload);
111
- const events = Array.isArray(payload) ? payload : asArray(payloadRecord?.events);
112
- for (let index = events.length - 1; index >= 0; index -= 1) {
113
- const event = asRecord(events[index]);
114
- if (!event) {
115
- continue;
116
- }
117
- const run = runFromStartEvent(event);
118
- if (!run) {
119
- continue;
120
- }
121
- const runId = asString(run.job_id);
122
- const rootIssueId = asString(run.root_issue_id);
123
- if (runId === idOrRoot || rootIssueId === idOrRoot) {
124
- return run;
125
- }
126
- }
127
- return null;
128
- }
129
- function isRunNotFoundError(error) {
130
- if (!(error instanceof Error)) {
131
- return false;
132
- }
133
- const message = error.message.toLowerCase();
134
- return message.includes("mu server 404") || message.includes("run not found");
135
- }
136
- export function orchestrationRunsReadOnlyExtension(pi) {
137
- const RunsParams = Type.Object({
138
- action: StringEnum(["list", "status", "trace"]),
139
- job_id: Type.Optional(Type.String({ description: "Run job ID" })),
140
- root_issue_id: Type.Optional(Type.String({ description: "Run root issue ID (mu-...)" })),
141
- limit: Type.Optional(Type.Number({ description: "Optional limit (list/trace). Defaults to 20 for list and 40 lines for trace." })),
142
- status: Type.Optional(Type.String({ description: "Optional status filter for list" })),
143
- fields: Type.Optional(Type.String({
144
- description: "Comma-separated fields for status/trace selection (e.g. status,exit_code,prompt)",
145
- })),
146
- });
147
- pi.registerTool({
148
- name: "mu_runs",
149
- label: "Runs",
150
- description: "Read-only run inspection. Actions: list, status, trace. Returns compact summaries; use fields for precise retrieval.",
151
- parameters: RunsParams,
152
- async execute(_toolCallId, params) {
153
- switch (params.action) {
154
- case "list": {
155
- const query = new URLSearchParams();
156
- const status = trimOrNull(params.status);
157
- if (status)
158
- query.set("status", status);
159
- const limit = clampInt(params.limit, 20, 1, 500);
160
- query.set("limit", String(limit));
161
- const payload = await fetchMuJson(`/api/runs?${query.toString()}`);
162
- let records = asArray(payload.runs)
163
- .map((run) => asRecord(run))
164
- .filter((run) => run != null);
165
- let source = "run_supervisor";
166
- if (records.length === 0 && (status == null || status === "history")) {
167
- records = await fetchHistoricalRuns(limit);
168
- source = "event_log";
169
- }
170
- const runs = records.map((run) => summarizeRun(run));
171
- return textResult(toJsonText({ count: runs.length, source, runs }), {
172
- action: "list",
173
- status,
174
- limit,
175
- source,
176
- payload,
177
- runs: records,
178
- });
179
- }
180
- case "status": {
181
- const id = trimOrNull(params.job_id) ?? trimOrNull(params.root_issue_id);
182
- if (!id)
183
- return textResult("status requires job_id or root_issue_id");
184
- let payload = null;
185
- let source = "run_supervisor";
186
- try {
187
- payload = await fetchMuJson(`/api/runs/${encodeURIComponent(id)}`);
188
- }
189
- catch (err) {
190
- if (!isRunNotFoundError(err)) {
191
- throw err;
192
- }
193
- payload = await findHistoricalRun(id);
194
- source = "event_log";
195
- if (!payload) {
196
- throw err;
197
- }
198
- }
199
- if (!payload) {
200
- return textResult(`run not found: ${id}`);
201
- }
202
- const fields = parseFieldPaths(trimOrNull(params.fields) ?? undefined);
203
- const content = fields.length > 0
204
- ? { id, source, selected: selectFields(payload, fields) }
205
- : { source, run: summarizeRun(payload) };
206
- return textResult(toJsonText(content), { action: "status", id, source, fields, payload });
207
- }
208
- case "trace": {
209
- const id = trimOrNull(params.job_id) ?? trimOrNull(params.root_issue_id);
210
- if (!id)
211
- return textResult("trace requires job_id or root_issue_id");
212
- const lineLimit = clampInt(params.limit, 40, 1, 200);
213
- const payload = await fetchMuJson(`/api/runs/${encodeURIComponent(id)}/trace?limit=${Math.max(lineLimit, 80)}`);
214
- const fields = parseFieldPaths(trimOrNull(params.fields) ?? undefined);
215
- const content = fields.length > 0
216
- ? { id, selected: selectFields(payload, fields) }
217
- : summarizeTrace(payload, lineLimit);
218
- return textResult(toJsonText(content), { action: "trace", id, lineLimit, fields, payload });
219
- }
220
- default:
221
- return textResult(`unknown action: ${params.action}`);
222
- }
223
- },
224
- });
225
- }
226
- export default orchestrationRunsReadOnlyExtension;
@@ -1,4 +0,0 @@
1
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
- export declare function orchestrationRunsExtension(pi: ExtensionAPI): void;
3
- export default orchestrationRunsExtension;
4
- //# sourceMappingURL=orchestration-runs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestration-runs.d.ts","sourceRoot":"","sources":["../../src/extensions/orchestration-runs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA2JlE,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,YAAY,QA8L1D;AAED,eAAe,0BAA0B,CAAC"}
@@ -1,315 +0,0 @@
1
- import { StringEnum } from "@mariozechner/pi-ai";
2
- import { Type } from "@sinclair/typebox";
3
- import { asArray, asNumber, asRecord, asString, clampInt, fetchMuJson, parseFieldPaths, previewLines, previewText, selectFields, textResult, toJsonText, } from "./shared.js";
4
- function trimOrNull(value) {
5
- if (value == null)
6
- return null;
7
- const trimmed = value.trim();
8
- return trimmed.length > 0 ? trimmed : null;
9
- }
10
- function summarizeRun(run) {
11
- return {
12
- job_id: asString(run.job_id),
13
- root_issue_id: asString(run.root_issue_id),
14
- status: asString(run.status),
15
- source: asString(run.source),
16
- started_at_ms: asNumber(run.started_at_ms),
17
- finished_at_ms: asNumber(run.finished_at_ms),
18
- exit_code: asNumber(run.exit_code),
19
- provider: asString(run.provider),
20
- model: asString(run.model),
21
- reasoning: asString(run.reasoning),
22
- prompt_preview: previewText(run.prompt, 140),
23
- };
24
- }
25
- function summarizeTrace(trace, lineLimit) {
26
- const run = asRecord(trace.run);
27
- return {
28
- run: run ? summarizeRun(run) : null,
29
- stdout: previewLines(trace.stdout, { maxLines: lineLimit, maxCharsPerLine: 220 }),
30
- stderr: previewLines(trace.stderr, { maxLines: lineLimit, maxCharsPerLine: 220 }),
31
- log_hints: asArray(trace.log_hints).slice(0, 20),
32
- trace_files: asArray(trace.trace_files).slice(0, 20),
33
- };
34
- }
35
- function runFromStartEvent(event) {
36
- const runId = asString(event.run_id);
37
- if (!runId) {
38
- return null;
39
- }
40
- const payload = asRecord(event.payload);
41
- const issueId = asString(event.issue_id);
42
- const role = payload ? asString(payload.role) : null;
43
- const explicitRoot = payload ? asString(payload.root_issue_id) : null;
44
- const rootIssueId = explicitRoot ?? (role === "orchestrator" ? issueId : null);
45
- return {
46
- job_id: runId,
47
- root_issue_id: rootIssueId,
48
- issue_id: issueId,
49
- role,
50
- status: "history",
51
- source: "event_log",
52
- started_at_ms: asNumber(event.ts_ms),
53
- finished_at_ms: null,
54
- exit_code: null,
55
- provider: payload ? asString(payload.provider) : null,
56
- model: payload ? asString(payload.model) : null,
57
- reasoning: payload ? asString(payload.reasoning) : null,
58
- prompt: payload ? asString(payload.prompt) : null,
59
- };
60
- }
61
- async function fetchHistoricalRuns(limit) {
62
- const payload = await fetchMuJson(`/api/events?type=backend.run.start&limit=${Math.max(limit * 4, 80)}`);
63
- const payloadRecord = asRecord(payload);
64
- const events = Array.isArray(payload) ? payload : asArray(payloadRecord?.events);
65
- const runIndex = new Map();
66
- const runs = [];
67
- for (let index = events.length - 1; index >= 0; index -= 1) {
68
- const event = asRecord(events[index]);
69
- if (!event) {
70
- continue;
71
- }
72
- const run = runFromStartEvent(event);
73
- if (!run) {
74
- continue;
75
- }
76
- const runId = asString(run.job_id);
77
- if (!runId) {
78
- continue;
79
- }
80
- const existingIdx = runIndex.get(runId);
81
- if (existingIdx == null) {
82
- if (runs.length >= limit) {
83
- continue;
84
- }
85
- runIndex.set(runId, runs.length);
86
- runs.push(run);
87
- continue;
88
- }
89
- const existing = runs[existingIdx];
90
- if (!asString(existing.root_issue_id)) {
91
- existing.root_issue_id = asString(run.root_issue_id) ?? asString(run.issue_id);
92
- }
93
- if (!asString(existing.provider)) {
94
- existing.provider = asString(run.provider);
95
- }
96
- if (!asString(existing.model)) {
97
- existing.model = asString(run.model);
98
- }
99
- if (!asString(existing.reasoning)) {
100
- existing.reasoning = asString(run.reasoning);
101
- }
102
- if (!asString(existing.prompt)) {
103
- existing.prompt = asString(run.prompt);
104
- }
105
- }
106
- return runs;
107
- }
108
- async function findHistoricalRun(idOrRoot) {
109
- const payload = await fetchMuJson("/api/events?type=backend.run.start&limit=200");
110
- const payloadRecord = asRecord(payload);
111
- const events = Array.isArray(payload) ? payload : asArray(payloadRecord?.events);
112
- for (let index = events.length - 1; index >= 0; index -= 1) {
113
- const event = asRecord(events[index]);
114
- if (!event) {
115
- continue;
116
- }
117
- const run = runFromStartEvent(event);
118
- if (!run) {
119
- continue;
120
- }
121
- const runId = asString(run.job_id);
122
- const rootIssueId = asString(run.root_issue_id);
123
- if (runId === idOrRoot || rootIssueId === idOrRoot) {
124
- return run;
125
- }
126
- }
127
- return null;
128
- }
129
- function isRunNotFoundError(error) {
130
- if (!(error instanceof Error)) {
131
- return false;
132
- }
133
- const message = error.message.toLowerCase();
134
- return message.includes("mu server 404") || message.includes("run not found");
135
- }
136
- export function orchestrationRunsExtension(pi) {
137
- const RunsParams = Type.Object({
138
- action: StringEnum(["list", "status", "start", "resume", "interrupt", "heartbeat", "trace"]),
139
- job_id: Type.Optional(Type.String({ description: "Run job ID" })),
140
- root_issue_id: Type.Optional(Type.String({ description: "Run root issue ID (mu-...)" })),
141
- prompt: Type.Optional(Type.String({ description: "Prompt for run start" })),
142
- max_steps: Type.Optional(Type.Number({ description: "Optional max steps for start/resume" })),
143
- limit: Type.Optional(Type.Number({ description: "Optional limit (list/trace). Defaults to 20 for list and 40 lines for trace." })),
144
- status: Type.Optional(Type.String({ description: "Optional status filter for list" })),
145
- fields: Type.Optional(Type.String({
146
- description: "Comma-separated fields for status/trace selection (e.g. status,exit_code,prompt)",
147
- })),
148
- reason: Type.Optional(Type.String({ description: "Optional heartbeat reason (default: manual)" })),
149
- });
150
- pi.registerTool({
151
- name: "mu_runs",
152
- label: "Runs",
153
- description: "Manage orchestration runs. Actions: list, status, start, resume, interrupt, heartbeat, trace. List/trace return compact summaries; use fields for precise retrieval.",
154
- parameters: RunsParams,
155
- async execute(_toolCallId, params) {
156
- switch (params.action) {
157
- case "list": {
158
- const query = new URLSearchParams();
159
- const status = trimOrNull(params.status);
160
- if (status)
161
- query.set("status", status);
162
- const limit = clampInt(params.limit, 20, 1, 500);
163
- query.set("limit", String(limit));
164
- const payload = await fetchMuJson(`/api/runs?${query.toString()}`);
165
- let records = asArray(payload.runs)
166
- .map((run) => asRecord(run))
167
- .filter((run) => run != null);
168
- let source = "run_supervisor";
169
- if (records.length === 0 && (status == null || status === "history")) {
170
- records = await fetchHistoricalRuns(limit);
171
- source = "event_log";
172
- }
173
- const runs = records.map((run) => summarizeRun(run));
174
- return textResult(toJsonText({ count: runs.length, source, runs }), {
175
- action: "list",
176
- status,
177
- limit,
178
- source,
179
- payload,
180
- runs: records,
181
- });
182
- }
183
- case "status": {
184
- const id = trimOrNull(params.job_id) ?? trimOrNull(params.root_issue_id);
185
- if (!id)
186
- return textResult("status requires job_id or root_issue_id");
187
- let payload = null;
188
- let source = "run_supervisor";
189
- try {
190
- payload = await fetchMuJson(`/api/runs/${encodeURIComponent(id)}`);
191
- }
192
- catch (err) {
193
- if (!isRunNotFoundError(err)) {
194
- throw err;
195
- }
196
- payload = await findHistoricalRun(id);
197
- source = "event_log";
198
- if (!payload) {
199
- throw err;
200
- }
201
- }
202
- if (!payload) {
203
- return textResult(`run not found: ${id}`);
204
- }
205
- const fields = parseFieldPaths(trimOrNull(params.fields) ?? undefined);
206
- const content = fields.length > 0
207
- ? { id, source, selected: selectFields(payload, fields) }
208
- : { source, run: summarizeRun(payload) };
209
- return textResult(toJsonText(content), { action: "status", id, source, fields, payload });
210
- }
211
- case "start": {
212
- const prompt = trimOrNull(params.prompt);
213
- if (!prompt)
214
- return textResult("start requires prompt");
215
- const maxSteps = params.max_steps != null && Number.isFinite(params.max_steps)
216
- ? Math.max(1, Math.trunc(params.max_steps))
217
- : undefined;
218
- const payload = await fetchMuJson("/api/runs/start", {
219
- method: "POST",
220
- body: {
221
- prompt,
222
- max_steps: maxSteps,
223
- },
224
- });
225
- const run = asRecord(payload.run);
226
- return textResult(toJsonText({ ok: payload.ok ?? true, run: run ? summarizeRun(run) : null }), {
227
- action: "start",
228
- prompt,
229
- maxSteps,
230
- payload,
231
- });
232
- }
233
- case "resume": {
234
- const rootIssueId = trimOrNull(params.root_issue_id);
235
- if (!rootIssueId)
236
- return textResult("resume requires root_issue_id");
237
- const maxSteps = params.max_steps != null && Number.isFinite(params.max_steps)
238
- ? Math.max(1, Math.trunc(params.max_steps))
239
- : undefined;
240
- const payload = await fetchMuJson("/api/runs/resume", {
241
- method: "POST",
242
- body: {
243
- root_issue_id: rootIssueId,
244
- max_steps: maxSteps,
245
- },
246
- });
247
- const run = asRecord(payload.run);
248
- return textResult(toJsonText({ ok: payload.ok ?? true, run: run ? summarizeRun(run) : null }), {
249
- action: "resume",
250
- rootIssueId,
251
- maxSteps,
252
- payload,
253
- });
254
- }
255
- case "interrupt": {
256
- const jobId = trimOrNull(params.job_id);
257
- const rootIssueId = trimOrNull(params.root_issue_id);
258
- if (!jobId && !rootIssueId) {
259
- return textResult("interrupt requires job_id or root_issue_id");
260
- }
261
- const payload = await fetchMuJson("/api/runs/interrupt", {
262
- method: "POST",
263
- body: {
264
- job_id: jobId,
265
- root_issue_id: rootIssueId,
266
- },
267
- });
268
- const run = asRecord(payload.run);
269
- return textResult(toJsonText({
270
- ok: payload.ok ?? null,
271
- reason: payload.reason ?? null,
272
- run: run ? summarizeRun(run) : null,
273
- }), { action: "interrupt", jobId, rootIssueId, payload });
274
- }
275
- case "heartbeat": {
276
- const jobId = trimOrNull(params.job_id);
277
- const rootIssueId = trimOrNull(params.root_issue_id);
278
- if (!jobId && !rootIssueId) {
279
- return textResult("heartbeat requires job_id or root_issue_id");
280
- }
281
- const reason = trimOrNull(params.reason) ?? "manual";
282
- const payload = await fetchMuJson("/api/runs/heartbeat", {
283
- method: "POST",
284
- body: {
285
- job_id: jobId,
286
- root_issue_id: rootIssueId,
287
- reason,
288
- },
289
- });
290
- const run = asRecord(payload.run);
291
- return textResult(toJsonText({
292
- ok: payload.ok ?? null,
293
- reason: payload.reason ?? null,
294
- run: run ? summarizeRun(run) : null,
295
- }), { action: "heartbeat", jobId, rootIssueId, reason, payload });
296
- }
297
- case "trace": {
298
- const id = trimOrNull(params.job_id) ?? trimOrNull(params.root_issue_id);
299
- if (!id)
300
- return textResult("trace requires job_id or root_issue_id");
301
- const lineLimit = clampInt(params.limit, 40, 1, 200);
302
- const payload = await fetchMuJson(`/api/runs/${encodeURIComponent(id)}/trace?limit=${Math.max(lineLimit, 80)}`);
303
- const fields = parseFieldPaths(trimOrNull(params.fields) ?? undefined);
304
- const content = fields.length > 0
305
- ? { id, selected: selectFields(payload, fields) }
306
- : summarizeTrace(payload, lineLimit);
307
- return textResult(toJsonText(content), { action: "trace", id, lineLimit, fields, payload });
308
- }
309
- default:
310
- return textResult(`unknown action: ${params.action}`);
311
- }
312
- },
313
- });
314
- }
315
- export default orchestrationRunsExtension;
@@ -1,4 +0,0 @@
1
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
- export declare function serverToolsReadonlyExtension(pi: ExtensionAPI): void;
3
- export default serverToolsReadonlyExtension;
4
- //# sourceMappingURL=server-tools-readonly.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-tools-readonly.d.ts","sourceRoot":"","sources":["../../src/extensions/server-tools-readonly.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,QAE5D;AAED,eAAe,4BAA4B,CAAC"}
@@ -1,5 +0,0 @@
1
- import { serverToolsReadOnlyExtension } from "./server-tools.js";
2
- export function serverToolsReadonlyExtension(pi) {
3
- serverToolsReadOnlyExtension(pi);
4
- }
5
- export default serverToolsReadonlyExtension;
@@ -1,25 +0,0 @@
1
- /**
2
- * mu-server-tools — Serve-mode tools for querying mu server state.
3
- *
4
- * This is the core extension the operator relies on for repo introspection.
5
- */
6
- import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
7
- export type ServerToolsExtensionOpts = {
8
- allowForumPost?: boolean;
9
- allowIssueMutations?: boolean;
10
- allowIdentityMutations?: boolean;
11
- includeStatusTool?: boolean;
12
- includeControlPlaneTool?: boolean;
13
- includeIssuesTool?: boolean;
14
- includeForumTool?: boolean;
15
- includeEventsTool?: boolean;
16
- includeIdentityTool?: boolean;
17
- toolIntroLine?: string;
18
- usageLine?: string;
19
- extraSystemPromptLines?: string[];
20
- };
21
- export declare function serverToolsExtension(pi: ExtensionAPI, opts?: ServerToolsExtensionOpts): void;
22
- export declare function serverToolsReadOnlyExtension(pi: ExtensionAPI): void;
23
- export declare function serverToolsIssueForumExtension(pi: ExtensionAPI): void;
24
- export default serverToolsExtension;
25
- //# sourceMappingURL=server-tools.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server-tools.d.ts","sourceRoot":"","sources":["../../src/extensions/server-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAqMlE,MAAM,MAAM,wBAAwB,GAAG;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC,CAAC;AAmqBF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,GAAE,wBAA6B,QAmBzF;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,YAAY,QAkB5D;AAED,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,YAAY,QAe9D;AAED,eAAe,oBAAoB,CAAC"}