audit-tools 0.32.44 → 0.32.46
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/dist/audit/cli/args.d.ts.map +1 -1
- package/dist/audit/cli/args.js +2 -4
- package/dist/audit/cli/args.js.map +1 -1
- package/dist/audit/cli/auditStep.d.ts +1 -1
- package/dist/audit/cli/dispatch.d.ts +1 -0
- package/dist/audit/cli/dispatch.d.ts.map +1 -1
- package/dist/audit/cli/dispatch.js +39 -18
- package/dist/audit/cli/dispatch.js.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.d.ts +41 -0
- package/dist/audit/cli/mergeAndIngestCommand.d.ts.map +1 -1
- package/dist/audit/cli/mergeAndIngestCommand.js +105 -18
- package/dist/audit/cli/mergeAndIngestCommand.js.map +1 -1
- package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
- package/dist/audit/cli/nextStepCommand.js +3 -3
- package/dist/audit/cli/nextStepCommand.js.map +1 -1
- package/dist/audit/cli/nextStepHelpers.d.ts +23 -38
- package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
- package/dist/audit/cli/nextStepHelpers.js +130 -89
- package/dist/audit/cli/nextStepHelpers.js.map +1 -1
- package/dist/audit/cli/ownerTokens.d.ts +21 -0
- package/dist/audit/cli/ownerTokens.d.ts.map +1 -0
- package/dist/audit/cli/ownerTokens.js +86 -0
- package/dist/audit/cli/ownerTokens.js.map +1 -0
- package/dist/audit/cli/resynthesizeCommand.d.ts.map +1 -1
- package/dist/audit/cli/resynthesizeCommand.js +8 -10
- package/dist/audit/cli/resynthesizeCommand.js.map +1 -1
- package/dist/audit/cli/rollingAuditDispatch.d.ts.map +1 -1
- package/dist/audit/cli/rollingAuditDispatch.js +9 -22
- package/dist/audit/cli/rollingAuditDispatch.js.map +1 -1
- package/dist/audit/contracts/wrapperResponse.d.ts +6 -6
- package/dist/audit/extractors/gitHistory.d.ts.map +1 -1
- package/dist/audit/extractors/gitHistory.js +3 -0
- package/dist/audit/extractors/gitHistory.js.map +1 -1
- package/dist/audit/orchestrator/advance.d.ts +4 -1
- package/dist/audit/orchestrator/advance.d.ts.map +1 -1
- package/dist/audit/orchestrator/advance.js +185 -36
- package/dist/audit/orchestrator/advance.js.map +1 -1
- package/dist/audit/orchestrator/fileIntegrity.d.ts.map +1 -1
- package/dist/audit/orchestrator/fileIntegrity.js +21 -32
- package/dist/audit/orchestrator/fileIntegrity.js.map +1 -1
- package/dist/audit/orchestrator/reviewPackets.d.ts.map +1 -1
- package/dist/audit/orchestrator/reviewPackets.js +31 -36
- package/dist/audit/orchestrator/reviewPackets.js.map +1 -1
- package/dist/audit/orchestrator/taskBuilder.d.ts.map +1 -1
- package/dist/audit/orchestrator/taskBuilder.js +12 -24
- package/dist/audit/orchestrator/taskBuilder.js.map +1 -1
- package/dist/audit/providers/opencodeProvider.d.ts +1 -4
- package/dist/audit/providers/opencodeProvider.d.ts.map +1 -1
- package/dist/audit/providers/opencodeProvider.js +6 -9
- package/dist/audit/providers/opencodeProvider.js.map +1 -1
- package/dist/audit/reporting/mergeFindings.d.ts.map +1 -1
- package/dist/audit/reporting/mergeFindings.js +1 -32
- package/dist/audit/reporting/mergeFindings.js.map +1 -1
- package/dist/audit/reporting/synthesis.d.ts.map +1 -1
- package/dist/audit/reporting/synthesis.js +1 -12
- package/dist/audit/reporting/synthesis.js.map +1 -1
- package/dist/audit/supervisor/operatorHandoff.d.ts.map +1 -1
- package/dist/audit/supervisor/operatorHandoff.js +9 -12
- package/dist/audit/supervisor/operatorHandoff.js.map +1 -1
- package/dist/audit/supervisor/sessionConfig.d.ts.map +1 -1
- package/dist/audit/supervisor/sessionConfig.js +25 -35
- package/dist/audit/supervisor/sessionConfig.js.map +1 -1
- package/dist/audit/types/auditState.d.ts +6 -6
- package/dist/remediate/dedup/crossLensDedup.d.ts +2 -1
- package/dist/remediate/dedup/crossLensDedup.d.ts.map +1 -1
- package/dist/remediate/dedup/crossLensDedup.js +4 -33
- package/dist/remediate/dedup/crossLensDedup.js.map +1 -1
- package/dist/remediate/index.d.ts +2 -2
- package/dist/remediate/index.d.ts.map +1 -1
- package/dist/remediate/index.js +5 -8
- package/dist/remediate/index.js.map +1 -1
- package/dist/remediate/intake.d.ts.map +1 -1
- package/dist/remediate/intake.js +9 -5
- package/dist/remediate/intake.js.map +1 -1
- package/dist/remediate/phases/close.d.ts +59 -1
- package/dist/remediate/phases/close.d.ts.map +1 -1
- package/dist/remediate/phases/close.js +294 -29
- package/dist/remediate/phases/close.js.map +1 -1
- package/dist/remediate/phases/plan.d.ts +2 -2
- package/dist/remediate/phases/plan.d.ts.map +1 -1
- package/dist/remediate/phases/plan.js +31 -23
- package/dist/remediate/phases/plan.js.map +1 -1
- package/dist/remediate/providers/opencodeProvider.d.ts +1 -4
- package/dist/remediate/providers/opencodeProvider.d.ts.map +1 -1
- package/dist/remediate/providers/opencodeProvider.js +6 -9
- package/dist/remediate/providers/opencodeProvider.js.map +1 -1
- package/dist/remediate/state/store.d.ts +54 -11
- package/dist/remediate/state/store.d.ts.map +1 -1
- package/dist/remediate/state/store.js +37 -64
- package/dist/remediate/state/store.js.map +1 -1
- package/dist/remediate/state/types.d.ts +22 -0
- package/dist/remediate/state/types.d.ts.map +1 -1
- package/dist/remediate/state/types.js +8 -0
- package/dist/remediate/state/types.js.map +1 -1
- package/dist/remediate/steps/dispatch/acceptNode.d.ts +38 -0
- package/dist/remediate/steps/dispatch/acceptNode.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/acceptNode.js +70 -24
- package/dist/remediate/steps/dispatch/acceptNode.js.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.js +30 -0
- package/dist/remediate/steps/dispatch/marshal.js.map +1 -1
- package/dist/remediate/steps/dispatch/worktreeLifecycle.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/worktreeLifecycle.js +42 -8
- package/dist/remediate/steps/dispatch/worktreeLifecycle.js.map +1 -1
- package/dist/remediate/steps/finalGate.d.ts +2 -2
- package/dist/remediate/steps/finalGate.d.ts.map +1 -1
- package/dist/remediate/steps/finalGate.js +8 -9
- package/dist/remediate/steps/finalGate.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts +12 -0
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +57 -35
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/rollingSession.d.ts.map +1 -1
- package/dist/remediate/steps/rollingSession.js +27 -1
- package/dist/remediate/steps/rollingSession.js.map +1 -1
- package/dist/remediate/utils/fileIntegrity.d.ts.map +1 -1
- package/dist/remediate/utils/fileIntegrity.js +29 -33
- package/dist/remediate/utils/fileIntegrity.js.map +1 -1
- package/dist/remediate/utils/hostAssets.d.ts +4 -1
- package/dist/remediate/utils/hostAssets.d.ts.map +1 -1
- package/dist/remediate/utils/hostAssets.js +4 -1
- package/dist/remediate/utils/hostAssets.js.map +1 -1
- package/dist/remediate/validation/artifacts.d.ts.map +1 -1
- package/dist/remediate/validation/artifacts.js +3 -2
- package/dist/remediate/validation/artifacts.js.map +1 -1
- package/dist/remediate/validation/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/validation/contractPipeline.js +3 -1
- package/dist/remediate/validation/contractPipeline.js.map +1 -1
- package/dist/shared/chunkByBudget.d.ts +58 -0
- package/dist/shared/chunkByBudget.d.ts.map +1 -0
- package/dist/shared/chunkByBudget.js +31 -0
- package/dist/shared/chunkByBudget.js.map +1 -0
- package/dist/shared/countBy.d.ts +19 -0
- package/dist/shared/countBy.d.ts.map +1 -0
- package/dist/shared/countBy.js +29 -0
- package/dist/shared/countBy.js.map +1 -0
- package/dist/shared/engine/obligationEngine.d.ts +2 -2
- package/dist/shared/fileIntegrity.d.ts +55 -0
- package/dist/shared/fileIntegrity.d.ts.map +1 -0
- package/dist/shared/fileIntegrity.js +50 -0
- package/dist/shared/fileIntegrity.js.map +1 -0
- package/dist/shared/findingSimilarity.d.ts +26 -0
- package/dist/shared/findingSimilarity.d.ts.map +1 -0
- package/dist/shared/findingSimilarity.js +54 -0
- package/dist/shared/findingSimilarity.js.map +1 -0
- package/dist/shared/friction/stepBoundaryCapture.d.ts +17 -0
- package/dist/shared/friction/stepBoundaryCapture.d.ts.map +1 -1
- package/dist/shared/friction/stepBoundaryCapture.js +21 -0
- package/dist/shared/friction/stepBoundaryCapture.js.map +1 -1
- package/dist/shared/git.d.ts +23 -0
- package/dist/shared/git.d.ts.map +1 -1
- package/dist/shared/git.js +26 -0
- package/dist/shared/git.js.map +1 -1
- package/dist/shared/index.d.ts +11 -4
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +22 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/io/auditToolsPaths.d.ts +7 -0
- package/dist/shared/io/auditToolsPaths.d.ts.map +1 -1
- package/dist/shared/io/auditToolsPaths.js +10 -0
- package/dist/shared/io/auditToolsPaths.js.map +1 -1
- package/dist/shared/io/lockedJsonStore.d.ts +66 -0
- package/dist/shared/io/lockedJsonStore.d.ts.map +1 -0
- package/dist/shared/io/lockedJsonStore.js +59 -0
- package/dist/shared/io/lockedJsonStore.js.map +1 -0
- package/dist/shared/loopCorePaths.d.ts.map +1 -1
- package/dist/shared/loopCorePaths.js +2 -0
- package/dist/shared/loopCorePaths.js.map +1 -1
- package/dist/shared/providers/openAiCompatibleProvider.d.ts.map +1 -1
- package/dist/shared/providers/openAiCompatibleProvider.js +2 -1
- package/dist/shared/providers/openAiCompatibleProvider.js.map +1 -1
- package/dist/shared/providers/opencodeProvider.d.ts +8 -0
- package/dist/shared/providers/opencodeProvider.d.ts.map +1 -1
- package/dist/shared/providers/opencodeProvider.js +10 -0
- package/dist/shared/providers/opencodeProvider.js.map +1 -1
- package/dist/shared/quota/claimRegistry.d.ts +9 -0
- package/dist/shared/quota/claimRegistry.d.ts.map +1 -1
- package/dist/shared/quota/claimRegistry.js +20 -0
- package/dist/shared/quota/claimRegistry.js.map +1 -1
- package/dist/shared/reporting/auditDeliverable.d.ts.map +1 -1
- package/dist/shared/reporting/auditDeliverable.js +14 -9
- package/dist/shared/reporting/auditDeliverable.js.map +1 -1
- package/dist/shared/tooling/exec.d.ts +42 -4
- package/dist/shared/tooling/exec.d.ts.map +1 -1
- package/dist/shared/tooling/exec.js +90 -12
- package/dist/shared/tooling/exec.js.map +1 -1
- package/dist/shared/types/contractPipeline/verification.d.ts +17 -3
- package/dist/shared/types/contractPipeline/verification.d.ts.map +1 -1
- package/dist/shared/types/sessionConfig.d.ts +28 -0
- package/dist/shared/types/sessionConfig.d.ts.map +1 -1
- package/dist/shared/types/sessionConfig.js +35 -0
- package/dist/shared/types/sessionConfig.js.map +1 -1
- package/opencode.json +2 -11
- package/package.json +2 -1
- package/scripts/audit/postinstall.mjs +57 -137
- package/scripts/remediate/postinstall.mjs +41 -169
- package/scripts/shared/install-host-assets.mjs +188 -0
- package/wrapper/audit-code-wrapper-lib.mjs +32 -4
- package/wrapper/audit-code-wrapper-opencode.mjs +41 -25
- package/wrapper/remediate-code-wrapper-opencode.mjs +43 -21
- package/dist/remediate/utils/commands.d.ts +0 -17
- package/dist/remediate/utils/commands.d.ts.map +0 -1
- package/dist/remediate/utils/commands.js +0 -29
- package/dist/remediate/utils/commands.js.map +0 -1
|
@@ -31,6 +31,49 @@ export interface RemediationState {
|
|
|
31
31
|
* max-concurrent, context/output token windows, and the model roster / id.
|
|
32
32
|
*/
|
|
33
33
|
host_capabilities?: HostCapabilities;
|
|
34
|
+
/**
|
|
35
|
+
* Union of repo-relative paths every ACCEPTED node has actually cherry-picked
|
|
36
|
+
* into the main tree this run (ground truth, path-sorted, de-duplicated).
|
|
37
|
+
* Populated incrementally by `mergeImplementResultsIntoState`
|
|
38
|
+
* (src/remediate/steps/dispatch/marshal.ts) from each node's
|
|
39
|
+
* `AcceptNodeWorktreeResult.editedFiles` (captured pre-merge from the node's
|
|
40
|
+
* own branch diff in `acceptNodeWorktree` — never the worker's self-report).
|
|
41
|
+
*
|
|
42
|
+
* This is the close phase's staging manifest (`collectStagingFiles` in
|
|
43
|
+
* `src/remediate/phases/close.ts`): the invariant "remediation close must
|
|
44
|
+
* never commit files the run didn't touch" is enforced by staging exactly
|
|
45
|
+
* `applied_edit_surface ∩ currently-dirty`, never a repo-wide sweep.
|
|
46
|
+
*
|
|
47
|
+
* Absent (or missing entries) for any block landed through a dispatch mode
|
|
48
|
+
* that never runs the isolated-worktree accept lifecycle — e.g. the
|
|
49
|
+
* conversation-first hand-driven flow (`remediate-code merge-implement-results`,
|
|
50
|
+
* a first-class dispatch mode, not legacy: the host edits directly in the main
|
|
51
|
+
* tree with no per-node worktree/commit to diff). The close phase's manifest
|
|
52
|
+
* resolution additionally unions in each `resolved` item's declared
|
|
53
|
+
* `item_spec.touched_files` / finding `affected_files` as a fallback for
|
|
54
|
+
* exactly the items no accepted node's `editedFiles` covers.
|
|
55
|
+
*/
|
|
56
|
+
applied_edit_surface?: string[];
|
|
57
|
+
/**
|
|
58
|
+
* Repo-relative paths that were ALREADY dirty (changed vs HEAD, or untracked)
|
|
59
|
+
* when this run's plan was created — captured once via `stagedAndUntracked`
|
|
60
|
+
* in `runPlanPhase` (src/remediate/phases/plan.ts), path-sorted, and never
|
|
61
|
+
* re-captured on a replan (re-capturing after edits landed would wrongly
|
|
62
|
+
* classify the run's own hand-applied work as pre-existing dirt).
|
|
63
|
+
*
|
|
64
|
+
* Consumed by the close phase's `resolveEditSurfaceManifest`: a file that was
|
|
65
|
+
* dirty BEFORE the run started cannot be one of the run's edits, so it is
|
|
66
|
+
* excluded from the DECLARED (fallback) manifest sources
|
|
67
|
+
* (`item_spec.touched_files` / finding `affected_files` — plan-time
|
|
68
|
+
* declarations/write-grants, not verified diffs). Ground-truth entries
|
|
69
|
+
* (`applied_edit_surface`, from actual worktree cherry-picks) are NEVER
|
|
70
|
+
* excluded by this snapshot — git already proved the run landed those paths.
|
|
71
|
+
*
|
|
72
|
+
* Absent on states created before this field existed (or on plan flows that
|
|
73
|
+
* don't pass through `runPlanPhase`): treated as empty — no exclusions,
|
|
74
|
+
* preserving prior behavior for in-flight runs.
|
|
75
|
+
*/
|
|
76
|
+
run_start_dirty?: string[];
|
|
34
77
|
}
|
|
35
78
|
/**
|
|
36
79
|
* Opaque persisted host-capability handshake (C1). Every field optional — only
|
|
@@ -49,6 +92,14 @@ export declare const LOCK_TIMEOUT_MS: number;
|
|
|
49
92
|
export declare class StateStore {
|
|
50
93
|
private artifactsDir;
|
|
51
94
|
private readonly _correlationId?;
|
|
95
|
+
/**
|
|
96
|
+
* Thin adapter over the shared locked JSON store: `state.json` guarded by a
|
|
97
|
+
* sibling `state.lock`. The lock-timeout derivation and the read-under-lock →
|
|
98
|
+
* atomic-write cycle (shared `writeJsonFile`: temp + atomic rename,
|
|
99
|
+
* INV-remediate-state-04) are single-sourced there; only the
|
|
100
|
+
* RemediationState schema validation lives here.
|
|
101
|
+
*/
|
|
102
|
+
private readonly store;
|
|
52
103
|
constructor(artifactsDir: string, _correlationId?: string | undefined);
|
|
53
104
|
init(): Promise<void>;
|
|
54
105
|
/**
|
|
@@ -69,19 +120,11 @@ export declare class StateStore {
|
|
|
69
120
|
*/
|
|
70
121
|
mutate(fn: (current: RemediationState | null) => Promise<RemediationState>): Promise<RemediationState>;
|
|
71
122
|
/**
|
|
72
|
-
* Save state.json unconditionally (no TOCTOU protection
|
|
73
|
-
*
|
|
123
|
+
* Save state.json unconditionally (no TOCTOU protection, no read — so a
|
|
124
|
+
* corrupt on-disk state never blocks recovery). Prefer `mutate` for
|
|
125
|
+
* transitions; use this only when the caller holds an external guarantee
|
|
74
126
|
* that no concurrent writer exists (e.g. single-agent close phase).
|
|
75
|
-
* INV-remediate-state-04: the durable write goes through the shared atomic
|
|
76
|
-
* writer (temp + atomic rename), the single source for atomic JSON writes.
|
|
77
127
|
*/
|
|
78
128
|
saveState(state: RemediationState): Promise<void>;
|
|
79
|
-
/**
|
|
80
|
-
* Persist state.json while the caller already holds the lock. Delegates to the
|
|
81
|
-
* shared `writeJsonFile` (temp + atomic rename) — the lock-agnostic single
|
|
82
|
-
* source for atomic JSON writes — so this store carries no inline writer of
|
|
83
|
-
* its own.
|
|
84
|
-
*/
|
|
85
|
-
private _writeStateLocked;
|
|
86
129
|
}
|
|
87
130
|
//# sourceMappingURL=store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/remediate/state/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/remediate/state/store.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EACF,SAAS,GACT,UAAU,GACV,2BAA2B,GAC3B,cAAc,GACd,QAAQ,GACR,oBAAoB,GACpB,SAAS,GACT,UAAU,CAAC;IACf,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC7C,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,yBAAyB,CAAC;IACxD;;;;OAIG;IACH,eAAe,CAAC,EAAE,aAAa,CAAC;IAChC;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC;;;;;;;;;;;;;;;;;;OAkBG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsCD,eAAO,MAAM,eAAe,QAA+B,CAAC;AAU5D,qBAAa,UAAU;IAWnB,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAZlC;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;gBAGvD,YAAY,EAAE,MAAM,EAEX,cAAc,CAAC,EAAE,MAAM,YAAA;IAoBpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;;;;;;OAQG;IACG,SAAS,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAInD;;;;;OAKG;IACG,MAAM,CACV,EAAE,EAAE,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,gBAAgB,CAAC,GAClE,OAAO,CAAC,gBAAgB,CAAC;IAS5B;;;;;OAKG;IACG,SAAS,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdir } from "node:fs/promises";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { createLockedJsonStore, LOCKED_JSON_STORE_TIMEOUT_MS, } from "audit-tools/shared";
|
|
4
4
|
/** Known status values for RemediationState — used for schema validation on load. */
|
|
5
5
|
const KNOWN_STATUSES = new Set([
|
|
6
6
|
"pending",
|
|
@@ -30,15 +30,11 @@ function validateState(value) {
|
|
|
30
30
|
}
|
|
31
31
|
const STATE_FILENAME = "state.json";
|
|
32
32
|
const LOCK_FILENAME = "state.lock";
|
|
33
|
-
// Acquire timeout for the shared file lock
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
// before the acquire starts, so its stale point precedes the deadline). The margin
|
|
39
|
-
// absorbs the write→acquire gap, loop overhead, and load drift.
|
|
40
|
-
const LOCK_TIMEOUT_MARGIN_MS = 10_000;
|
|
41
|
-
export const LOCK_TIMEOUT_MS = STALE_LOCK_MS - LOCK_TIMEOUT_MARGIN_MS;
|
|
33
|
+
// Acquire timeout for the shared file lock — the STALE_LOCK_MS-minus-margin
|
|
34
|
+
// derivation is single-sourced in the shared locked JSON store (a fresh-but-held
|
|
35
|
+
// lock times out deterministically before it could be reclaimed as stale).
|
|
36
|
+
// Re-exported here because callers and tests pin the store's timeout by name.
|
|
37
|
+
export const LOCK_TIMEOUT_MS = LOCKED_JSON_STORE_TIMEOUT_MS;
|
|
42
38
|
function statePath(artifactsDir) {
|
|
43
39
|
return join(artifactsDir, STATE_FILENAME);
|
|
44
40
|
}
|
|
@@ -48,11 +44,33 @@ function lockPath(artifactsDir) {
|
|
|
48
44
|
export class StateStore {
|
|
49
45
|
artifactsDir;
|
|
50
46
|
_correlationId;
|
|
47
|
+
/**
|
|
48
|
+
* Thin adapter over the shared locked JSON store: `state.json` guarded by a
|
|
49
|
+
* sibling `state.lock`. The lock-timeout derivation and the read-under-lock →
|
|
50
|
+
* atomic-write cycle (shared `writeJsonFile`: temp + atomic rename,
|
|
51
|
+
* INV-remediate-state-04) are single-sourced there; only the
|
|
52
|
+
* RemediationState schema validation lives here.
|
|
53
|
+
*/
|
|
54
|
+
store;
|
|
51
55
|
constructor(artifactsDir,
|
|
52
56
|
// correlationId retained for API compatibility; no longer used in lock body
|
|
53
57
|
_correlationId) {
|
|
54
58
|
this.artifactsDir = artifactsDir;
|
|
55
59
|
this._correlationId = _correlationId;
|
|
60
|
+
this.store = createLockedJsonStore({
|
|
61
|
+
path: statePath(artifactsDir),
|
|
62
|
+
lockPath: lockPath(artifactsDir),
|
|
63
|
+
parse: (raw) => {
|
|
64
|
+
if (raw === undefined) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const errors = validateState(raw);
|
|
68
|
+
if (errors.length > 0) {
|
|
69
|
+
throw new Error(`state.json failed schema validation: ${errors.join("; ")}`);
|
|
70
|
+
}
|
|
71
|
+
return raw;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
56
74
|
}
|
|
57
75
|
async init() {
|
|
58
76
|
await mkdir(this.artifactsDir, { recursive: true });
|
|
@@ -67,21 +85,7 @@ export class StateStore {
|
|
|
67
85
|
* that requires TOCTOU safety (INV-remediate-state-02).
|
|
68
86
|
*/
|
|
69
87
|
async loadState() {
|
|
70
|
-
|
|
71
|
-
const data = await readFile(statePath(this.artifactsDir), "utf8");
|
|
72
|
-
const parsed = JSON.parse(data);
|
|
73
|
-
const errors = validateState(parsed);
|
|
74
|
-
if (errors.length > 0) {
|
|
75
|
-
throw new Error(`state.json failed schema validation: ${errors.join("; ")}`);
|
|
76
|
-
}
|
|
77
|
-
return parsed;
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
if (isFileMissingError(error)) {
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
throw error;
|
|
84
|
-
}
|
|
88
|
+
return this.store.read();
|
|
85
89
|
}
|
|
86
90
|
/**
|
|
87
91
|
* TOCTOU-safe read-modify-write: acquires the file lock ONCE, loads the
|
|
@@ -90,52 +94,21 @@ export class StateStore {
|
|
|
90
94
|
* and the save. INV-remediate-state-02 + INV-remediate-state-03.
|
|
91
95
|
*/
|
|
92
96
|
async mutate(fn) {
|
|
93
|
-
await mkdir(this.artifactsDir, { recursive: true });
|
|
94
|
-
const lock = lockPath(this.artifactsDir);
|
|
95
97
|
let next;
|
|
96
|
-
await
|
|
97
|
-
// Load inside the lock — no TOCTOU gap between load and save.
|
|
98
|
-
let current = null;
|
|
99
|
-
try {
|
|
100
|
-
const data = await readFile(statePath(this.artifactsDir), "utf8");
|
|
101
|
-
const parsed = JSON.parse(data);
|
|
102
|
-
const errors = validateState(parsed);
|
|
103
|
-
if (errors.length > 0) {
|
|
104
|
-
throw new Error(`state.json failed schema validation: ${errors.join("; ")}`);
|
|
105
|
-
}
|
|
106
|
-
current = parsed;
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
109
|
-
if (!isFileMissingError(err))
|
|
110
|
-
throw err;
|
|
111
|
-
}
|
|
98
|
+
await this.store.mutate(async (current) => {
|
|
112
99
|
next = await fn(current);
|
|
113
|
-
|
|
114
|
-
}
|
|
100
|
+
return next;
|
|
101
|
+
});
|
|
115
102
|
return next;
|
|
116
103
|
}
|
|
117
104
|
/**
|
|
118
|
-
* Save state.json unconditionally (no TOCTOU protection
|
|
119
|
-
*
|
|
105
|
+
* Save state.json unconditionally (no TOCTOU protection, no read — so a
|
|
106
|
+
* corrupt on-disk state never blocks recovery). Prefer `mutate` for
|
|
107
|
+
* transitions; use this only when the caller holds an external guarantee
|
|
120
108
|
* that no concurrent writer exists (e.g. single-agent close phase).
|
|
121
|
-
* INV-remediate-state-04: the durable write goes through the shared atomic
|
|
122
|
-
* writer (temp + atomic rename), the single source for atomic JSON writes.
|
|
123
109
|
*/
|
|
124
110
|
async saveState(state) {
|
|
125
|
-
await
|
|
126
|
-
const lock = lockPath(this.artifactsDir);
|
|
127
|
-
await withFileLock(lock, async () => {
|
|
128
|
-
await this._writeStateLocked(state);
|
|
129
|
-
}, LOCK_TIMEOUT_MS);
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* Persist state.json while the caller already holds the lock. Delegates to the
|
|
133
|
-
* shared `writeJsonFile` (temp + atomic rename) — the lock-agnostic single
|
|
134
|
-
* source for atomic JSON writes — so this store carries no inline writer of
|
|
135
|
-
* its own.
|
|
136
|
-
*/
|
|
137
|
-
async _writeStateLocked(state) {
|
|
138
|
-
await writeJsonFile(statePath(this.artifactsDir), state);
|
|
111
|
+
await this.store.replace(state);
|
|
139
112
|
}
|
|
140
113
|
}
|
|
141
114
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/remediate/state/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/remediate/state/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -623,12 +623,22 @@ export declare const ClosingActionPreviewSchema: z.ZodObject<{
|
|
|
623
623
|
files: z.ZodArray<z.ZodString, "many">;
|
|
624
624
|
/** Generated commit message derived from item summaries / finding titles. */
|
|
625
625
|
commit_message: z.ZodString;
|
|
626
|
+
/**
|
|
627
|
+
* Currently-dirty repo-relative paths that are NEITHER in the run's edit
|
|
628
|
+
* surface manifest nor a tool deliverable — pre-existing/unrelated user
|
|
629
|
+
* changes `collectStagingFiles` deliberately leaves untouched (never staged,
|
|
630
|
+
* never committed). Surfaced so the host can tell the user what was left
|
|
631
|
+
* alone. Absent/omitted when there is nothing to report.
|
|
632
|
+
*/
|
|
633
|
+
leftover_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
626
634
|
}, "strict", z.ZodTypeAny, {
|
|
627
635
|
files: string[];
|
|
628
636
|
commit_message: string;
|
|
637
|
+
leftover_files?: string[] | undefined;
|
|
629
638
|
}, {
|
|
630
639
|
files: string[];
|
|
631
640
|
commit_message: string;
|
|
641
|
+
leftover_files?: string[] | undefined;
|
|
632
642
|
}>;
|
|
633
643
|
export declare const ClosingPlanSchema: z.ZodObject<{
|
|
634
644
|
action: z.ZodEnum<["commit", "push", "open-pr", "publish", "tag", "merge-to-base", "none", "custom"]>;
|
|
@@ -649,12 +659,22 @@ export declare const ClosingPlanSchema: z.ZodObject<{
|
|
|
649
659
|
files: z.ZodArray<z.ZodString, "many">;
|
|
650
660
|
/** Generated commit message derived from item summaries / finding titles. */
|
|
651
661
|
commit_message: z.ZodString;
|
|
662
|
+
/**
|
|
663
|
+
* Currently-dirty repo-relative paths that are NEITHER in the run's edit
|
|
664
|
+
* surface manifest nor a tool deliverable — pre-existing/unrelated user
|
|
665
|
+
* changes `collectStagingFiles` deliberately leaves untouched (never staged,
|
|
666
|
+
* never committed). Surfaced so the host can tell the user what was left
|
|
667
|
+
* alone. Absent/omitted when there is nothing to report.
|
|
668
|
+
*/
|
|
669
|
+
leftover_files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
652
670
|
}, "strict", z.ZodTypeAny, {
|
|
653
671
|
files: string[];
|
|
654
672
|
commit_message: string;
|
|
673
|
+
leftover_files?: string[] | undefined;
|
|
655
674
|
}, {
|
|
656
675
|
files: string[];
|
|
657
676
|
commit_message: string;
|
|
677
|
+
leftover_files?: string[] | undefined;
|
|
658
678
|
}>>;
|
|
659
679
|
}, "strict", z.ZodTypeAny, {
|
|
660
680
|
action: "push" | "custom" | "none" | "tag" | "commit" | "open-pr" | "publish" | "merge-to-base";
|
|
@@ -663,6 +683,7 @@ export declare const ClosingPlanSchema: z.ZodObject<{
|
|
|
663
683
|
closing_action_preview?: {
|
|
664
684
|
files: string[];
|
|
665
685
|
commit_message: string;
|
|
686
|
+
leftover_files?: string[] | undefined;
|
|
666
687
|
} | undefined;
|
|
667
688
|
}, {
|
|
668
689
|
action: "push" | "custom" | "none" | "tag" | "commit" | "open-pr" | "publish" | "merge-to-base";
|
|
@@ -671,6 +692,7 @@ export declare const ClosingPlanSchema: z.ZodObject<{
|
|
|
671
692
|
closing_action_preview?: {
|
|
672
693
|
files: string[];
|
|
673
694
|
commit_message: string;
|
|
695
|
+
leftover_files?: string[] | undefined;
|
|
674
696
|
} | undefined;
|
|
675
697
|
}>;
|
|
676
698
|
export type ClosingPlan = z.infer<typeof ClosingPlanSchema>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/remediate/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAM7D,OAAO,KAAK,EAAE,OAAO,EAAgB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAEpF,YAAY,EAAE,OAAO,EAAE,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;IAI/B;;;OAGG;;IAEH;;;;OAIG;;IAEH;;;;OAIG;;IAEH;;;;;;OAMG;;IAEH;;;;;;;OAOG;;IAEH;;;;;;OAMG;;;;;;;;;;;;;;;;;;;;EAGI,CAAC;AACZ,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA9C9B;;;WAGG;;QAEH;;;;WAIG;;QAEH;;;;WAIG;;QAEH;;;;;;WAMG;;QAEH;;;;;;;WAOG;;QAEH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;IAoBH,+EAA+E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGxE,CAAC;AACZ,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;CAKnB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;IAKvB;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBI,CAAC;AACZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;EAe5B,CAAC;AACZ,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,8JACc,CAAC;AACpD,MAAM,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;AAErE,uEAAuE;AACvE,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB,CAKhC;AAED,eAAO,MAAM,0BAA0B;IAEnC,+DAA+D;;IAE/D,6EAA6E
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/remediate/state/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -134,6 +134,14 @@ export const ClosingActionPreviewSchema = z
|
|
|
134
134
|
files: z.array(z.string()),
|
|
135
135
|
/** Generated commit message derived from item summaries / finding titles. */
|
|
136
136
|
commit_message: z.string(),
|
|
137
|
+
/**
|
|
138
|
+
* Currently-dirty repo-relative paths that are NEITHER in the run's edit
|
|
139
|
+
* surface manifest nor a tool deliverable — pre-existing/unrelated user
|
|
140
|
+
* changes `collectStagingFiles` deliberately leaves untouched (never staged,
|
|
141
|
+
* never committed). Surfaced so the host can tell the user what was left
|
|
142
|
+
* alone. Absent/omitted when there is nothing to report.
|
|
143
|
+
*/
|
|
144
|
+
leftover_files: z.array(z.string()).optional(),
|
|
137
145
|
})
|
|
138
146
|
.strict();
|
|
139
147
|
export const ClosingPlanSchema = z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/remediate/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQtD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGvE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;IAC1B;;;;OAIG;IACH,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjD;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACxD;;;;;;OAMG;IACH,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC7C,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC;IACvC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IACxB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,yBAAyB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,cAAc,EAAE,CAAC;SACd,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;SAC9D,QAAQ,EAAE;IACb,+EAA+E;IAC/E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW,EAAE,aAAa;IAC1B,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,2BAA2B;IACjD,4BAA4B,EAAE,mCAAmC;CACzD,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC;;;;;OAKG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC7C,cAAc,EAAE,CAAC,CAAC,KAAK,CACrB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CACzE;IACD,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAC3B,CAAC;SACE,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YACX,gBAAgB,CAAC,WAAW;YAC5B,gBAAgB,CAAC,aAAa;YAC9B,gBAAgB,CAAC,oBAAoB;YACrC,gBAAgB,CAAC,4BAA4B;SAC9C,CAAC;QACF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB,CAAC;SACD,MAAM,EAAE,CACZ;CACF,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QACf,iBAAiB;QACjB,sBAAsB;QACtB,cAAc;QACd,yBAAyB;QACzB,sBAAsB;QACtB,mBAAmB;QACnB,uBAAuB;KACxB,CAAC;IACF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,+EAA+E;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GACnC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;AAGpD,uEAAuE;AACvE,MAAM,UAAU,uBAAuB,CACrC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACxB,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,+DAA+D;IAC/D,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/remediate/state/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { RemediationBlock } from "../../state/types.js";
|
|
2
2
|
import type { ProviderSlot, RollingDispatchResult } from "audit-tools/shared";
|
|
3
|
+
import type { ClaimRegistry } from "audit-tools/shared";
|
|
3
4
|
/** Worker transport outcome (mirrors shared `RollingDispatchResult["outcome"]`). */
|
|
4
5
|
export type NodeWorkerOutcome = "success" | "error" | "rate_limited" | "timeout";
|
|
5
6
|
export interface AcceptNodeWorktreeParams {
|
|
@@ -86,6 +87,23 @@ export interface AcceptNodeWorktreeParams {
|
|
|
86
87
|
* unit-test path every other caller relies on today).
|
|
87
88
|
*/
|
|
88
89
|
nodeClaimsEdit?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Merge-time ownership gate (OD3 layer 2, D-66/67 slice-1). When present, the
|
|
92
|
+
* node's claim lease is HEARTBEAT-CHECKED immediately before the cherry-pick —
|
|
93
|
+
* the last moment before the irreversible base mutation — using the TEMPLATE the
|
|
94
|
+
* one existing layer-2 gate established (`src/audit/cli/auditStep.ts:216-239`).
|
|
95
|
+
* `claimMany`'s same-pool re-grant MINTS A NEW TOKEN, so any peer reclaim/repartition
|
|
96
|
+
* rotates the token and this node's heartbeat then returns false — supersession is
|
|
97
|
+
* always detectable. `heartbeat` does not check staleness (only token identity), so
|
|
98
|
+
* the gate fires ONLY on a real peer reclaim/clear, never on a single-agent run.
|
|
99
|
+
* OMITTED (test callers, claim-less lifecycle-unit-test flows) ⇒ no gate, the prior
|
|
100
|
+
* unconditional-land behaviour — every PRODUCTION driver threads it (E1).
|
|
101
|
+
*/
|
|
102
|
+
ownership?: {
|
|
103
|
+
registry: ClaimRegistry;
|
|
104
|
+
nodeId: string;
|
|
105
|
+
ownerToken: string;
|
|
106
|
+
};
|
|
89
107
|
}
|
|
90
108
|
export interface AcceptNodeWorktreeResult {
|
|
91
109
|
/** The LIFECYCLE outcome (verify/merge applied), distinct from the worker transport outcome. */
|
|
@@ -123,6 +141,17 @@ export interface AcceptNodeWorktreeResult {
|
|
|
123
141
|
* every other outcome, including the genuine no-op no-commit case.
|
|
124
142
|
*/
|
|
125
143
|
strayWorktreeSuspected?: boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Repo-relative paths this node ACTUALLY cherry-picked into the main tree —
|
|
146
|
+
* captured PRE-merge from the node's own branch diff (`gitEditedFilesForBranch`
|
|
147
|
+
* against `HEAD...branch`, BEFORE `mergeWorktree`'s cherry-pick; the same probe
|
|
148
|
+
* reads empty afterward, since the change is then already contained in HEAD).
|
|
149
|
+
* Present only on `merged:true`. This is the ground truth the close phase's
|
|
150
|
+
* staging manifest is built from (`state.applied_edit_surface` — see
|
|
151
|
+
* `mergeImplementResultsIntoState` in marshal.ts and `collectStagingFiles` in
|
|
152
|
+
* `src/remediate/phases/close.ts`), never the worker's self-reported files.
|
|
153
|
+
*/
|
|
154
|
+
editedFiles?: string[];
|
|
126
155
|
}
|
|
127
156
|
/**
|
|
128
157
|
* The shared post-worker "accept node" lifecycle, extracted so BOTH rolling
|
|
@@ -228,6 +257,15 @@ export declare function executeNodeInWorktree(args: {
|
|
|
228
257
|
}>;
|
|
229
258
|
/** The node's own targeted_commands, run IN ADDITION to the derived verify (task_7d35176d). */
|
|
230
259
|
additionalVerifyCommands?: string[];
|
|
260
|
+
/**
|
|
261
|
+
* Merge-time ownership gate (OD3 layer 2, D-66/67 slice-1), forwarded verbatim
|
|
262
|
+
* into {@link acceptNodeWorktree}. OMITTED (test callers) ⇒ no gate.
|
|
263
|
+
*/
|
|
264
|
+
ownership?: {
|
|
265
|
+
registry: ClaimRegistry;
|
|
266
|
+
nodeId: string;
|
|
267
|
+
ownerToken: string;
|
|
268
|
+
};
|
|
231
269
|
dispatchNode: WorktreeNodeWorker;
|
|
232
270
|
}): Promise<NodeWorktreeExecution>;
|
|
233
271
|
//# sourceMappingURL=acceptNode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acceptNode.d.ts","sourceRoot":"","sources":["../../../../src/remediate/steps/dispatch/acceptNode.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"acceptNode.d.ts","sourceRoot":"","sources":["../../../../src/remediate/steps/dispatch/acceptNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { spawnSyncHidden } from "audit-tools/shared";
|
|
3
3
|
import { withFileLock } from "audit-tools/shared";
|
|
4
4
|
import { isLoopCorePath } from "audit-tools/shared";
|
|
5
|
-
import {
|
|
5
|
+
import { runTracked } from "audit-tools/shared";
|
|
6
6
|
import { mergedBaseCheckArgv, mergedGuardSuiteArgv } from "../gateCommands.js";
|
|
7
7
|
import { writeJsonFile, readOptionalJsonFile } from "audit-tools/shared";
|
|
8
8
|
import { runDir, worktreeBranchForBlock, gitEditedFilesForBranch, } from "./common.js";
|
|
@@ -249,6 +249,27 @@ async function acceptNodeWorktreeLocked(params) {
|
|
|
249
249
|
// contained in HEAD, so the same probe reads EMPTY; the loop-core guard gate + its
|
|
250
250
|
// scoped clean below must be driven off this pre-merge snapshot.
|
|
251
251
|
const nodeEditedFiles = gitEditedFilesForBranch(root, branch);
|
|
252
|
+
// Merge-time ownership gate (OD3 layer 2, D-66/67 slice-1): the LAST moment
|
|
253
|
+
// before the irreversible base mutation. A peer that reclaimed this node's
|
|
254
|
+
// claim lease since dispatch (a stale sweep, a second driver's re-partition —
|
|
255
|
+
// `claimMany` mints a fresh token on any such re-grant) fails the token-checked
|
|
256
|
+
// heartbeat; refuse to land work for a lease we can no longer verifiably hold.
|
|
257
|
+
// Absent `params.ownership` (test callers, claim-less flows) ⇒ no gate.
|
|
258
|
+
if (params.ownership) {
|
|
259
|
+
const { registry, nodeId, ownerToken } = params.ownership;
|
|
260
|
+
const stillOwned = await registry.heartbeat(nodeId, ownerToken);
|
|
261
|
+
if (!stillOwned) {
|
|
262
|
+
quarantineFailedNodeCommit(root, branch, runId, blockId);
|
|
263
|
+
removeWorktree(root, wt);
|
|
264
|
+
return {
|
|
265
|
+
outcome: "error",
|
|
266
|
+
verifyPassed,
|
|
267
|
+
merged: false,
|
|
268
|
+
diagnostic: `ownership gate: claim lease for ${blockId} reclaimed by a peer before ` +
|
|
269
|
+
`merge; refusing to land.`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
252
273
|
// mergeWorktree cherry-picks the verified branch and removes the worktree (on
|
|
253
274
|
// success AND on conflict-abort), so no explicit cleanup is needed afterwards.
|
|
254
275
|
const mergeRes = mergeWorktree(root, wt, branch);
|
|
@@ -271,10 +292,9 @@ async function acceptNodeWorktreeLocked(params) {
|
|
|
271
292
|
// Paths the just-landed pick touched, so the scoped clean nukes only those
|
|
272
293
|
// (never unrelated untracked state). Resolved BEFORE the check runs.
|
|
273
294
|
const pickedFiles = gitEditedFilesForBranch(root, branch);
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
const
|
|
277
|
-
const check = runCommand(checkCmd, checkArgs, { cwd: root, encoding: "utf8" });
|
|
295
|
+
// runTracked scrubs CLAUDECODE / CLAUDE_CODE_* and applies the shared
|
|
296
|
+
// Windows `.cmd` wrapping — never `shell: true`.
|
|
297
|
+
const check = runTracked(checkArgv, { cwd: root, encoding: "utf8" });
|
|
278
298
|
const checkFailed = !!check.error || check.status !== 0;
|
|
279
299
|
if (checkFailed) {
|
|
280
300
|
const detail = check.error
|
|
@@ -311,8 +331,7 @@ async function acceptNodeWorktreeLocked(params) {
|
|
|
311
331
|
? mergedGuardSuiteArgv(root)
|
|
312
332
|
: params.mergedGuardCommand;
|
|
313
333
|
if (guardArgv !== null) {
|
|
314
|
-
const
|
|
315
|
-
const res = runCommand(guardCmd, guardArgs, { cwd: root, encoding: "utf8" });
|
|
334
|
+
const res = runTracked(guardArgv, { cwd: root, encoding: "utf8" });
|
|
316
335
|
const guardFailed = !!res.error || res.status !== 0;
|
|
317
336
|
if (guardFailed) {
|
|
318
337
|
const detail = res.error
|
|
@@ -348,7 +367,16 @@ async function acceptNodeWorktreeLocked(params) {
|
|
|
348
367
|
// by a prior failed attempt for this node so the recovery report lists only
|
|
349
368
|
// genuinely-unrecovered work.
|
|
350
369
|
clearQuarantinedCommit(root, runId, blockId);
|
|
351
|
-
return {
|
|
370
|
+
return {
|
|
371
|
+
outcome: "success",
|
|
372
|
+
verifyPassed,
|
|
373
|
+
merged,
|
|
374
|
+
committedOid,
|
|
375
|
+
landedHeadOid,
|
|
376
|
+
// nodeEditedFiles was captured pre-pick (above) — still valid here, the
|
|
377
|
+
// pick landed the SAME diff it describes.
|
|
378
|
+
...(nodeEditedFiles.available ? { editedFiles: [...nodeEditedFiles.files].sort() } : {}),
|
|
379
|
+
};
|
|
352
380
|
});
|
|
353
381
|
}
|
|
354
382
|
/**
|
|
@@ -369,21 +397,37 @@ export function nodeAcceptOutcomePath(artifactsDir, runId, blockId) {
|
|
|
369
397
|
* so the merge-state gate is inert there.
|
|
370
398
|
*/
|
|
371
399
|
export async function recordNodeAcceptOutcome(artifactsDir, runId, blockId, result) {
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
:
|
|
400
|
+
const path = nodeAcceptOutcomePath(artifactsDir, runId, blockId);
|
|
401
|
+
// Regression guard (§8, D-66/67 slice-1 hardening): this write happens OUTSIDE
|
|
402
|
+
// the per-node worktree lock, so two attempts for the SAME blockId can (in a
|
|
403
|
+
// starved-process edge) land out of order — a stale `merged:false` clobbering an
|
|
404
|
+
// already-recorded `merged:true` would make finalization treat a LANDED fix as
|
|
405
|
+
// blocked. Never let a write regress merged:true -> merged:false for one blockId.
|
|
406
|
+
// The read+decide+write runs under a sidecar-scoped file lock so two truly-
|
|
407
|
+
// concurrent writers can't both read stale state and last-write-win past the
|
|
408
|
+
// guard (mirrors the audit side's mergeOwnerTokens).
|
|
409
|
+
await withFileLock(`${path}.lock`, async () => {
|
|
410
|
+
const existing = await loadNodeAcceptOutcome(artifactsDir, runId, blockId);
|
|
411
|
+
if (existing?.merged === true && result.merged === false)
|
|
412
|
+
return;
|
|
413
|
+
await writeJsonFile(path, {
|
|
414
|
+
schema_version: "remediate-code-implement/node-accept-outcome/v1alpha1",
|
|
415
|
+
block_id: blockId,
|
|
416
|
+
outcome: result.outcome,
|
|
417
|
+
verify_passed: result.verifyPassed,
|
|
418
|
+
merged: result.merged,
|
|
419
|
+
// Only present on a failure outcome; gives triage the failing command + output.
|
|
420
|
+
...(result.diagnostic !== undefined ? { diagnostic: result.diagnostic } : {}),
|
|
421
|
+
// INV-WTS-3/7: the node's captured commit identity, ground truth the disposition
|
|
422
|
+
// reconcile trusts over any live branch/path read.
|
|
423
|
+
...(result.committedOid !== undefined ? { committed_oid: result.committedOid } : {}),
|
|
424
|
+
...(result.landedHeadOid !== undefined ? { landed_head_oid: result.landedHeadOid } : {}),
|
|
425
|
+
...(result.strayWorktreeSuspected !== undefined
|
|
426
|
+
? { stray_worktree_suspected: result.strayWorktreeSuspected }
|
|
427
|
+
: {}),
|
|
428
|
+
// Ground truth for the close-phase staging manifest (see AcceptNodeWorktreeResult.editedFiles).
|
|
429
|
+
...(result.editedFiles !== undefined ? { edited_files: result.editedFiles } : {}),
|
|
430
|
+
});
|
|
387
431
|
});
|
|
388
432
|
}
|
|
389
433
|
/** Load a node's recorded accept outcome, or null when none was written. */
|
|
@@ -401,6 +445,7 @@ export async function loadNodeAcceptOutcome(artifactsDir, runId, blockId) {
|
|
|
401
445
|
...(raw.stray_worktree_suspected !== undefined
|
|
402
446
|
? { strayWorktreeSuspected: raw.stray_worktree_suspected }
|
|
403
447
|
: {}),
|
|
448
|
+
...(raw.edited_files !== undefined ? { editedFiles: raw.edited_files } : {}),
|
|
404
449
|
};
|
|
405
450
|
}
|
|
406
451
|
/**
|
|
@@ -420,7 +465,7 @@ export async function loadNodeAcceptOutcome(artifactsDir, runId, blockId) {
|
|
|
420
465
|
* outcome, never an unhandled rejection into the engine.
|
|
421
466
|
*/
|
|
422
467
|
export async function executeNodeInWorktree(args) {
|
|
423
|
-
const { block, slot, root, artifactsDir, runId, resultPath, seedPaths, allBlockScopes, additionalVerifyCommands, dispatchNode } = args;
|
|
468
|
+
const { block, slot, root, artifactsDir, runId, resultPath, seedPaths, allBlockScopes, additionalVerifyCommands, ownership, dispatchNode } = args;
|
|
424
469
|
const branch = worktreeBranchForBlock(block.block_id, runId);
|
|
425
470
|
const wt = worktreePath(root, block.block_id, runId);
|
|
426
471
|
try {
|
|
@@ -458,6 +503,7 @@ export async function executeNodeInWorktree(args) {
|
|
|
458
503
|
scope: { allBlockScopes },
|
|
459
504
|
// The block's OWN declared write paths (INV-1 new-file inclusion).
|
|
460
505
|
writePaths: allBlockScopes.find((b) => b.block_id === block.block_id)?.write_paths ?? [],
|
|
506
|
+
ownership,
|
|
461
507
|
});
|
|
462
508
|
await recordNodeAcceptOutcome(artifactsDir, runId, block.block_id, accept);
|
|
463
509
|
return { result, accept };
|