@fitlab-ai/agent-infra 0.9.13 → 0.9.14

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.
Files changed (280) hide show
  1. package/bin/cli.ts +26 -9
  2. package/dist/bin/cli.js +173 -157
  3. package/dist/bin/internal-cli.js +42 -21
  4. package/dist/lib/agent-client.js +5 -0
  5. package/dist/lib/internal/agent-client.js +5 -2
  6. package/dist/lib/internal/cli-route-inventory.js +152 -0
  7. package/dist/lib/internal/codex-lifecycle.js +9 -6
  8. package/dist/lib/internal/codex-sandbox-controller.js +8 -2
  9. package/dist/lib/internal/git-workflow.js +10 -6
  10. package/dist/lib/internal/platform-checks.js +16 -4
  11. package/dist/lib/internal/platform-comment.js +16 -4
  12. package/dist/lib/internal/platform-context.js +4 -1
  13. package/dist/lib/internal/platform-issue.js +12 -4
  14. package/dist/lib/internal/platform-metadata.js +88 -0
  15. package/dist/lib/internal/platform-pr-review.js +16 -3
  16. package/dist/lib/internal/platform-pr.js +24 -10
  17. package/dist/lib/internal/platform-release-notes.js +6 -3
  18. package/dist/lib/internal/platform-security.js +93 -0
  19. package/dist/lib/internal/pr-review-grade.js +14 -3
  20. package/dist/lib/internal/release-workflow.js +19 -5
  21. package/dist/lib/internal/sandbox-control.js +22 -5
  22. package/dist/lib/internal/task-activity.js +13 -4
  23. package/dist/lib/internal/task-artifact.js +186 -27
  24. package/dist/lib/internal/task-context.js +4 -1
  25. package/dist/lib/internal/task-create.js +48 -15
  26. package/dist/lib/internal/task-delivery.js +4 -1
  27. package/dist/lib/internal/task-event.js +4 -1
  28. package/dist/lib/internal/task-finalization.js +4 -1
  29. package/dist/lib/internal/task-invalidation.js +4 -1
  30. package/dist/lib/internal/task-ledger.js +12 -1
  31. package/dist/lib/internal/task-lifecycle.js +4 -1
  32. package/dist/lib/internal/task-operation-registry.js +421 -0
  33. package/dist/lib/internal/task-orchestration.js +12 -0
  34. package/dist/lib/internal/task-override.js +10 -3
  35. package/dist/lib/internal/task-qualification.js +90 -0
  36. package/dist/lib/internal/task-review.js +4 -1
  37. package/dist/lib/internal/task-short-id.js +11 -1
  38. package/dist/lib/internal/task-snapshot.js +4 -1
  39. package/dist/lib/internal/task-validate.js +7 -2
  40. package/dist/lib/internal/task-verify.js +5 -1
  41. package/dist/lib/internal/task-warning.js +8 -1
  42. package/dist/lib/platform/comment-safety.js +226 -0
  43. package/dist/lib/platform/github-provider.js +233 -6
  44. package/dist/lib/platform/issue-comments.js +146 -34
  45. package/dist/lib/platform/pr-change-report.js +6 -12
  46. package/dist/lib/platform/pr-summary.js +28 -7
  47. package/dist/lib/platform/provider-contract.d.ts +67 -1
  48. package/dist/lib/platform/provider-contract.js +6 -2
  49. package/dist/lib/platform/provider-validation.js +76 -3
  50. package/dist/lib/platform/pull-requests.js +115 -170
  51. package/dist/lib/platform/repository-metadata.js +377 -0
  52. package/dist/lib/platform/security-alerts.js +155 -0
  53. package/dist/lib/platform/verification-sync.js +33 -26
  54. package/dist/lib/process-data/index.js +7 -0
  55. package/dist/lib/run/index.js +5 -0
  56. package/dist/lib/sandbox/commands/control-status.js +22 -0
  57. package/dist/lib/sandbox/commands/create.js +32 -6
  58. package/dist/lib/sandbox/commands/ls.js +5 -0
  59. package/dist/lib/sandbox/commands/rm.js +827 -120
  60. package/dist/lib/sandbox/commands/show.js +16 -0
  61. package/dist/lib/sandbox/control/client.js +83 -9
  62. package/dist/lib/sandbox/control/completed-reentry.js +85 -0
  63. package/dist/lib/sandbox/control/container-identity.js +28 -31
  64. package/dist/lib/sandbox/control/executor.js +149 -14
  65. package/dist/lib/sandbox/control/lifecycle.js +621 -127
  66. package/dist/lib/sandbox/control/native-file-lock.js +177 -0
  67. package/dist/lib/sandbox/control/server.js +305 -35
  68. package/dist/lib/sandbox/control/state.js +5 -3
  69. package/dist/lib/sandbox/control/task-view.js +183 -0
  70. package/dist/lib/sandbox/engines/authority.js +289 -0
  71. package/dist/lib/sandbox/engines/docker-exact-discovery.js +97 -0
  72. package/dist/lib/sandbox/index.js +5 -0
  73. package/dist/lib/sandbox/recovery.js +21 -1
  74. package/dist/lib/sandbox/workspace-view.js +2 -1
  75. package/dist/lib/sandbox/worktree-safety.js +4 -1
  76. package/dist/lib/server/index.js +8 -0
  77. package/dist/lib/task/artifact-lifecycle.js +42 -13
  78. package/dist/lib/task/artifact-operations.js +520 -0
  79. package/dist/lib/task/artifact-repair-intent.js +59 -0
  80. package/dist/lib/task/artifact-schema.js +135 -0
  81. package/dist/lib/task/capabilities.js +72 -1
  82. package/dist/lib/task/control-authority.js +4 -0
  83. package/dist/lib/task/create-service.js +103 -4
  84. package/dist/lib/task/create.js +25 -0
  85. package/dist/lib/task/events.js +186 -67
  86. package/dist/lib/task/index.js +11 -3
  87. package/dist/lib/task/local-artifact-finalization.js +75 -150
  88. package/dist/lib/task/orchestration.js +192 -52
  89. package/dist/lib/task/qualification-audit.js +490 -0
  90. package/dist/lib/task/qualification-confirmation.js +109 -0
  91. package/dist/lib/task/qualification-intents.js +148 -0
  92. package/dist/lib/task/review-artifacts.js +22 -23
  93. package/dist/lib/task/review-finalization.js +121 -4
  94. package/dist/lib/task/sections.js +6 -4
  95. package/dist/lib/task/verification-config.js +11 -0
  96. package/dist/lib/task/verification-engine.js +54 -4
  97. package/dist/lifecycle-build-manifest.json +3 -3
  98. package/lib/agent-client.ts +9 -0
  99. package/lib/internal/agent-client.ts +4 -2
  100. package/lib/internal/cli-route-inventory.ts +140 -0
  101. package/lib/internal/codex-lifecycle.ts +8 -6
  102. package/lib/internal/codex-sandbox-controller.ts +7 -2
  103. package/lib/internal/git-workflow.ts +9 -6
  104. package/lib/internal/platform-checks.ts +12 -4
  105. package/lib/internal/platform-comment.ts +12 -4
  106. package/lib/internal/platform-context.ts +3 -1
  107. package/lib/internal/platform-issue.ts +11 -4
  108. package/lib/internal/platform-metadata.ts +70 -0
  109. package/lib/internal/platform-pr-review.ts +14 -3
  110. package/lib/internal/platform-pr.ts +23 -10
  111. package/lib/internal/platform-release-notes.ts +5 -3
  112. package/lib/internal/platform-security.ts +83 -0
  113. package/lib/internal/pr-review-grade.ts +10 -3
  114. package/lib/internal/release-workflow.ts +17 -5
  115. package/lib/internal/sandbox-control.ts +19 -5
  116. package/lib/internal/task-activity.ts +12 -4
  117. package/lib/internal/task-artifact.ts +164 -25
  118. package/lib/internal/task-context.ts +3 -1
  119. package/lib/internal/task-create.ts +76 -15
  120. package/lib/internal/task-delivery.ts +3 -1
  121. package/lib/internal/task-event.ts +3 -1
  122. package/lib/internal/task-finalization.ts +3 -1
  123. package/lib/internal/task-invalidation.ts +3 -1
  124. package/lib/internal/task-ledger.ts +11 -1
  125. package/lib/internal/task-lifecycle.ts +3 -1
  126. package/lib/internal/task-operation-registry.ts +482 -0
  127. package/lib/internal/task-orchestration.ts +12 -0
  128. package/lib/internal/task-override.ts +9 -3
  129. package/lib/internal/task-qualification.ts +61 -0
  130. package/lib/internal/task-review.ts +3 -1
  131. package/lib/internal/task-short-id.ts +10 -1
  132. package/lib/internal/task-snapshot.ts +3 -1
  133. package/lib/internal/task-validate.ts +6 -2
  134. package/lib/internal/task-verify.ts +4 -1
  135. package/lib/internal/task-warning.ts +7 -1
  136. package/lib/platform/comment-safety.ts +250 -0
  137. package/lib/platform/github-provider.ts +229 -7
  138. package/lib/platform/issue-comments.ts +160 -35
  139. package/lib/platform/pr-change-report.ts +6 -12
  140. package/lib/platform/pr-summary.ts +27 -6
  141. package/lib/platform/provider-contract.ts +78 -3
  142. package/lib/platform/provider-validation.ts +85 -3
  143. package/lib/platform/pull-requests.ts +126 -178
  144. package/lib/platform/repository-metadata.ts +453 -0
  145. package/lib/platform/security-alerts.ts +191 -0
  146. package/lib/platform/verification-sync.ts +32 -28
  147. package/lib/process-data/index.ts +7 -0
  148. package/lib/run/index.ts +5 -0
  149. package/lib/sandbox/commands/control-status.ts +26 -0
  150. package/lib/sandbox/commands/create.ts +46 -6
  151. package/lib/sandbox/commands/ls.ts +7 -0
  152. package/lib/sandbox/commands/rm.ts +1000 -87
  153. package/lib/sandbox/commands/show.ts +16 -0
  154. package/lib/sandbox/control/client.ts +103 -9
  155. package/lib/sandbox/control/completed-reentry.ts +98 -0
  156. package/lib/sandbox/control/container-identity.ts +27 -43
  157. package/lib/sandbox/control/executor.ts +177 -12
  158. package/lib/sandbox/control/lifecycle.ts +629 -17
  159. package/lib/sandbox/control/native-file-lock.ts +209 -0
  160. package/lib/sandbox/control/protocol.ts +5 -2
  161. package/lib/sandbox/control/server.ts +319 -37
  162. package/lib/sandbox/control/state.ts +6 -3
  163. package/lib/sandbox/control/task-view.ts +240 -0
  164. package/lib/sandbox/engines/authority.ts +365 -0
  165. package/lib/sandbox/engines/docker-exact-discovery.ts +132 -0
  166. package/lib/sandbox/index.ts +7 -0
  167. package/lib/sandbox/recovery.ts +21 -1
  168. package/lib/sandbox/workspace-view.ts +9 -3
  169. package/lib/sandbox/worktree-safety.ts +4 -1
  170. package/lib/server/index.ts +10 -0
  171. package/lib/task/artifact-lifecycle.ts +38 -16
  172. package/lib/task/artifact-operations.ts +626 -0
  173. package/lib/task/artifact-repair-intent.ts +71 -0
  174. package/lib/task/artifact-schema.ts +192 -0
  175. package/lib/task/capabilities.ts +70 -1
  176. package/lib/task/control-authority.ts +11 -1
  177. package/lib/task/create-service.ts +131 -6
  178. package/lib/task/create.ts +27 -0
  179. package/lib/task/events.ts +161 -65
  180. package/lib/task/index.ts +16 -3
  181. package/lib/task/local-artifact-finalization.ts +87 -218
  182. package/lib/task/orchestration.ts +172 -49
  183. package/lib/task/qualification-audit.ts +599 -0
  184. package/lib/task/qualification-confirmation.ts +117 -0
  185. package/lib/task/qualification-intents.ts +150 -0
  186. package/lib/task/review-artifacts.ts +21 -22
  187. package/lib/task/review-finalization.ts +133 -4
  188. package/lib/task/sections.ts +6 -4
  189. package/lib/task/verification-config.ts +12 -0
  190. package/lib/task/verification-engine.ts +55 -4
  191. package/package.json +6 -1
  192. package/templates/.agents/rules/README.en.md +2 -0
  193. package/templates/.agents/rules/README.zh-CN.md +2 -0
  194. package/templates/.agents/rules/decision-qualification.en.md +22 -0
  195. package/templates/.agents/rules/decision-qualification.zh-CN.md +22 -0
  196. package/templates/.agents/rules/evidence-reporting.en.md +28 -0
  197. package/templates/.agents/rules/evidence-reporting.zh-CN.md +28 -0
  198. package/templates/.agents/rules/label-milestone-setup.en.md +7 -7
  199. package/templates/.agents/rules/label-milestone-setup.zh-CN.md +7 -7
  200. package/templates/.agents/rules/local-artifact-repair.en.md +5 -1
  201. package/templates/.agents/rules/local-artifact-repair.zh-CN.md +5 -1
  202. package/templates/.agents/rules/security-alerts.en.md +8 -8
  203. package/templates/.agents/rules/security-alerts.zh-CN.md +8 -8
  204. package/templates/.agents/skills/analyze-task/SKILL.en.md +15 -2
  205. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +19 -2
  206. package/templates/.agents/skills/analyze-task/config/verify.en.json +1 -12
  207. package/templates/.agents/skills/analyze-task/config/verify.zh-CN.json +1 -12
  208. package/templates/.agents/skills/close-codescan/SKILL.en.md +2 -2
  209. package/templates/.agents/skills/close-codescan/SKILL.zh-CN.md +2 -2
  210. package/templates/.agents/skills/close-dependabot/SKILL.en.md +2 -2
  211. package/templates/.agents/skills/close-dependabot/SKILL.zh-CN.md +2 -2
  212. package/templates/.agents/skills/code-task/SKILL.en.md +14 -1
  213. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +14 -1
  214. package/templates/.agents/skills/code-task/config/verify.en.json +5 -14
  215. package/templates/.agents/skills/code-task/config/verify.zh-CN.json +5 -14
  216. package/templates/.agents/skills/code-task/reference/code-rules.en.md +5 -4
  217. package/templates/.agents/skills/code-task/reference/code-rules.zh-CN.md +5 -4
  218. package/templates/.agents/skills/code-task/reference/dual-mode.en.md +1 -1
  219. package/templates/.agents/skills/code-task/reference/dual-mode.zh-CN.md +1 -1
  220. package/templates/.agents/skills/code-task/reference/fix-mode.en.md +3 -1
  221. package/templates/.agents/skills/code-task/reference/fix-mode.zh-CN.md +3 -1
  222. package/templates/.agents/skills/code-task/reference/report-template.en.md +42 -15
  223. package/templates/.agents/skills/code-task/reference/report-template.zh-CN.md +39 -12
  224. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +5 -1
  225. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +5 -1
  226. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  227. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  228. package/templates/.agents/skills/complete-task/SKILL.en.md +9 -22
  229. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +9 -22
  230. package/templates/.agents/skills/create-task/SKILL.en.md +8 -0
  231. package/templates/.agents/skills/create-task/SKILL.zh-CN.md +7 -0
  232. package/templates/.agents/skills/import-codescan/SKILL.en.md +1 -1
  233. package/templates/.agents/skills/import-codescan/SKILL.zh-CN.md +1 -1
  234. package/templates/.agents/skills/import-dependabot/SKILL.en.md +1 -1
  235. package/templates/.agents/skills/import-dependabot/SKILL.zh-CN.md +1 -1
  236. package/templates/.agents/skills/init-labels/SKILL.en.md +8 -8
  237. package/templates/.agents/skills/init-labels/SKILL.zh-CN.md +8 -8
  238. package/templates/.agents/skills/init-milestones/SKILL.en.md +9 -11
  239. package/templates/.agents/skills/init-milestones/SKILL.zh-CN.md +9 -11
  240. package/templates/.agents/skills/plan-task/SKILL.en.md +14 -1
  241. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +16 -1
  242. package/templates/.agents/skills/plan-task/config/verify.en.json +4 -14
  243. package/templates/.agents/skills/plan-task/config/verify.zh-CN.json +4 -14
  244. package/templates/.agents/skills/review-analysis/SKILL.en.md +14 -1
  245. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +14 -1
  246. package/templates/.agents/skills/review-analysis/config/verify.en.json +1 -18
  247. package/templates/.agents/skills/review-analysis/config/verify.zh-CN.json +1 -18
  248. package/templates/.agents/skills/review-analysis/reference/report-template.en.md +50 -23
  249. package/templates/.agents/skills/review-analysis/reference/report-template.zh-CN.md +45 -18
  250. package/templates/.agents/skills/review-code/SKILL.en.md +14 -1
  251. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +14 -1
  252. package/templates/.agents/skills/review-code/config/verify.en.json +1 -23
  253. package/templates/.agents/skills/review-code/config/verify.zh-CN.json +1 -23
  254. package/templates/.agents/skills/review-code/reference/report-template.en.md +49 -22
  255. package/templates/.agents/skills/review-code/reference/report-template.zh-CN.md +45 -18
  256. package/templates/.agents/skills/review-plan/SKILL.en.md +14 -1
  257. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +14 -1
  258. package/templates/.agents/skills/review-plan/config/verify.en.json +1 -18
  259. package/templates/.agents/skills/review-plan/config/verify.zh-CN.json +1 -18
  260. package/templates/.agents/skills/review-plan/reference/report-template.en.md +49 -22
  261. package/templates/.agents/skills/review-plan/reference/report-template.zh-CN.md +45 -18
  262. package/templates/.agents/skills/review-pr/SKILL.en.md +5 -1
  263. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +5 -1
  264. package/templates/.agents/skills/review-pr/reference/report-template.en.md +4 -3
  265. package/templates/.agents/skills/review-pr/reference/report-template.zh-CN.md +4 -3
  266. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +5 -1
  267. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +5 -1
  268. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +3 -1
  269. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +3 -1
  270. package/templates/.agents/skills/test/SKILL.en.md +13 -2
  271. package/templates/.agents/skills/test/SKILL.zh-CN.md +13 -2
  272. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +14 -0
  273. package/templates/.agents/templates/task.en.md +6 -0
  274. package/templates/.agents/templates/task.zh-CN.md +6 -0
  275. package/templates/.agents/scripts/security-alerts.github.sh +0 -151
  276. package/templates/.agents/scripts/security-alerts.sh +0 -31
  277. package/templates/.agents/skills/init-labels/scripts/init-labels.github.sh +0 -146
  278. package/templates/.agents/skills/init-labels/scripts/init-labels.sh +0 -32
  279. package/templates/.agents/skills/init-milestones/scripts/init-milestones.github.sh +0 -294
  280. package/templates/.agents/skills/init-milestones/scripts/init-milestones.sh +0 -6
