@polderlabs/bizar-omp 0.4.10 → 0.6.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 (146) hide show
  1. package/README.md +228 -113
  2. package/dist/cli/agents-ink.d.ts.map +1 -1
  3. package/dist/cli/agents-ink.js +62 -120
  4. package/dist/cli/agents-ink.js.map +1 -1
  5. package/dist/cli/agents.d.ts.map +1 -1
  6. package/dist/cli/agents.js +5 -2
  7. package/dist/cli/agents.js.map +1 -1
  8. package/dist/cli/install.js +5 -5
  9. package/dist/cli/install.js.map +1 -1
  10. package/dist/core/acceptance.d.ts +33 -0
  11. package/dist/core/acceptance.d.ts.map +1 -0
  12. package/dist/core/acceptance.js +87 -0
  13. package/dist/core/acceptance.js.map +1 -0
  14. package/dist/core/evidence.d.ts +6 -1
  15. package/dist/core/evidence.d.ts.map +1 -1
  16. package/dist/core/evidence.js +6 -2
  17. package/dist/core/evidence.js.map +1 -1
  18. package/dist/core/recovery.js +3 -3
  19. package/dist/core/recovery.js.map +1 -1
  20. package/dist/core/transitions.d.ts.map +1 -1
  21. package/dist/core/transitions.js +3 -3
  22. package/dist/core/transitions.js.map +1 -1
  23. package/dist/core/types.d.ts +51 -0
  24. package/dist/core/types.d.ts.map +1 -1
  25. package/dist/extension.d.ts.map +1 -1
  26. package/dist/extension.js +47 -5
  27. package/dist/extension.js.map +1 -1
  28. package/dist/index.d.ts +13 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +13 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/omp/autonomous-settings.d.ts +11 -0
  33. package/dist/omp/autonomous-settings.d.ts.map +1 -1
  34. package/dist/omp/autonomous-settings.js +14 -0
  35. package/dist/omp/autonomous-settings.js.map +1 -1
  36. package/dist/omp/capabilities.d.ts +24 -0
  37. package/dist/omp/capabilities.d.ts.map +1 -0
  38. package/dist/omp/capabilities.js +6 -0
  39. package/dist/omp/capabilities.js.map +1 -0
  40. package/dist/omp/compatibility.d.ts +7 -0
  41. package/dist/omp/compatibility.d.ts.map +1 -1
  42. package/dist/omp/compatibility.js +27 -1
  43. package/dist/omp/compatibility.js.map +1 -1
  44. package/dist/omp/completion.d.ts.map +1 -1
  45. package/dist/omp/completion.js +4 -8
  46. package/dist/omp/completion.js.map +1 -1
  47. package/dist/omp/daemon-service.d.ts +2 -0
  48. package/dist/omp/daemon-service.d.ts.map +1 -1
  49. package/dist/omp/daemon-service.js +159 -22
  50. package/dist/omp/daemon-service.js.map +1 -1
  51. package/dist/omp/dashboard-html.d.ts +1 -6
  52. package/dist/omp/dashboard-html.d.ts.map +1 -1
  53. package/dist/omp/dashboard-html.js +77 -577
  54. package/dist/omp/dashboard-html.js.map +1 -1
  55. package/dist/omp/model-role-assignment.d.ts +5 -0
  56. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  57. package/dist/omp/model-role-assignment.js +11 -1
  58. package/dist/omp/model-role-assignment.js.map +1 -1
  59. package/dist/omp/omb-sessions.d.ts +4 -0
  60. package/dist/omp/omb-sessions.d.ts.map +1 -1
  61. package/dist/omp/omb-sessions.js +36 -2
  62. package/dist/omp/omb-sessions.js.map +1 -1
  63. package/dist/omp/rpc.d.ts +6 -0
  64. package/dist/omp/rpc.d.ts.map +1 -1
  65. package/dist/omp/session-controls.d.ts +18 -0
  66. package/dist/omp/session-controls.d.ts.map +1 -0
  67. package/dist/omp/session-controls.js +14 -0
  68. package/dist/omp/session-controls.js.map +1 -0
  69. package/dist/omp/tmux.d.ts +10 -0
  70. package/dist/omp/tmux.d.ts.map +1 -1
  71. package/dist/omp/tmux.js +47 -2
  72. package/dist/omp/tmux.js.map +1 -1
  73. package/dist/services/budget.d.ts +20 -0
  74. package/dist/services/budget.d.ts.map +1 -0
  75. package/dist/services/budget.js +10 -0
  76. package/dist/services/budget.js.map +1 -0
  77. package/dist/services/candidate-local.d.ts +14 -0
  78. package/dist/services/candidate-local.d.ts.map +1 -0
  79. package/dist/services/candidate-local.js +15 -0
  80. package/dist/services/candidate-local.js.map +1 -0
  81. package/dist/services/candidates.d.ts +21 -0
  82. package/dist/services/candidates.d.ts.map +1 -0
  83. package/dist/services/candidates.js +100 -0
  84. package/dist/services/candidates.js.map +1 -0
  85. package/dist/services/evidence-bundle.d.ts +18 -0
  86. package/dist/services/evidence-bundle.d.ts.map +1 -0
  87. package/dist/services/evidence-bundle.js +21 -0
  88. package/dist/services/evidence-bundle.js.map +1 -0
  89. package/dist/services/inspector.d.ts +12 -0
  90. package/dist/services/inspector.d.ts.map +1 -0
  91. package/dist/services/inspector.js +6 -0
  92. package/dist/services/inspector.js.map +1 -0
  93. package/dist/services/lessons.d.ts +14 -0
  94. package/dist/services/lessons.d.ts.map +1 -0
  95. package/dist/services/lessons.js +11 -0
  96. package/dist/services/lessons.js.map +1 -0
  97. package/dist/services/projection.d.ts +22 -0
  98. package/dist/services/projection.d.ts.map +1 -0
  99. package/dist/services/projection.js +10 -0
  100. package/dist/services/projection.js.map +1 -0
  101. package/dist/services/readiness.d.ts +5 -0
  102. package/dist/services/readiness.d.ts.map +1 -0
  103. package/dist/services/readiness.js +35 -0
  104. package/dist/services/readiness.js.map +1 -0
  105. package/dist/services/recipes.d.ts +16 -0
  106. package/dist/services/recipes.d.ts.map +1 -0
  107. package/dist/services/recipes.js +42 -0
  108. package/dist/services/recipes.js.map +1 -0
  109. package/dist/services/recovery.d.ts +20 -0
  110. package/dist/services/recovery.d.ts.map +1 -0
  111. package/dist/services/recovery.js +9 -0
  112. package/dist/services/recovery.js.map +1 -0
  113. package/dist/services/review.d.ts +16 -0
  114. package/dist/services/review.d.ts.map +1 -0
  115. package/dist/services/review.js +9 -0
  116. package/dist/services/review.js.map +1 -0
  117. package/dist/storage/journal-recovery.d.ts +11 -0
  118. package/dist/storage/journal-recovery.d.ts.map +1 -0
  119. package/dist/storage/journal-recovery.js +33 -0
  120. package/dist/storage/journal-recovery.js.map +1 -0
  121. package/dist/storage/journal.d.ts.map +1 -1
  122. package/dist/storage/journal.js +14 -4
  123. package/dist/storage/journal.js.map +1 -1
  124. package/dist/storage/migrations.d.ts +15 -1
  125. package/dist/storage/migrations.d.ts.map +1 -1
  126. package/dist/storage/migrations.js +74 -5
  127. package/dist/storage/migrations.js.map +1 -1
  128. package/dist/storage/resources.d.ts +67 -0
  129. package/dist/storage/resources.d.ts.map +1 -0
  130. package/dist/storage/resources.js +148 -0
  131. package/dist/storage/resources.js.map +1 -0
  132. package/dist/tools/integrate.d.ts +1 -0
  133. package/dist/tools/integrate.d.ts.map +1 -1
  134. package/dist/tools/integrate.js +24 -40
  135. package/dist/tools/integrate.js.map +1 -1
  136. package/dist/tools/verify.d.ts +1 -1
  137. package/dist/tools/verify.d.ts.map +1 -1
  138. package/dist/tools/verify.js +30 -6
  139. package/dist/tools/verify.js.map +1 -1
  140. package/docs/assets/bizar-omp-workflow.svg +55 -0
  141. package/docs/compatibility/baseline.json +1 -1
  142. package/docs/compatibility/supported-surfaces.json +6 -0
  143. package/docs/releases/0.5.0.md +18 -0
  144. package/docs/releases/0.6.0.md +24 -0
  145. package/docs/releases/support-matrix.md +3 -0
  146. package/package.json +1 -1
