approval-md 0.1.0 → 0.2.0

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 (266) hide show
  1. package/README.md +584 -553
  2. package/SPEC.md +42 -13
  3. package/dist/src/adapters/agentmail.d.ts +426 -0
  4. package/dist/src/adapters/agentmail.js +2 -2
  5. package/dist/src/adapters/conformance.d.ts +149 -0
  6. package/dist/src/adapters/contract.d.ts +628 -0
  7. package/dist/src/adapters/contract.js +110 -16
  8. package/dist/src/adapters/contract.js.map +1 -1
  9. package/dist/src/adapters/email.d.ts +324 -0
  10. package/dist/src/adapters/env-passphrase.d.ts +93 -0
  11. package/dist/src/adapters/public.d.ts +11 -0
  12. package/dist/src/adapters/public.js +11 -0
  13. package/dist/src/adapters/public.js.map +1 -0
  14. package/dist/src/adapters/registry.d.ts +59 -0
  15. package/dist/src/adapters/registry.js +2 -1
  16. package/dist/src/adapters/registry.js.map +1 -1
  17. package/dist/src/adapters/smtp.d.ts +213 -0
  18. package/dist/src/adapters/vault-provider.d.ts +114 -0
  19. package/dist/src/adapters/vault-provider.js +3 -3
  20. package/dist/src/adapters/zzz.d.ts +66 -0
  21. package/dist/src/adapters/zzz.js +299 -0
  22. package/dist/src/adapters/zzz.js.map +1 -0
  23. package/dist/src/channels/batch.d.ts +109 -0
  24. package/dist/src/channels/cli.d.ts +193 -0
  25. package/dist/src/channels/conformance.d.ts +92 -0
  26. package/dist/src/channels/contract.d.ts +623 -0
  27. package/dist/src/channels/payload-view.d.ts +35 -0
  28. package/dist/src/channels/render-queue.d.ts +149 -0
  29. package/dist/src/channels/tagging.d.ts +196 -0
  30. package/dist/src/channels/telegram.d.ts +1832 -0
  31. package/dist/src/channels/web.d.ts +341 -0
  32. package/dist/src/cli/adapter.d.ts +90 -0
  33. package/dist/src/cli/adapter.js +25 -15
  34. package/dist/src/cli/adapter.js.map +1 -1
  35. package/dist/src/cli/amend.d.ts +59 -0
  36. package/dist/src/cli/args.d.ts +43 -0
  37. package/dist/src/cli/attest.d.ts +41 -0
  38. package/dist/src/cli/audit-card.d.ts +62 -0
  39. package/dist/src/cli/audit.d.ts +59 -0
  40. package/dist/src/cli/channel-telegram.d.ts +806 -0
  41. package/dist/src/cli/channel-web.d.ts +131 -0
  42. package/dist/src/cli/channel.d.ts +71 -0
  43. package/dist/src/cli/checkpoint-tap.d.ts +169 -0
  44. package/dist/src/cli/codex.d.ts +2 -0
  45. package/dist/src/cli/codex.js +172 -0
  46. package/dist/src/cli/codex.js.map +1 -0
  47. package/dist/src/cli/coverage.d.ts +61 -0
  48. package/dist/src/cli/daemon.d.ts +120 -0
  49. package/dist/src/cli/doctor.d.ts +129 -0
  50. package/dist/src/cli/doctor.js +119 -5
  51. package/dist/src/cli/doctor.js.map +1 -1
  52. package/dist/src/cli/env.d.ts +65 -0
  53. package/dist/src/cli/execute.d.ts +202 -0
  54. package/dist/src/cli/exit-codes.d.ts +73 -0
  55. package/dist/src/cli/feedback.d.ts +60 -0
  56. package/dist/src/cli/gate-window.d.ts +40 -0
  57. package/dist/src/cli/gate.d.ts +68 -0
  58. package/dist/src/cli/git-scope.d.ts +190 -0
  59. package/dist/src/cli/gloss-attach.d.ts +85 -0
  60. package/dist/src/cli/gloss-codex-child.d.ts +9 -0
  61. package/dist/src/cli/gloss-codex.d.ts +24 -0
  62. package/dist/src/cli/gloss-options.d.ts +42 -0
  63. package/dist/src/cli/gloss.d.ts +265 -0
  64. package/dist/src/cli/help.d.ts +103 -0
  65. package/dist/src/cli/help.js +173 -51
  66. package/dist/src/cli/help.js.map +1 -1
  67. package/dist/src/cli/hook-codex.d.ts +78 -0
  68. package/dist/src/cli/hook-codex.js +167 -0
  69. package/dist/src/cli/hook-codex.js.map +1 -0
  70. package/dist/src/cli/hook.d.ts +331 -0
  71. package/dist/src/cli/hook.js +186 -80
  72. package/dist/src/cli/hook.js.map +1 -1
  73. package/dist/src/cli/import.d.ts +35 -0
  74. package/dist/src/cli/init.d.ts +84 -0
  75. package/dist/src/cli/init.js +2 -2
  76. package/dist/src/cli/init.js.map +1 -1
  77. package/dist/src/cli/instructions.d.ts +23 -0
  78. package/dist/src/cli/journal.d.ts +41 -0
  79. package/dist/src/cli/log-advance.d.ts +287 -0
  80. package/dist/src/cli/log-advance.js +102 -11
  81. package/dist/src/cli/log-advance.js.map +1 -1
  82. package/dist/src/cli/log-anchor.d.ts +176 -0
  83. package/dist/src/cli/log-checkpoint.d.ts +22 -0
  84. package/dist/src/cli/log-sync.d.ts +243 -0
  85. package/dist/src/cli/log-verbs.d.ts +16 -0
  86. package/dist/src/cli/log-verbs.js +7 -1
  87. package/dist/src/cli/log-verbs.js.map +1 -1
  88. package/dist/src/cli/long-help.d.ts +70 -0
  89. package/dist/src/cli/main.d.ts +77 -0
  90. package/dist/src/cli/main.js +155 -5
  91. package/dist/src/cli/main.js.map +1 -1
  92. package/dist/src/cli/mcp.d.ts +52 -0
  93. package/dist/src/cli/paths.d.ts +56 -0
  94. package/dist/src/cli/payload.d.ts +58 -0
  95. package/dist/src/cli/policy.d.ts +43 -0
  96. package/dist/src/cli/preflight.d.ts +363 -0
  97. package/dist/src/cli/preflight.js +294 -7
  98. package/dist/src/cli/preflight.js.map +1 -1
  99. package/dist/src/cli/progress.d.ts +78 -0
  100. package/dist/src/cli/prompt.d.ts +209 -0
  101. package/dist/src/cli/quickstart.d.ts +46 -0
  102. package/dist/src/cli/quickstart.js +297 -0
  103. package/dist/src/cli/quickstart.js.map +1 -0
  104. package/dist/src/cli/records.d.ts +34 -0
  105. package/dist/src/cli/render.d.ts +22 -0
  106. package/dist/src/cli/sandbox.d.ts +51 -0
  107. package/dist/src/cli/scaffold.d.ts +79 -0
  108. package/dist/src/cli/setup-adapter.d.ts +137 -0
  109. package/dist/src/cli/setup-adapter.js +38 -4
  110. package/dist/src/cli/setup-adapter.js.map +1 -1
  111. package/dist/src/cli/setup-channel.d.ts +117 -0
  112. package/dist/src/cli/setup-checkpoint.d.ts +57 -0
  113. package/dist/src/cli/setup-common.d.ts +275 -0
  114. package/dist/src/cli/setup-flow.d.ts +287 -0
  115. package/dist/src/cli/setup-service.d.ts +96 -0
  116. package/dist/src/cli/setup.d.ts +202 -0
  117. package/dist/src/cli/style.d.ts +320 -0
  118. package/dist/src/cli/token.d.ts +39 -0
  119. package/dist/src/cli/up.d.ts +155 -0
  120. package/dist/src/cli/up.js +4 -2
  121. package/dist/src/cli/up.js.map +1 -1
  122. package/dist/src/cli/usage.d.ts +37 -0
  123. package/dist/src/cli/values.d.ts +40 -0
  124. package/dist/src/cli/vault.d.ts +59 -0
  125. package/dist/src/cli/vault.js +2 -2
  126. package/dist/src/cli/vault.js.map +1 -1
  127. package/dist/src/cli/verb-registry.d.ts +76 -0
  128. package/dist/src/cli/verb-registry.js +176 -8
  129. package/dist/src/cli/verb-registry.js.map +1 -1
  130. package/dist/src/cli/wordmark.d.ts +31 -0
  131. package/dist/src/cli/wordmark.js +2 -2
  132. package/dist/src/codex/doctor.d.ts +13 -0
  133. package/dist/src/codex/doctor.js +41 -0
  134. package/dist/src/codex/doctor.js.map +1 -0
  135. package/dist/src/codex/manifest.d.ts +49 -0
  136. package/dist/src/codex/manifest.js +103 -0
  137. package/dist/src/codex/manifest.js.map +1 -0
  138. package/dist/src/codex/templates.d.ts +41 -0
  139. package/dist/src/codex/templates.js +319 -0
  140. package/dist/src/codex/templates.js.map +1 -0
  141. package/dist/src/codex/trust.d.ts +19 -0
  142. package/dist/src/codex/trust.js +183 -0
  143. package/dist/src/codex/trust.js.map +1 -0
  144. package/dist/src/codex/workspace-plan.d.ts +131 -0
  145. package/dist/src/codex/workspace-plan.js +561 -0
  146. package/dist/src/codex/workspace-plan.js.map +1 -0
  147. package/dist/src/core/actor.d.ts +2 -0
  148. package/dist/src/core/actor.js +5 -0
  149. package/dist/src/core/actor.js.map +1 -0
  150. package/dist/src/core/advance-cycle.d.ts +170 -0
  151. package/dist/src/core/agents-md.d.ts +276 -0
  152. package/dist/src/core/apply-patch.d.ts +49 -0
  153. package/dist/src/core/apply-patch.js +266 -0
  154. package/dist/src/core/apply-patch.js.map +1 -0
  155. package/dist/src/core/attest.d.ts +420 -0
  156. package/dist/src/core/attest.js +13 -1
  157. package/dist/src/core/attest.js.map +1 -1
  158. package/dist/src/core/audit.d.ts +492 -0
  159. package/dist/src/core/budgets.d.ts +238 -0
  160. package/dist/src/core/checkpoint.d.ts +500 -0
  161. package/dist/src/core/child-env.d.ts +88 -0
  162. package/dist/src/core/clock.d.ts +52 -0
  163. package/dist/src/core/command-class.d.ts +543 -0
  164. package/dist/src/core/command-class.js +43 -8
  165. package/dist/src/core/command-class.js.map +1 -1
  166. package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
  167. package/dist/src/core/coverage-sources/gh.d.ts +48 -0
  168. package/dist/src/core/coverage-sources/git.d.ts +101 -0
  169. package/dist/src/core/coverage.d.ts +217 -0
  170. package/dist/src/core/credential-spec.d.ts +72 -0
  171. package/dist/src/core/dark-session.d.ts +331 -0
  172. package/dist/src/core/decision-refusal.d.ts +185 -0
  173. package/dist/src/core/env-file.d.ts +450 -0
  174. package/dist/src/core/execute.d.ts +858 -0
  175. package/dist/src/core/execute.js +44 -6
  176. package/dist/src/core/execute.js.map +1 -1
  177. package/dist/src/core/frontmatter.d.ts +78 -0
  178. package/dist/src/core/gate-window.d.ts +312 -0
  179. package/dist/src/core/gate.d.ts +1364 -0
  180. package/dist/src/core/gate.js +68 -13
  181. package/dist/src/core/gate.js.map +1 -1
  182. package/dist/src/core/git-run.d.ts +73 -0
  183. package/dist/src/core/harness-version.d.ts +157 -0
  184. package/dist/src/core/harness-version.js +2 -1
  185. package/dist/src/core/harness-version.js.map +1 -1
  186. package/dist/src/core/harness-wait.d.ts +55 -0
  187. package/dist/src/core/head-retry.d.ts +107 -0
  188. package/dist/src/core/instance.d.ts +253 -0
  189. package/dist/src/core/intake-limits.d.ts +247 -0
  190. package/dist/src/core/jcs.d.ts +52 -0
  191. package/dist/src/core/journal.d.ts +144 -0
  192. package/dist/src/core/live-draw.d.ts +436 -0
  193. package/dist/src/core/log-reconcile.d.ts +89 -0
  194. package/dist/src/core/log-subscribe.d.ts +36 -0
  195. package/dist/src/core/log-subscribe.js +162 -0
  196. package/dist/src/core/log-subscribe.js.map +1 -0
  197. package/dist/src/core/log.d.ts +278 -0
  198. package/dist/src/core/loop.d.ts +274 -0
  199. package/dist/src/core/loop.js +11 -0
  200. package/dist/src/core/loop.js.map +1 -1
  201. package/dist/src/core/md-fence.d.ts +41 -0
  202. package/dist/src/core/money.d.ts +147 -0
  203. package/dist/src/core/payload-census.d.ts +74 -0
  204. package/dist/src/core/payload-store.d.ts +175 -0
  205. package/dist/src/core/payload.d.ts +71 -0
  206. package/dist/src/core/policy-diff.d.ts +292 -0
  207. package/dist/src/core/policy-diff.js +27 -4
  208. package/dist/src/core/policy-diff.js.map +1 -1
  209. package/dist/src/core/policy-expectations.d.ts +199 -0
  210. package/dist/src/core/policy-explain.d.ts +150 -0
  211. package/dist/src/core/policy-explain.js +31 -3
  212. package/dist/src/core/policy-explain.js.map +1 -1
  213. package/dist/src/core/policy-load.d.ts +527 -0
  214. package/dist/src/core/policy-load.js +15 -3
  215. package/dist/src/core/policy-load.js.map +1 -1
  216. package/dist/src/core/policy-match.d.ts +281 -0
  217. package/dist/src/core/policy-match.js +20 -9
  218. package/dist/src/core/policy-match.js.map +1 -1
  219. package/dist/src/core/policy-proposal.d.ts +265 -0
  220. package/dist/src/core/prompt-layout.d.ts +221 -0
  221. package/dist/src/core/protected-path-guard.d.ts +453 -0
  222. package/dist/src/core/protected-path-guard.js +514 -35
  223. package/dist/src/core/protected-path-guard.js.map +1 -1
  224. package/dist/src/core/registration.d.ts +25 -0
  225. package/dist/src/core/reindex.d.ts +99 -0
  226. package/dist/src/core/sampler.d.ts +313 -0
  227. package/dist/src/core/sandbox.d.ts +290 -0
  228. package/dist/src/core/seal.d.ts +165 -0
  229. package/dist/src/core/state.d.ts +505 -0
  230. package/dist/src/core/task-file.d.ts +185 -0
  231. package/dist/src/core/telegram-config.d.ts +93 -0
  232. package/dist/src/core/token.d.ts +409 -0
  233. package/dist/src/core/token.js +21 -38
  234. package/dist/src/core/token.js.map +1 -1
  235. package/dist/src/core/validate.d.ts +138 -0
  236. package/dist/src/core/values.d.ts +137 -0
  237. package/dist/src/core/vault.d.ts +291 -0
  238. package/dist/src/core/verified-snapshot.d.ts +204 -0
  239. package/dist/src/core/verify.d.ts +336 -0
  240. package/dist/src/core/version.d.ts +8 -0
  241. package/dist/src/core/wysiwys.d.ts +370 -0
  242. package/dist/src/daemon/advance-child.d.ts +39 -0
  243. package/dist/src/daemon/advance.d.ts +466 -0
  244. package/dist/src/daemon/audit.d.ts +87 -0
  245. package/dist/src/daemon/daemon.d.ts +1180 -0
  246. package/dist/src/daemon/dark-session.d.ts +64 -0
  247. package/dist/src/daemon/draw-child.d.ts +36 -0
  248. package/dist/src/daemon/draw.d.ts +154 -0
  249. package/dist/src/daemon/git-evidence.d.ts +173 -0
  250. package/dist/src/daemon/git-evidence.js +1 -1
  251. package/dist/src/daemon/projection.d.ts +180 -0
  252. package/dist/src/daemon/prune.d.ts +207 -0
  253. package/dist/src/mcp/http.d.ts +113 -0
  254. package/dist/src/mcp/server.d.ts +265 -0
  255. package/dist/src/mcp/server.js +9 -1
  256. package/dist/src/mcp/server.js.map +1 -1
  257. package/docs/adapter-api.md +106 -0
  258. package/docs/cli-reference.md +389 -36
  259. package/docs/codex-enforced-session.md +30 -0
  260. package/package.json +12 -2
  261. package/schema/codex-instance.schema.json +82 -0
  262. package/schema/event.schema.json +2 -1
  263. package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
  264. package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
  265. package/schema/policy.schema.json +21 -1
  266. package/templates/codex/README.md +9 -0
