pi-mission-control 0.0.0-dev

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 (110) hide show
  1. package/README.md +205 -0
  2. package/agents/auditor.md +45 -0
  3. package/agents/worker.md +44 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +526 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/state.d.ts +265 -0
  9. package/dist/state.d.ts.map +1 -0
  10. package/dist/state.js +474 -0
  11. package/dist/state.js.map +1 -0
  12. package/dist/tools/add-phase.d.ts +28 -0
  13. package/dist/tools/add-phase.d.ts.map +1 -0
  14. package/dist/tools/add-phase.js +69 -0
  15. package/dist/tools/add-phase.js.map +1 -0
  16. package/dist/tools/add-task.d.ts +30 -0
  17. package/dist/tools/add-task.d.ts.map +1 -0
  18. package/dist/tools/add-task.js +85 -0
  19. package/dist/tools/add-task.js.map +1 -0
  20. package/dist/tools/index.d.ts +13 -0
  21. package/dist/tools/index.d.ts.map +1 -0
  22. package/dist/tools/index.js +16 -0
  23. package/dist/tools/index.js.map +1 -0
  24. package/dist/tools/init.d.ts +34 -0
  25. package/dist/tools/init.d.ts.map +1 -0
  26. package/dist/tools/init.js +75 -0
  27. package/dist/tools/init.js.map +1 -0
  28. package/dist/tools/mission-complete.d.ts +30 -0
  29. package/dist/tools/mission-complete.d.ts.map +1 -0
  30. package/dist/tools/mission-complete.js +85 -0
  31. package/dist/tools/mission-complete.js.map +1 -0
  32. package/dist/tools/mission-resume.d.ts +35 -0
  33. package/dist/tools/mission-resume.d.ts.map +1 -0
  34. package/dist/tools/mission-resume.js +87 -0
  35. package/dist/tools/mission-resume.js.map +1 -0
  36. package/dist/tools/scaffold.d.ts +24 -0
  37. package/dist/tools/scaffold.d.ts.map +1 -0
  38. package/dist/tools/scaffold.js +129 -0
  39. package/dist/tools/scaffold.js.map +1 -0
  40. package/dist/tools/update-phase.d.ts +33 -0
  41. package/dist/tools/update-phase.d.ts.map +1 -0
  42. package/dist/tools/update-phase.js +101 -0
  43. package/dist/tools/update-phase.js.map +1 -0
  44. package/dist/tools/update-task.d.ts +34 -0
  45. package/dist/tools/update-task.d.ts.map +1 -0
  46. package/dist/tools/update-task.js +104 -0
  47. package/dist/tools/update-task.js.map +1 -0
  48. package/dist/tui/dashboard.d.ts +146 -0
  49. package/dist/tui/dashboard.d.ts.map +1 -0
  50. package/dist/tui/dashboard.js +381 -0
  51. package/dist/tui/dashboard.js.map +1 -0
  52. package/dist/tui/header.d.ts +39 -0
  53. package/dist/tui/header.d.ts.map +1 -0
  54. package/dist/tui/header.js +62 -0
  55. package/dist/tui/header.js.map +1 -0
  56. package/dist/tui/idle-view.d.ts +44 -0
  57. package/dist/tui/idle-view.d.ts.map +1 -0
  58. package/dist/tui/idle-view.js +87 -0
  59. package/dist/tui/idle-view.js.map +1 -0
  60. package/dist/tui/index.d.ts +13 -0
  61. package/dist/tui/index.d.ts.map +1 -0
  62. package/dist/tui/index.js +15 -0
  63. package/dist/tui/index.js.map +1 -0
  64. package/dist/tui/past-runs.d.ts +49 -0
  65. package/dist/tui/past-runs.d.ts.map +1 -0
  66. package/dist/tui/past-runs.js +207 -0
  67. package/dist/tui/past-runs.js.map +1 -0
  68. package/dist/tui/phases-panel.d.ts +46 -0
  69. package/dist/tui/phases-panel.d.ts.map +1 -0
  70. package/dist/tui/phases-panel.js +161 -0
  71. package/dist/tui/phases-panel.js.map +1 -0
  72. package/dist/tui/progress-bar.d.ts +37 -0
  73. package/dist/tui/progress-bar.d.ts.map +1 -0
  74. package/dist/tui/progress-bar.js +123 -0
  75. package/dist/tui/progress-bar.js.map +1 -0
  76. package/dist/tui/styles.d.ts +8 -0
  77. package/dist/tui/styles.d.ts.map +1 -0
  78. package/dist/tui/styles.js +22 -0
  79. package/dist/tui/styles.js.map +1 -0
  80. package/dist/tui/tasks-panel.d.ts +48 -0
  81. package/dist/tui/tasks-panel.d.ts.map +1 -0
  82. package/dist/tui/tasks-panel.js +191 -0
  83. package/dist/tui/tasks-panel.js.map +1 -0
  84. package/package.json +42 -0
  85. package/skills/mission-memory/SKILL.md +88 -0
  86. package/skills/mission-orchestrator/SKILL.md +167 -0
  87. package/skills/mission-pm/SKILL.md +83 -0
  88. package/skills/mission-research/SKILL.md +66 -0
  89. package/skills/mission-tech-lead/SKILL.md +68 -0
  90. package/src/index.ts +659 -0
  91. package/src/state.ts +623 -0
  92. package/src/tools/add-phase.ts +98 -0
  93. package/src/tools/add-task.ts +121 -0
  94. package/src/tools/index.ts +18 -0
  95. package/src/tools/init.ts +109 -0
  96. package/src/tools/mission-complete.ts +118 -0
  97. package/src/tools/mission-resume.ts +119 -0
  98. package/src/tools/scaffold.ts +167 -0
  99. package/src/tools/update-phase.ts +140 -0
  100. package/src/tools/update-task.ts +145 -0
  101. package/src/tui/dashboard.ts +441 -0
  102. package/src/tui/header.ts +85 -0
  103. package/src/tui/idle-view.ts +114 -0
  104. package/src/tui/index.ts +20 -0
  105. package/src/tui/past-runs.ts +261 -0
  106. package/src/tui/phases-panel.ts +199 -0
  107. package/src/tui/progress-bar.ts +152 -0
  108. package/src/tui/styles.ts +27 -0
  109. package/src/tui/tasks-panel.ts +228 -0
  110. package/templates/state.json +5 -0
