@meego-harness/opencode-worker 0.7.0 → 0.8.0
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/dist/{chunk-MHUUIVXW.js → chunk-6QMCHYTQ.js} +43 -18
- package/dist/chunk-6QMCHYTQ.js.map +1 -0
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/package.json +54 -4
- package/dist/chunk-MHUUIVXW.js.map +0 -1
|
@@ -120,15 +120,16 @@ async function runOpenCodeWorkerSetup(dependencies, prompter, input) {
|
|
|
120
120
|
}
|
|
121
121
|
);
|
|
122
122
|
const defaultWorkspacePrompt = renderCliPrompt("cli.opencode-worker.default-workspace", void 0);
|
|
123
|
-
const
|
|
123
|
+
const defaultWorkspaceInput = await resolveTextInput(
|
|
124
124
|
input?.defaultWorkspace,
|
|
125
125
|
prompter,
|
|
126
126
|
{
|
|
127
127
|
message: defaultWorkspacePrompt.message,
|
|
128
128
|
placeholder: defaultWorkspacePrompt.placeholder,
|
|
129
|
-
validate: validateDirectory("defaultWorkspace")
|
|
129
|
+
validate: validateDirectory("defaultWorkspace", homeDir)
|
|
130
130
|
}
|
|
131
131
|
);
|
|
132
|
+
const defaultWorkspace = expandHomePath(defaultWorkspaceInput, homeDir);
|
|
132
133
|
const permissionPresetPrompt = renderCliPrompt("cli.opencode-worker.permission-preset", void 0);
|
|
133
134
|
const permissionPreset = await resolveSelectInput(
|
|
134
135
|
input?.permissionPreset,
|
|
@@ -176,7 +177,7 @@ async function runOpenCodeWorkerSetup(dependencies, prompter, input) {
|
|
|
176
177
|
validate: requiredString("agentDefault")
|
|
177
178
|
}
|
|
178
179
|
);
|
|
179
|
-
const repoMappings = input?.repoMappings ?
|
|
180
|
+
const repoMappings = input?.repoMappings ? normalizeRepoMappings(input.repoMappings, homeDir) : await promptRepoMappings(prompter, defaultWorkspace, homeDir);
|
|
180
181
|
const hasArtifactStagingRoot = input?.artifactStagingRoot !== void 0;
|
|
181
182
|
const artifactStagingRoot = input?.artifactStagingRoot?.trim();
|
|
182
183
|
const result = openCodeWorkerConfigSchema.parse({
|
|
@@ -304,9 +305,9 @@ function createClackPrompter() {
|
|
|
304
305
|
function requiredString(field) {
|
|
305
306
|
return (value) => value.trim() ? void 0 : `${field} is required`;
|
|
306
307
|
}
|
|
307
|
-
function validateDirectory(field) {
|
|
308
|
+
function validateDirectory(field, homeDir) {
|
|
308
309
|
return (value) => {
|
|
309
|
-
const normalized = value.trim();
|
|
310
|
+
const normalized = expandHomePath(value.trim(), homeDir);
|
|
310
311
|
if (!normalized) {
|
|
311
312
|
return `${field} is required`;
|
|
312
313
|
}
|
|
@@ -319,6 +320,20 @@ function validateDirectory(field) {
|
|
|
319
320
|
return void 0;
|
|
320
321
|
};
|
|
321
322
|
}
|
|
323
|
+
function expandHomePath(value, homeDir) {
|
|
324
|
+
if (value === "~") {
|
|
325
|
+
return homeDir ?? homedir();
|
|
326
|
+
}
|
|
327
|
+
if (value.startsWith("~/")) {
|
|
328
|
+
return join(homeDir ?? homedir(), value.slice(2));
|
|
329
|
+
}
|
|
330
|
+
return value;
|
|
331
|
+
}
|
|
332
|
+
function normalizeRepoMappings(repoMappings, homeDir) {
|
|
333
|
+
return Object.fromEntries(
|
|
334
|
+
Object.entries(repoMappings).map(([repo, cwd]) => [repo, expandHomePath(cwd.trim(), homeDir)])
|
|
335
|
+
);
|
|
336
|
+
}
|
|
322
337
|
function unwrapCanceledValue(value, message) {
|
|
323
338
|
if (isCancel(value)) {
|
|
324
339
|
throw new Error(message);
|
|
@@ -341,7 +356,7 @@ async function resolveSelectInput(providedValue, prompter, params) {
|
|
|
341
356
|
}
|
|
342
357
|
return await prompter.select(params);
|
|
343
358
|
}
|
|
344
|
-
async function promptRepoMappings(prompter, defaultWorkspace) {
|
|
359
|
+
async function promptRepoMappings(prompter, defaultWorkspace, homeDir) {
|
|
345
360
|
const repoMappings = {};
|
|
346
361
|
const addFirstPrompt = renderCliPrompt("cli.opencode-worker.repo-mapping.add-first", void 0);
|
|
347
362
|
let addAnotherMapping = await prompter.confirm({
|
|
@@ -362,9 +377,9 @@ async function promptRepoMappings(prompter, defaultWorkspace) {
|
|
|
362
377
|
const cwd = await prompter.text({
|
|
363
378
|
message: directoryPrompt.message,
|
|
364
379
|
placeholder: directoryPrompt.placeholder,
|
|
365
|
-
validate: validateDirectory("cwd")
|
|
380
|
+
validate: validateDirectory("cwd", homeDir)
|
|
366
381
|
});
|
|
367
|
-
repoMappings[repo.trim()] = cwd.trim();
|
|
382
|
+
repoMappings[repo.trim()] = expandHomePath(cwd.trim(), homeDir);
|
|
368
383
|
const addAnotherPrompt = renderCliPrompt("cli.opencode-worker.repo-mapping.add-another", void 0);
|
|
369
384
|
addAnotherMapping = await prompter.confirm({
|
|
370
385
|
message: addAnotherPrompt.message,
|
|
@@ -438,6 +453,7 @@ var OpenCodeCliTaskExecutor = class {
|
|
|
438
453
|
const child = this.spawnChild(command.command, command.args, {
|
|
439
454
|
cwd: request.cwd,
|
|
440
455
|
detached: command.detached,
|
|
456
|
+
...request.env ? { env: { ...process.env, ...request.env } } : {},
|
|
441
457
|
stdio: ["ignore", "pipe", "pipe"]
|
|
442
458
|
});
|
|
443
459
|
return await new Promise((resolve3, reject) => {
|
|
@@ -939,6 +955,7 @@ var OpenCodeWorkerBridge = class {
|
|
|
939
955
|
role: "manager",
|
|
940
956
|
managerGrant: request.managerGrant,
|
|
941
957
|
capabilitySummary: this.config.capabilitySummary,
|
|
958
|
+
credentialDeliveryEnabled: true,
|
|
942
959
|
initialAvailability: "available"
|
|
943
960
|
});
|
|
944
961
|
return;
|
|
@@ -947,6 +964,7 @@ var OpenCodeWorkerBridge = class {
|
|
|
947
964
|
workerId: this.config.workerId,
|
|
948
965
|
email: this.config.email,
|
|
949
966
|
capabilitySummary: this.config.capabilitySummary,
|
|
967
|
+
credentialDeliveryEnabled: true,
|
|
950
968
|
initialAvailability: "available"
|
|
951
969
|
});
|
|
952
970
|
});
|
|
@@ -967,12 +985,13 @@ var OpenCodeWorkerBridge = class {
|
|
|
967
985
|
async handleTaskMessage({
|
|
968
986
|
task,
|
|
969
987
|
message,
|
|
970
|
-
controller
|
|
988
|
+
controller,
|
|
989
|
+
credentials
|
|
971
990
|
}) {
|
|
972
991
|
this.supersedeActiveTaskExecution(task.id);
|
|
973
992
|
const previous = this.contextQueues.get(task.contextId) ?? Promise.resolve();
|
|
974
993
|
const current = previous.catch(() => void 0).then(async () => {
|
|
975
|
-
await this.processTaskMessage({ task, message, controller });
|
|
994
|
+
await this.processTaskMessage({ task, message, controller, credentials });
|
|
976
995
|
});
|
|
977
996
|
this.contextQueues.set(task.contextId, current);
|
|
978
997
|
try {
|
|
@@ -986,7 +1005,8 @@ var OpenCodeWorkerBridge = class {
|
|
|
986
1005
|
async processTaskMessage({
|
|
987
1006
|
task,
|
|
988
1007
|
message,
|
|
989
|
-
controller
|
|
1008
|
+
controller,
|
|
1009
|
+
credentials
|
|
990
1010
|
}) {
|
|
991
1011
|
if (this.activeTasks.has(task.id)) {
|
|
992
1012
|
this.logger.warn(`Ignoring duplicate active task delivery for ${task.id}`);
|
|
@@ -1065,7 +1085,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
|
|
|
1065
1085
|
finalPrompt,
|
|
1066
1086
|
currentBinding,
|
|
1067
1087
|
this.config,
|
|
1068
|
-
execution
|
|
1088
|
+
execution,
|
|
1089
|
+
credentials?.env
|
|
1069
1090
|
));
|
|
1070
1091
|
if (this.isTaskCanceled(task.id)) {
|
|
1071
1092
|
return;
|
|
@@ -1102,7 +1123,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
|
|
|
1102
1123
|
structuredProtocol,
|
|
1103
1124
|
artifactStagingDir,
|
|
1104
1125
|
result.text,
|
|
1105
|
-
execution
|
|
1126
|
+
execution,
|
|
1127
|
+
credentials?.env
|
|
1106
1128
|
) : {
|
|
1107
1129
|
status: "completed",
|
|
1108
1130
|
summary: result.text
|
|
@@ -1328,7 +1350,7 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
|
|
|
1328
1350
|
isTaskCanceled(taskId) {
|
|
1329
1351
|
return this.activeTasks.get(taskId)?.canceled ?? this.pendingCanceledTaskIds.has(taskId);
|
|
1330
1352
|
}
|
|
1331
|
-
async resolveStructuredProjectNodeResult(task, binding, protocol, artifactStagingDir, firstText, execution) {
|
|
1353
|
+
async resolveStructuredProjectNodeResult(task, binding, protocol, artifactStagingDir, firstText, execution, env) {
|
|
1332
1354
|
const firstParsed = parseProjectNodeResult(protocol, firstText);
|
|
1333
1355
|
if (firstParsed) {
|
|
1334
1356
|
return firstParsed;
|
|
@@ -1338,7 +1360,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
|
|
|
1338
1360
|
buildStructuredRetryPrompt(protocol, artifactStagingDir),
|
|
1339
1361
|
binding,
|
|
1340
1362
|
this.config,
|
|
1341
|
-
execution
|
|
1363
|
+
execution,
|
|
1364
|
+
env
|
|
1342
1365
|
));
|
|
1343
1366
|
if (this.isTaskCanceled(task.id)) {
|
|
1344
1367
|
throw new Error("task canceled before structured retry completed");
|
|
@@ -1418,6 +1441,7 @@ function buildWorkerLoginPayload(config) {
|
|
|
1418
1441
|
workerId: config.workerId,
|
|
1419
1442
|
email: config.email,
|
|
1420
1443
|
capabilitySummary: config.capabilitySummary,
|
|
1444
|
+
credentialDeliveryEnabled: true,
|
|
1421
1445
|
initialAvailability: "available"
|
|
1422
1446
|
};
|
|
1423
1447
|
}
|
|
@@ -1446,7 +1470,7 @@ function buildOpenCodeFailureMetadata(binding, requestedRepo, config, error) {
|
|
|
1446
1470
|
...failureReason ? { "openCode.failureReason": failureReason } : {}
|
|
1447
1471
|
};
|
|
1448
1472
|
}
|
|
1449
|
-
function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execution) {
|
|
1473
|
+
function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execution, env) {
|
|
1450
1474
|
return {
|
|
1451
1475
|
taskId: task.id,
|
|
1452
1476
|
contextId: task.contextId,
|
|
@@ -1457,7 +1481,8 @@ function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execut
|
|
|
1457
1481
|
variant: binding.variant,
|
|
1458
1482
|
agent: binding.agent,
|
|
1459
1483
|
permissionPreset: config.permissionPreset,
|
|
1460
|
-
abortSignal: execution.abortController.signal
|
|
1484
|
+
abortSignal: execution.abortController.signal,
|
|
1485
|
+
...env ? { env } : {}
|
|
1461
1486
|
};
|
|
1462
1487
|
}
|
|
1463
1488
|
function appendArtifactStagingInstructions(prompt, artifactStagingDir) {
|
|
@@ -1820,4 +1845,4 @@ export {
|
|
|
1820
1845
|
isAbortError,
|
|
1821
1846
|
OpenCodeWorkerBridge
|
|
1822
1847
|
};
|
|
1823
|
-
//# sourceMappingURL=chunk-
|
|
1848
|
+
//# sourceMappingURL=chunk-6QMCHYTQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/config.ts","../src/parts.ts","../src/runtime.ts","../src/bridge.ts","../src/artifacts.ts"],"sourcesContent":["export const OPENCODE_WORKER_WORKING_TEXT = 'OpenCode CLI is working'\nexport const OPENCODE_WORKER_CONFIG_DIR = '.meego-harness/opencode-worker'\n","import type {\n OpenCodeWorkerConfig,\n OpenCodeWorkerDoctorReport,\n OpenCodeWorkerListItem,\n OpenCodeWorkerPrompter,\n OpenCodeWorkerSetupInput,\n OpenCodeWorkerSetupResult,\n OpenCodeWorkerState,\n ResolveStoragePathsOptions,\n RunOpenCodeWorkerSetupDependencies,\n} from './types'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join } from 'node:path'\nimport { confirm, isCancel, select, text } from '@clack/prompts'\nimport { renderCliPrompt } from '@meego-harness/prompt-registry'\nimport { resolveDefaultWorkerDeviceIdentityFile } from '@meego-harness/worker-sdk'\nimport { z } from 'zod'\nimport { OPENCODE_WORKER_CONFIG_DIR } from './constants'\n\nconst openCodeModelSelectionSchema = z.string().trim().min(1, 'modelSelection is required')\nconst openCodeVariantSelectionSchema = z.string().trim().min(1, 'variantDefault is required')\nconst openCodeAgentSelectionSchema = z.string().trim().min(1, 'agentDefault is required')\n\nconst openCodeWorkerConfigSchema = z.object({\n serverUrl: z.string().trim().min(1, 'serverUrl is required'),\n email: z.string().trim().min(1, 'email is required'),\n workerId: z.string().trim().min(1, 'workerId is required'),\n capabilitySummary: z.string().trim().min(1, 'capabilitySummary is required'),\n defaultWorkspace: z.string().trim().min(1, 'defaultWorkspace is required'),\n artifactStagingRoot: z.string().trim().min(1, 'artifactStagingRoot is required').optional(),\n repoMappings: z.record(z.string(), z.string()),\n enabled: z.boolean().default(true),\n permissionPreset: z.enum(['safe', 'default', 'full-access']),\n modelSelection: openCodeModelSelectionSchema,\n variantDefault: openCodeVariantSelectionSchema,\n agentDefault: openCodeAgentSelectionSchema,\n openCodeShell: z.boolean().default(false),\n})\n\nconst openCodeWorkerStateSchema = z.object({\n contexts: z.array(\n z.object({\n contextId: z.string(),\n repo: z.string().optional(),\n cwd: z.string(),\n sessionId: z.string().optional(),\n variant: z.string().optional(),\n agent: z.string().optional(),\n planMode: z.boolean(),\n }),\n ),\n})\n\nexport function resolveOpenCodeWorkerStorageDir(options: ResolveStoragePathsOptions = {}) {\n return join(options.homeDir ?? homedir(), OPENCODE_WORKER_CONFIG_DIR)\n}\n\nexport function resolveOpenCodeWorkerConfigFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveOpenCodeWorkerStorageDir(options), `${workerId}.json`)\n}\n\nexport function resolveOpenCodeWorkerStateFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveOpenCodeWorkerStorageDir(options), `${workerId}.state.json`)\n}\n\nexport function loadOpenCodeWorkerConfig(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n): OpenCodeWorkerConfig {\n const file = resolveOpenCodeWorkerConfigFile(workerId, options)\n if (!existsSync(file)) {\n throw new Error(`OpenCode worker config not found for ${workerId}: ${file}`)\n }\n\n return openCodeWorkerConfigSchema.parse(JSON.parse(readFileSync(file, 'utf8')))\n}\n\nexport function writeOpenCodeWorkerConfig(\n config: OpenCodeWorkerConfig,\n options: ResolveStoragePathsOptions = {},\n) {\n mkdirSync(resolveOpenCodeWorkerStorageDir(options), { recursive: true })\n writeFileSync(\n resolveOpenCodeWorkerConfigFile(config.workerId, options),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n\nexport function loadOpenCodeWorkerState(stateFile: string): OpenCodeWorkerState {\n if (!existsSync(stateFile)) {\n return { contexts: [] }\n }\n\n return openCodeWorkerStateSchema.parse(JSON.parse(readFileSync(stateFile, 'utf8')))\n}\n\nexport function writeOpenCodeWorkerState(stateFile: string, state: OpenCodeWorkerState) {\n mkdirSync(dirname(stateFile), { recursive: true })\n writeFileSync(stateFile, `${JSON.stringify(state, null, 2)}\\n`, 'utf8')\n}\n\nexport async function runOpenCodeWorkerSetup(\n dependencies: RunOpenCodeWorkerSetupDependencies,\n prompter: OpenCodeWorkerPrompter,\n input?: OpenCodeWorkerSetupInput,\n): Promise<OpenCodeWorkerSetupResult> {\n const homeDir = dependencies.homeDir\n const serverUrlPrompt = renderCliPrompt('cli.opencode-worker.server-url', undefined)\n const serverUrl = await resolveTextInput(\n input?.serverUrl,\n prompter,\n {\n message: serverUrlPrompt.message,\n placeholder: serverUrlPrompt.placeholder,\n validate: requiredString('serverUrl'),\n },\n )\n const emailPrompt = renderCliPrompt('cli.opencode-worker.email', undefined)\n const email = await resolveTextInput(\n input?.email,\n prompter,\n {\n message: emailPrompt.message,\n placeholder: emailPrompt.placeholder,\n validate: requiredString('email'),\n },\n )\n const workerIdPrompt = renderCliPrompt('cli.opencode-worker.worker-id', undefined)\n const workerId = await resolveTextInput(\n input?.workerId,\n prompter,\n {\n message: workerIdPrompt.message,\n placeholder: workerIdPrompt.placeholder,\n validate: requiredString('workerId'),\n },\n )\n const capabilitySummaryPrompt = renderCliPrompt('cli.opencode-worker.capability-summary', undefined)\n const capabilitySummary = await resolveTextInput(\n input?.capabilitySummary,\n prompter,\n {\n message: capabilitySummaryPrompt.message,\n placeholder: capabilitySummaryPrompt.placeholder,\n validate: requiredString('capabilitySummary'),\n },\n )\n const defaultWorkspacePrompt = renderCliPrompt('cli.opencode-worker.default-workspace', undefined)\n const defaultWorkspaceInput = await resolveTextInput(\n input?.defaultWorkspace,\n prompter,\n {\n message: defaultWorkspacePrompt.message,\n placeholder: defaultWorkspacePrompt.placeholder,\n validate: validateDirectory('defaultWorkspace', homeDir),\n },\n )\n const defaultWorkspace = expandHomePath(defaultWorkspaceInput, homeDir)\n const permissionPresetPrompt = renderCliPrompt('cli.opencode-worker.permission-preset', undefined)\n const permissionPreset = await resolveSelectInput(\n input?.permissionPreset,\n prompter,\n {\n message: permissionPresetPrompt.message,\n options: [\n { value: 'safe', label: 'safe' },\n { value: 'default', label: 'default' },\n { value: 'full-access', label: 'full-access' },\n ],\n initialValue: 'default',\n },\n )\n const modelSelectionPrompt = renderCliPrompt('cli.opencode-worker.model-selection', undefined)\n const modelSelection = await resolveTextInput(\n input?.modelSelection,\n prompter,\n {\n message: modelSelectionPrompt.message,\n placeholder: modelSelectionPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('modelSelection'),\n },\n )\n const variantPrompt = renderCliPrompt('cli.opencode-worker.variant', undefined)\n const variantDefault = await resolveTextInput(\n input?.variantDefault,\n prompter,\n {\n message: variantPrompt.message,\n placeholder: variantPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('variantDefault'),\n },\n )\n const agentPrompt = renderCliPrompt('cli.opencode-worker.agent', undefined)\n const agentDefault = await resolveTextInput(\n input?.agentDefault,\n prompter,\n {\n message: agentPrompt.message,\n placeholder: agentPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('agentDefault'),\n },\n )\n\n const repoMappings = input?.repoMappings\n ? normalizeRepoMappings(input.repoMappings, homeDir)\n : await promptRepoMappings(prompter, defaultWorkspace, homeDir)\n const hasArtifactStagingRoot = input?.artifactStagingRoot !== undefined\n const artifactStagingRoot = input?.artifactStagingRoot?.trim()\n\n const result = openCodeWorkerConfigSchema.parse({\n serverUrl: serverUrl.trim(),\n email: email.trim(),\n workerId: workerId.trim(),\n capabilitySummary: capabilitySummary.trim(),\n defaultWorkspace: defaultWorkspace.trim(),\n ...(hasArtifactStagingRoot ? { artifactStagingRoot } : {}),\n repoMappings,\n enabled: input?.enabled ?? true,\n permissionPreset,\n modelSelection,\n variantDefault,\n agentDefault,\n openCodeShell: input?.openCodeShell ?? false,\n })\n\n writeOpenCodeWorkerConfig(result, { homeDir })\n dependencies.logger.info(\n `Configured OpenCode worker ${result.workerId} at ${resolveOpenCodeWorkerConfigFile(result.workerId, { homeDir })}`,\n )\n\n return result\n}\n\nexport function listOpenCodeWorkerConfigs(\n options: ResolveStoragePathsOptions = {},\n): OpenCodeWorkerListItem[] {\n const storageDir = resolveOpenCodeWorkerStorageDir(options)\n if (!existsSync(storageDir)) {\n return []\n }\n\n return readdirSync(storageDir)\n .filter(file => file.endsWith('.json') && !file.endsWith('.state.json'))\n .map((file) => {\n const workerId = file.replace(/\\.json$/, '')\n const config = loadOpenCodeWorkerConfig(workerId, options)\n\n return {\n ...config,\n configFile: resolveOpenCodeWorkerConfigFile(workerId, options),\n stateFile: resolveOpenCodeWorkerStateFile(workerId, options),\n }\n })\n .sort((left, right) => left.workerId.localeCompare(right.workerId))\n}\n\nexport function getOpenCodeWorkerDoctorReport(\n options: ResolveStoragePathsOptions = {},\n dependencies: {\n assertOpenCodeCliRuntimeContract?: (\n openCodeBin?: string,\n options?: { useShell?: boolean },\n ) => void\n } = {},\n): OpenCodeWorkerDoctorReport {\n return {\n workers: listOpenCodeWorkerConfigs(options).map((config) => {\n const runtimeErrors: string[] = []\n try {\n dependencies.assertOpenCodeCliRuntimeContract?.('opencode', {\n useShell: config.openCodeShell === true,\n })\n }\n catch (error) {\n runtimeErrors.push(error instanceof Error ? error.message : 'OpenCode CLI is unavailable')\n }\n\n return {\n ...config,\n configStatus: 'ok' as const,\n runtimeStatus: runtimeErrors.length > 0 ? 'error' as const : 'ok' as const,\n errors: runtimeErrors,\n }\n }),\n }\n}\n\nexport function setOpenCodeWorkerEnabled(\n workerId: string,\n enabled: boolean,\n options: ResolveStoragePathsOptions = {},\n) {\n const config = loadOpenCodeWorkerConfig(workerId, options)\n writeOpenCodeWorkerConfig(\n {\n ...config,\n enabled,\n },\n options,\n )\n}\n\nexport function uninstallOpenCodeWorker(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n const configFile = resolveOpenCodeWorkerConfigFile(workerId, options)\n const stateFile = resolveOpenCodeWorkerStateFile(workerId, options)\n const config = existsSync(configFile)\n ? loadOpenCodeWorkerConfig(workerId, options)\n : undefined\n const credentialFile = config\n ? resolveDefaultWorkerDeviceIdentityFile(\n config.serverUrl,\n config.workerId,\n config.email,\n options.homeDir,\n )\n : undefined\n\n const removedConfig = removeFileIfPresent(configFile)\n const removedState = removeFileIfPresent(stateFile)\n const removedCredential = credentialFile\n ? removeFileIfPresent(credentialFile)\n : false\n\n return {\n configFile,\n stateFile,\n credentialFile,\n removedConfig,\n removedState,\n removedCredential,\n }\n}\n\nexport function createClackPrompter(): OpenCodeWorkerPrompter {\n return {\n async text(params) {\n const value = await text({\n message: params.message,\n placeholder: params.placeholder,\n defaultValue: params.initialValue,\n validate: params.validate\n ? input => params.validate?.(input ?? '')\n : undefined,\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as string\n },\n async select(params) {\n const value = await select({\n message: params.message,\n initialValue: params.initialValue,\n options: params.options.map(option => ({\n value: option.value,\n label: option.label,\n })),\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as string\n },\n async confirm(params) {\n const value = await confirm({\n message: params.message,\n initialValue: params.initialValue,\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as boolean\n },\n }\n}\n\nfunction requiredString(field: string) {\n return (value: string) => (value.trim() ? undefined : `${field} is required`)\n}\n\nfunction validateDirectory(field: string, homeDir?: string) {\n return (value: string) => {\n const normalized = expandHomePath(value.trim(), homeDir)\n if (!normalized) {\n return `${field} is required`\n }\n if (!isAbsolute(normalized)) {\n return `${field} must be an absolute path`\n }\n if (!existsSync(normalized)) {\n return `${field} does not exist`\n }\n return undefined\n }\n}\n\nfunction expandHomePath(value: string, homeDir: string | undefined) {\n if (value === '~') {\n return homeDir ?? homedir()\n }\n if (value.startsWith('~/')) {\n return join(homeDir ?? homedir(), value.slice(2))\n }\n return value\n}\n\nfunction normalizeRepoMappings(repoMappings: Record<string, string>, homeDir: string | undefined) {\n return Object.fromEntries(\n Object.entries(repoMappings).map(([repo, cwd]) => [repo, expandHomePath(cwd.trim(), homeDir)]),\n )\n}\n\nfunction unwrapCanceledValue<T>(value: T, message: string) {\n if (isCancel(value)) {\n throw new Error(message)\n }\n return value\n}\n\nasync function resolveTextInput(\n providedValue: string | undefined,\n prompter: OpenCodeWorkerPrompter,\n params: {\n message: string\n placeholder?: string\n initialValue?: string\n validate?: (value: string) => string | undefined\n },\n) {\n if (providedValue !== undefined) {\n const error = params.validate?.(providedValue)\n if (error) {\n throw new Error(error)\n }\n return providedValue\n }\n\n return await prompter.text(params)\n}\n\nasync function resolveSelectInput(\n providedValue: string | undefined,\n prompter: OpenCodeWorkerPrompter,\n params: {\n message: string\n options: Array<{ value: string, label: string }>\n initialValue?: string\n },\n) {\n if (providedValue !== undefined) {\n return providedValue\n }\n\n return await prompter.select(params)\n}\n\nasync function promptRepoMappings(\n prompter: OpenCodeWorkerPrompter,\n defaultWorkspace: string,\n homeDir: string | undefined,\n) {\n const repoMappings: Record<string, string> = {}\n const addFirstPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.add-first', undefined)\n let addAnotherMapping = await prompter.confirm({\n message: addFirstPrompt.message,\n initialValue: false,\n })\n\n while (addAnotherMapping) {\n const repoNamePrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.repo-name', undefined)\n const repo = await prompter.text({\n message: repoNamePrompt.message,\n placeholder: repoNamePrompt.placeholder,\n validate: requiredString('repo'),\n })\n const directoryPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.directory', {\n repo,\n defaultWorkspace,\n })\n const cwd = await prompter.text({\n message: directoryPrompt.message,\n placeholder: directoryPrompt.placeholder,\n validate: validateDirectory('cwd', homeDir),\n })\n repoMappings[repo.trim()] = expandHomePath(cwd.trim(), homeDir)\n const addAnotherPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.add-another', undefined)\n addAnotherMapping = await prompter.confirm({\n message: addAnotherPrompt.message,\n initialValue: false,\n })\n }\n\n return repoMappings\n}\n\nfunction removeFileIfPresent(file: string) {\n if (!existsSync(file)) {\n return false\n }\n rmSync(file, { force: true })\n return true\n}\n","import type { Part } from '@meego-harness/worker-sdk'\n\nexport function stringifyTaskMessageParts(parts: Part[]) {\n return parts\n .map((part) => {\n if (part.type === 'text') {\n return part.text\n }\n\n if (part.type === 'data') {\n return [\n `[data${part.mimeType ? ` mimeType=${part.mimeType}` : ''}]`,\n JSON.stringify(part.data, null, 2),\n '[/data]',\n ].join('\\n')\n }\n\n return [\n '[file-ref]',\n `uri: ${part.uri}`,\n part.name ? `name: ${part.name}` : undefined,\n part.mimeType ? `mimeType: ${part.mimeType}` : undefined,\n '[/file-ref]',\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n .trim()\n}\n","import type { ChildProcess } from 'node:child_process'\nimport type {\n OpenCodeCliTaskExecutionRequest,\n OpenCodeCliTaskExecutionResult,\n OpenCodeCliTaskExecutorConfig,\n PermissionPreset,\n} from './types'\nimport { Buffer } from 'node:buffer'\nimport { spawn, spawnSync } from 'node:child_process'\nimport { mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport process from 'node:process'\nimport { renderTextLlmPrompt } from '@meego-harness/prompt-registry'\n\ninterface OpenCodeShellOptions {\n useShell?: boolean\n shell?: string\n}\n\ninterface OpenCodeSpawnCommand {\n command: string\n args: string[]\n detached: boolean\n killProcessGroup: boolean\n}\n\nconst OPENCODE_PREFLIGHT_TIMEOUT_MS = 10_000\nconst OPENCODE_CONTRACT_TIMEOUT_MS = 30_000\nconst OPENCODE_MAX_BUFFER = 1024 * 1024\n\nexport class OpenCodeCliTaskExecutor {\n private readonly openCodeBin: string\n private readonly useShell: boolean\n private readonly shell: string\n private readonly spawnChild: NonNullable<OpenCodeCliTaskExecutorConfig['spawn']>\n\n constructor(config: OpenCodeCliTaskExecutorConfig = {}) {\n this.openCodeBin = config.openCodeBin ?? 'opencode'\n this.useShell = config.useShell ?? false\n this.shell = config.shell ?? process.env.SHELL ?? 'sh'\n this.spawnChild = config.spawn ?? spawn\n }\n\n async runTurn(\n request: OpenCodeCliTaskExecutionRequest,\n ): Promise<OpenCodeCliTaskExecutionResult> {\n if (request.abortSignal.aborted) {\n throw createAbortError()\n }\n\n const args = buildOpenCodeArgs(request)\n const command = buildOpenCodeSpawnCommand(this.openCodeBin, args, {\n useShell: this.useShell,\n shell: this.shell,\n })\n const child = this.spawnChild(command.command, command.args, {\n cwd: request.cwd,\n detached: command.detached,\n ...(request.env ? { env: { ...process.env, ...request.env } } : {}),\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n return await new Promise<OpenCodeCliTaskExecutionResult>((resolve, reject) => {\n let settled = false\n const stdoutChunks: Buffer[] = []\n const stderrChunks: Buffer[] = []\n\n function settle(callback: () => void) {\n if (settled) {\n return\n }\n settled = true\n request.abortSignal.removeEventListener('abort', onAbort)\n callback()\n }\n\n function onAbort() {\n killChildProcess(child, {\n killProcessGroup: command.killProcessGroup,\n })\n settle(() => reject(createAbortError()))\n }\n\n request.abortSignal.addEventListener('abort', onAbort, { once: true })\n\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n })\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n })\n\n child.once('error', (error) => {\n settle(() => reject(error))\n })\n\n child.once('close', (code, signal) => {\n if (request.abortSignal.aborted) {\n settle(() => reject(createAbortError()))\n return\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf8')\n const stderr = Buffer.concat(stderrChunks).toString('utf8')\n if (code !== 0) {\n settle(() =>\n reject(new Error(buildOpenCodeExitError({\n code,\n signal,\n stderr,\n stdout,\n }))),\n )\n return\n }\n\n try {\n const result = parseOpenCodeJsonResult(stdout, request.contextId)\n settle(() => resolve(result))\n }\n catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error('Failed to parse OpenCode output')))\n }\n })\n })\n }\n}\n\nexport function assertOpenCodeCliAvailable(\n openCodeBin = 'opencode',\n run = spawnSync,\n options: OpenCodeShellOptions = {},\n) {\n for (const args of [\n ['--help'],\n ['run', '--help'],\n ]) {\n const command = buildOpenCodeSpawnCommand(openCodeBin, args, options)\n const result = run(command.command, command.args, {\n ...(command.detached ? { detached: true } : {}),\n killSignal: 'SIGTERM',\n stdio: 'ignore',\n timeout: OPENCODE_PREFLIGHT_TIMEOUT_MS,\n })\n\n if (result.error) {\n throw new Error(`Unable to execute ${openCodeBin}: ${result.error.message}`)\n }\n if (typeof result.status === 'number' && result.status !== 0) {\n throw new Error(\n `OpenCode CLI preflight failed for \"${[openCodeBin, ...args].join(' ')}\" with exit code ${String(result.status)}`,\n )\n }\n }\n}\n\nexport function assertOpenCodeCliRuntimeContract(\n openCodeBin = 'opencode',\n dependencies: {\n run?: typeof spawnSync\n createTempDir?: () => string\n useShell?: boolean\n shell?: string\n } = {},\n) {\n const run = dependencies.run ?? spawnSync\n const createTempDir\n = dependencies.createTempDir\n ?? (() => mkdtempSync(join(tmpdir(), 'meego-opencode-worker-doctor-')))\n const tempDir = createTempDir()\n const prompt = renderTextLlmPrompt('worker.opencode.runtime-contract-check', undefined).text\n const executionRequest = {\n taskId: 'doctor-contract',\n contextId: 'doctor-contract',\n cwd: tempDir,\n prompt,\n variant: 'low',\n permissionPreset: 'safe' as const,\n abortSignal: new AbortController().signal,\n }\n\n const firstResult = runOpenCodeContractCommand(\n run,\n openCodeBin,\n buildOpenCodeArgs(executionRequest),\n tempDir,\n dependencies,\n )\n const firstParsed = parseOpenCodeJsonResult(firstResult.stdout, 'doctor-contract')\n\n const resumeResult = runOpenCodeContractCommand(\n run,\n openCodeBin,\n buildOpenCodeArgs({\n ...executionRequest,\n sessionId: firstParsed.sessionId,\n }),\n tempDir,\n dependencies,\n )\n parseOpenCodeJsonResult(resumeResult.stdout, 'doctor-contract')\n}\n\nexport function buildOpenCodeArgs(\n request: OpenCodeCliTaskExecutionRequest,\n) {\n const args = [\n 'run',\n '--format',\n 'json',\n ]\n\n if (request.sessionId) {\n args.push('--session', request.sessionId)\n }\n\n if (request.model) {\n args.push('--model', request.model)\n }\n\n if (request.variant) {\n args.push('--variant', request.variant)\n }\n\n if (request.agent) {\n args.push('--agent', request.agent)\n }\n\n if (shouldSkipPermissionsForPreset(request.permissionPreset)) {\n args.push('--dangerously-skip-permissions')\n }\n\n args.push(request.prompt)\n return args\n}\n\nexport function shouldSkipPermissionsForPreset(preset: PermissionPreset) {\n return preset === 'full-access'\n}\n\nexport function createAbortError() {\n const error = new Error('OpenCode run aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown) {\n return (\n (error instanceof Error && error.name === 'AbortError')\n || (error instanceof Error && /abort/i.test(error.message))\n )\n}\n\nfunction parseOpenCodeJsonResult(\n stdout: string | Buffer | null | undefined,\n contextId: string,\n): OpenCodeCliTaskExecutionResult {\n const text = Buffer.isBuffer(stdout)\n ? stdout.toString('utf8')\n : stdout ?? ''\n const trimmed = text.trim()\n if (!trimmed) {\n throw new Error(`OpenCode did not emit JSON output for context ${contextId}`)\n }\n\n const events = trimmed\n .split(/\\r?\\n/u)\n .map(line => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as {\n type?: string\n sessionID?: unknown\n part?: {\n type?: unknown\n text?: unknown\n }\n error?: unknown\n }\n }\n catch (error) {\n throw new Error(\n `OpenCode emitted invalid JSONL for context ${contextId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n })\n\n const errorEvent = events.find(event => event.type === 'error')\n if (errorEvent) {\n throw new Error(`OpenCode returned an error for context ${contextId}: ${summarizeOpenCodeError(errorEvent.error)}`)\n }\n\n const sessionId = events\n .map(event => typeof event.sessionID === 'string' ? event.sessionID.trim() : '')\n .find(value => value.length > 0)\n const textParts = events\n .filter(event => event.type === 'text' && event.part?.type === 'text')\n .map(event => typeof event.part?.text === 'string' ? event.part.text.trim() : '')\n .filter(Boolean)\n if (!sessionId || textParts.length === 0) {\n throw new Error(`OpenCode returned an invalid result for context ${contextId}`)\n }\n\n return {\n text: textParts.join('\\n\\n').trim(),\n sessionId,\n }\n}\n\nfunction summarizeOpenCodeError(error: unknown) {\n if (!error || typeof error !== 'object') {\n return String(error ?? 'unknown')\n }\n\n const data = (error as { data?: unknown }).data\n if (data && typeof data === 'object' && typeof (data as { message?: unknown }).message === 'string') {\n return (data as { message: string }).message\n }\n\n if (typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n\n if (typeof (error as { name?: unknown }).name === 'string') {\n return (error as { name: string }).name\n }\n\n return 'unknown'\n}\n\nfunction buildOpenCodeSpawnCommand(\n openCodeBin: string,\n args: string[],\n options: OpenCodeShellOptions,\n): OpenCodeSpawnCommand {\n if (!options.useShell) {\n return {\n command: openCodeBin,\n args,\n detached: false,\n killProcessGroup: false,\n }\n }\n\n return {\n command: options.shell ?? process.env.SHELL ?? 'sh',\n args: ['-ic', buildShellCommand(openCodeBin, args)],\n detached: true,\n killProcessGroup: true,\n }\n}\n\nfunction buildShellCommand(command: string, args: string[]) {\n return [command, ...args.map(quoteShellArg)].join(' ')\n}\n\nfunction quoteShellArg(value: string) {\n if (value.length === 0) {\n return '\\'\\''\n }\n\n return `'${value.replaceAll('\\'', '\\'\\\\\\'\\'')}'`\n}\n\nfunction killChildProcess(\n child: ChildProcess,\n options: { killProcessGroup: boolean },\n) {\n if (options.killProcessGroup && typeof child.pid === 'number') {\n try {\n process.kill(-child.pid, 'SIGTERM')\n return\n }\n catch {\n child.kill('SIGTERM')\n return\n }\n }\n\n child.kill('SIGTERM')\n}\n\nfunction runOpenCodeContractCommand(\n run: typeof spawnSync,\n openCodeBin: string,\n args: string[],\n cwd: string,\n options: OpenCodeShellOptions = {},\n) {\n const command = buildOpenCodeSpawnCommand(openCodeBin, args, options)\n const result = run(command.command, command.args, {\n ...(command.detached ? { detached: true } : {}),\n cwd,\n encoding: 'utf8',\n maxBuffer: OPENCODE_MAX_BUFFER,\n timeout: OPENCODE_CONTRACT_TIMEOUT_MS,\n })\n\n if (result.error) {\n throw new Error(`Unable to execute ${openCodeBin}: ${result.error.message}`)\n }\n if (typeof result.status === 'number' && result.status !== 0) {\n throw new Error(buildOpenCodeExitError({\n code: result.status,\n signal: result.signal,\n stderr: stringifyOutput(result.stderr),\n stdout: stringifyOutput(result.stdout),\n }))\n }\n\n return result\n}\n\nfunction buildOpenCodeExitError(params: {\n code: number | null\n signal: NodeJS.Signals | number | null\n stderr: string\n stdout: string\n}) {\n const base = `OpenCode exited with code ${params.code}${params.signal ? ` (${params.signal})` : ''}`\n const stderr = summarizeOutput(params.stderr)\n if (stderr) {\n return `${base}; stderr=${stderr}`\n }\n const stdout = summarizeOutput(params.stdout)\n if (stdout) {\n return `${base}; stdout=${stdout}`\n }\n return base\n}\n\nfunction summarizeOutput(value: string) {\n return value\n .split(/\\r?\\n/u)\n .map(line => line.trim())\n .filter(Boolean)\n .slice(-5)\n .join(' | ')\n}\n\nfunction stringifyOutput(value: string | Buffer | null | undefined) {\n if (typeof value === 'string') {\n return value\n }\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8')\n }\n return ''\n}\n","import type { TaskMessageContext } from '@meego-harness/worker-sdk'\nimport type { ProjectNodeArtifactManifest } from './artifacts'\nimport type {\n OpenCodeCliTaskExecutionRequest,\n OpenCodeCliTaskExecutionResult,\n OpenCodeWorkerBridgeConfig,\n OpenCodeWorkerBridgeDependencies,\n OpenCodeWorkerContextBinding,\n} from './types'\nimport { existsSync, mkdirSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport {\n parseManagerRunResult,\n} from '@meego-harness/manager-contract'\nimport { renderTextLlmPrompt, renderTextPrompt } from '@meego-harness/prompt-registry'\nimport { WorkerClientSDK } from '@meego-harness/worker-sdk'\nimport {\n cleanupStagedArtifact,\n prepareArtifactStagingDir,\n readStagedArtifact,\n resolveTaskArtifactStagingDir,\n StagedArtifactValidationError,\n validateArtifactManifest,\n} from './artifacts'\nimport { loadOpenCodeWorkerState, writeOpenCodeWorkerState } from './config'\nimport {\n OPENCODE_WORKER_WORKING_TEXT,\n} from './constants'\nimport { stringifyTaskMessageParts } from './parts'\nimport { createAbortError, isAbortError } from './runtime'\n\ninterface ActiveTaskExecution {\n abortController: AbortController\n canceled: boolean\n supersededByMessage: boolean\n}\n\ninterface ParsedResponseOption {\n value: string\n label: string\n responseText: string\n description?: string\n}\n\ninterface ParsedProjectNodeChildWorkItem {\n stableKey: string\n name: string\n description?: string\n}\n\ntype ParsedProjectNodeResult\n = | {\n status: 'completed'\n summary: string\n artifacts?: ProjectNodeArtifactManifest[]\n writes?: ProjectNodeWrite[]\n childWorkItems?: ParsedProjectNodeChildWorkItem[]\n }\n | {\n status: 'input_required'\n summary: string\n question: string\n reasonType?: ProjectNodeReasonType\n options?: ParsedResponseOption[]\n }\n\ntype ProjectNodeReasonType\n = | 'guidance_missing'\n | 'guidance_conflict'\n | 'project_context_missing'\n | 'project_context_conflict'\n | 'business_fact_missing'\n | 'permission_missing'\n | 'external_dependency'\n | 'unknown'\n\ntype ProjectNodeWrite = ProjectNodeSetFieldWrite | ProjectNodeUploadAttachmentWrite\n\ninterface ProjectNodeSetFieldWrite {\n kind: 'set-field'\n fieldKey: string\n value: unknown\n reason?: string\n}\n\ninterface ProjectNodeUploadAttachmentWrite {\n kind: 'upload-attachment'\n fieldKey: string\n artifactId: string\n reason?: string\n}\n\ntype MinimalTaskMessageContext = Pick<TaskMessageContext, 'credentials' | 'controller' | 'message' | 'task'>\n\nexport class OpenCodeWorkerBridge {\n private readonly config: OpenCodeWorkerBridgeConfig\n private readonly executor: OpenCodeWorkerBridgeDependencies['executor']\n private readonly logger: OpenCodeWorkerBridgeDependencies['logger']\n private readonly client: WorkerClientSDK\n private readonly activeTasks = new Map<string, ActiveTaskExecution>()\n private readonly pendingCanceledTaskIds = new Set<string>()\n private readonly bindings = new Map<string, OpenCodeWorkerContextBinding>()\n private readonly contextQueues = new Map<string, Promise<void>>()\n private readonly stateFile: string\n\n constructor(\n config: OpenCodeWorkerBridgeConfig,\n dependencies: OpenCodeWorkerBridgeDependencies,\n ) {\n this.config = config\n this.executor = dependencies.executor\n this.logger = dependencies.logger\n this.client\n = dependencies.client\n ?? new WorkerClientSDK({\n serverUrl: config.serverUrl,\n reconnectBaseDelayMs: config.reconnectBaseDelayMs,\n reconnectMaxDelayMs: config.reconnectMaxDelayMs,\n })\n this.stateFile = config.stateFile ?? join(process.cwd(), `${config.workerId}.state.json`)\n for (const binding of loadOpenCodeWorkerState(this.stateFile).contexts) {\n this.bindings.set(binding.contextId, binding)\n }\n }\n\n async start(): Promise<this> {\n this.client.onMessage(async (context) => {\n await this.handleTaskMessage(context)\n })\n this.client.onCancel(async ({ taskId }) => {\n await this.handleTaskCancel(taskId)\n })\n this.client.onRoleChange(async (request) => {\n if (request.type === 'promote-to-manager') {\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n role: 'manager',\n managerGrant: request.managerGrant,\n capabilitySummary: this.config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available',\n })\n return\n }\n\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n capabilitySummary: this.config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available',\n })\n })\n\n await this.client.connect()\n await this.client.login(buildWorkerLoginPayload(this.config))\n\n return this\n }\n\n async stop(): Promise<void> {\n for (const execution of this.activeTasks.values()) {\n execution.canceled = true\n execution.abortController.abort()\n }\n\n await Promise.allSettled(this.contextQueues.values())\n\n this.activeTasks.clear()\n this.pendingCanceledTaskIds.clear()\n await this.client.disconnect()\n }\n\n private async handleTaskMessage({\n task,\n message,\n controller,\n credentials,\n }: TaskMessageContext) {\n this.supersedeActiveTaskExecution(task.id)\n\n const previous = this.contextQueues.get(task.contextId) ?? Promise.resolve()\n const current = previous.catch(() => undefined).then(async () => {\n await this.processTaskMessage({ task, message, controller, credentials })\n })\n this.contextQueues.set(task.contextId, current)\n\n try {\n await current\n }\n finally {\n if (this.contextQueues.get(task.contextId) === current) {\n this.contextQueues.delete(task.contextId)\n }\n }\n }\n\n private async processTaskMessage({\n task,\n message,\n controller,\n credentials,\n }: MinimalTaskMessageContext) {\n if (this.activeTasks.has(task.id)) {\n this.logger.warn(`Ignoring duplicate active task delivery for ${task.id}`)\n return\n }\n\n if (this.pendingCanceledTaskIds.has(task.id)) {\n this.pendingCanceledTaskIds.delete(task.id)\n return\n }\n\n const execution: ActiveTaskExecution = {\n abortController: new AbortController(),\n canceled: false,\n supersededByMessage: false,\n }\n this.activeTasks.set(task.id, execution)\n\n const requestedRepo = readOptionalStringMetadata(task.metadata, 'repo')\n const existingBinding = this.bindings.get(task.contextId)\n let binding = existingBinding\n let createdBinding = false\n let resolvedBinding: OpenCodeWorkerContextBinding | undefined\n let activeBinding: OpenCodeWorkerContextBinding | undefined\n\n try {\n if (!binding) {\n binding = this.createBinding(task.contextId, task.metadata)\n this.bindings.set(task.contextId, binding)\n this.persistState()\n createdBinding = true\n }\n else {\n const hydratedBinding = this.hydrateBindingFromMetadata(binding, task.metadata)\n if (hydratedBinding !== binding) {\n binding = hydratedBinding\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n }\n resolvedBinding = binding\n if (!resolvedBinding) {\n throw new Error(`Missing context binding for ${task.contextId}`)\n }\n const currentBinding = resolvedBinding\n activeBinding = currentBinding\n\n if (!await this.trySendTaskStatusUpdate(\n task.id,\n 'working',\n async () => await controller.working({\n parts: [\n {\n type: 'text',\n text: OPENCODE_WORKER_WORKING_TEXT,\n },\n ],\n }),\n )) {\n return\n }\n\n const managerRunInput = readManagerRunInput(task.metadata)\n const structuredProtocol = readOptionalStringMetadata(\n task.metadata,\n 'projectNodeResultProtocol',\n )\n const artifactStagingDir = structuredProtocol && !managerRunInput\n ? resolveTaskArtifactStagingDir({\n cwd: currentBinding.cwd,\n taskId: task.id,\n artifactStagingRoot: this.config.artifactStagingRoot,\n })\n : undefined\n if (artifactStagingDir) {\n await prepareArtifactStagingDir(artifactStagingDir, currentBinding.cwd)\n }\n const prompt = managerRunInput\n ? buildManagerRunPrompt(managerRunInput)\n : stringifyTaskMessageParts(message.parts)\n const promptWithArtifactInstructions = managerRunInput\n ? prompt\n : appendArtifactStagingInstructions(prompt, artifactStagingDir)\n const finalPrompt\n = createdBinding && currentBinding.planMode\n ? `${renderTextLlmPrompt('worker.opencode.plan-mode-preamble', undefined).text}\\n\\n${promptWithArtifactInstructions}`.trim()\n : promptWithArtifactInstructions\n\n const result = await this.runExecutorTurn(buildOpenCodeTaskExecutionRequest(\n task,\n finalPrompt,\n currentBinding,\n this.config,\n execution,\n credentials?.env,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n return\n }\n\n if (currentBinding.sessionId !== result.sessionId) {\n currentBinding.sessionId = result.sessionId\n this.bindings.set(task.contextId, currentBinding)\n this.persistState()\n }\n\n if (managerRunInput) {\n const managerRunResult = parseManagerRunResult(\n parseJsonObjectOrThrow(result.text),\n )\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: managerRunResult.summary,\n },\n ],\n metadata: buildOpenCodeMetadata(currentBinding, requestedRepo, {\n managerRunResult,\n }),\n }),\n )\n return\n }\n\n const structuredResult = structuredProtocol\n ? await this.resolveStructuredProjectNodeResult(\n task,\n currentBinding,\n structuredProtocol,\n artifactStagingDir,\n result.text,\n execution,\n credentials?.env,\n )\n : {\n status: 'completed' as const,\n summary: result.text,\n }\n\n if (structuredResult.status === 'input_required') {\n await this.trySendTaskStatusUpdate(\n task.id,\n 'input-required',\n async () => await controller.inputRequired({\n parts: [\n {\n type: 'text',\n text: structuredResult.question,\n },\n ],\n metadata: buildOpenCodeMetadata(currentBinding, requestedRepo, {\n 'openCode.summary': structuredResult.summary,\n ...(structuredResult.options\n ? {\n responseSpec: {\n required: true,\n allowedPartTypes: ['text'],\n options: structuredResult.options,\n },\n }\n : {}),\n ...(structuredResult.reasonType\n ? { projectNodeReasonType: structuredResult.reasonType }\n : {}),\n }),\n }),\n )\n return\n }\n\n await this.registerStructuredArtifacts(\n artifactStagingDir,\n currentBinding.cwd,\n structuredResult.artifacts,\n structuredResult.writes,\n controller,\n )\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: structuredResult.summary,\n },\n ],\n metadata: buildOpenCodeMetadata(\n currentBinding,\n requestedRepo,\n structuredResult.writes || structuredResult.childWorkItems\n ? {\n ...(structuredResult.writes\n ? { projectNodeWrites: structuredResult.writes }\n : {}),\n ...(structuredResult.childWorkItems\n ? { projectNodeChildWorkItems: structuredResult.childWorkItems }\n : {}),\n }\n : undefined,\n ),\n }),\n )\n }\n catch (error) {\n if (this.isTaskCanceled(task.id) || isAbortError(error)) {\n return\n }\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'failed',\n async () => await controller.fail({\n parts: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : 'OpenCode run failed',\n },\n ],\n metadata: buildOpenCodeFailureMetadata(\n activeBinding,\n requestedRepo,\n this.config,\n error,\n ),\n }),\n )\n }\n finally {\n this.activeTasks.delete(task.id)\n this.pendingCanceledTaskIds.delete(task.id)\n }\n }\n\n private async trySendTaskStatusUpdate(\n taskId: string,\n targetState: 'working' | 'input-required' | 'completed' | 'failed',\n action: () => Promise<void>,\n ) {\n try {\n await action()\n return true\n }\n catch (error) {\n if (isTerminalTaskConflictError(error)) {\n this.logger.warn(\n `Ignoring stale terminal task update for ${taskId} while reporting ${targetState}: ${error.message}`,\n )\n return false\n }\n if (isWorkerConnectionClosedError(error)) {\n this.logger.warn(\n `Skipping ${targetState} update for ${taskId} because the worker connection is already closed`,\n )\n return false\n }\n throw error\n }\n }\n\n private async handleTaskCancel(taskId: string) {\n const execution = this.activeTasks.get(taskId)\n if (!execution) {\n this.pendingCanceledTaskIds.add(taskId)\n return\n }\n\n execution.canceled = true\n execution.abortController.abort()\n }\n\n private supersedeActiveTaskExecution(taskId: string) {\n const execution = this.activeTasks.get(taskId)\n if (!execution || execution.canceled || execution.supersededByMessage) {\n return\n }\n\n execution.supersededByMessage = true\n execution.abortController.abort()\n }\n\n private async runExecutorTurn(\n request: OpenCodeCliTaskExecutionRequest,\n ): Promise<OpenCodeCliTaskExecutionResult> {\n if (request.abortSignal.aborted) {\n throw createAbortError()\n }\n\n const abortedResult = { aborted: true } as const\n let abortObserved = false\n const executorPromise = this.executor.runTurn(request).catch((error) => {\n if (abortObserved && (request.abortSignal.aborted || isAbortError(error))) {\n return abortedResult\n }\n throw error\n })\n const abortPromise = new Promise<typeof abortedResult>((resolve) => {\n function onAbort() {\n request.abortSignal.removeEventListener('abort', onAbort)\n abortObserved = true\n resolve(abortedResult)\n }\n\n request.abortSignal.addEventListener('abort', onAbort, { once: true })\n void executorPromise.then(() => {\n request.abortSignal.removeEventListener('abort', onAbort)\n }, () => {\n request.abortSignal.removeEventListener('abort', onAbort)\n })\n })\n\n const result = await Promise.race([\n executorPromise,\n abortPromise,\n ])\n if ('aborted' in result) {\n throw createAbortError()\n }\n return result\n }\n\n private createBinding(\n contextId: string,\n metadata: Record<string, unknown> | undefined,\n ): OpenCodeWorkerContextBinding {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n const explicitVariant = readOptionalStringMetadata(metadata, 'openCodeVariant')\n const explicitAgent = readOptionalStringMetadata(metadata, 'openCodeAgent')\n const planMode = readOptionalBooleanMetadata(metadata, 'openCodePlanMode') ?? false\n const cwd = this.resolveCwd(repo)\n\n return {\n contextId,\n ...(repo ? { repo } : {}),\n cwd,\n variant:\n explicitVariant\n ?? (this.config.variantDefault === 'use-opencode-default'\n ? undefined\n : this.config.variantDefault),\n agent:\n explicitAgent\n ?? (this.config.agentDefault === 'use-opencode-default'\n ? undefined\n : this.config.agentDefault),\n planMode,\n }\n }\n\n private hydrateBindingFromMetadata(\n binding: OpenCodeWorkerContextBinding,\n metadata: Record<string, unknown> | undefined,\n ) {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n if (binding.repo) {\n return binding\n }\n if (!repo) {\n return binding\n }\n\n return {\n ...binding,\n repo,\n cwd: this.resolveCwd(repo),\n }\n }\n\n private resolveCwd(repo: string | undefined) {\n if (!repo) {\n this.ensureDirectory(this.config.defaultWorkspace, 'default workspace directory')\n return this.config.defaultWorkspace\n }\n const mapped = this.config.repoMappings[repo]\n if (Object.keys(this.config.repoMappings).length > 0) {\n if (!mapped) {\n throw new Error(`No repo mapping configured for ${repo}`)\n }\n this.ensureDirectory(mapped, `mapped repo directory for ${repo}`)\n this.ensureWorkspaceSubdirectory(mapped, `mapped repo directory for ${repo}`)\n return mapped\n }\n\n const inferred = join(this.config.defaultWorkspace, repo)\n this.ensureDirectory(inferred, `workspace repo directory for ${repo}`)\n this.ensureWorkspaceSubdirectory(inferred, `workspace repo directory for ${repo}`)\n return inferred\n }\n\n private ensureDirectory(path: string, label: string) {\n if (!existsSync(path)) {\n throw new Error(`Missing ${label}: ${path}`)\n }\n }\n\n private ensureWorkspaceSubdirectory(path: string, label: string) {\n const workspaceRoot = resolve(this.config.defaultWorkspace)\n const candidate = resolve(path)\n const relativePath = relative(workspaceRoot, candidate)\n if (!relativePath || relativePath === '.' || relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Expected ${label} to be a subdirectory of ${workspaceRoot}: ${candidate}`)\n }\n }\n\n private persistState() {\n mkdirSync(dirname(this.stateFile), { recursive: true })\n writeOpenCodeWorkerState(this.stateFile, {\n contexts: Array.from(this.bindings.values()),\n })\n }\n\n private isTaskCanceled(taskId: string) {\n return (\n this.activeTasks.get(taskId)?.canceled ?? this.pendingCanceledTaskIds.has(taskId)\n )\n }\n\n private async resolveStructuredProjectNodeResult(\n task: TaskMessageContext['task'],\n binding: OpenCodeWorkerContextBinding,\n protocol: string,\n artifactStagingDir: string | undefined,\n firstText: string,\n execution: ActiveTaskExecution,\n env?: Record<string, string>,\n ): Promise<ParsedProjectNodeResult> {\n const firstParsed = parseProjectNodeResult(protocol, firstText)\n if (firstParsed) {\n return firstParsed\n }\n\n const retryResult = await this.runExecutorTurn(buildOpenCodeTaskExecutionRequest(\n task,\n buildStructuredRetryPrompt(protocol, artifactStagingDir),\n binding,\n this.config,\n execution,\n env,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n throw new Error('task canceled before structured retry completed')\n }\n\n if (binding.sessionId !== retryResult.sessionId) {\n binding.sessionId = retryResult.sessionId\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n\n const retryParsed = parseProjectNodeResult(protocol, retryResult.text)\n if (retryParsed) {\n return retryParsed\n }\n\n throw new Error('OpenCode returned an invalid structured result after one retry')\n }\n\n private async registerStructuredArtifacts(\n artifactStagingDir: string | undefined,\n artifactBoundaryDir: string,\n manifests: ProjectNodeArtifactManifest[] | undefined,\n writes: ProjectNodeWrite[] | undefined,\n controller: MinimalTaskMessageContext['controller'],\n ) {\n const attachmentWrites = writes?.filter(isProjectNodeAttachmentWrite) ?? []\n if (!manifests?.length && attachmentWrites.length === 0) {\n return\n }\n\n const manifestById = new Map<string, ProjectNodeArtifactManifest>()\n for (const manifest of manifests ?? []) {\n manifestById.set(manifest.artifactId, manifest)\n }\n for (const write of attachmentWrites) {\n if (!manifestById.has(write.artifactId)) {\n throw createAttachmentArtifactNotFoundError(write.artifactId)\n }\n }\n if (!artifactStagingDir) {\n throw createAttachmentArtifactNotFoundError(attachmentWrites[0]!.artifactId)\n }\n\n try {\n validateArtifactManifest(manifests ?? [])\n }\n catch (error) {\n if (error instanceof StagedArtifactValidationError) {\n throw createAttachmentArtifactSourceInvalidError(error.artifactId)\n }\n throw error\n }\n\n for (const manifest of manifests ?? []) {\n let artifact\n try {\n artifact = await readStagedArtifact(artifactStagingDir, manifest, artifactBoundaryDir)\n }\n catch (error) {\n if (error instanceof StagedArtifactValidationError) {\n throw createAttachmentArtifactSourceInvalidError(manifest.artifactId)\n }\n throw error\n }\n\n await controller.addArtifact(artifact)\n await cleanupStagedArtifact(artifactStagingDir, manifest, artifactBoundaryDir).catch((error) => {\n this.logger.warn(\n `Failed to clean staged artifact ${manifest.artifactId}: ${error instanceof Error ? error.message : String(error)}`,\n )\n })\n }\n }\n}\n\nfunction isProjectNodeAttachmentWrite(write: ProjectNodeWrite): write is ProjectNodeUploadAttachmentWrite {\n return write.kind === 'upload-attachment'\n}\n\nfunction createAttachmentArtifactNotFoundError(artifactId: string) {\n return new Error(renderTextPrompt('sdk.runtime-error.message', {\n errorCode: 'work-item-attachment-artifact-not-found',\n artifactId,\n }).text)\n}\n\nfunction createAttachmentArtifactSourceInvalidError(artifactId: string) {\n return new Error(renderTextPrompt('sdk.runtime-error.message', {\n errorCode: 'work-item-attachment-source-invalid',\n artifactId,\n }).text)\n}\n\nfunction buildWorkerLoginPayload(\n config: OpenCodeWorkerBridgeConfig,\n) {\n return {\n workerId: config.workerId,\n email: config.email,\n capabilitySummary: config.capabilitySummary,\n credentialDeliveryEnabled: true,\n initialAvailability: 'available' as const,\n }\n}\n\nfunction buildOpenCodeMetadata(\n binding: OpenCodeWorkerContextBinding,\n requestedRepo?: string,\n extraMetadata?: Record<string, unknown>,\n) {\n return {\n 'openCode.sessionId': binding.sessionId,\n 'openCode.cwd': binding.cwd,\n ...(binding.repo ? { 'openCode.repo': binding.repo } : {}),\n ...(requestedRepo ? { 'openCode.requestedRepo': requestedRepo } : {}),\n ...(binding.variant\n ? { 'openCode.variant': binding.variant }\n : {}),\n ...(binding.agent\n ? { 'openCode.agent': binding.agent }\n : {}),\n 'openCode.planMode': binding.planMode,\n ...(extraMetadata ? structuredClone(extraMetadata) : {}),\n }\n}\n\nfunction buildOpenCodeFailureMetadata(\n binding: OpenCodeWorkerContextBinding | undefined,\n requestedRepo: string | undefined,\n config: OpenCodeWorkerBridgeConfig,\n error: unknown,\n) {\n const baseMetadata = binding\n ? buildOpenCodeMetadata(binding, requestedRepo)\n : {}\n const failureReason = readOpenCodeFailureReason(error)\n\n return {\n ...baseMetadata,\n 'openCode.modelSelection': config.modelSelection,\n 'openCode.effectiveModel':\n config.modelSelection === 'use-opencode-default'\n ? 'opencode-default'\n : config.modelSelection,\n 'openCode.permissionPreset': config.permissionPreset,\n ...(config.variantDefault !== 'use-opencode-default'\n ? { 'openCode.defaultVariant': config.variantDefault }\n : {}),\n ...(config.agentDefault !== 'use-opencode-default'\n ? { 'openCode.defaultAgent': config.agentDefault }\n : {}),\n ...(failureReason ? { 'openCode.failureReason': failureReason } : {}),\n }\n}\n\nfunction buildOpenCodeTaskExecutionRequest(\n task: TaskMessageContext['task'],\n prompt: string,\n binding: OpenCodeWorkerContextBinding,\n config: OpenCodeWorkerBridgeConfig,\n execution: ActiveTaskExecution,\n env?: Record<string, string>,\n) {\n return {\n taskId: task.id,\n contextId: task.contextId,\n cwd: binding.cwd,\n prompt,\n sessionId: binding.sessionId,\n model:\n config.modelSelection === 'use-opencode-default'\n ? undefined\n : config.modelSelection,\n variant: binding.variant,\n agent: binding.agent,\n permissionPreset: config.permissionPreset,\n abortSignal: execution.abortController.signal,\n ...(env ? { env } : {}),\n }\n}\n\nfunction appendArtifactStagingInstructions(\n prompt: string,\n artifactStagingDir: string | undefined,\n) {\n if (!artifactStagingDir) {\n return prompt\n }\n const instructions = renderTextLlmPrompt('worker.opencode.artifact-staging-instructions', {\n artifactStagingDir,\n }).text\n return `${prompt}\\n\\n${instructions}`.trim()\n}\n\nfunction buildStructuredRetryPrompt(_protocol: string, artifactStagingDir: string | undefined) {\n return renderTextLlmPrompt(\n 'worker.opencode.structured-retry',\n artifactStagingDir ? { artifactStagingDir } : undefined,\n ).text\n}\n\nfunction buildManagerRunPrompt(\n input: Record<string, unknown>,\n) {\n return renderTextLlmPrompt('worker.opencode.manager-run', {\n managerRunInput: input,\n }).text\n}\n\nfunction isTerminalTaskConflictError(error: unknown): error is Error {\n return error instanceof Error\n && (\n error.message.includes('task is already terminal')\n || error.message.includes('cannot continue a terminal task')\n )\n}\n\nfunction isWorkerConnectionClosedError(error: unknown): error is Error {\n return error instanceof Error && error.message.includes('WebSocket is not connected')\n}\n\nfunction parseProjectNodeResult(\n protocol: string,\n text: string,\n): ParsedProjectNodeResult | null {\n const parsed = parseProjectNodeResultObject(text)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null\n }\n\n if ('status' in parsed) {\n const status = normalizeStatus((parsed as { status?: unknown }).status)\n const summary = normalizeSummary((parsed as { summary?: unknown }).summary)\n if (!status || !summary) {\n return null\n }\n\n if (status === 'completed') {\n const writes = normalizeProjectNodeWrites(\n (parsed as { projectNodeWrites?: unknown }).projectNodeWrites\n ?? (parsed as { writes?: unknown }).writes,\n )\n if (writes === null) {\n return null\n }\n const artifacts = normalizeProjectNodeArtifacts((parsed as { artifacts?: unknown }).artifacts)\n if (artifacts === null) {\n return null\n }\n const childWorkItems = normalizeProjectNodeChildWorkItems(\n (parsed as { childWorkItems?: unknown }).childWorkItems,\n )\n return {\n status,\n summary,\n ...(artifacts && artifacts.length > 0 ? { artifacts } : {}),\n ...(writes && writes.length > 0 ? { writes } : {}),\n ...(childWorkItems && childWorkItems.length > 0 ? { childWorkItems } : {}),\n }\n }\n\n const question = normalizeSummary((parsed as { question?: unknown }).question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(\n (parsed as { reasonType?: unknown }).reasonType,\n ) ?? undefined\n const options = normalizeResponseOptions(\n (parsed as { options?: unknown }).options,\n )\n return {\n status,\n summary,\n question,\n ...(options ? { options } : {}),\n ...(reasonType ? { reasonType } : {}),\n }\n }\n\n const choice = normalizeChoicePrefixedResult(parsed as Record<string, unknown>)\n if (!choice) {\n return null\n }\n return choice\n}\n\nfunction readManagerRunInput(\n metadata: Record<string, unknown> | undefined,\n) {\n const input = metadata?.managerRunInput\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return null\n }\n\n return structuredClone(input) as Record<string, unknown>\n}\n\nfunction readOpenCodeFailureReason(error: unknown) {\n if (!(error instanceof Error)) {\n return undefined\n }\n\n const explicitReason = error.message.match(/;\\s*reason=([^;]+)/u)?.[1]?.trim()\n if (explicitReason) {\n return explicitReason\n }\n\n if (/context window/i.test(error.message)) {\n return 'context_window_exceeded'\n }\n\n return undefined\n}\n\nfunction parseJsonObjectOrThrow(text: string) {\n const parsed = parseProjectNodeResultObject(text)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('OpenCode returned an invalid manager run result')\n }\n\n return parsed\n}\n\nfunction parseProjectNodeResultObject(text: string) {\n const trimmed = text.trim()\n if (!trimmed) {\n return null\n }\n\n const jsonText = unwrapJsonCodeFence(trimmed) ?? trimmed\n try {\n return JSON.parse(jsonText) as unknown\n }\n catch {\n const matched = jsonText.match(/^([12])\\s+(\\{[\\s\\S]+\\})$/)\n if (!matched) {\n return null\n }\n\n try {\n return {\n choice: matched[1],\n ...(JSON.parse(matched[2]) as Record<string, unknown>),\n }\n }\n catch {\n return null\n }\n }\n}\n\nfunction unwrapJsonCodeFence(text: string) {\n if (!text.startsWith('```') || !text.endsWith('```')) {\n return null\n }\n\n const inner = text.slice(3, -3)\n const normalizedInner = inner.startsWith('\\r\\n')\n ? inner.slice(2)\n : inner.startsWith('\\n')\n ? inner.slice(1)\n : inner\n const newlineIndex = normalizedInner.search(/\\r?\\n/u)\n if (newlineIndex < 0) {\n return null\n }\n\n const header = normalizedInner.slice(0, newlineIndex).trim().toLowerCase()\n if (header && header !== 'json') {\n return null\n }\n\n return normalizedInner.slice(newlineIndex + 1).trim()\n}\n\nfunction normalizeStatus(value: unknown) {\n if (value === 'completed' || value === 'input_required') {\n return value\n }\n return null\n}\n\nfunction normalizeSummary(value: unknown) {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : null\n}\n\nfunction normalizeChoicePrefixedResult(\n parsed: Record<string, unknown>,\n): ParsedProjectNodeResult | null {\n const choice = parsed.choice\n const summary = normalizeSummary(parsed.summary)\n if (!summary || (choice !== '1' && choice !== '2')) {\n return null\n }\n\n if (choice === '1') {\n return {\n status: 'completed',\n summary,\n }\n }\n\n const question = normalizeSummary(parsed.question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(parsed.reasonType) ?? undefined\n\n return {\n status: 'input_required',\n summary,\n question,\n ...(reasonType ? { reasonType } : {}),\n }\n}\n\nfunction normalizeResponseOptions(\n value: unknown,\n): ParsedResponseOption[] | undefined {\n if (!Array.isArray(value) || value.length === 0) {\n return undefined\n }\n\n const normalized: ParsedResponseOption[] = []\n const seenValues = new Set<string>()\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return undefined\n }\n\n const optionValue = normalizeSummary((item as { value?: unknown }).value)\n const label = normalizeSummary((item as { label?: unknown }).label)\n const responseText = normalizeSummary((item as { responseText?: unknown }).responseText)\n const description = normalizeSummary((item as { description?: unknown }).description)\n if (!optionValue || !label || !responseText || seenValues.has(optionValue)) {\n return undefined\n }\n\n seenValues.add(optionValue)\n normalized.push({\n value: optionValue,\n label,\n responseText,\n ...(description ? { description } : {}),\n })\n }\n\n return normalized.length > 0 ? normalized : undefined\n}\n\nfunction normalizeProjectNodeWrites(value: unknown): ProjectNodeWrite[] | null | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n if (!Array.isArray(value)) {\n return null\n }\n\n const writes: ProjectNodeWrite[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return null\n }\n\n const record = item as Record<string, unknown>\n const fieldKey = normalizeSummary(record.fieldKey)\n const reason = normalizeSummary(record.reason) ?? undefined\n if (!fieldKey) {\n return null\n }\n\n if (record.kind === 'set-field') {\n if (record.value === undefined || record.value === null) {\n return null\n }\n writes.push({\n kind: 'set-field',\n fieldKey,\n value: structuredClone(record.value),\n ...(reason ? { reason } : {}),\n })\n continue\n }\n\n if (record.kind === 'upload-attachment') {\n const artifactId = normalizeSummary(record.artifactId)\n if (!artifactId) {\n return null\n }\n writes.push({\n kind: 'upload-attachment',\n fieldKey,\n artifactId,\n ...(reason ? { reason } : {}),\n })\n continue\n }\n\n return null\n }\n\n return writes\n}\n\nfunction normalizeProjectNodeChildWorkItems(value: unknown): ParsedProjectNodeChildWorkItem[] | undefined {\n if (!Array.isArray(value)) {\n return undefined\n }\n\n const childWorkItems = value.flatMap((item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return []\n }\n\n const record = item as Record<string, unknown>\n const stableKey = normalizeSummary(record.stableKey)\n const name = normalizeSummary(record.name)\n const description = normalizeSummary(record.description) ?? undefined\n if (!stableKey || !name) {\n return []\n }\n\n return [{\n stableKey,\n name,\n ...(description ? { description } : {}),\n }]\n })\n\n return childWorkItems\n}\n\nfunction normalizeProjectNodeArtifacts(\n value: unknown,\n): ProjectNodeArtifactManifest[] | null | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n if (!Array.isArray(value)) {\n return null\n }\n\n const artifacts: ProjectNodeArtifactManifest[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return null\n }\n\n const record = item as Record<string, unknown>\n const artifactId = normalizeSummary(record.artifactId)\n const fileName = normalizeSummary(record.fileName)\n if (!artifactId || !fileName) {\n return null\n }\n if ('mimeType' in record && typeof record.mimeType !== 'string') {\n return null\n }\n\n artifacts.push({\n artifactId,\n fileName,\n ...(typeof record.mimeType === 'string' ? { mimeType: record.mimeType } : {}),\n })\n }\n\n return artifacts\n}\n\nfunction normalizeProjectNodeReasonType(\n value: unknown,\n): ProjectNodeReasonType | null {\n return value === 'guidance_missing'\n || value === 'guidance_conflict'\n || value === 'project_context_missing'\n || value === 'project_context_conflict'\n || value === 'business_fact_missing'\n || value === 'permission_missing'\n || value === 'external_dependency'\n || value === 'unknown'\n ? value\n : null\n}\n\nfunction readOptionalStringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n const value = metadata[key]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${key} must be a non-empty string`)\n }\n return value.trim()\n}\n\nfunction readOptionalBooleanMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n const value = metadata[key]\n if (typeof value !== 'boolean') {\n throw new TypeError(`${key} must be a boolean`)\n }\n return value\n}\n","import type { ArtifactInput } from '@meego-harness/worker-sdk'\nimport { lstat, mkdir, readFile, rm } from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\n\nexport const DEFAULT_ARTIFACT_STAGING_ROOT = 'artifacts'\nexport const MAX_STAGED_ARTIFACT_BYTES = 20 * 1024 * 1024\n\n// Keep the identifier contract explicit for staged artifact boundary checks.\n// eslint-disable-next-line regexp/prefer-w\nconst SAFE_IDENTIFIER_PATTERN = /^[A-Za-z0-9._-]+$/u\n\nexport interface ProjectNodeArtifactManifest {\n artifactId: string\n fileName: string\n mimeType?: string\n}\n\nexport interface ResolveArtifactStagingInput {\n cwd: string\n taskId: string\n artifactStagingRoot?: string\n}\n\nexport class StagedArtifactValidationError extends Error {\n readonly artifactId: string\n\n constructor(artifactId: string, message: string) {\n super(message)\n this.name = 'StagedArtifactValidationError'\n this.artifactId = artifactId\n }\n}\n\nexport function resolveTaskArtifactStagingDir(input: ResolveArtifactStagingInput) {\n assertSafeIdentifier(input.taskId, 'taskId')\n\n const cwd = resolve(input.cwd)\n const rootInput = input.artifactStagingRoot ?? DEFAULT_ARTIFACT_STAGING_ROOT\n const root = isAbsolute(rootInput)\n ? resolve(rootInput)\n : resolve(cwd, rootInput)\n const rootRelativePath = relative(cwd, root)\n if (rootRelativePath.startsWith('..') || isAbsolute(rootRelativePath)) {\n throw new Error(`artifactStagingRoot must resolve inside cwd: ${root}`)\n }\n\n return join(root, input.taskId)\n}\n\nexport async function prepareArtifactStagingDir(\n artifactStagingDir: string,\n boundaryDir = dirname(dirname(artifactStagingDir)),\n) {\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n await rm(artifactStagingDir, { recursive: true, force: true })\n await mkdir(artifactStagingDir, { recursive: true })\n}\n\nexport function validateArtifactManifest(manifests: ProjectNodeArtifactManifest[]) {\n const artifactIds = new Set<string>()\n for (const manifest of manifests) {\n validateSingleArtifactManifest(manifest)\n if (artifactIds.has(manifest.artifactId)) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `duplicate staged artifact id: ${manifest.artifactId}`,\n )\n }\n artifactIds.add(manifest.artifactId)\n }\n}\n\nexport async function readStagedArtifact(\n artifactStagingDir: string,\n manifest: ProjectNodeArtifactManifest,\n boundaryDir: string,\n): Promise<ArtifactInput> {\n validateSingleArtifactManifest(manifest)\n\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n const artifactDir = join(artifactStagingDir, manifest.artifactId)\n const file = join(artifactStagingDir, manifest.artifactId, manifest.fileName)\n const artifactDirStat = await lstat(artifactDir).catch(() => {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `missing staged artifact directory: ${manifest.artifactId}`,\n )\n })\n if (artifactDirStat.isSymbolicLink() || !artifactDirStat.isDirectory()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact directory: ${manifest.artifactId}`,\n )\n }\n\n let fileStat\n try {\n fileStat = await lstat(file)\n }\n catch {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `missing staged artifact file: ${manifest.fileName}`,\n )\n }\n\n if (\n fileStat.isSymbolicLink()\n || !fileStat.isFile()\n || fileStat.size === 0\n || fileStat.size > MAX_STAGED_ARTIFACT_BYTES\n ) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact file: ${manifest.fileName}`,\n )\n }\n\n const data = await readFile(file)\n\n return {\n artifactId: manifest.artifactId,\n name: manifest.fileName,\n parts: [\n {\n type: 'data',\n data: {\n base64: data.toString('base64'),\n fileName: manifest.fileName,\n },\n ...(manifest.mimeType ? { mimeType: manifest.mimeType } : {}),\n },\n ],\n }\n}\n\nexport async function cleanupStagedArtifact(\n artifactStagingDir: string,\n manifest: ProjectNodeArtifactManifest,\n boundaryDir: string,\n) {\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n const artifactDir = join(artifactStagingDir, manifest.artifactId)\n await assertStagedArtifactDirectory(artifactDir, manifest)\n await assertStagedArtifactFile(join(artifactDir, manifest.fileName), manifest)\n await rm(join(artifactDir, manifest.fileName), { force: true })\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n await assertStagedArtifactDirectory(artifactDir, manifest)\n await rm(artifactDir, { recursive: false }).catch(ignoreNonEmptyDirectoryError)\n await assertExistingPathIsNotSymlink(artifactStagingDir, manifest.artifactId, 'artifactStagingDir')\n await rm(artifactStagingDir, { recursive: false }).catch(ignoreNonEmptyDirectoryError)\n}\n\nfunction validateSingleArtifactManifest(manifest: ProjectNodeArtifactManifest) {\n assertSafeIdentifier(manifest.artifactId, 'artifactId')\n assertSafeFileName(manifest.artifactId, manifest.fileName)\n if (manifest.mimeType !== undefined && manifest.mimeType.trim().length === 0) {\n throw new StagedArtifactValidationError(manifest.artifactId, 'staged artifact mimeType is empty')\n }\n}\n\nfunction assertSafeIdentifier(value: string, label: string) {\n if (value === '.' || value === '..' || !SAFE_IDENTIFIER_PATTERN.test(value)) {\n throw new StagedArtifactValidationError(value, `unsafe staged artifact ${label}: ${value}`)\n }\n}\n\nfunction assertSafeFileName(artifactId: string, fileName: string) {\n if (fileName.length === 0 || fileName !== basename(fileName) || fileName.includes('..')) {\n throw new StagedArtifactValidationError(artifactId, `unsafe staged artifact fileName: ${fileName}`)\n }\n}\n\nasync function assertExistingPathComponentsAreNotSymlinks(path: string, boundaryDir: string) {\n const resolvedPath = resolve(path)\n const resolvedBoundary = resolve(boundaryDir)\n const relativePath = relative(resolvedBoundary, resolvedPath)\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`staged artifact path must stay inside boundary: ${resolvedPath}`)\n }\n\n await assertExistingPathIsNotSymlink(resolvedBoundary, resolvedBoundary, 'path component')\n const relativeParts = relativePath.split(sep).filter(Boolean)\n let currentPath = resolvedBoundary\n for (const part of relativeParts) {\n currentPath = join(currentPath, part)\n await assertExistingPathIsNotSymlink(currentPath, currentPath, 'path component')\n }\n}\n\nasync function assertExistingPathIsNotSymlink(path: string, artifactId: string, label: string) {\n const pathStat = await lstat(path).catch((error) => {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return undefined\n }\n throw error\n })\n if (pathStat?.isSymbolicLink()) {\n throw new StagedArtifactValidationError(artifactId, `staged artifact ${label} is a symlink: ${path}`)\n }\n}\n\nasync function assertStagedArtifactDirectory(\n artifactDir: string,\n manifest: ProjectNodeArtifactManifest,\n) {\n const artifactDirStat = await lstat(artifactDir)\n if (artifactDirStat.isSymbolicLink() || !artifactDirStat.isDirectory()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact directory: ${manifest.artifactId}`,\n )\n }\n}\n\nasync function assertStagedArtifactFile(\n file: string,\n manifest: ProjectNodeArtifactManifest,\n) {\n const fileStat = await lstat(file)\n if (fileStat.isSymbolicLink() || !fileStat.isFile()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact file: ${manifest.fileName}`,\n )\n }\n}\n\nfunction ignoreNonEmptyDirectoryError(error: unknown) {\n if (!isNodeError(error) || (error.code !== 'ENOTEMPTY' && error.code !== 'EEXIST')) {\n throw error\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n"],"mappings":"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","names":["join","resolve","text","existsSync","mkdirSync","dirname","isAbsolute","join","relative","resolve","process","renderTextLlmPrompt","dirname","isAbsolute","join","join","process","renderTextLlmPrompt","resolve","existsSync","relative","isAbsolute","mkdirSync","dirname","text"]}
|
package/dist/cli.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -58,6 +58,7 @@ interface OpenCodeCliTaskExecutionRequest {
|
|
|
58
58
|
agent?: Exclude<OpenCodeAgentSelection, 'use-opencode-default'>;
|
|
59
59
|
permissionPreset: PermissionPreset;
|
|
60
60
|
abortSignal: AbortSignal;
|
|
61
|
+
env?: Record<string, string>;
|
|
61
62
|
}
|
|
62
63
|
interface OpenCodeCliTaskExecutionResult {
|
|
63
64
|
text: string;
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meego-harness/opencode-worker",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"description": "Standalone OpenCode worker bridge for meego-harness WorkerServerSDK",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
@@ -57,8 +57,58 @@
|
|
|
57
57
|
"value": "full-access",
|
|
58
58
|
"label": "full-access"
|
|
59
59
|
}
|
|
60
|
+
],
|
|
61
|
+
"model": [
|
|
62
|
+
{
|
|
63
|
+
"value": "use-opencode-default",
|
|
64
|
+
"label": "use-opencode-default"
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"variant": [
|
|
68
|
+
{
|
|
69
|
+
"value": "use-opencode-default",
|
|
70
|
+
"label": "use-opencode-default"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"value": "max",
|
|
74
|
+
"label": "max"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"agent": [
|
|
78
|
+
{
|
|
79
|
+
"value": "use-opencode-default",
|
|
80
|
+
"label": "use-opencode-default"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"value": "build",
|
|
84
|
+
"label": "build"
|
|
85
|
+
}
|
|
60
86
|
]
|
|
61
87
|
},
|
|
88
|
+
"quickStartTemplates": [
|
|
89
|
+
{
|
|
90
|
+
"id": "default",
|
|
91
|
+
"displayName": "Default options",
|
|
92
|
+
"description": "Use default OpenCode options",
|
|
93
|
+
"setupFieldValues": {
|
|
94
|
+
"permissionPreset": "default",
|
|
95
|
+
"model": "use-opencode-default",
|
|
96
|
+
"variant": "use-opencode-default",
|
|
97
|
+
"agent": "use-opencode-default"
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"id": "full-access-latest",
|
|
102
|
+
"displayName": "Full access latest",
|
|
103
|
+
"description": "Use full access with the latest OpenCode default model",
|
|
104
|
+
"setupFieldValues": {
|
|
105
|
+
"permissionPreset": "full-access",
|
|
106
|
+
"model": "use-opencode-default",
|
|
107
|
+
"variant": "max",
|
|
108
|
+
"agent": "build"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
],
|
|
62
112
|
"actions": {
|
|
63
113
|
"setup": {
|
|
64
114
|
"runner": "package-bin",
|
|
@@ -132,9 +182,9 @@
|
|
|
132
182
|
"dependencies": {
|
|
133
183
|
"@clack/prompts": "^1.2.0",
|
|
134
184
|
"zod": "^4.3.6",
|
|
135
|
-
"@meego-harness/manager-contract": "^0.
|
|
136
|
-
"@meego-harness/prompt-registry": "^0.
|
|
137
|
-
"@meego-harness/worker-sdk": "^0.
|
|
185
|
+
"@meego-harness/manager-contract": "^0.8.0",
|
|
186
|
+
"@meego-harness/prompt-registry": "^0.8.0",
|
|
187
|
+
"@meego-harness/worker-sdk": "^0.8.0"
|
|
138
188
|
},
|
|
139
189
|
"devDependencies": {
|
|
140
190
|
"@types/node": "^20.19.39",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/config.ts","../src/parts.ts","../src/runtime.ts","../src/bridge.ts","../src/artifacts.ts"],"sourcesContent":["export const OPENCODE_WORKER_WORKING_TEXT = 'OpenCode CLI is working'\nexport const OPENCODE_WORKER_CONFIG_DIR = '.meego-harness/opencode-worker'\n","import type {\n OpenCodeWorkerConfig,\n OpenCodeWorkerDoctorReport,\n OpenCodeWorkerListItem,\n OpenCodeWorkerPrompter,\n OpenCodeWorkerSetupInput,\n OpenCodeWorkerSetupResult,\n OpenCodeWorkerState,\n ResolveStoragePathsOptions,\n RunOpenCodeWorkerSetupDependencies,\n} from './types'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, isAbsolute, join } from 'node:path'\nimport { confirm, isCancel, select, text } from '@clack/prompts'\nimport { renderCliPrompt } from '@meego-harness/prompt-registry'\nimport { resolveDefaultWorkerDeviceIdentityFile } from '@meego-harness/worker-sdk'\nimport { z } from 'zod'\nimport { OPENCODE_WORKER_CONFIG_DIR } from './constants'\n\nconst openCodeModelSelectionSchema = z.string().trim().min(1, 'modelSelection is required')\nconst openCodeVariantSelectionSchema = z.string().trim().min(1, 'variantDefault is required')\nconst openCodeAgentSelectionSchema = z.string().trim().min(1, 'agentDefault is required')\n\nconst openCodeWorkerConfigSchema = z.object({\n serverUrl: z.string().trim().min(1, 'serverUrl is required'),\n email: z.string().trim().min(1, 'email is required'),\n workerId: z.string().trim().min(1, 'workerId is required'),\n capabilitySummary: z.string().trim().min(1, 'capabilitySummary is required'),\n defaultWorkspace: z.string().trim().min(1, 'defaultWorkspace is required'),\n artifactStagingRoot: z.string().trim().min(1, 'artifactStagingRoot is required').optional(),\n repoMappings: z.record(z.string(), z.string()),\n enabled: z.boolean().default(true),\n permissionPreset: z.enum(['safe', 'default', 'full-access']),\n modelSelection: openCodeModelSelectionSchema,\n variantDefault: openCodeVariantSelectionSchema,\n agentDefault: openCodeAgentSelectionSchema,\n openCodeShell: z.boolean().default(false),\n})\n\nconst openCodeWorkerStateSchema = z.object({\n contexts: z.array(\n z.object({\n contextId: z.string(),\n repo: z.string().optional(),\n cwd: z.string(),\n sessionId: z.string().optional(),\n variant: z.string().optional(),\n agent: z.string().optional(),\n planMode: z.boolean(),\n }),\n ),\n})\n\nexport function resolveOpenCodeWorkerStorageDir(options: ResolveStoragePathsOptions = {}) {\n return join(options.homeDir ?? homedir(), OPENCODE_WORKER_CONFIG_DIR)\n}\n\nexport function resolveOpenCodeWorkerConfigFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveOpenCodeWorkerStorageDir(options), `${workerId}.json`)\n}\n\nexport function resolveOpenCodeWorkerStateFile(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n return join(resolveOpenCodeWorkerStorageDir(options), `${workerId}.state.json`)\n}\n\nexport function loadOpenCodeWorkerConfig(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n): OpenCodeWorkerConfig {\n const file = resolveOpenCodeWorkerConfigFile(workerId, options)\n if (!existsSync(file)) {\n throw new Error(`OpenCode worker config not found for ${workerId}: ${file}`)\n }\n\n return openCodeWorkerConfigSchema.parse(JSON.parse(readFileSync(file, 'utf8')))\n}\n\nexport function writeOpenCodeWorkerConfig(\n config: OpenCodeWorkerConfig,\n options: ResolveStoragePathsOptions = {},\n) {\n mkdirSync(resolveOpenCodeWorkerStorageDir(options), { recursive: true })\n writeFileSync(\n resolveOpenCodeWorkerConfigFile(config.workerId, options),\n `${JSON.stringify(config, null, 2)}\\n`,\n 'utf8',\n )\n}\n\nexport function loadOpenCodeWorkerState(stateFile: string): OpenCodeWorkerState {\n if (!existsSync(stateFile)) {\n return { contexts: [] }\n }\n\n return openCodeWorkerStateSchema.parse(JSON.parse(readFileSync(stateFile, 'utf8')))\n}\n\nexport function writeOpenCodeWorkerState(stateFile: string, state: OpenCodeWorkerState) {\n mkdirSync(dirname(stateFile), { recursive: true })\n writeFileSync(stateFile, `${JSON.stringify(state, null, 2)}\\n`, 'utf8')\n}\n\nexport async function runOpenCodeWorkerSetup(\n dependencies: RunOpenCodeWorkerSetupDependencies,\n prompter: OpenCodeWorkerPrompter,\n input?: OpenCodeWorkerSetupInput,\n): Promise<OpenCodeWorkerSetupResult> {\n const homeDir = dependencies.homeDir\n const serverUrlPrompt = renderCliPrompt('cli.opencode-worker.server-url', undefined)\n const serverUrl = await resolveTextInput(\n input?.serverUrl,\n prompter,\n {\n message: serverUrlPrompt.message,\n placeholder: serverUrlPrompt.placeholder,\n validate: requiredString('serverUrl'),\n },\n )\n const emailPrompt = renderCliPrompt('cli.opencode-worker.email', undefined)\n const email = await resolveTextInput(\n input?.email,\n prompter,\n {\n message: emailPrompt.message,\n placeholder: emailPrompt.placeholder,\n validate: requiredString('email'),\n },\n )\n const workerIdPrompt = renderCliPrompt('cli.opencode-worker.worker-id', undefined)\n const workerId = await resolveTextInput(\n input?.workerId,\n prompter,\n {\n message: workerIdPrompt.message,\n placeholder: workerIdPrompt.placeholder,\n validate: requiredString('workerId'),\n },\n )\n const capabilitySummaryPrompt = renderCliPrompt('cli.opencode-worker.capability-summary', undefined)\n const capabilitySummary = await resolveTextInput(\n input?.capabilitySummary,\n prompter,\n {\n message: capabilitySummaryPrompt.message,\n placeholder: capabilitySummaryPrompt.placeholder,\n validate: requiredString('capabilitySummary'),\n },\n )\n const defaultWorkspacePrompt = renderCliPrompt('cli.opencode-worker.default-workspace', undefined)\n const defaultWorkspace = await resolveTextInput(\n input?.defaultWorkspace,\n prompter,\n {\n message: defaultWorkspacePrompt.message,\n placeholder: defaultWorkspacePrompt.placeholder,\n validate: validateDirectory('defaultWorkspace'),\n },\n )\n const permissionPresetPrompt = renderCliPrompt('cli.opencode-worker.permission-preset', undefined)\n const permissionPreset = await resolveSelectInput(\n input?.permissionPreset,\n prompter,\n {\n message: permissionPresetPrompt.message,\n options: [\n { value: 'safe', label: 'safe' },\n { value: 'default', label: 'default' },\n { value: 'full-access', label: 'full-access' },\n ],\n initialValue: 'default',\n },\n )\n const modelSelectionPrompt = renderCliPrompt('cli.opencode-worker.model-selection', undefined)\n const modelSelection = await resolveTextInput(\n input?.modelSelection,\n prompter,\n {\n message: modelSelectionPrompt.message,\n placeholder: modelSelectionPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('modelSelection'),\n },\n )\n const variantPrompt = renderCliPrompt('cli.opencode-worker.variant', undefined)\n const variantDefault = await resolveTextInput(\n input?.variantDefault,\n prompter,\n {\n message: variantPrompt.message,\n placeholder: variantPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('variantDefault'),\n },\n )\n const agentPrompt = renderCliPrompt('cli.opencode-worker.agent', undefined)\n const agentDefault = await resolveTextInput(\n input?.agentDefault,\n prompter,\n {\n message: agentPrompt.message,\n placeholder: agentPrompt.placeholder,\n initialValue: 'use-opencode-default',\n validate: requiredString('agentDefault'),\n },\n )\n\n const repoMappings = input?.repoMappings\n ? { ...input.repoMappings }\n : await promptRepoMappings(prompter, defaultWorkspace)\n const hasArtifactStagingRoot = input?.artifactStagingRoot !== undefined\n const artifactStagingRoot = input?.artifactStagingRoot?.trim()\n\n const result = openCodeWorkerConfigSchema.parse({\n serverUrl: serverUrl.trim(),\n email: email.trim(),\n workerId: workerId.trim(),\n capabilitySummary: capabilitySummary.trim(),\n defaultWorkspace: defaultWorkspace.trim(),\n ...(hasArtifactStagingRoot ? { artifactStagingRoot } : {}),\n repoMappings,\n enabled: input?.enabled ?? true,\n permissionPreset,\n modelSelection,\n variantDefault,\n agentDefault,\n openCodeShell: input?.openCodeShell ?? false,\n })\n\n writeOpenCodeWorkerConfig(result, { homeDir })\n dependencies.logger.info(\n `Configured OpenCode worker ${result.workerId} at ${resolveOpenCodeWorkerConfigFile(result.workerId, { homeDir })}`,\n )\n\n return result\n}\n\nexport function listOpenCodeWorkerConfigs(\n options: ResolveStoragePathsOptions = {},\n): OpenCodeWorkerListItem[] {\n const storageDir = resolveOpenCodeWorkerStorageDir(options)\n if (!existsSync(storageDir)) {\n return []\n }\n\n return readdirSync(storageDir)\n .filter(file => file.endsWith('.json') && !file.endsWith('.state.json'))\n .map((file) => {\n const workerId = file.replace(/\\.json$/, '')\n const config = loadOpenCodeWorkerConfig(workerId, options)\n\n return {\n ...config,\n configFile: resolveOpenCodeWorkerConfigFile(workerId, options),\n stateFile: resolveOpenCodeWorkerStateFile(workerId, options),\n }\n })\n .sort((left, right) => left.workerId.localeCompare(right.workerId))\n}\n\nexport function getOpenCodeWorkerDoctorReport(\n options: ResolveStoragePathsOptions = {},\n dependencies: {\n assertOpenCodeCliRuntimeContract?: (\n openCodeBin?: string,\n options?: { useShell?: boolean },\n ) => void\n } = {},\n): OpenCodeWorkerDoctorReport {\n return {\n workers: listOpenCodeWorkerConfigs(options).map((config) => {\n const runtimeErrors: string[] = []\n try {\n dependencies.assertOpenCodeCliRuntimeContract?.('opencode', {\n useShell: config.openCodeShell === true,\n })\n }\n catch (error) {\n runtimeErrors.push(error instanceof Error ? error.message : 'OpenCode CLI is unavailable')\n }\n\n return {\n ...config,\n configStatus: 'ok' as const,\n runtimeStatus: runtimeErrors.length > 0 ? 'error' as const : 'ok' as const,\n errors: runtimeErrors,\n }\n }),\n }\n}\n\nexport function setOpenCodeWorkerEnabled(\n workerId: string,\n enabled: boolean,\n options: ResolveStoragePathsOptions = {},\n) {\n const config = loadOpenCodeWorkerConfig(workerId, options)\n writeOpenCodeWorkerConfig(\n {\n ...config,\n enabled,\n },\n options,\n )\n}\n\nexport function uninstallOpenCodeWorker(\n workerId: string,\n options: ResolveStoragePathsOptions = {},\n) {\n const configFile = resolveOpenCodeWorkerConfigFile(workerId, options)\n const stateFile = resolveOpenCodeWorkerStateFile(workerId, options)\n const config = existsSync(configFile)\n ? loadOpenCodeWorkerConfig(workerId, options)\n : undefined\n const credentialFile = config\n ? resolveDefaultWorkerDeviceIdentityFile(\n config.serverUrl,\n config.workerId,\n config.email,\n options.homeDir,\n )\n : undefined\n\n const removedConfig = removeFileIfPresent(configFile)\n const removedState = removeFileIfPresent(stateFile)\n const removedCredential = credentialFile\n ? removeFileIfPresent(credentialFile)\n : false\n\n return {\n configFile,\n stateFile,\n credentialFile,\n removedConfig,\n removedState,\n removedCredential,\n }\n}\n\nexport function createClackPrompter(): OpenCodeWorkerPrompter {\n return {\n async text(params) {\n const value = await text({\n message: params.message,\n placeholder: params.placeholder,\n defaultValue: params.initialValue,\n validate: params.validate\n ? input => params.validate?.(input ?? '')\n : undefined,\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as string\n },\n async select(params) {\n const value = await select({\n message: params.message,\n initialValue: params.initialValue,\n options: params.options.map(option => ({\n value: option.value,\n label: option.label,\n })),\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as string\n },\n async confirm(params) {\n const value = await confirm({\n message: params.message,\n initialValue: params.initialValue,\n })\n const resolved = unwrapCanceledValue(value, 'OpenCode worker setup canceled')\n return resolved as boolean\n },\n }\n}\n\nfunction requiredString(field: string) {\n return (value: string) => (value.trim() ? undefined : `${field} is required`)\n}\n\nfunction validateDirectory(field: string) {\n return (value: string) => {\n const normalized = value.trim()\n if (!normalized) {\n return `${field} is required`\n }\n if (!isAbsolute(normalized)) {\n return `${field} must be an absolute path`\n }\n if (!existsSync(normalized)) {\n return `${field} does not exist`\n }\n return undefined\n }\n}\n\nfunction unwrapCanceledValue<T>(value: T, message: string) {\n if (isCancel(value)) {\n throw new Error(message)\n }\n return value\n}\n\nasync function resolveTextInput(\n providedValue: string | undefined,\n prompter: OpenCodeWorkerPrompter,\n params: {\n message: string\n placeholder?: string\n initialValue?: string\n validate?: (value: string) => string | undefined\n },\n) {\n if (providedValue !== undefined) {\n const error = params.validate?.(providedValue)\n if (error) {\n throw new Error(error)\n }\n return providedValue\n }\n\n return await prompter.text(params)\n}\n\nasync function resolveSelectInput(\n providedValue: string | undefined,\n prompter: OpenCodeWorkerPrompter,\n params: {\n message: string\n options: Array<{ value: string, label: string }>\n initialValue?: string\n },\n) {\n if (providedValue !== undefined) {\n return providedValue\n }\n\n return await prompter.select(params)\n}\n\nasync function promptRepoMappings(\n prompter: OpenCodeWorkerPrompter,\n defaultWorkspace: string,\n) {\n const repoMappings: Record<string, string> = {}\n const addFirstPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.add-first', undefined)\n let addAnotherMapping = await prompter.confirm({\n message: addFirstPrompt.message,\n initialValue: false,\n })\n\n while (addAnotherMapping) {\n const repoNamePrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.repo-name', undefined)\n const repo = await prompter.text({\n message: repoNamePrompt.message,\n placeholder: repoNamePrompt.placeholder,\n validate: requiredString('repo'),\n })\n const directoryPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.directory', {\n repo,\n defaultWorkspace,\n })\n const cwd = await prompter.text({\n message: directoryPrompt.message,\n placeholder: directoryPrompt.placeholder,\n validate: validateDirectory('cwd'),\n })\n repoMappings[repo.trim()] = cwd.trim()\n const addAnotherPrompt = renderCliPrompt('cli.opencode-worker.repo-mapping.add-another', undefined)\n addAnotherMapping = await prompter.confirm({\n message: addAnotherPrompt.message,\n initialValue: false,\n })\n }\n\n return repoMappings\n}\n\nfunction removeFileIfPresent(file: string) {\n if (!existsSync(file)) {\n return false\n }\n rmSync(file, { force: true })\n return true\n}\n","import type { Part } from '@meego-harness/worker-sdk'\n\nexport function stringifyTaskMessageParts(parts: Part[]) {\n return parts\n .map((part) => {\n if (part.type === 'text') {\n return part.text\n }\n\n if (part.type === 'data') {\n return [\n `[data${part.mimeType ? ` mimeType=${part.mimeType}` : ''}]`,\n JSON.stringify(part.data, null, 2),\n '[/data]',\n ].join('\\n')\n }\n\n return [\n '[file-ref]',\n `uri: ${part.uri}`,\n part.name ? `name: ${part.name}` : undefined,\n part.mimeType ? `mimeType: ${part.mimeType}` : undefined,\n '[/file-ref]',\n ]\n .filter(Boolean)\n .join('\\n')\n })\n .join('\\n\\n')\n .trim()\n}\n","import type { ChildProcess } from 'node:child_process'\nimport type {\n OpenCodeCliTaskExecutionRequest,\n OpenCodeCliTaskExecutionResult,\n OpenCodeCliTaskExecutorConfig,\n PermissionPreset,\n} from './types'\nimport { Buffer } from 'node:buffer'\nimport { spawn, spawnSync } from 'node:child_process'\nimport { mkdtempSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport process from 'node:process'\nimport { renderTextLlmPrompt } from '@meego-harness/prompt-registry'\n\ninterface OpenCodeShellOptions {\n useShell?: boolean\n shell?: string\n}\n\ninterface OpenCodeSpawnCommand {\n command: string\n args: string[]\n detached: boolean\n killProcessGroup: boolean\n}\n\nconst OPENCODE_PREFLIGHT_TIMEOUT_MS = 10_000\nconst OPENCODE_CONTRACT_TIMEOUT_MS = 30_000\nconst OPENCODE_MAX_BUFFER = 1024 * 1024\n\nexport class OpenCodeCliTaskExecutor {\n private readonly openCodeBin: string\n private readonly useShell: boolean\n private readonly shell: string\n private readonly spawnChild: NonNullable<OpenCodeCliTaskExecutorConfig['spawn']>\n\n constructor(config: OpenCodeCliTaskExecutorConfig = {}) {\n this.openCodeBin = config.openCodeBin ?? 'opencode'\n this.useShell = config.useShell ?? false\n this.shell = config.shell ?? process.env.SHELL ?? 'sh'\n this.spawnChild = config.spawn ?? spawn\n }\n\n async runTurn(\n request: OpenCodeCliTaskExecutionRequest,\n ): Promise<OpenCodeCliTaskExecutionResult> {\n if (request.abortSignal.aborted) {\n throw createAbortError()\n }\n\n const args = buildOpenCodeArgs(request)\n const command = buildOpenCodeSpawnCommand(this.openCodeBin, args, {\n useShell: this.useShell,\n shell: this.shell,\n })\n const child = this.spawnChild(command.command, command.args, {\n cwd: request.cwd,\n detached: command.detached,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n return await new Promise<OpenCodeCliTaskExecutionResult>((resolve, reject) => {\n let settled = false\n const stdoutChunks: Buffer[] = []\n const stderrChunks: Buffer[] = []\n\n function settle(callback: () => void) {\n if (settled) {\n return\n }\n settled = true\n request.abortSignal.removeEventListener('abort', onAbort)\n callback()\n }\n\n function onAbort() {\n killChildProcess(child, {\n killProcessGroup: command.killProcessGroup,\n })\n settle(() => reject(createAbortError()))\n }\n\n request.abortSignal.addEventListener('abort', onAbort, { once: true })\n\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n })\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))\n })\n\n child.once('error', (error) => {\n settle(() => reject(error))\n })\n\n child.once('close', (code, signal) => {\n if (request.abortSignal.aborted) {\n settle(() => reject(createAbortError()))\n return\n }\n\n const stdout = Buffer.concat(stdoutChunks).toString('utf8')\n const stderr = Buffer.concat(stderrChunks).toString('utf8')\n if (code !== 0) {\n settle(() =>\n reject(new Error(buildOpenCodeExitError({\n code,\n signal,\n stderr,\n stdout,\n }))),\n )\n return\n }\n\n try {\n const result = parseOpenCodeJsonResult(stdout, request.contextId)\n settle(() => resolve(result))\n }\n catch (error) {\n settle(() => reject(error instanceof Error ? error : new Error('Failed to parse OpenCode output')))\n }\n })\n })\n }\n}\n\nexport function assertOpenCodeCliAvailable(\n openCodeBin = 'opencode',\n run = spawnSync,\n options: OpenCodeShellOptions = {},\n) {\n for (const args of [\n ['--help'],\n ['run', '--help'],\n ]) {\n const command = buildOpenCodeSpawnCommand(openCodeBin, args, options)\n const result = run(command.command, command.args, {\n ...(command.detached ? { detached: true } : {}),\n killSignal: 'SIGTERM',\n stdio: 'ignore',\n timeout: OPENCODE_PREFLIGHT_TIMEOUT_MS,\n })\n\n if (result.error) {\n throw new Error(`Unable to execute ${openCodeBin}: ${result.error.message}`)\n }\n if (typeof result.status === 'number' && result.status !== 0) {\n throw new Error(\n `OpenCode CLI preflight failed for \"${[openCodeBin, ...args].join(' ')}\" with exit code ${String(result.status)}`,\n )\n }\n }\n}\n\nexport function assertOpenCodeCliRuntimeContract(\n openCodeBin = 'opencode',\n dependencies: {\n run?: typeof spawnSync\n createTempDir?: () => string\n useShell?: boolean\n shell?: string\n } = {},\n) {\n const run = dependencies.run ?? spawnSync\n const createTempDir\n = dependencies.createTempDir\n ?? (() => mkdtempSync(join(tmpdir(), 'meego-opencode-worker-doctor-')))\n const tempDir = createTempDir()\n const prompt = renderTextLlmPrompt('worker.opencode.runtime-contract-check', undefined).text\n const executionRequest = {\n taskId: 'doctor-contract',\n contextId: 'doctor-contract',\n cwd: tempDir,\n prompt,\n variant: 'low',\n permissionPreset: 'safe' as const,\n abortSignal: new AbortController().signal,\n }\n\n const firstResult = runOpenCodeContractCommand(\n run,\n openCodeBin,\n buildOpenCodeArgs(executionRequest),\n tempDir,\n dependencies,\n )\n const firstParsed = parseOpenCodeJsonResult(firstResult.stdout, 'doctor-contract')\n\n const resumeResult = runOpenCodeContractCommand(\n run,\n openCodeBin,\n buildOpenCodeArgs({\n ...executionRequest,\n sessionId: firstParsed.sessionId,\n }),\n tempDir,\n dependencies,\n )\n parseOpenCodeJsonResult(resumeResult.stdout, 'doctor-contract')\n}\n\nexport function buildOpenCodeArgs(\n request: OpenCodeCliTaskExecutionRequest,\n) {\n const args = [\n 'run',\n '--format',\n 'json',\n ]\n\n if (request.sessionId) {\n args.push('--session', request.sessionId)\n }\n\n if (request.model) {\n args.push('--model', request.model)\n }\n\n if (request.variant) {\n args.push('--variant', request.variant)\n }\n\n if (request.agent) {\n args.push('--agent', request.agent)\n }\n\n if (shouldSkipPermissionsForPreset(request.permissionPreset)) {\n args.push('--dangerously-skip-permissions')\n }\n\n args.push(request.prompt)\n return args\n}\n\nexport function shouldSkipPermissionsForPreset(preset: PermissionPreset) {\n return preset === 'full-access'\n}\n\nexport function createAbortError() {\n const error = new Error('OpenCode run aborted')\n error.name = 'AbortError'\n return error\n}\n\nexport function isAbortError(error: unknown) {\n return (\n (error instanceof Error && error.name === 'AbortError')\n || (error instanceof Error && /abort/i.test(error.message))\n )\n}\n\nfunction parseOpenCodeJsonResult(\n stdout: string | Buffer | null | undefined,\n contextId: string,\n): OpenCodeCliTaskExecutionResult {\n const text = Buffer.isBuffer(stdout)\n ? stdout.toString('utf8')\n : stdout ?? ''\n const trimmed = text.trim()\n if (!trimmed) {\n throw new Error(`OpenCode did not emit JSON output for context ${contextId}`)\n }\n\n const events = trimmed\n .split(/\\r?\\n/u)\n .map(line => line.trim())\n .filter(Boolean)\n .map((line) => {\n try {\n return JSON.parse(line) as {\n type?: string\n sessionID?: unknown\n part?: {\n type?: unknown\n text?: unknown\n }\n error?: unknown\n }\n }\n catch (error) {\n throw new Error(\n `OpenCode emitted invalid JSONL for context ${contextId}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n )\n }\n })\n\n const errorEvent = events.find(event => event.type === 'error')\n if (errorEvent) {\n throw new Error(`OpenCode returned an error for context ${contextId}: ${summarizeOpenCodeError(errorEvent.error)}`)\n }\n\n const sessionId = events\n .map(event => typeof event.sessionID === 'string' ? event.sessionID.trim() : '')\n .find(value => value.length > 0)\n const textParts = events\n .filter(event => event.type === 'text' && event.part?.type === 'text')\n .map(event => typeof event.part?.text === 'string' ? event.part.text.trim() : '')\n .filter(Boolean)\n if (!sessionId || textParts.length === 0) {\n throw new Error(`OpenCode returned an invalid result for context ${contextId}`)\n }\n\n return {\n text: textParts.join('\\n\\n').trim(),\n sessionId,\n }\n}\n\nfunction summarizeOpenCodeError(error: unknown) {\n if (!error || typeof error !== 'object') {\n return String(error ?? 'unknown')\n }\n\n const data = (error as { data?: unknown }).data\n if (data && typeof data === 'object' && typeof (data as { message?: unknown }).message === 'string') {\n return (data as { message: string }).message\n }\n\n if (typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message\n }\n\n if (typeof (error as { name?: unknown }).name === 'string') {\n return (error as { name: string }).name\n }\n\n return 'unknown'\n}\n\nfunction buildOpenCodeSpawnCommand(\n openCodeBin: string,\n args: string[],\n options: OpenCodeShellOptions,\n): OpenCodeSpawnCommand {\n if (!options.useShell) {\n return {\n command: openCodeBin,\n args,\n detached: false,\n killProcessGroup: false,\n }\n }\n\n return {\n command: options.shell ?? process.env.SHELL ?? 'sh',\n args: ['-ic', buildShellCommand(openCodeBin, args)],\n detached: true,\n killProcessGroup: true,\n }\n}\n\nfunction buildShellCommand(command: string, args: string[]) {\n return [command, ...args.map(quoteShellArg)].join(' ')\n}\n\nfunction quoteShellArg(value: string) {\n if (value.length === 0) {\n return '\\'\\''\n }\n\n return `'${value.replaceAll('\\'', '\\'\\\\\\'\\'')}'`\n}\n\nfunction killChildProcess(\n child: ChildProcess,\n options: { killProcessGroup: boolean },\n) {\n if (options.killProcessGroup && typeof child.pid === 'number') {\n try {\n process.kill(-child.pid, 'SIGTERM')\n return\n }\n catch {\n child.kill('SIGTERM')\n return\n }\n }\n\n child.kill('SIGTERM')\n}\n\nfunction runOpenCodeContractCommand(\n run: typeof spawnSync,\n openCodeBin: string,\n args: string[],\n cwd: string,\n options: OpenCodeShellOptions = {},\n) {\n const command = buildOpenCodeSpawnCommand(openCodeBin, args, options)\n const result = run(command.command, command.args, {\n ...(command.detached ? { detached: true } : {}),\n cwd,\n encoding: 'utf8',\n maxBuffer: OPENCODE_MAX_BUFFER,\n timeout: OPENCODE_CONTRACT_TIMEOUT_MS,\n })\n\n if (result.error) {\n throw new Error(`Unable to execute ${openCodeBin}: ${result.error.message}`)\n }\n if (typeof result.status === 'number' && result.status !== 0) {\n throw new Error(buildOpenCodeExitError({\n code: result.status,\n signal: result.signal,\n stderr: stringifyOutput(result.stderr),\n stdout: stringifyOutput(result.stdout),\n }))\n }\n\n return result\n}\n\nfunction buildOpenCodeExitError(params: {\n code: number | null\n signal: NodeJS.Signals | number | null\n stderr: string\n stdout: string\n}) {\n const base = `OpenCode exited with code ${params.code}${params.signal ? ` (${params.signal})` : ''}`\n const stderr = summarizeOutput(params.stderr)\n if (stderr) {\n return `${base}; stderr=${stderr}`\n }\n const stdout = summarizeOutput(params.stdout)\n if (stdout) {\n return `${base}; stdout=${stdout}`\n }\n return base\n}\n\nfunction summarizeOutput(value: string) {\n return value\n .split(/\\r?\\n/u)\n .map(line => line.trim())\n .filter(Boolean)\n .slice(-5)\n .join(' | ')\n}\n\nfunction stringifyOutput(value: string | Buffer | null | undefined) {\n if (typeof value === 'string') {\n return value\n }\n if (Buffer.isBuffer(value)) {\n return value.toString('utf8')\n }\n return ''\n}\n","import type { TaskMessageContext } from '@meego-harness/worker-sdk'\nimport type { ProjectNodeArtifactManifest } from './artifacts'\nimport type {\n OpenCodeCliTaskExecutionRequest,\n OpenCodeCliTaskExecutionResult,\n OpenCodeWorkerBridgeConfig,\n OpenCodeWorkerBridgeDependencies,\n OpenCodeWorkerContextBinding,\n} from './types'\nimport { existsSync, mkdirSync } from 'node:fs'\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport process from 'node:process'\nimport {\n parseManagerRunResult,\n} from '@meego-harness/manager-contract'\nimport { renderTextLlmPrompt, renderTextPrompt } from '@meego-harness/prompt-registry'\nimport { WorkerClientSDK } from '@meego-harness/worker-sdk'\nimport {\n cleanupStagedArtifact,\n prepareArtifactStagingDir,\n readStagedArtifact,\n resolveTaskArtifactStagingDir,\n StagedArtifactValidationError,\n validateArtifactManifest,\n} from './artifacts'\nimport { loadOpenCodeWorkerState, writeOpenCodeWorkerState } from './config'\nimport {\n OPENCODE_WORKER_WORKING_TEXT,\n} from './constants'\nimport { stringifyTaskMessageParts } from './parts'\nimport { createAbortError, isAbortError } from './runtime'\n\ninterface ActiveTaskExecution {\n abortController: AbortController\n canceled: boolean\n supersededByMessage: boolean\n}\n\ninterface ParsedResponseOption {\n value: string\n label: string\n responseText: string\n description?: string\n}\n\ninterface ParsedProjectNodeChildWorkItem {\n stableKey: string\n name: string\n description?: string\n}\n\ntype ParsedProjectNodeResult\n = | {\n status: 'completed'\n summary: string\n artifacts?: ProjectNodeArtifactManifest[]\n writes?: ProjectNodeWrite[]\n childWorkItems?: ParsedProjectNodeChildWorkItem[]\n }\n | {\n status: 'input_required'\n summary: string\n question: string\n reasonType?: ProjectNodeReasonType\n options?: ParsedResponseOption[]\n }\n\ntype ProjectNodeReasonType\n = | 'guidance_missing'\n | 'guidance_conflict'\n | 'project_context_missing'\n | 'project_context_conflict'\n | 'business_fact_missing'\n | 'permission_missing'\n | 'external_dependency'\n | 'unknown'\n\ntype ProjectNodeWrite = ProjectNodeSetFieldWrite | ProjectNodeUploadAttachmentWrite\n\ninterface ProjectNodeSetFieldWrite {\n kind: 'set-field'\n fieldKey: string\n value: unknown\n reason?: string\n}\n\ninterface ProjectNodeUploadAttachmentWrite {\n kind: 'upload-attachment'\n fieldKey: string\n artifactId: string\n reason?: string\n}\n\ntype MinimalTaskMessageContext = Pick<TaskMessageContext, 'task' | 'message' | 'controller'>\n\nexport class OpenCodeWorkerBridge {\n private readonly config: OpenCodeWorkerBridgeConfig\n private readonly executor: OpenCodeWorkerBridgeDependencies['executor']\n private readonly logger: OpenCodeWorkerBridgeDependencies['logger']\n private readonly client: WorkerClientSDK\n private readonly activeTasks = new Map<string, ActiveTaskExecution>()\n private readonly pendingCanceledTaskIds = new Set<string>()\n private readonly bindings = new Map<string, OpenCodeWorkerContextBinding>()\n private readonly contextQueues = new Map<string, Promise<void>>()\n private readonly stateFile: string\n\n constructor(\n config: OpenCodeWorkerBridgeConfig,\n dependencies: OpenCodeWorkerBridgeDependencies,\n ) {\n this.config = config\n this.executor = dependencies.executor\n this.logger = dependencies.logger\n this.client\n = dependencies.client\n ?? new WorkerClientSDK({\n serverUrl: config.serverUrl,\n reconnectBaseDelayMs: config.reconnectBaseDelayMs,\n reconnectMaxDelayMs: config.reconnectMaxDelayMs,\n })\n this.stateFile = config.stateFile ?? join(process.cwd(), `${config.workerId}.state.json`)\n for (const binding of loadOpenCodeWorkerState(this.stateFile).contexts) {\n this.bindings.set(binding.contextId, binding)\n }\n }\n\n async start(): Promise<this> {\n this.client.onMessage(async (context) => {\n await this.handleTaskMessage(context)\n })\n this.client.onCancel(async ({ taskId }) => {\n await this.handleTaskCancel(taskId)\n })\n this.client.onRoleChange(async (request) => {\n if (request.type === 'promote-to-manager') {\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n role: 'manager',\n managerGrant: request.managerGrant,\n capabilitySummary: this.config.capabilitySummary,\n initialAvailability: 'available',\n })\n return\n }\n\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n capabilitySummary: this.config.capabilitySummary,\n initialAvailability: 'available',\n })\n })\n\n await this.client.connect()\n await this.client.login(buildWorkerLoginPayload(this.config))\n\n return this\n }\n\n async stop(): Promise<void> {\n for (const execution of this.activeTasks.values()) {\n execution.canceled = true\n execution.abortController.abort()\n }\n\n await Promise.allSettled(this.contextQueues.values())\n\n this.activeTasks.clear()\n this.pendingCanceledTaskIds.clear()\n await this.client.disconnect()\n }\n\n private async handleTaskMessage({\n task,\n message,\n controller,\n }: TaskMessageContext) {\n this.supersedeActiveTaskExecution(task.id)\n\n const previous = this.contextQueues.get(task.contextId) ?? Promise.resolve()\n const current = previous.catch(() => undefined).then(async () => {\n await this.processTaskMessage({ task, message, controller })\n })\n this.contextQueues.set(task.contextId, current)\n\n try {\n await current\n }\n finally {\n if (this.contextQueues.get(task.contextId) === current) {\n this.contextQueues.delete(task.contextId)\n }\n }\n }\n\n private async processTaskMessage({\n task,\n message,\n controller,\n }: MinimalTaskMessageContext) {\n if (this.activeTasks.has(task.id)) {\n this.logger.warn(`Ignoring duplicate active task delivery for ${task.id}`)\n return\n }\n\n if (this.pendingCanceledTaskIds.has(task.id)) {\n this.pendingCanceledTaskIds.delete(task.id)\n return\n }\n\n const execution: ActiveTaskExecution = {\n abortController: new AbortController(),\n canceled: false,\n supersededByMessage: false,\n }\n this.activeTasks.set(task.id, execution)\n\n const requestedRepo = readOptionalStringMetadata(task.metadata, 'repo')\n const existingBinding = this.bindings.get(task.contextId)\n let binding = existingBinding\n let createdBinding = false\n let resolvedBinding: OpenCodeWorkerContextBinding | undefined\n let activeBinding: OpenCodeWorkerContextBinding | undefined\n\n try {\n if (!binding) {\n binding = this.createBinding(task.contextId, task.metadata)\n this.bindings.set(task.contextId, binding)\n this.persistState()\n createdBinding = true\n }\n else {\n const hydratedBinding = this.hydrateBindingFromMetadata(binding, task.metadata)\n if (hydratedBinding !== binding) {\n binding = hydratedBinding\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n }\n resolvedBinding = binding\n if (!resolvedBinding) {\n throw new Error(`Missing context binding for ${task.contextId}`)\n }\n const currentBinding = resolvedBinding\n activeBinding = currentBinding\n\n if (!await this.trySendTaskStatusUpdate(\n task.id,\n 'working',\n async () => await controller.working({\n parts: [\n {\n type: 'text',\n text: OPENCODE_WORKER_WORKING_TEXT,\n },\n ],\n }),\n )) {\n return\n }\n\n const managerRunInput = readManagerRunInput(task.metadata)\n const structuredProtocol = readOptionalStringMetadata(\n task.metadata,\n 'projectNodeResultProtocol',\n )\n const artifactStagingDir = structuredProtocol && !managerRunInput\n ? resolveTaskArtifactStagingDir({\n cwd: currentBinding.cwd,\n taskId: task.id,\n artifactStagingRoot: this.config.artifactStagingRoot,\n })\n : undefined\n if (artifactStagingDir) {\n await prepareArtifactStagingDir(artifactStagingDir, currentBinding.cwd)\n }\n const prompt = managerRunInput\n ? buildManagerRunPrompt(managerRunInput)\n : stringifyTaskMessageParts(message.parts)\n const promptWithArtifactInstructions = managerRunInput\n ? prompt\n : appendArtifactStagingInstructions(prompt, artifactStagingDir)\n const finalPrompt\n = createdBinding && currentBinding.planMode\n ? `${renderTextLlmPrompt('worker.opencode.plan-mode-preamble', undefined).text}\\n\\n${promptWithArtifactInstructions}`.trim()\n : promptWithArtifactInstructions\n\n const result = await this.runExecutorTurn(buildOpenCodeTaskExecutionRequest(\n task,\n finalPrompt,\n currentBinding,\n this.config,\n execution,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n return\n }\n\n if (currentBinding.sessionId !== result.sessionId) {\n currentBinding.sessionId = result.sessionId\n this.bindings.set(task.contextId, currentBinding)\n this.persistState()\n }\n\n if (managerRunInput) {\n const managerRunResult = parseManagerRunResult(\n parseJsonObjectOrThrow(result.text),\n )\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: managerRunResult.summary,\n },\n ],\n metadata: buildOpenCodeMetadata(currentBinding, requestedRepo, {\n managerRunResult,\n }),\n }),\n )\n return\n }\n\n const structuredResult = structuredProtocol\n ? await this.resolveStructuredProjectNodeResult(\n task,\n currentBinding,\n structuredProtocol,\n artifactStagingDir,\n result.text,\n execution,\n )\n : {\n status: 'completed' as const,\n summary: result.text,\n }\n\n if (structuredResult.status === 'input_required') {\n await this.trySendTaskStatusUpdate(\n task.id,\n 'input-required',\n async () => await controller.inputRequired({\n parts: [\n {\n type: 'text',\n text: structuredResult.question,\n },\n ],\n metadata: buildOpenCodeMetadata(currentBinding, requestedRepo, {\n 'openCode.summary': structuredResult.summary,\n ...(structuredResult.options\n ? {\n responseSpec: {\n required: true,\n allowedPartTypes: ['text'],\n options: structuredResult.options,\n },\n }\n : {}),\n ...(structuredResult.reasonType\n ? { projectNodeReasonType: structuredResult.reasonType }\n : {}),\n }),\n }),\n )\n return\n }\n\n await this.registerStructuredArtifacts(\n artifactStagingDir,\n currentBinding.cwd,\n structuredResult.artifacts,\n structuredResult.writes,\n controller,\n )\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'completed',\n async () => await controller.complete({\n parts: [\n {\n type: 'text',\n text: structuredResult.summary,\n },\n ],\n metadata: buildOpenCodeMetadata(\n currentBinding,\n requestedRepo,\n structuredResult.writes || structuredResult.childWorkItems\n ? {\n ...(structuredResult.writes\n ? { projectNodeWrites: structuredResult.writes }\n : {}),\n ...(structuredResult.childWorkItems\n ? { projectNodeChildWorkItems: structuredResult.childWorkItems }\n : {}),\n }\n : undefined,\n ),\n }),\n )\n }\n catch (error) {\n if (this.isTaskCanceled(task.id) || isAbortError(error)) {\n return\n }\n\n await this.trySendTaskStatusUpdate(\n task.id,\n 'failed',\n async () => await controller.fail({\n parts: [\n {\n type: 'text',\n text: error instanceof Error ? error.message : 'OpenCode run failed',\n },\n ],\n metadata: buildOpenCodeFailureMetadata(\n activeBinding,\n requestedRepo,\n this.config,\n error,\n ),\n }),\n )\n }\n finally {\n this.activeTasks.delete(task.id)\n this.pendingCanceledTaskIds.delete(task.id)\n }\n }\n\n private async trySendTaskStatusUpdate(\n taskId: string,\n targetState: 'working' | 'input-required' | 'completed' | 'failed',\n action: () => Promise<void>,\n ) {\n try {\n await action()\n return true\n }\n catch (error) {\n if (isTerminalTaskConflictError(error)) {\n this.logger.warn(\n `Ignoring stale terminal task update for ${taskId} while reporting ${targetState}: ${error.message}`,\n )\n return false\n }\n if (isWorkerConnectionClosedError(error)) {\n this.logger.warn(\n `Skipping ${targetState} update for ${taskId} because the worker connection is already closed`,\n )\n return false\n }\n throw error\n }\n }\n\n private async handleTaskCancel(taskId: string) {\n const execution = this.activeTasks.get(taskId)\n if (!execution) {\n this.pendingCanceledTaskIds.add(taskId)\n return\n }\n\n execution.canceled = true\n execution.abortController.abort()\n }\n\n private supersedeActiveTaskExecution(taskId: string) {\n const execution = this.activeTasks.get(taskId)\n if (!execution || execution.canceled || execution.supersededByMessage) {\n return\n }\n\n execution.supersededByMessage = true\n execution.abortController.abort()\n }\n\n private async runExecutorTurn(\n request: OpenCodeCliTaskExecutionRequest,\n ): Promise<OpenCodeCliTaskExecutionResult> {\n if (request.abortSignal.aborted) {\n throw createAbortError()\n }\n\n const abortedResult = { aborted: true } as const\n let abortObserved = false\n const executorPromise = this.executor.runTurn(request).catch((error) => {\n if (abortObserved && (request.abortSignal.aborted || isAbortError(error))) {\n return abortedResult\n }\n throw error\n })\n const abortPromise = new Promise<typeof abortedResult>((resolve) => {\n function onAbort() {\n request.abortSignal.removeEventListener('abort', onAbort)\n abortObserved = true\n resolve(abortedResult)\n }\n\n request.abortSignal.addEventListener('abort', onAbort, { once: true })\n void executorPromise.then(() => {\n request.abortSignal.removeEventListener('abort', onAbort)\n }, () => {\n request.abortSignal.removeEventListener('abort', onAbort)\n })\n })\n\n const result = await Promise.race([\n executorPromise,\n abortPromise,\n ])\n if ('aborted' in result) {\n throw createAbortError()\n }\n return result\n }\n\n private createBinding(\n contextId: string,\n metadata: Record<string, unknown> | undefined,\n ): OpenCodeWorkerContextBinding {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n const explicitVariant = readOptionalStringMetadata(metadata, 'openCodeVariant')\n const explicitAgent = readOptionalStringMetadata(metadata, 'openCodeAgent')\n const planMode = readOptionalBooleanMetadata(metadata, 'openCodePlanMode') ?? false\n const cwd = this.resolveCwd(repo)\n\n return {\n contextId,\n ...(repo ? { repo } : {}),\n cwd,\n variant:\n explicitVariant\n ?? (this.config.variantDefault === 'use-opencode-default'\n ? undefined\n : this.config.variantDefault),\n agent:\n explicitAgent\n ?? (this.config.agentDefault === 'use-opencode-default'\n ? undefined\n : this.config.agentDefault),\n planMode,\n }\n }\n\n private hydrateBindingFromMetadata(\n binding: OpenCodeWorkerContextBinding,\n metadata: Record<string, unknown> | undefined,\n ) {\n const repo = readOptionalStringMetadata(metadata, 'repo')\n if (binding.repo) {\n return binding\n }\n if (!repo) {\n return binding\n }\n\n return {\n ...binding,\n repo,\n cwd: this.resolveCwd(repo),\n }\n }\n\n private resolveCwd(repo: string | undefined) {\n if (!repo) {\n this.ensureDirectory(this.config.defaultWorkspace, 'default workspace directory')\n return this.config.defaultWorkspace\n }\n const mapped = this.config.repoMappings[repo]\n if (Object.keys(this.config.repoMappings).length > 0) {\n if (!mapped) {\n throw new Error(`No repo mapping configured for ${repo}`)\n }\n this.ensureDirectory(mapped, `mapped repo directory for ${repo}`)\n this.ensureWorkspaceSubdirectory(mapped, `mapped repo directory for ${repo}`)\n return mapped\n }\n\n const inferred = join(this.config.defaultWorkspace, repo)\n this.ensureDirectory(inferred, `workspace repo directory for ${repo}`)\n this.ensureWorkspaceSubdirectory(inferred, `workspace repo directory for ${repo}`)\n return inferred\n }\n\n private ensureDirectory(path: string, label: string) {\n if (!existsSync(path)) {\n throw new Error(`Missing ${label}: ${path}`)\n }\n }\n\n private ensureWorkspaceSubdirectory(path: string, label: string) {\n const workspaceRoot = resolve(this.config.defaultWorkspace)\n const candidate = resolve(path)\n const relativePath = relative(workspaceRoot, candidate)\n if (!relativePath || relativePath === '.' || relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`Expected ${label} to be a subdirectory of ${workspaceRoot}: ${candidate}`)\n }\n }\n\n private persistState() {\n mkdirSync(dirname(this.stateFile), { recursive: true })\n writeOpenCodeWorkerState(this.stateFile, {\n contexts: Array.from(this.bindings.values()),\n })\n }\n\n private isTaskCanceled(taskId: string) {\n return (\n this.activeTasks.get(taskId)?.canceled ?? this.pendingCanceledTaskIds.has(taskId)\n )\n }\n\n private async resolveStructuredProjectNodeResult(\n task: TaskMessageContext['task'],\n binding: OpenCodeWorkerContextBinding,\n protocol: string,\n artifactStagingDir: string | undefined,\n firstText: string,\n execution: ActiveTaskExecution,\n ): Promise<ParsedProjectNodeResult> {\n const firstParsed = parseProjectNodeResult(protocol, firstText)\n if (firstParsed) {\n return firstParsed\n }\n\n const retryResult = await this.runExecutorTurn(buildOpenCodeTaskExecutionRequest(\n task,\n buildStructuredRetryPrompt(protocol, artifactStagingDir),\n binding,\n this.config,\n execution,\n ))\n\n if (this.isTaskCanceled(task.id)) {\n throw new Error('task canceled before structured retry completed')\n }\n\n if (binding.sessionId !== retryResult.sessionId) {\n binding.sessionId = retryResult.sessionId\n this.bindings.set(task.contextId, binding)\n this.persistState()\n }\n\n const retryParsed = parseProjectNodeResult(protocol, retryResult.text)\n if (retryParsed) {\n return retryParsed\n }\n\n throw new Error('OpenCode returned an invalid structured result after one retry')\n }\n\n private async registerStructuredArtifacts(\n artifactStagingDir: string | undefined,\n artifactBoundaryDir: string,\n manifests: ProjectNodeArtifactManifest[] | undefined,\n writes: ProjectNodeWrite[] | undefined,\n controller: MinimalTaskMessageContext['controller'],\n ) {\n const attachmentWrites = writes?.filter(isProjectNodeAttachmentWrite) ?? []\n if (!manifests?.length && attachmentWrites.length === 0) {\n return\n }\n\n const manifestById = new Map<string, ProjectNodeArtifactManifest>()\n for (const manifest of manifests ?? []) {\n manifestById.set(manifest.artifactId, manifest)\n }\n for (const write of attachmentWrites) {\n if (!manifestById.has(write.artifactId)) {\n throw createAttachmentArtifactNotFoundError(write.artifactId)\n }\n }\n if (!artifactStagingDir) {\n throw createAttachmentArtifactNotFoundError(attachmentWrites[0]!.artifactId)\n }\n\n try {\n validateArtifactManifest(manifests ?? [])\n }\n catch (error) {\n if (error instanceof StagedArtifactValidationError) {\n throw createAttachmentArtifactSourceInvalidError(error.artifactId)\n }\n throw error\n }\n\n for (const manifest of manifests ?? []) {\n let artifact\n try {\n artifact = await readStagedArtifact(artifactStagingDir, manifest, artifactBoundaryDir)\n }\n catch (error) {\n if (error instanceof StagedArtifactValidationError) {\n throw createAttachmentArtifactSourceInvalidError(manifest.artifactId)\n }\n throw error\n }\n\n await controller.addArtifact(artifact)\n await cleanupStagedArtifact(artifactStagingDir, manifest, artifactBoundaryDir).catch((error) => {\n this.logger.warn(\n `Failed to clean staged artifact ${manifest.artifactId}: ${error instanceof Error ? error.message : String(error)}`,\n )\n })\n }\n }\n}\n\nfunction isProjectNodeAttachmentWrite(write: ProjectNodeWrite): write is ProjectNodeUploadAttachmentWrite {\n return write.kind === 'upload-attachment'\n}\n\nfunction createAttachmentArtifactNotFoundError(artifactId: string) {\n return new Error(renderTextPrompt('sdk.runtime-error.message', {\n errorCode: 'work-item-attachment-artifact-not-found',\n artifactId,\n }).text)\n}\n\nfunction createAttachmentArtifactSourceInvalidError(artifactId: string) {\n return new Error(renderTextPrompt('sdk.runtime-error.message', {\n errorCode: 'work-item-attachment-source-invalid',\n artifactId,\n }).text)\n}\n\nfunction buildWorkerLoginPayload(\n config: OpenCodeWorkerBridgeConfig,\n) {\n return {\n workerId: config.workerId,\n email: config.email,\n capabilitySummary: config.capabilitySummary,\n initialAvailability: 'available' as const,\n }\n}\n\nfunction buildOpenCodeMetadata(\n binding: OpenCodeWorkerContextBinding,\n requestedRepo?: string,\n extraMetadata?: Record<string, unknown>,\n) {\n return {\n 'openCode.sessionId': binding.sessionId,\n 'openCode.cwd': binding.cwd,\n ...(binding.repo ? { 'openCode.repo': binding.repo } : {}),\n ...(requestedRepo ? { 'openCode.requestedRepo': requestedRepo } : {}),\n ...(binding.variant\n ? { 'openCode.variant': binding.variant }\n : {}),\n ...(binding.agent\n ? { 'openCode.agent': binding.agent }\n : {}),\n 'openCode.planMode': binding.planMode,\n ...(extraMetadata ? structuredClone(extraMetadata) : {}),\n }\n}\n\nfunction buildOpenCodeFailureMetadata(\n binding: OpenCodeWorkerContextBinding | undefined,\n requestedRepo: string | undefined,\n config: OpenCodeWorkerBridgeConfig,\n error: unknown,\n) {\n const baseMetadata = binding\n ? buildOpenCodeMetadata(binding, requestedRepo)\n : {}\n const failureReason = readOpenCodeFailureReason(error)\n\n return {\n ...baseMetadata,\n 'openCode.modelSelection': config.modelSelection,\n 'openCode.effectiveModel':\n config.modelSelection === 'use-opencode-default'\n ? 'opencode-default'\n : config.modelSelection,\n 'openCode.permissionPreset': config.permissionPreset,\n ...(config.variantDefault !== 'use-opencode-default'\n ? { 'openCode.defaultVariant': config.variantDefault }\n : {}),\n ...(config.agentDefault !== 'use-opencode-default'\n ? { 'openCode.defaultAgent': config.agentDefault }\n : {}),\n ...(failureReason ? { 'openCode.failureReason': failureReason } : {}),\n }\n}\n\nfunction buildOpenCodeTaskExecutionRequest(\n task: TaskMessageContext['task'],\n prompt: string,\n binding: OpenCodeWorkerContextBinding,\n config: OpenCodeWorkerBridgeConfig,\n execution: ActiveTaskExecution,\n) {\n return {\n taskId: task.id,\n contextId: task.contextId,\n cwd: binding.cwd,\n prompt,\n sessionId: binding.sessionId,\n model:\n config.modelSelection === 'use-opencode-default'\n ? undefined\n : config.modelSelection,\n variant: binding.variant,\n agent: binding.agent,\n permissionPreset: config.permissionPreset,\n abortSignal: execution.abortController.signal,\n }\n}\n\nfunction appendArtifactStagingInstructions(\n prompt: string,\n artifactStagingDir: string | undefined,\n) {\n if (!artifactStagingDir) {\n return prompt\n }\n const instructions = renderTextLlmPrompt('worker.opencode.artifact-staging-instructions', {\n artifactStagingDir,\n }).text\n return `${prompt}\\n\\n${instructions}`.trim()\n}\n\nfunction buildStructuredRetryPrompt(_protocol: string, artifactStagingDir: string | undefined) {\n return renderTextLlmPrompt(\n 'worker.opencode.structured-retry',\n artifactStagingDir ? { artifactStagingDir } : undefined,\n ).text\n}\n\nfunction buildManagerRunPrompt(\n input: Record<string, unknown>,\n) {\n return renderTextLlmPrompt('worker.opencode.manager-run', {\n managerRunInput: input,\n }).text\n}\n\nfunction isTerminalTaskConflictError(error: unknown): error is Error {\n return error instanceof Error\n && (\n error.message.includes('task is already terminal')\n || error.message.includes('cannot continue a terminal task')\n )\n}\n\nfunction isWorkerConnectionClosedError(error: unknown): error is Error {\n return error instanceof Error && error.message.includes('WebSocket is not connected')\n}\n\nfunction parseProjectNodeResult(\n protocol: string,\n text: string,\n): ParsedProjectNodeResult | null {\n const parsed = parseProjectNodeResultObject(text)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null\n }\n\n if ('status' in parsed) {\n const status = normalizeStatus((parsed as { status?: unknown }).status)\n const summary = normalizeSummary((parsed as { summary?: unknown }).summary)\n if (!status || !summary) {\n return null\n }\n\n if (status === 'completed') {\n const writes = normalizeProjectNodeWrites(\n (parsed as { projectNodeWrites?: unknown }).projectNodeWrites\n ?? (parsed as { writes?: unknown }).writes,\n )\n if (writes === null) {\n return null\n }\n const artifacts = normalizeProjectNodeArtifacts((parsed as { artifacts?: unknown }).artifacts)\n if (artifacts === null) {\n return null\n }\n const childWorkItems = normalizeProjectNodeChildWorkItems(\n (parsed as { childWorkItems?: unknown }).childWorkItems,\n )\n return {\n status,\n summary,\n ...(artifacts && artifacts.length > 0 ? { artifacts } : {}),\n ...(writes && writes.length > 0 ? { writes } : {}),\n ...(childWorkItems && childWorkItems.length > 0 ? { childWorkItems } : {}),\n }\n }\n\n const question = normalizeSummary((parsed as { question?: unknown }).question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(\n (parsed as { reasonType?: unknown }).reasonType,\n ) ?? undefined\n const options = normalizeResponseOptions(\n (parsed as { options?: unknown }).options,\n )\n return {\n status,\n summary,\n question,\n ...(options ? { options } : {}),\n ...(reasonType ? { reasonType } : {}),\n }\n }\n\n const choice = normalizeChoicePrefixedResult(parsed as Record<string, unknown>)\n if (!choice) {\n return null\n }\n return choice\n}\n\nfunction readManagerRunInput(\n metadata: Record<string, unknown> | undefined,\n) {\n const input = metadata?.managerRunInput\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\n return null\n }\n\n return structuredClone(input) as Record<string, unknown>\n}\n\nfunction readOpenCodeFailureReason(error: unknown) {\n if (!(error instanceof Error)) {\n return undefined\n }\n\n const explicitReason = error.message.match(/;\\s*reason=([^;]+)/u)?.[1]?.trim()\n if (explicitReason) {\n return explicitReason\n }\n\n if (/context window/i.test(error.message)) {\n return 'context_window_exceeded'\n }\n\n return undefined\n}\n\nfunction parseJsonObjectOrThrow(text: string) {\n const parsed = parseProjectNodeResultObject(text)\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error('OpenCode returned an invalid manager run result')\n }\n\n return parsed\n}\n\nfunction parseProjectNodeResultObject(text: string) {\n const trimmed = text.trim()\n if (!trimmed) {\n return null\n }\n\n const jsonText = unwrapJsonCodeFence(trimmed) ?? trimmed\n try {\n return JSON.parse(jsonText) as unknown\n }\n catch {\n const matched = jsonText.match(/^([12])\\s+(\\{[\\s\\S]+\\})$/)\n if (!matched) {\n return null\n }\n\n try {\n return {\n choice: matched[1],\n ...(JSON.parse(matched[2]) as Record<string, unknown>),\n }\n }\n catch {\n return null\n }\n }\n}\n\nfunction unwrapJsonCodeFence(text: string) {\n if (!text.startsWith('```') || !text.endsWith('```')) {\n return null\n }\n\n const inner = text.slice(3, -3)\n const normalizedInner = inner.startsWith('\\r\\n')\n ? inner.slice(2)\n : inner.startsWith('\\n')\n ? inner.slice(1)\n : inner\n const newlineIndex = normalizedInner.search(/\\r?\\n/u)\n if (newlineIndex < 0) {\n return null\n }\n\n const header = normalizedInner.slice(0, newlineIndex).trim().toLowerCase()\n if (header && header !== 'json') {\n return null\n }\n\n return normalizedInner.slice(newlineIndex + 1).trim()\n}\n\nfunction normalizeStatus(value: unknown) {\n if (value === 'completed' || value === 'input_required') {\n return value\n }\n return null\n}\n\nfunction normalizeSummary(value: unknown) {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : null\n}\n\nfunction normalizeChoicePrefixedResult(\n parsed: Record<string, unknown>,\n): ParsedProjectNodeResult | null {\n const choice = parsed.choice\n const summary = normalizeSummary(parsed.summary)\n if (!summary || (choice !== '1' && choice !== '2')) {\n return null\n }\n\n if (choice === '1') {\n return {\n status: 'completed',\n summary,\n }\n }\n\n const question = normalizeSummary(parsed.question)\n if (!question) {\n return null\n }\n const reasonType = normalizeProjectNodeReasonType(parsed.reasonType) ?? undefined\n\n return {\n status: 'input_required',\n summary,\n question,\n ...(reasonType ? { reasonType } : {}),\n }\n}\n\nfunction normalizeResponseOptions(\n value: unknown,\n): ParsedResponseOption[] | undefined {\n if (!Array.isArray(value) || value.length === 0) {\n return undefined\n }\n\n const normalized: ParsedResponseOption[] = []\n const seenValues = new Set<string>()\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return undefined\n }\n\n const optionValue = normalizeSummary((item as { value?: unknown }).value)\n const label = normalizeSummary((item as { label?: unknown }).label)\n const responseText = normalizeSummary((item as { responseText?: unknown }).responseText)\n const description = normalizeSummary((item as { description?: unknown }).description)\n if (!optionValue || !label || !responseText || seenValues.has(optionValue)) {\n return undefined\n }\n\n seenValues.add(optionValue)\n normalized.push({\n value: optionValue,\n label,\n responseText,\n ...(description ? { description } : {}),\n })\n }\n\n return normalized.length > 0 ? normalized : undefined\n}\n\nfunction normalizeProjectNodeWrites(value: unknown): ProjectNodeWrite[] | null | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n if (!Array.isArray(value)) {\n return null\n }\n\n const writes: ProjectNodeWrite[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return null\n }\n\n const record = item as Record<string, unknown>\n const fieldKey = normalizeSummary(record.fieldKey)\n const reason = normalizeSummary(record.reason) ?? undefined\n if (!fieldKey) {\n return null\n }\n\n if (record.kind === 'set-field') {\n if (record.value === undefined || record.value === null) {\n return null\n }\n writes.push({\n kind: 'set-field',\n fieldKey,\n value: structuredClone(record.value),\n ...(reason ? { reason } : {}),\n })\n continue\n }\n\n if (record.kind === 'upload-attachment') {\n const artifactId = normalizeSummary(record.artifactId)\n if (!artifactId) {\n return null\n }\n writes.push({\n kind: 'upload-attachment',\n fieldKey,\n artifactId,\n ...(reason ? { reason } : {}),\n })\n continue\n }\n\n return null\n }\n\n return writes\n}\n\nfunction normalizeProjectNodeChildWorkItems(value: unknown): ParsedProjectNodeChildWorkItem[] | undefined {\n if (!Array.isArray(value)) {\n return undefined\n }\n\n const childWorkItems = value.flatMap((item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return []\n }\n\n const record = item as Record<string, unknown>\n const stableKey = normalizeSummary(record.stableKey)\n const name = normalizeSummary(record.name)\n const description = normalizeSummary(record.description) ?? undefined\n if (!stableKey || !name) {\n return []\n }\n\n return [{\n stableKey,\n name,\n ...(description ? { description } : {}),\n }]\n })\n\n return childWorkItems\n}\n\nfunction normalizeProjectNodeArtifacts(\n value: unknown,\n): ProjectNodeArtifactManifest[] | null | undefined {\n if (value === undefined || value === null) {\n return undefined\n }\n if (!Array.isArray(value)) {\n return null\n }\n\n const artifacts: ProjectNodeArtifactManifest[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return null\n }\n\n const record = item as Record<string, unknown>\n const artifactId = normalizeSummary(record.artifactId)\n const fileName = normalizeSummary(record.fileName)\n if (!artifactId || !fileName) {\n return null\n }\n if ('mimeType' in record && typeof record.mimeType !== 'string') {\n return null\n }\n\n artifacts.push({\n artifactId,\n fileName,\n ...(typeof record.mimeType === 'string' ? { mimeType: record.mimeType } : {}),\n })\n }\n\n return artifacts\n}\n\nfunction normalizeProjectNodeReasonType(\n value: unknown,\n): ProjectNodeReasonType | null {\n return value === 'guidance_missing'\n || value === 'guidance_conflict'\n || value === 'project_context_missing'\n || value === 'project_context_conflict'\n || value === 'business_fact_missing'\n || value === 'permission_missing'\n || value === 'external_dependency'\n || value === 'unknown'\n ? value\n : null\n}\n\nfunction readOptionalStringMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n const value = metadata[key]\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${key} must be a non-empty string`)\n }\n return value.trim()\n}\n\nfunction readOptionalBooleanMetadata(\n metadata: Record<string, unknown> | undefined,\n key: string,\n) {\n if (!metadata || !(key in metadata) || metadata[key] == null) {\n return undefined\n }\n const value = metadata[key]\n if (typeof value !== 'boolean') {\n throw new TypeError(`${key} must be a boolean`)\n }\n return value\n}\n","import type { ArtifactInput } from '@meego-harness/worker-sdk'\nimport { lstat, mkdir, readFile, rm } from 'node:fs/promises'\nimport { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'\n\nexport const DEFAULT_ARTIFACT_STAGING_ROOT = 'artifacts'\nexport const MAX_STAGED_ARTIFACT_BYTES = 20 * 1024 * 1024\n\n// Keep the identifier contract explicit for staged artifact boundary checks.\n// eslint-disable-next-line regexp/prefer-w\nconst SAFE_IDENTIFIER_PATTERN = /^[A-Za-z0-9._-]+$/u\n\nexport interface ProjectNodeArtifactManifest {\n artifactId: string\n fileName: string\n mimeType?: string\n}\n\nexport interface ResolveArtifactStagingInput {\n cwd: string\n taskId: string\n artifactStagingRoot?: string\n}\n\nexport class StagedArtifactValidationError extends Error {\n readonly artifactId: string\n\n constructor(artifactId: string, message: string) {\n super(message)\n this.name = 'StagedArtifactValidationError'\n this.artifactId = artifactId\n }\n}\n\nexport function resolveTaskArtifactStagingDir(input: ResolveArtifactStagingInput) {\n assertSafeIdentifier(input.taskId, 'taskId')\n\n const cwd = resolve(input.cwd)\n const rootInput = input.artifactStagingRoot ?? DEFAULT_ARTIFACT_STAGING_ROOT\n const root = isAbsolute(rootInput)\n ? resolve(rootInput)\n : resolve(cwd, rootInput)\n const rootRelativePath = relative(cwd, root)\n if (rootRelativePath.startsWith('..') || isAbsolute(rootRelativePath)) {\n throw new Error(`artifactStagingRoot must resolve inside cwd: ${root}`)\n }\n\n return join(root, input.taskId)\n}\n\nexport async function prepareArtifactStagingDir(\n artifactStagingDir: string,\n boundaryDir = dirname(dirname(artifactStagingDir)),\n) {\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n await rm(artifactStagingDir, { recursive: true, force: true })\n await mkdir(artifactStagingDir, { recursive: true })\n}\n\nexport function validateArtifactManifest(manifests: ProjectNodeArtifactManifest[]) {\n const artifactIds = new Set<string>()\n for (const manifest of manifests) {\n validateSingleArtifactManifest(manifest)\n if (artifactIds.has(manifest.artifactId)) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `duplicate staged artifact id: ${manifest.artifactId}`,\n )\n }\n artifactIds.add(manifest.artifactId)\n }\n}\n\nexport async function readStagedArtifact(\n artifactStagingDir: string,\n manifest: ProjectNodeArtifactManifest,\n boundaryDir: string,\n): Promise<ArtifactInput> {\n validateSingleArtifactManifest(manifest)\n\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n const artifactDir = join(artifactStagingDir, manifest.artifactId)\n const file = join(artifactStagingDir, manifest.artifactId, manifest.fileName)\n const artifactDirStat = await lstat(artifactDir).catch(() => {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `missing staged artifact directory: ${manifest.artifactId}`,\n )\n })\n if (artifactDirStat.isSymbolicLink() || !artifactDirStat.isDirectory()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact directory: ${manifest.artifactId}`,\n )\n }\n\n let fileStat\n try {\n fileStat = await lstat(file)\n }\n catch {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `missing staged artifact file: ${manifest.fileName}`,\n )\n }\n\n if (\n fileStat.isSymbolicLink()\n || !fileStat.isFile()\n || fileStat.size === 0\n || fileStat.size > MAX_STAGED_ARTIFACT_BYTES\n ) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact file: ${manifest.fileName}`,\n )\n }\n\n const data = await readFile(file)\n\n return {\n artifactId: manifest.artifactId,\n name: manifest.fileName,\n parts: [\n {\n type: 'data',\n data: {\n base64: data.toString('base64'),\n fileName: manifest.fileName,\n },\n ...(manifest.mimeType ? { mimeType: manifest.mimeType } : {}),\n },\n ],\n }\n}\n\nexport async function cleanupStagedArtifact(\n artifactStagingDir: string,\n manifest: ProjectNodeArtifactManifest,\n boundaryDir: string,\n) {\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n const artifactDir = join(artifactStagingDir, manifest.artifactId)\n await assertStagedArtifactDirectory(artifactDir, manifest)\n await assertStagedArtifactFile(join(artifactDir, manifest.fileName), manifest)\n await rm(join(artifactDir, manifest.fileName), { force: true })\n await assertExistingPathComponentsAreNotSymlinks(artifactStagingDir, boundaryDir)\n await assertStagedArtifactDirectory(artifactDir, manifest)\n await rm(artifactDir, { recursive: false }).catch(ignoreNonEmptyDirectoryError)\n await assertExistingPathIsNotSymlink(artifactStagingDir, manifest.artifactId, 'artifactStagingDir')\n await rm(artifactStagingDir, { recursive: false }).catch(ignoreNonEmptyDirectoryError)\n}\n\nfunction validateSingleArtifactManifest(manifest: ProjectNodeArtifactManifest) {\n assertSafeIdentifier(manifest.artifactId, 'artifactId')\n assertSafeFileName(manifest.artifactId, manifest.fileName)\n if (manifest.mimeType !== undefined && manifest.mimeType.trim().length === 0) {\n throw new StagedArtifactValidationError(manifest.artifactId, 'staged artifact mimeType is empty')\n }\n}\n\nfunction assertSafeIdentifier(value: string, label: string) {\n if (value === '.' || value === '..' || !SAFE_IDENTIFIER_PATTERN.test(value)) {\n throw new StagedArtifactValidationError(value, `unsafe staged artifact ${label}: ${value}`)\n }\n}\n\nfunction assertSafeFileName(artifactId: string, fileName: string) {\n if (fileName.length === 0 || fileName !== basename(fileName) || fileName.includes('..')) {\n throw new StagedArtifactValidationError(artifactId, `unsafe staged artifact fileName: ${fileName}`)\n }\n}\n\nasync function assertExistingPathComponentsAreNotSymlinks(path: string, boundaryDir: string) {\n const resolvedPath = resolve(path)\n const resolvedBoundary = resolve(boundaryDir)\n const relativePath = relative(resolvedBoundary, resolvedPath)\n if (relativePath.startsWith('..') || isAbsolute(relativePath)) {\n throw new Error(`staged artifact path must stay inside boundary: ${resolvedPath}`)\n }\n\n await assertExistingPathIsNotSymlink(resolvedBoundary, resolvedBoundary, 'path component')\n const relativeParts = relativePath.split(sep).filter(Boolean)\n let currentPath = resolvedBoundary\n for (const part of relativeParts) {\n currentPath = join(currentPath, part)\n await assertExistingPathIsNotSymlink(currentPath, currentPath, 'path component')\n }\n}\n\nasync function assertExistingPathIsNotSymlink(path: string, artifactId: string, label: string) {\n const pathStat = await lstat(path).catch((error) => {\n if (isNodeError(error) && error.code === 'ENOENT') {\n return undefined\n }\n throw error\n })\n if (pathStat?.isSymbolicLink()) {\n throw new StagedArtifactValidationError(artifactId, `staged artifact ${label} is a symlink: ${path}`)\n }\n}\n\nasync function assertStagedArtifactDirectory(\n artifactDir: string,\n manifest: ProjectNodeArtifactManifest,\n) {\n const artifactDirStat = await lstat(artifactDir)\n if (artifactDirStat.isSymbolicLink() || !artifactDirStat.isDirectory()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact directory: ${manifest.artifactId}`,\n )\n }\n}\n\nasync function assertStagedArtifactFile(\n file: string,\n manifest: ProjectNodeArtifactManifest,\n) {\n const fileStat = await lstat(file)\n if (fileStat.isSymbolicLink() || !fileStat.isFile()) {\n throw new StagedArtifactValidationError(\n manifest.artifactId,\n `invalid staged artifact file: ${manifest.fileName}`,\n )\n }\n}\n\nfunction ignoreNonEmptyDirectoryError(error: unknown) {\n if (!isNodeError(error) || (error.code !== 'ENOTEMPTY' && error.code !== 'EEXIST')) {\n throw error\n }\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && 'code' in error\n}\n"],"mappings":"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","names":["join","resolve","text","existsSync","mkdirSync","dirname","isAbsolute","join","relative","resolve","process","renderTextLlmPrompt","dirname","isAbsolute","join","join","process","renderTextLlmPrompt","resolve","existsSync","relative","isAbsolute","mkdirSync","dirname","text"]}
|