@@ -0,0 +1,41 @@
1
+ import { resolve } from "node:path";
2
+ import { checkCodexInstance, readCodexInstance } from "./manifest.js";
3
+ import { diagnoseCodexInstance } from "./trust.js";
4
+ export function strictDoctor(path, options = {}) {
5
+ const actualPath = resolve(path);
6
+ const read = readCodexInstance(actualPath);
7
+ if (!read.ok) {
8
+ return {
9
+ ok: false,
10
+ ready: false,
11
+ code: "manifest-invalid",
12
+ message: read.errors.map((error) => `${error.path || "/"}: ${error.message}`).join("; "),
13
+ };
14
+ }
15
+ if (read.manifest.paths.manifest !== actualPath) {
16
+ return {
17
+ ok: false,
18
+ ready: false,
19
+ code: "manifest-path-drift",
20
+ message: `manifest was read from ${actualPath}, but pins ${read.manifest.paths.manifest}`,
21
+ };
22
+ }
23
+ const checked = checkCodexInstance(read.manifest);
24
+ if (!checked.ok) {
25
+ return {
26
+ ok: false,
27
+ ready: false,
28
+ code: "manifest-invalid",
29
+ message: checked.errors.map((error) => `${error.path || "/"}: ${error.message}`).join("; "),
30
+ };
31
+ }
32
+ const report = diagnoseCodexInstance(checked.manifest, options);
33
+ return {
34
+ ok: false,
35
+ ready: false,
36
+ code: "codex-not-ready",
37
+ message: "strict Codex enforcement is not ready; inspect findings",
38
+ report,
39
+ };
40
+ }
41
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/codex/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAwC,MAAM,YAAY,CAAC;AAMzF,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAO,GAAiB,EAAE;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACzF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAChD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,0BAA0B,UAAU,cAAc,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;SAC1F,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5F,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,yDAAyD;QAClE,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { type ValidationError } from "../core/validate.js";
2
+ export declare const CODEX_INSTANCE_SCHEMA_VERSION: "approval.codex.instance.v1";
3
+ export declare const SUPPORTED_CODEX_VERSION: "0.152.1";
4
+ export declare const SUPPORTED_CODEX_PLATFORM: "darwin";
5
+ export interface CodexInstancePaths {
6
+ install_root: string;
7
+ package_root: string;
8
+ workspace: string;
9
+ primary: string;
10
+ policy: string;
11
+ log: string;
12
+ manifest: string;
13
+ codex_executable: string;
14
+ node_executable: string;
15
+ mcp_executable: string;
16
+ broker_executable: string;
17
+ runner_executable: string;
18
+ }
19
+ export interface CodexInstanceManifest {
20
+ schema_version: typeof CODEX_INSTANCE_SCHEMA_VERSION;
21
+ instance_id: string;
22
+ platform: typeof SUPPORTED_CODEX_PLATFORM;
23
+ codex_version: typeof SUPPORTED_CODEX_VERSION;
24
+ node_version: string;
25
+ package_version: string;
26
+ paths: CodexInstancePaths;
27
+ principals: {
28
+ codex: "_approval_codex";
29
+ broker: "_approval_broker";
30
+ runner: "_approval_runner";
31
+ };
32
+ invocation: {
33
+ command: string;
34
+ args: [string, string, string, string];
35
+ };
36
+ components: {
37
+ broker: "required-not-shipped";
38
+ runner: "required-not-shipped";
39
+ };
40
+ }
41
+ export type ManifestCheck = {
42
+ ok: true;
43
+ manifest: CodexInstanceManifest;
44
+ } | {
45
+ ok: false;
46
+ errors: ValidationError[];
47
+ };
48
+ export declare function checkCodexInstance(value: unknown): ManifestCheck;
49
+ export declare function readCodexInstance(path: string): ManifestCheck;
@@ -0,0 +1,103 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { isAbsolute, relative, resolve, sep } from "node:path";
3
+ import { validate } from "../core/validate.js";
4
+ export const CODEX_INSTANCE_SCHEMA_VERSION = "approval.codex.instance.v1";
5
+ export const SUPPORTED_CODEX_VERSION = "0.152.1";
6
+ export const SUPPORTED_CODEX_PLATFORM = "darwin";
7
+ function within(parent, child) {
8
+ const rel = relative(parent, child);
9
+ return rel === "" || (rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
10
+ }
11
+ function normalizedAbsolute(value) {
12
+ return isAbsolute(value) && resolve(value) === value && !value.includes("\u0000");
13
+ }
14
+ function semanticErrors(manifest) {
15
+ const errors = [];
16
+ const add = (path, message) => {
17
+ errors.push({ path, keyword: "codexInstance", message });
18
+ };
19
+ for (const [name, value] of Object.entries(manifest.paths)) {
20
+ if (!normalizedAbsolute(value))
21
+ add(`/paths/${name}`, "must be a normalized absolute path");
22
+ }
23
+ const { paths } = manifest;
24
+ const roots = [
25
+ ["workspace", paths.workspace],
26
+ ["primary", paths.primary],
27
+ ["install_root", paths.install_root],
28
+ ];
29
+ for (let left = 0; left < roots.length; left += 1) {
30
+ for (let right = left + 1; right < roots.length; right += 1) {
31
+ const a = roots[left];
32
+ const b = roots[right];
33
+ if (within(a[1], b[1]) || within(b[1], a[1])) {
34
+ add("/paths", `${a[0]} and ${b[0]} must be disjoint and may not contain one another`);
35
+ }
36
+ }
37
+ }
38
+ if (!within(paths.primary, paths.policy) || paths.policy === paths.primary) {
39
+ add("/paths/policy", "must be a file below primary");
40
+ }
41
+ if (!within(paths.primary, paths.log) || paths.log === paths.primary) {
42
+ add("/paths/log", "must be a file below primary");
43
+ }
44
+ for (const name of [
45
+ "package_root",
46
+ "manifest",
47
+ "codex_executable",
48
+ "node_executable",
49
+ "mcp_executable",
50
+ "broker_executable",
51
+ "runner_executable",
52
+ ]) {
53
+ const value = paths[name];
54
+ if (!within(paths.install_root, value) || value === paths.install_root) {
55
+ add(`/paths/${name}`, "must be below install_root");
56
+ }
57
+ }
58
+ const nodeMajor = Number.parseInt(manifest.node_version.split(".")[0] ?? "", 10);
59
+ if (!Number.isSafeInteger(nodeMajor) || nodeMajor < 20)
60
+ add("/node_version", "Node 20 or newer is required");
61
+ const executablePaths = new Set([
62
+ paths.codex_executable,
63
+ paths.node_executable,
64
+ paths.mcp_executable,
65
+ paths.broker_executable,
66
+ paths.runner_executable,
67
+ ]);
68
+ if (executablePaths.size !== 5)
69
+ add("/paths", "Codex, Node, MCP, broker and runner executables must be distinct");
70
+ const expectedArgs = ["codex", "serve", "--manifest", paths.manifest];
71
+ if (manifest.invocation.command !== paths.mcp_executable ||
72
+ manifest.invocation.args.length !== expectedArgs.length ||
73
+ manifest.invocation.args.some((value, index) => value !== expectedArgs[index])) {
74
+ add("/invocation", "must exactly invoke the pinned MCP executable as codex serve --manifest <manifest>");
75
+ }
76
+ return errors;
77
+ }
78
+ export function checkCodexInstance(value) {
79
+ const checked = validate("codex-instance", value);
80
+ if (!checked.ok)
81
+ return checked;
82
+ const manifest = value;
83
+ const errors = semanticErrors(manifest);
84
+ return errors.length === 0 ? { ok: true, manifest } : { ok: false, errors };
85
+ }
86
+ export function readCodexInstance(path) {
87
+ let value;
88
+ try {
89
+ value = JSON.parse(readFileSync(path, "utf8"));
90
+ }
91
+ catch (cause) {
92
+ return {
93
+ ok: false,
94
+ errors: [{
95
+ path: "",
96
+ keyword: "manifestRead",
97
+ message: cause instanceof Error ? cause.message : String(cause),
98
+ }],
99
+ };
100
+ }
101
+ return checkCodexInstance(value);
102
+ }
103
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/codex/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type CodexInstanceManifest } from "./manifest.js";
2
+ export declare const CODEX_BUNDLE_VERSION = 1;
3
+ export declare const CODEX_BUNDLE_FILES: readonly ["codex-instance.json", "requirements.toml", "managed_config.toml", "approval-codex-mcp", "approval-codex-start", "com.approval.codex-broker.plist", "com.approval.codex-runner.plist", "INSTALL.md"];
4
+ export interface PrepareInput {
5
+ instanceId: string;
6
+ workspace: string;
7
+ primary: string;
8
+ installRoot: string;
9
+ output: string;
10
+ codexExecutable: string;
11
+ nodeExecutable: string;
12
+ }
13
+ export type PrepareResult = {
14
+ ok: true;
15
+ output: string;
16
+ manifest: CodexInstanceManifest;
17
+ files: string[];
18
+ } | {
19
+ ok: false;
20
+ code: string;
21
+ message: string;
22
+ };
23
+ export interface BundleIndex {
24
+ version: 1;
25
+ files: Record<string, string>;
26
+ }
27
+ export declare function manifestFor(input: PrepareInput): CodexInstanceManifest;
28
+ export declare function requirementsToml(manifest: CodexInstanceManifest): string;
29
+ export declare function managedConfigToml(manifest: CodexInstanceManifest): string;
30
+ export declare function renderBundle(manifest: CodexInstanceManifest): Record<string, string>;
31
+ export declare function prepareBundle(input: PrepareInput): PrepareResult;
32
+ export type BundleCheck = {
33
+ ok: true;
34
+ manifest: CodexInstanceManifest;
35
+ files: string[];
36
+ } | {
37
+ ok: false;
38
+ code: string;
39
+ message: string;
40
+ };
41
+ export declare function checkBundle(directory: string): BundleCheck;
@@ -0,0 +1,319 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdirSync, lstatSync, readFileSync, realpathSync, readdirSync, writeFileSync, } from "node:fs";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { CODEX_INSTANCE_SCHEMA_VERSION, SUPPORTED_CODEX_PLATFORM, SUPPORTED_CODEX_VERSION, checkCodexInstance, } from "./manifest.js";
6
+ export const CODEX_BUNDLE_VERSION = 1;
7
+ export const CODEX_BUNDLE_FILES = [
8
+ "codex-instance.json",
9
+ "requirements.toml",
10
+ "managed_config.toml",
11
+ "approval-codex-mcp",
12
+ "approval-codex-start",
13
+ "com.approval.codex-broker.plist",
14
+ "com.approval.codex-runner.plist",
15
+ "INSTALL.md",
16
+ ];
17
+ function quote(value) {
18
+ return JSON.stringify(value);
19
+ }
20
+ function xml(value) {
21
+ return value
22
+ .replaceAll("&", "&amp;")
23
+ .replaceAll("<", "&lt;")
24
+ .replaceAll(">", "&gt;")
25
+ .replaceAll('"', "&quot;");
26
+ }
27
+ function sha256(bytes) {
28
+ return createHash("sha256").update(bytes).digest("hex");
29
+ }
30
+ function packageVersion() {
31
+ const packageRoot = fileURLToPath(new URL("../../../", import.meta.url));
32
+ const value = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
33
+ if (typeof value.version !== "string")
34
+ throw new Error("installed package.json has no version");
35
+ return value.version;
36
+ }
37
+ export function manifestFor(input) {
38
+ const installRoot = resolve(input.installRoot);
39
+ const manifestPath = join(installRoot, "instances", `${input.instanceId}.json`);
40
+ const mcpExecutable = join(installRoot, "bin", "approval-codex-mcp");
41
+ return {
42
+ schema_version: CODEX_INSTANCE_SCHEMA_VERSION,
43
+ instance_id: input.instanceId,
44
+ platform: SUPPORTED_CODEX_PLATFORM,
45
+ codex_version: SUPPORTED_CODEX_VERSION,
46
+ node_version: process.versions.node,
47
+ package_version: packageVersion(),
48
+ paths: {
49
+ install_root: installRoot,
50
+ package_root: join(installRoot, "package"),
51
+ workspace: resolve(input.workspace),
52
+ primary: resolve(input.primary),
53
+ policy: join(resolve(input.primary), "APPROVAL.md"),
54
+ log: join(resolve(input.primary), ".approval", "log", "events.jsonl"),
55
+ manifest: manifestPath,
56
+ codex_executable: resolve(input.codexExecutable),
57
+ node_executable: resolve(input.nodeExecutable),
58
+ mcp_executable: mcpExecutable,
59
+ broker_executable: join(installRoot, "bin", "approval-codex-broker"),
60
+ runner_executable: join(installRoot, "bin", "approval-codex-runner"),
61
+ },
62
+ principals: {
63
+ codex: "_approval_codex",
64
+ broker: "_approval_broker",
65
+ runner: "_approval_runner",
66
+ },
67
+ invocation: {
68
+ command: mcpExecutable,
69
+ args: ["codex", "serve", "--manifest", manifestPath],
70
+ },
71
+ components: {
72
+ broker: "required-not-shipped",
73
+ runner: "required-not-shipped",
74
+ },
75
+ };
76
+ }
77
+ export function requirementsToml(manifest) {
78
+ const rules = manifest.invocation.args
79
+ .map((value) => ` { match = "exact", value = ${quote(value)} },`)
80
+ .join("\n");
81
+ return `# INERT REVIEW ARTIFACT. Installing this file is a human/MDM action.
82
+ allowed_approval_policies = ["never"]
83
+ allowed_web_search_modes = ["disabled"]
84
+ default_permissions = "approval-codex-readonly"
85
+ allow_managed_hooks_only = true
86
+ allow_remote_control = false
87
+
88
+ [allowed_permission_profiles]
89
+ approval-codex-readonly = true
90
+
91
+ [permissions.approval-codex-readonly.filesystem]
92
+ ":root" = "deny"
93
+ ":minimal" = "read"
94
+
95
+ [permissions.approval-codex-readonly.filesystem.":workspace_roots"]
96
+ "." = "read"
97
+
98
+ [permissions.approval-codex-readonly.network]
99
+ enabled = false
100
+
101
+ [features]
102
+ apps = false
103
+ browser_use = false
104
+ browser_use_external = false
105
+ browser_use_full_cdp_access = false
106
+ computer_use = false
107
+ in_app_browser = false
108
+ plugins = false
109
+ web_search = false
110
+
111
+ [mcp_servers.approval-codex.identity]
112
+ command = { executable = ${quote(manifest.invocation.command)}, args = [
113
+ ${rules}
114
+ ] }
115
+ `;
116
+ }
117
+ export function managedConfigToml(manifest) {
118
+ const args = manifest.invocation.args.map(quote).join(", ");
119
+ return `# INERT REVIEW ARTIFACT. This enables only the pinned strict MCP shim.
120
+ [mcp_servers.approval-codex]
121
+ command = ${quote(manifest.invocation.command)}
122
+ args = [${args}]
123
+ required = true
124
+ `;
125
+ }
126
+ function shellQuote(value) {
127
+ return `'${value.replaceAll("'", "'\"'\"'")}'`;
128
+ }
129
+ function launcher(manifest, mode) {
130
+ const cli = join(manifest.paths.package_root, "cli.js");
131
+ const prefix = `exec /usr/bin/env -i PATH=/usr/bin:/bin HOME=/var/empty TMPDIR=/tmp ${shellQuote(manifest.paths.node_executable)} ${shellQuote(cli)}`;
132
+ const command = mode === "serve"
133
+ ? `if [ "$#" -ne 4 ] || [ "$1" != 'codex' ] || [ "$2" != 'serve' ] || [ "$3" != '--manifest' ] || [ "$4" != ${shellQuote(manifest.paths.manifest)} ]; then exit 2; fi
134
+ ${prefix} codex serve --manifest ${shellQuote(manifest.paths.manifest)}`
135
+ : `if [ "$#" -ne 0 ]; then exit 2; fi\n${prefix} codex start --manifest ${shellQuote(manifest.paths.manifest)}`;
136
+ return `#!/bin/sh
137
+ # INERT until installed root-owned with the complete APRV-325 broker/runner.
138
+ cd ${shellQuote(manifest.paths.package_root)} || exit 1
139
+ ${command}
140
+ `;
141
+ }
142
+ function plist(manifest, component) {
143
+ const executable = component === "broker" ? manifest.paths.broker_executable : manifest.paths.runner_executable;
144
+ const principal = component === "broker" ? manifest.principals.broker : manifest.principals.runner;
145
+ return `<?xml version="1.0" encoding="UTF-8"?>
146
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
147
+ <plist version="1.0"><dict>
148
+ <key>Label</key><string>com.approval.codex-${component}</string>
149
+ <key>ProgramArguments</key><array>
150
+ <string>${xml(executable)}</string>
151
+ <string>--manifest</string>
152
+ <string>${xml(manifest.paths.manifest)}</string>
153
+ </array>
154
+ <key>UserName</key><string>${principal}</string>
155
+ <key>RunAtLoad</key><false/>
156
+ </dict></plist>
157
+ `;
158
+ }
159
+ function installGuide(manifest) {
160
+ return `# Constrained Codex instance ${manifest.instance_id}
161
+
162
+ This bundle is inert. It does not create users, install files, load launchd
163
+ services, edit /etc/codex, authenticate Codex, start an executor, or change
164
+ approval.md policy.
165
+
166
+ The broker and runner are deliberately marked required-not-shipped. Do not
167
+ install or start this bundle until APRV-325.2 and APRV-325.3 replace those
168
+ placeholders and strict doctor reports ready.
169
+
170
+ Target install root: ${manifest.paths.install_root}
171
+ Canonical workspace: ${manifest.paths.workspace}
172
+ Primary gate checkout: ${manifest.paths.primary}
173
+
174
+ Review bundle-sha256.json, then run:
175
+ approval codex setup --check <this-directory>
176
+ approval codex doctor --manifest ${manifest.paths.manifest}
177
+
178
+ A passing setup check proves only that this review bundle is internally
179
+ consistent. It does not prove host custody or enforcement.
180
+ `;
181
+ }
182
+ export function renderBundle(manifest) {
183
+ return {
184
+ "codex-instance.json": `${JSON.stringify(manifest, null, 2)}\n`,
185
+ "requirements.toml": requirementsToml(manifest),
186
+ "managed_config.toml": managedConfigToml(manifest),
187
+ "approval-codex-mcp": launcher(manifest, "serve"),
188
+ "approval-codex-start": launcher(manifest, "start"),
189
+ "com.approval.codex-broker.plist": plist(manifest, "broker"),
190
+ "com.approval.codex-runner.plist": plist(manifest, "runner"),
191
+ "INSTALL.md": installGuide(manifest),
192
+ };
193
+ }
194
+ export function prepareBundle(input) {
195
+ let manifest;
196
+ try {
197
+ manifest = manifestFor(input);
198
+ }
199
+ catch (cause) {
200
+ return { ok: false, code: "package-unreadable", message: cause instanceof Error ? cause.message : String(cause) };
201
+ }
202
+ const checked = checkCodexInstance(manifest);
203
+ if (!checked.ok) {
204
+ return {
205
+ ok: false,
206
+ code: "manifest-invalid",
207
+ message: checked.errors.map((error) => `${error.path || "/"}: ${error.message}`).join("; "),
208
+ };
209
+ }
210
+ let output;
211
+ try {
212
+ const requestedOutput = resolve(input.output);
213
+ output = join(realpathSync(dirname(requestedOutput)), basename(requestedOutput));
214
+ }
215
+ catch (cause) {
216
+ return { ok: false, code: "prepare-failed", message: cause instanceof Error ? cause.message : String(cause) };
217
+ }
218
+ const roots = [manifest.paths.workspace, manifest.paths.primary, manifest.paths.install_root];
219
+ if (roots.some((root) => output === root || output.startsWith(`${root}/`) || root.startsWith(`${output}/`))) {
220
+ return { ok: false, code: "output-overlap", message: "preparation output must be disjoint from workspace, primary and install roots" };
221
+ }
222
+ try {
223
+ mkdirSync(output);
224
+ const rendered = renderBundle(manifest);
225
+ for (const [name, content] of Object.entries(rendered)) {
226
+ writeFileSync(join(output, name), content, {
227
+ encoding: "utf8",
228
+ mode: name.startsWith("approval-codex-") ? 0o755 : 0o644,
229
+ flag: "wx",
230
+ });
231
+ }
232
+ const index = { version: CODEX_BUNDLE_VERSION, files: {} };
233
+ for (const name of CODEX_BUNDLE_FILES) {
234
+ index.files[name] = sha256(readFileSync(join(output, name)));
235
+ }
236
+ writeFileSync(join(output, "bundle-sha256.json"), `${JSON.stringify(index, null, 2)}\n`, {
237
+ encoding: "utf8",
238
+ mode: 0o644,
239
+ flag: "wx",
240
+ });
241
+ return { ok: true, output, manifest, files: [...CODEX_BUNDLE_FILES, "bundle-sha256.json"] };
242
+ }
243
+ catch (cause) {
244
+ return { ok: false, code: "prepare-failed", message: cause instanceof Error ? cause.message : String(cause) };
245
+ }
246
+ }
247
+ export function checkBundle(directory) {
248
+ const root = resolve(directory);
249
+ try {
250
+ if (!lstatSync(root).isDirectory() || realpathSync(root) !== root) {
251
+ return { ok: false, code: "bundle-root-unsafe", message: "bundle root must be a canonical directory, not a symlink" };
252
+ }
253
+ if (!lstatSync(join(root, "bundle-sha256.json")).isFile()) {
254
+ return { ok: false, code: "bundle-index-unreadable", message: "bundle-sha256.json must be a regular file" };
255
+ }
256
+ }
257
+ catch (cause) {
258
+ return { ok: false, code: "bundle-index-unreadable", message: cause instanceof Error ? cause.message : String(cause) };
259
+ }
260
+ let index;
261
+ try {
262
+ index = JSON.parse(readFileSync(join(root, "bundle-sha256.json"), "utf8"));
263
+ }
264
+ catch (cause) {
265
+ return { ok: false, code: "bundle-index-unreadable", message: cause instanceof Error ? cause.message : String(cause) };
266
+ }
267
+ if (index.version !== CODEX_BUNDLE_VERSION ||
268
+ typeof index.files !== "object" ||
269
+ index.files === null ||
270
+ Array.isArray(index.files)) {
271
+ return { ok: false, code: "bundle-index-invalid", message: "bundle-sha256.json has an unsupported shape or version" };
272
+ }
273
+ const expected = [...CODEX_BUNDLE_FILES].sort();
274
+ const actual = Object.keys(index.files).sort();
275
+ if (JSON.stringify(actual) !== JSON.stringify(expected)) {
276
+ return { ok: false, code: "bundle-file-set", message: "bundle index must name the exact required file set" };
277
+ }
278
+ try {
279
+ const disk = readdirSync(root).sort();
280
+ const allowed = [...expected, "bundle-sha256.json"].sort();
281
+ if (JSON.stringify(disk) !== JSON.stringify(allowed)) {
282
+ return { ok: false, code: "bundle-file-set", message: "bundle directory must contain only the indexed files and bundle-sha256.json" };
283
+ }
284
+ for (const name of expected) {
285
+ if (!lstatSync(join(root, name)).isFile()) {
286
+ return { ok: false, code: "bundle-file-type", message: `${name} must be a regular file, not a symlink or directory` };
287
+ }
288
+ if (index.files[name] !== sha256(readFileSync(join(root, name)))) {
289
+ return { ok: false, code: "bundle-hash-mismatch", message: `${name} does not match bundle-sha256.json` };
290
+ }
291
+ }
292
+ }
293
+ catch (cause) {
294
+ return { ok: false, code: "bundle-unreadable", message: cause instanceof Error ? cause.message : String(cause) };
295
+ }
296
+ let manifestValue;
297
+ try {
298
+ manifestValue = JSON.parse(readFileSync(join(root, "codex-instance.json"), "utf8"));
299
+ }
300
+ catch (cause) {
301
+ return {
302
+ ok: false,
303
+ code: "manifest-invalid",
304
+ message: cause instanceof Error ? cause.message : String(cause),
305
+ };
306
+ }
307
+ const checked = checkCodexInstance(manifestValue);
308
+ if (!checked.ok) {
309
+ return { ok: false, code: "manifest-invalid", message: checked.errors.map((error) => error.message).join("; ") };
310
+ }
311
+ const expectedRendered = renderBundle(checked.manifest);
312
+ for (const [name, content] of Object.entries(expectedRendered)) {
313
+ if (readFileSync(join(root, name), "utf8") !== content) {
314
+ return { ok: false, code: "bundle-template-drift", message: `${name} does not match the manifest-derived template` };
315
+ }
316
+ }
317
+ return { ok: true, manifest: checked.manifest, files: [...expected, "bundle-sha256.json"] };
318
+ }
319
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/codex/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { CodexInstanceManifest } from "./manifest.js";
2
+ export interface DoctorFinding {
3
+ code: string;
4
+ path?: string;
5
+ message: string;
6
+ }
7
+ export interface DoctorReport {
8
+ ok: false;
9
+ ready: false;
10
+ findings: DoctorFinding[];
11
+ }
12
+ export interface TrustOptions {
13
+ platform?: NodeJS.Platform;
14
+ resolveUid?: (name: string) => number | null;
15
+ groupsFor?: (name: string) => number[] | null;
16
+ }
17
+ export declare function parseCodexVersionOutput(stdout: string, stderr: string): string | null;
18
+ export declare function parseNodeVersionOutput(stdout: string, stderr: string): string | null;
19
+ export declare function diagnoseCodexInstance(manifest: CodexInstanceManifest, options?: TrustOptions): DoctorReport;