@opentag/runner 0.3.3 → 0.3.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"executor-report.d.ts","sourceRoot":"","sources":["../src/executor-report.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AACrE,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AAMjE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAiBpD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CASpD;AAqFD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAQ9E;AAUD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,MAAM,CA4BT"}
1
+ {"version":3,"file":"executor-report.d.ts","sourceRoot":"","sources":["../src/executor-report.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AACrE,eAAO,MAAM,mBAAmB,gCAAgC,CAAC;AAMjE,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,KAAK,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QACzC,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAkBpD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CASpD;AAqFD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAQ9E;AAUD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;CACxB,GAAG,MAAM,CA4BT"}
package/dist/index.js CHANGED
@@ -47,6 +47,7 @@ var MAX_REPORT_TEXT_LENGTH = 600;
47
47
  function executorReportPromptLines() {
48
48
  return [
49
49
  "End with this exact machine-readable OpenTag executor report block. Put it last.",
50
+ "If the user asked a read-only question or summary request, put the user-facing answer before this block; this block is only completion metadata.",
50
51
  "Replace every example value with the actual result. Use changes: [] if no files changed.",
51
52
  "Use verification: [] if no checks ran. Use verification outcome exactly one of: passed, failed, not_run.",
52
53
  EXECUTOR_REPORT_START,
@@ -331,7 +332,21 @@ function stripGitHandoffTail(line) {
331
332
  return line.replace(/\s*(?:Blocker|Recommended next action|Next action|Remaining work|Manual steps|To finish)\s*:.*$/i, "").trimEnd();
332
333
  }
333
334
  function cleanOrFallbackExecutorSummary(input) {
334
- const rawSummary = input.output.slice(-MAX_EXECUTOR_SUMMARY_LENGTH).replace(/\r\n/g, "\n");
335
+ const summary = cleanExecutorSummaryText(input.output);
336
+ if (summary) return summary;
337
+ if (input.changedFiles.length === 0) {
338
+ return `${input.executorName} completed without file changes.`;
339
+ }
340
+ return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(", ")}.`;
341
+ }
342
+ function cleanExecutorSummaryText(output) {
343
+ const normalizedOutput = output.replace(/\r\n/g, "\n");
344
+ const sliceStart = Math.max(0, normalizedOutput.length - MAX_EXECUTOR_SUMMARY_LENGTH);
345
+ let rawSummary = normalizedOutput.slice(sliceStart);
346
+ if (sliceStart > 0 && normalizedOutput[sliceStart - 1] !== "\n") {
347
+ const firstCompleteLine = rawSummary.indexOf("\n");
348
+ rawSummary = firstCompleteLine >= 0 ? rawSummary.slice(firstCompleteLine + 1) : "";
349
+ }
335
350
  const filteredLines = [];
336
351
  for (const rawLine of rawSummary.split("\n")) {
337
352
  const trimmed = rawLine.trim();
@@ -342,16 +357,25 @@ function cleanOrFallbackExecutorSummary(input) {
342
357
  filteredLines.push(withoutHandoffTail);
343
358
  }
344
359
  const summary = filteredLines.join("\n").replace(/(?:^|\n)\s*(?:To finish|Manual steps):\s*\n```[^\n]*\n\s*```/gi, "\n").replace(/```[^\n]*\n\s*```/g, "").replace(/\n{3,}/g, "\n\n").trim();
345
- if (summary.length > 0) return summary;
346
- if (input.changedFiles.length === 0) {
347
- return `${input.executorName} completed without file changes.`;
348
- }
349
- return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(", ")}.`;
360
+ return summary.length > 0 ? summary : void 0;
361
+ }
362
+ function executorAnswerBeforeReport(output) {
363
+ const startIndex = output.lastIndexOf(EXECUTOR_REPORT_START);
364
+ if (startIndex < 0) return void 0;
365
+ return cleanExecutorSummaryText(output.slice(0, startIndex));
366
+ }
367
+ function summaryWithExecutorAnswer(input) {
368
+ const reportSummary = renderExecutorReportSummary(input);
369
+ if (input.changedFiles.length > 0 || input.report.changes.length > 0) return reportSummary;
370
+ const answer = executorAnswerBeforeReport(input.output);
371
+ if (!answer || answer === reportSummary) return reportSummary;
372
+ const hasReportDetails = Boolean(input.report.verification?.length || input.report.risks?.length);
373
+ return hasReportDetails ? [answer, "", reportSummary].join("\n") : answer;
350
374
  }
351
375
  function createExecutorRunResult(input) {
352
376
  const proposalId = `proposal_${input.runId}`;
353
377
  const report = parseExecutorReport(input.output);
354
- const summary = report ? renderExecutorReportSummary({ ...input, report }) : cleanOrFallbackExecutorSummary(input);
378
+ const summary = report ? summaryWithExecutorAnswer({ ...input, report }) : cleanOrFallbackExecutorSummary(input);
355
379
  const suggestedChanges = input.changedFiles.length > 0 ? [
356
380
  {
357
381
  proposalId,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/claude-code.ts","../src/command.ts","../src/executor-report.ts","../src/executor.ts","../src/git.ts","../src/result.ts","../src/codex.ts","../src/security.ts","../src/echo.ts","../src/session-profile.ts","../src/hermes.ts"],"sourcesContent":["import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandRunner } from \"./command.js\";\nimport { executorPolicyPromptLines } from \"./executor-report.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport { branchNameForRun, changedFiles, cleanupInternalArtifacts, createRunBranch } from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\n\nexport type ClaudeCodeExecutorOptions = {\n runner?: CommandRunner;\n claudeCommand?: string;\n model?: string;\n permissionMode?: \"acceptEdits\" | \"auto\" | \"bypassPermissions\" | \"default\" | \"plan\";\n dangerouslySkipPermissions?: boolean;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n ...executorPolicyPromptLines()\n ].join(\"\\n\");\n}\n\nexport function createClaudeCodeExecutor(options: ClaudeCodeExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const claudeCommand = options.claudeCommand ?? \"claude\";\n\n return {\n id: \"claude-code\",\n displayName: \"Claude Code Executor\",\n capability: {\n id: \"claude-code\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"branch\",\n requiredSecrets: [\n {\n id: \"anthropic_api_key\",\n label: \"Anthropic API key\",\n required: false,\n env: \"ANTHROPIC_API_KEY\",\n description: \"Needed when the local Claude Code CLI is configured to authenticate from environment.\"\n }\n ],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `claude --print` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n try {\n const claudeVersion = await runner.run(claudeCommand, [\"--version\"], { cwd: input.workspacePath });\n if (claudeVersion.exitCode !== 0) {\n return { ready: false, reason: `Claude Code CLI is not available: ${claudeVersion.stderr || claudeVersion.stdout}` };\n }\n } catch (error) {\n return { ready: false, reason: `Claude Code CLI is not available: ${error instanceof Error ? error.message : String(error)}` };\n }\n const gitStatus = await runner.run(\"git\", [\"status\", \"--porcelain\"], { cwd: input.workspacePath });\n if (gitStatus.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitStatus.stderr || gitStatus.stdout}` };\n }\n if (gitStatus.stdout.trim().length > 0) {\n return { ready: false, reason: \"Workspace has uncommitted changes; refusing to run Claude Code executor.\" };\n }\n return { ready: true };\n },\n async run(input, sink) {\n const branchName = branchNameForRun(input.runId);\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated branch ${branchName}`,\n at: new Date().toISOString()\n });\n await createRunBranch({\n runner,\n workspacePath: input.workspacePath,\n branchName,\n ...(input.baseBranch ? { startPoint: input.baseBranch } : {})\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting claude --print\",\n at: new Date().toISOString()\n });\n\n const args = [\n \"--print\",\n \"--input-format\",\n \"text\",\n \"--output-format\",\n \"text\",\n \"--no-session-persistence\",\n ...(options.model ? [\"--model\", options.model] : []),\n ...(options.permissionMode ? [\"--permission-mode\", options.permissionMode] : []),\n ...(options.dangerouslySkipPermissions ? [\"--dangerously-skip-permissions\"] : [])\n ];\n const claudeResult = await runner.run(claudeCommand, args, {\n cwd: input.workspacePath,\n input: buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n })\n });\n await assertCommandSucceeded(claudeResult, \"claude --print\");\n\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: input.workspacePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n\n const files = await changedFiles({ runner, workspacePath: input.workspacePath });\n await sink.emit({\n type: \"executor.completed\",\n message: `Claude Code executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = claudeResult.stdout.trim() || claudeResult.stderr.trim() || \"Claude Code completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Claude Code\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files\n });\n },\n async cancel() {\n return;\n }\n };\n}\n","import { spawn } from \"node:child_process\";\n\nexport type CommandResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type CommandEnvironment = Record<string, string | undefined>;\n\nexport type CommandRunner = {\n run(command: string, args: string[], options?: { cwd?: string; input?: string; env?: CommandEnvironment }): Promise<CommandResult>;\n};\n\nexport const nodeCommandRunner: CommandRunner = {\n run(command, args, options = {}) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n resolve({\n exitCode: exitCode ?? 1,\n stdout: Buffer.concat(stdout).toString(\"utf8\"),\n stderr: Buffer.concat(stderr).toString(\"utf8\")\n });\n });\n\n // A large prompt (larger than the OS pipe buffer, ~64KB) written to a\n // child that exits or closes its stdin before the full write drains emits\n // an EPIPE on the stdin stream. Without a listener that error is uncaught\n // and crashes the long-lived local-runtime polling daemon. Swallow it: the\n // child's exit/close is already handled above and is the authoritative\n // signal here.\n child.stdin.on(\"error\", () => {});\n\n if (options.input) {\n child.stdin.write(options.input);\n }\n child.stdin.end();\n });\n }\n};\n\nexport async function assertCommandSucceeded(result: CommandResult, label: string): Promise<void> {\n if (result.exitCode !== 0) {\n throw new Error(`${label} failed with exit code ${result.exitCode}: ${result.stderr || result.stdout}`);\n }\n}\n","export const EXECUTOR_REPORT_START = \"OPENTAG_EXECUTOR_REPORT_START\";\nexport const EXECUTOR_REPORT_END = \"OPENTAG_EXECUTOR_REPORT_END\";\n\nconst REPORT_OUTCOMES = new Set([\"passed\", \"failed\", \"not_run\"]);\nconst MAX_REPORT_ITEMS = 8;\nconst MAX_REPORT_TEXT_LENGTH = 600;\n\nexport type ExecutorReport = {\n changes: Array<{\n file?: string;\n summary: string;\n }>;\n verification?: Array<{\n command?: string;\n outcome: \"passed\" | \"failed\" | \"not_run\";\n summary?: string;\n }>;\n risks?: string[];\n notes?: string[];\n};\n\nexport function executorReportPromptLines(): string[] {\n return [\n \"End with this exact machine-readable OpenTag executor report block. Put it last.\",\n \"Replace every example value with the actual result. Use changes: [] if no files changed.\",\n \"Use verification: [] if no checks ran. Use verification outcome exactly one of: passed, failed, not_run.\",\n EXECUTOR_REPORT_START,\n JSON.stringify(\n {\n changes: [{ file: \"README.md\", summary: \"Added one sentence describing the completed change.\" }],\n verification: [{ command: \"corepack pnpm test\", outcome: \"passed\", summary: \"Tests passed.\" }],\n risks: []\n },\n null,\n 2\n ),\n EXECUTOR_REPORT_END\n ];\n}\n\nexport function executorPolicyPromptLines(): string[] {\n return [\n \"Work autonomously but keep the change narrow. Run relevant verification if you modify files.\",\n \"OpenTag owns the source-control handoff after you finish.\",\n \"Do not run, request, or recommend git add, git commit, git push, or gh pr create.\",\n \"Do not ask the user to approve local source-control commands; summarize file changes and verification only.\",\n \"OpenTag will publish the run branch and expose pull-request creation as a suggested action.\",\n ...executorReportPromptLines()\n ];\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction cleanReportText(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const text = value.replace(/\\s+/g, \" \").trim();\n return text.length > 0 ? text.slice(0, MAX_REPORT_TEXT_LENGTH) : undefined;\n}\n\nfunction cleanStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const items = value.map(cleanReportText).filter((item): item is string => Boolean(item));\n return items.length > 0 ? items.slice(0, MAX_REPORT_ITEMS) : undefined;\n}\n\nfunction normalizeReport(value: unknown): ExecutorReport | undefined {\n const record = asRecord(value);\n if (!record || !Array.isArray(record[\"changes\"])) return undefined;\n\n const changes = record[\"changes\"]\n .map((item) => {\n const change = asRecord(item);\n if (!change) return undefined;\n const summary = cleanReportText(change[\"summary\"]);\n if (!summary) return undefined;\n const file = cleanReportText(change[\"file\"]);\n return file ? { file, summary } : { summary };\n })\n .filter((item): item is ExecutorReport[\"changes\"][number] => Boolean(item))\n .slice(0, MAX_REPORT_ITEMS);\n\n if ((record[\"changes\"] as unknown[]).length > 0 && changes.length === 0) return undefined;\n\n const verificationRaw = record[\"verification\"];\n const verification = Array.isArray(verificationRaw)\n ? verificationRaw\n .map((item) => {\n const check = asRecord(item);\n if (!check || typeof check[\"outcome\"] !== \"string\" || !REPORT_OUTCOMES.has(check[\"outcome\"])) return undefined;\n const command = cleanReportText(check[\"command\"]);\n const summary = cleanReportText(check[\"summary\"]);\n return {\n ...(command ? { command } : {}),\n outcome: check[\"outcome\"] as \"passed\" | \"failed\" | \"not_run\",\n ...(summary ? { summary } : {})\n };\n })\n .filter((item): item is NonNullable<ExecutorReport[\"verification\"]>[number] => Boolean(item))\n .slice(0, MAX_REPORT_ITEMS)\n : undefined;\n\n if (Array.isArray(verificationRaw) && verificationRaw.length > 0 && (!verification || verification.length === 0)) {\n return undefined;\n }\n\n const risks = cleanStringArray(record[\"risks\"]);\n const notes = cleanStringArray(record[\"notes\"]);\n\n return {\n changes,\n ...(verification && verification.length > 0 ? { verification } : {}),\n ...(risks ? { risks } : {}),\n ...(notes ? { notes } : {})\n };\n}\n\nfunction markerCandidate(output: string): string | undefined {\n const startIndex = output.lastIndexOf(EXECUTOR_REPORT_START);\n if (startIndex < 0) return undefined;\n const afterStart = output.slice(startIndex + EXECUTOR_REPORT_START.length);\n const endIndex = afterStart.indexOf(EXECUTOR_REPORT_END);\n return (endIndex >= 0 ? afterStart.slice(0, endIndex) : afterStart).trim();\n}\n\nfunction parseCandidate(candidate: string): ExecutorReport | undefined {\n try {\n return normalizeReport(JSON.parse(candidate));\n } catch {\n return undefined;\n }\n}\n\nexport function parseExecutorReport(output: string): ExecutorReport | undefined {\n const marker = markerCandidate(output);\n if (marker) {\n const parsed = parseCandidate(marker);\n if (parsed) return parsed;\n }\n\n return parseCandidate(output.trim());\n}\n\nfunction deterministicSummary(input: { executorName: string; changedFiles: string[] }): string {\n if (input.changedFiles.length === 0) {\n return `${input.executorName} completed without file changes.`;\n }\n\n return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(\", \")}.`;\n}\n\nexport function renderExecutorReportSummary(input: {\n executorName: string;\n changedFiles: string[];\n report: ExecutorReport;\n}): string {\n const lines: string[] = [];\n\n if (input.report.changes.length > 0) {\n lines.push(\"What changed:\");\n for (const change of input.report.changes) {\n lines.push(`- ${change.file ? `\\`${change.file}\\`: ` : \"\"}${change.summary}`);\n }\n }\n\n if (input.report.verification?.length) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Verified:\");\n for (const check of input.report.verification) {\n const prefix = check.command ? `\\`${check.command}\\`: ${check.outcome}` : check.outcome;\n lines.push(`- ${check.summary ? `${prefix} - ${check.summary}` : prefix}`);\n }\n }\n\n if (input.report.risks?.length) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Risks:\");\n for (const risk of input.report.risks) {\n lines.push(`- ${risk}`);\n }\n }\n\n return lines.length > 0 ? lines.join(\"\\n\") : deterministicSummary(input);\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer, type OpenTagCommand, type OpenTagRunResult, type PermissionGrant } from \"@opentag/core\";\nimport type { AgentSessionProfile } from \"./session-profile.js\";\n\nexport type ExecutorEvent = {\n type: \"executor.started\" | \"executor.progress\" | \"executor.completed\" | \"executor.failed\";\n message: string;\n at: string;\n};\n\nexport type ExecutorEventSink = {\n emit(event: ExecutorEvent): Promise<void>;\n};\n\nexport type ExecutorRunInput = {\n runId: string;\n workspacePath: string;\n command: OpenTagCommand;\n context: ContextPointer[];\n contextPacket?: ContextPacket;\n permissions?: PermissionGrant[];\n baseBranch?: string;\n worktreeRoot?: string;\n keepWorktree?: \"always\" | \"on_failure\" | \"never\";\n metadata?: Record<string, unknown>;\n sessionProfile?: AgentSessionProfile;\n};\n\nexport function renderContextPacketForPrompt(packet?: ContextPacket): string[] {\n if (!packet) return [];\n\n const lines = [\"OpenTag context packet:\", `- summary: ${packet.summary}`];\n\n if (packet.intent) {\n lines.push(`- intent: ${packet.intent.normalizedIntent}`);\n lines.push(`- requested by: ${packet.intent.requestedBy.provider}:${packet.intent.requestedBy.providerUserId}`);\n }\n\n if (packet.sources?.length) {\n lines.push(\"- selected sources:\");\n for (const source of packet.sources) {\n lines.push(` - [${source.role}] ${contextPointerLabel(source.pointer)}: ${source.pointer.uri}`);\n lines.push(` reason: ${source.reason}`);\n }\n }\n\n if (packet.facts?.length) {\n lines.push(\"- facts:\");\n for (const fact of packet.facts) {\n lines.push(` - ${fact.text}`);\n }\n }\n\n if (packet.exclusions?.length) {\n lines.push(\"- exclusions:\");\n for (const exclusion of packet.exclusions) {\n lines.push(` - ${exclusion}`);\n }\n }\n\n return lines;\n}\n\nexport type ExecutorReadiness = {\n ready: boolean;\n reason?: string;\n};\n\nexport type ExecutorSecretRequirement = {\n id: string;\n label: string;\n required: boolean;\n description?: string;\n env?: string;\n};\n\nexport type ExecutorCompletionSignal = {\n type: \"process_exit\" | \"hook_event\" | \"stream_event\";\n required: boolean;\n description: string;\n};\n\nexport type ExecutorProgressEventMode = \"none\" | \"audit\" | \"human\";\nexport type ExecutorApprovalMode = \"none\" | \"opentag_policy\" | \"executor_managed\";\nexport type ExecutorContextAccess = \"context_packet\" | \"context_pointers\" | \"workspace\";\nexport type ExecutorPromptAssembly = \"opentag\" | \"executor_adapter\" | \"external_runtime\";\nexport type ExecutorWriteAccess = \"none\" | \"workspace\" | \"external\";\nexport type ExecutorConversationAccess = \"none\" | \"request\" | \"thread_transcript\";\nexport type ExecutorPromptMutation = \"none\" | \"append\" | \"replace\";\nexport type ExecutorWriteActionAccess = \"none\" | \"propose\" | \"execute\";\n\nexport type ExecutorCapabilityContract = {\n id: string;\n invocation: \"spawn\" | \"hook_ingest\" | \"hybrid\";\n supportsProfile: boolean;\n supportsStreaming: boolean;\n supportsCancel: boolean;\n supportsHookCompletion: boolean;\n progressEvents: ExecutorProgressEventMode;\n approvalMode: ExecutorApprovalMode;\n contextAccess: ExecutorContextAccess[];\n promptAssembly: ExecutorPromptAssembly;\n writeAccess: ExecutorWriteAccess;\n conversationAccess: ExecutorConversationAccess;\n promptMutation: ExecutorPromptMutation;\n rawContextAccess: boolean;\n writeActionAccess: ExecutorWriteActionAccess;\n workspaceIsolation: \"none\" | \"branch\" | \"worktree\" | \"external\";\n requiredSecrets: ExecutorSecretRequirement[];\n completionSignals: ExecutorCompletionSignal[];\n};\n\nexport type ExecutorAdapter = {\n id: string;\n displayName: string;\n capability?: ExecutorCapabilityContract;\n canRun(input: ExecutorRunInput): Promise<ExecutorReadiness>;\n run(input: ExecutorRunInput, sink: ExecutorEventSink): Promise<OpenTagRunResult>;\n cancel(runId: string): Promise<void>;\n};\n","import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { CommandRunner } from \"./command.js\";\nimport { assertCommandSucceeded } from \"./command.js\";\n\nexport type GitStatusEntry = {\n status: string;\n path: string;\n};\n\nconst INTERNAL_ARTIFACT_ROOTS = [\".omx\", \".codex\", \".claude\"];\n\nexport function branchNameForRun(runId: string): string {\n const safeRunId = runId.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n return `opentag/${safeRunId}`;\n}\n\n// Git status command used by the helpers below. We use the NUL-delimited\n// porcelain form (`-z`) so that renamed/copied entries and paths containing\n// spaces, quotes, newlines, or unicode survive parsing intact. `-z` also\n// disables the quoting/escaping that the default newline form applies, and\n// `core.quotePath=false` keeps unicode bytes verbatim rather than \\NNN escapes.\nexport const STATUS_PORCELAIN_Z_ARGS = [\"-c\", \"core.quotePath=false\", \"status\", \"--porcelain\", \"-z\"];\n\n// Parses `git status --porcelain -z` output (NUL-delimited records).\n//\n// In the `-z` format each record is terminated by a NUL byte. For ordinary\n// entries a record is `XY <path>`. For rename (\"R\") and copy (\"C\") entries the\n// destination is emitted in the `XY <dest>` record and the source path follows\n// as a SEPARATE NUL-terminated record. We consume that following record as the\n// source and keep the destination as the changed path, so consumers never see\n// the literal `original -> renamed` arrow form that breaks `git add --`.\nexport function parseStatusEntries(statusOutput: string): GitStatusEntry[] {\n const records = statusOutput.split(\"\\0\");\n const entries: GitStatusEntry[] = [];\n\n for (let index = 0; index < records.length; index += 1) {\n const record = records[index];\n if (!record) continue;\n\n const status = record.slice(0, 2);\n const path = record.slice(3);\n\n // Rename/copy records carry a trailing source record we must skip past so\n // it is not mistaken for an independent change. Git's XY status can put\n // rename/copy in either column (index or worktree), so check both.\n const isRenameOrCopy = status.includes(\"R\") || status.includes(\"C\");\n if (isRenameOrCopy) {\n index += 1;\n }\n\n if (path.length === 0) continue;\n entries.push({ status, path });\n }\n\n return entries;\n}\n\nexport function isInternalArtifactPath(path: string): boolean {\n return INTERNAL_ARTIFACT_ROOTS.some((root) => path === root || path.startsWith(`${root}/`));\n}\n\nexport function parseChangedFiles(statusOutput: string): string[] {\n return parseStatusEntries(statusOutput)\n .map((entry) => entry.path)\n .filter((path) => !isInternalArtifactPath(path));\n}\n\nexport async function createRunBranch(input: {\n runner: CommandRunner;\n workspacePath: string;\n branchName: string;\n startPoint?: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"checkout\", \"-B\", input.branchName, ...(input.startPoint ? [input.startPoint] : [])], { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"create run branch\");\n}\n\nexport function worktreePathForRun(input: {\n workspacePath: string;\n runId: string;\n worktreeRoot?: string;\n}): string {\n const safeRunId = input.runId.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n const root = input.worktreeRoot ?? `${input.workspacePath.replace(/\\/$/, \"\")}/.worktrees/opentag`;\n return `${root.replace(/\\/$/, \"\")}/${safeRunId}`;\n}\n\nexport async function createRunWorktree(input: {\n runner: CommandRunner;\n workspacePath: string;\n worktreePath: string;\n branchName: string;\n baseBranch: string;\n}): Promise<void> {\n mkdirSync(dirname(input.worktreePath), { recursive: true });\n const result = await input.runner.run(\n \"git\",\n [\"worktree\", \"add\", \"-B\", input.branchName, input.worktreePath, input.baseBranch],\n { cwd: input.workspacePath }\n );\n await assertCommandSucceeded(result, \"create run worktree\");\n}\n\nexport async function removeRunWorktree(input: {\n runner: CommandRunner;\n workspacePath: string;\n worktreePath: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"worktree\", \"remove\", \"--force\", input.worktreePath], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(result, \"remove run worktree\");\n}\n\nexport async function deleteRunBranch(input: { runner: CommandRunner; workspacePath: string; branchName: string }): Promise<void> {\n const result = await input.runner.run(\"git\", [\"branch\", \"-D\", input.branchName], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(result, \"delete empty run branch\");\n}\n\nexport async function changedFiles(input: { runner: CommandRunner; workspacePath: string }): Promise<string[]> {\n const result = await input.runner.run(\"git\", STATUS_PORCELAIN_Z_ARGS, { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"read changed files\");\n return parseChangedFiles(result.stdout);\n}\n\nexport async function cleanupInternalArtifacts(input: { runner: CommandRunner; workspacePath: string }): Promise<string[]> {\n const statusResult = await input.runner.run(\"git\", STATUS_PORCELAIN_Z_ARGS, { cwd: input.workspacePath });\n await assertCommandSucceeded(statusResult, \"scan internal artifacts\");\n const untrackedRoots = Array.from(\n new Set(\n parseStatusEntries(statusResult.stdout)\n .filter((entry) => entry.status === \"??\" && isInternalArtifactPath(entry.path))\n .map((entry) => entry.path.split(\"/\", 1)[0] ?? entry.path)\n )\n );\n if (untrackedRoots.length === 0) return [];\n\n const cleanResult = await input.runner.run(\"git\", [\"clean\", \"-fd\", \"--\", ...untrackedRoots], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(cleanResult, \"clean internal artifacts\");\n return untrackedRoots;\n}\n\nexport async function commitRunChanges(input: {\n runner: CommandRunner;\n workspacePath: string;\n message: string;\n}): Promise<boolean> {\n const files = await changedFiles({ runner: input.runner, workspacePath: input.workspacePath });\n if (files.length === 0) return false;\n\n const addResult = await input.runner.run(\"git\", [\"add\", \"--\", ...files], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(addResult, \"stage run changes\");\n\n const commitResult = await input.runner.run(\"git\", [\"commit\", \"-m\", input.message], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(commitResult, \"commit run changes\");\n return true;\n}\n\nexport async function commitChangedFiles(input: {\n runner: CommandRunner;\n workspacePath: string;\n files: string[];\n message: string;\n}): Promise<void> {\n if (input.files.length === 0) return;\n const addResult = await input.runner.run(\"git\", [\"add\", \"--\", ...input.files], { cwd: input.workspacePath });\n await assertCommandSucceeded(addResult, \"stage changed files\");\n const commitResult = await input.runner.run(\"git\", [\"commit\", \"-m\", input.message], { cwd: input.workspacePath });\n await assertCommandSucceeded(commitResult, \"commit changed files\");\n}\n\nexport async function pushBranch(input: {\n runner: CommandRunner;\n workspacePath: string;\n remote: string;\n branchName: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"push\", \"-u\", input.remote, input.branchName], { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"push run branch\");\n}\n","import type { OpenTagRunResult } from \"@opentag/core\";\nimport { parseExecutorReport, renderExecutorReportSummary } from \"./executor-report.js\";\n\nconst MAX_EXECUTOR_SUMMARY_LENGTH = 4000;\n\nconst DIRECT_SOURCE_CONTROL_COMMAND_PATTERN = /^\\s*(?:[-*]\\s*)?(?:`{1,3})?\\s*(?:git\\s+(?:add|commit|push|checkout)|gh\\s+pr\\s+create)\\b/i;\n\nconst GIT_HANDOFF_PATTERNS = [\n DIRECT_SOURCE_CONTROL_COMMAND_PATTERN,\n /\\b(?:interactive user approval|permission system)\\b.*\\b(?:git|source-control|commit|push|pull request|pr)\\b/i,\n /\\b(?:git|source-control|commit|push|pull request|pr)\\b.*\\b(?:interactive user approval|permission system)\\b/i,\n /(?=.*\\b(?:git\\s+(?:add|commit|push|checkout)|gh\\s+pr\\s+create|commit|push|pull request|pr)\\b)(?=.*\\b(?:approval|approve|manual|need|needs|cannot|can't|please|requires?|required|finish|next action|remaining work|blocked|blocker|permission)\\b)/i\n];\n\nconst HANDOFF_HEADING_PATTERN =\n /^(?:#{1,6}\\s*)?(?:\\*\\*)?\\s*(?:blocker|recommended next action|next action|remaining work|manual steps|to finish)\\b.*\\b(?:git|source-control|commit|push|pull request|pr)\\b/i;\n\nfunction looksLikeGitHandoff(line: string): boolean {\n return GIT_HANDOFF_PATTERNS.some((pattern) => pattern.test(line));\n}\n\nfunction stripGitHandoffTail(line: string): string {\n if (!looksLikeGitHandoff(line)) return line;\n return line\n .replace(/\\s*(?:Blocker|Recommended next action|Next action|Remaining work|Manual steps|To finish)\\s*:.*$/i, \"\")\n .trimEnd();\n}\n\nfunction cleanOrFallbackExecutorSummary(input: {\n executorName: string;\n output: string;\n changedFiles: string[];\n}): string {\n const rawSummary = input.output.slice(-MAX_EXECUTOR_SUMMARY_LENGTH).replace(/\\r\\n/g, \"\\n\");\n const filteredLines: string[] = [];\n\n for (const rawLine of rawSummary.split(\"\\n\")) {\n const trimmed = rawLine.trim();\n if (HANDOFF_HEADING_PATTERN.test(trimmed)) continue;\n\n const withoutHandoffTail = stripGitHandoffTail(rawLine);\n if (looksLikeGitHandoff(withoutHandoffTail)) continue;\n if (withoutHandoffTail.trim().length === 0 && trimmed.length > 0) continue;\n\n filteredLines.push(withoutHandoffTail);\n }\n\n const summary = filteredLines\n .join(\"\\n\")\n .replace(/(?:^|\\n)\\s*(?:To finish|Manual steps):\\s*\\n```[^\\n]*\\n\\s*```/gi, \"\\n\")\n .replace(/```[^\\n]*\\n\\s*```/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n if (summary.length > 0) return summary;\n\n if (input.changedFiles.length === 0) {\n return `${input.executorName} completed without file changes.`;\n }\n\n return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(\", \")}.`;\n}\n\nexport function createExecutorRunResult(input: {\n executorName: string;\n runId: string;\n branchName: string;\n baseBranch?: string;\n output: string;\n changedFiles: string[];\n extraArtifacts?: NonNullable<OpenTagRunResult[\"artifacts\"]>;\n}): OpenTagRunResult {\n const proposalId = `proposal_${input.runId}`;\n const report = parseExecutorReport(input.output);\n const summary = report ? renderExecutorReportSummary({ ...input, report }) : cleanOrFallbackExecutorSummary(input);\n const suggestedChanges =\n input.changedFiles.length > 0\n ? [\n {\n proposalId,\n createdAt: new Date().toISOString(),\n sourceRunId: input.runId,\n summary: `${input.executorName} changed ${input.changedFiles.length} file(s) on branch ${input.branchName}.`,\n intents: [\n {\n intentId: `${proposalId}_create_pr`,\n domain: \"pull_request\" as const,\n action: \"create_pull_request\",\n summary: `Create a pull request for branch ${input.branchName}.`,\n params: {\n title: `OpenTag run ${input.runId}`,\n body: [\n \"## Summary\",\n \"\",\n summary\n ].join(\"\\n\"),\n head: input.branchName,\n base: input.baseBranch ?? \"main\",\n changedFiles: input.changedFiles,\n risks: [\"Creates a pull request from the executor-produced branch; review the diff before merging.\"],\n executorConditions: [\"isolated branch exists\"]\n }\n },\n {\n intentId: `${proposalId}_link_branch`,\n domain: \"artifact_links\" as const,\n action: \"link_artifact\",\n summary: `Link the run branch ${input.branchName} to the work item.`,\n params: { title: \"Run branch\", uri: input.branchName }\n },\n {\n intentId: `${proposalId}_request_review`,\n domain: \"review\" as const,\n action: \"request_review\",\n summary: \"Request human review of the generated code changes.\",\n params: { changedFiles: input.changedFiles }\n }\n ],\n preconditions: [\"The local branch was generated from the checkout state available to the runner.\"]\n }\n ]\n : undefined;\n\n return {\n conclusion: \"success\",\n summary,\n changedFiles: input.changedFiles,\n artifacts: [\n ...(input.changedFiles.length > 0 ? [{ kind: \"patch\" as const, title: \"Run branch\", uri: input.branchName }] : []),\n ...(input.extraArtifacts ?? [])\n ],\n ...(suggestedChanges ? { suggestedChanges } : {}),\n nextAction:\n input.changedFiles.length > 0\n ? {\n summary: \"Review the proposed pull request action and reply `apply 1` if the branch should become a PR.\",\n hint: {\n kind: \"create_pull_request\",\n targetId: proposalId,\n selectedIntentIds: [`${proposalId}_create_pr`]\n }\n }\n : \"No file changes were detected.\"\n };\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandRunner } from \"./command.js\";\nimport { executorPolicyPromptLines } from \"./executor-report.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport {\n branchNameForRun,\n changedFiles,\n cleanupInternalArtifacts,\n commitRunChanges,\n createRunWorktree,\n deleteRunBranch,\n removeRunWorktree,\n worktreePathForRun\n} from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\nimport { assessRunnerSecurity, formatSecurityAssessment, scrubEnvironment, type RunnerSecurityPolicy } from \"./security.js\";\n\nexport type CodexExecutorOptions = {\n runner?: CommandRunner;\n codexCommand?: string;\n model?: string;\n security?: RunnerSecurityPolicy;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n ...executorPolicyPromptLines()\n ].join(\"\\n\");\n}\n\nexport function createCodexExecutor(options: CodexExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const codexCommand = options.codexCommand ?? \"codex\";\n\n return {\n id: \"codex\",\n displayName: \"Codex Executor\",\n capability: {\n id: \"codex\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"worktree\",\n requiredSecrets: [\n {\n id: \"openai_api_key\",\n label: \"OpenAI API key\",\n required: false,\n env: \"OPENAI_API_KEY\",\n description: \"Needed when the local Codex CLI is configured to authenticate from environment.\"\n }\n ],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `codex exec` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n const codexVersion = await runner.run(codexCommand, [\"--version\"], { cwd: input.workspacePath });\n if (codexVersion.exitCode !== 0) {\n return { ready: false, reason: `Codex CLI is not available: ${codexVersion.stderr || codexVersion.stdout}` };\n }\n const gitRepo = await runner.run(\"git\", [\"rev-parse\", \"--show-toplevel\"], { cwd: input.workspacePath });\n if (gitRepo.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitRepo.stderr || gitRepo.stdout}` };\n }\n const baseBranch = input.baseBranch ?? \"main\";\n const baseRef = await runner.run(\"git\", [\"rev-parse\", \"--verify\", `${baseBranch}^{commit}`], {\n cwd: input.workspacePath\n });\n if (baseRef.exitCode !== 0) {\n return { ready: false, reason: `Base branch '${baseBranch}' is not available: ${baseRef.stderr || baseRef.stdout}` };\n }\n return { ready: true };\n },\n async run(input, sink) {\n const security = options.security;\n const worktreePath = worktreePathForRun({\n workspacePath: input.workspacePath,\n runId: input.runId,\n ...(input.worktreeRoot ? { worktreeRoot: input.worktreeRoot } : {})\n });\n const assessment = assessRunnerSecurity({\n executorId: \"codex\",\n workspacePath: input.workspacePath,\n executionPath: worktreePath,\n command: input.command,\n context: input.context,\n ...(input.permissions ? { permissions: input.permissions } : {}),\n ...(security ? { policy: security } : {})\n });\n if (assessment.findings.length > 0) {\n await sink.emit({\n type: assessment.allowed ? \"executor.progress\" : \"executor.failed\",\n message: formatSecurityAssessment(assessment),\n at: new Date().toISOString()\n });\n }\n if (!assessment.allowed) {\n return {\n conclusion: \"needs_human\",\n summary: formatSecurityAssessment(assessment),\n nextAction: \"Review the request and rerun with a narrower prompt or an explicit local policy override if appropriate.\"\n };\n }\n\n const branchName = branchNameForRun(input.runId);\n const baseBranch = input.baseBranch ?? \"main\";\n const keepWorktree = input.keepWorktree ?? \"on_failure\";\n let completed = false;\n let changedFileCount: number | undefined;\n\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated worktree ${worktreePath} on ${branchName}`,\n at: new Date().toISOString()\n });\n try {\n await createRunWorktree({\n runner,\n workspacePath: input.workspacePath,\n worktreePath,\n branchName,\n baseBranch\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting codex exec\",\n at: new Date().toISOString()\n });\n\n const args = [\n \"exec\",\n \"--cd\",\n worktreePath,\n \"--full-auto\",\n \"--ephemeral\",\n ...(options.model ? [\"--model\", options.model] : []),\n \"-\"\n ];\n const codexResult = await runner.run(codexCommand, args, {\n cwd: worktreePath,\n env: scrubEnvironment(undefined, security),\n input: buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n })\n });\n await assertCommandSucceeded(codexResult, \"codex exec\");\n\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: worktreePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n\n const files = await changedFiles({ runner, workspacePath: worktreePath });\n changedFileCount = files.length;\n if (files.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Committing ${files.length} changed file(s) to ${branchName}`,\n at: new Date().toISOString()\n });\n await commitRunChanges({\n runner,\n workspacePath: worktreePath,\n message: `OpenTag run ${input.runId}`\n });\n }\n completed = true;\n\n await sink.emit({\n type: \"executor.completed\",\n message: `Codex executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = codexResult.stdout.trim() || codexResult.stderr.trim() || \"Codex completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Codex\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files,\n extraArtifacts: keepWorktree === \"always\" ? [{ title: \"Run worktree\", uri: worktreePath }] : []\n });\n } finally {\n const shouldRemove = keepWorktree === \"never\" || (keepWorktree === \"on_failure\" && completed);\n if (shouldRemove) {\n try {\n await removeRunWorktree({ runner, workspacePath: input.workspacePath, worktreePath });\n if (completed && changedFileCount === 0) {\n await deleteRunBranch({ runner, workspacePath: input.workspacePath, branchName });\n }\n } catch (error) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Could not clean up run worktree or branch for ${worktreePath}: ${error instanceof Error ? error.message : String(error)}`,\n at: new Date().toISOString()\n });\n }\n }\n }\n },\n async cancel() {\n return;\n }\n };\n}\n","import { fileURLToPath } from \"node:url\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport type { ContextPointer, OpenTagCommand, PermissionGrant } from \"@opentag/core\";\nimport type { CommandEnvironment } from \"./command.js\";\n\nexport type RunnerSecurityMode = \"enforce\" | \"audit\" | \"off\";\n\nexport type RunnerSecurityPolicy = {\n mode?: RunnerSecurityMode;\n allowedWorkspaceRoot?: string;\n allowUnsafePrompts?: boolean;\n extraSafeEnv?: string[];\n};\n\nexport type RunnerSecurityFinding = {\n code: string;\n severity: \"block\" | \"warn\";\n message: string;\n};\n\nexport type RunnerSecurityAssessment = {\n allowed: boolean;\n mode: RunnerSecurityMode;\n findings: RunnerSecurityFinding[];\n};\n\nexport const DEFAULT_SAFE_ENV_NAMES = [\n \"CI\",\n \"COLORTERM\",\n \"CODEX_HOME\",\n \"FORCE_COLOR\",\n \"HOME\",\n \"LANG\",\n \"LOGNAME\",\n \"NO_COLOR\",\n \"PATH\",\n \"PWD\",\n \"SHELL\",\n \"SSL_CERT_DIR\",\n \"SSL_CERT_FILE\",\n \"TERM\",\n \"TMP\",\n \"TMPDIR\",\n \"TEMP\",\n \"USER\",\n \"XDG_CACHE_HOME\",\n \"XDG_CONFIG_HOME\",\n \"XDG_DATA_HOME\"\n];\n\nconst SAFE_ENV_PREFIXES = [\"LC_\"];\n\nconst SENSITIVE_ENV_PATTERNS = [\n /TOKEN/,\n /SECRET/,\n /PASSWORD/,\n /PASS$/,\n /API[_-]?KEY/,\n /CREDENTIAL/,\n /COOKIE/,\n /SESSION/,\n /AUTH/,\n /^AWS_/,\n /^AZURE_/,\n /^GCP_/,\n /^GOOGLE_/,\n /^OPENAI_/,\n /^ANTHROPIC_/,\n /^SLACK_/,\n /^GITHUB_TOKEN$/,\n /^GH_TOKEN$/,\n /^SSH_/\n];\n\nconst HIGH_RISK_TEXT_PATTERNS: Array<{ code: string; pattern: RegExp; message: string }> = [\n {\n code: \"prompt.instruction_override\",\n pattern: /\\b(ignore|disregard|forget)\\s+(all\\s+)?(previous|prior|system|developer|safety)\\s+instructions\\b/i,\n message: \"Request contains an instruction override pattern commonly used in prompt injection.\"\n },\n {\n code: \"prompt.secret_exfiltration\",\n pattern:\n /\\b(print|dump|show|reveal|exfiltrate|send|upload|post|copy)\\b[\\s\\S]{0,100}\\b(secret|token|password|api[\\s_-]?key|credential|environment variables?|env vars?)\\b/i,\n message: \"Request appears to ask the runner to expose secrets or environment variables.\"\n },\n {\n code: \"prompt.sensitive_file_access\",\n pattern: /\\b(cat|open|read|print|dump)\\b[\\s\\S]{0,80}(~\\/\\.ssh|~\\/\\.aws|\\.env\\b|id_rsa|known_hosts|credentials\\b)/i,\n message: \"Request appears to ask the runner to read sensitive local credential files.\"\n }\n];\n\nfunction securityMode(policy: RunnerSecurityPolicy | undefined): RunnerSecurityMode {\n return policy?.mode ?? \"enforce\";\n}\n\nfunction isPathInside(childPath: string, parentPath: string): boolean {\n const child = resolve(childPath);\n const parent = resolve(parentPath);\n const pathFromParent = relative(parent, child);\n return pathFromParent === \"\" || (!pathFromParent.startsWith(\"..\") && !isAbsolute(pathFromParent));\n}\n\nfunction fileContextPath(pointer: ContextPointer, workspacePath: string): string | null {\n if (pointer.kind !== \"file\") return null;\n if (pointer.uri.startsWith(\"file://\")) {\n return fileURLToPath(pointer.uri);\n }\n if (isAbsolute(pointer.uri)) {\n return pointer.uri;\n }\n return resolve(workspacePath, pointer.uri);\n}\n\nfunction hasPermission(permissions: PermissionGrant[] | undefined, scope: string): boolean {\n return permissions?.some((permission) => permission.scope === scope) ?? false;\n}\n\nfunction needsWritePermission(command: OpenTagCommand, executorId: string): boolean {\n if (executorId === \"echo\") return false;\n return command.intent === \"fix\" || command.intent === \"run\";\n}\n\nfunction scanTextForHighRiskPatterns(input: { command: OpenTagCommand; context: ContextPointer[] }): RunnerSecurityFinding[] {\n const sources = [\n { label: \"command\", text: input.command.rawText },\n ...input.context\n .filter((pointer) => pointer.kind === \"text\")\n .map((pointer) => ({ label: pointer.title ?? \"text context\", text: pointer.uri }))\n ];\n\n const findings: RunnerSecurityFinding[] = [];\n for (const source of sources) {\n for (const rule of HIGH_RISK_TEXT_PATTERNS) {\n if (rule.pattern.test(source.text)) {\n findings.push({\n code: rule.code,\n severity: \"block\",\n message: `${rule.message} Source: ${source.label}.`\n });\n }\n }\n }\n return findings;\n}\n\nexport function assessRunnerSecurity(input: {\n executorId: string;\n workspacePath: string;\n executionPath?: string;\n command: OpenTagCommand;\n context: ContextPointer[];\n permissions?: PermissionGrant[];\n policy?: RunnerSecurityPolicy;\n}): RunnerSecurityAssessment {\n const mode = securityMode(input.policy);\n if (mode === \"off\") {\n return { allowed: true, mode, findings: [] };\n }\n\n const findings: RunnerSecurityFinding[] = [];\n if (!isAbsolute(input.workspacePath)) {\n findings.push({\n code: \"workspace.relative_path\",\n severity: \"block\",\n message: \"Workspace path must be absolute before a local executor can run.\"\n });\n }\n\n const workspacePath = resolve(input.workspacePath);\n const executionPath = resolve(input.executionPath ?? input.workspacePath);\n if (input.policy?.allowedWorkspaceRoot && !isPathInside(workspacePath, input.policy.allowedWorkspaceRoot)) {\n findings.push({\n code: \"workspace.outside_allowed_root\",\n severity: \"block\",\n message: \"Workspace path is outside the configured allowed workspace root.\"\n });\n }\n if (input.policy?.allowedWorkspaceRoot && !isPathInside(executionPath, input.policy.allowedWorkspaceRoot)) {\n findings.push({\n code: \"execution.outside_allowed_root\",\n severity: \"block\",\n message: \"Execution path is outside the configured allowed workspace root.\"\n });\n }\n\n for (const pointer of input.context) {\n const filePath = fileContextPath(pointer, workspacePath);\n if (filePath && !isPathInside(filePath, workspacePath)) {\n findings.push({\n code: \"context.file_outside_workspace\",\n severity: \"block\",\n message: `File context is outside the mapped workspace: ${pointer.uri}`\n });\n }\n }\n\n if (needsWritePermission(input.command, input.executorId) && !hasPermission(input.permissions, \"repo:write\")) {\n findings.push({\n code: \"permission.repo_write_required\",\n severity: \"block\",\n message: \"Write-capable commands require an explicit repo:write permission grant.\"\n });\n }\n\n if (!input.policy?.allowUnsafePrompts) {\n findings.push(...scanTextForHighRiskPatterns({ command: input.command, context: input.context }));\n }\n\n const hasBlockingFinding = findings.some((finding) => finding.severity === \"block\");\n return {\n allowed: mode === \"audit\" || !hasBlockingFinding,\n mode,\n findings\n };\n}\n\nfunction isSensitiveEnvName(name: string): boolean {\n const upperName = name.toUpperCase();\n return SENSITIVE_ENV_PATTERNS.some((pattern) => pattern.test(upperName));\n}\n\nfunction isSafeEnvName(name: string, policy: RunnerSecurityPolicy | undefined): boolean {\n const upperName = name.toUpperCase();\n const safeNames = new Set([...DEFAULT_SAFE_ENV_NAMES, ...(policy?.extraSafeEnv ?? [])].map((envName) => envName.toUpperCase()));\n return safeNames.has(upperName) || SAFE_ENV_PREFIXES.some((prefix) => upperName.startsWith(prefix));\n}\n\nexport function scrubEnvironment(env: CommandEnvironment = process.env, policy?: RunnerSecurityPolicy): CommandEnvironment {\n if (securityMode(policy) === \"off\") return { ...env };\n\n const scrubbed: CommandEnvironment = {};\n for (const [name, value] of Object.entries(env)) {\n if (typeof value !== \"string\") continue;\n if (isSensitiveEnvName(name)) continue;\n if (!isSafeEnvName(name, policy)) continue;\n scrubbed[name] = value;\n }\n return scrubbed;\n}\n\nexport function formatSecurityAssessment(assessment: RunnerSecurityAssessment): string {\n if (assessment.findings.length === 0) {\n return `OpenTag runner security assessment passed in ${assessment.mode} mode.`;\n }\n\n const prefix = assessment.allowed\n ? `OpenTag runner security assessment reported ${assessment.findings.length} finding(s) in ${assessment.mode} mode.`\n : \"OpenTag runner security blocked this run.\";\n const details = assessment.findings.map((finding) => `${finding.code}: ${finding.message}`).join(\" \");\n return `${prefix} ${details}`;\n}\n","import type { ExecutorAdapter } from \"./executor.js\";\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function createEchoExecutor(): ExecutorAdapter {\n return {\n id: \"echo\",\n displayName: \"Echo Executor\",\n capability: {\n id: \"echo\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\"],\n promptAssembly: \"opentag\",\n writeAccess: \"none\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"none\",\n requiredSecrets: [],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"The in-process echo executor returns a structured result immediately.\"\n }\n ]\n },\n async canRun() {\n return { ready: true };\n },\n async run(input, sink) {\n await sink.emit({\n type: \"executor.started\",\n message: `Echo executor started for ${input.runId}`,\n at: nowIso()\n });\n await sink.emit({\n type: \"executor.completed\",\n message: `Echo executor completed for ${input.runId}`,\n at: nowIso()\n });\n return {\n conclusion: \"success\",\n summary: `Echoed OpenTag command: ${input.command.rawText}`,\n verification: [\n {\n command: \"echo\",\n outcome: \"passed\",\n excerpt: input.command.rawText\n }\n ],\n nextAction: {\n summary: \"No external state change is suggested for the echo executor result.\",\n hint: { kind: \"none\" }\n }\n };\n },\n async cancel() {\n return;\n }\n };\n}\n","import { formatProjectTargetRef, projectTargetRefFromEvent, type OpenTagEvent, type ProjectTargetRef } from \"@opentag/core\";\n\nexport const DEFAULT_AGENT_SESSION_PROFILE_TEMPLATE =\n \"opentag-{provider}-{accountId}-{conversationId}-{owner}-{repo}-{actorId}\";\n\nexport type AgentSessionProfile = {\n id: string;\n template: string;\n sourceProvider: string;\n projectTarget?: string;\n accountId?: string;\n conversationId?: string;\n actorId?: string;\n};\n\nfunction metadataString(metadata: Record<string, unknown> | undefined, key: string): string {\n const value = metadata?.[key];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nexport function sanitizeAgentSessionProfileId(profile: string): string {\n return profile.replace(/[^A-Za-z0-9_.-]+/g, \"-\").replace(/-+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction profileTemplateValue(input: {\n key: string;\n runId: string;\n sourceProvider: string;\n metadata: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef;\n actorId?: string;\n}): string {\n if (input.key === \"runId\") return input.runId;\n if (input.key === \"provider\" || input.key === \"sourceProvider\") return input.sourceProvider;\n if (input.key === \"projectTarget\") return input.projectTargetRef ? formatProjectTargetRef(input.projectTargetRef) : \"\";\n if (input.key === \"repoProvider\") return input.projectTargetRef?.provider ?? metadataString(input.metadata, \"repoProvider\");\n if (input.key === \"owner\") return input.projectTargetRef?.owner ?? metadataString(input.metadata, \"owner\");\n if (input.key === \"repo\") return input.projectTargetRef?.repo ?? metadataString(input.metadata, \"repo\");\n if (input.key === \"actorId\") return input.actorId ?? \"\";\n return metadataString(input.metadata, input.key);\n}\n\nexport function createAgentSessionProfile(input: {\n runId: string;\n sourceProvider: string;\n metadata?: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef | null;\n actorId?: string;\n template?: string;\n fallbackId?: string;\n}): AgentSessionProfile | undefined {\n const template = input.template ?? DEFAULT_AGENT_SESSION_PROFILE_TEMPLATE;\n const metadata = input.metadata ?? {};\n const projectTargetRef = input.projectTargetRef ?? undefined;\n const profile = template.replace(/\\{([^}]+)\\}/g, (_match, key: string) =>\n profileTemplateValue({\n key,\n runId: input.runId,\n sourceProvider: input.sourceProvider,\n metadata,\n ...(projectTargetRef ? { projectTargetRef } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {})\n })\n );\n const id = sanitizeAgentSessionProfileId(profile) || (input.fallbackId ? sanitizeAgentSessionProfileId(input.fallbackId) : \"\");\n if (!id) return undefined;\n\n const accountId = metadataString(metadata, \"accountId\");\n const conversationId = metadataString(metadata, \"conversationId\");\n return {\n id,\n template,\n sourceProvider: input.sourceProvider,\n ...(projectTargetRef ? { projectTarget: formatProjectTargetRef(projectTargetRef) } : {}),\n ...(accountId ? { accountId } : {}),\n ...(conversationId ? { conversationId } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {})\n };\n}\n\nexport function createAgentSessionProfileForEvent(input: {\n runId: string;\n event: OpenTagEvent;\n metadata?: Record<string, unknown>;\n template?: string;\n fallbackId?: string;\n}): AgentSessionProfile | undefined {\n return createAgentSessionProfile({\n runId: input.runId,\n sourceProvider: input.event.source,\n metadata: input.metadata ?? input.event.metadata,\n projectTargetRef: projectTargetRefFromEvent(input.event),\n actorId: input.event.actor.providerUserId,\n ...(input.template ? { template: input.template } : {}),\n ...(input.fallbackId ? { fallbackId: input.fallbackId } : {})\n });\n}\n\nexport function resolveAgentSessionProfile(input: {\n profile?: string;\n profileTemplate?: string;\n metadata?: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef | null;\n actorId?: string;\n fallback?: AgentSessionProfile;\n}): AgentSessionProfile | undefined {\n if (input.profile) {\n const id = sanitizeAgentSessionProfileId(input.profile);\n const metadata = input.metadata ?? {};\n const accountId = metadataString(metadata, \"accountId\") || input.fallback?.accountId;\n const conversationId = metadataString(metadata, \"conversationId\") || input.fallback?.conversationId;\n const actorId = input.actorId ?? input.fallback?.actorId;\n const projectTarget = input.projectTargetRef ? formatProjectTargetRef(input.projectTargetRef) : input.fallback?.projectTarget;\n return id\n ? {\n id,\n template: input.profile,\n sourceProvider: input.fallback?.sourceProvider || metadataString(input.metadata, \"provider\") || \"unknown\",\n ...(projectTarget ? { projectTarget } : {}),\n ...(accountId ? { accountId } : {}),\n ...(conversationId ? { conversationId } : {}),\n ...(actorId ? { actorId } : {})\n }\n : input.fallback;\n }\n if (input.profileTemplate) {\n return createAgentSessionProfile({\n runId: metadataString(input.metadata, \"runId\") || input.fallback?.id || \"run\",\n sourceProvider: metadataString(input.metadata, \"provider\") || input.fallback?.sourceProvider || \"unknown\",\n ...(input.metadata ? { metadata: input.metadata } : {}),\n ...(input.projectTargetRef ? { projectTargetRef: input.projectTargetRef } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {}),\n template: input.profileTemplate,\n ...(input.fallback?.id ? { fallbackId: input.fallback.id } : {})\n });\n }\n return input.fallback;\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandResult, type CommandRunner } from \"./command.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport { branchNameForRun, changedFiles, cleanupInternalArtifacts, createRunBranch } from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\nimport { resolveAgentSessionProfile } from \"./session-profile.js\";\n\nexport type HermesExecutorOptions = {\n runner?: CommandRunner;\n hermesCommand?: string;\n profile?: string;\n profileTemplate?: string;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n \"Use only the selected Hermes profile for tools, skills, memory, and session behavior.\",\n \"Work autonomously but keep the change narrow. Run relevant verification if you modify files.\",\n \"End with a concise summary of what changed, what was verified, and the recommended next action.\"\n ].join(\"\\n\");\n}\n\nexport function createHermesExecutor(options: HermesExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const hermesCommand = options.hermesCommand ?? \"hermes\";\n\n return {\n id: \"hermes\",\n displayName: \"Hermes Executor\",\n capability: {\n id: \"hermes\",\n invocation: \"spawn\",\n supportsProfile: true,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"branch\",\n requiredSecrets: [],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `hermes -z` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n try {\n const hermesVersion = await runner.run(hermesCommand, [\"--version\"], { cwd: input.workspacePath });\n if (hermesVersion.exitCode !== 0) {\n return { ready: false, reason: `Hermes CLI is not available: ${hermesVersion.stderr || hermesVersion.stdout}` };\n }\n } catch (error) {\n return { ready: false, reason: `Hermes CLI is not available: ${error instanceof Error ? error.message : String(error)}` };\n }\n\n let gitStatus: CommandResult;\n try {\n gitStatus = await runner.run(\"git\", [\"status\", \"--porcelain\"], { cwd: input.workspacePath });\n } catch (error) {\n return { ready: false, reason: `Workspace is not a git checkout: ${error instanceof Error ? error.message : String(error)}` };\n }\n if (gitStatus.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitStatus.stderr || gitStatus.stdout}` };\n }\n if (gitStatus.stdout.trim().length > 0) {\n return { ready: false, reason: \"Workspace has uncommitted changes; refusing to run Hermes executor.\" };\n }\n\n return { ready: true };\n },\n async run(input, sink) {\n const branchName = branchNameForRun(input.runId);\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated branch ${branchName}`,\n at: new Date().toISOString()\n });\n\n await createRunBranch({\n runner,\n workspacePath: input.workspacePath,\n branchName,\n ...(input.baseBranch ? { startPoint: input.baseBranch } : {})\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting hermes -z\",\n at: new Date().toISOString()\n });\n\n const prompt = buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n });\n\n const profile = resolveAgentSessionProfile({\n ...(options.profile ? { profile: options.profile } : {}),\n ...(options.profileTemplate ? { profileTemplate: options.profileTemplate } : {}),\n metadata: {\n ...(input.metadata ?? {}),\n runId: input.runId\n },\n ...(input.sessionProfile ? { fallback: input.sessionProfile } : {})\n });\n\n const args = [...(profile ? [\"-p\", profile.id] : []), \"-z\", prompt];\n\n let hermesResult: CommandResult | undefined;\n try {\n hermesResult = await runner.run(hermesCommand, args, { cwd: input.workspacePath });\n await assertCommandSucceeded(hermesResult, \"hermes -z\");\n } finally {\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: input.workspacePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n }\n\n if (!hermesResult) throw new Error(\"Hermes did not return a result.\");\n\n const files = await changedFiles({ runner, workspacePath: input.workspacePath });\n await sink.emit({\n type: \"executor.completed\",\n message: `Hermes executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = hermesResult.stdout.trim() || hermesResult.stderr.trim() || \"Hermes completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Hermes\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files\n });\n },\n async cancel() {\n return;\n }\n }\n}\n"],"mappings":"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","names":["contextPointerLabel","resolve","contextPointerLabel","contextPointerLabel","contextLines","contextPointerLabel","buildPrompt","contextPointerLabel","contextLines","contextPointerLabel","buildPrompt"]}
1
+ {"version":3,"sources":["../src/claude-code.ts","../src/command.ts","../src/executor-report.ts","../src/executor.ts","../src/git.ts","../src/result.ts","../src/codex.ts","../src/security.ts","../src/echo.ts","../src/session-profile.ts","../src/hermes.ts"],"sourcesContent":["import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandRunner } from \"./command.js\";\nimport { executorPolicyPromptLines } from \"./executor-report.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport { branchNameForRun, changedFiles, cleanupInternalArtifacts, createRunBranch } from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\n\nexport type ClaudeCodeExecutorOptions = {\n runner?: CommandRunner;\n claudeCommand?: string;\n model?: string;\n permissionMode?: \"acceptEdits\" | \"auto\" | \"bypassPermissions\" | \"default\" | \"plan\";\n dangerouslySkipPermissions?: boolean;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n ...executorPolicyPromptLines()\n ].join(\"\\n\");\n}\n\nexport function createClaudeCodeExecutor(options: ClaudeCodeExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const claudeCommand = options.claudeCommand ?? \"claude\";\n\n return {\n id: \"claude-code\",\n displayName: \"Claude Code Executor\",\n capability: {\n id: \"claude-code\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"branch\",\n requiredSecrets: [\n {\n id: \"anthropic_api_key\",\n label: \"Anthropic API key\",\n required: false,\n env: \"ANTHROPIC_API_KEY\",\n description: \"Needed when the local Claude Code CLI is configured to authenticate from environment.\"\n }\n ],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `claude --print` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n try {\n const claudeVersion = await runner.run(claudeCommand, [\"--version\"], { cwd: input.workspacePath });\n if (claudeVersion.exitCode !== 0) {\n return { ready: false, reason: `Claude Code CLI is not available: ${claudeVersion.stderr || claudeVersion.stdout}` };\n }\n } catch (error) {\n return { ready: false, reason: `Claude Code CLI is not available: ${error instanceof Error ? error.message : String(error)}` };\n }\n const gitStatus = await runner.run(\"git\", [\"status\", \"--porcelain\"], { cwd: input.workspacePath });\n if (gitStatus.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitStatus.stderr || gitStatus.stdout}` };\n }\n if (gitStatus.stdout.trim().length > 0) {\n return { ready: false, reason: \"Workspace has uncommitted changes; refusing to run Claude Code executor.\" };\n }\n return { ready: true };\n },\n async run(input, sink) {\n const branchName = branchNameForRun(input.runId);\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated branch ${branchName}`,\n at: new Date().toISOString()\n });\n await createRunBranch({\n runner,\n workspacePath: input.workspacePath,\n branchName,\n ...(input.baseBranch ? { startPoint: input.baseBranch } : {})\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting claude --print\",\n at: new Date().toISOString()\n });\n\n const args = [\n \"--print\",\n \"--input-format\",\n \"text\",\n \"--output-format\",\n \"text\",\n \"--no-session-persistence\",\n ...(options.model ? [\"--model\", options.model] : []),\n ...(options.permissionMode ? [\"--permission-mode\", options.permissionMode] : []),\n ...(options.dangerouslySkipPermissions ? [\"--dangerously-skip-permissions\"] : [])\n ];\n const claudeResult = await runner.run(claudeCommand, args, {\n cwd: input.workspacePath,\n input: buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n })\n });\n await assertCommandSucceeded(claudeResult, \"claude --print\");\n\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: input.workspacePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n\n const files = await changedFiles({ runner, workspacePath: input.workspacePath });\n await sink.emit({\n type: \"executor.completed\",\n message: `Claude Code executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = claudeResult.stdout.trim() || claudeResult.stderr.trim() || \"Claude Code completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Claude Code\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files\n });\n },\n async cancel() {\n return;\n }\n };\n}\n","import { spawn } from \"node:child_process\";\n\nexport type CommandResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport type CommandEnvironment = Record<string, string | undefined>;\n\nexport type CommandRunner = {\n run(command: string, args: string[], options?: { cwd?: string; input?: string; env?: CommandEnvironment }): Promise<CommandResult>;\n};\n\nexport const nodeCommandRunner: CommandRunner = {\n run(command, args, options = {}) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n\n child.stdout.on(\"data\", (chunk: Buffer) => stdout.push(chunk));\n child.stderr.on(\"data\", (chunk: Buffer) => stderr.push(chunk));\n child.on(\"error\", reject);\n child.on(\"close\", (exitCode) => {\n resolve({\n exitCode: exitCode ?? 1,\n stdout: Buffer.concat(stdout).toString(\"utf8\"),\n stderr: Buffer.concat(stderr).toString(\"utf8\")\n });\n });\n\n // A large prompt (larger than the OS pipe buffer, ~64KB) written to a\n // child that exits or closes its stdin before the full write drains emits\n // an EPIPE on the stdin stream. Without a listener that error is uncaught\n // and crashes the long-lived local-runtime polling daemon. Swallow it: the\n // child's exit/close is already handled above and is the authoritative\n // signal here.\n child.stdin.on(\"error\", () => {});\n\n if (options.input) {\n child.stdin.write(options.input);\n }\n child.stdin.end();\n });\n }\n};\n\nexport async function assertCommandSucceeded(result: CommandResult, label: string): Promise<void> {\n if (result.exitCode !== 0) {\n throw new Error(`${label} failed with exit code ${result.exitCode}: ${result.stderr || result.stdout}`);\n }\n}\n","export const EXECUTOR_REPORT_START = \"OPENTAG_EXECUTOR_REPORT_START\";\nexport const EXECUTOR_REPORT_END = \"OPENTAG_EXECUTOR_REPORT_END\";\n\nconst REPORT_OUTCOMES = new Set([\"passed\", \"failed\", \"not_run\"]);\nconst MAX_REPORT_ITEMS = 8;\nconst MAX_REPORT_TEXT_LENGTH = 600;\n\nexport type ExecutorReport = {\n changes: Array<{\n file?: string;\n summary: string;\n }>;\n verification?: Array<{\n command?: string;\n outcome: \"passed\" | \"failed\" | \"not_run\";\n summary?: string;\n }>;\n risks?: string[];\n notes?: string[];\n};\n\nexport function executorReportPromptLines(): string[] {\n return [\n \"End with this exact machine-readable OpenTag executor report block. Put it last.\",\n \"If the user asked a read-only question or summary request, put the user-facing answer before this block; this block is only completion metadata.\",\n \"Replace every example value with the actual result. Use changes: [] if no files changed.\",\n \"Use verification: [] if no checks ran. Use verification outcome exactly one of: passed, failed, not_run.\",\n EXECUTOR_REPORT_START,\n JSON.stringify(\n {\n changes: [{ file: \"README.md\", summary: \"Added one sentence describing the completed change.\" }],\n verification: [{ command: \"corepack pnpm test\", outcome: \"passed\", summary: \"Tests passed.\" }],\n risks: []\n },\n null,\n 2\n ),\n EXECUTOR_REPORT_END\n ];\n}\n\nexport function executorPolicyPromptLines(): string[] {\n return [\n \"Work autonomously but keep the change narrow. Run relevant verification if you modify files.\",\n \"OpenTag owns the source-control handoff after you finish.\",\n \"Do not run, request, or recommend git add, git commit, git push, or gh pr create.\",\n \"Do not ask the user to approve local source-control commands; summarize file changes and verification only.\",\n \"OpenTag will publish the run branch and expose pull-request creation as a suggested action.\",\n ...executorReportPromptLines()\n ];\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction cleanReportText(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const text = value.replace(/\\s+/g, \" \").trim();\n return text.length > 0 ? text.slice(0, MAX_REPORT_TEXT_LENGTH) : undefined;\n}\n\nfunction cleanStringArray(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const items = value.map(cleanReportText).filter((item): item is string => Boolean(item));\n return items.length > 0 ? items.slice(0, MAX_REPORT_ITEMS) : undefined;\n}\n\nfunction normalizeReport(value: unknown): ExecutorReport | undefined {\n const record = asRecord(value);\n if (!record || !Array.isArray(record[\"changes\"])) return undefined;\n\n const changes = record[\"changes\"]\n .map((item) => {\n const change = asRecord(item);\n if (!change) return undefined;\n const summary = cleanReportText(change[\"summary\"]);\n if (!summary) return undefined;\n const file = cleanReportText(change[\"file\"]);\n return file ? { file, summary } : { summary };\n })\n .filter((item): item is ExecutorReport[\"changes\"][number] => Boolean(item))\n .slice(0, MAX_REPORT_ITEMS);\n\n if ((record[\"changes\"] as unknown[]).length > 0 && changes.length === 0) return undefined;\n\n const verificationRaw = record[\"verification\"];\n const verification = Array.isArray(verificationRaw)\n ? verificationRaw\n .map((item) => {\n const check = asRecord(item);\n if (!check || typeof check[\"outcome\"] !== \"string\" || !REPORT_OUTCOMES.has(check[\"outcome\"])) return undefined;\n const command = cleanReportText(check[\"command\"]);\n const summary = cleanReportText(check[\"summary\"]);\n return {\n ...(command ? { command } : {}),\n outcome: check[\"outcome\"] as \"passed\" | \"failed\" | \"not_run\",\n ...(summary ? { summary } : {})\n };\n })\n .filter((item): item is NonNullable<ExecutorReport[\"verification\"]>[number] => Boolean(item))\n .slice(0, MAX_REPORT_ITEMS)\n : undefined;\n\n if (Array.isArray(verificationRaw) && verificationRaw.length > 0 && (!verification || verification.length === 0)) {\n return undefined;\n }\n\n const risks = cleanStringArray(record[\"risks\"]);\n const notes = cleanStringArray(record[\"notes\"]);\n\n return {\n changes,\n ...(verification && verification.length > 0 ? { verification } : {}),\n ...(risks ? { risks } : {}),\n ...(notes ? { notes } : {})\n };\n}\n\nfunction markerCandidate(output: string): string | undefined {\n const startIndex = output.lastIndexOf(EXECUTOR_REPORT_START);\n if (startIndex < 0) return undefined;\n const afterStart = output.slice(startIndex + EXECUTOR_REPORT_START.length);\n const endIndex = afterStart.indexOf(EXECUTOR_REPORT_END);\n return (endIndex >= 0 ? afterStart.slice(0, endIndex) : afterStart).trim();\n}\n\nfunction parseCandidate(candidate: string): ExecutorReport | undefined {\n try {\n return normalizeReport(JSON.parse(candidate));\n } catch {\n return undefined;\n }\n}\n\nexport function parseExecutorReport(output: string): ExecutorReport | undefined {\n const marker = markerCandidate(output);\n if (marker) {\n const parsed = parseCandidate(marker);\n if (parsed) return parsed;\n }\n\n return parseCandidate(output.trim());\n}\n\nfunction deterministicSummary(input: { executorName: string; changedFiles: string[] }): string {\n if (input.changedFiles.length === 0) {\n return `${input.executorName} completed without file changes.`;\n }\n\n return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(\", \")}.`;\n}\n\nexport function renderExecutorReportSummary(input: {\n executorName: string;\n changedFiles: string[];\n report: ExecutorReport;\n}): string {\n const lines: string[] = [];\n\n if (input.report.changes.length > 0) {\n lines.push(\"What changed:\");\n for (const change of input.report.changes) {\n lines.push(`- ${change.file ? `\\`${change.file}\\`: ` : \"\"}${change.summary}`);\n }\n }\n\n if (input.report.verification?.length) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Verified:\");\n for (const check of input.report.verification) {\n const prefix = check.command ? `\\`${check.command}\\`: ${check.outcome}` : check.outcome;\n lines.push(`- ${check.summary ? `${prefix} - ${check.summary}` : prefix}`);\n }\n }\n\n if (input.report.risks?.length) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(\"Risks:\");\n for (const risk of input.report.risks) {\n lines.push(`- ${risk}`);\n }\n }\n\n return lines.length > 0 ? lines.join(\"\\n\") : deterministicSummary(input);\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer, type OpenTagCommand, type OpenTagRunResult, type PermissionGrant } from \"@opentag/core\";\nimport type { AgentSessionProfile } from \"./session-profile.js\";\n\nexport type ExecutorEvent = {\n type: \"executor.started\" | \"executor.progress\" | \"executor.completed\" | \"executor.failed\";\n message: string;\n at: string;\n};\n\nexport type ExecutorEventSink = {\n emit(event: ExecutorEvent): Promise<void>;\n};\n\nexport type ExecutorRunInput = {\n runId: string;\n workspacePath: string;\n command: OpenTagCommand;\n context: ContextPointer[];\n contextPacket?: ContextPacket;\n permissions?: PermissionGrant[];\n baseBranch?: string;\n worktreeRoot?: string;\n keepWorktree?: \"always\" | \"on_failure\" | \"never\";\n metadata?: Record<string, unknown>;\n sessionProfile?: AgentSessionProfile;\n};\n\nexport function renderContextPacketForPrompt(packet?: ContextPacket): string[] {\n if (!packet) return [];\n\n const lines = [\"OpenTag context packet:\", `- summary: ${packet.summary}`];\n\n if (packet.intent) {\n lines.push(`- intent: ${packet.intent.normalizedIntent}`);\n lines.push(`- requested by: ${packet.intent.requestedBy.provider}:${packet.intent.requestedBy.providerUserId}`);\n }\n\n if (packet.sources?.length) {\n lines.push(\"- selected sources:\");\n for (const source of packet.sources) {\n lines.push(` - [${source.role}] ${contextPointerLabel(source.pointer)}: ${source.pointer.uri}`);\n lines.push(` reason: ${source.reason}`);\n }\n }\n\n if (packet.facts?.length) {\n lines.push(\"- facts:\");\n for (const fact of packet.facts) {\n lines.push(` - ${fact.text}`);\n }\n }\n\n if (packet.exclusions?.length) {\n lines.push(\"- exclusions:\");\n for (const exclusion of packet.exclusions) {\n lines.push(` - ${exclusion}`);\n }\n }\n\n return lines;\n}\n\nexport type ExecutorReadiness = {\n ready: boolean;\n reason?: string;\n};\n\nexport type ExecutorSecretRequirement = {\n id: string;\n label: string;\n required: boolean;\n description?: string;\n env?: string;\n};\n\nexport type ExecutorCompletionSignal = {\n type: \"process_exit\" | \"hook_event\" | \"stream_event\";\n required: boolean;\n description: string;\n};\n\nexport type ExecutorProgressEventMode = \"none\" | \"audit\" | \"human\";\nexport type ExecutorApprovalMode = \"none\" | \"opentag_policy\" | \"executor_managed\";\nexport type ExecutorContextAccess = \"context_packet\" | \"context_pointers\" | \"workspace\";\nexport type ExecutorPromptAssembly = \"opentag\" | \"executor_adapter\" | \"external_runtime\";\nexport type ExecutorWriteAccess = \"none\" | \"workspace\" | \"external\";\nexport type ExecutorConversationAccess = \"none\" | \"request\" | \"thread_transcript\";\nexport type ExecutorPromptMutation = \"none\" | \"append\" | \"replace\";\nexport type ExecutorWriteActionAccess = \"none\" | \"propose\" | \"execute\";\n\nexport type ExecutorCapabilityContract = {\n id: string;\n invocation: \"spawn\" | \"hook_ingest\" | \"hybrid\";\n supportsProfile: boolean;\n supportsStreaming: boolean;\n supportsCancel: boolean;\n supportsHookCompletion: boolean;\n progressEvents: ExecutorProgressEventMode;\n approvalMode: ExecutorApprovalMode;\n contextAccess: ExecutorContextAccess[];\n promptAssembly: ExecutorPromptAssembly;\n writeAccess: ExecutorWriteAccess;\n conversationAccess: ExecutorConversationAccess;\n promptMutation: ExecutorPromptMutation;\n rawContextAccess: boolean;\n writeActionAccess: ExecutorWriteActionAccess;\n workspaceIsolation: \"none\" | \"branch\" | \"worktree\" | \"external\";\n requiredSecrets: ExecutorSecretRequirement[];\n completionSignals: ExecutorCompletionSignal[];\n};\n\nexport type ExecutorAdapter = {\n id: string;\n displayName: string;\n capability?: ExecutorCapabilityContract;\n canRun(input: ExecutorRunInput): Promise<ExecutorReadiness>;\n run(input: ExecutorRunInput, sink: ExecutorEventSink): Promise<OpenTagRunResult>;\n cancel(runId: string): Promise<void>;\n};\n","import { mkdirSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { CommandRunner } from \"./command.js\";\nimport { assertCommandSucceeded } from \"./command.js\";\n\nexport type GitStatusEntry = {\n status: string;\n path: string;\n};\n\nconst INTERNAL_ARTIFACT_ROOTS = [\".omx\", \".codex\", \".claude\"];\n\nexport function branchNameForRun(runId: string): string {\n const safeRunId = runId.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n return `opentag/${safeRunId}`;\n}\n\n// Git status command used by the helpers below. We use the NUL-delimited\n// porcelain form (`-z`) so that renamed/copied entries and paths containing\n// spaces, quotes, newlines, or unicode survive parsing intact. `-z` also\n// disables the quoting/escaping that the default newline form applies, and\n// `core.quotePath=false` keeps unicode bytes verbatim rather than \\NNN escapes.\nexport const STATUS_PORCELAIN_Z_ARGS = [\"-c\", \"core.quotePath=false\", \"status\", \"--porcelain\", \"-z\"];\n\n// Parses `git status --porcelain -z` output (NUL-delimited records).\n//\n// In the `-z` format each record is terminated by a NUL byte. For ordinary\n// entries a record is `XY <path>`. For rename (\"R\") and copy (\"C\") entries the\n// destination is emitted in the `XY <dest>` record and the source path follows\n// as a SEPARATE NUL-terminated record. We consume that following record as the\n// source and keep the destination as the changed path, so consumers never see\n// the literal `original -> renamed` arrow form that breaks `git add --`.\nexport function parseStatusEntries(statusOutput: string): GitStatusEntry[] {\n const records = statusOutput.split(\"\\0\");\n const entries: GitStatusEntry[] = [];\n\n for (let index = 0; index < records.length; index += 1) {\n const record = records[index];\n if (!record) continue;\n\n const status = record.slice(0, 2);\n const path = record.slice(3);\n\n // Rename/copy records carry a trailing source record we must skip past so\n // it is not mistaken for an independent change. Git's XY status can put\n // rename/copy in either column (index or worktree), so check both.\n const isRenameOrCopy = status.includes(\"R\") || status.includes(\"C\");\n if (isRenameOrCopy) {\n index += 1;\n }\n\n if (path.length === 0) continue;\n entries.push({ status, path });\n }\n\n return entries;\n}\n\nexport function isInternalArtifactPath(path: string): boolean {\n return INTERNAL_ARTIFACT_ROOTS.some((root) => path === root || path.startsWith(`${root}/`));\n}\n\nexport function parseChangedFiles(statusOutput: string): string[] {\n return parseStatusEntries(statusOutput)\n .map((entry) => entry.path)\n .filter((path) => !isInternalArtifactPath(path));\n}\n\nexport async function createRunBranch(input: {\n runner: CommandRunner;\n workspacePath: string;\n branchName: string;\n startPoint?: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"checkout\", \"-B\", input.branchName, ...(input.startPoint ? [input.startPoint] : [])], { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"create run branch\");\n}\n\nexport function worktreePathForRun(input: {\n workspacePath: string;\n runId: string;\n worktreeRoot?: string;\n}): string {\n const safeRunId = input.runId.replace(/[^a-zA-Z0-9._-]/g, \"-\");\n const root = input.worktreeRoot ?? `${input.workspacePath.replace(/\\/$/, \"\")}/.worktrees/opentag`;\n return `${root.replace(/\\/$/, \"\")}/${safeRunId}`;\n}\n\nexport async function createRunWorktree(input: {\n runner: CommandRunner;\n workspacePath: string;\n worktreePath: string;\n branchName: string;\n baseBranch: string;\n}): Promise<void> {\n mkdirSync(dirname(input.worktreePath), { recursive: true });\n const result = await input.runner.run(\n \"git\",\n [\"worktree\", \"add\", \"-B\", input.branchName, input.worktreePath, input.baseBranch],\n { cwd: input.workspacePath }\n );\n await assertCommandSucceeded(result, \"create run worktree\");\n}\n\nexport async function removeRunWorktree(input: {\n runner: CommandRunner;\n workspacePath: string;\n worktreePath: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"worktree\", \"remove\", \"--force\", input.worktreePath], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(result, \"remove run worktree\");\n}\n\nexport async function deleteRunBranch(input: { runner: CommandRunner; workspacePath: string; branchName: string }): Promise<void> {\n const result = await input.runner.run(\"git\", [\"branch\", \"-D\", input.branchName], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(result, \"delete empty run branch\");\n}\n\nexport async function changedFiles(input: { runner: CommandRunner; workspacePath: string }): Promise<string[]> {\n const result = await input.runner.run(\"git\", STATUS_PORCELAIN_Z_ARGS, { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"read changed files\");\n return parseChangedFiles(result.stdout);\n}\n\nexport async function cleanupInternalArtifacts(input: { runner: CommandRunner; workspacePath: string }): Promise<string[]> {\n const statusResult = await input.runner.run(\"git\", STATUS_PORCELAIN_Z_ARGS, { cwd: input.workspacePath });\n await assertCommandSucceeded(statusResult, \"scan internal artifacts\");\n const untrackedRoots = Array.from(\n new Set(\n parseStatusEntries(statusResult.stdout)\n .filter((entry) => entry.status === \"??\" && isInternalArtifactPath(entry.path))\n .map((entry) => entry.path.split(\"/\", 1)[0] ?? entry.path)\n )\n );\n if (untrackedRoots.length === 0) return [];\n\n const cleanResult = await input.runner.run(\"git\", [\"clean\", \"-fd\", \"--\", ...untrackedRoots], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(cleanResult, \"clean internal artifacts\");\n return untrackedRoots;\n}\n\nexport async function commitRunChanges(input: {\n runner: CommandRunner;\n workspacePath: string;\n message: string;\n}): Promise<boolean> {\n const files = await changedFiles({ runner: input.runner, workspacePath: input.workspacePath });\n if (files.length === 0) return false;\n\n const addResult = await input.runner.run(\"git\", [\"add\", \"--\", ...files], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(addResult, \"stage run changes\");\n\n const commitResult = await input.runner.run(\"git\", [\"commit\", \"-m\", input.message], {\n cwd: input.workspacePath\n });\n await assertCommandSucceeded(commitResult, \"commit run changes\");\n return true;\n}\n\nexport async function commitChangedFiles(input: {\n runner: CommandRunner;\n workspacePath: string;\n files: string[];\n message: string;\n}): Promise<void> {\n if (input.files.length === 0) return;\n const addResult = await input.runner.run(\"git\", [\"add\", \"--\", ...input.files], { cwd: input.workspacePath });\n await assertCommandSucceeded(addResult, \"stage changed files\");\n const commitResult = await input.runner.run(\"git\", [\"commit\", \"-m\", input.message], { cwd: input.workspacePath });\n await assertCommandSucceeded(commitResult, \"commit changed files\");\n}\n\nexport async function pushBranch(input: {\n runner: CommandRunner;\n workspacePath: string;\n remote: string;\n branchName: string;\n}): Promise<void> {\n const result = await input.runner.run(\"git\", [\"push\", \"-u\", input.remote, input.branchName], { cwd: input.workspacePath });\n await assertCommandSucceeded(result, \"push run branch\");\n}\n","import type { OpenTagRunResult } from \"@opentag/core\";\nimport { EXECUTOR_REPORT_START, parseExecutorReport, renderExecutorReportSummary } from \"./executor-report.js\";\n\nconst MAX_EXECUTOR_SUMMARY_LENGTH = 4000;\n\nconst DIRECT_SOURCE_CONTROL_COMMAND_PATTERN = /^\\s*(?:[-*]\\s*)?(?:`{1,3})?\\s*(?:git\\s+(?:add|commit|push|checkout)|gh\\s+pr\\s+create)\\b/i;\n\nconst GIT_HANDOFF_PATTERNS = [\n DIRECT_SOURCE_CONTROL_COMMAND_PATTERN,\n /\\b(?:interactive user approval|permission system)\\b.*\\b(?:git|source-control|commit|push|pull request|pr)\\b/i,\n /\\b(?:git|source-control|commit|push|pull request|pr)\\b.*\\b(?:interactive user approval|permission system)\\b/i,\n /(?=.*\\b(?:git\\s+(?:add|commit|push|checkout)|gh\\s+pr\\s+create|commit|push|pull request|pr)\\b)(?=.*\\b(?:approval|approve|manual|need|needs|cannot|can't|please|requires?|required|finish|next action|remaining work|blocked|blocker|permission)\\b)/i\n];\n\nconst HANDOFF_HEADING_PATTERN =\n /^(?:#{1,6}\\s*)?(?:\\*\\*)?\\s*(?:blocker|recommended next action|next action|remaining work|manual steps|to finish)\\b.*\\b(?:git|source-control|commit|push|pull request|pr)\\b/i;\n\nfunction looksLikeGitHandoff(line: string): boolean {\n return GIT_HANDOFF_PATTERNS.some((pattern) => pattern.test(line));\n}\n\nfunction stripGitHandoffTail(line: string): string {\n if (!looksLikeGitHandoff(line)) return line;\n return line\n .replace(/\\s*(?:Blocker|Recommended next action|Next action|Remaining work|Manual steps|To finish)\\s*:.*$/i, \"\")\n .trimEnd();\n}\n\nfunction cleanOrFallbackExecutorSummary(input: {\n executorName: string;\n output: string;\n changedFiles: string[];\n}): string {\n const summary = cleanExecutorSummaryText(input.output);\n if (summary) return summary;\n\n if (input.changedFiles.length === 0) {\n return `${input.executorName} completed without file changes.`;\n }\n\n return `${input.executorName} changed ${input.changedFiles.length} file(s). Changed files: ${input.changedFiles.join(\", \")}.`;\n}\n\nfunction cleanExecutorSummaryText(output: string): string | undefined {\n const normalizedOutput = output.replace(/\\r\\n/g, \"\\n\");\n const sliceStart = Math.max(0, normalizedOutput.length - MAX_EXECUTOR_SUMMARY_LENGTH);\n let rawSummary = normalizedOutput.slice(sliceStart);\n if (sliceStart > 0 && normalizedOutput[sliceStart - 1] !== \"\\n\") {\n const firstCompleteLine = rawSummary.indexOf(\"\\n\");\n rawSummary = firstCompleteLine >= 0 ? rawSummary.slice(firstCompleteLine + 1) : \"\";\n }\n const filteredLines: string[] = [];\n\n for (const rawLine of rawSummary.split(\"\\n\")) {\n const trimmed = rawLine.trim();\n if (HANDOFF_HEADING_PATTERN.test(trimmed)) continue;\n\n const withoutHandoffTail = stripGitHandoffTail(rawLine);\n if (looksLikeGitHandoff(withoutHandoffTail)) continue;\n if (withoutHandoffTail.trim().length === 0 && trimmed.length > 0) continue;\n\n filteredLines.push(withoutHandoffTail);\n }\n\n const summary = filteredLines\n .join(\"\\n\")\n .replace(/(?:^|\\n)\\s*(?:To finish|Manual steps):\\s*\\n```[^\\n]*\\n\\s*```/gi, \"\\n\")\n .replace(/```[^\\n]*\\n\\s*```/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n\n return summary.length > 0 ? summary : undefined;\n}\n\nfunction executorAnswerBeforeReport(output: string): string | undefined {\n const startIndex = output.lastIndexOf(EXECUTOR_REPORT_START);\n if (startIndex < 0) return undefined;\n return cleanExecutorSummaryText(output.slice(0, startIndex));\n}\n\nfunction summaryWithExecutorAnswer(input: {\n executorName: string;\n output: string;\n changedFiles: string[];\n report: NonNullable<ReturnType<typeof parseExecutorReport>>;\n}): string {\n const reportSummary = renderExecutorReportSummary(input);\n if (input.changedFiles.length > 0 || input.report.changes.length > 0) return reportSummary;\n\n const answer = executorAnswerBeforeReport(input.output);\n if (!answer || answer === reportSummary) return reportSummary;\n\n const hasReportDetails = Boolean(input.report.verification?.length || input.report.risks?.length);\n return hasReportDetails ? [answer, \"\", reportSummary].join(\"\\n\") : answer;\n}\n\nexport function createExecutorRunResult(input: {\n executorName: string;\n runId: string;\n branchName: string;\n baseBranch?: string;\n output: string;\n changedFiles: string[];\n extraArtifacts?: NonNullable<OpenTagRunResult[\"artifacts\"]>;\n}): OpenTagRunResult {\n const proposalId = `proposal_${input.runId}`;\n const report = parseExecutorReport(input.output);\n const summary = report ? summaryWithExecutorAnswer({ ...input, report }) : cleanOrFallbackExecutorSummary(input);\n const suggestedChanges =\n input.changedFiles.length > 0\n ? [\n {\n proposalId,\n createdAt: new Date().toISOString(),\n sourceRunId: input.runId,\n summary: `${input.executorName} changed ${input.changedFiles.length} file(s) on branch ${input.branchName}.`,\n intents: [\n {\n intentId: `${proposalId}_create_pr`,\n domain: \"pull_request\" as const,\n action: \"create_pull_request\",\n summary: `Create a pull request for branch ${input.branchName}.`,\n params: {\n title: `OpenTag run ${input.runId}`,\n body: [\n \"## Summary\",\n \"\",\n summary\n ].join(\"\\n\"),\n head: input.branchName,\n base: input.baseBranch ?? \"main\",\n changedFiles: input.changedFiles,\n risks: [\"Creates a pull request from the executor-produced branch; review the diff before merging.\"],\n executorConditions: [\"isolated branch exists\"]\n }\n },\n {\n intentId: `${proposalId}_link_branch`,\n domain: \"artifact_links\" as const,\n action: \"link_artifact\",\n summary: `Link the run branch ${input.branchName} to the work item.`,\n params: { title: \"Run branch\", uri: input.branchName }\n },\n {\n intentId: `${proposalId}_request_review`,\n domain: \"review\" as const,\n action: \"request_review\",\n summary: \"Request human review of the generated code changes.\",\n params: { changedFiles: input.changedFiles }\n }\n ],\n preconditions: [\"The local branch was generated from the checkout state available to the runner.\"]\n }\n ]\n : undefined;\n\n return {\n conclusion: \"success\",\n summary,\n changedFiles: input.changedFiles,\n artifacts: [\n ...(input.changedFiles.length > 0 ? [{ kind: \"patch\" as const, title: \"Run branch\", uri: input.branchName }] : []),\n ...(input.extraArtifacts ?? [])\n ],\n ...(suggestedChanges ? { suggestedChanges } : {}),\n nextAction:\n input.changedFiles.length > 0\n ? {\n summary: \"Review the proposed pull request action and reply `apply 1` if the branch should become a PR.\",\n hint: {\n kind: \"create_pull_request\",\n targetId: proposalId,\n selectedIntentIds: [`${proposalId}_create_pr`]\n }\n }\n : \"No file changes were detected.\"\n };\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandRunner } from \"./command.js\";\nimport { executorPolicyPromptLines } from \"./executor-report.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport {\n branchNameForRun,\n changedFiles,\n cleanupInternalArtifacts,\n commitRunChanges,\n createRunWorktree,\n deleteRunBranch,\n removeRunWorktree,\n worktreePathForRun\n} from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\nimport { assessRunnerSecurity, formatSecurityAssessment, scrubEnvironment, type RunnerSecurityPolicy } from \"./security.js\";\n\nexport type CodexExecutorOptions = {\n runner?: CommandRunner;\n codexCommand?: string;\n model?: string;\n security?: RunnerSecurityPolicy;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n ...executorPolicyPromptLines()\n ].join(\"\\n\");\n}\n\nexport function createCodexExecutor(options: CodexExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const codexCommand = options.codexCommand ?? \"codex\";\n\n return {\n id: \"codex\",\n displayName: \"Codex Executor\",\n capability: {\n id: \"codex\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"worktree\",\n requiredSecrets: [\n {\n id: \"openai_api_key\",\n label: \"OpenAI API key\",\n required: false,\n env: \"OPENAI_API_KEY\",\n description: \"Needed when the local Codex CLI is configured to authenticate from environment.\"\n }\n ],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `codex exec` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n const codexVersion = await runner.run(codexCommand, [\"--version\"], { cwd: input.workspacePath });\n if (codexVersion.exitCode !== 0) {\n return { ready: false, reason: `Codex CLI is not available: ${codexVersion.stderr || codexVersion.stdout}` };\n }\n const gitRepo = await runner.run(\"git\", [\"rev-parse\", \"--show-toplevel\"], { cwd: input.workspacePath });\n if (gitRepo.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitRepo.stderr || gitRepo.stdout}` };\n }\n const baseBranch = input.baseBranch ?? \"main\";\n const baseRef = await runner.run(\"git\", [\"rev-parse\", \"--verify\", `${baseBranch}^{commit}`], {\n cwd: input.workspacePath\n });\n if (baseRef.exitCode !== 0) {\n return { ready: false, reason: `Base branch '${baseBranch}' is not available: ${baseRef.stderr || baseRef.stdout}` };\n }\n return { ready: true };\n },\n async run(input, sink) {\n const security = options.security;\n const worktreePath = worktreePathForRun({\n workspacePath: input.workspacePath,\n runId: input.runId,\n ...(input.worktreeRoot ? { worktreeRoot: input.worktreeRoot } : {})\n });\n const assessment = assessRunnerSecurity({\n executorId: \"codex\",\n workspacePath: input.workspacePath,\n executionPath: worktreePath,\n command: input.command,\n context: input.context,\n ...(input.permissions ? { permissions: input.permissions } : {}),\n ...(security ? { policy: security } : {})\n });\n if (assessment.findings.length > 0) {\n await sink.emit({\n type: assessment.allowed ? \"executor.progress\" : \"executor.failed\",\n message: formatSecurityAssessment(assessment),\n at: new Date().toISOString()\n });\n }\n if (!assessment.allowed) {\n return {\n conclusion: \"needs_human\",\n summary: formatSecurityAssessment(assessment),\n nextAction: \"Review the request and rerun with a narrower prompt or an explicit local policy override if appropriate.\"\n };\n }\n\n const branchName = branchNameForRun(input.runId);\n const baseBranch = input.baseBranch ?? \"main\";\n const keepWorktree = input.keepWorktree ?? \"on_failure\";\n let completed = false;\n let changedFileCount: number | undefined;\n\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated worktree ${worktreePath} on ${branchName}`,\n at: new Date().toISOString()\n });\n try {\n await createRunWorktree({\n runner,\n workspacePath: input.workspacePath,\n worktreePath,\n branchName,\n baseBranch\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting codex exec\",\n at: new Date().toISOString()\n });\n\n const args = [\n \"exec\",\n \"--cd\",\n worktreePath,\n \"--full-auto\",\n \"--ephemeral\",\n ...(options.model ? [\"--model\", options.model] : []),\n \"-\"\n ];\n const codexResult = await runner.run(codexCommand, args, {\n cwd: worktreePath,\n env: scrubEnvironment(undefined, security),\n input: buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n })\n });\n await assertCommandSucceeded(codexResult, \"codex exec\");\n\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: worktreePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n\n const files = await changedFiles({ runner, workspacePath: worktreePath });\n changedFileCount = files.length;\n if (files.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Committing ${files.length} changed file(s) to ${branchName}`,\n at: new Date().toISOString()\n });\n await commitRunChanges({\n runner,\n workspacePath: worktreePath,\n message: `OpenTag run ${input.runId}`\n });\n }\n completed = true;\n\n await sink.emit({\n type: \"executor.completed\",\n message: `Codex executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = codexResult.stdout.trim() || codexResult.stderr.trim() || \"Codex completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Codex\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files,\n extraArtifacts: keepWorktree === \"always\" ? [{ title: \"Run worktree\", uri: worktreePath }] : []\n });\n } finally {\n const shouldRemove = keepWorktree === \"never\" || (keepWorktree === \"on_failure\" && completed);\n if (shouldRemove) {\n try {\n await removeRunWorktree({ runner, workspacePath: input.workspacePath, worktreePath });\n if (completed && changedFileCount === 0) {\n await deleteRunBranch({ runner, workspacePath: input.workspacePath, branchName });\n }\n } catch (error) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Could not clean up run worktree or branch for ${worktreePath}: ${error instanceof Error ? error.message : String(error)}`,\n at: new Date().toISOString()\n });\n }\n }\n }\n },\n async cancel() {\n return;\n }\n };\n}\n","import { fileURLToPath } from \"node:url\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport type { ContextPointer, OpenTagCommand, PermissionGrant } from \"@opentag/core\";\nimport type { CommandEnvironment } from \"./command.js\";\n\nexport type RunnerSecurityMode = \"enforce\" | \"audit\" | \"off\";\n\nexport type RunnerSecurityPolicy = {\n mode?: RunnerSecurityMode;\n allowedWorkspaceRoot?: string;\n allowUnsafePrompts?: boolean;\n extraSafeEnv?: string[];\n};\n\nexport type RunnerSecurityFinding = {\n code: string;\n severity: \"block\" | \"warn\";\n message: string;\n};\n\nexport type RunnerSecurityAssessment = {\n allowed: boolean;\n mode: RunnerSecurityMode;\n findings: RunnerSecurityFinding[];\n};\n\nexport const DEFAULT_SAFE_ENV_NAMES = [\n \"CI\",\n \"COLORTERM\",\n \"CODEX_HOME\",\n \"FORCE_COLOR\",\n \"HOME\",\n \"LANG\",\n \"LOGNAME\",\n \"NO_COLOR\",\n \"PATH\",\n \"PWD\",\n \"SHELL\",\n \"SSL_CERT_DIR\",\n \"SSL_CERT_FILE\",\n \"TERM\",\n \"TMP\",\n \"TMPDIR\",\n \"TEMP\",\n \"USER\",\n \"XDG_CACHE_HOME\",\n \"XDG_CONFIG_HOME\",\n \"XDG_DATA_HOME\"\n];\n\nconst SAFE_ENV_PREFIXES = [\"LC_\"];\n\nconst SENSITIVE_ENV_PATTERNS = [\n /TOKEN/,\n /SECRET/,\n /PASSWORD/,\n /PASS$/,\n /API[_-]?KEY/,\n /CREDENTIAL/,\n /COOKIE/,\n /SESSION/,\n /AUTH/,\n /^AWS_/,\n /^AZURE_/,\n /^GCP_/,\n /^GOOGLE_/,\n /^OPENAI_/,\n /^ANTHROPIC_/,\n /^SLACK_/,\n /^GITHUB_TOKEN$/,\n /^GH_TOKEN$/,\n /^SSH_/\n];\n\nconst HIGH_RISK_TEXT_PATTERNS: Array<{ code: string; pattern: RegExp; message: string }> = [\n {\n code: \"prompt.instruction_override\",\n pattern: /\\b(ignore|disregard|forget)\\s+(all\\s+)?(previous|prior|system|developer|safety)\\s+instructions\\b/i,\n message: \"Request contains an instruction override pattern commonly used in prompt injection.\"\n },\n {\n code: \"prompt.secret_exfiltration\",\n pattern:\n /\\b(print|dump|show|reveal|exfiltrate|send|upload|post|copy)\\b[\\s\\S]{0,100}\\b(secret|token|password|api[\\s_-]?key|credential|environment variables?|env vars?)\\b/i,\n message: \"Request appears to ask the runner to expose secrets or environment variables.\"\n },\n {\n code: \"prompt.sensitive_file_access\",\n pattern: /\\b(cat|open|read|print|dump)\\b[\\s\\S]{0,80}(~\\/\\.ssh|~\\/\\.aws|\\.env\\b|id_rsa|known_hosts|credentials\\b)/i,\n message: \"Request appears to ask the runner to read sensitive local credential files.\"\n }\n];\n\nfunction securityMode(policy: RunnerSecurityPolicy | undefined): RunnerSecurityMode {\n return policy?.mode ?? \"enforce\";\n}\n\nfunction isPathInside(childPath: string, parentPath: string): boolean {\n const child = resolve(childPath);\n const parent = resolve(parentPath);\n const pathFromParent = relative(parent, child);\n return pathFromParent === \"\" || (!pathFromParent.startsWith(\"..\") && !isAbsolute(pathFromParent));\n}\n\nfunction fileContextPath(pointer: ContextPointer, workspacePath: string): string | null {\n if (pointer.kind !== \"file\") return null;\n if (pointer.uri.startsWith(\"file://\")) {\n return fileURLToPath(pointer.uri);\n }\n if (isAbsolute(pointer.uri)) {\n return pointer.uri;\n }\n return resolve(workspacePath, pointer.uri);\n}\n\nfunction hasPermission(permissions: PermissionGrant[] | undefined, scope: string): boolean {\n return permissions?.some((permission) => permission.scope === scope) ?? false;\n}\n\nfunction needsWritePermission(command: OpenTagCommand, executorId: string): boolean {\n if (executorId === \"echo\") return false;\n return command.intent === \"fix\" || command.intent === \"run\";\n}\n\nfunction scanTextForHighRiskPatterns(input: { command: OpenTagCommand; context: ContextPointer[] }): RunnerSecurityFinding[] {\n const sources = [\n { label: \"command\", text: input.command.rawText },\n ...input.context\n .filter((pointer) => pointer.kind === \"text\")\n .map((pointer) => ({ label: pointer.title ?? \"text context\", text: pointer.uri }))\n ];\n\n const findings: RunnerSecurityFinding[] = [];\n for (const source of sources) {\n for (const rule of HIGH_RISK_TEXT_PATTERNS) {\n if (rule.pattern.test(source.text)) {\n findings.push({\n code: rule.code,\n severity: \"block\",\n message: `${rule.message} Source: ${source.label}.`\n });\n }\n }\n }\n return findings;\n}\n\nexport function assessRunnerSecurity(input: {\n executorId: string;\n workspacePath: string;\n executionPath?: string;\n command: OpenTagCommand;\n context: ContextPointer[];\n permissions?: PermissionGrant[];\n policy?: RunnerSecurityPolicy;\n}): RunnerSecurityAssessment {\n const mode = securityMode(input.policy);\n if (mode === \"off\") {\n return { allowed: true, mode, findings: [] };\n }\n\n const findings: RunnerSecurityFinding[] = [];\n if (!isAbsolute(input.workspacePath)) {\n findings.push({\n code: \"workspace.relative_path\",\n severity: \"block\",\n message: \"Workspace path must be absolute before a local executor can run.\"\n });\n }\n\n const workspacePath = resolve(input.workspacePath);\n const executionPath = resolve(input.executionPath ?? input.workspacePath);\n if (input.policy?.allowedWorkspaceRoot && !isPathInside(workspacePath, input.policy.allowedWorkspaceRoot)) {\n findings.push({\n code: \"workspace.outside_allowed_root\",\n severity: \"block\",\n message: \"Workspace path is outside the configured allowed workspace root.\"\n });\n }\n if (input.policy?.allowedWorkspaceRoot && !isPathInside(executionPath, input.policy.allowedWorkspaceRoot)) {\n findings.push({\n code: \"execution.outside_allowed_root\",\n severity: \"block\",\n message: \"Execution path is outside the configured allowed workspace root.\"\n });\n }\n\n for (const pointer of input.context) {\n const filePath = fileContextPath(pointer, workspacePath);\n if (filePath && !isPathInside(filePath, workspacePath)) {\n findings.push({\n code: \"context.file_outside_workspace\",\n severity: \"block\",\n message: `File context is outside the mapped workspace: ${pointer.uri}`\n });\n }\n }\n\n if (needsWritePermission(input.command, input.executorId) && !hasPermission(input.permissions, \"repo:write\")) {\n findings.push({\n code: \"permission.repo_write_required\",\n severity: \"block\",\n message: \"Write-capable commands require an explicit repo:write permission grant.\"\n });\n }\n\n if (!input.policy?.allowUnsafePrompts) {\n findings.push(...scanTextForHighRiskPatterns({ command: input.command, context: input.context }));\n }\n\n const hasBlockingFinding = findings.some((finding) => finding.severity === \"block\");\n return {\n allowed: mode === \"audit\" || !hasBlockingFinding,\n mode,\n findings\n };\n}\n\nfunction isSensitiveEnvName(name: string): boolean {\n const upperName = name.toUpperCase();\n return SENSITIVE_ENV_PATTERNS.some((pattern) => pattern.test(upperName));\n}\n\nfunction isSafeEnvName(name: string, policy: RunnerSecurityPolicy | undefined): boolean {\n const upperName = name.toUpperCase();\n const safeNames = new Set([...DEFAULT_SAFE_ENV_NAMES, ...(policy?.extraSafeEnv ?? [])].map((envName) => envName.toUpperCase()));\n return safeNames.has(upperName) || SAFE_ENV_PREFIXES.some((prefix) => upperName.startsWith(prefix));\n}\n\nexport function scrubEnvironment(env: CommandEnvironment = process.env, policy?: RunnerSecurityPolicy): CommandEnvironment {\n if (securityMode(policy) === \"off\") return { ...env };\n\n const scrubbed: CommandEnvironment = {};\n for (const [name, value] of Object.entries(env)) {\n if (typeof value !== \"string\") continue;\n if (isSensitiveEnvName(name)) continue;\n if (!isSafeEnvName(name, policy)) continue;\n scrubbed[name] = value;\n }\n return scrubbed;\n}\n\nexport function formatSecurityAssessment(assessment: RunnerSecurityAssessment): string {\n if (assessment.findings.length === 0) {\n return `OpenTag runner security assessment passed in ${assessment.mode} mode.`;\n }\n\n const prefix = assessment.allowed\n ? `OpenTag runner security assessment reported ${assessment.findings.length} finding(s) in ${assessment.mode} mode.`\n : \"OpenTag runner security blocked this run.\";\n const details = assessment.findings.map((finding) => `${finding.code}: ${finding.message}`).join(\" \");\n return `${prefix} ${details}`;\n}\n","import type { ExecutorAdapter } from \"./executor.js\";\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nexport function createEchoExecutor(): ExecutorAdapter {\n return {\n id: \"echo\",\n displayName: \"Echo Executor\",\n capability: {\n id: \"echo\",\n invocation: \"spawn\",\n supportsProfile: false,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\"],\n promptAssembly: \"opentag\",\n writeAccess: \"none\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"none\",\n requiredSecrets: [],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"The in-process echo executor returns a structured result immediately.\"\n }\n ]\n },\n async canRun() {\n return { ready: true };\n },\n async run(input, sink) {\n await sink.emit({\n type: \"executor.started\",\n message: `Echo executor started for ${input.runId}`,\n at: nowIso()\n });\n await sink.emit({\n type: \"executor.completed\",\n message: `Echo executor completed for ${input.runId}`,\n at: nowIso()\n });\n return {\n conclusion: \"success\",\n summary: `Echoed OpenTag command: ${input.command.rawText}`,\n verification: [\n {\n command: \"echo\",\n outcome: \"passed\",\n excerpt: input.command.rawText\n }\n ],\n nextAction: {\n summary: \"No external state change is suggested for the echo executor result.\",\n hint: { kind: \"none\" }\n }\n };\n },\n async cancel() {\n return;\n }\n };\n}\n","import { formatProjectTargetRef, projectTargetRefFromEvent, type OpenTagEvent, type ProjectTargetRef } from \"@opentag/core\";\n\nexport const DEFAULT_AGENT_SESSION_PROFILE_TEMPLATE =\n \"opentag-{provider}-{accountId}-{conversationId}-{owner}-{repo}-{actorId}\";\n\nexport type AgentSessionProfile = {\n id: string;\n template: string;\n sourceProvider: string;\n projectTarget?: string;\n accountId?: string;\n conversationId?: string;\n actorId?: string;\n};\n\nfunction metadataString(metadata: Record<string, unknown> | undefined, key: string): string {\n const value = metadata?.[key];\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n return \"\";\n}\n\nexport function sanitizeAgentSessionProfileId(profile: string): string {\n return profile.replace(/[^A-Za-z0-9_.-]+/g, \"-\").replace(/-+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction profileTemplateValue(input: {\n key: string;\n runId: string;\n sourceProvider: string;\n metadata: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef;\n actorId?: string;\n}): string {\n if (input.key === \"runId\") return input.runId;\n if (input.key === \"provider\" || input.key === \"sourceProvider\") return input.sourceProvider;\n if (input.key === \"projectTarget\") return input.projectTargetRef ? formatProjectTargetRef(input.projectTargetRef) : \"\";\n if (input.key === \"repoProvider\") return input.projectTargetRef?.provider ?? metadataString(input.metadata, \"repoProvider\");\n if (input.key === \"owner\") return input.projectTargetRef?.owner ?? metadataString(input.metadata, \"owner\");\n if (input.key === \"repo\") return input.projectTargetRef?.repo ?? metadataString(input.metadata, \"repo\");\n if (input.key === \"actorId\") return input.actorId ?? \"\";\n return metadataString(input.metadata, input.key);\n}\n\nexport function createAgentSessionProfile(input: {\n runId: string;\n sourceProvider: string;\n metadata?: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef | null;\n actorId?: string;\n template?: string;\n fallbackId?: string;\n}): AgentSessionProfile | undefined {\n const template = input.template ?? DEFAULT_AGENT_SESSION_PROFILE_TEMPLATE;\n const metadata = input.metadata ?? {};\n const projectTargetRef = input.projectTargetRef ?? undefined;\n const profile = template.replace(/\\{([^}]+)\\}/g, (_match, key: string) =>\n profileTemplateValue({\n key,\n runId: input.runId,\n sourceProvider: input.sourceProvider,\n metadata,\n ...(projectTargetRef ? { projectTargetRef } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {})\n })\n );\n const id = sanitizeAgentSessionProfileId(profile) || (input.fallbackId ? sanitizeAgentSessionProfileId(input.fallbackId) : \"\");\n if (!id) return undefined;\n\n const accountId = metadataString(metadata, \"accountId\");\n const conversationId = metadataString(metadata, \"conversationId\");\n return {\n id,\n template,\n sourceProvider: input.sourceProvider,\n ...(projectTargetRef ? { projectTarget: formatProjectTargetRef(projectTargetRef) } : {}),\n ...(accountId ? { accountId } : {}),\n ...(conversationId ? { conversationId } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {})\n };\n}\n\nexport function createAgentSessionProfileForEvent(input: {\n runId: string;\n event: OpenTagEvent;\n metadata?: Record<string, unknown>;\n template?: string;\n fallbackId?: string;\n}): AgentSessionProfile | undefined {\n return createAgentSessionProfile({\n runId: input.runId,\n sourceProvider: input.event.source,\n metadata: input.metadata ?? input.event.metadata,\n projectTargetRef: projectTargetRefFromEvent(input.event),\n actorId: input.event.actor.providerUserId,\n ...(input.template ? { template: input.template } : {}),\n ...(input.fallbackId ? { fallbackId: input.fallbackId } : {})\n });\n}\n\nexport function resolveAgentSessionProfile(input: {\n profile?: string;\n profileTemplate?: string;\n metadata?: Record<string, unknown>;\n projectTargetRef?: ProjectTargetRef | null;\n actorId?: string;\n fallback?: AgentSessionProfile;\n}): AgentSessionProfile | undefined {\n if (input.profile) {\n const id = sanitizeAgentSessionProfileId(input.profile);\n const metadata = input.metadata ?? {};\n const accountId = metadataString(metadata, \"accountId\") || input.fallback?.accountId;\n const conversationId = metadataString(metadata, \"conversationId\") || input.fallback?.conversationId;\n const actorId = input.actorId ?? input.fallback?.actorId;\n const projectTarget = input.projectTargetRef ? formatProjectTargetRef(input.projectTargetRef) : input.fallback?.projectTarget;\n return id\n ? {\n id,\n template: input.profile,\n sourceProvider: input.fallback?.sourceProvider || metadataString(input.metadata, \"provider\") || \"unknown\",\n ...(projectTarget ? { projectTarget } : {}),\n ...(accountId ? { accountId } : {}),\n ...(conversationId ? { conversationId } : {}),\n ...(actorId ? { actorId } : {})\n }\n : input.fallback;\n }\n if (input.profileTemplate) {\n return createAgentSessionProfile({\n runId: metadataString(input.metadata, \"runId\") || input.fallback?.id || \"run\",\n sourceProvider: metadataString(input.metadata, \"provider\") || input.fallback?.sourceProvider || \"unknown\",\n ...(input.metadata ? { metadata: input.metadata } : {}),\n ...(input.projectTargetRef ? { projectTargetRef: input.projectTargetRef } : {}),\n ...(input.actorId ? { actorId: input.actorId } : {}),\n template: input.profileTemplate,\n ...(input.fallback?.id ? { fallbackId: input.fallback.id } : {})\n });\n }\n return input.fallback;\n}\n","import { contextPointerLabel, type ContextPacket, type ContextPointer } from \"@opentag/core\";\nimport { assertCommandSucceeded, nodeCommandRunner, type CommandResult, type CommandRunner } from \"./command.js\";\nimport { renderContextPacketForPrompt, type ExecutorAdapter } from \"./executor.js\";\nimport { branchNameForRun, changedFiles, cleanupInternalArtifacts, createRunBranch } from \"./git.js\";\nimport { createExecutorRunResult } from \"./result.js\";\nimport { resolveAgentSessionProfile } from \"./session-profile.js\";\n\nexport type HermesExecutorOptions = {\n runner?: CommandRunner;\n hermesCommand?: string;\n profile?: string;\n profileTemplate?: string;\n};\n\nfunction contextLines(context: ContextPointer[]): string {\n if (!context.length) return \"No additional context pointers were provided.\";\n return context.map((pointer) => `- ${contextPointerLabel(pointer)}: ${pointer.uri}`).join(\"\\n\");\n}\n\nfunction buildPrompt(input: {\n runId: string;\n rawText: string;\n context: ContextPointer[];\n contextPacket: ContextPacket | undefined;\n}): string {\n return [\n \"You are executing an OpenTag run in a local checkout.\",\n `Run ID: ${input.runId}`,\n \"\",\n \"User request:\",\n input.rawText,\n \"\",\n ...renderContextPacketForPrompt(input.contextPacket),\n ...(input.contextPacket ? [\"\"] : []),\n \"Context pointers:\",\n contextLines(input.context),\n \"\",\n \"Use only the selected Hermes profile for tools, skills, memory, and session behavior.\",\n \"Work autonomously but keep the change narrow. Run relevant verification if you modify files.\",\n \"End with a concise summary of what changed, what was verified, and the recommended next action.\"\n ].join(\"\\n\");\n}\n\nexport function createHermesExecutor(options: HermesExecutorOptions = {}): ExecutorAdapter {\n const runner = options.runner ?? nodeCommandRunner;\n const hermesCommand = options.hermesCommand ?? \"hermes\";\n\n return {\n id: \"hermes\",\n displayName: \"Hermes Executor\",\n capability: {\n id: \"hermes\",\n invocation: \"spawn\",\n supportsProfile: true,\n supportsStreaming: false,\n supportsCancel: false,\n supportsHookCompletion: false,\n progressEvents: \"audit\",\n approvalMode: \"opentag_policy\",\n contextAccess: [\"context_packet\", \"context_pointers\", \"workspace\"],\n promptAssembly: \"executor_adapter\",\n writeAccess: \"workspace\",\n conversationAccess: \"request\",\n promptMutation: \"none\",\n rawContextAccess: false,\n writeActionAccess: \"none\",\n workspaceIsolation: \"branch\",\n requiredSecrets: [],\n completionSignals: [\n {\n type: \"process_exit\",\n required: true,\n description: \"OpenTag treats a successful `hermes -z` process exit as the normal completion signal.\"\n }\n ]\n },\n async canRun(input) {\n try {\n const hermesVersion = await runner.run(hermesCommand, [\"--version\"], { cwd: input.workspacePath });\n if (hermesVersion.exitCode !== 0) {\n return { ready: false, reason: `Hermes CLI is not available: ${hermesVersion.stderr || hermesVersion.stdout}` };\n }\n } catch (error) {\n return { ready: false, reason: `Hermes CLI is not available: ${error instanceof Error ? error.message : String(error)}` };\n }\n\n let gitStatus: CommandResult;\n try {\n gitStatus = await runner.run(\"git\", [\"status\", \"--porcelain\"], { cwd: input.workspacePath });\n } catch (error) {\n return { ready: false, reason: `Workspace is not a git checkout: ${error instanceof Error ? error.message : String(error)}` };\n }\n if (gitStatus.exitCode !== 0) {\n return { ready: false, reason: `Workspace is not a git checkout: ${gitStatus.stderr || gitStatus.stdout}` };\n }\n if (gitStatus.stdout.trim().length > 0) {\n return { ready: false, reason: \"Workspace has uncommitted changes; refusing to run Hermes executor.\" };\n }\n\n return { ready: true };\n },\n async run(input, sink) {\n const branchName = branchNameForRun(input.runId);\n await sink.emit({\n type: \"executor.started\",\n message: `Creating isolated branch ${branchName}`,\n at: new Date().toISOString()\n });\n\n await createRunBranch({\n runner,\n workspacePath: input.workspacePath,\n branchName,\n ...(input.baseBranch ? { startPoint: input.baseBranch } : {})\n });\n\n await sink.emit({\n type: \"executor.progress\",\n message: \"Starting hermes -z\",\n at: new Date().toISOString()\n });\n\n const prompt = buildPrompt({\n runId: input.runId,\n rawText: input.command.rawText,\n context: input.context,\n contextPacket: input.contextPacket\n });\n\n const profile = resolveAgentSessionProfile({\n ...(options.profile ? { profile: options.profile } : {}),\n ...(options.profileTemplate ? { profileTemplate: options.profileTemplate } : {}),\n metadata: {\n ...(input.metadata ?? {}),\n runId: input.runId\n },\n ...(input.sessionProfile ? { fallback: input.sessionProfile } : {})\n });\n\n const args = [...(profile ? [\"-p\", profile.id] : []), \"-z\", prompt];\n\n let hermesResult: CommandResult | undefined;\n try {\n hermesResult = await runner.run(hermesCommand, args, { cwd: input.workspacePath });\n await assertCommandSucceeded(hermesResult, \"hermes -z\");\n } finally {\n const cleanedArtifacts = await cleanupInternalArtifacts({ runner, workspacePath: input.workspacePath });\n if (cleanedArtifacts.length > 0) {\n await sink.emit({\n type: \"executor.progress\",\n message: `Cleaned internal artifacts: ${cleanedArtifacts.join(\", \")}`,\n at: new Date().toISOString()\n });\n }\n }\n\n if (!hermesResult) throw new Error(\"Hermes did not return a result.\");\n\n const files = await changedFiles({ runner, workspacePath: input.workspacePath });\n await sink.emit({\n type: \"executor.completed\",\n message: `Hermes executor completed with ${files.length} changed file(s)`,\n at: new Date().toISOString()\n });\n\n const output = hermesResult.stdout.trim() || hermesResult.stderr.trim() || \"Hermes completed without textual output.\";\n return createExecutorRunResult({\n executorName: \"Hermes\",\n runId: input.runId,\n branchName,\n ...(input.baseBranch ? { baseBranch: input.baseBranch } : {}),\n output,\n changedFiles: files\n });\n },\n async cancel() {\n return;\n }\n }\n}\n"],"mappings":"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","names":["contextPointerLabel","resolve","contextPointerLabel","contextPointerLabel","contextLines","contextPointerLabel","buildPrompt","contextPointerLabel","contextLines","contextPointerLabel","buildPrompt"]}
@@ -1 +1 @@
1
- {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AA+DtD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;CAC7D,GAAG,gBAAgB,CAyEnB"}
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAgGtD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;CAC7D,GAAG,gBAAgB,CAyEnB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentag/runner",
3
- "version": "0.3.3",
3
+ "version": "0.3.4",
4
4
  "description": "Executor contracts and built-in runner adapters for OpenTag.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -31,7 +31,7 @@
31
31
  ],
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@opentag/core": "0.3.3"
34
+ "@opentag/core": "0.3.4"
35
35
  },
36
36
  "devDependencies": {
37
37
  "tsup": "^8.3.5",