@polderlabs/bizar-omp 0.6.7 → 0.7.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 +8 -8
- package/dist/cli/doctor.d.ts +4 -4
- package/dist/cli/update-ink.d.ts +2 -1
- package/dist/cli/update-ink.d.ts.map +1 -1
- package/dist/core/acceptance.d.ts.map +1 -1
- package/dist/core/acceptance.js +17 -3
- package/dist/core/acceptance.js.map +1 -1
- package/dist/core/recovery.d.ts.map +1 -1
- package/dist/core/recovery.js +52 -3
- package/dist/core/recovery.js.map +1 -1
- package/dist/core/redaction.d.ts +22 -0
- package/dist/core/redaction.d.ts.map +1 -0
- package/dist/core/redaction.js +103 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/transitions.d.ts +3 -2
- package/dist/core/transitions.d.ts.map +1 -1
- package/dist/core/transitions.js +34 -8
- package/dist/core/transitions.js.map +1 -1
- package/dist/core/types.d.ts +33 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/extension.d.ts +14 -3
- package/dist/extension.d.ts.map +1 -1
- package/dist/extension.js +92 -36
- package/dist/extension.js.map +1 -1
- package/dist/omp/compatibility.d.ts +5 -5
- package/dist/omp/compatibility.d.ts.map +1 -1
- package/dist/omp/compatibility.js +2 -2
- package/dist/omp/compatibility.js.map +1 -1
- package/dist/omp/dispatch-admission.d.ts +4 -1
- package/dist/omp/dispatch-admission.d.ts.map +1 -1
- package/dist/omp/dispatch-admission.js +2 -2
- package/dist/omp/dispatch-admission.js.map +1 -1
- package/dist/omp/result-reconciliation.js +1 -1
- package/dist/omp/result-reconciliation.js.map +1 -1
- package/dist/omp/rpc.d.ts +4 -1
- package/dist/omp/rpc.d.ts.map +1 -1
- package/dist/services/candidate-verify.d.ts +34 -0
- package/dist/services/candidate-verify.d.ts.map +1 -0
- package/dist/services/candidate-verify.js +141 -0
- package/dist/services/candidate-verify.js.map +1 -0
- package/dist/storage/journal.d.ts.map +1 -1
- package/dist/storage/journal.js +6 -21
- package/dist/storage/journal.js.map +1 -1
- package/dist/storage/lease.d.ts +16 -0
- package/dist/storage/lease.d.ts.map +1 -0
- package/dist/storage/lease.js +236 -0
- package/dist/storage/lease.js.map +1 -0
- package/dist/storage/repository-identity.d.ts.map +1 -1
- package/dist/storage/repository-identity.js +1 -0
- package/dist/storage/repository-identity.js.map +1 -1
- package/dist/storage/resources.d.ts.map +1 -1
- package/dist/storage/resources.js +49 -22
- package/dist/storage/resources.js.map +1 -1
- package/dist/tools/integrate.d.ts.map +1 -1
- package/dist/tools/integrate.js +66 -23
- package/dist/tools/integrate.js.map +1 -1
- package/dist/tools/verify.d.ts.map +1 -1
- package/dist/tools/verify.js +43 -32
- package/dist/tools/verify.js.map +1 -1
- package/dist/tools/workflow.d.ts +12 -2
- package/dist/tools/workflow.d.ts.map +1 -1
- package/dist/tools/workflow.js +54 -7
- package/dist/tools/workflow.js.map +1 -1
- package/docs/compatibility/baseline.json +9 -8
- package/docs/compatibility/supported-surfaces.json +2 -1
- package/docs/releases/0.6.8.md +11 -0
- package/docs/releases/native-stable.md +1 -1
- package/docs/releases/npm-publishing.md +1 -1
- package/docs/releases/support-matrix.md +1 -1
- package/package.json +2 -2
- package/schemas/evidence-record.schema.json +29 -3
- package/schemas/workflow-run.schema.json +10 -3
- package/skills/bizar-omp/SKILL.md +2 -1
- package/skills/omp-native-development/SKILL.md +1 -1
- package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
- package/skills/omp-native-development/references/source-manifest.json +3 -3
- package/optional/openkan/index.ts +0 -3
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
<p>
|
|
5
5
|
<a href="https://www.npmjs.com/package/@polderlabs/bizar-omp"><img src="https://img.shields.io/npm/v/%40polderlabs%2Fbizar-omp?style=flat-square&color=0f766e&label=npm" alt="npm version" /></a>
|
|
6
|
-
<a href="https://github.com/
|
|
7
|
-
<img src="https://img.shields.io/badge/OMP-18.2.
|
|
6
|
+
<a href="https://github.com/PolderLabs/BizarHarness-OMP/releases"><img src="https://img.shields.io/github/v/release/PolderLabs/BizarHarness-OMP?style=flat-square&color=2563eb&label=release" alt="latest GitHub release" /></a>
|
|
7
|
+
<img src="https://img.shields.io/badge/OMP-18.2.8-2563eb?style=flat-square" alt="OMP 18.2.8" />
|
|
8
8
|
<img src="https://img.shields.io/badge/Node.js-22%2B-18181b?style=flat-square&logo=nodedotjs&logoColor=5fa04e" alt="Node.js 22 or newer" />
|
|
9
9
|
<img src="https://img.shields.io/badge/Bun-1.3.14%2B-18181b?style=flat-square&logo=bun&logoColor=fbf0df" alt="Bun 1.3.14 or newer" />
|
|
10
10
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-18181b?style=flat-square" alt="MIT license" /></a>
|
|
@@ -69,8 +69,8 @@ Bizar does not replace OMP's task system, add a parallel scheduler, or provide a
|
|
|
69
69
|
|
|
70
70
|
- Node.js 22 or newer
|
|
71
71
|
- Bun 1.3.14 or newer
|
|
72
|
-
- OMP 18.2.
|
|
73
|
-
- OMP 18.2.6, 18.2.5,
|
|
72
|
+
- OMP 18.2.8 on `PATH`
|
|
73
|
+
- OMP 18.2.7, 18.2.6, 18.2.5, 18.2.4 remain regression-qualified
|
|
74
74
|
- tmux on Linux and macOS, or [psmux](https://github.com/psmux/psmux) on Windows for durable sessions
|
|
75
75
|
|
|
76
76
|
Check the host before installing:
|
|
@@ -101,7 +101,7 @@ The installer:
|
|
|
101
101
|
For a reproducible install, pin the version:
|
|
102
102
|
|
|
103
103
|
```sh
|
|
104
|
-
npx --yes @polderlabs/bizar-omp@0.6.
|
|
104
|
+
npx --yes @polderlabs/bizar-omp@0.6.8 setup
|
|
105
105
|
```
|
|
106
106
|
|
|
107
107
|
For a named OMP profile or a non-standard OMP binary:
|
|
@@ -386,7 +386,7 @@ The role names are selectors, not guarantees of speed, cost, provider, or model
|
|
|
386
386
|
|
|
387
387
|
### Qualification boundary
|
|
388
388
|
|
|
389
|
-
The 0.6.7 release ships the `omb a` alias for the agents view, an interactive Ink progress panel for `omb update`, and a live Server-Sent Events chat stream with connection status in the dashboard, published on [npm](https://www.npmjs.com/package/@polderlabs/bizar-omp) and available as a [GitHub release](https://github.com/
|
|
389
|
+
The 0.6.7 release ships the `omb a` alias for the agents view, an interactive Ink progress panel for `omb update`, and a live Server-Sent Events chat stream with connection status in the dashboard, published on [npm](https://www.npmjs.com/package/@polderlabs/bizar-omp) and available as a [GitHub release](https://github.com/PolderLabs/BizarHarness-OMP/releases/tag/v0.6.7).
|
|
390
390
|
|
|
391
391
|
The release does not claim OS sandboxing, provider model quality, universal native task or eval interception, automatic cleanup of an unqualified native isolation backend, or Claude Code/AO compatibility. See the [support matrix](docs/releases/support-matrix.md) for the current boundary.
|
|
392
392
|
|
|
@@ -394,10 +394,10 @@ The release does not claim OS sandboxing, provider model quality, universal nati
|
|
|
394
394
|
|
|
395
395
|
| Component | Qualified baseline |
|
|
396
396
|
| --- | --- |
|
|
397
|
-
| OMP | 18.2.
|
|
397
|
+
| OMP | 18.2.8, with 18.2.6, 18.2.5, and 18.2.4 regression-qualified |
|
|
398
398
|
| Node.js | 22.x and 24.x |
|
|
399
399
|
| Bun | 1.3.14 compatibility job |
|
|
400
|
-
| Package | `@polderlabs/bizar-omp@0.6.
|
|
400
|
+
| Package | `@polderlabs/bizar-omp@0.6.8` |
|
|
401
401
|
|
|
402
402
|
Upstream OMP changes require a new compatibility baseline and contract run. The package does not widen a version range to hide an unqualified runtime.
|
|
403
403
|
|
package/dist/cli/doctor.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export declare function doctor(cwd?: string): {
|
|
|
7
7
|
invalidLines: number;
|
|
8
8
|
};
|
|
9
9
|
omp: {
|
|
10
|
-
readonly version: "18.2.
|
|
11
|
-
readonly commit: "
|
|
10
|
+
readonly version: "18.2.8";
|
|
11
|
+
readonly commit: "5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c";
|
|
12
12
|
};
|
|
13
13
|
bun: string;
|
|
14
14
|
multiplexer: {
|
|
@@ -18,8 +18,8 @@ export declare function doctor(cwd?: string): {
|
|
|
18
18
|
};
|
|
19
19
|
compatibility: {
|
|
20
20
|
supportedBaseline: {
|
|
21
|
-
readonly version: "18.2.
|
|
22
|
-
readonly commit: "
|
|
21
|
+
readonly version: "18.2.8";
|
|
22
|
+
readonly commit: "5e0fc867f8a58dfe8812b5e99b2e7b6a0313da6c";
|
|
23
23
|
};
|
|
24
24
|
bun: string;
|
|
25
25
|
probe: import("../omp/compatibility.js").RuntimeProbe;
|
package/dist/cli/update-ink.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from "react";
|
|
1
2
|
import { type UpdateReport, type UpdateServices } from "./omb-update.js";
|
|
2
3
|
export type UpdateStageState = "pending" | "running" | "ok" | "failed";
|
|
3
4
|
export declare const UPDATE_STAGE_KEYS: readonly ["checking", "installing", "refreshing"];
|
|
@@ -37,7 +38,7 @@ interface UpdateUiProps {
|
|
|
37
38
|
* Repainted by the caller on every stage transition. Ctrl+C exits through Ink's
|
|
38
39
|
* own handler and is re-bound here so the panel is never a keyboard trap.
|
|
39
40
|
*/
|
|
40
|
-
export declare function UpdateUi({ progress, report }: UpdateUiProps):
|
|
41
|
+
export declare function UpdateUi({ progress, report }: UpdateUiProps): React.JSX.Element;
|
|
41
42
|
/**
|
|
42
43
|
* Render the interactive update view and return its exit code. Ink repaints on
|
|
43
44
|
* every stage transition; the final frame carries the outcome summary.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-ink.d.ts","sourceRoot":"","sources":["../../src/cli/update-ink.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update-ink.d.ts","sourceRoot":"","sources":["../../src/cli/update-ink.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAA+C,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEvE,eAAO,MAAM,iBAAiB,YAAI,UAAU,EAAE,YAAY,EAAE,YAAY,CAAU,CAAC;AACnF,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI9D,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAK/D,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAWhE;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AASD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GACnD,OAAO,CAAC,eAAe,CAAC,CA4F1B;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/E;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,qBAqC3D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAA;CAAO,GACzE,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/core/acceptance.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"acceptance.d.ts","sourceRoot":"","sources":["../../src/core/acceptance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAkB,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEhH,MAAM,MAAM,qBAAqB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,yBAAyB,GAAG,qBAAqB,GAAG,wBAAwB,GAAG,cAAc,GAAG,eAAe,GAAG,eAAe,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;AACtT,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAAE;AACpJ,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB;AACD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAOxD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAgB9G;AAQD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,sBAAsB,GAAG,kBAAkB,CAuCjH"}
|
package/dist/core/acceptance.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { ContractError } from "./errors.js";
|
|
3
|
+
import { SECRET_NAME } from "./redaction.js";
|
|
3
4
|
export function canonicalSpecHash(value) {
|
|
4
5
|
const normalize = (input) => {
|
|
5
6
|
if (Array.isArray(input))
|
|
@@ -11,9 +12,21 @@ export function canonicalSpecHash(value) {
|
|
|
11
12
|
return createHash("sha256").update(JSON.stringify(normalize(value))).digest("hex");
|
|
12
13
|
}
|
|
13
14
|
export function freezeCheckSpec(spec) {
|
|
15
|
+
// R005: reject secret-shaped literals UNLESS the value side is a redaction marker.
|
|
14
16
|
const serialized = JSON.stringify(spec);
|
|
15
|
-
if (/(?:authorization|api[-_]?key|access[-_]?key|token|secret|password)\s*[:=]/i.test(serialized))
|
|
17
|
+
if (/(?:authorization|api[-_]?key|access[-_]?key|token|secret|password)\s*[:=]\s*(?!\[REDACTED\])/i.test(serialized))
|
|
16
18
|
throw new ContractError("CheckSpec contains a secret-shaped literal");
|
|
19
|
+
// R005 split-argv scan: SECRET_NAME flag followed by a value that does not look
|
|
20
|
+
// like a redaction marker is rejected. This catches `--token VALUE` style leaks
|
|
21
|
+
// that the JSON regex misses.
|
|
22
|
+
const REDACTED = /\[REDACTED\]/;
|
|
23
|
+
for (let i = 0; i < spec.argumentTemplate.length - 1; i++) {
|
|
24
|
+
const flag = spec.argumentTemplate[i];
|
|
25
|
+
const value = spec.argumentTemplate[i + 1];
|
|
26
|
+
if (typeof flag === "string" && SECRET_NAME.test(flag) && typeof value === "string" && !REDACTED.test(value)) {
|
|
27
|
+
throw new ContractError("CheckSpec contains a secret-shaped argument value", { flag });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
17
30
|
return Object.freeze({ ...spec, evaluatorHash: spec.evaluatorHash ?? canonicalSpecHash({ runner: spec.runner, executable: spec.executable, argumentTemplate: spec.argumentTemplate, cwdRule: spec.cwdRule, inputDigests: spec.inputDigests, environmentPolicy: spec.environmentPolicy, limits: spec.limits, expected: spec.expected, outputPolicy: spec.outputPolicy }) });
|
|
18
31
|
}
|
|
19
32
|
function candidateMatch(record, requirements) {
|
|
@@ -61,9 +74,10 @@ export function evaluateAcceptance(state, requirements) {
|
|
|
61
74
|
coveredCriterionIds.add(criterion.id);
|
|
62
75
|
}
|
|
63
76
|
if (requirements.review?.required) {
|
|
64
|
-
const
|
|
77
|
+
const spec = requirements.review;
|
|
78
|
+
const review = state.evidence.filter(record => record.type === "review" && candidateMatch(record, requirements) && record.checkId === spec.id && (!record.reviewRevision || record.reviewRevision === spec.revision)).sort((a, b) => (a.attemptGeneration ?? 0) - (b.attemptGeneration ?? 0) || a.recordedAt.localeCompare(b.recordedAt)).at(-1);
|
|
65
79
|
if (!review || review.result !== "passed" || review.stale)
|
|
66
|
-
blockers.push({ code: "REQUIRED_REVIEW_MISSING", message: `Required review ${
|
|
80
|
+
blockers.push({ code: "REQUIRED_REVIEW_MISSING", message: `Required review ${spec.id}@r${spec.revision} is missing, wrong identity/revision, or not passing` });
|
|
67
81
|
else
|
|
68
82
|
selectedEvidenceIds.push(review.id);
|
|
69
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../src/core/acceptance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"acceptance.js","sourceRoot":"","sources":["../../src/core/acceptance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyB7E,wBAAgB,aAAa,IAAI,aAAa,CAA+I;AAE7L,wBAAgB,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,aAAa,CAqC7D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE9E;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAE7E;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,GAAG,aAAa,CAI/I"}
|
package/dist/core/recovery.js
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
import { ContractError, OwnershipError } from "./errors.js";
|
|
2
|
-
|
|
2
|
+
import { objectiveHash } from "./policies.js";
|
|
3
|
+
const terminalDispatchStatuses = new Set(["settled", "failed", "cancelled", "unknown-outcome", "rejected"]);
|
|
4
|
+
function advanceDispatch(state, event) {
|
|
5
|
+
const current = state.dispatches.find(intent => intent.id === event.dispatch.id);
|
|
6
|
+
if (!current)
|
|
7
|
+
throw new ContractError("Dispatch state change references unknown dispatch", { dispatchId: event.dispatch.id });
|
|
8
|
+
if (event.observed.dispatchId !== event.dispatch.id)
|
|
9
|
+
throw new ContractError("Dispatch observation identity mismatch", { dispatchId: event.dispatch.id, observationDispatchId: event.observed.dispatchId });
|
|
10
|
+
// R011: only `status` and the documented settlement fields may mutate. Native
|
|
11
|
+
// lifecycle fields (nativeCallId, nativeChildId, candidateId, candidateTree) are
|
|
12
|
+
// populated by reconcileResult at settlement, so they are excluded from the
|
|
13
|
+
// immutable lock here. Everything else is structural identity and must reject.
|
|
14
|
+
for (const field of ["runId", "runRevision", "workItemId", "idempotencyKey", "requestedAgent", "scope", "acceptanceCriteria", "isolation", "apply", "merge", "routeClass", "routeIntent", "modelRole"]) {
|
|
15
|
+
if (JSON.stringify(event.dispatch[field]) !== JSON.stringify(current[field]))
|
|
16
|
+
throw new ContractError("Dispatch state change mutates immutable identity", { dispatchId: current.id, field });
|
|
17
|
+
}
|
|
18
|
+
const allowed = current.status === "admitted" ? new Set(["acknowledged", "settled", "failed", "cancelled", "unknown-outcome", "rejected"]) : current.status === "acknowledged" ? terminalDispatchStatuses : new Set();
|
|
19
|
+
if (!allowed.has(event.dispatch.status))
|
|
20
|
+
throw new ContractError("Dispatch state transition is not monotonic", { dispatchId: current.id, from: current.status, to: event.dispatch.status });
|
|
21
|
+
state.dispatches = [...state.dispatches.filter(intent => intent.id !== current.id), event.dispatch];
|
|
22
|
+
state.observations.push(event.observed);
|
|
23
|
+
if (state.run) {
|
|
24
|
+
const lifecycle = event.dispatch.status === "settled" ? "settled" : terminalDispatchStatuses.has(event.dispatch.status) ? "rejected" : "running";
|
|
25
|
+
state.run = { ...state.run, workItems: state.run.workItems.map(item => item.id === current.workItemId ? { ...item, lifecycle } : item), updatedAt: event.observed.observedAt };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function emptySnapshot() { return { revision: 0, dispatches: [], observations: [], evidence: [], integrations: [], acceptances: [], decisions: [], lastSequence: 0 }; }
|
|
3
29
|
export function replay(entries) {
|
|
4
30
|
const state = emptySnapshot();
|
|
5
31
|
for (const entry of entries) {
|
|
@@ -12,6 +38,7 @@ export function replay(entries) {
|
|
|
12
38
|
state.observations = [];
|
|
13
39
|
state.evidence = [];
|
|
14
40
|
state.integrations = [];
|
|
41
|
+
state.acceptances = [];
|
|
15
42
|
state.decisions = [];
|
|
16
43
|
}
|
|
17
44
|
else if (event.type === "run.transitioned" && state.run?.runId === event.runId) {
|
|
@@ -20,15 +47,37 @@ export function replay(entries) {
|
|
|
20
47
|
else if (event.type === "work-item.upserted" && state.run?.runId === event.runId)
|
|
21
48
|
state.run = { ...state.run, workItems: [...state.run.workItems.filter(i => i.id !== event.item.id), event.item], revision: state.run.revision + 1, updatedAt: entry.at };
|
|
22
49
|
else if (event.type === "dispatch.recorded" && state.run?.runId === event.runId)
|
|
23
|
-
state.dispatches.
|
|
24
|
-
else if (event.type === "
|
|
50
|
+
state.dispatches = [...state.dispatches.filter(intent => intent.id !== event.intent.id), event.intent];
|
|
51
|
+
else if (event.type === "dispatch.state_changed" && state.run?.runId === event.runId)
|
|
52
|
+
advanceDispatch(state, event);
|
|
53
|
+
else if (event.type === "worker.observed" && state.run?.runId === event.runId) {
|
|
54
|
+
if (!state.dispatches.some(intent => intent.id === event.observation.dispatchId))
|
|
55
|
+
throw new ContractError("Worker observation references unknown dispatch", { dispatchId: event.observation.dispatchId });
|
|
25
56
|
state.observations.push(event.observation);
|
|
57
|
+
}
|
|
58
|
+
else if (event.type === "worker.observed") { /* stale-run observation: silently ignored */ }
|
|
26
59
|
else if (event.type === "evidence.recorded" && state.run?.runId === event.runId)
|
|
27
60
|
state.evidence.push(event.evidence);
|
|
61
|
+
else if (event.type === "acceptance.recorded" && state.run?.runId === event.runId)
|
|
62
|
+
state.acceptances = [...state.acceptances.filter(receipt => receipt.workItemId !== event.receipt.workItemId || receipt.workRevision !== event.receipt.workRevision), event.receipt];
|
|
28
63
|
else if (event.type === "integration.recorded" && state.run?.runId === event.runId)
|
|
29
64
|
state.integrations = [...state.integrations.filter(attempt => attempt.id !== event.attempt.id), event.attempt];
|
|
30
65
|
else if (event.type === "decision.recorded" && state.run?.runId === event.runId)
|
|
31
66
|
state.decisions.push(event.decision);
|
|
67
|
+
else if (event.type === "objective.amended" && state.run?.runId === event.runId) {
|
|
68
|
+
const prior = state.run.objective;
|
|
69
|
+
const idsFor = (by) => by === "check-spec" ? prior.checkSpecs?.map(spec => spec.id) ?? prior.verificationPlan : prior.criteria?.map(criterion => criterion.id) ?? [];
|
|
70
|
+
const amendedIdsFor = (by, candidate) => by === "check-spec" ? candidate.checkSpecs?.map(spec => spec.id) ?? candidate.verificationPlan : candidate.criteria?.map(criterion => criterion.id) ?? [];
|
|
71
|
+
const priorIds = new Set(idsFor(event.by));
|
|
72
|
+
const amendedIds = new Set(amendedIdsFor(event.by, event.objective));
|
|
73
|
+
const actualAdded = [...amendedIds].filter(id => !priorIds.has(id)).sort();
|
|
74
|
+
const actualRemoved = [...priorIds].filter(id => !amendedIds.has(id)).sort();
|
|
75
|
+
if (event.added.length !== actualAdded.length || event.added.some((id, index) => id !== actualAdded[index]))
|
|
76
|
+
throw new ContractError("objective.amended added delta does not match the new objective", { claimed: event.added, actual: actualAdded });
|
|
77
|
+
if (event.removed.length !== actualRemoved.length || event.removed.some((id, index) => id !== actualRemoved[index]))
|
|
78
|
+
throw new ContractError("objective.amended removed delta does not match the prior objective", { claimed: event.removed, actual: actualRemoved });
|
|
79
|
+
state.run = { ...state.run, objective: event.objective, objectiveHash: objectiveHash(event.objective), revision: state.run.revision + 1, updatedAt: entry.at };
|
|
80
|
+
}
|
|
32
81
|
else if (event.type === "run.cancelled" && state.run?.runId === event.runId)
|
|
33
82
|
state.run = { ...state.run, phase: "cancelled", cancellation: { requested: true, reason: event.reason }, revision: state.run.revision + 1, updatedAt: entry.at };
|
|
34
83
|
else if (event.type === "run.reconciled" && state.run?.runId === event.runId)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../src/core/recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CheckSpec } from "./types.js";
|
|
2
|
+
export declare const SECRET_NAME: RegExp;
|
|
3
|
+
export declare const SAFE_ENVIRONMENT: Set<string>;
|
|
4
|
+
export interface RedactionResult {
|
|
5
|
+
redacted: string;
|
|
6
|
+
changed: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function tryRedactStructured(value: string): RedactionResult;
|
|
9
|
+
export declare function redactText(value: string): string;
|
|
10
|
+
export declare function redact(value: string): {
|
|
11
|
+
redacted: string;
|
|
12
|
+
changed: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function bounded(value: string | undefined, limit: number): string;
|
|
15
|
+
export declare function redactArgv(argv: readonly string[]): string[];
|
|
16
|
+
export declare function safeEnvironment(env: NodeJS.ProcessEnv): Record<string, string>;
|
|
17
|
+
export declare function persistedCommand(spec: CheckSpec): string[];
|
|
18
|
+
export declare function enforceOutputPolicy(spec: CheckSpec, stdout: string, stderr: string): {
|
|
19
|
+
stdout: string;
|
|
20
|
+
stderr: string;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../src/core/redaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,WAAW,QAAmG,CAAC;AAC5H,eAAO,MAAM,gBAAgB,aAE3B,CAAC;AAEH,MAAM,WAAW,eAAe;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;CAAE;AAUxE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,CAsBlE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAK5E;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxE;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAO5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI9E;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,CAG1D;AAGD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAQvH"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export const SECRET_NAME = /(?:authorization|api[-_]?key|access[-_]?key|token|secret|password|credential|private[-_]?key)/i;
|
|
3
|
+
export const SAFE_ENVIRONMENT = new Set([
|
|
4
|
+
"CI", "FORCE_COLOR", "HOME", "LANG", "LC_ALL", "LC_CTYPE", "NO_COLOR", "PATH", "SHELL", "TERM", "TMP", "TEMP", "TMPDIR", "TZ"
|
|
5
|
+
]);
|
|
6
|
+
// Try structured JSON/YAML/header redaction first; fall back to text. R005 must catch:
|
|
7
|
+
// - JSON/YAML credentials,
|
|
8
|
+
// - Authorization / Bearer headers,
|
|
9
|
+
// - URL query credentials,
|
|
10
|
+
// - split argv ("--token VALUE"),
|
|
11
|
+
// - multiline private-key blocks,
|
|
12
|
+
// - exception messages,
|
|
13
|
+
// - output truncation boundaries.
|
|
14
|
+
export function tryRedactStructured(value) {
|
|
15
|
+
const trimmed = value.trim();
|
|
16
|
+
if (!trimmed.startsWith("{") && !trimmed.startsWith("["))
|
|
17
|
+
return { redacted: value, changed: false };
|
|
18
|
+
try {
|
|
19
|
+
const parsed = JSON.parse(trimmed);
|
|
20
|
+
let changed = false;
|
|
21
|
+
const walk = (key, v) => {
|
|
22
|
+
if (typeof v === "string") {
|
|
23
|
+
if (SECRET_NAME.test(key)) {
|
|
24
|
+
changed = true;
|
|
25
|
+
return "[REDACTED]";
|
|
26
|
+
}
|
|
27
|
+
// redact "Authorization: Bearer ..." patterns nested in JSON strings
|
|
28
|
+
const replaced = v
|
|
29
|
+
.replace(/Authorization\s*:\s*Bearer\s+[A-Za-z0-9._~+/-]+/gi, "Authorization: Bearer [REDACTED]")
|
|
30
|
+
.replace(/Authorization\s*:\s*[^\r\n,}\]]+/gi, "Authorization: [REDACTED]");
|
|
31
|
+
if (replaced !== v)
|
|
32
|
+
changed = true;
|
|
33
|
+
return replaced;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(v))
|
|
36
|
+
return v.map(item => walk(key, item));
|
|
37
|
+
if (v && typeof v === "object")
|
|
38
|
+
return Object.fromEntries(Object.entries(v).map(([k, val]) => [k, walk(k, val)]));
|
|
39
|
+
return v;
|
|
40
|
+
};
|
|
41
|
+
return { redacted: JSON.stringify(walk("", parsed), null, 2), changed };
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return { redacted: value, changed: false };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function redactText(value) {
|
|
48
|
+
return value
|
|
49
|
+
.replace(/"(api[_-]?key|access[_-]?key|token|secret|password|credential|private[_-]?key)"\s*:\s*"(?:[^"\\]|\\.)*"/gi, '"$1":"[REDACTED]"')
|
|
50
|
+
.replace(/'(api[_-]?key|access[_-]?key|token|secret|password|credential|private[_-]?key)'\s*:\s*'(?:[^'\\]|\\.)*'/gi, "'$1':'[REDACTED]'")
|
|
51
|
+
.replace(/"(authorization)"\s*:\s*"(?:[^"\\]|\\.)*"/gi, '"$1":"[REDACTED]"')
|
|
52
|
+
.replace(/([Aa]uthorization)\s*:\s*Bearer\s+[A-Za-z0-9._~+/-]+/g, "$1: Bearer [REDACTED]")
|
|
53
|
+
.replace(/([Aa]uthorization)\s*:\s*[^\r\n,}\]]+/g, "$1: [REDACTED]")
|
|
54
|
+
.replace(/(authorization|api[-_]?key|access[-_]?key|token|secret|password|credential|private[-_]?key)\s*[:=]\s*[^\s,;"'}]+/gi, "$1=[REDACTED]")
|
|
55
|
+
.replace(/([?&](?:token|secret|api[-_]?key|password|key)=)[^&\s]+/gi, "$1[REDACTED]")
|
|
56
|
+
.replace(/Bearer\s+[A-Za-z0-9._~+/-]+/gi, "Bearer [REDACTED]")
|
|
57
|
+
.replace(/-----BEGIN ([A-Z ]+ KEY)-----[\s\S]*?-----END \1-----/g, "-----BEGIN $1-----[REDACTED]-----END $1-----");
|
|
58
|
+
}
|
|
59
|
+
export function redact(value) {
|
|
60
|
+
const structured = tryRedactStructured(value);
|
|
61
|
+
if (structured.changed)
|
|
62
|
+
return structured;
|
|
63
|
+
const text = redactText(value);
|
|
64
|
+
return { redacted: text, changed: text !== value };
|
|
65
|
+
}
|
|
66
|
+
export function bounded(value, limit) {
|
|
67
|
+
const safe = redact(value ?? "").redacted;
|
|
68
|
+
return safe.length > limit ? `[TRUNCATED]\n${safe.slice(-limit)}` : safe;
|
|
69
|
+
}
|
|
70
|
+
// Split-argv credential detection: when an argv entry's left neighbor is a
|
|
71
|
+
// secret-shaped flag, redact the value side. R005 canary.
|
|
72
|
+
export function redactArgv(argv) {
|
|
73
|
+
return argv.map((entry, index) => {
|
|
74
|
+
const prev = argv[index - 1];
|
|
75
|
+
if (prev && SECRET_NAME.test(prev.replace(/^-+/, "")))
|
|
76
|
+
return "[REDACTED]";
|
|
77
|
+
if (index > 0 && SECRET_NAME.test(entry.split("=", 1)[0] ?? ""))
|
|
78
|
+
return redact(entry).redacted;
|
|
79
|
+
return redact(entry).redacted;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export function safeEnvironment(env) {
|
|
83
|
+
return Object.fromEntries(Object.entries(env).filter(([name]) => SAFE_ENVIRONMENT.has(name)).map(([name, value]) => [name, value ?? ""]));
|
|
84
|
+
}
|
|
85
|
+
// Persisted-command builder used by host and candidate verification. R005:
|
|
86
|
+
// never write raw argv before sanitization.
|
|
87
|
+
export function persistedCommand(spec) {
|
|
88
|
+
if (spec.executable && spec.executable.trim())
|
|
89
|
+
return redactArgv([spec.executable, ...spec.argumentTemplate]);
|
|
90
|
+
return redactArgv(spec.argumentTemplate);
|
|
91
|
+
}
|
|
92
|
+
// outputPolicy enforcement. R005: enforce structured-pass and artifact-reference modes.
|
|
93
|
+
export function enforceOutputPolicy(spec, stdout, stderr) {
|
|
94
|
+
if (spec.outputPolicy === "none")
|
|
95
|
+
return { stdout: "", stderr: "" };
|
|
96
|
+
if (spec.outputPolicy === "artifact-reference") {
|
|
97
|
+
const hash = createHash("sha256").update(stdout).update(stderr).digest("hex");
|
|
98
|
+
const ref = `[OUTPUT-ARTIFACT sha256:${hash}]`;
|
|
99
|
+
return { stdout: ref, stderr: "" };
|
|
100
|
+
}
|
|
101
|
+
return { stdout: bounded(stdout, spec.limits.outputBytes), stderr: bounded(stderr, spec.limits.outputBytes) };
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../src/core/redaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { EvidenceRecord, JournalEvent, ObjectiveContract, RouteClass, WorkflowPhase, WorkflowRun, WorkItem } from "./types.js";
|
|
1
|
+
import type { CheckSpec, EvidenceRecord, JournalEvent, ObjectiveContract, RouteClass, WorkflowPhase, WorkflowRun, WorkItem } from "./types.js";
|
|
2
|
+
export declare function freezeObjective(objective: ObjectiveContract): ObjectiveContract;
|
|
2
3
|
export declare function createRun(projectId: string, objective: ObjectiveContract, mode?: RouteClass, nativeSessionId?: string): WorkflowRun;
|
|
3
4
|
export declare function addWorkItem(run: WorkflowRun, input: Omit<WorkItem, "id" | "revision" | "lifecycle" | "attempt">): WorkflowRun;
|
|
4
5
|
export declare function transition(run: WorkflowRun, to: WorkflowPhase, reason: string): {
|
|
@@ -6,9 +7,9 @@ export declare function transition(run: WorkflowRun, to: WorkflowPhase, reason:
|
|
|
6
7
|
event: JournalEvent;
|
|
7
8
|
};
|
|
8
9
|
export declare function acceptWorkItem(run: WorkflowRun, workItemId: string): WorkflowRun;
|
|
9
|
-
export declare function canComplete(run: WorkflowRun, requiredChecks: string[], evidence: Pick<EvidenceRecord, "checkId" | "result" | "stale" | "targetDigest">[], ownedWork: WorkItem[], targetDigest: string): boolean;
|
|
10
10
|
export declare function completeRun(run: WorkflowRun, requiredChecks: string[], evidence: EvidenceRecord[], targetDigest: string): {
|
|
11
11
|
run: WorkflowRun;
|
|
12
12
|
event: JournalEvent;
|
|
13
13
|
};
|
|
14
|
+
export declare function canComplete(run: WorkflowRun, requiredChecks: Array<string | CheckSpec>, evidence: Pick<EvidenceRecord, "checkId" | "result" | "stale" | "targetDigest">[], ownedWork: WorkItem[], targetDigest: string): boolean;
|
|
14
15
|
//# sourceMappingURL=transitions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transitions.d.ts","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAiB,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAiB9J,wBAAgB,eAAe,CAAC,SAAS,EAAE,iBAAiB,GAAG,iBAAiB,CAW/E;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW,CAGnI;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC,GAAG,WAAW,CAK7H;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAKzH;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAMhF;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAenK;AACD,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAGhO"}
|
package/dist/core/transitions.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { validateDependencies } from "../services/readiness.js";
|
|
1
2
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
3
|
import { InvalidTransitionError, ContractError } from "./errors.js";
|
|
3
4
|
import { classifyRoute, objectiveHash } from "./policies.js";
|
|
4
|
-
import { evaluateAcceptance } from "./acceptance.js";
|
|
5
|
+
import { evaluateAcceptance, freezeCheckSpec } from "./acceptance.js";
|
|
5
6
|
const now = () => new Date().toISOString();
|
|
6
7
|
const phaseTransitions = {
|
|
7
8
|
created: ["orienting", "planning", "researching", "executing", "blocked", "cancelled"],
|
|
@@ -16,15 +17,28 @@ const phaseTransitions = {
|
|
|
16
17
|
complete: [], blocked: ["orienting", "planning", "executing", "verifying", "cancelled"],
|
|
17
18
|
failed: ["orienting", "planning", "executing", "cancelled"], cancelled: [],
|
|
18
19
|
};
|
|
19
|
-
export function
|
|
20
|
+
export function freezeObjective(objective) {
|
|
20
21
|
if (!objective.objective.trim() || objective.acceptanceCriteria.length === 0)
|
|
21
22
|
throw new ContractError("Objective and acceptance criteria are required");
|
|
22
|
-
|
|
23
|
+
const criteria = objective.criteria
|
|
24
|
+
? objective.criteria.map((criterion, index) => ({ ...criterion, id: criterion.id || `criterion:${index + 1}`, revision: criterion.revision || 1, requiredEvidenceClasses: [...criterion.requiredEvidenceClasses] }))
|
|
25
|
+
: objective.acceptanceCriteria.map((description, index) => ({ id: `criterion:${index + 1}`, revision: 1, description, kind: "operator-judgment", requiredEvidenceClasses: [], applicable: true }));
|
|
26
|
+
return {
|
|
27
|
+
...objective,
|
|
28
|
+
nonGoals: [...objective.nonGoals], constraints: [...objective.constraints], acceptanceCriteria: [...objective.acceptanceCriteria], verificationPlan: [...objective.verificationPlan], stopConditions: [...objective.stopConditions], userRestrictions: [...objective.userRestrictions],
|
|
29
|
+
criteria,
|
|
30
|
+
checkSpecs: objective.checkSpecs?.map(spec => freezeCheckSpec({ ...spec, argumentTemplate: [...spec.argumentTemplate], inputDigests: { ...spec.inputDigests }, limits: { ...spec.limits } })),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function createRun(projectId, objective, mode, nativeSessionId) {
|
|
34
|
+
const frozen = freezeObjective(objective);
|
|
35
|
+
return { schemaVersion: 1, runId: `run_${randomUUID()}`, projectId, nativeSessionId, objective: frozen, objectiveHash: objectiveHash(frozen), revision: 0, mode: mode ?? classifyRoute({ text: frozen.objective }).routeClass, phase: "created", workItems: [], cancellation: { requested: false }, createdAt: now(), updatedAt: now() };
|
|
23
36
|
}
|
|
24
37
|
export function addWorkItem(run, input) {
|
|
25
38
|
if (run.workItems.some(item => item.title === input.title))
|
|
26
39
|
throw new ContractError(`Duplicate work item: ${input.title}`);
|
|
27
40
|
const item = { ...input, id: `work_${createHash("sha256").update(`${run.runId}:${input.title}`).digest("hex").slice(0, 12)}`, revision: 0, lifecycle: "pending", attempt: 0 };
|
|
41
|
+
validateDependencies([...run.workItems, item]);
|
|
28
42
|
return { ...run, revision: run.revision + 1, workItems: [...run.workItems, item], updatedAt: now() };
|
|
29
43
|
}
|
|
30
44
|
export function transition(run, to, reason) {
|
|
@@ -44,16 +58,28 @@ export function acceptWorkItem(run, workItemId) {
|
|
|
44
58
|
const accepted = { ...item, lifecycle: "accepted", revision: item.revision + 1 };
|
|
45
59
|
return { ...run, revision: run.revision + 1, workItems: run.workItems.map(candidate => candidate.id === item.id ? accepted : candidate), updatedAt: now() };
|
|
46
60
|
}
|
|
47
|
-
export function canComplete(run, requiredChecks, evidence, ownedWork, targetDigest) {
|
|
48
|
-
const normalized = evidence.map((item, index) => ({ ...item, id: `legacy-evidence-${index}`, runId: run.runId, type: "test", inputDigests: {}, artifactHashes: [], provenance: { producer: "legacy", observedAt: "unknown" }, recordedAt: String(index) }));
|
|
49
|
-
return evaluateAcceptance({ revision: run.revision, run, dispatches: [], observations: [], evidence: normalized, integrations: [], decisions: [], lastSequence: 0 }, { requiredChecks, targetDigest, ownedWork }).eligible && run.phase !== "failed";
|
|
50
|
-
}
|
|
51
61
|
export function completeRun(run, requiredChecks, evidence, targetDigest) {
|
|
52
|
-
|
|
62
|
+
// A002: completion derives mandatory checks from the admitted objective
|
|
63
|
+
// contract. The caller-supplied requiredChecks are advisory only; the
|
|
64
|
+
// admitted contract cannot be bypassed. Weakening requires an explicit
|
|
65
|
+
// objective.amended event.
|
|
66
|
+
const admittedChecks = run.objective.checkSpecs?.length ? run.objective.checkSpecs : run.objective.verificationPlan;
|
|
67
|
+
if (admittedChecks.length === 0)
|
|
68
|
+
throw new ContractError("Completion requires a nonempty admitted verification plan");
|
|
69
|
+
// A002: reject when the caller attempts to weaken the admitted contract by
|
|
70
|
+
// supplying a strict subset that omits any admitted check.
|
|
71
|
+
const admittedIds = new Set(admittedChecks.map(check => typeof check === "string" ? check : check.id));
|
|
72
|
+
if (requiredChecks.some(check => !admittedIds.has(check)))
|
|
73
|
+
throw new ContractError("requiredChecks must be a subset of the admitted verification plan", { requiredChecks, admittedChecks: [...admittedIds] });
|
|
74
|
+
if (!canComplete(run, admittedChecks, evidence, run.workItems, targetDigest))
|
|
53
75
|
throw new ContractError("Completion requires fresh checks for the current tree and no outstanding work");
|
|
54
76
|
if (!["executing", "verifying", "reviewing"].includes(run.phase))
|
|
55
77
|
throw new InvalidTransitionError(run.phase, "complete");
|
|
56
78
|
const next = { ...run, phase: "complete", revision: run.revision + 1, updatedAt: now() };
|
|
57
79
|
return { run: next, event: { type: "run.transitioned", runId: run.runId, from: run.phase, to: "complete", reason: "completion checks satisfied" } };
|
|
58
80
|
}
|
|
81
|
+
export function canComplete(run, requiredChecks, evidence, ownedWork, targetDigest) {
|
|
82
|
+
const normalized = evidence.map((item, index) => ({ ...item, id: `legacy-evidence-${index}`, runId: run.runId, type: "test", inputDigests: {}, artifactHashes: [], provenance: { producer: "legacy", observedAt: "unknown" }, recordedAt: String(index) }));
|
|
83
|
+
return evaluateAcceptance({ revision: run.revision, run, dispatches: [], observations: [], evidence: normalized, integrations: [], acceptances: [], decisions: [], lastSequence: 0 }, { requiredChecks, targetDigest, ownedWork, criteria: run.objective.criteria, review: run.objective.reviewSpec }).eligible && run.phase !== "failed";
|
|
84
|
+
}
|
|
59
85
|
//# sourceMappingURL=transitions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"transitions.js","sourceRoot":"","sources":["../../src/core/transitions.ts"],"names":[],"mappings":"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"}
|