@@ -0,0 +1,14 @@
1
+ export interface CandidateAppLease {
2
+ leaseId: string;
3
+ candidateId: string;
4
+ workspaceId: string;
5
+ host: "127.0.0.1" | "localhost";
6
+ port: number;
7
+ owner: string;
8
+ expiresAt: number;
9
+ state: "leased" | "released";
10
+ }
11
+ export declare function createCandidateAppLease(input: Omit<CandidateAppLease, "state">): CandidateAppLease;
12
+ export declare function assertCandidateEndpoint(lease: CandidateAppLease, url: string): void;
13
+ export declare function releaseCandidateAppLease(lease: CandidateAppLease): CandidateAppLease;
14
+ //# sourceMappingURL=candidate-local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-local.d.ts","sourceRoot":"","sources":["../../src/services/candidate-local.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;CAAE;AAChN,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,GAAG,iBAAiB,CAGlG;AACD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAInF;AACD,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,iBAAiB,CAA4C"}
@@ -0,0 +1,15 @@
1
+ import { ContractError } from "../core/errors.js";
2
+ export function createCandidateAppLease(input) {
3
+ if (!input.candidateId || !input.workspaceId || !Number.isInteger(input.port) || input.port < 1 || input.port > 65535 || input.expiresAt <= Date.now())
4
+ throw new ContractError("Candidate app lease is invalid");
5
+ return { ...input, state: "leased" };
6
+ }
7
+ export function assertCandidateEndpoint(lease, url) {
8
+ if (lease.state !== "leased" || lease.expiresAt <= Date.now())
9
+ throw new ContractError("Candidate app lease is expired or released");
10
+ const target = new URL(url);
11
+ if (!["127.0.0.1", "localhost"].includes(target.hostname) || Number(target.port || 80) !== lease.port)
12
+ throw new ContractError("Application check targeted a different endpoint", { expectedPort: lease.port, actualHost: target.hostname, actualPort: target.port });
13
+ }
14
+ export function releaseCandidateAppLease(lease) { return { ...lease, state: "released" }; }
15
+ //# sourceMappingURL=candidate-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-local.js","sourceRoot":"","sources":["../../src/services/candidate-local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,uBAAuB,CAAC,KAAuC;IAC7E,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;QAAE,MAAM,IAAI,aAAa,CAAC,gCAAgC,CAAC,CAAC;IAClN,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,KAAwB,EAAE,GAAW;IAC3E,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;QAAE,MAAM,IAAI,aAAa,CAAC,4CAA4C,CAAC,CAAC;IACrI,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAE,CAAC,WAAW,EAAE,WAAW,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI;QAAE,MAAM,IAAI,aAAa,CAAC,iDAAiD,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AACtR,CAAC;AACD,MAAM,UAAU,wBAAwB,CAAC,KAAwB,IAAuB,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ export type CandidateOperationKind = "add" | "delete" | "modify" | "mode" | "type";
2
+ export interface CandidateOperation {
3
+ path: string;
4
+ kind: CandidateOperationKind;
5
+ oldMode?: string;
6
+ newMode?: string;
7
+ status: string;
8
+ }
9
+ export interface CandidateRecord {
10
+ id: string;
11
+ baseCommit: string;
12
+ baseTree: string;
13
+ candidateTree: string;
14
+ patchDigest: string;
15
+ operations: CandidateOperation[];
16
+ }
17
+ /** Materialize a patch into a private index and return its exact result tree. */
18
+ export declare function materializeCandidate(cwd: string, patch: string): CandidateRecord;
19
+ /** Observe the working tree through a private index without touching the real index. */
20
+ export declare function observeWorkingTreeTree(cwd: string): string;
21
+ //# sourceMappingURL=candidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/services/candidates.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,sBAAsB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC;AA4DD,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,eAAe,CAmBhF;AAED,wFAAwF;AACxF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,100 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { mkdtempSync, rmSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { ContractError } from "../core/errors.js";
7
+ const git = (cwd, args, input, env) => {
8
+ try {
9
+ return execFileSync("git", args, { cwd, input, env, stdio: [input === undefined ? "ignore" : "pipe", "pipe", "pipe"] });
10
+ }
11
+ catch (error) {
12
+ const details = error;
13
+ const stderr = details.stderr?.toString().trim();
14
+ throw new ContractError(stderr || `git ${args[0] ?? "command"} failed`, { status: details.status });
15
+ }
16
+ };
17
+ function gitText(cwd, args, input, env) {
18
+ return git(cwd, args, input, env).toString("utf8").trim();
19
+ }
20
+ function rejectUnsafePath(path) {
21
+ if (!path || path.includes("\0") || path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(path) || path.startsWith("\\\\")) {
22
+ throw new ContractError("Candidate contains an unsafe path", { path });
23
+ }
24
+ const segments = path.split(/[\\/]/);
25
+ if (segments.some(segment => segment === "." || segment === ".."))
26
+ throw new ContractError("Candidate contains a traversal path", { path });
27
+ }
28
+ function operationKind(status, oldMode, newMode) {
29
+ if (status === "A")
30
+ return "add";
31
+ if (status === "D")
32
+ return "delete";
33
+ if (oldMode !== newMode && status === "M")
34
+ return "mode";
35
+ if (oldMode.slice(0, 2) !== newMode.slice(0, 2))
36
+ return "type";
37
+ return "modify";
38
+ }
39
+ function parseOperations(raw) {
40
+ const fields = raw.toString("utf8").split("\0").filter(Boolean);
41
+ const operations = [];
42
+ if (fields.length % 2 !== 0)
43
+ throw new ContractError("Git returned an incomplete candidate operation stream");
44
+ for (let index = 0; index < fields.length; index += 2) {
45
+ const metadata = fields[index]?.split(/\s+/) ?? [];
46
+ const path = fields[index + 1] ?? "";
47
+ const oldMode = metadata[0] ?? "";
48
+ const newMode = metadata[1] ?? "";
49
+ const status = metadata.at(-1) ?? "";
50
+ rejectUnsafePath(path);
51
+ if (!/^[A-Z][0-9]*$/.test(status))
52
+ throw new ContractError("Git returned an unsupported candidate operation", { status, path });
53
+ operations.push({ path, kind: operationKind(status, oldMode, newMode), oldMode, newMode, status });
54
+ }
55
+ if (operations.length === 0)
56
+ throw new ContractError("Candidate patch does not change any files");
57
+ return operations;
58
+ }
59
+ function withTemporaryIndex(cwd, action) {
60
+ const directory = mkdtempSync(join(tmpdir(), "bizar-candidate-index-"));
61
+ const index = join(directory, `index-${randomUUID()}`);
62
+ try {
63
+ return action({ ...process.env, GIT_INDEX_FILE: index });
64
+ }
65
+ finally {
66
+ rmSync(directory, { recursive: true, force: true });
67
+ }
68
+ }
69
+ /** Materialize a patch into a private index and return its exact result tree. */
70
+ export function materializeCandidate(cwd, patch) {
71
+ if (!patch || patch.includes("\0"))
72
+ throw new ContractError("Candidate patch must be nonempty and NUL-free");
73
+ const baseCommit = gitText(cwd, ["rev-parse", "--verify", "HEAD"]);
74
+ const baseTree = gitText(cwd, ["rev-parse", "--verify", "HEAD^{tree}"]);
75
+ const operations = withTemporaryIndex(cwd, env => {
76
+ git(cwd, ["read-tree", baseTree], undefined, env);
77
+ git(cwd, ["apply", "--cached", "--whitespace=error", "--recount", "-"], patch, env);
78
+ const candidateTree = gitText(cwd, ["write-tree"], undefined, env);
79
+ const raw = git(cwd, ["diff-tree", "--no-commit-id", "-r", "--raw", "-z", "--no-renames", baseTree, candidateTree], undefined, env);
80
+ return { candidateTree, operations: parseOperations(raw) };
81
+ });
82
+ return {
83
+ id: `candidate_${randomUUID()}`,
84
+ baseCommit,
85
+ baseTree,
86
+ candidateTree: operations.candidateTree,
87
+ patchDigest: createHash("sha256").update(patch).digest("hex"),
88
+ operations: operations.operations,
89
+ };
90
+ }
91
+ /** Observe the working tree through a private index without touching the real index. */
92
+ export function observeWorkingTreeTree(cwd) {
93
+ const headTree = gitText(cwd, ["rev-parse", "--verify", "HEAD^{tree}"]);
94
+ return withTemporaryIndex(cwd, env => {
95
+ git(cwd, ["read-tree", headTree], undefined, env);
96
+ git(cwd, ["add", "--all", "--", "."], undefined, env);
97
+ return gitText(cwd, ["write-tree"], undefined, env);
98
+ });
99
+ }
100
+ //# sourceMappingURL=candidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidates.js","sourceRoot":"","sources":["../../src/services/candidates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AcceptanceDecision } from "../core/acceptance.js";
2
+ import type { StateSnapshot } from "../core/types.js";
3
+ export interface EvidenceBundle {
4
+ schemaVersion: 1;
5
+ createdAt: string;
6
+ runId?: string;
7
+ decision: AcceptanceDecision;
8
+ state: Pick<StateSnapshot, "revision" | "lastSequence" | "evidence" | "integrations" | "observations" | "decisions">;
9
+ limitations: string[];
10
+ manifest: Array<{
11
+ name: string;
12
+ sha256: string;
13
+ bytes: number;
14
+ }>;
15
+ }
16
+ export declare function createEvidenceBundle(state: StateSnapshot, decision: AcceptanceDecision): EvidenceBundle;
17
+ export declare function writeEvidenceBundle(directory: string, bundle: EvidenceBundle): string;
18
+ //# sourceMappingURL=evidence-bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-bundle.d.ts","sourceRoot":"","sources":["../../src/services/evidence-bundle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,MAAM,WAAW,cAAc;IAAG,aAAa,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,GAAG,cAAc,GAAG,WAAW,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAAE;AACrU,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,kBAAkB,GAAG,cAAc,CAOvG;AACD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAMrF"}
@@ -0,0 +1,21 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ export function createEvidenceBundle(state, decision) {
5
+ const selected = new Set(decision.selectedEvidenceIds);
6
+ const evidence = state.evidence.filter(record => selected.has(record.id)).map(record => ({ ...record, stdout: record.stdout, stderr: record.stderr }));
7
+ const bundle = { schemaVersion: 1, createdAt: new Date().toISOString(), runId: state.run?.runId, decision, state: { revision: state.revision, lastSequence: state.lastSequence, evidence, integrations: state.integrations, observations: state.observations, decisions: state.decisions }, limitations: ["Hashes establish internal consistency, not independent attestation against a same-user writer", "Raw prompts, credentials, and native transcripts are intentionally omitted"], manifest: [] };
8
+ const content = JSON.stringify(bundle.state);
9
+ bundle.manifest.push({ name: "state.json", sha256: createHash("sha256").update(content).digest("hex"), bytes: Buffer.byteLength(content) });
10
+ return bundle;
11
+ }
12
+ export function writeEvidenceBundle(directory, bundle) {
13
+ const root = resolve(directory);
14
+ mkdirSync(root, { recursive: true, mode: 0o700 });
15
+ const statePath = join(root, "state.json");
16
+ const manifestPath = join(root, "manifest.json");
17
+ writeFileSync(statePath, `${JSON.stringify(bundle.state, null, 2)}\n`, { mode: 0o600 });
18
+ writeFileSync(manifestPath, `${JSON.stringify(bundle, null, 2)}\n`, { mode: 0o600 });
19
+ return manifestPath;
20
+ }
21
+ //# sourceMappingURL=evidence-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-bundle.js","sourceRoot":"","sources":["../../src/services/evidence-bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,UAAU,oBAAoB,CAAC,KAAoB,EAAE,QAA4B;IACrF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvJ,MAAM,MAAM,GAAmB,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,+FAA+F,EAAE,4EAA4E,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzf,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC5I,OAAO,MAAM,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,MAAsB;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC7F,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,aAAa,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type AcceptanceDecision, type AcceptanceRequirements } from "../core/acceptance.js";
2
+ import type { StateSnapshot } from "../core/types.js";
3
+ export interface EvidenceInspection {
4
+ decision: AcceptanceDecision;
5
+ chain: Array<{
6
+ criterionId?: string;
7
+ checkId: string;
8
+ evidenceIds: string[];
9
+ }>;
10
+ }
11
+ export declare function inspectEvidence(state: StateSnapshot, requirements: AcceptanceRequirements): EvidenceInspection;
12
+ //# sourceMappingURL=inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/services/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,kBAAkB,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,MAAM,WAAW,kBAAkB;IAAG,QAAQ,EAAE,kBAAkB,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAC;KAAE,CAAC,CAAA;CAAE;AACrJ,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,GAAG,kBAAkB,CAG9G"}
@@ -0,0 +1,6 @@
1
+ import { evaluateAcceptance } from "../core/acceptance.js";
2
+ export function inspectEvidence(state, requirements) {
3
+ const decision = evaluateAcceptance(state, requirements);
4
+ return { decision, chain: requirements.requiredChecks.map(check => { const id = typeof check === "string" ? check : check.id; return { checkId: id, evidenceIds: state.evidence.filter(record => record.checkId === id).map(record => record.id) }; }) };
5
+ }
6
+ //# sourceMappingURL=inspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.js","sourceRoot":"","sources":["../../src/services/inspector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAwD,MAAM,uBAAuB,CAAC;AAGjH,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,YAAoC;IACxF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACzD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3P,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface RegressionLesson {
2
+ id: string;
3
+ observedFailure: string;
4
+ requirement: string;
5
+ candidateId?: string;
6
+ environment: string;
7
+ proposedFixture: string;
8
+ sourceEvidenceIds: string[];
9
+ status: "proposed" | "approved" | "rejected" | "superseded";
10
+ revision: number;
11
+ }
12
+ export declare function lessonHash(lesson: RegressionLesson): string;
13
+ export declare function approveLesson(lesson: RegressionLesson, authorized: boolean, expectedHash: string): RegressionLesson;
14
+ //# sourceMappingURL=lessons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons.d.ts","sourceRoot":"","sources":["../../src/services/lessons.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAC/Q,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAA8E;AAC1I,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAInH"}
@@ -0,0 +1,11 @@
1
+ import { createHash } from "node:crypto";
2
+ import { ContractError } from "../core/errors.js";
3
+ export function lessonHash(lesson) { return createHash("sha256").update(JSON.stringify(lesson)).digest("hex"); }
4
+ export function approveLesson(lesson, authorized, expectedHash) {
5
+ if (!authorized)
6
+ throw new ContractError("Regression lesson promotion requires independent review");
7
+ if (lessonHash(lesson) !== expectedHash || lesson.status !== "proposed")
8
+ throw new ContractError("Regression lesson changed or is not proposed");
9
+ return { ...lesson, status: "approved", revision: lesson.revision + 1 };
10
+ }
11
+ //# sourceMappingURL=lessons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessons.js","sourceRoot":"","sources":["../../src/services/lessons.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,UAAU,UAAU,CAAC,MAAwB,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1I,MAAM,UAAU,aAAa,CAAC,MAAwB,EAAE,UAAmB,EAAE,YAAoB;IAC/F,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,aAAa,CAAC,yDAAyD,CAAC,CAAC;IACpG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QAAE,MAAM,IAAI,aAAa,CAAC,8CAA8C,CAAC,CAAC;IACjJ,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { StateSnapshot } from "../core/types.js";
2
+ import { inspectEvidence } from "./inspector.js";
3
+ import type { AcceptanceRequirements } from "../core/acceptance.js";
4
+ export interface WorkflowProjection {
5
+ schemaVersion: 1;
6
+ generatedAt: string;
7
+ runId?: string;
8
+ phase?: string;
9
+ objective?: string;
10
+ work: Array<{
11
+ id: string;
12
+ title: string;
13
+ lifecycle: string;
14
+ dependencies: string[];
15
+ }>;
16
+ acceptance: ReturnType<typeof inspectEvidence>["decision"];
17
+ unresolvedEffects: string[];
18
+ nextAction: string;
19
+ truncated: boolean;
20
+ }
21
+ export declare function projectWorkflow(state: StateSnapshot, requirements: AcceptanceRequirements, maxChars?: number): WorkflowProjection;
22
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../src/services/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,MAAM,WAAW,kBAAkB;IAAG,aAAa,EAAE,CAAC,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,UAAU,CAAC,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;CAAE;AAC1V,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,EAAE,QAAQ,SAAS,GAAG,kBAAkB,CAMjI"}
@@ -0,0 +1,10 @@
1
+ import { inspectEvidence } from "./inspector.js";
2
+ export function projectWorkflow(state, requirements, maxChars = 16_000) {
3
+ const acceptance = inspectEvidence(state, requirements).decision;
4
+ const projection = { schemaVersion: 1, generatedAt: new Date().toISOString(), runId: state.run?.runId, phase: state.run?.phase, objective: state.run?.objective.objective, work: state.run?.workItems.map(item => ({ id: item.id, title: item.title.slice(0, 160), lifecycle: item.lifecycle, dependencies: item.dependencies })) ?? [], acceptance, unresolvedEffects: [...state.integrations.filter(item => item.outcome === "unknown-outcome").map(item => item.id), ...state.observations.filter(item => item.status === "unknown-outcome").map(item => item.dispatchId)], nextAction: acceptance.eligible ? "inspect accepted result" : acceptance.blockers[0]?.message ?? "admit a required check", truncated: false };
5
+ const serialized = JSON.stringify(projection);
6
+ if (serialized.length <= maxChars)
7
+ return projection;
8
+ return { ...projection, work: projection.work.slice(0, 8), acceptance: { ...projection.acceptance, selectedEvidenceIds: projection.acceptance.selectedEvidenceIds.slice(0, 8), supersededEvidence: projection.acceptance.supersededEvidence.slice(-8), blockers: projection.acceptance.blockers.slice(0, 8) }, truncated: true };
9
+ }
10
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../src/services/projection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjD,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,YAAoC,EAAE,QAAQ,GAAG,MAAM;IAC3G,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC;IACjE,MAAM,UAAU,GAAuB,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,KAAK,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,wBAAwB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACjtB,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,UAAU,CAAC;IACrD,OAAO,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,UAAU,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,kBAAkB,EAAE,UAAU,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnU,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { WorkItem } from "../core/types.js";
2
+ export declare function validateDependencies(items: WorkItem[]): void;
3
+ export declare function dependencyReady(item: WorkItem, items: WorkItem[]): boolean;
4
+ export declare function readyWorkItems(items: WorkItem[], capacity?: number): WorkItem[];
5
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/services/readiness.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAM5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAE1E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,QAAQ,SAA2B,GAAG,QAAQ,EAAE,CAMjG"}
@@ -0,0 +1,35 @@
1
+ import { ContractError } from "../core/errors.js";
2
+ export function validateDependencies(items) {
3
+ const ids = new Set(items.map(item => item.id));
4
+ for (const item of items) {
5
+ if (item.dependencies.includes(item.id))
6
+ throw new ContractError("Work item cannot depend on itself", { workItemId: item.id });
7
+ for (const dependency of item.dependencies)
8
+ if (!ids.has(dependency))
9
+ throw new ContractError("Work item dependency is unknown", { workItemId: item.id, dependency });
10
+ }
11
+ const visiting = new Set();
12
+ const visited = new Set();
13
+ const visit = (id) => { if (visiting.has(id))
14
+ throw new ContractError("Work item dependency cycle detected", { workItemId: id }); if (visited.has(id))
15
+ return; visiting.add(id); const item = items.find(candidate => candidate.id === id); for (const dependency of item?.dependencies ?? [])
16
+ visit(dependency); visiting.delete(id); visited.add(id); };
17
+ for (const item of items)
18
+ visit(item.id);
19
+ }
20
+ export function dependencyReady(item, items) {
21
+ return item.dependencies.every(id => { const dependency = items.find(candidate => candidate.id === id); return dependency !== undefined && dependency.lifecycle === "accepted"; });
22
+ }
23
+ export function readyWorkItems(items, capacity = Number.POSITIVE_INFINITY) {
24
+ validateDependencies(items);
25
+ const ready = items.filter(item => item.lifecycle === "pending" && dependencyReady(item, items));
26
+ const selected = [];
27
+ for (const item of ready)
28
+ if (selected.every(other => item.scope.every(path => other.scope.every(otherPath => path !== otherPath && !path.startsWith(`${otherPath}/`) && !otherPath.startsWith(`${path}/`))))) {
29
+ selected.push(item);
30
+ if (selected.length >= capacity)
31
+ break;
32
+ }
33
+ return selected;
34
+ }
35
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/services/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { CheckSpec, CriterionSpec, ObjectiveContract } from "../core/types.js";
2
+ export interface RecipePreview {
3
+ schemaVersion: 1;
4
+ recipeId: string;
5
+ objective: string;
6
+ suggestedScope: string[];
7
+ criteria: CriterionSpec[];
8
+ checks: CheckSpec[];
9
+ assumptions: string[];
10
+ warnings: string[];
11
+ trusted: false;
12
+ recipeHash: string;
13
+ }
14
+ export declare function analyzeRecipe(cwd: string, objective: ObjectiveContract): RecipePreview;
15
+ export declare function admitRecipe(preview: RecipePreview, authorized: boolean, expectedHash?: string): ObjectiveContract;
16
+ //# sourceMappingURL=recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../../src/services/recipes.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAAG,aAAa,EAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;CAAE;AAMlP,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,aAAa,CAatF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,SAAqB,GAAG,iBAAiB,CAK7H"}
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { ContractError } from "../core/errors.js";
5
+ import { canonicalSpecHash, freezeCheckSpec } from "../core/acceptance.js";
6
+ function digestFile(path) {
7
+ try {
8
+ return createHash("sha256").update(readFileSync(path)).digest("hex");
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ export function analyzeRecipe(cwd, objective) {
15
+ const root = resolve(cwd);
16
+ const packagePath = join(root, "package.json");
17
+ let packageJson = {};
18
+ try {
19
+ packageJson = JSON.parse(readFileSync(packagePath, "utf8"));
20
+ }
21
+ catch { /* non-JavaScript repositories remain advisory */ }
22
+ const scripts = packageJson.scripts ?? {};
23
+ const checks = [];
24
+ const known = ["test", "lint", "typecheck", "build"];
25
+ for (const name of known)
26
+ if (typeof scripts[name] === "string")
27
+ checks.push(freezeCheckSpec({ id: `recipe:${name}`, revision: 1, runner: "argv", executable: "npm", argumentTemplate: ["run", name], cwdRule: "candidate-workspace", inputDigests: Object.fromEntries(["package.json", "package-lock.json", "npm-shrinkwrap.json"].map(file => [file, digestFile(join(root, file))]).filter(([, digest]) => digest !== undefined)), environmentPolicy: "Bizar safe environment allowlist", limits: { timeoutMs: 10 * 60 * 1000, outputBytes: 100_000 }, expected: "zero-exit", outputPolicy: "sanitized-tail" }));
28
+ const criteria = objective.acceptanceCriteria.map((description, index) => ({ id: `criterion:${index + 1}`, revision: 1, description, kind: "deterministic", requiredEvidenceClasses: checks.length ? checks.map(check => check.id) : ["operator-judgment"], applicable: true }));
29
+ const assumptions = ["Suggested commands are not executed during analysis", "Candidate-workspace materialization and native task settlement still require qualification"];
30
+ const warnings = checks.length ? [] : ["No conventional package scripts were discovered; add an explicitly authorized CheckSpec or operator judgment"];
31
+ const unsigned = { schemaVersion: 1, recipeId: `recipe_${canonicalSpecHash({ root, objective: objective.objective }).slice(0, 16)}`, objective: objective.objective, suggestedScope: [], criteria, checks, assumptions, warnings, trusted: false };
32
+ return { ...unsigned, recipeHash: canonicalSpecHash(unsigned) };
33
+ }
34
+ export function admitRecipe(preview, authorized, expectedHash = preview.recipeHash) {
35
+ if (!authorized)
36
+ throw new ContractError("Recipe admission requires explicit authorization");
37
+ const { recipeHash, ...unsigned } = preview;
38
+ if (recipeHash !== canonicalSpecHash(unsigned) || recipeHash !== expectedHash)
39
+ throw new ContractError("Recipe changed since preview; refusing admission");
40
+ return { objective: preview.objective, nonGoals: [], constraints: [], acceptanceCriteria: preview.criteria.map(criterion => criterion.description), verificationPlan: preview.checks.map(check => check.id), stopConditions: ["A required check fails, becomes stale, or is unsupported"], userRestrictions: [], revision: 1, criteria: preview.criteria, checkSpecs: preview.checks, policyRevision: preview.recipeHash, authorizationRef: `recipe-admission:${preview.recipeId}` };
41
+ }
42
+ //# sourceMappingURL=recipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.js","sourceRoot":"","sources":["../../src/services/recipes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { RepositoryIdentity } from "../storage/repository-identity.js";
2
+ export declare function recoveryInspection(identity: RepositoryIdentity, statePath: string): {
3
+ statePath: string;
4
+ health: {
5
+ valid: boolean;
6
+ lines: number;
7
+ invalidLines: number;
8
+ };
9
+ issue: import("../storage/migrations.js").JournalReadIssue | undefined;
10
+ validatedEntries: number;
11
+ resourceRegistry: string;
12
+ resources: {
13
+ resourceId: string;
14
+ path: string;
15
+ state: import("../storage/resources.js").ResourceState;
16
+ consumers: string[];
17
+ retentionPins: string[];
18
+ }[];
19
+ };
20
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/services/recovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAE5E,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;EAGjF"}
@@ -0,0 +1,9 @@
1
+ import { inspectState, readJournal } from "../storage/migrations.js";
2
+ import { resourceRegistryPath, loadResourceRegistry } from "../storage/resources.js";
3
+ export function recoveryInspection(identity, statePath) {
4
+ const health = inspectState(statePath);
5
+ const journal = readJournal(statePath);
6
+ const resources = loadResourceRegistry(identity);
7
+ return { statePath, health, issue: journal.issue, validatedEntries: journal.entries.length, resourceRegistry: resourceRegistryPath(identity), resources: resources.resources.map(resource => ({ resourceId: resource.resourceId, path: resource.path, state: resource.state, consumers: resource.consumers, retentionPins: resource.retentionPins })) };
8
+ }
9
+ //# sourceMappingURL=recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/services/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,MAAM,UAAU,kBAAkB,CAAC,QAA4B,EAAE,SAAiB;IAChF,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAAC,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjI,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC;AAC1V,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ReviewSpec } from "../core/types.js";
2
+ export interface ReviewFinding {
3
+ id: string;
4
+ severity: "low" | "medium" | "high";
5
+ summary: string;
6
+ criterionId?: string;
7
+ evidenceIds: string[];
8
+ }
9
+ export interface ReviewDecision {
10
+ outcome: "passed" | "blocked" | "advisory";
11
+ findings: ReviewFinding[];
12
+ repairAllowed: boolean;
13
+ reason: string;
14
+ }
15
+ export declare function evaluateReview(spec: ReviewSpec, findings: ReviewFinding[], deterministicFailure: boolean, repairAttempts: number, maxRepairAttempts: number): ReviewDecision;
16
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/services/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;CAAE;AACjJ,MAAM,WAAW,cAAc;IAAG,OAAO,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAAC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AAClJ,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,oBAAoB,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,cAAc,CAK5K"}
@@ -0,0 +1,9 @@
1
+ export function evaluateReview(spec, findings, deterministicFailure, repairAttempts, maxRepairAttempts) {
2
+ if (deterministicFailure)
3
+ return { outcome: "blocked", findings, repairAllowed: repairAttempts < maxRepairAttempts, reason: "Deterministic acceptance failures cannot be overridden by review" };
4
+ const blocking = findings.some(finding => spec.severityPolicy === "block-any" || (spec.severityPolicy === "block-high" && finding.severity === "high"));
5
+ if (blocking)
6
+ return { outcome: "blocked", findings, repairAllowed: repairAttempts < maxRepairAttempts, reason: "Review contains unresolved findings under the admitted severity policy" };
7
+ return { outcome: spec.severityPolicy === "advisory" ? "advisory" : "passed", findings, repairAllowed: false, reason: "Review criteria satisfied" };
8
+ }
9
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/services/review.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,QAAyB,EAAE,oBAA6B,EAAE,cAAsB,EAAE,iBAAyB;IAC1J,IAAI,oBAAoB;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,GAAG,iBAAiB,EAAE,MAAM,EAAE,kEAAkE,EAAE,CAAC;IACjM,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,KAAK,YAAY,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC;IACxJ,IAAI,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,GAAG,iBAAiB,EAAE,MAAM,EAAE,wEAAwE,EAAE,CAAC;IAC3L,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;AACtJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface JournalRecoveryReceipt {
2
+ path: string;
3
+ backupPath: string;
4
+ backupDigest: string;
5
+ salvagedLines: number;
6
+ issue: "torn-tail";
7
+ authorized: true;
8
+ }
9
+ /** Salvage only a provably incomplete final record after an explicit operator authorization. */
10
+ export declare function recoverTornJournalTail(path: string, authorized: boolean): JournalRecoveryReceipt;
11
+ //# sourceMappingURL=journal-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-recovery.d.ts","sourceRoot":"","sources":["../../src/storage/journal-recovery.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;CAClB;AAED,gGAAgG;AAChG,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,sBAAsB,CAiBhG"}
@@ -0,0 +1,33 @@
1
+ import { closeSync, copyFileSync, existsSync, fsyncSync, openSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { ContractError } from "../core/errors.js";
4
+ import { readJournal } from "./migrations.js";
5
+ /** Salvage only a provably incomplete final record after an explicit operator authorization. */
6
+ export function recoverTornJournalTail(path, authorized) {
7
+ if (!authorized)
8
+ throw new ContractError("Journal recovery requires explicit authorization");
9
+ if (!existsSync(path))
10
+ throw new ContractError("Journal does not exist", { path });
11
+ const result = readJournal(path);
12
+ if (!result.issue || result.issue.kind !== "torn-tail")
13
+ throw new ContractError("Only a torn journal tail may be salvaged", { issue: result.issue?.kind ?? "none" });
14
+ const original = readFileSync(path);
15
+ const backupPath = `${path}.recovery-${randomUUID()}.bak`;
16
+ copyFileSync(path, backupPath);
17
+ const backupDigest = createHash("sha256").update(original).digest("hex");
18
+ const completeLines = original.toString("utf8").split("\n").slice(0, result.issue.line - 1).filter(Boolean);
19
+ const temporaryPath = `${path}.recovery-${randomUUID()}.tmp`;
20
+ writeFileSync(temporaryPath, completeLines.length ? `${completeLines.join("\n")}\n` : "", { mode: 0o600 });
21
+ const fd = openSync(temporaryPath, "r");
22
+ try {
23
+ fsyncSync(fd);
24
+ }
25
+ finally {
26
+ closeSync(fd);
27
+ }
28
+ renameSync(temporaryPath, path);
29
+ if (readJournal(path).issue)
30
+ throw new ContractError("Recovered journal did not validate after replacement", { path });
31
+ return { path, backupPath, backupDigest, salvagedLines: completeLines.length, issue: "torn-tail", authorized: true };
32
+ }
33
+ //# sourceMappingURL=journal-recovery.js.map