caveat-cli 0.20.2 → 0.21.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.
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __caveat_createRequire } from 'node:module';
3
+ const require = __caveat_createRequire(import.meta.url);
4
+ import "../chunk-TWJDSUZ4.js";
5
+
6
+ // src/privateEvidence/candidate.ts
7
+ function planOptionalEvidence(enabled, publicBytes, exitCode, prepare) {
8
+ if (enabled !== true) return { publicBytes, exitCode, privateCandidate: null, privateStatus: "off" };
9
+ try {
10
+ return { publicBytes, exitCode, privateCandidate: prepare(), privateStatus: "prepared" };
11
+ } catch {
12
+ return { publicBytes, exitCode, privateCandidate: null, privateStatus: "unverified" };
13
+ }
14
+ }
15
+ export {
16
+ planOptionalEvidence
17
+ };
18
+ //# sourceMappingURL=candidate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/privateEvidence/candidate.ts"],"sourcesContent":["/** Isolation-only planning boundary. No CLI import, transport, filesystem or delivery integration. */\nexport function planOptionalEvidence<T>(enabled: boolean, publicBytes: Uint8Array, exitCode: number,\n prepare: () => T): { publicBytes: Uint8Array; exitCode: number; privateCandidate: T | null; privateStatus: string } {\n if (enabled !== true) return { publicBytes, exitCode, privateCandidate: null, privateStatus: 'off' };\n try { return { publicBytes, exitCode, privateCandidate: prepare(), privateStatus: 'prepared' }; }\n catch { return { publicBytes, exitCode, privateCandidate: null, privateStatus: 'unverified' }; }\n}\n"],"mappings":";;;;;;AACO,SAAS,qBAAwB,SAAkB,aAAyB,UACjF,SAAoH;AACpH,MAAI,YAAY,KAAM,QAAO,EAAE,aAAa,UAAU,kBAAkB,MAAM,eAAe,MAAM;AACnG,MAAI;AAAE,WAAO,EAAE,aAAa,UAAU,kBAAkB,QAAQ,GAAG,eAAe,WAAW;AAAA,EAAG,QAC1F;AAAE,WAAO,EAAE,aAAa,UAAU,kBAAkB,MAAM,eAAe,aAAa;AAAA,EAAG;AACjG;","names":[]}
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __caveat_createRequire } from 'node:module';
3
+ const require = __caveat_createRequire(import.meta.url);
4
+ import "../chunk-TWJDSUZ4.js";
5
+
6
+ // src/privateEvidence/origin.ts
7
+ import { createHash } from "node:crypto";
8
+ var ORIGIN_ALGORITHM = "origin-descriptor-sha256-v1";
9
+ var missing = (status, reason) => ({ status, algorithm: null, digest: null, reason });
10
+ function hasKnownCaptureState(input) {
11
+ return input.complete === true && (input.status === "observed" || input.status === "not_observed" || input.status === "unverified");
12
+ }
13
+ function projectOrigin(runId, input) {
14
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(runId) || input.run_id !== runId || !hasKnownCaptureState(input) || input.status === "unverified")
15
+ return missing("unverified", "origin_capture_unverified");
16
+ if (input.status === "not_observed") return missing("not_observed", "origin_not_reached");
17
+ if (typeof input.value !== "string") return missing("unverified", "origin_capture_unverified");
18
+ const text = input.value.replace(/\r?\n$/, "");
19
+ const unsupported = () => missing("unverified", "origin_syntax_unsupported");
20
+ if (!text || text.length > 4096 || /[^\x21-\x7e]|[%\\?#]/.test(text)) return unsupported();
21
+ let form;
22
+ let scheme = null;
23
+ let host;
24
+ let port = null;
25
+ let path;
26
+ if (text.includes("://")) {
27
+ const parsed = /^(https?|ssh|git):\/\/(?:[A-Za-z0-9._-]+@)?([^/:@]+)(?::([1-9][0-9]{0,4}))?(\/.*)$/i.exec(text);
28
+ if (!parsed) return unsupported();
29
+ form = "url";
30
+ scheme = parsed[1].toLowerCase();
31
+ host = parsed[2];
32
+ port = parsed[3] ?? null;
33
+ path = parsed[4];
34
+ if (port !== null && Number(port) > 65535) return unsupported();
35
+ } else {
36
+ const parsed = /^(?:[A-Za-z0-9._-]+@)?([^/:@]+):(.*)$/.exec(text);
37
+ if (!parsed) return unsupported();
38
+ if (!parsed[2].startsWith("/")) return missing("unverified", "origin_semantics_ambiguous");
39
+ form = "scp";
40
+ host = parsed[1];
41
+ path = parsed[2];
42
+ }
43
+ const labels = host.split(".");
44
+ if (host.length > 253 || labels.every((label) => /^[0-9]+$/.test(label)) || labels.some((label) => !/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/.test(label))) return unsupported();
45
+ if (!/^\/[A-Za-z0-9._-]+(?:\/[A-Za-z0-9._-]+)*\/?$/.test(path) || path.split("/").some((segment) => segment === "." || segment === "..")) return unsupported();
46
+ const tuple = ["caveat.origin-descriptor.v1", form, scheme, host.toLowerCase(), port, "absolute", path];
47
+ return {
48
+ status: "available",
49
+ algorithm: ORIGIN_ALGORITHM,
50
+ digest: createHash("sha256").update(JSON.stringify(tuple), "utf8").digest("hex"),
51
+ reason: "origin_descriptor_observed"
52
+ };
53
+ }
54
+ function projectHead(runId, input) {
55
+ if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(runId) || input.run_id !== runId || !hasKnownCaptureState(input) || input.status === "unverified")
56
+ return { status: "unverified", value: null, reason: "head_capture_unverified" };
57
+ if (input.status === "not_observed") return { status: "not_observed", value: null, reason: "head_not_reached" };
58
+ if (typeof input.value !== "string" || !/^[0-9a-f]{40}$/.test(input.value))
59
+ return { status: "unverified", value: null, reason: "head_format_unsupported" };
60
+ return { status: "observed", value: input.value, reason: "head_observed" };
61
+ }
62
+ function projectSync(runId, acquired, publicSync) {
63
+ const local = projectHead(runId, acquired.local), remote = projectHead(runId, acquired.remote);
64
+ return {
65
+ ...publicSync,
66
+ repo_identity: projectOrigin(runId, acquired.origin),
67
+ local_head: local,
68
+ remote_head: remote,
69
+ comparison: local.status === "observed" && remote.status === "observed" ? local.value === remote.value ? "equal" : "different" : "not_evaluated",
70
+ relation_counts: { status: "not_supported", behind: null, ahead: null }
71
+ };
72
+ }
73
+ export {
74
+ ORIGIN_ALGORITHM,
75
+ projectHead,
76
+ projectOrigin,
77
+ projectSync
78
+ };
79
+ //# sourceMappingURL=origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/privateEvidence/origin.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nexport const ORIGIN_ALGORITHM = 'origin-descriptor-sha256-v1';\nexport type OriginIdentity = {\n status: 'available' | 'not_observed' | 'unverified';\n algorithm: typeof ORIGIN_ALGORITHM | null;\n digest: string | null;\n reason: string;\n};\nexport type AcquiredValue = {\n run_id: string;\n status: 'observed' | 'not_observed' | 'unverified';\n value: string | null;\n complete: boolean;\n};\nconst missing = (status: 'not_observed' | 'unverified', reason: string): OriginIdentity =>\n ({ status, algorithm: null, digest: null, reason });\n\nfunction hasKnownCaptureState(input: AcquiredValue): boolean {\n return input.complete === true &&\n (input.status === 'observed' || input.status === 'not_observed' || input.status === 'unverified');\n}\n\n/** Input is an already acquired value; never queries Git, config, DNS, files or state. */\nexport function projectOrigin(runId: string, input: AcquiredValue): OriginIdentity {\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(runId) || input.run_id !== runId || !hasKnownCaptureState(input) || input.status === 'unverified')\n return missing('unverified', 'origin_capture_unverified');\n if (input.status === 'not_observed') return missing('not_observed', 'origin_not_reached');\n if (typeof input.value !== 'string') return missing('unverified', 'origin_capture_unverified');\n const text = input.value.replace(/\\r?\\n$/, '');\n const unsupported = () => missing('unverified', 'origin_syntax_unsupported');\n if (!text || text.length > 4096 || /[^\\x21-\\x7e]|[%\\\\?#]/.test(text)) return unsupported();\n let form: 'url' | 'scp';\n let scheme: string | null = null;\n let host: string;\n let port: string | null = null;\n let path: string;\n if (text.includes('://')) {\n const parsed = /^(https?|ssh|git):\\/\\/(?:[A-Za-z0-9._-]+@)?([^/:@]+)(?::([1-9][0-9]{0,4}))?(\\/.*)$/i.exec(text);\n if (!parsed) return unsupported();\n form = 'url'; scheme = parsed[1]!.toLowerCase(); host = parsed[2]!; port = parsed[3] ?? null; path = parsed[4]!;\n if (port !== null && Number(port) > 65535) return unsupported();\n } else {\n const parsed = /^(?:[A-Za-z0-9._-]+@)?([^/:@]+):(.*)$/.exec(text);\n if (!parsed) return unsupported();\n if (!parsed[2]!.startsWith('/')) return missing('unverified', 'origin_semantics_ambiguous');\n form = 'scp'; host = parsed[1]!; path = parsed[2]!;\n }\n const labels = host.split('.');\n if (host.length > 253 || labels.every(label => /^[0-9]+$/.test(label)) ||\n labels.some(label => !/^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?$/.test(label))) return unsupported();\n if (!/^\\/[A-Za-z0-9._-]+(?:\\/[A-Za-z0-9._-]+)*\\/?$/.test(path) ||\n path.split('/').some(segment => segment === '.' || segment === '..')) return unsupported();\n const tuple = ['caveat.origin-descriptor.v1', form, scheme, host.toLowerCase(), port, 'absolute', path];\n return { status: 'available', algorithm: ORIGIN_ALGORITHM,\n digest: createHash('sha256').update(JSON.stringify(tuple), 'utf8').digest('hex'), reason: 'origin_descriptor_observed' };\n}\n\nexport function projectHead(runId: string, input: AcquiredValue) {\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(runId) || input.run_id !== runId || !hasKnownCaptureState(input) || input.status === 'unverified')\n return { status: 'unverified', value: null, reason: 'head_capture_unverified' } as const;\n if (input.status === 'not_observed') return { status: 'not_observed', value: null, reason: 'head_not_reached' } as const;\n if (typeof input.value !== 'string' || !/^[0-9a-f]{40}$/.test(input.value))\n return { status: 'unverified', value: null, reason: 'head_format_unsupported' } as const;\n return { status: 'observed', value: input.value, reason: 'head_observed' } as const;\n}\n\nexport function projectSync(runId: string, acquired: {\n origin: AcquiredValue; local: AcquiredValue; remote: AcquiredValue;\n}, publicSync: { status: 'ready' | 'not_ready' | 'unverified'; reason_code: string }) {\n const local = projectHead(runId, acquired.local), remote = projectHead(runId, acquired.remote);\n return { ...publicSync, repo_identity: projectOrigin(runId, acquired.origin), local_head: local, remote_head: remote,\n comparison: local.status === 'observed' && remote.status === 'observed'\n ? local.value === remote.value ? 'equal' : 'different' : 'not_evaluated',\n relation_counts: { status: 'not_supported', behind: null, ahead: null } };\n}\n"],"mappings":"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","names":[]}