@@ -1,12 +1,24 @@
1
1
  import { spawn, type ChildProcess } from 'node:child_process';
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { randomUUID } from 'node:crypto';
4
+ import { createHash, randomUUID } from 'node:crypto';
5
5
  import { getProcessStartTime } from '../../server/process-state.ts';
6
- import { createTask } from '../../task/create-service.ts';
6
+ import {
7
+ createTask,
8
+ projectTaskCreateResult,
9
+ taskCreateExitCode,
10
+ taskCreateFailure,
11
+ type TaskCreateResult
12
+ } from '../../task/create-service.ts';
7
13
  import { applyTaskFinalization } from '../../task/finalization.ts';
8
14
  import { bindSandboxControlTask, validateSandboxControlRequest, type SandboxControlExecution, type SandboxControlManifest, type SandboxControlRequest } from './protocol.ts';
9
- import { atomicWriteJson, executionPath, readActiveLease, terminateSandboxControlExecution } from './state.ts';
15
+ import {
16
+ appendSandboxControlAudit,
17
+ atomicWriteJson,
18
+ executionPath,
19
+ readActiveLease,
20
+ terminateSandboxControlExecution
21
+ } from './state.ts';
10
22
  import {
11
23
  createSandboxExecutorExecutionContext,
12
24
  dispatchTaskControlOperation,
@@ -21,6 +33,7 @@ import {
21
33
  openCodexControllerRegistration,
22
34
  resolveCodexControllerBinding
23
35
  } from './controller-registration.ts';
36
+ import type { OrchestrationDiagnosticLogger } from '../../task/orchestration.ts';
24
37
 
25
38
  export type SandboxControlExecutionResult = {
26
39
  exitCode: number;
@@ -59,6 +72,67 @@ function safeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
59
72
  return Object.fromEntries(Object.entries(env).filter(([key]) => !key.toUpperCase().startsWith('AGENT_INFRA_CONTROL_')));
60
73
  }
61
74
 
75
+ function safeRealpath(value: string): string | null {
76
+ try {
77
+ return fs.realpathSync.native(value);
78
+ } catch {
79
+ return null;
80
+ }
81
+ }
82
+
83
+ function appendExecutorAudit(
84
+ manifest: SandboxControlManifest,
85
+ event: string,
86
+ fields: Record<string, string | number | boolean | null> = {}
87
+ ): void {
88
+ try {
89
+ appendSandboxControlAudit(manifest, event, { source: 'executor', ...fields });
90
+ } catch {
91
+ // Diagnostics must never change the control protocol.
92
+ }
93
+ }
94
+
95
+ function requestAuditFields(
96
+ manifest: SandboxControlManifest,
97
+ manifestPath: string,
98
+ request: SandboxControlRequest
99
+ ): Record<string, string | number | boolean | null> {
100
+ const args = 'args' in request ? request.args : [];
101
+ const encodedArgs = JSON.stringify(args);
102
+ return {
103
+ requestId: request.id,
104
+ requestFamily: request.family,
105
+ sandboxTaskId: manifest.taskId,
106
+ requestGeneration: request.generation,
107
+ requestIssuedAt: request.issuedAt,
108
+ requestExpiresAt: request.expiresAt,
109
+ requestArgCount: args.length,
110
+ requestArgsSha256: createHash('sha256').update(encodedArgs, 'utf8').digest('hex'),
111
+ requestTaskRef: args[0] ?? null,
112
+ requestCommand: args[1] ?? null,
113
+ controllerProofPresent: request.controllerProof !== null,
114
+ hostCwd: process.cwd(),
115
+ manifestPath,
116
+ manifestPathRealpath: safeRealpath(manifestPath),
117
+ repoRoot: manifest.repoRoot,
118
+ repoRootRealpath: safeRealpath(manifest.repoRoot),
119
+ worktreeRoot: manifest.worktreeRoot,
120
+ worktreeRootRealpath: safeRealpath(manifest.worktreeRoot),
121
+ runtimeDir: manifest.runtimeDir,
122
+ runtimeDirRealpath: safeRealpath(manifest.runtimeDir)
123
+ };
124
+ }
125
+
126
+ function resultAuditFields(result: SandboxControlExecutionResult): Record<string, string | number | boolean | null> {
127
+ return {
128
+ exitCode: result.exitCode,
129
+ stdoutBytes: Buffer.byteLength(result.stdout, 'utf8'),
130
+ stderrBytes: Buffer.byteLength(result.stderr, 'utf8'),
131
+ stdoutSha256: createHash('sha256').update(result.stdout, 'utf8').digest('hex'),
132
+ stderrSha256: createHash('sha256').update(result.stderr, 'utf8').digest('hex')
133
+ };
134
+ }
135
+
62
136
  export function nodeEntryArgs(entry: string, args: string[]): string[] {
63
137
  return path.extname(entry) === '.ts'
64
138
  ? ['--experimental-strip-types', '--no-warnings', entry, ...args]
@@ -218,6 +292,22 @@ function lifecycleFailure(code: string, message: string): SandboxControlExecutio
218
292
  };
219
293
  }
