@meego-harness/opencode-worker 0.6.1 → 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.
package/README.md CHANGED
@@ -55,7 +55,7 @@ The worker runs tasks with `opencode run --format json`. `--permission-preset fu
55
55
 
56
56
  ## Operational Notes
57
57
 
58
- - The worker role is fixed to `coder`.
58
+ - The worker server treats this bridge as a normal `worker`.
59
59
  - One OpenCode session is reused per harness `contextId`.
60
60
  - Task cancellation aborts the active OpenCode process when possible.
61
61
  - Repo routing follows the same rules as `codex-worker`: absent `repo` uses the default workspace, empty mappings infer `<workspace>/<repo>`, and non-empty mappings require an explicit match.
@@ -1,5 +1,4 @@
1
1
  // src/constants.ts
2
- var OPENCODE_WORKER_ROLE = "coder";
3
2
  var OPENCODE_WORKER_WORKING_TEXT = "OpenCode CLI is working";
4
3
  var OPENCODE_WORKER_CONFIG_DIR = ".meego-harness/opencode-worker";
5
4
 
@@ -121,15 +120,16 @@ async function runOpenCodeWorkerSetup(dependencies, prompter, input) {
121
120
  }
122
121
  );
123
122
  const defaultWorkspacePrompt = renderCliPrompt("cli.opencode-worker.default-workspace", void 0);
124
- const defaultWorkspace = await resolveTextInput(
123
+ const defaultWorkspaceInput = await resolveTextInput(
125
124
  input?.defaultWorkspace,
126
125
  prompter,
127
126
  {
128
127
  message: defaultWorkspacePrompt.message,
129
128
  placeholder: defaultWorkspacePrompt.placeholder,
130
- validate: validateDirectory("defaultWorkspace")
129
+ validate: validateDirectory("defaultWorkspace", homeDir)
131
130
  }
132
131
  );
132
+ const defaultWorkspace = expandHomePath(defaultWorkspaceInput, homeDir);
133
133
  const permissionPresetPrompt = renderCliPrompt("cli.opencode-worker.permission-preset", void 0);
134
134
  const permissionPreset = await resolveSelectInput(
135
135
  input?.permissionPreset,
@@ -177,7 +177,7 @@ async function runOpenCodeWorkerSetup(dependencies, prompter, input) {
177
177
  validate: requiredString("agentDefault")
178
178
  }
179
179
  );
180
- const repoMappings = input?.repoMappings ? { ...input.repoMappings } : await promptRepoMappings(prompter, defaultWorkspace);
180
+ const repoMappings = input?.repoMappings ? normalizeRepoMappings(input.repoMappings, homeDir) : await promptRepoMappings(prompter, defaultWorkspace, homeDir);
181
181
  const hasArtifactStagingRoot = input?.artifactStagingRoot !== void 0;
182
182
  const artifactStagingRoot = input?.artifactStagingRoot?.trim();
183
183
  const result = openCodeWorkerConfigSchema.parse({
@@ -305,9 +305,9 @@ function createClackPrompter() {
305
305
  function requiredString(field) {
306
306
  return (value) => value.trim() ? void 0 : `${field} is required`;
307
307
  }
308
- function validateDirectory(field) {
308
+ function validateDirectory(field, homeDir) {
309
309
  return (value) => {
310
- const normalized = value.trim();
310
+ const normalized = expandHomePath(value.trim(), homeDir);
311
311
  if (!normalized) {
312
312
  return `${field} is required`;
313
313
  }
@@ -320,6 +320,20 @@ function validateDirectory(field) {
320
320
  return void 0;
321
321
  };
322
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
+ }
323
337
  function unwrapCanceledValue(value, message) {
324
338
  if (isCancel(value)) {
325
339
  throw new Error(message);
@@ -342,7 +356,7 @@ async function resolveSelectInput(providedValue, prompter, params) {
342
356
  }
343
357
  return await prompter.select(params);
344
358
  }
345
- async function promptRepoMappings(prompter, defaultWorkspace) {
359
+ async function promptRepoMappings(prompter, defaultWorkspace, homeDir) {
346
360
  const repoMappings = {};
347
361
  const addFirstPrompt = renderCliPrompt("cli.opencode-worker.repo-mapping.add-first", void 0);
348
362
  let addAnotherMapping = await prompter.confirm({
@@ -363,9 +377,9 @@ async function promptRepoMappings(prompter, defaultWorkspace) {
363
377
  const cwd = await prompter.text({
364
378
  message: directoryPrompt.message,
365
379
  placeholder: directoryPrompt.placeholder,
366
- validate: validateDirectory("cwd")
380
+ validate: validateDirectory("cwd", homeDir)
367
381
  });
368
- repoMappings[repo.trim()] = cwd.trim();
382
+ repoMappings[repo.trim()] = expandHomePath(cwd.trim(), homeDir);
369
383
  const addAnotherPrompt = renderCliPrompt("cli.opencode-worker.repo-mapping.add-another", void 0);
370
384
  addAnotherMapping = await prompter.confirm({
371
385
  message: addAnotherPrompt.message,
@@ -439,6 +453,7 @@ var OpenCodeCliTaskExecutor = class {
439
453
  const child = this.spawnChild(command.command, command.args, {
440
454
  cwd: request.cwd,
441
455
  detached: command.detached,
456
+ ...request.env ? { env: { ...process.env, ...request.env } } : {},
442
457
  stdio: ["ignore", "pipe", "pipe"]
443
458
  });
444
459
  return await new Promise((resolve3, reject) => {
@@ -940,7 +955,7 @@ var OpenCodeWorkerBridge = class {
940
955
  role: "manager",
941
956
  managerGrant: request.managerGrant,
942
957
  capabilitySummary: this.config.capabilitySummary,
943
- supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),
958
+ credentialDeliveryEnabled: true,
944
959
  initialAvailability: "available"
945
960
  });
946
961
  return;
@@ -948,14 +963,13 @@ var OpenCodeWorkerBridge = class {
948
963
  await this.client.switchRole({
949
964
  workerId: this.config.workerId,
950
965
  email: this.config.email,
951
- role: request.role,
952
966
  capabilitySummary: this.config.capabilitySummary,
953
- supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),
967
+ credentialDeliveryEnabled: true,
954
968
  initialAvailability: "available"
955
969
  });
956
970
  });
957
971
  await this.client.connect();
958
- await this.client.login(buildWorkerLoginPayload(this.config, OPENCODE_WORKER_ROLE));
972
+ await this.client.login(buildWorkerLoginPayload(this.config));
959
973
  return this;
960
974
  }
961
975
  async stop() {
@@ -971,12 +985,13 @@ var OpenCodeWorkerBridge = class {
971
985
  async handleTaskMessage({
972
986
  task,
973
987
  message,
974
- controller
988
+ controller,
989
+ credentials
975
990
  }) {
976
991
  this.supersedeActiveTaskExecution(task.id);
977
992
  const previous = this.contextQueues.get(task.contextId) ?? Promise.resolve();
978
993
  const current = previous.catch(() => void 0).then(async () => {
979
- await this.processTaskMessage({ task, message, controller });
994
+ await this.processTaskMessage({ task, message, controller, credentials });
980
995
  });
981
996
  this.contextQueues.set(task.contextId, current);
982
997
  try {
@@ -990,7 +1005,8 @@ var OpenCodeWorkerBridge = class {
990
1005
  async processTaskMessage({
991
1006
  task,
992
1007
  message,
993
- controller
1008
+ controller,
1009
+ credentials
994
1010
  }) {
995
1011
  if (this.activeTasks.has(task.id)) {
996
1012
  this.logger.warn(`Ignoring duplicate active task delivery for ${task.id}`);
@@ -1069,7 +1085,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
1069
1085
  finalPrompt,
1070
1086
  currentBinding,
1071
1087
  this.config,
1072
- execution
1088
+ execution,
1089
+ credentials?.env
1073
1090
  ));
1074
1091
  if (this.isTaskCanceled(task.id)) {
1075
1092
  return;
@@ -1106,7 +1123,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
1106
1123
  structuredProtocol,
1107
1124
  artifactStagingDir,
1108
1125
  result.text,
1109
- execution
1126
+ execution,
1127
+ credentials?.env
1110
1128
  ) : {
1111
1129
  status: "completed",
1112
1130
  summary: result.text
@@ -1332,7 +1350,7 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
1332
1350
  isTaskCanceled(taskId) {
1333
1351
  return this.activeTasks.get(taskId)?.canceled ?? this.pendingCanceledTaskIds.has(taskId);
1334
1352
  }
1335
- async resolveStructuredProjectNodeResult(task, binding, protocol, artifactStagingDir, firstText, execution) {
1353
+ async resolveStructuredProjectNodeResult(task, binding, protocol, artifactStagingDir, firstText, execution, env) {
1336
1354
  const firstParsed = parseProjectNodeResult(protocol, firstText);
1337
1355
  if (firstParsed) {
1338
1356
  return firstParsed;
@@ -1342,7 +1360,8 @@ ${promptWithArtifactInstructions}`.trim() : promptWithArtifactInstructions;
1342
1360
  buildStructuredRetryPrompt(protocol, artifactStagingDir),
