@meego-harness/opencode-worker 0.7.0 → 0.7.3

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.
@@ -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 defaultWorkspace = await resolveTextInput(
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 ? { ...input.repoMappings } : await promptRepoMappings(prompter, defaultWorkspace);
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-MHUUIVXW.js.map
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
@@ -11,7 +11,7 @@ import {
11
11
  runOpenCodeWorkerSetup,
12
12
  setOpenCodeWorkerEnabled,
13
13
  uninstallOpenCodeWorker
14
- } from "./chunk-MHUUIVXW.js";
14
+ } from "./chunk-6QMCHYTQ.js";
15
15
 
16
16
  // src/cli.ts
17
17
  import { spawn, spawnSync } from "child_process";
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
@@ -23,7 +23,7 @@ import {
23
23
  uninstallOpenCodeWorker,
24
24
  writeOpenCodeWorkerConfig,
25
25
  writeOpenCodeWorkerState
26
- } from "./chunk-MHUUIVXW.js";
26
+ } from "./chunk-6QMCHYTQ.js";
27
27
  export {
28
28
  OPENCODE_WORKER_CONFIG_DIR,
29
29
  OPENCODE_WORKER_WORKING_TEXT,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meego-harness/opencode-worker",
3
3
  "type": "module",
4
- "version": "0.7.0",
4
+ "version": "0.7.3",
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.7.0",
136
- "@meego-harness/prompt-registry": "^0.7.0",
137
- "@meego-harness/worker-sdk": "^0.7.0"
185
+ "@meego-harness/manager-contract": "^0.7.3",
186
+ "@meego-harness/prompt-registry": "^0.7.3",
187
+ "@meego-harness/worker-sdk": "^0.7.3"
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"]}