220
294
 
295
+ function taskCreateExecutionResult(result: TaskCreateResult): SandboxControlExecutionResult {
296
+ return {
297
+ exitCode: taskCreateExitCode(result),
298
+ stdout: `${JSON.stringify(result)}\n`,
299
+ stderr: ''
300
+ };
301
+ }
302
+
303
+ function taskCreateExecutionFailure(requestId: string, code: string, message: string): SandboxControlExecutionResult {
304
+ return taskCreateExecutionResult(taskCreateFailure({ code, message, retryable: false }, {
305
+ requestId,
306
+ accepted: true,
307
+ recovery: 'inspect-domain-state'
308
+ }));
309
+ }
310
+
221
311
  function finalizationResult(result: Awaited<ReturnType<typeof applyTaskFinalization>>): SandboxControlExecutionResult {
222
312
  const payload = {
223
313
  version: 1,
@@ -239,19 +329,25 @@ type ExecuteRequestOptions = Readonly<{
239
329
  resolveControllerBinding?: typeof resolveCodexControllerBinding;
240
330
  }>;
241
331
 
242
- export async function executeRequest(
332
+ async function executeRequestInner(
243
333
  manifest: SandboxControlManifest,
244
334
  manifestPath: string,
245
335
  request: SandboxControlRequest,
246
336
  options: ExecuteRequestOptions = {}
247
337
  ): Promise<SandboxControlExecutionResult> {
248
338
  if (request.family === 'task-create') {
249
- const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
250
- return {
251
- exitCode: result.status === 'blocked' ? 2 : result.status === 'failed' ? 1 : 0,
252
- stdout: `${JSON.stringify(result)}\n`,
253
- stderr: ''
254
- };
339
+ try {
340
+ const result = await createTask(request.candidate, { repoRoot: manifest.repoRoot });
341
+ return taskCreateExecutionResult(projectTaskCreateResult(result, {
342
+ requestId: request.id,
343
+ accepted: true,
344
+ recovery: 'none'
345
+ }));
346
+ } catch (error) {
347
+ const detail = error instanceof Error ? error.message : String(error);
348
+ const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'TASK_CREATE_EXECUTION_FAILED';
349
+ return taskCreateExecutionFailure(request.id, code, detail);
350
+ }
255
351
  }
256
352
  if (request.family === 'codex-controller') {
257
353
  try {
@@ -293,6 +389,16 @@ export async function executeRequest(
293
389
  });
294
390
  return { exitCode: 0, stdout: `${JSON.stringify(result)}\n`, stderr: '' };
295
391
  } catch (error) {
392
+ const errorCode = error instanceof CodexControllerRegistrationError
393
+ ? error.code
394
+ : /^([A-Z][A-Z0-9_]+)/u.exec(error instanceof Error ? error.message : String(error))?.[1]
395
+ ?? 'CODEX_SANDBOX_CONTROLLER_FAILED';
396
+ appendExecutorAudit(manifest, 'controller-operation-failed', {
397
+ ...requestAuditFields(manifest, manifestPath, request),
398
+ controllerCommand: request.command,
399
+ errorCode,
400
+ errorType: error instanceof Error ? error.name : typeof error,
401
+ });
296
402
  return controllerFailure(error);
297
403
  }
298
404
  }
@@ -364,6 +470,14 @@ export async function executeRequest(
364
470
  );
365
471
  }
366
472
  }
473
+ const diagnosticLog: OrchestrationDiagnosticLogger = (event, fields): void => {
474
+ appendExecutorAudit(manifest, event.startsWith('orchestration-') ? event : `orchestration-${event}`, {
475
+ requestId: request.id,
476
+ requestFamily: request.family,
477
+ sandboxTaskId: manifest.taskId,
478
+ ...fields
479
+ });
480
+ };
367
481
  const context = createSandboxExecutorExecutionContext({
368
482
  repoRoot: manifest.repoRoot,
369
483
  worktreeRoot: manifest.worktreeRoot,
@@ -372,6 +486,7 @@ export async function executeRequest(
372
486
  generation: manifest.generation,
373
487
  manifestPath,
374
488
  requestId: request.id,
489
+ diagnosticLog,
375
490
  ...(controllerBinding ? { controllerBinding } : {})
376
491
  });
377
492
  const format = (value: unknown): SandboxControlExecutionResult => {
@@ -390,6 +505,34 @@ export async function executeRequest(
390
505
  return format(await dispatchTaskControlOperation(context, operation));
391
506
  }
392
507
 
508
+ export async function executeRequest(
509
+ manifest: SandboxControlManifest,
510
+ manifestPath: string,
511
+ request: SandboxControlRequest,
512
+ options: ExecuteRequestOptions = {}
513
+ ): Promise<SandboxControlExecutionResult> {
514
+ const fields = requestAuditFields(manifest, manifestPath, request);
515
+ appendExecutorAudit(manifest, 'executor-request-start', fields);
516
+ try {
517
+ const result = await executeRequestInner(manifest, manifestPath, request, options);
518
+ appendExecutorAudit(manifest, 'executor-request-finished', {
519
+ requestId: request.id,
520
+ requestFamily: request.family,
521
+ sandboxTaskId: manifest.taskId,
522
+ ...resultAuditFields(result)
523
+ });
524
+ return result;
525
+ } catch (error) {
526
+ appendExecutorAudit(manifest, 'executor-request-failed', {
527
+ requestId: request.id,
528
+ requestFamily: request.family,
529
+ sandboxTaskId: manifest.taskId,
530
+ errorType: error instanceof Error ? error.name : typeof error,
531
+ });
532
+ throw error;
533
+ }
534
+ }
535
+
393
536
  export async function runSandboxControlExecutor(requestPath: string, nonce: string): Promise<void> {
394
537
  const gateOwner = await waitForGate(nonce);
395
538
  process.disconnect?.();
@@ -397,13 +540,29 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
397
540
  if (!manifestPath) throw new Error('SANDBOX_CONTROL_EXECUTOR_MANIFEST_MISSING');
398
541
  const manifest = readSandboxControlManifest(manifestPath);
399
542
  const root = fs.realpathSync.native(process.cwd());
400
- if (fs.realpathSync.native(manifest.repoRoot) !== root) throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
543
+ const expectedRoot = safeRealpath(manifest.repoRoot);
544
+ if (expectedRoot !== root) {
545
+ appendExecutorAudit(manifest, 'executor-root-validation-failed', {
546
+ hostCwd: process.cwd(),
547
+ observedRoot: root,
548
+ expectedRoot
549
+ });
550
+ throw new Error('SANDBOX_CONTROL_EXECUTOR_ROOT_INVALID');
551
+ }
401
552
  const raw = JSON.parse(fs.readFileSync(requestPath, 'utf8')) as unknown;
402
553
  const request = validateSandboxControlRequest(raw, manifest);
554
+ appendExecutorAudit(manifest, 'executor-request-validated', requestAuditFields(manifest, manifestPath, request));
403
555
  const requestDirectory = path.resolve(path.dirname(requestPath));
404
556
  const processingDirectory = path.resolve(path.join(manifest.processingDir, request.id));
405
557
  const channelRequestDirectory = path.resolve(path.join(manifest.channelDir, 'requests'));
406
558
  if (requestDirectory !== processingDirectory && requestDirectory !== channelRequestDirectory) {
559
+ appendExecutorAudit(manifest, 'executor-request-path-validation-failed', {
560
+ ...requestAuditFields(manifest, manifestPath, request),
561
+ requestPath,
562
+ requestDirectory,
563
+ processingDirectory,
564
+ channelRequestDirectory
565
+ });
407
566
  throw new Error('SANDBOX_CONTROL_EXECUTOR_REQUEST_INVALID');
408
567
  }
409
568
  let result: SandboxControlExecutionResult;
@@ -411,6 +570,10 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
411
570
  assertSandboxControlExecutorAuthority(manifest, gateOwner);
412
571
  result = await executeRequest(manifest, manifestPath, request);
413
572
  } catch (error) {
573
+ appendExecutorAudit(manifest, 'executor-authority-or-dispatch-failed', {
574
+ ...requestAuditFields(manifest, manifestPath, request),
575
+ errorType: error instanceof Error ? error.name : typeof error,
576
+ });
414
577
  const detail = error instanceof Error ? error.message : String(error);
415
578
  const code = /^([A-Z][A-Z0-9_]+)/u.exec(detail)?.[1] ?? 'SANDBOX_CONTROL_EXECUTOR_FAILED';
416
579
  result = request.family === 'task-finalization'
@@ -422,7 +585,9 @@ export async function runSandboxControlExecutor(requestPath: string, nonce: stri
422
585
  })}\n`,
423
586
  stderr: ''
424
587
  }
425
- : request.family === 'task-lifecycle'
588
+ : request.family === 'task-create'
589
+ ? taskCreateExecutionFailure(request.id, code, detail)
590
+ : request.family === 'task-lifecycle'
426
591
  ? lifecycleFailure(code, detail)
427
592
  : orchestrationFailure(code, detail);
428
593
  }