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.
- package/README.md +584 -553
- package/SPEC.md +42 -13
- package/dist/src/adapters/agentmail.d.ts +426 -0
- package/dist/src/adapters/agentmail.js +2 -2
- package/dist/src/adapters/conformance.d.ts +149 -0
- package/dist/src/adapters/contract.d.ts +628 -0
- package/dist/src/adapters/contract.js +110 -16
- package/dist/src/adapters/contract.js.map +1 -1
- package/dist/src/adapters/email.d.ts +324 -0
- package/dist/src/adapters/env-passphrase.d.ts +93 -0
- package/dist/src/adapters/public.d.ts +11 -0
- package/dist/src/adapters/public.js +11 -0
- package/dist/src/adapters/public.js.map +1 -0
- package/dist/src/adapters/registry.d.ts +59 -0
- package/dist/src/adapters/registry.js +2 -1
- package/dist/src/adapters/registry.js.map +1 -1
- package/dist/src/adapters/smtp.d.ts +213 -0
- package/dist/src/adapters/vault-provider.d.ts +114 -0
- package/dist/src/adapters/vault-provider.js +3 -3
- package/dist/src/adapters/zzz.d.ts +66 -0
- package/dist/src/adapters/zzz.js +299 -0
- package/dist/src/adapters/zzz.js.map +1 -0
- package/dist/src/channels/batch.d.ts +109 -0
- package/dist/src/channels/cli.d.ts +193 -0
- package/dist/src/channels/conformance.d.ts +92 -0
- package/dist/src/channels/contract.d.ts +623 -0
- package/dist/src/channels/payload-view.d.ts +35 -0
- package/dist/src/channels/render-queue.d.ts +149 -0
- package/dist/src/channels/tagging.d.ts +196 -0
- package/dist/src/channels/telegram.d.ts +1832 -0
- package/dist/src/channels/web.d.ts +341 -0
- package/dist/src/cli/adapter.d.ts +90 -0
- package/dist/src/cli/adapter.js +25 -15
- package/dist/src/cli/adapter.js.map +1 -1
- package/dist/src/cli/amend.d.ts +59 -0
- package/dist/src/cli/args.d.ts +43 -0
- package/dist/src/cli/attest.d.ts +41 -0
- package/dist/src/cli/audit-card.d.ts +62 -0
- package/dist/src/cli/audit.d.ts +59 -0
- package/dist/src/cli/channel-telegram.d.ts +806 -0
- package/dist/src/cli/channel-web.d.ts +131 -0
- package/dist/src/cli/channel.d.ts +71 -0
- package/dist/src/cli/checkpoint-tap.d.ts +169 -0
- package/dist/src/cli/codex.d.ts +2 -0
- package/dist/src/cli/codex.js +172 -0
- package/dist/src/cli/codex.js.map +1 -0
- package/dist/src/cli/coverage.d.ts +61 -0
- package/dist/src/cli/daemon.d.ts +120 -0
- package/dist/src/cli/doctor.d.ts +129 -0
- package/dist/src/cli/doctor.js +119 -5
- package/dist/src/cli/doctor.js.map +1 -1
- package/dist/src/cli/env.d.ts +65 -0
- package/dist/src/cli/execute.d.ts +202 -0
- package/dist/src/cli/exit-codes.d.ts +73 -0
- package/dist/src/cli/feedback.d.ts +60 -0
- package/dist/src/cli/gate-window.d.ts +40 -0
- package/dist/src/cli/gate.d.ts +68 -0
- package/dist/src/cli/git-scope.d.ts +190 -0
- package/dist/src/cli/gloss-attach.d.ts +85 -0
- package/dist/src/cli/gloss-codex-child.d.ts +9 -0
- package/dist/src/cli/gloss-codex.d.ts +24 -0
- package/dist/src/cli/gloss-options.d.ts +42 -0
- package/dist/src/cli/gloss.d.ts +265 -0
- package/dist/src/cli/help.d.ts +103 -0
- package/dist/src/cli/help.js +173 -51
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/hook-codex.d.ts +78 -0
- package/dist/src/cli/hook-codex.js +167 -0
- package/dist/src/cli/hook-codex.js.map +1 -0
- package/dist/src/cli/hook.d.ts +331 -0
- package/dist/src/cli/hook.js +186 -80
- package/dist/src/cli/hook.js.map +1 -1
- package/dist/src/cli/import.d.ts +35 -0
- package/dist/src/cli/init.d.ts +84 -0
- package/dist/src/cli/init.js +2 -2
- package/dist/src/cli/init.js.map +1 -1
- package/dist/src/cli/instructions.d.ts +23 -0
- package/dist/src/cli/journal.d.ts +41 -0
- package/dist/src/cli/log-advance.d.ts +287 -0
- package/dist/src/cli/log-advance.js +102 -11
- package/dist/src/cli/log-advance.js.map +1 -1
- package/dist/src/cli/log-anchor.d.ts +176 -0
- package/dist/src/cli/log-checkpoint.d.ts +22 -0
- package/dist/src/cli/log-sync.d.ts +243 -0
- package/dist/src/cli/log-verbs.d.ts +16 -0
- package/dist/src/cli/log-verbs.js +7 -1
- package/dist/src/cli/log-verbs.js.map +1 -1
- package/dist/src/cli/long-help.d.ts +70 -0
- package/dist/src/cli/main.d.ts +77 -0
- package/dist/src/cli/main.js +155 -5
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/cli/mcp.d.ts +52 -0
- package/dist/src/cli/paths.d.ts +56 -0
- package/dist/src/cli/payload.d.ts +58 -0
- package/dist/src/cli/policy.d.ts +43 -0
- package/dist/src/cli/preflight.d.ts +363 -0
- package/dist/src/cli/preflight.js +294 -7
- package/dist/src/cli/preflight.js.map +1 -1
- package/dist/src/cli/progress.d.ts +78 -0
- package/dist/src/cli/prompt.d.ts +209 -0
- package/dist/src/cli/quickstart.d.ts +46 -0
- package/dist/src/cli/quickstart.js +297 -0
- package/dist/src/cli/quickstart.js.map +1 -0
- package/dist/src/cli/records.d.ts +34 -0
- package/dist/src/cli/render.d.ts +22 -0
- package/dist/src/cli/sandbox.d.ts +51 -0
- package/dist/src/cli/scaffold.d.ts +79 -0
- package/dist/src/cli/setup-adapter.d.ts +137 -0
- package/dist/src/cli/setup-adapter.js +38 -4
- package/dist/src/cli/setup-adapter.js.map +1 -1
- package/dist/src/cli/setup-channel.d.ts +117 -0
- package/dist/src/cli/setup-checkpoint.d.ts +57 -0
- package/dist/src/cli/setup-common.d.ts +275 -0
- package/dist/src/cli/setup-flow.d.ts +287 -0
- package/dist/src/cli/setup-service.d.ts +96 -0
- package/dist/src/cli/setup.d.ts +202 -0
- package/dist/src/cli/style.d.ts +320 -0
- package/dist/src/cli/token.d.ts +39 -0
- package/dist/src/cli/up.d.ts +155 -0
- package/dist/src/cli/up.js +4 -2
- package/dist/src/cli/up.js.map +1 -1
- package/dist/src/cli/usage.d.ts +37 -0
- package/dist/src/cli/values.d.ts +40 -0
- package/dist/src/cli/vault.d.ts +59 -0
- package/dist/src/cli/vault.js +2 -2
- package/dist/src/cli/vault.js.map +1 -1
- package/dist/src/cli/verb-registry.d.ts +76 -0
- package/dist/src/cli/verb-registry.js +176 -8
- package/dist/src/cli/verb-registry.js.map +1 -1
- package/dist/src/cli/wordmark.d.ts +31 -0
- package/dist/src/cli/wordmark.js +2 -2
- package/dist/src/codex/doctor.d.ts +13 -0
- package/dist/src/codex/doctor.js +41 -0
- package/dist/src/codex/doctor.js.map +1 -0
- package/dist/src/codex/manifest.d.ts +49 -0
- package/dist/src/codex/manifest.js +103 -0
- package/dist/src/codex/manifest.js.map +1 -0
- package/dist/src/codex/templates.d.ts +41 -0
- package/dist/src/codex/templates.js +319 -0
- package/dist/src/codex/templates.js.map +1 -0
- package/dist/src/codex/trust.d.ts +19 -0
- package/dist/src/codex/trust.js +183 -0
- package/dist/src/codex/trust.js.map +1 -0
- package/dist/src/codex/workspace-plan.d.ts +131 -0
- package/dist/src/codex/workspace-plan.js +561 -0
- package/dist/src/codex/workspace-plan.js.map +1 -0
- package/dist/src/core/actor.d.ts +2 -0
- package/dist/src/core/actor.js +5 -0
- package/dist/src/core/actor.js.map +1 -0
- package/dist/src/core/advance-cycle.d.ts +170 -0
- package/dist/src/core/agents-md.d.ts +276 -0
- package/dist/src/core/apply-patch.d.ts +49 -0
- package/dist/src/core/apply-patch.js +266 -0
- package/dist/src/core/apply-patch.js.map +1 -0
- package/dist/src/core/attest.d.ts +420 -0
- package/dist/src/core/attest.js +13 -1
- package/dist/src/core/attest.js.map +1 -1
- package/dist/src/core/audit.d.ts +492 -0
- package/dist/src/core/budgets.d.ts +238 -0
- package/dist/src/core/checkpoint.d.ts +500 -0
- package/dist/src/core/child-env.d.ts +88 -0
- package/dist/src/core/clock.d.ts +52 -0
- package/dist/src/core/command-class.d.ts +543 -0
- package/dist/src/core/command-class.js +43 -8
- package/dist/src/core/command-class.js.map +1 -1
- package/dist/src/core/coverage-sources/adapter.d.ts +40 -0
- package/dist/src/core/coverage-sources/gh.d.ts +48 -0
- package/dist/src/core/coverage-sources/git.d.ts +101 -0
- package/dist/src/core/coverage.d.ts +217 -0
- package/dist/src/core/credential-spec.d.ts +72 -0
- package/dist/src/core/dark-session.d.ts +331 -0
- package/dist/src/core/decision-refusal.d.ts +185 -0
- package/dist/src/core/env-file.d.ts +450 -0
- package/dist/src/core/execute.d.ts +858 -0
- package/dist/src/core/execute.js +44 -6
- package/dist/src/core/execute.js.map +1 -1
- package/dist/src/core/frontmatter.d.ts +78 -0
- package/dist/src/core/gate-window.d.ts +312 -0
- package/dist/src/core/gate.d.ts +1364 -0
- package/dist/src/core/gate.js +68 -13
- package/dist/src/core/gate.js.map +1 -1
- package/dist/src/core/git-run.d.ts +73 -0
- package/dist/src/core/harness-version.d.ts +157 -0
- package/dist/src/core/harness-version.js +2 -1
- package/dist/src/core/harness-version.js.map +1 -1
- package/dist/src/core/harness-wait.d.ts +55 -0
- package/dist/src/core/head-retry.d.ts +107 -0
- package/dist/src/core/instance.d.ts +253 -0
- package/dist/src/core/intake-limits.d.ts +247 -0
- package/dist/src/core/jcs.d.ts +52 -0
- package/dist/src/core/journal.d.ts +144 -0
- package/dist/src/core/live-draw.d.ts +436 -0
- package/dist/src/core/log-reconcile.d.ts +89 -0
- package/dist/src/core/log-subscribe.d.ts +36 -0
- package/dist/src/core/log-subscribe.js +162 -0
- package/dist/src/core/log-subscribe.js.map +1 -0
- package/dist/src/core/log.d.ts +278 -0
- package/dist/src/core/loop.d.ts +274 -0
- package/dist/src/core/loop.js +11 -0
- package/dist/src/core/loop.js.map +1 -1
- package/dist/src/core/md-fence.d.ts +41 -0
- package/dist/src/core/money.d.ts +147 -0
- package/dist/src/core/payload-census.d.ts +74 -0
- package/dist/src/core/payload-store.d.ts +175 -0
- package/dist/src/core/payload.d.ts +71 -0
- package/dist/src/core/policy-diff.d.ts +292 -0
- package/dist/src/core/policy-diff.js +27 -4
- package/dist/src/core/policy-diff.js.map +1 -1
- package/dist/src/core/policy-expectations.d.ts +199 -0
- package/dist/src/core/policy-explain.d.ts +150 -0
- package/dist/src/core/policy-explain.js +31 -3
- package/dist/src/core/policy-explain.js.map +1 -1
- package/dist/src/core/policy-load.d.ts +527 -0
- package/dist/src/core/policy-load.js +15 -3
- package/dist/src/core/policy-load.js.map +1 -1
- package/dist/src/core/policy-match.d.ts +281 -0
- package/dist/src/core/policy-match.js +20 -9
- package/dist/src/core/policy-match.js.map +1 -1
- package/dist/src/core/policy-proposal.d.ts +265 -0
- package/dist/src/core/prompt-layout.d.ts +221 -0
- package/dist/src/core/protected-path-guard.d.ts +453 -0
- package/dist/src/core/protected-path-guard.js +514 -35
- package/dist/src/core/protected-path-guard.js.map +1 -1
- package/dist/src/core/registration.d.ts +25 -0
- package/dist/src/core/reindex.d.ts +99 -0
- package/dist/src/core/sampler.d.ts +313 -0
- package/dist/src/core/sandbox.d.ts +290 -0
- package/dist/src/core/seal.d.ts +165 -0
- package/dist/src/core/state.d.ts +505 -0
- package/dist/src/core/task-file.d.ts +185 -0
- package/dist/src/core/telegram-config.d.ts +93 -0
- package/dist/src/core/token.d.ts +409 -0
- package/dist/src/core/token.js +21 -38
- package/dist/src/core/token.js.map +1 -1
- package/dist/src/core/validate.d.ts +138 -0
- package/dist/src/core/values.d.ts +137 -0
- package/dist/src/core/vault.d.ts +291 -0
- package/dist/src/core/verified-snapshot.d.ts +204 -0
- package/dist/src/core/verify.d.ts +336 -0
- package/dist/src/core/version.d.ts +8 -0
- package/dist/src/core/wysiwys.d.ts +370 -0
- package/dist/src/daemon/advance-child.d.ts +39 -0
- package/dist/src/daemon/advance.d.ts +466 -0
- package/dist/src/daemon/audit.d.ts +87 -0
- package/dist/src/daemon/daemon.d.ts +1180 -0
- package/dist/src/daemon/dark-session.d.ts +64 -0
- package/dist/src/daemon/draw-child.d.ts +36 -0
- package/dist/src/daemon/draw.d.ts +154 -0
- package/dist/src/daemon/git-evidence.d.ts +173 -0
- package/dist/src/daemon/git-evidence.js +1 -1
- package/dist/src/daemon/projection.d.ts +180 -0
- package/dist/src/daemon/prune.d.ts +207 -0
- package/dist/src/mcp/http.d.ts +113 -0
- package/dist/src/mcp/server.d.ts +265 -0
- package/dist/src/mcp/server.js +9 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/docs/adapter-api.md +106 -0
- package/docs/cli-reference.md +389 -36
- package/docs/codex-enforced-session.md +30 -0
- package/package.json +12 -2
- package/schema/codex-instance.schema.json +82 -0
- package/schema/event.schema.json +2 -1
- package/schema/fixtures/codex-instance/invalid/unpinned-codex-version.json +40 -0
- package/schema/fixtures/codex-instance/valid/canonical.json +40 -0
- package/schema/policy.schema.json +21 -1
- 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("&", "&")
|
|
23
|
+
.replaceAll("<", "<")
|
|
24
|
+
.replaceAll(">", ">")
|
|
25
|
+
.replaceAll('"', """);
|
|
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;
|