1343
1361
  binding,
1344
1362
  this.config,
1345
- execution
1363
+ execution,
1364
+ env
1346
1365
  ));
1347
1366
  if (this.isTaskCanceled(task.id)) {
1348
1367
  throw new Error("task canceled before structured retry completed");
@@ -1417,19 +1436,15 @@ function createAttachmentArtifactSourceInvalidError(artifactId) {
1417
1436
  artifactId
1418
1437
  }).text);
1419
1438
  }
1420
- function buildWorkerLoginPayload(config, role) {
1439
+ function buildWorkerLoginPayload(config) {
1421
1440
  return {
1422
1441
  workerId: config.workerId,
1423
1442
  email: config.email,
1424
- role,
1425
1443
  capabilitySummary: config.capabilitySummary,
1426
- supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),
1444
+ credentialDeliveryEnabled: true,
1427
1445
  initialAvailability: "available"
1428
1446
  };
1429
1447
  }
1430
- function buildSupportedRoles(baseRole) {
1431
- return [baseRole, "manager"];
1432
- }
1433
1448
  function buildOpenCodeMetadata(binding, requestedRepo, extraMetadata) {
1434
1449
  return {
1435
1450
  "openCode.sessionId": binding.sessionId,
@@ -1455,7 +1470,7 @@ function buildOpenCodeFailureMetadata(binding, requestedRepo, config, error) {
1455
1470
  ...failureReason ? { "openCode.failureReason": failureReason } : {}
1456
1471
  };
1457
1472
  }
1458
- function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execution) {
1473
+ function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execution, env) {
1459
1474
  return {
1460
1475
  taskId: task.id,
1461
1476
  contextId: task.contextId,
@@ -1466,7 +1481,8 @@ function buildOpenCodeTaskExecutionRequest(task, prompt, binding, config, execut
1466
1481
  variant: binding.variant,
1467
1482
  agent: binding.agent,
1468
1483
  permissionPreset: config.permissionPreset,
1469
- abortSignal: execution.abortController.signal
1484
+ abortSignal: execution.abortController.signal,
1485
+ ...env ? { env } : {}
1470
1486
  };
1471
1487
  }
1472
1488
  function appendArtifactStagingInstructions(prompt, artifactStagingDir) {
@@ -1804,7 +1820,6 @@ function readOptionalBooleanMetadata(metadata, key) {
1804
1820
  }
1805
1821
 
1806
1822
  export {
1807
- OPENCODE_WORKER_ROLE,
1808
1823
  OPENCODE_WORKER_WORKING_TEXT,
1809
1824
  OPENCODE_WORKER_CONFIG_DIR,
1810
1825
  resolveOpenCodeWorkerStorageDir,
@@ -1830,4 +1845,4 @@ export {
1830
1845
  isAbortError,
1831
1846
  OpenCodeWorkerBridge
1832
1847
  };
1833
- //# sourceMappingURL=chunk-4MUQ7X6C.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-4MUQ7X6C.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;
@@ -172,7 +173,6 @@ declare function uninstallOpenCodeWorker(workerId: string, options?: ResolveStor
172
173
  };
173
174
  declare function createClackPrompter(): OpenCodeWorkerPrompter;
174
175
 
175
- declare const OPENCODE_WORKER_ROLE = "coder";
176
176
  declare const OPENCODE_WORKER_WORKING_TEXT = "OpenCode CLI is working";
177
177
  declare const OPENCODE_WORKER_CONFIG_DIR = ".meego-harness/opencode-worker";
178
178
 
@@ -202,4 +202,4 @@ declare function shouldSkipPermissionsForPreset(preset: PermissionPreset): prese
202
202
  declare function createAbortError(): Error;
203
203
  declare function isAbortError(error: unknown): boolean;
204
204
 
205
- export { OPENCODE_WORKER_CONFIG_DIR, OPENCODE_WORKER_ROLE, OPENCODE_WORKER_WORKING_TEXT, type OpenCodeAgentSelection, type OpenCodeCliTaskExecutionRequest, type OpenCodeCliTaskExecutionResult, OpenCodeCliTaskExecutor, type OpenCodeCliTaskExecutorConfig, type OpenCodeModelSelection, type OpenCodeTaskExecutor, type OpenCodeVariantSelection, OpenCodeWorkerBridge, type OpenCodeWorkerBridgeConfig, type OpenCodeWorkerBridgeDependencies, type OpenCodeWorkerBridgeLogger, type OpenCodeWorkerConfig, type OpenCodeWorkerContextBinding, type OpenCodeWorkerDoctorReport, type OpenCodeWorkerDoctorWorkerReport, type OpenCodeWorkerListItem, type OpenCodeWorkerPrompter, type OpenCodeWorkerSetupInput, type OpenCodeWorkerSetupResult, type OpenCodeWorkerState, type PermissionPreset, type ResolveStoragePathsOptions, type RunOpenCodeWorkerSetupDependencies, assertOpenCodeCliAvailable, assertOpenCodeCliRuntimeContract, buildOpenCodeArgs, createAbortError, createClackPrompter, getOpenCodeWorkerDoctorReport, isAbortError, listOpenCodeWorkerConfigs, loadOpenCodeWorkerConfig, loadOpenCodeWorkerState, resolveOpenCodeWorkerConfigFile, resolveOpenCodeWorkerStateFile, resolveOpenCodeWorkerStorageDir, runOpenCodeWorkerSetup, setOpenCodeWorkerEnabled, shouldSkipPermissionsForPreset, stringifyTaskMessageParts, uninstallOpenCodeWorker, writeOpenCodeWorkerConfig, writeOpenCodeWorkerState };
205
+ export { OPENCODE_WORKER_CONFIG_DIR, OPENCODE_WORKER_WORKING_TEXT, type OpenCodeAgentSelection, type OpenCodeCliTaskExecutionRequest, type OpenCodeCliTaskExecutionResult, OpenCodeCliTaskExecutor, type OpenCodeCliTaskExecutorConfig, type OpenCodeModelSelection, type OpenCodeTaskExecutor, type OpenCodeVariantSelection, OpenCodeWorkerBridge, type OpenCodeWorkerBridgeConfig, type OpenCodeWorkerBridgeDependencies, type OpenCodeWorkerBridgeLogger, type OpenCodeWorkerConfig, type OpenCodeWorkerContextBinding, type OpenCodeWorkerDoctorReport, type OpenCodeWorkerDoctorWorkerReport, type OpenCodeWorkerListItem, type OpenCodeWorkerPrompter, type OpenCodeWorkerSetupInput, type OpenCodeWorkerSetupResult, type OpenCodeWorkerState, type PermissionPreset, type ResolveStoragePathsOptions, type RunOpenCodeWorkerSetupDependencies, assertOpenCodeCliAvailable, assertOpenCodeCliRuntimeContract, buildOpenCodeArgs, createAbortError, createClackPrompter, getOpenCodeWorkerDoctorReport, isAbortError, listOpenCodeWorkerConfigs, loadOpenCodeWorkerConfig, loadOpenCodeWorkerState, resolveOpenCodeWorkerConfigFile, resolveOpenCodeWorkerStateFile, resolveOpenCodeWorkerStorageDir, runOpenCodeWorkerSetup, setOpenCodeWorkerEnabled, shouldSkipPermissionsForPreset, stringifyTaskMessageParts, uninstallOpenCodeWorker, writeOpenCodeWorkerConfig, writeOpenCodeWorkerState };
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  OPENCODE_WORKER_CONFIG_DIR,
3
- OPENCODE_WORKER_ROLE,
4
3
  OPENCODE_WORKER_WORKING_TEXT,
5
4
  OpenCodeCliTaskExecutor,
6
5
  OpenCodeWorkerBridge,
@@ -24,10 +23,9 @@ import {
24
23
  uninstallOpenCodeWorker,
25
24
  writeOpenCodeWorkerConfig,
26
25
  writeOpenCodeWorkerState
27
- } from "./chunk-4MUQ7X6C.js";
26
+ } from "./chunk-6QMCHYTQ.js";
28
27
  export {
29
28
  OPENCODE_WORKER_CONFIG_DIR,
30
- OPENCODE_WORKER_ROLE,
31
29
  OPENCODE_WORKER_WORKING_TEXT,
32
30
  OpenCodeCliTaskExecutor,
33
31
  OpenCodeWorkerBridge,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meego-harness/opencode-worker",
3
3
  "type": "module",
4
- "version": "0.6.1",
4
+ "version": "0.7.3",
5
5
  "description": "Standalone OpenCode worker bridge for meego-harness WorkerServerSDK",
6
6
  "license": "MIT",
7
7
  "keywords": [
@@ -29,6 +29,86 @@
29
29
  "reason": "OpenCode CLI must be installed before the worker can run"
30
30
  }
31
31
  ],
32
+ "setupFields": [
33
+ "defaultWorkspace",
34
+ "artifactStagingRoot",
35
+ "permissionPreset",
36
+ "model",
37
+ "variant",
38
+ "agent"
39
+ ],
40
+ "setupFieldDefaults": {
41
+ "permissionPreset": "default",
42
+ "model": "use-opencode-default",
43
+ "variant": "use-opencode-default",
44
+ "agent": "use-opencode-default"
45
+ },
46
+ "setupFieldOptions": {
47
+ "permissionPreset": [
48
+ {
49
+ "value": "safe",
50
+ "label": "safe"
51
+ },
52
+ {
53
+ "value": "default",
54
+ "label": "default"
55
+ },
56
+ {
57
+ "value": "full-access",
58
+ "label": "full-access"
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
+ }
86
+ ]
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
+ ],
32
112
  "actions": {
33
113
  "setup": {
34
114
  "runner": "package-bin",
@@ -102,9 +182,9 @@
102
182
  "dependencies": {
103
183
  "@clack/prompts": "^1.2.0",
104
184
  "zod": "^4.3.6",
105
- "@meego-harness/manager-contract": "^0.6.1",
106
- "@meego-harness/prompt-registry": "^0.6.1",
107
- "@meego-harness/worker-sdk": "^0.6.1"
185
+ "@meego-harness/manager-contract": "^0.7.3",
186
+ "@meego-harness/prompt-registry": "^0.7.3",
187
+ "@meego-harness/worker-sdk": "^0.7.3"
108
188
  },
109
189
  "devDependencies": {
110
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_ROLE = 'coder'\nexport 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, WorkerRole } 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_ROLE,\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 supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),\n initialAvailability: 'available',\n })\n return\n }\n\n await this.client.switchRole({\n workerId: this.config.workerId,\n email: this.config.email,\n role: request.role,\n capabilitySummary: this.config.capabilitySummary,\n supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),\n initialAvailability: 'available',\n })\n })\n\n await this.client.connect()\n await this.client.login(buildWorkerLoginPayload(this.config, OPENCODE_WORKER_ROLE))\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 role: typeof OPENCODE_WORKER_ROLE | 'manager',\n) {\n return {\n workerId: config.workerId,\n email: config.email,\n role,\n capabilitySummary: config.capabilitySummary,\n supportedRoles: buildSupportedRoles(OPENCODE_WORKER_ROLE),\n initialAvailability: 'available' as const,\n }\n}\n\nfunction buildSupportedRoles(baseRole: typeof OPENCODE_WORKER_ROLE): WorkerRole[] {\n return [baseRole, 'manager']\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"]}