codex-orchestrator 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +12 -9
  3. package/dist/src/index.d.ts +10 -0
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +5 -0
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/v2/acceptance-proof.d.ts +3 -0
  8. package/dist/src/v2/acceptance-proof.d.ts.map +1 -1
  9. package/dist/src/v2/acceptance-proof.js +2 -8
  10. package/dist/src/v2/acceptance-proof.js.map +1 -1
  11. package/dist/src/v2/adapters/gh-issue-adapter.d.ts +5 -3
  12. package/dist/src/v2/adapters/gh-issue-adapter.d.ts.map +1 -1
  13. package/dist/src/v2/adapters/gh-issue-adapter.js +63 -7
  14. package/dist/src/v2/adapters/gh-issue-adapter.js.map +1 -1
  15. package/dist/src/v2/adapters/issues.d.ts +16 -2
  16. package/dist/src/v2/adapters/issues.d.ts.map +1 -1
  17. package/dist/src/v2/adapters/issues.js +15 -5
  18. package/dist/src/v2/adapters/issues.js.map +1 -1
  19. package/dist/src/v2/adapters/mission-coordinator-lock.d.ts +1 -0
  20. package/dist/src/v2/adapters/mission-coordinator-lock.d.ts.map +1 -1
  21. package/dist/src/v2/adapters/mission-coordinator-lock.js +5 -1
  22. package/dist/src/v2/adapters/mission-coordinator-lock.js.map +1 -1
  23. package/dist/src/v2/candidate-cli.d.ts +4 -0
  24. package/dist/src/v2/candidate-cli.d.ts.map +1 -1
  25. package/dist/src/v2/candidate-cli.js +26 -11
  26. package/dist/src/v2/candidate-cli.js.map +1 -1
  27. package/dist/src/v2/cli-contract.d.ts +1 -1
  28. package/dist/src/v2/cli-contract.d.ts.map +1 -1
  29. package/dist/src/v2/cli-contract.js +10 -0
  30. package/dist/src/v2/cli-contract.js.map +1 -1
  31. package/dist/src/v2/code-review-report.d.ts +66 -0
  32. package/dist/src/v2/code-review-report.d.ts.map +1 -0
  33. package/dist/src/v2/code-review-report.js +259 -0
  34. package/dist/src/v2/code-review-report.js.map +1 -0
  35. package/dist/src/v2/codex-process.d.ts +8 -1
  36. package/dist/src/v2/codex-process.d.ts.map +1 -1
  37. package/dist/src/v2/codex-process.js +11 -0
  38. package/dist/src/v2/codex-process.js.map +1 -1
  39. package/dist/src/v2/config.d.ts +2 -1
  40. package/dist/src/v2/config.d.ts.map +1 -1
  41. package/dist/src/v2/config.js +8 -3
  42. package/dist/src/v2/config.js.map +1 -1
  43. package/dist/src/v2/contained-report-operation.d.ts +100 -0
  44. package/dist/src/v2/contained-report-operation.d.ts.map +1 -0
  45. package/dist/src/v2/contained-report-operation.js +200 -0
  46. package/dist/src/v2/contained-report-operation.js.map +1 -0
  47. package/dist/src/v2/containment.d.ts +6 -0
  48. package/dist/src/v2/containment.d.ts.map +1 -1
  49. package/dist/src/v2/containment.js +40 -1
  50. package/dist/src/v2/containment.js.map +1 -1
  51. package/dist/src/v2/direct-delivery.d.ts +101 -0
  52. package/dist/src/v2/direct-delivery.d.ts.map +1 -0
  53. package/dist/src/v2/direct-delivery.js +547 -0
  54. package/dist/src/v2/direct-delivery.js.map +1 -0
  55. package/dist/src/v2/immutable-workflow-publisher.d.ts +40 -0
  56. package/dist/src/v2/immutable-workflow-publisher.d.ts.map +1 -0
  57. package/dist/src/v2/immutable-workflow-publisher.js +218 -0
  58. package/dist/src/v2/immutable-workflow-publisher.js.map +1 -0
  59. package/dist/src/v2/implementation-reviewer.d.ts +81 -0
  60. package/dist/src/v2/implementation-reviewer.d.ts.map +1 -0
  61. package/dist/src/v2/implementation-reviewer.js +157 -0
  62. package/dist/src/v2/implementation-reviewer.js.map +1 -0
  63. package/dist/src/v2/owner-control-lock.d.ts +41 -0
  64. package/dist/src/v2/owner-control-lock.d.ts.map +1 -0
  65. package/dist/src/v2/owner-control-lock.js +174 -0
  66. package/dist/src/v2/owner-control-lock.js.map +1 -0
  67. package/dist/src/v2/route-continuations.d.ts +32 -0
  68. package/dist/src/v2/route-continuations.d.ts.map +1 -0
  69. package/dist/src/v2/route-continuations.js +2 -0
  70. package/dist/src/v2/route-continuations.js.map +1 -0
  71. package/dist/src/v2/route-coordinator.d.ts +77 -0
  72. package/dist/src/v2/route-coordinator.d.ts.map +1 -0
  73. package/dist/src/v2/route-coordinator.js +370 -0
  74. package/dist/src/v2/route-coordinator.js.map +1 -0
  75. package/dist/src/v2/route-decision.d.ts +129 -0
  76. package/dist/src/v2/route-decision.d.ts.map +1 -0
  77. package/dist/src/v2/route-decision.js +400 -0
  78. package/dist/src/v2/route-decision.js.map +1 -0
  79. package/dist/src/v2/run-issue.d.ts +63 -2
  80. package/dist/src/v2/run-issue.d.ts.map +1 -1
  81. package/dist/src/v2/run-issue.js +906 -91
  82. package/dist/src/v2/run-issue.js.map +1 -1
  83. package/dist/src/v2/run-store.d.ts +25 -1
  84. package/dist/src/v2/run-store.d.ts.map +1 -1
  85. package/dist/src/v2/run-store.js +143 -3
  86. package/dist/src/v2/run-store.js.map +1 -1
  87. package/dist/src/v2/runtime-assets.d.ts +15 -13
  88. package/dist/src/v2/runtime-assets.d.ts.map +1 -1
  89. package/dist/src/v2/runtime-assets.js +263 -416
  90. package/dist/src/v2/runtime-assets.js.map +1 -1
  91. package/dist/src/v2/runtime.d.ts +14 -6
  92. package/dist/src/v2/runtime.d.ts.map +1 -1
  93. package/dist/src/v2/runtime.js +478 -56
  94. package/dist/src/v2/runtime.js.map +1 -1
  95. package/dist/src/v2/setup-cli.d.ts.map +1 -1
  96. package/dist/src/v2/setup-cli.js +1 -0
  97. package/dist/src/v2/setup-cli.js.map +1 -1
  98. package/dist/src/v2/setup-runtime.d.ts.map +1 -1
  99. package/dist/src/v2/setup-runtime.js +20 -72
  100. package/dist/src/v2/setup-runtime.js.map +1 -1
  101. package/dist/src/v2/setup.d.ts +4 -1
  102. package/dist/src/v2/setup.d.ts.map +1 -1
  103. package/dist/src/v2/setup.js +104 -1
  104. package/dist/src/v2/setup.js.map +1 -1
  105. package/dist/src/v2/spec-coordinator.d.ts +85 -0
  106. package/dist/src/v2/spec-coordinator.d.ts.map +1 -0
  107. package/dist/src/v2/spec-coordinator.js +88 -0
  108. package/dist/src/v2/spec-coordinator.js.map +1 -0
  109. package/dist/src/v2/spec-delivery.d.ts +143 -0
  110. package/dist/src/v2/spec-delivery.d.ts.map +1 -0
  111. package/dist/src/v2/spec-delivery.js +401 -0
  112. package/dist/src/v2/spec-delivery.js.map +1 -0
  113. package/dist/src/v2/triage-route.d.ts +68 -0
  114. package/dist/src/v2/triage-route.d.ts.map +1 -0
  115. package/dist/src/v2/triage-route.js +223 -0
  116. package/dist/src/v2/triage-route.js.map +1 -0
  117. package/dist/src/v2/waiting-human-coordinator.d.ts +49 -0
  118. package/dist/src/v2/waiting-human-coordinator.d.ts.map +1 -0
  119. package/dist/src/v2/waiting-human-coordinator.js +509 -0
  120. package/dist/src/v2/waiting-human-coordinator.js.map +1 -0
  121. package/dist/src/v2/waiting-human.d.ts +143 -0
  122. package/dist/src/v2/waiting-human.d.ts.map +1 -0
  123. package/dist/src/v2/waiting-human.js +408 -0
  124. package/dist/src/v2/waiting-human.js.map +1 -0
  125. package/dist/src/v2/workflow-assets.d.ts +90 -0
  126. package/dist/src/v2/workflow-assets.d.ts.map +1 -0
  127. package/dist/src/v2/workflow-assets.js +554 -0
  128. package/dist/src/v2/workflow-assets.js.map +1 -0
  129. package/docs/deep-dive.md +15 -8
  130. package/internal-workflow/docs/agents/artifact-review-loop.md +267 -0
  131. package/internal-workflow/docs/agents/bug-workflow-routing.md +24 -0
  132. package/internal-workflow/docs/agents/coding-skill-routing.md +203 -0
  133. package/internal-workflow/docs/agents/confidence-rubric.md +65 -0
  134. package/internal-workflow/docs/agents/contract-test-ledger.md +60 -0
  135. package/internal-workflow/docs/agents/implementation-review-loop.md +302 -0
  136. package/internal-workflow/docs/agents/review-gates.md +49 -0
  137. package/internal-workflow/docs/agents/review-protocol.md +170 -0
  138. package/internal-workflow/docs/agents/tool-usage.md +88 -0
  139. package/internal-workflow/manifest.json +1 -0
  140. package/internal-workflow/operations/acceptance-proof/SKILL.md +3 -0
  141. package/internal-workflow/operations/ambiguity-review/SKILL.md +3 -0
  142. package/internal-workflow/operations/cleanup-review/SKILL.md +3 -0
  143. package/internal-workflow/operations/code-review/SKILL.md +3 -0
  144. package/internal-workflow/operations/implementation/SKILL.md +3 -0
  145. package/internal-workflow/operations/spec-author/SKILL.md +3 -0
  146. package/internal-workflow/operations/spec-implementation/SKILL.md +3 -0
  147. package/internal-workflow/operations/spec-review/SKILL.md +3 -0
  148. package/internal-workflow/operations/triage/SKILL.md +3 -0
  149. package/internal-workflow/profiles/analyst_deep.toml +9 -0
  150. package/internal-workflow/profiles/implementer_deep.toml +9 -0
  151. package/internal-workflow/profiles/implementer_standard.toml +9 -0
  152. package/internal-workflow/profiles/proof_agent.toml +8 -0
  153. package/internal-workflow/profiles/researcher_standard.toml +9 -0
  154. package/internal-workflow/profiles/reviewer_deep.toml +9 -0
  155. package/internal-workflow/profiles/reviewer_fast.toml +9 -0
  156. package/internal-workflow/profiles/reviewer_standard.toml +9 -0
  157. package/internal-workflow/schemas/ambiguity-review-v1.json +1 -0
  158. package/internal-workflow/schemas/code-review-v1.json +1 -0
  159. package/internal-workflow/schemas/implementation-report-v1.json +1 -0
  160. package/internal-workflow/schemas/proof-report-v1.json +1 -0
  161. package/internal-workflow/schemas/spec-author-v1.json +1 -0
  162. package/internal-workflow/schemas/spec-review-v1.json +30 -0
  163. package/internal-workflow/schemas/triage-route-v1.json +1 -0
  164. package/internal-workflow/skills/acceptance-proof/agents/openai.yaml +6 -0
  165. package/internal-workflow/skills/agent-auto/agents/openai.yaml +6 -0
  166. package/internal-workflow/skills/cleanup-review/SKILL.md +84 -0
  167. package/internal-workflow/skills/cleanup-review/agents/openai.yaml +6 -0
  168. package/internal-workflow/skills/code-review/SKILL.md +257 -0
  169. package/internal-workflow/skills/code-review/agents/openai.yaml +4 -0
  170. package/internal-workflow/skills/code-review/references/bug-classes.md +56 -0
  171. package/internal-workflow/skills/code-review/references/framework-lenses.md +34 -0
  172. package/internal-workflow/skills/code-review/references/targeted-recipes.md +49 -0
  173. package/internal-workflow/skills/codebase-design/DEEPENING.md +35 -0
  174. package/internal-workflow/skills/codebase-design/DESIGN-IT-TWICE.md +50 -0
  175. package/internal-workflow/skills/codebase-design/SKILL.md +82 -0
  176. package/internal-workflow/skills/codebase-design/agents/openai.yaml +6 -0
  177. package/internal-workflow/skills/diagnosing-bugs/SKILL.md +138 -0
  178. package/internal-workflow/skills/diagnosing-bugs/agents/openai.yaml +6 -0
  179. package/internal-workflow/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
  180. package/internal-workflow/skills/implementation-spec-maker/SKILL.md +93 -0
  181. package/internal-workflow/skills/implementation-spec-maker/agents/openai.yaml +6 -0
  182. package/internal-workflow/skills/implementation-spec-maker/references/source-modes.md +31 -0
  183. package/internal-workflow/skills/implementation-spec-maker/references/spec-template.md +146 -0
  184. package/internal-workflow/skills/implementation-spec-review/SKILL.md +211 -0
  185. package/internal-workflow/skills/implementation-spec-review/agents/openai.yaml +6 -0
  186. package/internal-workflow/skills/research/SKILL.md +107 -0
  187. package/internal-workflow/skills/research/agents/openai.yaml +6 -0
  188. package/internal-workflow/skills/small-task-implementer/SKILL.md +97 -0
  189. package/internal-workflow/skills/small-task-implementer/agents/openai.yaml +6 -0
  190. package/internal-workflow/skills/spec-implementer/SKILL.md +197 -0
  191. package/internal-workflow/skills/spec-implementer/agents/openai.yaml +6 -0
  192. package/internal-workflow/skills/tdd/SKILL.md +59 -0
  193. package/internal-workflow/skills/tdd/agents/openai.yaml +6 -0
  194. package/internal-workflow/skills/tdd/interface-design.md +31 -0
  195. package/internal-workflow/skills/tdd/mocking.md +59 -0
  196. package/internal-workflow/skills/tdd/refactoring.md +10 -0
  197. package/internal-workflow/skills/tdd/tests.md +77 -0
  198. package/internal-workflow/skills/triage/AGENT-BRIEF.md +192 -0
  199. package/internal-workflow/skills/triage/OUT-OF-SCOPE.md +101 -0
  200. package/internal-workflow/skills/triage/SKILL.md +134 -0
  201. package/internal-workflow/skills/triage/agents/openai.yaml +6 -0
  202. package/internal-workflow/skills/ui-evidence-proof/SKILL.md +123 -0
  203. package/internal-workflow/skills/ui-evidence-proof/agents/openai.yaml +6 -0
  204. package/package.json +6 -3
  205. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/SKILL.md +0 -0
  206. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/references/android.md +0 -0
  207. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/references/browser.md +0 -0
  208. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/references/ios.md +0 -0
  209. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/tools/android-lease.mjs +0 -0
  210. /package/{internal-skills → internal-workflow/skills}/acceptance-proof/tools/ios-lease.mjs +0 -0
  211. /package/{internal-skills → internal-workflow/skills}/agent-auto/SKILL.md +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable-workflow-publisher.d.ts","sourceRoot":"","sources":["../../../src/v2/immutable-workflow-publisher.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,4BAA4B,GACpC,mBAAmB,GAAG,kBAAkB,GACxC,qBAAqB,GAAG,0BAA0B,GAClD,4BAA4B,GAAG,2BAA2B,GAC1D,mBAAmB,GAAG,kBAAkB,GAAG,yBAAyB,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY,CAAC,MAAM,SAAS,WAAW;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,SAAS,sBAAsB,EACrC,MAAM,SAAS,WAAW,EAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EAAE;IACP,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,oBAAoB,EAAE,MAAM,KAAK,MAAM,CAAC;IAClF,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC;IAC1D,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IACvC,eAAe,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxH,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACrE,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,QAAQ,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClG,0BAA0B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACpE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,4BAA4B,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACvE,GAAG,OAAO,CAAC,OAAO,CAAC,CAsEnB"}
