minutework 0.1.0 → 0.1.2
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/EXTERNAL_ALPHA.md +10 -0
- package/README.md +9 -0
- package/assets/claude-local/bundle.json +1 -13
- package/assets/claude-local/skills/README.md +2 -2
- package/dist/cli.js +0 -0
- package/dist/developer-client.d.ts +36 -0
- package/dist/developer-client.js +37 -4
- package/dist/developer-client.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +117 -50
- package/dist/index.js.map +1 -1
- package/dist/init-prompt.d.ts +11 -0
- package/dist/init-prompt.js +68 -0
- package/dist/init-prompt.js.map +1 -0
- package/dist/init.js +3 -3
- package/dist/init.js.map +1 -1
- package/dist/orchestrator-context.d.ts +13 -0
- package/dist/orchestrator-context.js +32 -0
- package/dist/orchestrator-context.js.map +1 -0
- package/dist/orchestrator-engine.d.ts +36 -0
- package/dist/orchestrator-engine.js +88 -0
- package/dist/orchestrator-engine.js.map +1 -0
- package/dist/orchestrator-state.d.ts +145 -0
- package/dist/orchestrator-state.js +211 -0
- package/dist/orchestrator-state.js.map +1 -0
- package/dist/orchestrator.d.ts +24 -0
- package/dist/orchestrator.js +599 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.js +1 -0
- package/dist/paths.js.map +1 -1
- package/dist/reporting.d.ts +53 -0
- package/dist/reporting.js +676 -0
- package/dist/reporting.js.map +1 -0
- package/dist/session-prompt.d.ts +11 -0
- package/dist/session-prompt.js +98 -0
- package/dist/session-prompt.js.map +1 -0
- package/dist/state.d.ts +1 -0
- package/dist/state.js +8 -0
- package/dist/state.js.map +1 -1
- package/package.json +17 -16
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CliIo } from "./index.js";
|
|
2
|
+
import type { CliStatePaths } from "./paths.js";
|
|
3
|
+
import { type OrchestratorSpawnProcess, type ResolveExecutable } from "./orchestrator-engine.js";
|
|
4
|
+
type OrchestratorSignalTarget = {
|
|
5
|
+
off: (signal: NodeJS.Signals, listener: () => void) => void;
|
|
6
|
+
on: (signal: NodeJS.Signals, listener: () => void) => void;
|
|
7
|
+
};
|
|
8
|
+
export type OrchestratorDependencies = {
|
|
9
|
+
controllerPid?: number;
|
|
10
|
+
isProcessAlive?: (pid: number) => boolean;
|
|
11
|
+
resolveExecutable?: ResolveExecutable;
|
|
12
|
+
signalTarget?: OrchestratorSignalTarget;
|
|
13
|
+
spawnProcess?: OrchestratorSpawnProcess;
|
|
14
|
+
};
|
|
15
|
+
export declare function runSessionCommand(options: {
|
|
16
|
+
args: string[];
|
|
17
|
+
cwd: string;
|
|
18
|
+
dependencies?: OrchestratorDependencies;
|
|
19
|
+
env: NodeJS.ProcessEnv;
|
|
20
|
+
io: CliIo;
|
|
21
|
+
paths: CliStatePaths;
|
|
22
|
+
platform: NodeJS.Platform;
|
|
23
|
+
}): Promise<number>;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
import * as childProcess from "node:child_process";
|
|
2
|
+
import { isProcessAlive } from "@minutework/workspace-mcp";
|
|
3
|
+
import { buildDeveloperLocalOrchestratorContext } from "./orchestrator-context.js";
|
|
4
|
+
import { getLocalEngineAdapter, resolveExecutableOnPath, } from "./orchestrator-engine.js";
|
|
5
|
+
import { acquireDeveloperLocalOrchestratorLock, buildDeveloperLocalOrchestratorPreference, buildDeveloperLocalOrchestratorSession, createDeveloperLocalOrchestratorSessionId, loadOptionalDeveloperLocalOrchestratorLock, loadOptionalDeveloperLocalOrchestratorPreference, loadOptionalDeveloperLocalOrchestratorSession, resolveDeveloperLocalOrchestratorPaths, saveDeveloperLocalOrchestratorPreference, saveDeveloperLocalOrchestratorSession, writeDeveloperLocalOrchestratorSessionRecord, writeDeveloperLocalOrchestratorContext, } from "./orchestrator-state.js";
|
|
6
|
+
import { findWorkspaceRoot } from "./state.js";
|
|
7
|
+
import { promptLocalCodingEngine, promptWorkflowMode, shouldOfferInteractiveSessionPrompt, } from "./session-prompt.js";
|
|
8
|
+
export async function runSessionCommand(options) {
|
|
9
|
+
const [subcommand, ...rest] = options.args;
|
|
10
|
+
if (!subcommand || subcommand === "--help" || subcommand === "-h" || subcommand === "help") {
|
|
11
|
+
options.io.stdout(renderSessionHelp());
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
if (subcommand === "start") {
|
|
15
|
+
return runSessionStartCommand(rest, options, { resume: false });
|
|
16
|
+
}
|
|
17
|
+
if (subcommand === "resume") {
|
|
18
|
+
return runSessionStartCommand(rest, options, { resume: true });
|
|
19
|
+
}
|
|
20
|
+
if (subcommand === "status") {
|
|
21
|
+
return runSessionStatusCommand(rest, options);
|
|
22
|
+
}
|
|
23
|
+
options.io.stderr(`Unknown "session" subcommand: ${subcommand}`);
|
|
24
|
+
options.io.stderr("");
|
|
25
|
+
options.io.stderr(renderSessionHelp());
|
|
26
|
+
return 1;
|
|
27
|
+
}
|
|
28
|
+
function renderSessionHelp() {
|
|
29
|
+
return `Developer-local orchestrator session
|
|
30
|
+
|
|
31
|
+
Usage:
|
|
32
|
+
minutework session start [--mode <human|ai>] [--engine <claude>] [--workspace <path>]
|
|
33
|
+
minutework session resume [--workspace <path>]
|
|
34
|
+
minutework session status [--workspace <path>]
|
|
35
|
+
|
|
36
|
+
Notes:
|
|
37
|
+
start Selects or confirms the workflow mode, assembles a bounded context pack, and launches the local coding engine when mode is ai.
|
|
38
|
+
resume Reuses the stored workspace preference and launches a fresh broker session without accepting mode or engine overrides.
|
|
39
|
+
status Prints the stored preference and the last recorded orchestrator session summary.
|
|
40
|
+
`;
|
|
41
|
+
}
|
|
42
|
+
async function runSessionStatusCommand(args, options) {
|
|
43
|
+
const parsed = parseSessionArgs(args, "status");
|
|
44
|
+
if (parsed.help) {
|
|
45
|
+
options.io.stdout(renderSessionHelp());
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
const workspaceRoot = await findWorkspaceRoot(parsed.workspacePath ?? options.cwd);
|
|
49
|
+
const orchestratorPaths = await resolveDeveloperLocalOrchestratorPaths({
|
|
50
|
+
cliStatePaths: options.paths,
|
|
51
|
+
platform: options.platform,
|
|
52
|
+
workspaceRoot,
|
|
53
|
+
});
|
|
54
|
+
const [currentLock, preference, currentSession] = await Promise.all([
|
|
55
|
+
loadOptionalDeveloperLocalOrchestratorLock(orchestratorPaths.lockPath),
|
|
56
|
+
loadOptionalDeveloperLocalOrchestratorPreference(orchestratorPaths.preferencesPath),
|
|
57
|
+
loadOptionalDeveloperLocalOrchestratorSession(orchestratorPaths.currentSessionPath),
|
|
58
|
+
]);
|
|
59
|
+
const currentSessionStatus = resolveRecordedSessionStatus(currentSession, options.dependencies?.isProcessAlive ?? isProcessAlive);
|
|
60
|
+
const lockIsLive = currentLock &&
|
|
61
|
+
currentLock.controllerPid > 0 &&
|
|
62
|
+
(options.dependencies?.isProcessAlive ?? isProcessAlive)(currentLock.controllerPid);
|
|
63
|
+
const summary = {
|
|
64
|
+
currentSession,
|
|
65
|
+
paths: {
|
|
66
|
+
currentSessionPath: orchestratorPaths.currentSessionPath,
|
|
67
|
+
lockPath: orchestratorPaths.lockPath,
|
|
68
|
+
preferencesPath: orchestratorPaths.preferencesPath,
|
|
69
|
+
sessionsRoot: orchestratorPaths.sessionsRoot,
|
|
70
|
+
},
|
|
71
|
+
preference,
|
|
72
|
+
status: currentSessionStatus === "running" || lockIsLive
|
|
73
|
+
? "running"
|
|
74
|
+
: currentSessionStatus,
|
|
75
|
+
workspaceRoot,
|
|
76
|
+
};
|
|
77
|
+
options.io.stdout(JSON.stringify(summary, null, 2));
|
|
78
|
+
return summary.status === "failed" || summary.status === "stale" ? 1 : 0;
|
|
79
|
+
}
|
|
80
|
+
async function runSessionStartCommand(args, options, mode) {
|
|
81
|
+
const parsed = parseSessionArgs(args, mode.resume ? "resume" : "start");
|
|
82
|
+
if (parsed.help) {
|
|
83
|
+
options.io.stdout(renderSessionHelp());
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
const workspaceRoot = await findWorkspaceRoot(parsed.workspacePath ?? options.cwd);
|
|
87
|
+
const currentSessionId = createDeveloperLocalOrchestratorSessionId();
|
|
88
|
+
const orchestratorPaths = await resolveDeveloperLocalOrchestratorPaths({
|
|
89
|
+
cliStatePaths: options.paths,
|
|
90
|
+
platform: options.platform,
|
|
91
|
+
sessionId: currentSessionId,
|
|
92
|
+
workspaceRoot,
|
|
93
|
+
});
|
|
94
|
+
const [existingPreference, previousSession] = await Promise.all([
|
|
95
|
+
loadOptionalDeveloperLocalOrchestratorPreference(orchestratorPaths.preferencesPath),
|
|
96
|
+
loadOptionalDeveloperLocalOrchestratorSession(orchestratorPaths.currentSessionPath),
|
|
97
|
+
]);
|
|
98
|
+
const isProcessAliveFn = options.dependencies?.isProcessAlive ?? isProcessAlive;
|
|
99
|
+
const previousSessionStatus = resolveRecordedSessionStatus(previousSession, isProcessAliveFn);
|
|
100
|
+
const controllerPid = options.dependencies?.controllerPid ?? process.pid;
|
|
101
|
+
if (mode.resume && !existingPreference) {
|
|
102
|
+
throw new Error("No stored developer-local orchestrator preference exists for this workspace. Run `minutework session start --mode <human|ai>` first.");
|
|
103
|
+
}
|
|
104
|
+
if (previousSessionStatus === "running") {
|
|
105
|
+
throw new Error(`A developer-local orchestrator session is currently running for this workspace. Recorded session: ${orchestratorPaths.currentSessionPath}`);
|
|
106
|
+
}
|
|
107
|
+
const releaseLock = await acquireDeveloperLocalOrchestratorLock({
|
|
108
|
+
controllerPid,
|
|
109
|
+
isProcessAlive: isProcessAliveFn,
|
|
110
|
+
lockPath: orchestratorPaths.lockPath,
|
|
111
|
+
sessionId: currentSessionId,
|
|
112
|
+
});
|
|
113
|
+
try {
|
|
114
|
+
const workflowMode = mode.resume
|
|
115
|
+
? existingPreference?.workflowMode
|
|
116
|
+
: parsed.mode ?? existingPreference?.workflowMode ?? (await maybePromptWorkflowMode(options.io, options.env));
|
|
117
|
+
if (!workflowMode) {
|
|
118
|
+
throw new Error('Workflow mode is required. Pass `--mode <human|ai>` or rerun from an interactive terminal.');
|
|
119
|
+
}
|
|
120
|
+
if (parsed.engineKind && workflowMode !== "ai") {
|
|
121
|
+
throw new Error('The "--engine" option requires ai mode. Pass `--mode ai` when selecting a local coding engine.');
|
|
122
|
+
}
|
|
123
|
+
const engineKindCandidate = workflowMode === "ai"
|
|
124
|
+
? mode.resume
|
|
125
|
+
? existingPreference?.engineKind ?? undefined
|
|
126
|
+
: parsed.engineKind ??
|
|
127
|
+
existingPreference?.engineKind ??
|
|
128
|
+
(await maybePromptLocalCodingEngine(options.io, options.env))
|
|
129
|
+
: null;
|
|
130
|
+
if (workflowMode === "ai" && !engineKindCandidate) {
|
|
131
|
+
throw new Error("Local coding engine is required for ai mode. Pass `--engine <claude>` or rerun from an interactive terminal.");
|
|
132
|
+
}
|
|
133
|
+
const engineKind = workflowMode === "ai" ? engineKindCandidate : null;
|
|
134
|
+
const { context, digest } = await buildDeveloperLocalOrchestratorContext({
|
|
135
|
+
cwd: options.cwd,
|
|
136
|
+
engineKind,
|
|
137
|
+
env: options.env,
|
|
138
|
+
platform: options.platform,
|
|
139
|
+
workflowMode,
|
|
140
|
+
workspacePath: workspaceRoot,
|
|
141
|
+
});
|
|
142
|
+
await writeDeveloperLocalOrchestratorContext(orchestratorPaths.contextPath, context);
|
|
143
|
+
await saveDeveloperLocalOrchestratorPreference(orchestratorPaths.preferencesPath, buildDeveloperLocalOrchestratorPreference({
|
|
144
|
+
engineKind,
|
|
145
|
+
platformBaseUrl: context.workspaceSnapshot.resolvedPlatform.baseUrl,
|
|
146
|
+
workflowMode,
|
|
147
|
+
workspaceRoot,
|
|
148
|
+
}));
|
|
149
|
+
if (workflowMode === "human") {
|
|
150
|
+
const session = buildDeveloperLocalOrchestratorSession({
|
|
151
|
+
controllerPid,
|
|
152
|
+
contextDigest: digest,
|
|
153
|
+
contextPath: orchestratorPaths.contextPath,
|
|
154
|
+
enginePid: null,
|
|
155
|
+
engineKind: null,
|
|
156
|
+
engineStatus: "human_mode",
|
|
157
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
158
|
+
sessionId: currentSessionId,
|
|
159
|
+
status: "ready",
|
|
160
|
+
transcriptPath: null,
|
|
161
|
+
workflowMode,
|
|
162
|
+
workspaceRoot,
|
|
163
|
+
});
|
|
164
|
+
await saveSessionArtifacts(orchestratorPaths, session);
|
|
165
|
+
options.io.stdout("Selected human mode for this workspace.");
|
|
166
|
+
options.io.stdout(`Stored preference: ${orchestratorPaths.preferencesPath}`);
|
|
167
|
+
options.io.stdout(`Context pack: ${orchestratorPaths.contextPath}`);
|
|
168
|
+
options.io.stdout("No local coding engine was launched.");
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
if (!engineKind) {
|
|
172
|
+
throw new Error("Local coding engine is required for ai mode.");
|
|
173
|
+
}
|
|
174
|
+
const adapter = getLocalEngineAdapter(engineKind);
|
|
175
|
+
const resolveExecutable = options.dependencies?.resolveExecutable ?? resolveExecutableOnPath;
|
|
176
|
+
const readiness = await adapter.detectReadiness(resolveExecutable);
|
|
177
|
+
if (readiness.status !== "ready") {
|
|
178
|
+
const session = buildDeveloperLocalOrchestratorSession({
|
|
179
|
+
controllerPid,
|
|
180
|
+
contextDigest: digest,
|
|
181
|
+
contextPath: orchestratorPaths.contextPath,
|
|
182
|
+
enginePid: null,
|
|
183
|
+
engineKind,
|
|
184
|
+
engineStatus: "missing_binary",
|
|
185
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
186
|
+
sessionId: currentSessionId,
|
|
187
|
+
status: "failed",
|
|
188
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
189
|
+
workflowMode,
|
|
190
|
+
workspaceRoot,
|
|
191
|
+
outcome: {
|
|
192
|
+
errorCode: "engine.binary_missing",
|
|
193
|
+
exitCode: 1,
|
|
194
|
+
signal: null,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
await saveSessionArtifacts(orchestratorPaths, session);
|
|
198
|
+
options.io.stderr(readiness.detail);
|
|
199
|
+
options.io.stderr(`Context pack: ${orchestratorPaths.contextPath}`);
|
|
200
|
+
return 1;
|
|
201
|
+
}
|
|
202
|
+
const launchSpec = adapter.createLaunchSpec({
|
|
203
|
+
contextPath: orchestratorPaths.contextPath,
|
|
204
|
+
executablePath: readiness.executablePath,
|
|
205
|
+
instructionPrompt: renderEngineLaunchPrompt({
|
|
206
|
+
contextPath: orchestratorPaths.contextPath,
|
|
207
|
+
workflowMode,
|
|
208
|
+
}),
|
|
209
|
+
mcpConfigPath: context.workspaceSnapshot.ide.claudeDesktopSample.exists
|
|
210
|
+
? context.workspaceSnapshot.ide.claudeDesktopSample.path
|
|
211
|
+
: null,
|
|
212
|
+
sessionId: currentSessionId,
|
|
213
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
214
|
+
workspaceRoot,
|
|
215
|
+
});
|
|
216
|
+
const sessionStartedAt = new Date().toISOString();
|
|
217
|
+
let runningSession = buildDeveloperLocalOrchestratorSession({
|
|
218
|
+
controllerPid,
|
|
219
|
+
contextDigest: digest,
|
|
220
|
+
contextPath: orchestratorPaths.contextPath,
|
|
221
|
+
enginePid: null,
|
|
222
|
+
engineKind,
|
|
223
|
+
engineStatus: "ready",
|
|
224
|
+
launchArgs: launchSpec.args,
|
|
225
|
+
launchProgram: launchSpec.program,
|
|
226
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
227
|
+
sessionId: currentSessionId,
|
|
228
|
+
startedAt: sessionStartedAt,
|
|
229
|
+
status: "running",
|
|
230
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
231
|
+
workflowMode,
|
|
232
|
+
workspaceRoot,
|
|
233
|
+
});
|
|
234
|
+
options.io.stdout(`Launching ${adapter.displayName} from ${launchSpec.program}`);
|
|
235
|
+
options.io.stdout(`Context pack: ${orchestratorPaths.contextPath}`);
|
|
236
|
+
options.io.stdout(`Stored preference: ${orchestratorPaths.preferencesPath}`);
|
|
237
|
+
let engineResult;
|
|
238
|
+
try {
|
|
239
|
+
engineResult = await launchLocalEngine({
|
|
240
|
+
dependencies: options.dependencies,
|
|
241
|
+
env: {
|
|
242
|
+
...options.env,
|
|
243
|
+
...launchSpec.env,
|
|
244
|
+
},
|
|
245
|
+
io: options.io,
|
|
246
|
+
onSpawn: async (childPid) => {
|
|
247
|
+
runningSession = buildDeveloperLocalOrchestratorSession({
|
|
248
|
+
controllerPid,
|
|
249
|
+
contextDigest: digest,
|
|
250
|
+
contextPath: orchestratorPaths.contextPath,
|
|
251
|
+
enginePid: childPid,
|
|
252
|
+
engineKind,
|
|
253
|
+
engineStatus: "ready",
|
|
254
|
+
launchArgs: launchSpec.args,
|
|
255
|
+
launchProgram: launchSpec.program,
|
|
256
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
257
|
+
sessionId: currentSessionId,
|
|
258
|
+
startedAt: sessionStartedAt,
|
|
259
|
+
status: "running",
|
|
260
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
261
|
+
workflowMode,
|
|
262
|
+
workspaceRoot,
|
|
263
|
+
});
|
|
264
|
+
await saveSessionArtifacts(orchestratorPaths, runningSession);
|
|
265
|
+
},
|
|
266
|
+
spec: launchSpec,
|
|
267
|
+
workspaceRoot,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
272
|
+
const failedSession = buildDeveloperLocalOrchestratorSession({
|
|
273
|
+
controllerPid,
|
|
274
|
+
contextDigest: digest,
|
|
275
|
+
contextPath: orchestratorPaths.contextPath,
|
|
276
|
+
enginePid: runningSession.enginePid,
|
|
277
|
+
engineKind,
|
|
278
|
+
engineStatus: "launch_failed",
|
|
279
|
+
launchArgs: launchSpec.args,
|
|
280
|
+
launchProgram: launchSpec.program,
|
|
281
|
+
outcome: {
|
|
282
|
+
errorCode: spawnErrorCode(error),
|
|
283
|
+
exitCode: 1,
|
|
284
|
+
signal: null,
|
|
285
|
+
},
|
|
286
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
287
|
+
sessionId: currentSessionId,
|
|
288
|
+
startedAt: runningSession.startedAt,
|
|
289
|
+
status: "failed",
|
|
290
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
291
|
+
workflowMode,
|
|
292
|
+
workspaceRoot,
|
|
293
|
+
});
|
|
294
|
+
await saveSessionArtifacts(orchestratorPaths, failedSession);
|
|
295
|
+
options.io.stderr(message);
|
|
296
|
+
options.io.stderr("The local coding engine could not be launched. Verify the engine is installed and authenticated locally, then rerun `minutework session resume`.");
|
|
297
|
+
return 1;
|
|
298
|
+
}
|
|
299
|
+
runningSession = buildDeveloperLocalOrchestratorSession({
|
|
300
|
+
controllerPid,
|
|
301
|
+
contextDigest: digest,
|
|
302
|
+
contextPath: orchestratorPaths.contextPath,
|
|
303
|
+
enginePid: runningSession.enginePid,
|
|
304
|
+
engineKind,
|
|
305
|
+
engineStatus: "ready",
|
|
306
|
+
launchArgs: launchSpec.args,
|
|
307
|
+
launchProgram: launchSpec.program,
|
|
308
|
+
previousSessionId: previousSession?.sessionId ?? null,
|
|
309
|
+
sessionId: currentSessionId,
|
|
310
|
+
startedAt: runningSession.startedAt,
|
|
311
|
+
status: "running",
|
|
312
|
+
transcriptPath: orchestratorPaths.transcriptPath,
|
|
313
|
+
workflowMode,
|
|
314
|
+
workspaceRoot,
|
|
315
|
+
});
|
|
316
|
+
if (engineResult.signal) {
|
|
317
|
+
runningSession = {
|
|
318
|
+
...runningSession,
|
|
319
|
+
outcome: {
|
|
320
|
+
errorCode: null,
|
|
321
|
+
exitCode: null,
|
|
322
|
+
signal: engineResult.signal,
|
|
323
|
+
},
|
|
324
|
+
status: "interrupted",
|
|
325
|
+
};
|
|
326
|
+
try {
|
|
327
|
+
await saveSessionArtifacts(orchestratorPaths, runningSession);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
options.io.stderr(`The local coding engine was interrupted, but MinuteWork could not persist the final session record: ${error instanceof Error ? error.message : String(error)}`);
|
|
331
|
+
}
|
|
332
|
+
return signalToExitCode(engineResult.signal);
|
|
333
|
+
}
|
|
334
|
+
const interruptedSignal = normalizeInterruptedExitSignal(engineResult.exitCode);
|
|
335
|
+
if (interruptedSignal) {
|
|
336
|
+
runningSession = {
|
|
337
|
+
...runningSession,
|
|
338
|
+
outcome: {
|
|
339
|
+
errorCode: null,
|
|
340
|
+
exitCode: null,
|
|
341
|
+
signal: interruptedSignal,
|
|
342
|
+
},
|
|
343
|
+
status: "interrupted",
|
|
344
|
+
};
|
|
345
|
+
try {
|
|
346
|
+
await saveSessionArtifacts(orchestratorPaths, runningSession);
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
options.io.stderr(`The local coding engine exited with an interrupt code, but MinuteWork could not persist the final session record: ${error instanceof Error ? error.message : String(error)}`);
|
|
350
|
+
}
|
|
351
|
+
return signalToExitCode(interruptedSignal);
|
|
352
|
+
}
|
|
353
|
+
const exitCode = engineResult.exitCode ?? 1;
|
|
354
|
+
runningSession = {
|
|
355
|
+
...runningSession,
|
|
356
|
+
outcome: {
|
|
357
|
+
errorCode: exitCode === 0 ? null : "engine.launch_failed",
|
|
358
|
+
exitCode,
|
|
359
|
+
signal: null,
|
|
360
|
+
},
|
|
361
|
+
status: exitCode === 0 ? "succeeded" : "failed",
|
|
362
|
+
};
|
|
363
|
+
try {
|
|
364
|
+
await saveSessionArtifacts(orchestratorPaths, runningSession);
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
options.io.stderr(`The local coding engine completed, but MinuteWork could not persist the final session record: ${error instanceof Error ? error.message : String(error)}`);
|
|
368
|
+
return exitCode;
|
|
369
|
+
}
|
|
370
|
+
if (exitCode !== 0) {
|
|
371
|
+
options.io.stderr("The local coding engine exited non-zero. If it needs authentication, complete that outside MinuteWork and rerun `minutework session resume`.");
|
|
372
|
+
}
|
|
373
|
+
return exitCode;
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
await releaseLock();
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async function saveSessionArtifacts(orchestratorPaths, session) {
|
|
380
|
+
await Promise.all([
|
|
381
|
+
saveDeveloperLocalOrchestratorSession(orchestratorPaths.currentSessionPath, session),
|
|
382
|
+
writeDeveloperLocalOrchestratorSessionRecord(orchestratorPaths.sessionRecordPath, session),
|
|
383
|
+
]);
|
|
384
|
+
}
|
|
385
|
+
async function maybePromptWorkflowMode(io, env) {
|
|
386
|
+
if (!shouldOfferInteractiveSessionPrompt(env)) {
|
|
387
|
+
return undefined;
|
|
388
|
+
}
|
|
389
|
+
return promptWorkflowMode(io);
|
|
390
|
+
}
|
|
391
|
+
async function maybePromptLocalCodingEngine(io, env) {
|
|
392
|
+
if (!shouldOfferInteractiveSessionPrompt(env)) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
return promptLocalCodingEngine(io);
|
|
396
|
+
}
|
|
397
|
+
function parseSessionArgs(args, subcommand) {
|
|
398
|
+
let workspacePath;
|
|
399
|
+
let mode;
|
|
400
|
+
let engineKind;
|
|
401
|
+
const setWorkspacePath = (value) => {
|
|
402
|
+
if (workspacePath) {
|
|
403
|
+
throw new Error(`The "session ${subcommand}" command accepts at most one workspace path.`);
|
|
404
|
+
}
|
|
405
|
+
workspacePath = value;
|
|
406
|
+
};
|
|
407
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
408
|
+
const arg = args[index];
|
|
409
|
+
if (arg === "--help" || arg === "-h") {
|
|
410
|
+
return { help: true };
|
|
411
|
+
}
|
|
412
|
+
if (arg === "--workspace") {
|
|
413
|
+
const next = args[index + 1];
|
|
414
|
+
if (!next || next.startsWith("--")) {
|
|
415
|
+
throw new Error(`The "session ${subcommand}" command requires a path after --workspace.`);
|
|
416
|
+
}
|
|
417
|
+
setWorkspacePath(next);
|
|
418
|
+
index += 1;
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
if (arg.startsWith("--workspace=")) {
|
|
422
|
+
const value = arg.slice("--workspace=".length);
|
|
423
|
+
if (!value) {
|
|
424
|
+
throw new Error(`The "session ${subcommand}" command requires a path after --workspace.`);
|
|
425
|
+
}
|
|
426
|
+
setWorkspacePath(value);
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
if (arg === "--mode") {
|
|
430
|
+
if (subcommand !== "start") {
|
|
431
|
+
throw new Error(`The "session ${subcommand}" command does not accept --mode. ${subcommand === "resume"
|
|
432
|
+
? "Resume uses the stored workspace preference."
|
|
433
|
+
: "Status only inspects the stored workspace preference."}`);
|
|
434
|
+
}
|
|
435
|
+
const next = args[index + 1];
|
|
436
|
+
if (!next || next.startsWith("--")) {
|
|
437
|
+
throw new Error('The "--mode" option requires a value: human or ai.');
|
|
438
|
+
}
|
|
439
|
+
mode = parseWorkflowModeFlag(next);
|
|
440
|
+
index += 1;
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
if (arg.startsWith("--mode=")) {
|
|
444
|
+
if (subcommand !== "start") {
|
|
445
|
+
throw new Error(`The "session ${subcommand}" command does not accept --mode. ${subcommand === "resume"
|
|
446
|
+
? "Resume uses the stored workspace preference."
|
|
447
|
+
: "Status only inspects the stored workspace preference."}`);
|
|
448
|
+
}
|
|
449
|
+
mode = parseWorkflowModeFlag(arg.slice("--mode=".length));
|
|
450
|
+
continue;
|
|
451
|
+
}
|
|
452
|
+
if (arg === "--engine") {
|
|
453
|
+
if (subcommand !== "start") {
|
|
454
|
+
throw new Error(`The "session ${subcommand}" command does not accept --engine. ${subcommand === "resume"
|
|
455
|
+
? "Resume uses the stored workspace preference."
|
|
456
|
+
: "Status only inspects the stored workspace preference."}`);
|
|
457
|
+
}
|
|
458
|
+
const next = args[index + 1];
|
|
459
|
+
if (!next || next.startsWith("--")) {
|
|
460
|
+
throw new Error('The "--engine" option requires a value: claude.');
|
|
461
|
+
}
|
|
462
|
+
engineKind = parseEngineFlag(next);
|
|
463
|
+
index += 1;
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (arg.startsWith("--engine=")) {
|
|
467
|
+
if (subcommand !== "start") {
|
|
468
|
+
throw new Error(`The "session ${subcommand}" command does not accept --engine. ${subcommand === "resume"
|
|
469
|
+
? "Resume uses the stored workspace preference."
|
|
470
|
+
: "Status only inspects the stored workspace preference."}`);
|
|
471
|
+
}
|
|
472
|
+
engineKind = parseEngineFlag(arg.slice("--engine=".length));
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
if (arg.startsWith("--")) {
|
|
476
|
+
throw new Error(`Unknown session option: ${arg}`);
|
|
477
|
+
}
|
|
478
|
+
setWorkspacePath(arg);
|
|
479
|
+
}
|
|
480
|
+
return {
|
|
481
|
+
engineKind,
|
|
482
|
+
help: false,
|
|
483
|
+
mode,
|
|
484
|
+
workspacePath,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
function parseWorkflowModeFlag(value) {
|
|
488
|
+
if (value === "human" || value === "ai") {
|
|
489
|
+
return value;
|
|
490
|
+
}
|
|
491
|
+
throw new Error(`Unknown workflow mode "${value}". Supported modes: human, ai.`);
|
|
492
|
+
}
|
|
493
|
+
function parseEngineFlag(value) {
|
|
494
|
+
if (value === "claude") {
|
|
495
|
+
return value;
|
|
496
|
+
}
|
|
497
|
+
throw new Error(`Unknown local coding engine "${value}". Supported engines: claude.`);
|
|
498
|
+
}
|
|
499
|
+
async function launchLocalEngine(options) {
|
|
500
|
+
const spawnProcess = options.dependencies?.spawnProcess ?? childProcess.spawn;
|
|
501
|
+
const signalTarget = options.dependencies?.signalTarget ?? process;
|
|
502
|
+
const child = spawnProcess(options.spec.program, options.spec.args, {
|
|
503
|
+
cwd: options.workspaceRoot,
|
|
504
|
+
env: options.env,
|
|
505
|
+
stdio: "inherit",
|
|
506
|
+
});
|
|
507
|
+
const exitPromise = new Promise((resolve, reject) => {
|
|
508
|
+
child.once("error", reject);
|
|
509
|
+
child.once("exit", (code, signal) => {
|
|
510
|
+
resolve({
|
|
511
|
+
exitCode: typeof code === "number" ? code : null,
|
|
512
|
+
signal: signal ?? null,
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
});
|
|
516
|
+
const handleSignal = (signal) => {
|
|
517
|
+
if (typeof child.kill === "function") {
|
|
518
|
+
child.kill(signal);
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
const forwardSigint = () => handleSignal("SIGINT");
|
|
522
|
+
const forwardSigterm = () => handleSignal("SIGTERM");
|
|
523
|
+
signalTarget.on("SIGINT", forwardSigint);
|
|
524
|
+
signalTarget.on("SIGTERM", forwardSigterm);
|
|
525
|
+
try {
|
|
526
|
+
try {
|
|
527
|
+
await options.onSpawn?.(child.pid ?? null);
|
|
528
|
+
}
|
|
529
|
+
catch (error) {
|
|
530
|
+
if (typeof child.kill === "function" &&
|
|
531
|
+
child.exitCode === null &&
|
|
532
|
+
child.signalCode === null) {
|
|
533
|
+
child.kill("SIGTERM");
|
|
534
|
+
}
|
|
535
|
+
await exitPromise.catch(() => undefined);
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
538
|
+
return await exitPromise;
|
|
539
|
+
}
|
|
540
|
+
finally {
|
|
541
|
+
signalTarget.off("SIGINT", forwardSigint);
|
|
542
|
+
signalTarget.off("SIGTERM", forwardSigterm);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
function spawnErrorCode(error) {
|
|
546
|
+
if (error && typeof error === "object" && "code" in error && typeof error.code === "string") {
|
|
547
|
+
return error.code;
|
|
548
|
+
}
|
|
549
|
+
return "engine.launch_failed";
|
|
550
|
+
}
|
|
551
|
+
function resolveRecordedSessionStatus(session, pidChecker) {
|
|
552
|
+
if (!session) {
|
|
553
|
+
return "missing";
|
|
554
|
+
}
|
|
555
|
+
if (session.status === "running") {
|
|
556
|
+
const trackedPids = [session.controllerPid, session.enginePid].filter((pid) => typeof pid === "number" && pid > 0);
|
|
557
|
+
return trackedPids.some((pid) => pidChecker(pid))
|
|
558
|
+
? "running"
|
|
559
|
+
: "stale";
|
|
560
|
+
}
|
|
561
|
+
if (session.status === "failed") {
|
|
562
|
+
return "failed";
|
|
563
|
+
}
|
|
564
|
+
if (session.status === "interrupted") {
|
|
565
|
+
return "interrupted";
|
|
566
|
+
}
|
|
567
|
+
if (session.workflowMode === "human") {
|
|
568
|
+
return "human_mode";
|
|
569
|
+
}
|
|
570
|
+
return "available";
|
|
571
|
+
}
|
|
572
|
+
function signalToExitCode(signal) {
|
|
573
|
+
if (signal === "SIGINT") {
|
|
574
|
+
return 130;
|
|
575
|
+
}
|
|
576
|
+
if (signal === "SIGTERM") {
|
|
577
|
+
return 143;
|
|
578
|
+
}
|
|
579
|
+
return 1;
|
|
580
|
+
}
|
|
581
|
+
function normalizeInterruptedExitSignal(exitCode) {
|
|
582
|
+
if (exitCode === 130) {
|
|
583
|
+
return "SIGINT";
|
|
584
|
+
}
|
|
585
|
+
if (exitCode === 143) {
|
|
586
|
+
return "SIGTERM";
|
|
587
|
+
}
|
|
588
|
+
return null;
|
|
589
|
+
}
|
|
590
|
+
function renderEngineLaunchPrompt(options) {
|
|
591
|
+
return [
|
|
592
|
+
"You are operating inside the MinuteWork developer-local orchestrator lane.",
|
|
593
|
+
`Read the authoritative JSON context pack at ${options.contextPath} before making MinuteWork-specific decisions.`,
|
|
594
|
+
"Use the configured MinuteWork MCP server for workspace-aware context when available.",
|
|
595
|
+
`Respect the selected workflow mode of ${options.workflowMode}.`,
|
|
596
|
+
"Treat platform and runtime state as read-only, and do not assume any platform-managed runtime provider keys for local coding.",
|
|
597
|
+
].join(" ");
|
|
598
|
+
}
|
|
599
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
|