@fitlab-ai/agent-infra 0.12.1 → 0.12.2

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 (303) hide show
  1. package/README.md +0 -2
  2. package/README.zh-CN.md +0 -2
  3. package/dist/bin/internal-cli.js +2 -17
  4. package/dist/lib/agent-clients/adapter.js +0 -13
  5. package/dist/lib/agent-clients/adapters/antigravity-cli.js +0 -5
  6. package/dist/lib/agent-clients/adapters/claude-code-credentials.js +0 -17
  7. package/dist/lib/agent-clients/adapters/claude-code.js +0 -9
  8. package/dist/lib/agent-clients/adapters/codex.js +0 -52
  9. package/dist/lib/agent-clients/adapters/opencode.js +0 -5
  10. package/dist/lib/agent-clients/adapters/traecli.js +0 -5
  11. package/dist/lib/agent-clients/config.js +19 -54
  12. package/dist/lib/agent-clients/registry.js +1 -12
  13. package/dist/lib/agent-clients/schema.js +0 -18
  14. package/dist/lib/agent-clients/tokens.js +1 -2
  15. package/dist/lib/agent-clients/types.js +0 -1
  16. package/dist/lib/decide.js +2 -0
  17. package/dist/lib/git/worktree-identity.js +1 -9
  18. package/dist/lib/internal/agent-client.js +2 -62
  19. package/dist/lib/internal/cli-route-inventory.js +1 -5
  20. package/dist/lib/internal/manual-validation.js +18 -10
  21. package/dist/lib/internal/task-create.js +1 -1
  22. package/dist/lib/internal/task-event.js +1 -8
  23. package/dist/lib/internal/task-finalization.js +0 -1
  24. package/dist/lib/internal/task-lifecycle.js +2 -2
  25. package/dist/lib/internal/task-operation-registry.js +4 -20
  26. package/dist/lib/internal/task-review.js +4 -4
  27. package/dist/lib/platform/comment-safety.js +1 -7
  28. package/dist/lib/platform/in-label-sync.js +1 -14
  29. package/dist/lib/platform/issue-comments.js +1 -16
  30. package/dist/lib/platform/issues.js +1 -1
  31. package/dist/lib/platform/operation-coordinator.js +4 -2
  32. package/dist/lib/platform/pr-change-report.js +1 -4
  33. package/dist/lib/platform/pr-checks.js +2 -8
  34. package/dist/lib/platform/provider-validation.js +0 -20
  35. package/dist/lib/platform/pull-requests.js +73 -84
  36. package/dist/lib/platform/releases.js +1 -43
  37. package/dist/lib/platform/verification-required.js +0 -2
  38. package/dist/lib/platform/verification-sync.js +1 -79
  39. package/dist/lib/process-data/normalize.js +1 -185
  40. package/dist/lib/process-data/privacy.js +1 -16
  41. package/dist/lib/process-data/sources.js +2 -279
  42. package/dist/lib/render.js +0 -12
  43. package/dist/lib/run/index.js +15 -10
  44. package/dist/lib/run/skills.js +0 -3
  45. package/dist/lib/sandbox/commands/create.js +40 -53
  46. package/dist/lib/sandbox/commands/list-running.js +0 -18
  47. package/dist/lib/sandbox/commands/start.js +7 -8
  48. package/dist/lib/sandbox/constants.js +0 -6
  49. package/dist/lib/sandbox/control/client.js +0 -1
  50. package/dist/lib/sandbox/control/container-identity.js +1 -16
  51. package/dist/lib/sandbox/control/executor.js +0 -4
  52. package/dist/lib/sandbox/control/identity-sentinel.js +0 -7
  53. package/dist/lib/sandbox/control/lifecycle.js +21 -37
  54. package/dist/lib/sandbox/control/native-file-lock.js +0 -3
  55. package/dist/lib/sandbox/control/server.js +18 -38
  56. package/dist/lib/sandbox/control/state.js +1 -9
  57. package/dist/lib/sandbox/dockerfile.js +0 -6
  58. package/dist/lib/sandbox/engine.js +0 -14
  59. package/dist/lib/sandbox/engines/docker-exact-discovery.js +1 -4
  60. package/dist/lib/sandbox/engines/wsl2-paths.js +0 -3
  61. package/dist/lib/sandbox/recovery.js +24 -26
  62. package/dist/lib/sandbox/removal.js +11 -519
  63. package/dist/lib/sandbox/task-resolver.js +0 -41
  64. package/dist/lib/sandbox/tools.js +1 -4
  65. package/dist/lib/sandbox/workspace-view.js +1 -2
  66. package/dist/lib/server/display.js +0 -6
  67. package/dist/lib/task/activity-intent.js +45 -40
  68. package/dist/lib/task/activity-log.js +9 -16
  69. package/dist/lib/task/artifact-command.js +1 -1
  70. package/dist/lib/task/artifact-lifecycle.js +61 -63
  71. package/dist/lib/task/artifact-name.js +0 -6
  72. package/dist/lib/task/artifact-operations.js +3 -3
  73. package/dist/lib/task/capabilities.js +4 -5
  74. package/dist/lib/task/commands/log.js +0 -6
  75. package/dist/lib/task/commands/status.js +17 -60
  76. package/dist/lib/task/commit-operation.js +28 -39
  77. package/dist/lib/task/completion-facts.js +56 -43
  78. package/dist/lib/task/control-authority.js +23 -256
  79. package/dist/lib/task/control-recovery.js +3 -5
  80. package/dist/lib/task/create.js +2 -4
  81. package/dist/lib/task/decision-intents.js +8 -9
  82. package/dist/lib/task/delivery-target.js +1 -40
  83. package/dist/lib/task/events.js +84 -107
  84. package/dist/lib/task/finalization.js +44 -8
  85. package/dist/lib/task/ledger-intents.js +1 -1
  86. package/dist/lib/task/lifecycle-execution.js +38 -33
  87. package/dist/lib/task/lifecycle.js +49 -41
  88. package/dist/lib/task/local-artifact-finalization.js +1 -4
  89. package/dist/lib/task/manual-validation-evidence.js +1 -37
  90. package/dist/lib/task/platform-operation-recovery.js +67 -24
  91. package/dist/lib/task/pr-delivery-fact.js +2 -5
  92. package/dist/lib/task/qualification-confirmation.js +5 -7
  93. package/dist/lib/task/resolve-ref.js +1 -25
  94. package/dist/lib/task/review-command.js +2 -2
  95. package/dist/lib/task/review-finalization.js +1 -21
  96. package/dist/lib/task/review-fingerprint.js +0 -4
  97. package/dist/lib/task/secure-fs.js +0 -56
  98. package/dist/lib/task/short-id.js +1 -39
  99. package/dist/lib/task/skill-scope.js +0 -1
  100. package/dist/lib/task/verification-engine.js +58 -282
  101. package/dist/lib/task/verification.js +6 -3
  102. package/dist/lib/task/write.js +11 -1
  103. package/lib/agent-clients/adapter.ts +0 -76
  104. package/lib/agent-clients/adapters/antigravity-cli.ts +0 -5
  105. package/lib/agent-clients/adapters/claude-code-credentials.ts +0 -19
  106. package/lib/agent-clients/adapters/claude-code.ts +0 -9
  107. package/lib/agent-clients/adapters/codex.ts +0 -56
  108. package/lib/agent-clients/adapters/opencode.ts +0 -5
  109. package/lib/agent-clients/adapters/traecli.ts +0 -5
  110. package/lib/agent-clients/config.ts +20 -61
  111. package/lib/agent-clients/registry.ts +1 -34
  112. package/lib/agent-clients/schema.ts +0 -18
  113. package/lib/agent-clients/tokens.ts +1 -2
  114. package/lib/agent-clients/types.ts +0 -15
  115. package/lib/decide.ts +1 -0
  116. package/lib/git/worktree-identity.ts +0 -10
  117. package/lib/internal/agent-client.ts +2 -70
  118. package/lib/internal/cli-route-inventory.ts +1 -4
  119. package/lib/internal/manual-validation.ts +16 -9
  120. package/lib/internal/task-create.ts +0 -1
  121. package/lib/internal/task-event.ts +1 -5
  122. package/lib/internal/task-finalization.ts +0 -1
  123. package/lib/internal/task-lifecycle.ts +3 -5
  124. package/lib/internal/task-operation-registry.ts +3 -19
  125. package/lib/internal/task-review.ts +4 -4
  126. package/lib/platform/comment-safety.ts +0 -10
  127. package/lib/platform/github-provider.ts +0 -2
  128. package/lib/platform/in-label-sync.ts +0 -16
  129. package/lib/platform/issue-comments.ts +0 -21
  130. package/lib/platform/issues.ts +0 -2
  131. package/lib/platform/operation-coordinator.ts +4 -2
  132. package/lib/platform/pr-change-report.ts +0 -5
  133. package/lib/platform/pr-checks.ts +1 -10
  134. package/lib/platform/pr-review.ts +1 -1
  135. package/lib/platform/provider-bridge.ts +0 -1
  136. package/lib/platform/provider-loader.ts +1 -5
  137. package/lib/platform/provider-validation.ts +1 -49
  138. package/lib/platform/pull-requests.ts +64 -99
  139. package/lib/platform/releases.ts +1 -40
  140. package/lib/platform/verification-required.ts +0 -2
  141. package/lib/platform/verification-sync.ts +0 -94
  142. package/lib/process-data/normalize.ts +1 -186
  143. package/lib/process-data/privacy.ts +2 -19
  144. package/lib/process-data/sources.ts +3 -283
  145. package/lib/render.ts +0 -15
  146. package/lib/run/index.ts +13 -7
  147. package/lib/run/skills.ts +0 -4
  148. package/lib/sandbox/commands/create.ts +37 -74
  149. package/lib/sandbox/commands/list-running.ts +0 -19
  150. package/lib/sandbox/commands/start.ts +7 -10
  151. package/lib/sandbox/constants.ts +0 -8
  152. package/lib/sandbox/control/client.ts +0 -1
  153. package/lib/sandbox/control/container-identity.ts +1 -16
  154. package/lib/sandbox/control/executor.ts +1 -5
  155. package/lib/sandbox/control/identity-sentinel.ts +0 -8
  156. package/lib/sandbox/control/lifecycle.ts +18 -51
  157. package/lib/sandbox/control/native-file-lock.ts +0 -8
  158. package/lib/sandbox/control/protocol.ts +0 -2
  159. package/lib/sandbox/control/server.ts +13 -39
  160. package/lib/sandbox/control/state.ts +1 -10
  161. package/lib/sandbox/dockerfile.ts +0 -11
  162. package/lib/sandbox/engine.ts +0 -17
  163. package/lib/sandbox/engines/docker-exact-discovery.ts +1 -5
  164. package/lib/sandbox/engines/wsl2-paths.ts +0 -4
  165. package/lib/sandbox/recovery.ts +24 -26
  166. package/lib/sandbox/removal.ts +11 -696
  167. package/lib/sandbox/shell.ts +1 -1
  168. package/lib/sandbox/task-resolver.ts +0 -48
  169. package/lib/sandbox/tools.ts +1 -5
  170. package/lib/sandbox/workspace-view.ts +2 -4
  171. package/lib/server/display.ts +0 -14
  172. package/lib/server/process-control.ts +1 -1
  173. package/lib/task/activity-intent.ts +36 -44
  174. package/lib/task/activity-log.ts +9 -22
  175. package/lib/task/artifact-command.ts +1 -1
  176. package/lib/task/artifact-lifecycle.ts +58 -67
  177. package/lib/task/artifact-name.ts +0 -7
  178. package/lib/task/artifact-operations.ts +3 -3
  179. package/lib/task/capabilities.ts +5 -6
  180. package/lib/task/commands/log.ts +0 -7
  181. package/lib/task/commands/status.ts +14 -79
  182. package/lib/task/commit-operation.ts +29 -51
  183. package/lib/task/completion-facts.ts +45 -42
  184. package/lib/task/control-authority.ts +27 -317
  185. package/lib/task/control-recovery.ts +2 -5
  186. package/lib/task/create.ts +2 -5
  187. package/lib/task/decision-intents.ts +5 -5
  188. package/lib/task/delivery-target.ts +0 -40
  189. package/lib/task/events.ts +89 -123
  190. package/lib/task/finalization.ts +41 -9
  191. package/lib/task/ledger-intents.ts +1 -1
  192. package/lib/task/lifecycle-execution.ts +37 -89
  193. package/lib/task/lifecycle.ts +48 -44
  194. package/lib/task/local-artifact-finalization.ts +0 -7
  195. package/lib/task/manual-validation-evidence.ts +1 -47
  196. package/lib/task/platform-operation-recovery.ts +50 -26
  197. package/lib/task/pr-delivery-fact.ts +2 -11
  198. package/lib/task/qualification-confirmation.ts +6 -6
  199. package/lib/task/resolve-ref.ts +0 -23
  200. package/lib/task/review-command.ts +2 -2
  201. package/lib/task/review-finalization.ts +1 -27
  202. package/lib/task/review-fingerprint.ts +0 -8
  203. package/lib/task/secure-fs.ts +0 -42
  204. package/lib/task/short-id.ts +0 -43
  205. package/lib/task/skill-scope.ts +0 -1
  206. package/lib/task/verification-engine.ts +56 -287
  207. package/lib/task/verification.ts +5 -5
  208. package/lib/task/write.ts +12 -1
  209. package/package.json +2 -2
  210. package/templates/.agents/README.en.md +1 -3
  211. package/templates/.agents/README.zh-CN.md +0 -2
  212. package/templates/.agents/rules/README.en.md +0 -1
  213. package/templates/.agents/rules/README.zh-CN.md +0 -1
  214. package/templates/.agents/rules/commit-and-pr.en.md +1 -1
  215. package/templates/.agents/rules/commit-and-pr.zh-CN.md +1 -1
  216. package/templates/.agents/rules/no-mid-flow-questions.en.md +0 -10
  217. package/templates/.agents/rules/no-mid-flow-questions.zh-CN.md +0 -10
  218. package/templates/.agents/rules/pr-sync.en.md +1 -1
  219. package/templates/.agents/rules/pr-sync.zh-CN.md +1 -1
  220. package/templates/.agents/rules/task-management.en.md +3 -3
  221. package/templates/.agents/rules/task-management.zh-CN.md +3 -3
  222. package/templates/.agents/skills/analyze-task/SKILL.en.md +3 -3
  223. package/templates/.agents/skills/analyze-task/SKILL.zh-CN.md +3 -3
  224. package/templates/.agents/skills/cancel-task/SKILL.en.md +2 -2
  225. package/templates/.agents/skills/cancel-task/SKILL.zh-CN.md +2 -2
  226. package/templates/.agents/skills/code-task/SKILL.en.md +2 -2
  227. package/templates/.agents/skills/code-task/SKILL.zh-CN.md +4 -4
  228. package/templates/.agents/skills/commit/SKILL.en.md +2 -2
  229. package/templates/.agents/skills/commit/SKILL.zh-CN.md +2 -2
  230. package/templates/.agents/skills/commit/reference/commit-orchestration.en.md +6 -6
  231. package/templates/.agents/skills/commit/reference/commit-orchestration.zh-CN.md +6 -6
  232. package/templates/.agents/skills/plan-task/SKILL.en.md +2 -2
  233. package/templates/.agents/skills/plan-task/SKILL.zh-CN.md +2 -2
  234. package/templates/.agents/skills/review-analysis/SKILL.en.md +3 -3
  235. package/templates/.agents/skills/review-analysis/SKILL.zh-CN.md +3 -3
  236. package/templates/.agents/skills/review-code/SKILL.en.md +5 -5
  237. package/templates/.agents/skills/review-code/SKILL.zh-CN.md +5 -5
  238. package/templates/.agents/skills/review-plan/SKILL.en.md +3 -3
  239. package/templates/.agents/skills/review-plan/SKILL.zh-CN.md +3 -3
  240. package/templates/.agents/skills/review-pr/SKILL.en.md +4 -4
  241. package/templates/.agents/skills/review-pr/SKILL.zh-CN.md +4 -4
  242. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +1 -1
  243. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +1 -1
  244. package/templates/.agents/skills/update-agent-infra/scripts/sync-templates.js +3 -75
  245. package/templates/.agents/templates/task.en.md +1 -0
  246. package/templates/.agents/templates/task.zh-CN.md +1 -0
  247. package/templates/.claude/settings.json +0 -24
  248. package/templates/.codex/hooks.json +0 -50
  249. package/dist/lib/agent-clients/adapters/codex-lifecycle/app-server.js +0 -582
  250. package/dist/lib/agent-clients/adapters/codex-lifecycle/binding.js +0 -114
  251. package/dist/lib/agent-clients/adapters/codex-lifecycle/build-identity.js +0 -237
  252. package/dist/lib/agent-clients/adapters/codex-lifecycle/cli.js +0 -443
  253. package/dist/lib/agent-clients/adapters/codex-lifecycle/evidence.js +0 -236
  254. package/dist/lib/agent-clients/adapters/codex-lifecycle/recovery.js +0 -292
  255. package/dist/lib/agent-clients/adapters/codex-lifecycle/store.js +0 -267
  256. package/dist/lib/agent-clients/adapters/codex-orchestration.js +0 -466
  257. package/dist/lib/internal/task-orchestration.js +0 -71
  258. package/dist/lib/platform/verification.js +0 -6
  259. package/dist/lib/run/prompt.js +0 -2
  260. package/dist/lib/sandbox/engines/authority.js +0 -289
  261. package/dist/lib/task/delegation-receipts.js +0 -410
  262. package/dist/lib/task/orchestration.js +0 -1233
  263. package/dist/lib/task/verification-checks.js +0 -9
  264. package/dist/lib/task/workspace-snapshot.js +0 -121
  265. package/dist/lifecycle-build-manifest.json +0 -6
  266. package/lib/agent-clients/adapters/codex-lifecycle/app-server.ts +0 -688
  267. package/lib/agent-clients/adapters/codex-lifecycle/binding.ts +0 -147
  268. package/lib/agent-clients/adapters/codex-lifecycle/build-identity.ts +0 -349
  269. package/lib/agent-clients/adapters/codex-lifecycle/cli.ts +0 -506
  270. package/lib/agent-clients/adapters/codex-lifecycle/evidence.ts +0 -385
  271. package/lib/agent-clients/adapters/codex-lifecycle/manifest-files.json +0 -41
  272. package/lib/agent-clients/adapters/codex-lifecycle/recovery.ts +0 -418
  273. package/lib/agent-clients/adapters/codex-lifecycle/store.ts +0 -354
  274. package/lib/agent-clients/adapters/codex-orchestration.ts +0 -630
  275. package/lib/internal/task-orchestration.ts +0 -74
  276. package/lib/platform/verification.ts +0 -11
  277. package/lib/run/prompt.ts +0 -1
  278. package/lib/sandbox/engines/authority.ts +0 -365
  279. package/lib/task/delegation-receipts.ts +0 -547
  280. package/lib/task/orchestration.ts +0 -1651
  281. package/lib/task/verification-checks.ts +0 -10
  282. package/lib/task/workspace-snapshot.ts +0 -144
  283. package/templates/.agents/hooks/lifecycle-delegation.js +0 -140
  284. package/templates/.agents/rules/lifecycle-orchestration.en.md +0 -44
  285. package/templates/.agents/rules/lifecycle-orchestration.zh-CN.md +0 -44
  286. package/templates/.agents/skills/run-task/SKILL.en.md +0 -29
  287. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +0 -29
  288. package/templates/.agents/skills/run-task/config/verify.en.json +0 -10
  289. package/templates/.agents/skills/run-task/config/verify.zh-CN.json +0 -10
  290. package/templates/.agents/skills/run-task/reference/host-validation.en.md +0 -24
  291. package/templates/.agents/skills/run-task/reference/host-validation.zh-CN.md +0 -24
  292. package/templates/.claude/agents/agent-infra-lifecycle-executor.en.md +0 -6
  293. package/templates/.claude/agents/agent-infra-lifecycle-executor.zh-CN.md +0 -6
  294. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.en.md +0 -6
  295. package/templates/.claude/agents/agent-infra-lifecycle-reviewer.zh-CN.md +0 -6
  296. package/templates/.claude/commands/run-task.en.md +0 -8
  297. package/templates/.claude/commands/run-task.zh-CN.md +0 -8
  298. package/templates/.codex/agents/agent-infra-lifecycle-executor.en.toml +0 -3
  299. package/templates/.codex/agents/agent-infra-lifecycle-executor.zh-CN.toml +0 -3
  300. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.en.toml +0 -3
  301. package/templates/.codex/agents/agent-infra-lifecycle-reviewer.zh-CN.toml +0 -3
  302. package/templates/.opencode/commands/run-task.en.md +0 -11
  303. package/templates/.opencode/commands/run-task.zh-CN.md +0 -11