@@ -0,0 +1,218 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { link, lstat, mkdir, open, readFile, readdir, rm, writeFile, chmod } from 'node:fs/promises';
3
+ import { platform } from 'node:os';
4
+ import { join } from 'node:path';
5
+ const WAIT_MS = 5_000;
6
+ const POLL_MS = 25;
7
+ export async function publishImmutableWorkflow(input) {
8
+ const claimPath = join(input.parent, `${input.identity}.claim`);
9
+ const readyPath = join(input.parent, `${input.identity}.ready`);
10
+ const started = Date.now();
11
+ const processStartIdentity = await readProcessStartIdentity(process.pid);
12
+ if (!processStartIdentity)
13
+ throw new Error('publisher process identity is unavailable');
14
+ let owner;
15
+ while (true) {
16
+ if (await exists(readyPath))
17
+ return resultFromReady(input, readyPath, true);
18
+ if (!await exists(claimPath)) {
19
+ owner = input.createOwner(null, processStartIdentity);
20
+ if (await tryLinkRecord(input, `.claim-candidate-${owner.token}`, claimPath, owner)) {
21
+ activeOwnerTokens.add(owner.token);
22
+ break;
23
+ }
24
+ continue;
25
+ }
26
+ const leaf = await leafOwner(input);
27
+ const sameLiveProcess = leaf.bootId === input.bootId
28
+ && await processIdentityMatches(leaf.pid, leaf.processStartIdentity);
29
+ if (sameLiveProcess && !(leaf.pid === process.pid && !activeOwnerTokens.has(leaf.token))) {
30
+ if (Date.now() - started > WAIT_MS)
31
+ throw new Error(input.activePublisherError);
32
+ await delay(POLL_MS);
33
+ continue;
34
+ }
35
+ owner = input.createOwner(leaf.token, processStartIdentity);
36
+ const recoveryPath = join(input.parent, `${input.identity}.recovery.${leaf.token}`);
37
+ if (await tryLinkRecord(input, `.recovery-candidate-${owner.token}`, recoveryPath, owner)) {
38
+ activeOwnerTokens.add(owner.token);
39
+ break;
40
+ }
41
+ }
42
+ const contentRoot = join(input.parent, `${input.identity}.content.${owner.token}`);
43
+ try {
44
+ await input.assertContentPathAvailable?.(contentRoot);
45
+ await mkdir(contentRoot, { mode: 0o700 });
46
+ await input.onStep?.('after-content-mkdir');
47
+ const content = await input.writeContent(contentRoot, async (step) => { await input.onStep?.(step); });
48
+ await input.onStep?.('before-content-parent-sync');
49
+ await syncDirectory(input.parent);
50
+ await input.onStep?.('after-content-parent-sync');
51
+ const ready = input.createReady(owner, content);
52
+ const readyBytes = input.serializeRecord(ready);
53
+ const candidate = join(input.parent, `.ready-candidate-${owner.token}`);
54
+ await input.onStep?.('before-ready-link');
55
+ await writeSynced(candidate, readyBytes, 0o600);
56
+ try {
57
+ await link(candidate, readyPath);
58
+ await rm(candidate, { force: true });
59
+ await input.onStep?.('after-ready-link');
60
+ await syncDirectory(input.parent);
61
+ await input.onStep?.('after-ready-parent-sync');
62
+ }
63
+ catch (error) {
64
+ if (!isCode(error, 'EEXIST'))
65
+ throw error;
66
+ if (input.verifyReadyCollision)
67
+ input.verifyReadyCollision(await input.readControl(readyPath), readyBytes);
68
+ }
69
+ finally {
70
+ await rm(candidate, { force: true });
71
+ }
72
+ if (input.resultFromPublished) {
73
+ return input.resultFromPublished({ ready, readyPath, contentRoot, content, reused: false });
74
+ }
75
+ return resultFromReady(input, readyPath, false);
76
+ }
77
+ catch (error) {
78
+ if (!await exists(readyPath))
79
+ await removeOwnedContent(contentRoot);
80
+ throw error;
81
+ }
82
+ finally {
83
+ activeOwnerTokens.delete(owner.token);
84
+ }
85
+ }
86
+ async function resultFromReady(input, readyPath, reused) {
87
+ const ready = input.parseReady(JSON.parse((await input.readControl(readyPath)).toString('utf8')));
88
+ const leaf = await leafOwner(input);
89
+ if (leaf.token !== ready.token)
90
+ throw new Error(input.recoveryChainError);
91
+ return input.resultFromReady({
92
+ ready,
93
+ readyPath,
94
+ contentRoot: join(input.parent, `${input.identity}.content.${ready.token}`),
95
+ reused,
96
+ });
97
+ }
98
+ async function leafOwner(input) {
99
+ let owner = input.parseOwner(JSON.parse((await input.readControl(join(input.parent, `${input.identity}.claim`))).toString('utf8')));
100
+ const seen = new Set([owner.token]);
101
+ while (await exists(join(input.parent, `${input.identity}.recovery.${owner.token}`))) {
102
+ const next = input.parseOwner(JSON.parse((await input.readControl(join(input.parent, `${input.identity}.recovery.${owner.token}`))).toString('utf8')));
103
+ if (next.parentToken !== owner.token || seen.has(next.token))
104
+ throw new Error(input.recoveryChainError);
105
+ owner = next;
106
+ seen.add(owner.token);
107
+ }
108
+ return owner;
109
+ }
110
+ async function tryLinkRecord(input, candidateName, destination, owner) {
111
+ const candidate = join(input.parent, candidateName);
112
+ await input.onStep?.('before-claim-link');
113
+ await writeSynced(candidate, input.serializeRecord(owner), 0o600);
114
+ activeOwnerTokens.add(owner.token);
115
+ try {
116
+ await link(candidate, destination);
117
+ await syncDirectory(input.parent);
118
+ await rm(candidate, { force: true });
119
+ await input.onStep?.('after-claim-link');
120
+ return true;
121
+ }
122
+ catch (error) {
123
+ if (isCode(error, 'EEXIST')) {
124
+ activeOwnerTokens.delete(owner.token);
125
+ return false;
126
+ }
127
+ activeOwnerTokens.delete(owner.token);
128
+ throw error;
129
+ }
130
+ finally {
131
+ await rm(candidate, { force: true });
132
+ }
133
+ }
134
+ async function writeSynced(path, bytes, mode) {
135
+ await writeFile(path, bytes, { mode });
136
+ await chmod(path, mode);
137
+ const handle = await open(path, 'r');
138
+ try {
139
+ await handle.sync();
140
+ }
141
+ finally {
142
+ await handle.close();
143
+ }
144
+ }
145
+ async function syncDirectory(path) {
146
+ const handle = await open(path, 'r');
147
+ try {
148
+ await handle.sync();
149
+ }
150
+ finally {
151
+ await handle.close();
152
+ }
153
+ }
154
+ const activeOwnerTokens = new Set();
155
+ async function processIdentityMatches(pid, expected) {
156
+ return await readProcessStartIdentity(pid) === expected;
157
+ }
158
+ async function readProcessStartIdentity(pid) {
159
+ if (!Number.isSafeInteger(pid) || pid <= 0)
160
+ return undefined;
161
+ if (platform() === 'linux') {
162
+ try {
163
+ const text = await readFile(`/proc/${pid}/stat`, 'utf8');
164
+ const close = text.lastIndexOf(') ');
165
+ const fields = close < 0 ? [] : text.slice(close + 2).trim().split(/\s+/u);
166
+ return fields[19] ? `linux:${fields[19]}` : undefined;
167
+ }
168
+ catch {
169
+ return undefined;
170
+ }
171
+ }
172
+ return await new Promise((resolveIdentity) => {
173
+ execFile('/bin/ps', ['-o', 'lstart=', '-p', String(pid)], { encoding: 'utf8' }, (error, stdout) => {
174
+ const value = error ? '' : stdout.trim().replace(/\s+/gu, ' ');
175
+ resolveIdentity(value ? `${platform()}:${value}` : undefined);
176
+ });
177
+ });
178
+ }
179
+ async function removeOwnedContent(root) {
180
+ if (!await exists(root))
181
+ return;
182
+ const visit = async (path) => {
183
+ const info = await lstat(path);
184
+ if (info.isSymbolicLink())
185
+ throw new Error('publisher content cleanup encountered a symbolic link');
186
+ if (info.isDirectory()) {
187
+ await chmod(path, 0o700);
188
+ for (const entry of await readdir(path))
189
+ await visit(join(path, entry));
190
+ }
191
+ else if (info.isFile()) {
192
+ await chmod(path, 0o600);
193
+ }
194
+ else {
195
+ throw new Error('publisher content cleanup encountered a special entry');
196
+ }
197
+ };
198
+ await visit(root);
199
+ await rm(root, { recursive: true, force: true });
200
+ }
201
+ function isCode(error, code) {
202
+ return typeof error === 'object' && error !== null && error.code === code;
203
+ }
204
+ async function exists(path) {
205
+ try {
206
+ await lstat(path);
207
+ return true;
208
+ }
209
+ catch (error) {
210
+ if (isCode(error, 'ENOENT'))
211
+ return false;
212
+ throw error;
213
+ }
214
+ }
215
+ function delay(ms) {
216
+ return new Promise((resolveDelay) => setTimeout(resolveDelay, ms));
217
+ }
218
+ //# sourceMappingURL=immutable-workflow-publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"immutable-workflow-publisher.js","sourceRoot":"","sources":["../../../src/v2/immutable-workflow-publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { ContainedReportOperation, ReportOnlyWorktreeSnapshot } from './contained-report-operation.js';
2
+ import type { CodeReviewDefectV1, CodeReviewReportV1, ReviewMode, ReviewOperation } from './code-review-report.js';
3
+ import type { WorkflowGenerationReceipt } from './workflow-assets.js';
4
+ export interface ImplementationReviewInvocation {
5
+ attemptId: string;
6
+ operation: ReviewOperation;
7
+ mode: ReviewMode;
8
+ reviewerSessionId: string;
9
+ targetRevision: number;
10
+ targetFingerprint: string;
11
+ closureRequestSha256: string | null;
12
+ }
13
+ export interface ImplementationReviewerInput {
14
+ runId: string;
15
+ worktreePath: string;
16
+ operation: ReviewOperation;
17
+ mode: ReviewMode;
18
+ reviewerSessionId: string;
19
+ implementationAttemptId: string;
20
+ targetRevision: number;
21
+ targetFingerprint: string;
22
+ closureRequestSha256: string | null;
23
+ issue: unknown;
24
+ frozenCriteria: unknown[];
25
+ routeReceipt: unknown;
26
+ defects: CodeReviewDefectV1[];
27
+ affectedDefectIds: string[];
28
+ fixedRepairFindings: Array<{
29
+ id: string;
30
+ affectedContracts: string[];
31
+ }>;
32
+ mandatoryCoverage: string[];
33
+ workflowGeneration: WorkflowGenerationReceipt;
34
+ repairOnly: boolean;
35
+ originalReportSha256: string | null;
36
+ validationDiagnostic: string | null;
37
+ originalReportBytes: Buffer | null;
38
+ signal: AbortSignal;
39
+ onPrepared(invocation: ImplementationReviewInvocation): Promise<void>;
40
+ onLaunched(invocation: ImplementationReviewInvocation & {
41
+ pid: number;
42
+ processGroupId: number;
43
+ }): Promise<void>;
44
+ }
45
+ export type ImplementationReviewerResult = {
46
+ kind: 'completed';
47
+ attemptId: string;
48
+ report: CodeReviewReportV1;
49
+ artifactSha256: string;
50
+ } | {
51
+ kind: 'transport-failed';
52
+ resumable: true;
53
+ } | {
54
+ kind: 'report-invalid';
55
+ diagnostic: string;
56
+ originalReportSha256: string;
57
+ originalReportBytes: Buffer;
58
+ } | {
59
+ kind: 'safe-halt';
60
+ process: {
61
+ pid: number;
62
+ processGroupId: number;
63
+ startedAt: string;
64
+ baseline: ReportOnlyWorktreeSnapshot;
65
+ };
66
+ waitForAbsence(): Promise<void>;
67
+ } | {
68
+ kind: 'cancelled';
69
+ } | {
70
+ kind: 'internal-error';
71
+ code: string;
72
+ };
73
+ export declare class ContainedImplementationReviewer {
74
+ private readonly dependencies;
75
+ constructor(dependencies: {
76
+ operation: ContainedReportOperation;
77
+ createAttemptId?: () => string;
78
+ });
79
+ run(input: ImplementationReviewerInput): Promise<ImplementationReviewerResult>;
80
+ }
81
+ //# sourceMappingURL=implementation-reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implementation-reviewer.d.ts","sourceRoot":"","sources":["../../../src/v2/implementation-reviewer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { canonicalJson, containsCredentialEvidence } from './containment.js';
3
+ const SHA256 = /^[0-9a-f]{64}$/u;
4
+ const MAX_CAPSULE_BYTES = 1024 * 1024;
5
+ export class ContainedImplementationReviewer {
6
+ dependencies;
7
+ constructor(dependencies) {
8
+ this.dependencies = dependencies;
9
+ }
10
+ async run(input) {
11
+ let attemptId;
12
+ let promptFacts;
13
+ try {
14
+ attemptId = (this.dependencies.createAttemptId ?? randomUUID)();
15
+ assertText(attemptId, 'review attempt ID');
16
+ assertText(input.reviewerSessionId, 'reviewer session ID');
17
+ assertText(input.implementationAttemptId, 'implementation attempt ID');
18
+ if (attemptId === input.implementationAttemptId || input.reviewerSessionId === input.implementationAttemptId) {
19
+ throw new Error('reviewer identity is not independent');
20
+ }
21
+ assertPositiveInteger(input.targetRevision, 'target revision');
22
+ assertSha256(input.targetFingerprint, 'target fingerprint');
23
+ if (input.closureRequestSha256 !== null)
24
+ assertSha256(input.closureRequestSha256, 'Closure request hash');
25
+ if ((input.mode === 'full') !== (input.closureRequestSha256 === null))
26
+ throw new Error('review mode/Closure hash mismatch');
27
+ promptFacts = [buildCapsule(input)];
28
+ }
29
+ catch (error) {
30
+ return {
31
+ kind: 'internal-error',
32
+ code: safeCode(error, input.repairOnly ? 'review-report-repair-input-invalid' : 'review-input-invalid'),
33
+ };
34
+ }
35
+ const invocation = {
36
+ attemptId, operation: input.operation, mode: input.mode, reviewerSessionId: input.reviewerSessionId,
37
+ targetRevision: input.targetRevision, targetFingerprint: input.targetFingerprint,
38
+ closureRequestSha256: input.closureRequestSha256,
39
+ };
40
+ let result;
41
+ try {
42
+ result = await this.dependencies.operation.run({
43
+ operation: input.operation,
44
+ attemptId,
45
+ runId: input.runId,
46
+ worktreePath: input.worktreePath,
47
+ workflowGeneration: structuredClone(input.workflowGeneration),
48
+ promptFacts,
49
+ signal: input.signal,
50
+ reviewContext: {
51
+ operation: input.operation, mode: input.mode, targetRevision: input.targetRevision,
52
+ targetFingerprint: input.targetFingerprint, reviewerSessionId: input.reviewerSessionId,
53
+ closureRequestSha256: input.closureRequestSha256,
54
+ fixedRepairFindingIds: input.fixedRepairFindings.map((finding) => finding.id).sort(),
55
+ mandatoryCoverage: [...input.mandatoryCoverage].sort(),
56
+ },
57
+ onPrepared: () => input.onPrepared(structuredClone(invocation)),
58
+ onLaunched: ({ pid, processGroupId }) => input.onLaunched({ ...structuredClone(invocation), pid, processGroupId }),
59
+ });
60
+ }
61
+ catch {
62
+ return { kind: 'internal-error', code: 'review-operation-threw' };
63
+ }
64
+ return mapResult(result);
65
+ }
66
+ }
67
+ function buildCapsule(input) {
68
+ const repair = input.repairOnly
69
+ ? validateRepairInput(input.originalReportSha256, input.validationDiagnostic, input.originalReportBytes)
70
+ : rejectUnexpectedRepairInput(input.originalReportSha256, input.validationDiagnostic, input.originalReportBytes);
71
+ const text = canonicalJson({
72
+ version: 1, operation: input.operation, mode: input.mode, reviewerSessionId: input.reviewerSessionId,
73
+ targetRevision: input.targetRevision, targetFingerprint: input.targetFingerprint,
74
+ closureRequestSha256: input.closureRequestSha256, issue: input.issue, frozenCriteria: input.frozenCriteria,
75
+ routeReceipt: input.routeReceipt, defects: input.defects,
76
+ affectedDefectIds: sortedUnique(input.affectedDefectIds, 'affected defect IDs'),
77
+ fixedRepairFindings: input.fixedRepairFindings.map((finding) => ({
78
+ id: finding.id,
79
+ affectedContracts: sortedUnique(finding.affectedContracts, 'fixed repair finding contracts'),
80
+ })).sort((left, right) => left.id.localeCompare(right.id)),
81
+ mandatoryCoverage: sortedUnique(input.mandatoryCoverage, 'mandatory coverage'),
82
+ repairOnly: input.repairOnly, repair,
83
+ });
84
+ if (Buffer.byteLength(text, 'utf8') > MAX_CAPSULE_BYTES || containsCredentialEvidence(text)) {
85
+ throw new Error('review capsule is unsafe or oversized');
86
+ }
87
+ return text;
88
+ }
89
+ function validateRepairInput(hash, diagnostic, bytes) {
90
+ if (hash === null || diagnostic === null || bytes === null)
91
+ throw new Error('report repair input is incomplete');
92
+ assertSha256(hash, 'original report hash');
93
+ assertText(diagnostic, 'validation diagnostic');
94
+ if (bytes.length > MAX_CAPSULE_BYTES || createHash('sha256').update(bytes).digest('hex') !== hash) {
95
+ throw new Error('original report bytes do not match repair hash');
96
+ }
97
+ const text = bytes.toString('utf8');
98
+ if (!Buffer.from(text, 'utf8').equals(bytes) || containsCredentialEvidence(text))
99
+ throw new Error('original report bytes are unsafe');
100
+ return { originalReportSha256: hash, validationDiagnostic: diagnostic, originalReport: text };
101
+ }
102
+ function rejectUnexpectedRepairInput(hash, diagnostic, bytes) {
103
+ if (hash !== null || diagnostic !== null || bytes !== null)
104
+ throw new Error('Full/Closure review cannot carry report repair bytes');
105
+ return null;
106
+ }
107
+ function mapResult(result) {
108
+ if (result.status === 'completed')
109
+ return {
110
+ kind: 'completed', attemptId: result.attemptId, report: result.validatedPayload,
111
+ artifactSha256: result.artifactSha256,
112
+ };
113
+ if (result.status === 'retryable')
114
+ return { kind: 'transport-failed', resumable: true };
115
+ if (result.status === 'safe-halt')
116
+ return { kind: 'safe-halt', process: result.process, waitForAbsence: result.waitForAbsence };
117
+ if (result.status === 'cancelled')
118
+ return { kind: 'cancelled' };
119
+ if (result.status === 'invalid' && result.repairInput)
120
+ return {
121
+ kind: 'report-invalid',
122
+ diagnostic: result.findings[0] ?? 'review report is invalid',
123
+ originalReportSha256: result.repairInput.originalReportSha256,
124
+ originalReportBytes: Buffer.from(result.repairInput.originalReportBytes),
125
+ };
126
+ return { kind: 'internal-error', code: result.status === 'invalid' ? 'review-report-invalid' : result.code };
127
+ }
128
+ function sortedUnique(value, field) {
129
+ if (!Array.isArray(value) || value.length > 256 || value.some((item) => typeof item !== 'string' || item.length === 0))
130
+ throw new Error(`${field} is invalid`);
131
+ const sorted = [...value].sort();
132
+ if (sorted.some((item, index) => index > 0 && item === sorted[index - 1]))
133
+ throw new Error(`${field} has duplicates`);
134
+ return sorted;
135
+ }
136
+ function assertText(value, field) {
137
+ if (typeof value !== 'string' || value.length === 0 || value.length > 16 * 1024)
138
+ throw new Error(`${field} is invalid`);
139
+ }
140
+ function assertSha256(value, field) {
141
+ if (typeof value !== 'string' || !SHA256.test(value))
142
+ throw new Error(`${field} is invalid`);
143
+ }
144
+ function assertPositiveInteger(value, field) {
145
+ if (!Number.isSafeInteger(value) || value < 1)
146
+ throw new Error(`${field} is invalid`);
147
+ }
148
+ function safeCode(error, fallback) {
149
+ if (!(error instanceof Error))
150
+ return fallback;
151
+ if (/independent/u.test(error.message))
152
+ return 'reviewer-identity-not-independent';
153
+ if (/repair/u.test(error.message))
154
+ return 'review-report-repair-input-invalid';
155
+ return fallback;
156
+ }
157
+ //# sourceMappingURL=implementation-reviewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implementation-reviewer.js","sourceRoot":"","sources":["../../../src/v2/implementation-reviewer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ interface OwnerControlRecordV1 {
2
+ version: 1;
3
+ token: string;
4
+ canonicalRepository: string;
5
+ host: string;
6
+ bootId: string;
7
+ pid: number;
8
+ acquiredAt: string;
9
+ }
10
+ export declare function inspectOwnerControlLock(input: {
11
+ orchestratorHome: string;
12
+ canonicalRepository: string;
13
+ bootId: string;
14
+ host: string;
15
+ processAlive(pid: number): boolean;
16
+ }): Promise<{
17
+ status: 'absent' | 'active' | 'ambiguous';
18
+ reason?: string;
19
+ }>;
20
+ export declare class OwnerControlLockBlockedError extends Error {
21
+ readonly kind: 'live-contention' | 'safety';
22
+ constructor(message?: string, kind?: 'live-contention' | 'safety');
23
+ }
24
+ export interface OwnerControlLockInput {
25
+ orchestratorHome: string;
26
+ canonicalRepository: string;
27
+ bootId: string;
28
+ host: string;
29
+ pid: number;
30
+ now(): string;
31
+ createToken(): string;
32
+ processAlive(pid: number): boolean;
33
+ waitMs?: number;
34
+ pollMs?: number;
35
+ afterObservedOwner?(owner: Readonly<OwnerControlRecordV1>): Promise<void>;
36
+ }
37
+ export declare function acquireOwnerControlLock(input: OwnerControlLockInput): Promise<{
38
+ release(): Promise<void>;
39
+ }>;
40
+ export {};
41
+ //# sourceMappingURL=owner-control-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owner-control-lock.d.ts","sourceRoot":"","sources":["../../../src/v2/owner-control-lock.ts"],"names":[],"mappings":"AAQA,UAAU,oBAAoB;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuB1E;AAED,qBAAa,4BAA6B,SAAQ,KAAK;IACY,QAAQ,CAAC,IAAI,EAAE,iBAAiB,GAAG,QAAQ;gBAAhG,OAAO,SAA4C,EAAW,IAAI,GAAE,iBAAiB,GAAG,QAAmB;CAIxH;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,IAAI,MAAM,CAAC;IACd,WAAW,IAAI,MAAM,CAAC;IACtB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAyCjH"}