package/dist/index.js ADDED
@@ -0,0 +1,526 @@
1
+ /**
2
+ * pi-mission-control Extension Entry Point
3
+ *
4
+ * Visual mission orchestration with agent hierarchy and durable state.
5
+ * Provides /mission command and tools for mission management.
6
+ */
7
+ import * as path from "path";
8
+ import { existsSync } from "fs";
9
+ import { fileURLToPath } from "url";
10
+ import { Type } from "@sinclair/typebox";
11
+ import { withFileMutationQueue } from "@mariozechner/pi-coding-agent";
12
+ // State and tools
13
+ import { readState, writeState, defaultState, isScaffolded, getRunFilePath, getStateFilePath, getProjectRoot, } from "./state.js";
14
+ import { missionScaffold, missionInit, addPhase, addTask, updatePhase, updateTask, missionComplete, missionResume, } from "./tools/index.js";
15
+ import { MissionDashboard } from "./tui/dashboard.js";
16
+ import { readText, writeText } from "./state.js";
17
+ // ============================================================================
18
+ // TypeBox Schemas for Agent Tools
19
+ // ============================================================================
20
+ const AddPhaseSchema = Type.Object({
21
+ name: Type.String({ description: "Human-readable phase name (e.g., 'Auth Backend')" }),
22
+ file: Type.String({ description: "Path to phase definition/reference file" }),
23
+ });
24
+ const AddTaskSchema = Type.Object({
25
+ phase_id: Type.String({ description: "ID of the phase to add task to (e.g., 'phase1')" }),
26
+ name: Type.String({ description: "Human-readable task name (e.g., 'Setup DB Schema')" }),
27
+ file: Type.String({ description: "Path to task contract file" }),
28
+ });
29
+ const UpdatePhaseSchema = Type.Object({
30
+ phase_id: Type.String({ description: "ID of the phase to update" }),
31
+ status: Type.Union([
32
+ Type.Literal("pending"),
33
+ Type.Literal("in_progress"),
34
+ Type.Literal("done"),
35
+ Type.Literal("removed"),
36
+ ], { description: "New status for the phase" }),
37
+ });
38
+ const UpdateTaskSchema = Type.Object({
39
+ task_id: Type.String({ description: "ID of the task to update (e.g., 'phase1-task1')" }),
40
+ status: Type.Union([
41
+ Type.Literal("pending"),
42
+ Type.Literal("in_progress"),
43
+ Type.Literal("done"),
44
+ Type.Literal("failed"),
45
+ Type.Literal("removed"),
46
+ ], { description: "New status for the task" }),
47
+ });
48
+ const MissionCompleteSchema = Type.Object({
49
+ run_id: Type.String({ description: "ID of the run to mark as complete" }),
50
+ });
51
+ const MissionResumeSchema = Type.Object({
52
+ run_id: Type.String({ description: "ID of the run to resume" }),
53
+ phase: Type.Optional(Type.String({ description: "Optional phase to set as current" })),
54
+ statusMessage: Type.Optional(Type.String({ description: "Optional status message" })),
55
+ });
56
+ // ============================================================================
57
+ // Tool Result Formatters
58
+ // ============================================================================
59
+ function formatAddPhaseResult(result) {
60
+ if (!result.success) {
61
+ return `❌ Failed to add phase: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
62
+ }
63
+ return `✅ Phase added: ${result.phaseId}\n Name: ${result.message.replace("Phase added: ", "")}`;
64
+ }
65
+ function formatAddTaskResult(result) {
66
+ if (!result.success) {
67
+ return `❌ Failed to add task: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
68
+ }
69
+ return `✅ Task added: ${result.taskId}\n Name: ${result.message.replace("Task added: ", "")}`;
70
+ }
71
+ function formatUpdatePhaseResult(result) {
72
+ if (!result.success) {
73
+ return `❌ Failed to update phase: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
74
+ }
75
+ const lines = [`✅ Phase ${result.phaseId} updated: ${result.previousStatus} → ${result.newStatus}`];
76
+ if (result.startedAt)
77
+ lines.push(` Started at: ${result.startedAt}`);
78
+ if (result.finishAt)
79
+ lines.push(` Finished at: ${result.finishAt}`);
80
+ return lines.join("\n");
81
+ }
82
+ function formatUpdateTaskResult(result) {
83
+ if (!result.success) {
84
+ return `❌ Failed to update task: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
85
+ }
86
+ const lines = [`✅ Task ${result.taskId} in ${result.phaseId} updated: ${result.previousStatus} → ${result.newStatus}`];
87
+ if (result.startedAt)
88
+ lines.push(` Started at: ${result.startedAt}`);
89
+ if (result.finishAt)
90
+ lines.push(` Finished at: ${result.finishAt}`);
91
+ return lines.join("\n");
92
+ }
93
+ function formatMissionCompleteResult(result) {
94
+ if (!result.success) {
95
+ return `❌ Failed to complete mission: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
96
+ }
97
+ return `✅ Mission ${result.runId} marked as complete\n Previous status: ${result.previousStatus}\n Finished at: ${result.finishAt}`;
98
+ }
99
+ function formatMissionResumeResult(result) {
100
+ if (!result.success) {
101
+ return `❌ Failed to resume mission: ${result.message}\n${result.errors.map(e => ` - ${e}`).join("\n")}`;
102
+ }
103
+ return `✅ Mission resumed: ${result.runId}\n Run status: ${result.runStatus}`;
104
+ }
105
+ function resolveBundledSkillsDir() {
106
+ const projectSkillFile = path.join(getProjectRoot(), ".pi", "skills", "mission-orchestrator", "SKILL.md");
107
+ if (existsSync(projectSkillFile)) {
108
+ return null;
109
+ }
110
+ const extensionDir = path.dirname(fileURLToPath(import.meta.url));
111
+ return path.join(extensionDir, "..", "skills");
112
+ }
113
+ function queueOnActiveRun(operation) {
114
+ const activeRunId = readState().active_run_id;
115
+ const runFilePath = activeRunId ? getRunFilePath(activeRunId) : getStateFilePath();
116
+ return withFileMutationQueue(runFilePath, async () => operation());
117
+ }
118
+ function queueOnRunAndState(runId, operation) {
119
+ const runFilePath = getRunFilePath(runId);
120
+ const stateFilePath = getStateFilePath();
121
+ return withFileMutationQueue(runFilePath, async () => withFileMutationQueue(stateFilePath, async () => operation()));
122
+ }
123
+ // ============================================================================
124
+ // Agent Model Configuration
125
+ // ============================================================================
126
+ const AGENT_FILES = {
127
+ worker: ".pi/agents/worker.md",
128
+ auditor: ".pi/agents/auditor.md",
129
+ };
130
+ // Placeholder/default model values that indicate unconfigured state
131
+ const DEFAULT_MODEL_VALUES = ["light", "default", "placeholder", ""];
132
+ /**
133
+ * Parse YAML frontmatter from markdown content.
134
+ * Returns parsed frontmatter and the content after frontmatter.
135
+ */
136
+ function parseFrontmatter(content) {
137
+ const match = content.match(/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/);
138
+ if (!match) {
139
+ return { frontmatter: null, body: content };
140
+ }
141
+ const yamlText = match[1];
142
+ const body = match[2];
143
+ const frontmatter = {};
144
+ // Simple YAML parsing for key: value pairs
145
+ for (const line of yamlText.split("\n")) {
146
+ const colonIdx = line.indexOf(":");
147
+ if (colonIdx > 0) {
148
+ const key = line.slice(0, colonIdx).trim();
149
+ const value = line.slice(colonIdx + 1).trim();
150
+ // Remove quotes if present
151
+ frontmatter[key] = value.replace(/^["']|["']$/g, "");
152
+ }
153
+ }
154
+ return { frontmatter, body };
155
+ }
156
+ /**
157
+ * Serialize frontmatter and body back to markdown.
158
+ */
159
+ function serializeFrontmatter(frontmatter, body) {
160
+ const lines = ["---"];
161
+ for (const [key, value] of Object.entries(frontmatter)) {
162
+ if (value === undefined)
163
+ continue;
164
+ // Quote string values that contain special characters
165
+ const strValue = String(value);
166
+ const needsQuotes = strValue.includes(":") || strValue.includes("#") || strValue.startsWith(" ") || strValue === "";
167
+ lines.push(`${key}: ${needsQuotes ? `"${strValue}"` : strValue}`);
168
+ }
169
+ lines.push("---");
170
+ lines.push("");
171
+ lines.push(body);
172
+ return lines.join("\n");
173
+ }
174
+ /**
175
+ * Check if agent file has unconfigured/placeholder model.
176
+ */
177
+ function hasUnconfiguredModel(agentPath) {
178
+ const content = readText(agentPath);
179
+ if (!content)
180
+ return true; // File doesn't exist = unconfigured
181
+ const { frontmatter } = parseFrontmatter(content);
182
+ if (!frontmatter)
183
+ return true; // No frontmatter = unconfigured
184
+ const model = frontmatter.model?.toLowerCase().trim() ?? "";
185
+ return DEFAULT_MODEL_VALUES.includes(model);
186
+ }
187
+ /**
188
+ * Update agent file with selected model.
189
+ */
190
+ function updateAgentModel(agentPath, model) {
191
+ const content = readText(agentPath);
192
+ if (!content)
193
+ return false;
194
+ const { frontmatter, body } = parseFrontmatter(content);
195
+ if (!frontmatter)
196
+ return false;
197
+ frontmatter.model = model;
198
+ writeText(agentPath, serializeFrontmatter(frontmatter, body));
199
+ return true;
200
+ }
201
+ /**
202
+ * Get sorted list of available models for selection.
203
+ * Prefers cheaper models and current model (if available).
204
+ * Falls back to authenticated models if scoped-model access unavailable.
205
+ */
206
+ function getSortedAvailableModels(availableModels, currentModel) {
207
+ // Sort by cost (input + output), then by whether it's the current model
208
+ return [...availableModels].sort((a, b) => {
209
+ // Current model gets highest priority
210
+ if (currentModel) {
211
+ if (a.id === currentModel.id && a.provider === currentModel.provider)
212
+ return -1;
213
+ if (b.id === currentModel.id && b.provider === currentModel.provider)
214
+ return 1;
215
+ }
216
+ // Then sort by total cost (cheaper first)
217
+ const costA = a.cost.input + a.cost.output;
218
+ const costB = b.cost.input + b.cost.output;
219
+ return costA - costB;
220
+ });
221
+ }
222
+ function formatContextWindow(tokens) {
223
+ if (tokens >= 1_000_000)
224
+ return `${(tokens / 1_000_000).toFixed(1)}M ctx`;
225
+ if (tokens >= 1_000)
226
+ return `${Math.round(tokens / 1_000)}k ctx`;
227
+ return `${tokens} ctx`;
228
+ }
229
+ function getModelCapabilityTags(model) {
230
+ const tags = [];
231
+ const totalCost = model.cost.input + model.cost.output;
232
+ if (totalCost === 0)
233
+ tags.push("free");
234
+ else if (totalCost <= 1)
235
+ tags.push("cheap");
236
+ else if (totalCost >= 10)
237
+ tags.push("premium");
238
+ if (model.reasoning)
239
+ tags.push("reasoning");
240
+ if (model.input.includes("image"))
241
+ tags.push("vision");
242
+ if (model.contextWindow >= 500_000)
243
+ tags.push("long-context");
244
+ else if (model.contextWindow >= 100_000)
245
+ tags.push("128k+");
246
+ return tags;
247
+ }
248
+ function formatModelOption(model) {
249
+ const totalCost = model.cost.input + model.cost.output;
250
+ const cost = totalCost > 0 ? `$${totalCost.toFixed(2)}/1M` : "free";
251
+ const displayName = model.name && model.name !== model.id ? model.name : `${model.provider}/${model.id}`;
252
+ const tags = getModelCapabilityTags(model);
253
+ const suffix = [formatContextWindow(model.contextWindow), cost, tags.join(", ")].filter(Boolean).join(" • ");
254
+ return `${displayName} — ${model.provider}/${model.id} (${suffix})`;
255
+ }
256
+ /**
257
+ * Prompt user to configure agent models after scaffold.
258
+ * Uses available authenticated models; notes if scoped-model access unavailable.
259
+ */
260
+ async function promptAgentModelSetup(ctx, extensionApi) {
261
+ const projectRoot = getProjectRoot();
262
+ const workerPath = path.join(projectRoot, AGENT_FILES.worker);
263
+ const auditorPath = path.join(projectRoot, AGENT_FILES.auditor);
264
+ // Check if either agent needs configuration
265
+ const workerNeedsConfig = hasUnconfiguredModel(workerPath);
266
+ const auditorNeedsConfig = hasUnconfiguredModel(auditorPath);
267
+ if (!workerNeedsConfig && !auditorNeedsConfig) {
268
+ return; // Both already configured
269
+ }
270
+ // Warn if required tools are missing
271
+ const hasAskUser = extensionApi.getAllTools().some((tool) => tool.name === "ask_user");
272
+ const hasSubagent = extensionApi.getAllTools().some((tool) => tool.name === "subagent");
273
+ if (!hasAskUser) {
274
+ ctx.ui.notify("Mission Control: ask_user tool not available. Structured interviews and approvals will be less guided.", "warning");
275
+ }
276
+ if (!hasSubagent) {
277
+ ctx.ui.notify("Mission Control: subagent tool not available. Worker/Auditor delegation will not run until pi-subagents is loaded.", "warning");
278
+ }
279
+ // Get available models from registry
280
+ // Note: getAvailable() returns authenticated models. If scoped-model access
281
+ // is unavailable, this still provides usable models but without scope filtering.
282
+ const availableModels = ctx.modelRegistry.getAvailable();
283
+ if (availableModels.length === 0) {
284
+ ctx.ui.notify("Mission Control: No authenticated models available. Please configure API keys first.", "warning");
285
+ return;
286
+ }
287
+ // Sort models (prefer cheaper + current model)
288
+ const sortedModels = getSortedAvailableModels(availableModels, ctx.model);
289
+ const modelOptions = sortedModels.map(formatModelOption);
290
+ const selection = await ctx.ui.select("Choose a shared model for Worker + Auditor (sorted cheapest first)", modelOptions, { timeout: 60000 });
291
+ if (!selection) {
292
+ ctx.ui.notify("Mission Control: Agent model setup cancelled. Using defaults.", "info");
293
+ return;
294
+ }
295
+ // Extract model ID from selection
296
+ const selectedModel = sortedModels[modelOptions.indexOf(selection)];
297
+ if (!selectedModel) {
298
+ ctx.ui.notify("Mission Control: Invalid model selection.", "error");
299
+ return;
300
+ }
301
+ // Format as provider/modelId for the frontmatter
302
+ const modelValue = `${selectedModel.provider}/${selectedModel.id}`;
303
+ // Update both agent files
304
+ let updatedCount = 0;
305
+ if (workerNeedsConfig) {
306
+ if (updateAgentModel(workerPath, modelValue)) {
307
+ updatedCount++;
308
+ }
309
+ else {
310
+ ctx.ui.notify(`Mission Control: Failed to update ${AGENT_FILES.worker}`, "error");
311
+ }
312
+ }
313
+ if (auditorNeedsConfig) {
314
+ if (updateAgentModel(auditorPath, modelValue)) {
315
+ updatedCount++;
316
+ }
317
+ else {
318
+ ctx.ui.notify(`Mission Control: Failed to update ${AGENT_FILES.auditor}`, "error");
319
+ }
320
+ }
321
+ if (updatedCount > 0) {
322
+ ctx.ui.notify(`Mission Control: Set agent models to ${selectedModel.name} (${modelValue})`, "info");
323
+ }
324
+ }
325
+ // ============================================================================
326
+ // Extension Factory
327
+ // ============================================================================
328
+ export default function missionControlExtension(pi) {
329
+ // ========================================================================
330
+ // Register /mission command
331
+ // ========================================================================
332
+ pi.registerCommand("mission", {
333
+ description: "Open Mission Control dashboard for visual mission orchestration",
334
+ handler: async (args, ctx) => {
335
+ if (!isScaffolded()) {
336
+ const result = missionScaffold();
337
+ if (!result.success) {
338
+ ctx.ui.notify(`Scaffolding failed: ${result.message}`, "error");
339
+ return;
340
+ }
341
+ ctx.ui.notify("Mission Control scaffolding complete", "info");
342
+ }
343
+ if (ctx.hasUI) {
344
+ await promptAgentModelSetup(ctx, pi);
345
+ }
346
+ const trimmedArgs = args.trim().toLowerCase();
347
+ let dashboardResult = null;
348
+ if (trimmedArgs === "init") {
349
+ dashboardResult = "init";
350
+ }
351
+ else if (!ctx.hasUI) {
352
+ ctx.ui.notify("/mission init works without interactive UI", "info");
353
+ return;
354
+ }
355
+ else {
356
+ dashboardResult = await ctx.ui.custom((tui, _theme, _keybindings, done) => {
357
+ const dashboard = new MissionDashboard({
358
+ onClose: () => {
359
+ dashboard.dispose();
360
+ done(null);
361
+ },
362
+ onInitMission: () => {
363
+ dashboard.dispose();
364
+ done("init");
365
+ },
366
+ });
367
+ dashboard.startRefresh(tui);
368
+ return {
369
+ render: (width) => dashboard.render(width, ctx.ui.theme),
370
+ handleInput: (data) => dashboard.handleInput(data),
371
+ invalidate: () => dashboard.invalidate(),
372
+ dispose: () => dashboard.dispose(),
373
+ };
374
+ }, { overlay: true });
375
+ }
376
+ if (dashboardResult !== "init") {
377
+ return;
378
+ }
379
+ const initResult = missionInit({
380
+ phase: "research",
381
+ statusMessage: "Mission initialized - waiting for requirements",
382
+ });
383
+ if (!initResult.success || !initResult.runId) {
384
+ ctx.ui.notify(`Failed to initialize mission: ${initResult.message}`, "error");
385
+ return;
386
+ }
387
+ ctx.ui.notify(`Mission initialized: ${initResult.runId}`, "info");
388
+ pi.sendUserMessage(`/skill:mission-orchestrator New mission initialized with run ID ${initResult.runId}. Start the requirements interview now.`);
389
+ },
390
+ });
391
+ // ========================================================================
392
+ // Register Agent Tools
393
+ // ========================================================================
394
+ // add_phase tool
395
+ pi.registerTool({
396
+ name: "add_phase",
397
+ label: "Add Mission Phase",
398
+ description: "Add a new phase to the current mission run. Auto-generates phase_id (phase1, phase2, ...). " +
399
+ "Sets status to 'pending'. Use this to structure the mission into logical phases.",
400
+ promptSnippet: "add_phase(name, file) → adds a mission phase",
401
+ parameters: AddPhaseSchema,
402
+ execute: async (_toolCallId, params) => {
403
+ const result = await queueOnActiveRun(() => addPhase(params));
404
+ return {
405
+ isError: !result.success,
406
+ content: [{ type: "text", text: formatAddPhaseResult(result) }],
407
+ details: result,
408
+ };
409
+ },
410
+ });
411
+ // add_task tool
412
+ pi.registerTool({
413
+ name: "add_task",
414
+ label: "Add Mission Task",
415
+ description: "Add a new task to a phase. Auto-generates task_id from phase prefix (phase1-task1, phase1-task2, ...). " +
416
+ "Sets status to 'pending'. Use this to break down phases into executable tasks.",
417
+ promptSnippet: "add_task(phase_id, name, file) → adds a task to a phase",
418
+ parameters: AddTaskSchema,
419
+ execute: async (_toolCallId, params) => {
420
+ const result = await queueOnActiveRun(() => addTask(params));
421
+ return {
422
+ isError: !result.success,
423
+ content: [{ type: "text", text: formatAddTaskResult(result) }],
424
+ details: result,
425
+ };
426
+ },
427
+ });
428
+ // update_phase tool
429
+ pi.registerTool({
430
+ name: "update_phase",
431
+ label: "Update Phase Status",
432
+ description: "Update a phase's status. Auto-sets started_at when transitioning to 'in_progress'. " +
433
+ "Auto-sets finish_at when transitioning to 'done' or 'removed'. " +
434
+ "Valid statuses: pending, in_progress, done, removed.",
435
+ promptSnippet: "update_phase(phase_id, status) → updates phase status",
436
+ parameters: UpdatePhaseSchema,
437
+ execute: async (_toolCallId, params) => {
438
+ const result = await queueOnActiveRun(() => updatePhase(params));
439
+ return {
440
+ isError: !result.success,
441
+ content: [{ type: "text", text: formatUpdatePhaseResult(result) }],
442
+ details: result,
443
+ };
444
+ },
445
+ });
446
+ // update_task tool
447
+ pi.registerTool({
448
+ name: "update_task",
449
+ label: "Update Task Status",
450
+ description: "Update a task's status. Auto-sets started_at when transitioning to 'in_progress'. " +
451
+ "Auto-sets finish_at when transitioning to 'done', 'failed', or 'removed'. " +
452
+ "Valid statuses: pending, in_progress, done, failed, removed.",
453
+ promptSnippet: "update_task(task_id, status) → updates task status",
454
+ parameters: UpdateTaskSchema,
455
+ execute: async (_toolCallId, params) => {
456
+ const result = await queueOnActiveRun(() => updateTask(params));
457
+ return {
458
+ isError: !result.success,
459
+ content: [{ type: "text", text: formatUpdateTaskResult(result) }],
460
+ details: result,
461
+ };
462
+ },
463
+ });
464
+ // mission_complete tool
465
+ pi.registerTool({
466
+ name: "mission_complete",
467
+ label: "Complete Mission",
468
+ description: "Mark a mission run as complete. Sets run.json status to 'done' and finish_at timestamp. " +
469
+ "Clears active_run_id from state.json. Use when all phases are finished successfully.",
470
+ promptSnippet: "mission_complete(run_id) → marks mission as complete",
471
+ parameters: MissionCompleteSchema,
472
+ execute: async (_toolCallId, params) => {
473
+ const result = await queueOnRunAndState(params.run_id, () => missionComplete(params));
474
+ return {
475
+ isError: !result.success,
476
+ content: [{ type: "text", text: formatMissionCompleteResult(result) }],
477
+ details: result,
478
+ };
479
+ },
480
+ });
481
+ // mission_resume tool
482
+ pi.registerTool({
483
+ name: "mission_resume",
484
+ label: "Resume Mission",
485
+ description: "Resume a previously created mission run. Sets state.json active_run_id to the specified run_id. " +
486
+ "Use when the user wants to continue work on an existing mission.",
487
+ promptSnippet: "mission_resume(run_id, phase?, statusMessage?) → resumes a mission",
488
+ parameters: MissionResumeSchema,
489
+ execute: async (_toolCallId, params) => {
490
+ const result = await queueOnRunAndState(params.run_id, () => missionResume(params));
491
+ return {
492
+ isError: !result.success,
493
+ content: [{ type: "text", text: formatMissionResumeResult(result) }],
494
+ details: result,
495
+ };
496
+ },
497
+ });
498
+ // ========================================================================
499
+ // Register resources_discover for bundled skills
500
+ // ========================================================================
501
+ pi.on("resources_discover", (_event) => {
502
+ const bundledSkillsDir = resolveBundledSkillsDir();
503
+ return bundledSkillsDir ? { skillPaths: [bundledSkillsDir] } : {};
504
+ });
505
+ // ========================================================================
506
+ // Handle session_start/reset for state reset
507
+ // ========================================================================
508
+ pi.on("session_start", (event, ctx) => {
509
+ if (event.reason !== "reload" && isScaffolded()) {
510
+ const currentState = readState();
511
+ writeState({ ...defaultState });
512
+ if (currentState.active_run_id) {
513
+ ctx.ui.notify(`Previous mission run ${currentState.active_run_id} is inactive in this pi session. Use mission_resume to continue it.`, "info");
514
+ }
515
+ }
516
+ const hasSubagent = pi.getAllTools().some((tool) => tool.name === "subagent");
517
+ if (!hasSubagent) {
518
+ ctx.ui.notify("Mission Control: subagent tool not available. Worker/Auditor delegation will not run until pi-subagents is loaded.", "warning");
519
+ }
520
+ const hasAskUser = pi.getAllTools().some((tool) => tool.name === "ask_user");
521
+ if (!hasAskUser) {
522
+ ctx.ui.notify("Mission Control: ask_user tool not available. Install pi-ask-user for better interviews and approval prompts.", "warning");
523
+ }
524
+ });
525
+ }
526
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}