@@ -1,582 +0,0 @@
1
- import { spawn, spawnSync } from 'node:child_process';
2
- import crypto from 'node:crypto';
3
- import fs from 'node:fs';
4
- import os from 'node:os';
5
- import path from 'node:path';
6
- import semver from 'semver';
7
- import { parseCodexLifecycleBinding } from './binding.js';
8
- import { hasActiveCodexLifecycleEvidence } from './store.js';
9
- import { resolveTaskContext, resolveTaskRef } from '../../../task/resolve-ref.js';
10
- const LIFECYCLE_HOOKS = Object.freeze([
11
- Object.freeze({ event: 'PreToolUse', matcher: '^collaborationspawn_agent$', phase: 'pre-tool' }),
12
- Object.freeze({ event: 'PostToolUse', matcher: '', phase: 'post-tool' }),
13
- Object.freeze({ event: 'SubagentStart', matcher: '', phase: 'subagent-start' }),
14
- Object.freeze({ event: 'SubagentStop', matcher: '', phase: 'subagent-stop' })
15
- ]);
16
- const DEFAULT_ROLLOUT_READ_ATTEMPTS = 81;
17
- const DEFAULT_ROLLOUT_RETRY_MS = 100;
18
- const DEFAULT_THREAD_READ_ATTEMPTS = 21;
19
- const DEFAULT_THREAD_RETRY_MS = 100;
20
- const DEFAULT_TERMINAL_READ_ATTEMPTS = 21;
21
- const DEFAULT_TERMINAL_RETRY_MS = 100;
22
- function object(value) {
23
- return value && typeof value === 'object' && !Array.isArray(value)
24
- ? value
25
- : null;
26
- }
27
- function nonEmpty(value) {
28
- return typeof value === 'string' && value.trim() ? value : null;
29
- }
30
- function readRolloutRecords(transcriptPath, sessionId) {
31
- const name = path.basename(transcriptPath);
32
- if (!transcriptPath || (!name.endsWith(`-${sessionId}.jsonl`) && name !== `${sessionId}.jsonl`)) {
33
- throw new Error('Codex parent rollout path is invalid');
34
- }
35
- const stat = fs.lstatSync(transcriptPath);
36
- if (!stat.isFile() || stat.isSymbolicLink())
37
- throw new Error('Codex parent rollout is not a regular file');
38
- const offset = Math.max(0, stat.size - 8 * 1024 * 1024);
39
- const buffer = Buffer.alloc(stat.size - offset);
40
- const descriptor = fs.openSync(transcriptPath, 'r');
41
- try {
42
- fs.readSync(descriptor, buffer, 0, buffer.length, offset);
43
- }
44
- finally {
45
- fs.closeSync(descriptor);
46
- }
47
- let text = buffer.toString('utf8');
48
- if (offset)
49
- text = text.slice(text.indexOf('\n') + 1);
50
- return text.split(/\r?\n/u).filter(Boolean).map((line) => object(JSON.parse(line))).filter((record) => Boolean(record));
51
- }
52
- function isExpectedSpawnCall(record, expected) {
53
- const payload = object(record.payload);
54
- return record.type === 'response_item'
55
- && payload?.type === 'function_call'
56
- && payload.call_id === expected.toolUseId
57
- && payload.namespace === 'collaboration'
58
- && payload.name === 'spawn_agent';
59
- }
60
- function spawnArgsMatch(args, expected) {
61
- return args?.agent_type === expected.nativeAgent
62
- && args.task_name === expected.taskName
63
- && (!expected.requestedModel || args.model === expected.requestedModel)
64
- && (!expected.requestedReasoningEffort || args.reasoning_effort === expected.requestedReasoningEffort);
65
- }
66
- function isExpectedChildActivity(record, expected) {
67
- const payload = object(record.payload);
68
- const item = object(payload?.item);
69
- return record.type === 'event_msg'
70
- && payload?.type === 'item_completed'
71
- && payload.thread_id === expected.sessionId
72
- && payload.turn_id === expected.turnId
73
- && item?.type === 'SubAgentActivity'
74
- && item.id === expected.toolUseId
75
- && item.kind === 'started'
76
- && item.agent_path === `/root/${expected.taskName}`
77
- && Boolean(nonEmpty(item.agent_thread_id));
78
- }
79
- function resolveCodexSpawnedChild(transcriptPath, expected) {
80
- if (!parseCodexLifecycleBinding(expected.taskName)) {
81
- throw new Error('Codex spawn task_name does not carry a valid lifecycle binding');
82
- }
83
- const records = readRolloutRecords(transcriptPath, expected.sessionId);
84
- const calls = records.filter((record) => isExpectedSpawnCall(record, expected));
85
- if (calls.length !== 1)
86
- throw new Error('Codex parent rollout spawn call was not found uniquely');
87
- const call = object(calls[0]?.payload);
88
- const args = object(JSON.parse(nonEmpty(call?.arguments) ?? '{}'));
89
- if (!spawnArgsMatch(args, expected))
90
- throw new Error('Codex parent rollout spawn identity does not match the hook event');
91
- const activities = records.filter((record) => isExpectedChildActivity(record, expected));
92
- if (activities.length !== 1)
93
- throw new Error('Codex parent rollout child activity was not found uniquely');
94
- return nonEmpty(object(object(activities[0]?.payload)?.item)?.agent_thread_id);
95
- }
96
- function validateCodexLifecycleHookConfig(value) {
97
- const hooks = object(object(value)?.hooks);
98
- const valid = hooks && LIFECYCLE_HOOKS.every(({ event, matcher, phase }) => {
99
- const entries = hooks[event];
100
- if (!Array.isArray(entries))
101
- return false;
102
- return entries.some((entryValue) => {
103
- const entry = object(entryValue);
104
- if (entry?.matcher !== matcher || !Array.isArray(entry.hooks))
105
- return false;
106
- return entry.hooks.some((hookValue) => {
107
- const hook = object(hookValue);
108
- return hook?.type === 'command'
109
- && hook.timeout === 30
110
- && hook.command === `node "$(git rev-parse --show-toplevel)/.agents/hooks/lifecycle-delegation.js" --client codex --event ${phase}`;
111
- });
112
- });
113
- });
114
- if (!valid)
115
- throw new Error('CODEX_PREFLIGHT_HOOKS_INVALID: lifecycle hooks are invalid');
116
- }
117
- function parseCodexHooksList(value, repoRoot) {
118
- const root = object(value);
119
- const entries = Array.isArray(root?.data) ? root.data : [];
120
- const entry = entries.map(object).find((candidate) => candidate?.cwd === repoRoot);
121
- const errors = Array.isArray(entry?.errors) ? entry.errors : [];
122
- if (errors.length)
123
- throw new Error(`CODEX_PREFLIGHT_HOOK_DISCOVERY_FAILED: ${errors.map(String).join('; ')}`);
124
- const hooks = (Array.isArray(entry?.hooks) ? entry.hooks : [])
125
- .map(object)
126
- .filter((hook) => hook !== null)
127
- .map((hook) => Object.freeze({
128
- eventName: String(hook.eventName ?? ''),
129
- matcher: typeof hook.matcher === 'string' ? hook.matcher : null,
130
- command: String(hook.command ?? ''),
131
- enabled: hook.enabled === true,
132
- source: String(hook.source ?? ''),
133
- sourcePathDigest: typeof hook.sourcePath === 'string' && path.isAbsolute(hook.sourcePath)
134
- ? crypto.createHash('sha256').update(hook.sourcePath).digest('hex')
135
- : '',
136
- trustStatus: String(hook.trustStatus ?? ''),
137
- currentHash: String(hook.currentHash ?? ''),
138
- isManaged: hook.isManaged === true,
139
- pluginId: typeof hook.pluginId === 'string' ? hook.pluginId : null
140
- }));
141
- const valid = LIFECYCLE_HOOKS.every(({ event, matcher, phase }) => hooks.some((hook) => hook.eventName === event.replace(/^./, (character) => character.toLowerCase())
142
- && hook.matcher === matcher
143
- && hook.command === `node "$(git rev-parse --show-toplevel)/.agents/hooks/lifecycle-delegation.js" --client codex --event ${phase}`
144
- && hook.enabled
145
- && hook.currentHash.length > 0
146
- && hook.sourcePathDigest.length === 64
147
- && hook.pluginId === null
148
- && (hook.source === 'project' && hook.trustStatus === 'trusted'
149
- || hook.isManaged && hook.trustStatus === 'managed')));
150
- if (!valid)
151
- throw new Error('CODEX_PREFLIGHT_HOOKS_NOT_LOADED: lifecycle hooks are not loaded for this workspace');
152
- return Object.freeze(hooks);
153
- }
154
- function parseCodexThreadResolution(readValue, rolloutRecords) {
155
- const readRoot = object(readValue);
156
- const thread = object(readRoot?.thread);
157
- const source = object(thread?.source);
158
- const subAgent = object(source?.subAgent);
159
- const threadSpawn = object(subAgent?.thread_spawn);
160
- const sessionMeta = rolloutRecords
161
- .map(object)
162
- .find((record) => record?.type === 'session_meta');
163
- const sessionPayload = object(sessionMeta?.payload);
164
- const turnContext = rolloutRecords
165
- .map(object)
166
- .filter((record) => record?.type === 'turn_context')
167
- .at(-1);
168
- const turnPayload = object(turnContext?.payload);
169
- const childThreadId = nonEmpty(thread?.id);
170
- const parentThreadId = nonEmpty(thread?.parentThreadId);
171
- const sourceParentThreadId = nonEmpty(threadSpawn?.parent_thread_id);
172
- const rolloutChildThreadId = nonEmpty(sessionPayload?.id);
173
- const rolloutParentThreadId = nonEmpty(sessionPayload?.parent_thread_id);
174
- const agentRole = nonEmpty(sessionPayload?.agent_role);
175
- const model = nonEmpty(turnPayload?.model);
176
- const reasoningEffort = nonEmpty(turnPayload?.effort);
177
- const forkedFromId = thread?.forkedFromId;
178
- if (!childThreadId
179
- || rolloutChildThreadId !== childThreadId
180
- || !parentThreadId
181
- || !sourceParentThreadId
182
- || rolloutParentThreadId !== parentThreadId
183
- || rolloutParentThreadId !== sourceParentThreadId
184
- || !/^agent-infra-lifecycle-(executor|reviewer)$/.test(agentRole ?? '')
185
- || !model
186
- || !reasoningEffort
187
- || (forkedFromId !== null && typeof forkedFromId !== 'string')) {
188
- throw new Error('Codex App Server thread resolution is invalid');
189
- }
190
- return Object.freeze({
191
- thread: Object.freeze({
192
- type: 'app-thread',
193
- childThreadId,
194
- parentThreadId,
195
- forkedFromId,
196
- sourceParentThreadId,
197
- nativeAgent: agentRole
198
- }),
199
- settings: Object.freeze({
200
- type: 'app-settings',
201
- childThreadId,
202
- model,
203
- reasoningEffort
204
- })
205
- });
206
- }
207
- function resolvePreflightTaskDir(repoRoot, taskId) {
208
- try {
209
- const context = taskId
210
- ? resolveTaskRef(taskId, { repoRoot })
211
- : resolveTaskContext(undefined, { repoRoot });
212
- return context.ok ? context.taskDir : undefined;
213
- }
214
- catch {
215
- return undefined;
216
- }
217
- }
218
- function readCodexRolloutRecords(readValue, childThreadId) {
219
- const thread = object(object(readValue)?.thread);
220
- const rolloutPath = nonEmpty(thread?.path);
221
- const rolloutName = rolloutPath ? path.basename(rolloutPath) : '';
222
- if (!rolloutPath || (rolloutName !== `${childThreadId}.jsonl` && !rolloutName.endsWith(`-${childThreadId}.jsonl`))) {
223
- throw new Error('Codex App Server rollout path is invalid');
224
- }
225
- const stat = fs.statSync(rolloutPath);
226
- if (!stat.isFile())
227
- throw new Error('Codex App Server rollout path is not a regular file');
228
- const maxBytes = 1024 * 1024;
229
- const bytes = Math.min(stat.size, maxBytes);
230
- const descriptor = fs.openSync(rolloutPath, 'r');
231
- try {
232
- const buffer = Buffer.alloc(bytes);
233
- fs.readSync(descriptor, buffer, 0, bytes, 0);
234
- const text = buffer.toString('utf8');
235
- const completeText = stat.size <= maxBytes ? text : text.slice(0, text.lastIndexOf('\n'));
236
- return Object.freeze(completeText.split(/\r?\n/).filter(Boolean).map((line) => JSON.parse(line)));
237
- }
238
- finally {
239
- fs.closeSync(descriptor);
240
- }
241
- }
242
- async function resolveCodexRolloutRecords(readValue, childThreadId, attempts, retryMs) {
243
- let lastError;
244
- for (let attempt = 0; attempt < attempts; attempt += 1) {
245
- try {
246
- const records = readCodexRolloutRecords(readValue, childThreadId);
247
- parseCodexThreadResolution(readValue, records);
248
- return records;
249
- }
250
- catch (error) {
251
- lastError = error;
252
- if (attempt + 1 < attempts)
253
- await new Promise((resolve) => setTimeout(resolve, retryMs));
254
- }
255
- }
256
- throw lastError;
257
- }
258
- function parseCodexTurnCompleted(value) {
259
- const root = object(value);
260
- const turn = object(root?.turn);
261
- const childThreadId = nonEmpty(root?.threadId);
262
- const turnId = nonEmpty(turn?.id);
263
- const status = turn?.status;
264
- if (!childThreadId || !turnId || !['completed', 'interrupted', 'failed'].includes(String(status))) {
265
- throw new Error('Codex App Server turn completion is invalid');
266
- }
267
- return Object.freeze({
268
- type: 'app-terminal',
269
- childThreadId,
270
- turnId,
271
- status: status
272
- });
273
- }
274
- function parseCodexModelReroute(value) {
275
- const root = object(value);
276
- const childThreadId = nonEmpty(root?.threadId);
277
- const turnId = nonEmpty(root?.turnId);
278
- const fromModel = nonEmpty(root?.fromModel);
279
- const toModel = nonEmpty(root?.toModel);
280
- const reasonValue = root?.reason;
281
- const reason = nonEmpty(reasonValue) ?? (object(reasonValue) ? JSON.stringify(reasonValue) : null);
282
- if (!childThreadId || !turnId || !fromModel || !toModel || !reason) {
283
- throw new Error('Codex App Server model reroute is invalid');
284
- }
285
- return Object.freeze({ type: 'app-reroute', childThreadId, turnId, fromModel, toModel, reason });
286
- }
287
- class CodexAppServerTransport {
288
- #options;
289
- #child = null;
290
- #buffer = '';
291
- #stderr = '';
292
- #nextId = 1;
293
- #pending = new Map();
294
- #notifications = [];
295
- constructor(options = {}) {
296
- this.#options = {
297
- ...options,
298
- command: options.command ?? 'codex',
299
- args: options.args ?? ['app-server', '--stdio'],
300
- timeoutMs: options.timeoutMs ?? 5_000
301
- };
302
- }
303
- get diagnostics() {
304
- return Object.freeze(this.#stderr.split(/\r?\n/).filter(Boolean));
305
- }
306
- get notifications() {
307
- return Object.freeze([...this.#notifications]);
308
- }
309
- start() {
310
- if (this.#child)
311
- throw new Error('Codex App Server transport is already started');
312
- const child = spawn(this.#options.command, [...this.#options.args], {
313
- cwd: this.#options.cwd,
314
- env: this.#options.env,
315
- stdio: ['pipe', 'pipe', 'pipe']
316
- });
317
- this.#child = child;
318
- child.stdout.setEncoding('utf8');
319
- child.stderr.setEncoding('utf8');
320
- child.stdout.on('data', (chunk) => this.#onData(chunk));
321
- child.stderr.on('data', (chunk) => {
322
- this.#stderr = `${this.#stderr}${chunk}`.slice(-32 * 1024);
323
- });
324
- child.on('error', (error) => this.#rejectAll(error));
325
- child.on('exit', (code, signal) => {
326
- if (this.#pending.size) {
327
- this.#rejectAll(new Error(`Codex App Server exited before responding (code=${code}, signal=${signal})`));
328
- }
329
- });
330
- }
331
- #onData(chunk) {
332
- this.#buffer += chunk;
333
- for (;;) {
334
- const newline = this.#buffer.indexOf('\n');
335
- if (newline < 0)
336
- return;
337
- const line = this.#buffer.slice(0, newline).trim();
338
- this.#buffer = this.#buffer.slice(newline + 1);
339
- if (!line)
340
- continue;
341
- let message;
342
- try {
343
- const parsed = object(JSON.parse(line));
344
- if (!parsed)
345
- throw new Error('message is not an object');
346
- message = parsed;
347
- }
348
- catch (error) {
349
- this.#rejectAll(new Error(`Codex App Server returned invalid JSON: ${String(error)}`));
350
- continue;
351
- }
352
- if (typeof message.id === 'number') {
353
- const pending = this.#pending.get(message.id);
354
- if (!pending)
355
- continue;
356
- clearTimeout(pending.timer);
357
- this.#pending.delete(message.id);
358
- if (message.error)
359
- pending.reject(new Error(`Codex App Server request failed: ${JSON.stringify(message.error)}`));
360
- else
361
- pending.resolve(message.result);
362
- }
363
- else if (typeof message.method === 'string') {
364
- this.#notifications.push(Object.freeze({ method: message.method, params: message.params }));
365
- }
366
- }
367
- }
368
- #rejectAll(error) {
369
- for (const [id, pending] of this.#pending) {
370
- clearTimeout(pending.timer);
371
- this.#pending.delete(id);
372
- pending.reject(error);
373
- }
374
- }
375
- request(method, params) {
376
- if (!this.#child || !this.#child.stdin.writable) {
377
- return Promise.reject(new Error('Codex App Server transport is not running'));
378
- }
379
- const id = this.#nextId++;
380
- return new Promise((resolve, reject) => {
381
- const timer = setTimeout(() => {
382
- this.#pending.delete(id);
383
- reject(new Error(`Codex App Server request '${method}' timed out`));
384
- }, this.#options.timeoutMs);
385
- this.#pending.set(id, { resolve, reject, timer });
386
- this.#child.stdin.write(`${JSON.stringify({ id, method, params })}\n`);
387
- });
388
- }
389
- notify(method, params = {}) {
390
- if (!this.#child || !this.#child.stdin.writable)
391
- throw new Error('Codex App Server transport is not running');
392
- this.#child.stdin.write(`${JSON.stringify({ method, params })}\n`);
393
- }
394
- async initialize() {
395
- const result = await this.request('initialize', {
396
- clientInfo: { name: 'agent-infra', title: 'agent-infra', version: '0.9.5' },
397
- capabilities: null
398
- });
399
- this.notify('initialized');
400
- return result;
401
- }
402
- close() {
403
- if (!this.#child)
404
- return;
405
- this.#child.stdin.end();
406
- this.#child.kill();
407
- this.#child = null;
408
- }
409
- }
410
- async function resolveCodexThread(childThreadId, options = {}) {
411
- if (!nonEmpty(childThreadId))
412
- throw new Error('Codex child thread id is required');
413
- const transport = new CodexAppServerTransport(options);
414
- transport.start();
415
- try {
416
- await transport.initialize();
417
- const readResult = object(await transport.request('thread/read', { threadId: childThreadId, includeTurns: false }));
418
- const readThread = object(readResult?.thread);
419
- if (nonEmpty(readThread?.id) !== childThreadId)
420
- throw new Error('Codex App Server returned the wrong child thread');
421
- let rolloutRecords;
422
- try {
423
- rolloutRecords = await resolveCodexRolloutRecords(readResult, childThreadId, options.rolloutReadAttempts ?? DEFAULT_ROLLOUT_READ_ATTEMPTS, options.rolloutRetryMs ?? DEFAULT_ROLLOUT_RETRY_MS);
424
- }
425
- catch {
426
- throw new Error('Codex App Server rollout metadata is unavailable');
427
- }
428
- let resolution = parseCodexThreadResolution(readResult, rolloutRecords);
429
- const threadReadAttempts = options.threadReadAttempts ?? DEFAULT_THREAD_READ_ATTEMPTS;
430
- for (let attempt = 1; resolution.thread.forkedFromId !== null && attempt < threadReadAttempts; attempt += 1) {
431
- await new Promise((resolve) => setTimeout(resolve, options.threadRetryMs ?? DEFAULT_THREAD_RETRY_MS));
432
- const refreshed = object(await transport.request('thread/read', { threadId: childThreadId, includeTurns: false }));
433
- if (nonEmpty(object(refreshed?.thread)?.id) !== childThreadId) {
434
- throw new Error('Codex App Server returned the wrong child thread');
435
- }
436
- resolution = parseCodexThreadResolution(refreshed, rolloutRecords);
437
- }
438
- if (resolution.thread.forkedFromId !== null) {
439
- throw new Error('Codex App Server fresh thread metadata is unavailable');
440
- }
441
- const reroutes = transport.notifications
442
- .filter((entry) => entry.method === 'model/rerouted')
443
- .map((entry) => parseCodexModelReroute(entry.params))
444
- .filter((event) => event.childThreadId === childThreadId);
445
- return Object.freeze({ resolution, reroutes: Object.freeze(reroutes), diagnostics: transport.diagnostics });
446
- }
447
- finally {
448
- try {
449
- await transport.request('thread/unsubscribe', { threadId: childThreadId });
450
- }
451
- catch {
452
- // Closing the short-lived transport still removes the subscription.
453
- }
454
- transport.close();
455
- }
456
- }
457
- async function resolveCodexTerminal(childThreadId, expectedTurnIdOrOptions = {}, terminalOptions = {}) {
458
- const expectedTurnId = typeof expectedTurnIdOrOptions === 'string' ? expectedTurnIdOrOptions : null;
459
- const options = typeof expectedTurnIdOrOptions === 'string' ? terminalOptions : expectedTurnIdOrOptions;
460
- const transport = new CodexAppServerTransport(options);
461
- transport.start();
462
- try {
463
- await transport.initialize();
464
- const attempts = expectedTurnId ? options.terminalReadAttempts ?? DEFAULT_TERMINAL_READ_ATTEMPTS : 1;
465
- let abnormal = null;
466
- for (let attempt = 0; attempt < attempts; attempt += 1) {
467
- const result = object(await transport.request('thread/read', { threadId: childThreadId, includeTurns: true }));
468
- const thread = object(result?.thread);
469
- if (nonEmpty(thread?.id) !== childThreadId)
470
- throw new Error('Codex App Server returned the wrong child thread');
471
- const turns = Array.isArray(thread?.turns) ? thread.turns : [];
472
- const turn = expectedTurnId
473
- ? turns.find((candidate) => object(candidate)?.id === expectedTurnId)
474
- : turns.at(-1);
475
- const turnValue = object(turn);
476
- if (turnValue && turnValue.status !== 'inProgress') {
477
- const terminal = parseCodexTurnCompleted({ threadId: childThreadId, turn });
478
- if (terminal.status === 'completed')
479
- return terminal;
480
- abnormal = terminal;
481
- }
482
- if (attempt + 1 < attempts) {
483
- await new Promise((resolve) => setTimeout(resolve, options.terminalRetryMs ?? DEFAULT_TERMINAL_RETRY_MS));
484
- }
485
- }
486
- if (abnormal)
487
- return abnormal;
488
- throw new Error('CODEX_TURN_NOT_TERMINAL');
489
- }
490
- finally {
491
- transport.close();
492
- }
493
- }
494
- async function preflightCodexLifecycleEvidence(repoRoot = process.cwd(), runtimeIdentity, taskId) {
495
- const { cliVersion, hooksRaw } = validateStaticCodexPreflight(repoRoot);
496
- const hookDefinitionHash = crypto.createHash('sha256').update(hooksRaw).digest('hex');
497
- const taskDir = resolvePreflightTaskDir(repoRoot, taskId);
498
- const runtimeLiveness = Boolean(taskDir && runtimeIdentity
499
- && hasActiveCodexLifecycleEvidence(taskDir, { hookDefinitionHash, identity: runtimeIdentity }));
500
- const host = await discoverLifecycleHooks(repoRoot);
501
- return Object.freeze({
502
- cliVersion,
503
- hookDefinitionHash,
504
- staticReady: true,
505
- discoveredHooks: host.discoveredHooks,
506
- hookProvenance: host.hookProvenance,
507
- runtimeLiveness,
508
- diagnostics: host.diagnostics
509
- });
510
- }
511
- function validateStaticCodexPreflight(repoRoot) {
512
- const versionRun = spawnSync('codex', ['--version'], { encoding: 'utf8' });
513
- const match = /codex-cli\s+(\d+\.\d+\.\d+)/.exec(versionRun.stdout ?? '');
514
- if (versionRun.status !== 0 || !match?.[1] || !semver.gte(match[1], '0.147.0')) {
515
- throw new Error('CODEX_PREFLIGHT_VERSION_UNSUPPORTED');
516
- }
517
- const featuresRun = spawnSync('codex', ['features', 'list'], { encoding: 'utf8' });
518
- if (featuresRun.status !== 0
519
- || !/^hooks\s+\S+\s+true$/m.test(featuresRun.stdout)
520
- || !/^multi_agent\s+\S+\s+true$/m.test(featuresRun.stdout))
521
- throw new Error('CODEX_PREFLIGHT_FEATURE_DISABLED');
522
- const hooksPath = path.join(repoRoot, '.codex', 'hooks.json');
523
- const hooksRaw = fs.readFileSync(hooksPath, 'utf8');
524
- validateCodexLifecycleHookConfig(JSON.parse(hooksRaw));
525
- const schemaDir = fs.mkdtempSync(path.join(os.tmpdir(), 'agent-infra-codex-schema-'));
526
- try {
527
- const schemaRun = spawnSync('codex', ['app-server', 'generate-json-schema', '--out', schemaDir], { encoding: 'utf8' });
528
- if (schemaRun.status !== 0)
529
- throw new Error('CODEX_PREFLIGHT_SCHEMA_UNAVAILABLE');
530
- const schema = fs.readFileSync(path.join(schemaDir, 'codex_app_server_protocol.v2.schemas.json'), 'utf8');
531
- for (const field of ['parentThreadId', 'forkedFromId', 'ThreadSettings', 'turn/completed', 'model/rerouted']) {
532
- if (!schema.includes(field))
533
- throw new Error(`CODEX_PREFLIGHT_SCHEMA_MISSING:${field}`);
534
- }
535
- }
536
- finally {
537
- fs.rmSync(schemaDir, { recursive: true, force: true });
538
- }
539
- return { cliVersion: match[1], hooksRaw };
540
- }
541
- async function discoverLifecycleHooks(repoRoot) {
542
- const transport = new CodexAppServerTransport();
543
- transport.start();
544
- let discoveredHooks;
545
- try {
546
- await transport.initialize();
547
- discoveredHooks = parseCodexHooksList(await transport.request('hooks/list', { cwds: [repoRoot] }), repoRoot);
548
- }
549
- finally {
550
- transport.close();
551
- }
552
- const lifecycleHooks = LIFECYCLE_HOOKS.map(({ event, matcher, phase }) => discoveredHooks.filter((hook) => hook.eventName === event.replace(/^./, (character) => character.toLowerCase())
553
- && hook.matcher === matcher
554
- && hook.command === `node "$(git rev-parse --show-toplevel)/.agents/hooks/lifecycle-delegation.js" --client codex --event ${phase}`));
555
- if (lifecycleHooks.some((matches) => matches.length !== 1)) {
556
- throw new Error('CODEX_PREFLIGHT_HOOK_SOURCE_AMBIGUOUS: lifecycle hook source is not unique');
557
- }
558
- const matchedHooks = lifecycleHooks.flat();
559
- const sources = new Set(matchedHooks.map((hook) => hook.isManaged ? 'managed' : hook.source));
560
- const sourcePathDigests = new Set(matchedHooks.map((hook) => hook.sourcePathDigest));
561
- if (sources.size !== 1 || sourcePathDigests.size !== 1) {
562
- throw new Error('CODEX_PREFLIGHT_HOOK_SOURCE_AMBIGUOUS: lifecycle hooks do not share one exact source');
563
- }
564
- const source = [...sources][0];
565
- const hookSource = source === 'managed' ? 'managed' : 'project';
566
- return {
567
- discoveredHooks,
568
- hookProvenance: Object.freeze({
569
- hookSource,
570
- hookSourcePathDigest: [...sourcePathDigests][0],
571
- hookSourceHash: crypto.createHash('sha256').update(JSON.stringify(matchedHooks.map((hook) => ({
572
- eventName: hook.eventName,
573
- matcher: hook.matcher,
574
- command: hook.command,
575
- currentHash: hook.currentHash
576
- })))).digest('hex')
577
- }),
578
- diagnostics: transport.diagnostics
579
- };
580
- }
581
- export { CodexAppServerTransport, parseCodexModelReroute, parseCodexHooksList, parseCodexThreadResolution, parseCodexTurnCompleted, resolveCodexSpawnedChild, preflightCodexLifecycleEvidence, resolveCodexTerminal, resolveCodexThread, validateCodexLifecycleHookConfig };
582
- //# sourceMappingURL=app-server.js.map