pi-daddy 0.17.0 → 0.18.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/CHANGELOG.md +154 -80
- package/README.md +54 -25
- package/dist/approval-prompt.d.ts +3 -1
- package/dist/approval-prompt.d.ts.map +1 -1
- package/dist/approval-prompt.js +1 -1
- package/dist/approval-prompt.js.map +1 -1
- package/dist/approval-store.d.ts.map +1 -1
- package/dist/approval-store.js +4 -1
- package/dist/approval-store.js.map +1 -1
- package/dist/approval.d.ts +20 -2
- package/dist/approval.d.ts.map +1 -1
- package/dist/approval.js +26 -6
- package/dist/approval.js.map +1 -1
- package/dist/chain.d.ts +6 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/chain.js +1 -1
- package/dist/chain.js.map +1 -1
- package/dist/check-runner.d.ts +61 -0
- package/dist/check-runner.d.ts.map +1 -0
- package/dist/check-runner.js +237 -0
- package/dist/check-runner.js.map +1 -0
- package/dist/correlation.d.ts +90 -0
- package/dist/correlation.d.ts.map +1 -0
- package/dist/correlation.js +183 -0
- package/dist/correlation.js.map +1 -0
- package/dist/delegate-types.d.ts +140 -0
- package/dist/delegate-types.d.ts.map +1 -0
- package/dist/delegate-types.js +8 -0
- package/dist/delegate-types.js.map +1 -0
- package/dist/delegate.d.ts +4 -128
- package/dist/delegate.d.ts.map +1 -1
- package/dist/delegate.js +68 -72
- package/dist/delegate.js.map +1 -1
- package/dist/delegation-approval.d.ts +36 -0
- package/dist/delegation-approval.d.ts.map +1 -0
- package/dist/delegation-approval.js +67 -0
- package/dist/delegation-approval.js.map +1 -0
- package/dist/git-identity.d.ts +13 -0
- package/dist/git-identity.d.ts.map +1 -0
- package/dist/git-identity.js +44 -0
- package/dist/git-identity.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/lease-record.d.ts +78 -0
- package/dist/lease-record.d.ts.map +1 -0
- package/dist/lease-record.js +52 -0
- package/dist/lease-record.js.map +1 -0
- package/dist/ledger-events.d.ts +87 -0
- package/dist/ledger-events.d.ts.map +1 -0
- package/dist/ledger-events.js +45 -0
- package/dist/ledger-events.js.map +1 -0
- package/dist/ledger-report.d.ts +19 -12
- package/dist/ledger-report.d.ts.map +1 -1
- package/dist/ledger-report.js +81 -1
- package/dist/ledger-report.js.map +1 -1
- package/dist/ledger.d.ts +44 -1
- package/dist/ledger.d.ts.map +1 -1
- package/dist/ledger.js +20 -2
- package/dist/ledger.js.map +1 -1
- package/dist/refusals.d.ts +16 -0
- package/dist/refusals.d.ts.map +1 -0
- package/dist/refusals.js +51 -0
- package/dist/refusals.js.map +1 -0
- package/dist/run-child.d.ts +4 -0
- package/dist/run-child.d.ts.map +1 -1
- package/dist/run-child.js +21 -1
- package/dist/run-child.js.map +1 -1
- package/dist/run-herdr.d.ts +7 -0
- package/dist/run-herdr.d.ts.map +1 -1
- package/dist/run-herdr.js +41 -12
- package/dist/run-herdr.js.map +1 -1
- package/dist/workspace-lease.d.ts +28 -0
- package/dist/workspace-lease.d.ts.map +1 -0
- package/dist/workspace-lease.js +276 -0
- package/dist/workspace-lease.js.map +1 -0
- package/dist/workspace.d.ts +32 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +79 -0
- package/dist/workspace.js.map +1 -0
- package/extensions/approval-banking.ts +66 -0
- package/extensions/approvals.ts +95 -7
- package/extensions/chain-approval-facts.ts +51 -0
- package/extensions/chain-ledger.ts +48 -0
- package/extensions/delegate-chain.ts +115 -81
- package/extensions/delegation.ts +81 -23
- package/extensions/execute-child.ts +289 -0
- package/extensions/fanout-outcome.ts +97 -0
- package/extensions/run-delegation.ts +130 -120
- package/extensions/session.ts +4 -0
- package/extensions/workspace-runtime.ts +165 -0
- package/package.json +17 -1
- package/src/approval-prompt.ts +4 -2
- package/src/approval-store.ts +4 -1
- package/src/approval.ts +47 -14
- package/src/chain.ts +3 -1
- package/src/check-runner.ts +341 -0
- package/src/correlation.ts +260 -0
- package/src/delegate-types.ts +144 -0
- package/src/delegate.ts +80 -179
- package/src/delegation-approval.ts +99 -0
- package/src/git-identity.ts +52 -0
- package/src/index.ts +50 -0
- package/src/lease-record.ts +119 -0
- package/src/ledger-events.ts +138 -0
- package/src/ledger-report.ts +90 -2
- package/src/ledger.ts +68 -3
- package/src/refusals.ts +66 -0
- package/src/run-child.ts +23 -1
- package/src/run-herdr.ts +41 -11
- package/src/workspace-lease.ts +303 -0
- package/src/workspace.ts +135 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The lease's RECORD: what a workspace lease writes down about who holds it and how they let it go.
|
|
3
|
+
*
|
|
4
|
+
* Split from `./workspace-lease.ts` to stay under the 400-line module ceiling, along the seam this
|
|
5
|
+
* review round kept finding defects on — absent vs unreadable metadata, a swallowed handover write, a
|
|
6
|
+
* successor's token — all of which are about what the record SAYS rather than about the kernel lock.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
9
|
+
import { readFile, rename, writeFile } from "node:fs/promises";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
export function leasePaths(leaseDir, root) {
|
|
12
|
+
// Canonical root, never caller-chosen workspace ID: aliases for one worktree must contend.
|
|
13
|
+
const key = createHash("sha256").update(root, "utf8").digest("hex");
|
|
14
|
+
return {
|
|
15
|
+
lock: join(leaseDir, `${key}.lock`),
|
|
16
|
+
metadata: join(leaseDir, `${key}.json`),
|
|
17
|
+
marker: join(leaseDir, `${key}.close-failed.json`),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export async function atomicMetadata(path, value) {
|
|
21
|
+
const temp = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
22
|
+
await writeFile(temp, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
23
|
+
await rename(temp, path);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* `null` means no prior owner was recorded. `"malformed"` means a record exists and cannot be read,
|
|
27
|
+
* which is strictly LESS evidence than a readable "active" one and must never read as a clean handover
|
|
28
|
+
* (R-100). Absent and unreadable are different facts; conflating them silently erases a real recovery.
|
|
29
|
+
*/
|
|
30
|
+
export async function readMetadata(path) {
|
|
31
|
+
let raw;
|
|
32
|
+
try {
|
|
33
|
+
raw = await readFile(path, "utf8");
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return error?.code === "ENOENT" ? null : "malformed";
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const value = JSON.parse(raw);
|
|
40
|
+
if (value?.version !== 1)
|
|
41
|
+
return "malformed";
|
|
42
|
+
if (value.state !== "active" && value.state !== "released")
|
|
43
|
+
return "malformed";
|
|
44
|
+
if (typeof value.token !== "string" || !value.token)
|
|
45
|
+
return "malformed";
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return "malformed";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=lease-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-record.js","sourceRoot":"","sources":["../src/lease-record.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAwEjC,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAAY;IACvD,2FAA2F;IAC3F,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC;QACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC;QACvC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,oBAAoB,CAAC;KACnD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,KAAoB;IACrE,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC;IAC1D,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IAClF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2B,CAAC;QACxD,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QAC7C,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,OAAO,WAAW,CAAC;QAC/E,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO,WAAW,CAAC;QACxE,OAAO,KAAsB,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The v2 runtime-event half of the ledger: workspace leases, child lifecycle and check receipts, with
|
|
3
|
+
* their builders. Split out of `./ledger.ts` only to stay under the 400-line module ceiling this
|
|
4
|
+
* project enforces mechanically; `./ledger.ts` re-exports everything here, so "the ledger module"
|
|
5
|
+
* remains one import.
|
|
6
|
+
*/
|
|
7
|
+
import { LEDGER_VERSION, type LedgerEventBase, type GrantRecord } from "./ledger.ts";
|
|
8
|
+
import type { ExecutorKind } from "./executor.ts";
|
|
9
|
+
import type { CorrelationMetadata } from "./correlation.ts";
|
|
10
|
+
import type { StructuredRefusal } from "./refusals.ts";
|
|
11
|
+
/**
|
|
12
|
+
* `released` is a handover this owner performed. FOUR members were added by the 0.18.0 review pass, and
|
|
13
|
+
* they were not all previously recorded the same way — `uncontended` was recorded as an *acquisition*, and
|
|
14
|
+
* `lost` was recorded as nothing at all, because the old `release()` threw before the append ran:
|
|
15
|
+
* `lost` the kernel lock went away under a live governed writer — NOT the same fact as a user
|
|
16
|
+
* cancelling, which is what it used to be indistinguishable from (R-103);
|
|
17
|
+
* `retained` the lease was deliberately kept because a herdr writer tab would not close, so the
|
|
18
|
+
* successor's `recovered: true` would otherwise blame a healthy path (R-104);
|
|
19
|
+
* `uncontended` a read lease took no kernel lock at all, so counting it as an acquisition
|
|
20
|
+
* overstated how many exclusions the kernel actually performed (R-105).
|
|
21
|
+
*/
|
|
22
|
+
export type WorkspaceLeaseOutcome = "acquired" | "uncontended" | "refused" | "released" | "released-unrecorded" | "lost" | "retained" | "timeout" | "recovered";
|
|
23
|
+
export interface WorkspaceLeaseEvent extends LedgerEventBase {
|
|
24
|
+
ledgerVersion: typeof LEDGER_VERSION;
|
|
25
|
+
event: "workspace_lease";
|
|
26
|
+
childId: string;
|
|
27
|
+
workspaceId: string;
|
|
28
|
+
root: string;
|
|
29
|
+
access: "read" | "write";
|
|
30
|
+
outcome: WorkspaceLeaseOutcome;
|
|
31
|
+
/** `"unknown"` when the prior owner's record was unreadable — not evidence of a clean handover. */
|
|
32
|
+
recovered?: boolean | "unknown";
|
|
33
|
+
releaseReason?: string;
|
|
34
|
+
refusal?: StructuredRefusal;
|
|
35
|
+
}
|
|
36
|
+
export interface ChildLifecycleEvent extends LedgerEventBase {
|
|
37
|
+
ledgerVersion: typeof LEDGER_VERSION;
|
|
38
|
+
event: "child_lifecycle";
|
|
39
|
+
childId: string;
|
|
40
|
+
state: "starting" | "completed" | "failed";
|
|
41
|
+
executor: ExecutorKind;
|
|
42
|
+
exitCode?: number | null;
|
|
43
|
+
signal?: NodeJS.Signals | null;
|
|
44
|
+
timedOut?: boolean;
|
|
45
|
+
aborted?: boolean;
|
|
46
|
+
truncated?: boolean;
|
|
47
|
+
reason?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface CheckReceiptLedgerEvent extends LedgerEventBase {
|
|
50
|
+
ledgerVersion: typeof LEDGER_VERSION;
|
|
51
|
+
event: "check_receipt";
|
|
52
|
+
childId: string;
|
|
53
|
+
receiptId: string;
|
|
54
|
+
workspaceId: string;
|
|
55
|
+
checkId: string;
|
|
56
|
+
treeSha: string;
|
|
57
|
+
}
|
|
58
|
+
export type RuntimeLedgerEvent = (GrantRecord & {
|
|
59
|
+
ledgerVersion: typeof LEDGER_VERSION;
|
|
60
|
+
event: "capability_decision";
|
|
61
|
+
}) | WorkspaceLeaseEvent | ChildLifecycleEvent | CheckReceiptLedgerEvent;
|
|
62
|
+
export declare function buildWorkspaceLeaseEvent(args: {
|
|
63
|
+
childId: string;
|
|
64
|
+
workspaceId: string;
|
|
65
|
+
root: string;
|
|
66
|
+
access: "read" | "write";
|
|
67
|
+
outcome: WorkspaceLeaseOutcome;
|
|
68
|
+
recovered?: boolean | "unknown";
|
|
69
|
+
releaseReason?: string;
|
|
70
|
+
refusal?: StructuredRefusal;
|
|
71
|
+
correlation?: CorrelationMetadata;
|
|
72
|
+
now: Date;
|
|
73
|
+
}): WorkspaceLeaseEvent;
|
|
74
|
+
export declare function buildChildLifecycleEvent(args: {
|
|
75
|
+
childId: string;
|
|
76
|
+
state: "starting" | "completed" | "failed";
|
|
77
|
+
executor: ExecutorKind;
|
|
78
|
+
exitCode?: number | null;
|
|
79
|
+
signal?: NodeJS.Signals | null;
|
|
80
|
+
timedOut?: boolean;
|
|
81
|
+
aborted?: boolean;
|
|
82
|
+
truncated?: boolean;
|
|
83
|
+
reason?: string;
|
|
84
|
+
correlation?: CorrelationMetadata;
|
|
85
|
+
now: Date;
|
|
86
|
+
}): ChildLifecycleEvent;
|
|
87
|
+
//# sourceMappingURL=ledger-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-events.d.ts","sourceRoot":"","sources":["../src/ledger-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The v2 runtime-event half of the ledger: workspace leases, child lifecycle and check receipts, with
|
|
3
|
+
* their builders. Split out of `./ledger.ts` only to stay under the 400-line module ceiling this
|
|
4
|
+
* project enforces mechanically; `./ledger.ts` re-exports everything here, so "the ledger module"
|
|
5
|
+
* remains one import.
|
|
6
|
+
*/
|
|
7
|
+
import { LEDGER_VERSION } from "./ledger.js";
|
|
8
|
+
export function buildWorkspaceLeaseEvent(args) {
|
|
9
|
+
return {
|
|
10
|
+
ledgerVersion: LEDGER_VERSION,
|
|
11
|
+
event: "workspace_lease",
|
|
12
|
+
ts: args.now.toISOString(),
|
|
13
|
+
childId: args.childId,
|
|
14
|
+
workspaceId: args.workspaceId,
|
|
15
|
+
root: args.root,
|
|
16
|
+
access: args.access,
|
|
17
|
+
outcome: args.outcome,
|
|
18
|
+
// `!== undefined`, not truthiness. `recovered: false` — a POSITIVE assertion that the predecessor
|
|
19
|
+
// handed over cleanly — was dropped while the truthy `"unknown"` survived, so absence meant both
|
|
20
|
+
// "clean" and "never supplied". R-100's whole argument is that absence of evidence is not evidence,
|
|
21
|
+
// and this was the one line discarding the evidence.
|
|
22
|
+
...(args.recovered !== undefined ? { recovered: args.recovered } : {}),
|
|
23
|
+
...(args.releaseReason ? { releaseReason: args.releaseReason } : {}),
|
|
24
|
+
...(args.refusal ? { refusal: structuredClone(args.refusal) } : {}),
|
|
25
|
+
...(args.correlation ? { correlation: structuredClone(args.correlation) } : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function buildChildLifecycleEvent(args) {
|
|
29
|
+
return {
|
|
30
|
+
ledgerVersion: LEDGER_VERSION,
|
|
31
|
+
event: "child_lifecycle",
|
|
32
|
+
ts: args.now.toISOString(),
|
|
33
|
+
childId: args.childId,
|
|
34
|
+
state: args.state,
|
|
35
|
+
executor: args.executor,
|
|
36
|
+
...(args.exitCode !== undefined ? { exitCode: args.exitCode } : {}),
|
|
37
|
+
...(args.signal !== undefined ? { signal: args.signal } : {}),
|
|
38
|
+
...(args.timedOut ? { timedOut: true } : {}),
|
|
39
|
+
...(args.aborted ? { aborted: true } : {}),
|
|
40
|
+
...(args.truncated ? { truncated: true } : {}),
|
|
41
|
+
...(args.reason ? { reason: args.reason } : {}),
|
|
42
|
+
...(args.correlation ? { correlation: structuredClone(args.correlation) } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ledger-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-events.js","sourceRoot":"","sources":["../src/ledger-events.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,cAAc,EAA0C,MAAM,aAAa,CAAC;AAuErF,MAAM,UAAU,wBAAwB,CAAC,IAWxC;IACC,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,KAAK,EAAE,iBAAiB;QACxB,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,kGAAkG;QAClG,iGAAiG;QACjG,oGAAoG;QACpG,qDAAqD;QACrD,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAYxC;IACC,OAAO;QACL,aAAa,EAAE,cAAc;QAC7B,KAAK,EAAE,iBAAiB;QACxB,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;QAC1B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC"}
|
package/dist/ledger-report.d.ts
CHANGED
|
@@ -14,8 +14,26 @@ import type { ApprovalSource } from "./approval.ts";
|
|
|
14
14
|
export interface LedgerReport {
|
|
15
15
|
/** False when the file is absent — a configuration state, not damage. */
|
|
16
16
|
exists: boolean;
|
|
17
|
-
/**
|
|
17
|
+
/** Capability-decision records (legacy or v2). */
|
|
18
18
|
records: number;
|
|
19
|
+
/** Every parsed ledger event, including lifecycle and lease events. */
|
|
20
|
+
events: number;
|
|
21
|
+
workspaceLeases: {
|
|
22
|
+
acquired: number;
|
|
23
|
+
uncontended: number;
|
|
24
|
+
refused: number;
|
|
25
|
+
released: number;
|
|
26
|
+
releasedUnrecorded: number;
|
|
27
|
+
lost: number;
|
|
28
|
+
retained: number;
|
|
29
|
+
timeout: number;
|
|
30
|
+
recovered: number;
|
|
31
|
+
};
|
|
32
|
+
lifecycle: {
|
|
33
|
+
starting: number;
|
|
34
|
+
completed: number;
|
|
35
|
+
failed: number;
|
|
36
|
+
};
|
|
19
37
|
/** Lines that did not, with 1-based line numbers so the report is actionable. */
|
|
20
38
|
corrupt: Array<{
|
|
21
39
|
line: number;
|
|
@@ -109,16 +127,5 @@ export interface LedgerReport {
|
|
|
109
127
|
};
|
|
110
128
|
ok: boolean;
|
|
111
129
|
}
|
|
112
|
-
/**
|
|
113
|
-
* Read the ledger back and report what is wrong with it.
|
|
114
|
-
*
|
|
115
|
-
* **This is the gap that mattered most.** `appendRecord`'s strict mode catches write *errors*, never
|
|
116
|
-
* corruption, and nothing in this package had ever read a ledger back — so a torn line was silently
|
|
117
|
-
* indistinguishable from a spawn that never happened. An audit trail whose damage is invisible is not a
|
|
118
|
-
* compensating control, and ADR-0008 leans on the ledger as exactly that.
|
|
119
|
-
*
|
|
120
|
-
* Deliberately reports rather than repairs. A corrupt line is evidence; rewriting the file to make it parse
|
|
121
|
-
* would destroy the one artifact an investigation has.
|
|
122
|
-
*/
|
|
123
130
|
export declare function verifyLedger(path: string): Promise<LedgerReport>;
|
|
124
131
|
//# sourceMappingURL=ledger-report.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-report.d.ts","sourceRoot":"","sources":["../src/ledger-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger-report.d.ts","sourceRoot":"","sources":["../src/ledger-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAKpD,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QACzE,kBAAkB,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;KAChG,CAAC;IACF,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,iFAAiF;IACjF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,yFAAyF;IACzF,kBAAkB,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D;;;;;;;;;;;;OAYG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrF;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,SAAS,EAAE;QACT,2FAA2F;QAC3F,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACzC,2EAA2E;QAC3E,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACjD,0GAA0G;QAC1G,YAAY,EAAE,MAAM,CAAC;QACrB,uFAAuF;QACvF,WAAW,EAAE,MAAM,CAAC;QACpB;;;;;;;;WAQG;QACH,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,EAAE,EAAE,OAAO,CAAC;CACb;AAkDD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA4KtE"}
|
package/dist/ledger-report.js
CHANGED
|
@@ -24,6 +24,39 @@ import { isEscalationAttempt } from "./ledger.js";
|
|
|
24
24
|
* Deliberately reports rather than repairs. A corrupt line is evidence; rewriting the file to make it parse
|
|
25
25
|
* would destroy the one artifact an investigation has.
|
|
26
26
|
*/
|
|
27
|
+
// Keyed by the UNION, not by `string`. Typed loosely, adding a `WorkspaceLeaseOutcome` member without a
|
|
28
|
+
// counter compiled fine and then made `verifyLedger` file the package's own valid event as CORRUPTION —
|
|
29
|
+
// the worst available outcome for an integrity signal, since real damage becomes noise.
|
|
30
|
+
const LEASE_OUTCOME_COUNTERS = {
|
|
31
|
+
acquired: "acquired",
|
|
32
|
+
uncontended: "uncontended",
|
|
33
|
+
refused: "refused",
|
|
34
|
+
released: "released",
|
|
35
|
+
"released-unrecorded": "releasedUnrecorded",
|
|
36
|
+
lost: "lost",
|
|
37
|
+
retained: "retained",
|
|
38
|
+
timeout: "timeout",
|
|
39
|
+
recovered: "recovered",
|
|
40
|
+
};
|
|
41
|
+
function validV2Base(event) {
|
|
42
|
+
return event.ledgerVersion === 2 && typeof event.ts === "string";
|
|
43
|
+
}
|
|
44
|
+
function requireV2(event, fields) {
|
|
45
|
+
if (!validV2Base(event) || fields.some((field) => typeof event[field] !== "string" || event[field] === "")) {
|
|
46
|
+
throw new Error("invalid versioned ledger event");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function requireCapabilityDecision(event) {
|
|
50
|
+
requireV2(event, ["parentId", "childId", "executor", "taskDigest"]);
|
|
51
|
+
for (const field of ["requested", "parentGrant", "effective", "denied", "clipped", "gatedBlocked"]) {
|
|
52
|
+
if (!Array.isArray(event[field]) || !event[field].every((value) => typeof value === "string")) {
|
|
53
|
+
throw new Error("invalid capability decision arrays");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!Number.isInteger(event.depth) || typeof event.blocked !== "boolean" || !/^[a-f0-9]{64}$/i.test(String(event.taskDigest))) {
|
|
57
|
+
throw new Error("invalid capability decision identity");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
27
60
|
export async function verifyLedger(path) {
|
|
28
61
|
let text;
|
|
29
62
|
try {
|
|
@@ -34,6 +67,9 @@ export async function verifyLedger(path) {
|
|
|
34
67
|
return {
|
|
35
68
|
exists: false,
|
|
36
69
|
records: 0,
|
|
70
|
+
events: 0,
|
|
71
|
+
workspaceLeases: { acquired: 0, uncontended: 0, refused: 0, released: 0, releasedUnrecorded: 0, lost: 0, retained: 0, timeout: 0, recovered: 0 },
|
|
72
|
+
lifecycle: { starting: 0, completed: 0, failed: 0 },
|
|
37
73
|
corrupt: [],
|
|
38
74
|
escalationAttempts: 0,
|
|
39
75
|
executors: { herdr: 0, process: 0, unknown: 0 },
|
|
@@ -54,6 +90,9 @@ export async function verifyLedger(path) {
|
|
|
54
90
|
// Keyed by name+digest: one name with two entries is the signal that the definition changed mid-ledger.
|
|
55
91
|
const digests = new Map();
|
|
56
92
|
let records = 0;
|
|
93
|
+
let events = 0;
|
|
94
|
+
const workspaceLeases = { acquired: 0, uncontended: 0, refused: 0, released: 0, releasedUnrecorded: 0, lost: 0, retained: 0, timeout: 0, recovered: 0 };
|
|
95
|
+
const lifecycle = { starting: 0, completed: 0, failed: 0 };
|
|
57
96
|
let escalationAttempts = 0;
|
|
58
97
|
const executors = { herdr: 0, process: 0, unknown: 0 };
|
|
59
98
|
const bySource = { prompt: 0, session: 0, persisted: 0, inherited: 0 };
|
|
@@ -73,10 +112,48 @@ export async function verifyLedger(path) {
|
|
|
73
112
|
if (raw.trim().length === 0)
|
|
74
113
|
return;
|
|
75
114
|
try {
|
|
76
|
-
const
|
|
115
|
+
const event = JSON.parse(raw);
|
|
116
|
+
if (event.ledgerVersion !== undefined && event.event === undefined) {
|
|
117
|
+
throw new Error("versioned ledger line has no event discriminator");
|
|
118
|
+
}
|
|
119
|
+
if (event.event === "workspace_lease") {
|
|
120
|
+
requireV2(event, ["childId", "workspaceId", "root", "access"]);
|
|
121
|
+
const outcome = typeof event.outcome === "string" ? event.outcome : "";
|
|
122
|
+
// Explicit map, not a name match: the ledger's outcome vocabulary and these counter names are
|
|
123
|
+
// allowed to differ, and a valid event must never be counted as corruption because a counter
|
|
124
|
+
// happens to be spelled differently.
|
|
125
|
+
const counter = Object.hasOwn(LEASE_OUTCOME_COUNTERS, outcome)
|
|
126
|
+
? LEASE_OUTCOME_COUNTERS[outcome]
|
|
127
|
+
: undefined;
|
|
128
|
+
if (!counter)
|
|
129
|
+
throw new Error("invalid workspace lease event");
|
|
130
|
+
workspaceLeases[counter] += 1;
|
|
131
|
+
events += 1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (event.event === "child_lifecycle") {
|
|
135
|
+
requireV2(event, ["childId", "executor"]);
|
|
136
|
+
const state = typeof event.state === "string" ? event.state : "";
|
|
137
|
+
if (!Object.hasOwn(lifecycle, state))
|
|
138
|
+
throw new Error("invalid child lifecycle event");
|
|
139
|
+
lifecycle[state] += 1;
|
|
140
|
+
events += 1;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (event.event === "check_receipt") {
|
|
144
|
+
requireV2(event, ["childId", "receiptId", "workspaceId", "checkId", "treeSha"]);
|
|
145
|
+
events += 1;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (event.event !== undefined && event.event !== "capability_decision")
|
|
149
|
+
throw new Error("unknown ledger event");
|
|
150
|
+
const parsed = event;
|
|
151
|
+
if (event.event === "capability_decision")
|
|
152
|
+
requireCapabilityDecision(event);
|
|
77
153
|
if (!Array.isArray(parsed.denied))
|
|
78
154
|
throw new Error("not a grant record");
|
|
79
155
|
records += 1;
|
|
156
|
+
events += 1;
|
|
80
157
|
if (isEscalationAttempt(parsed))
|
|
81
158
|
escalationAttempts += 1;
|
|
82
159
|
const executor = parsed.executor;
|
|
@@ -145,6 +222,9 @@ export async function verifyLedger(path) {
|
|
|
145
222
|
return {
|
|
146
223
|
exists: true,
|
|
147
224
|
records,
|
|
225
|
+
events,
|
|
226
|
+
workspaceLeases,
|
|
227
|
+
lifecycle,
|
|
148
228
|
corrupt,
|
|
149
229
|
escalationAttempts,
|
|
150
230
|
executors,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger-report.js","sourceRoot":"","sources":["../src/ledger-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger-report.js","sourceRoot":"","sources":["../src/ledger-report.ts"],"names":[],"mappings":"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"}
|
package/dist/ledger.d.ts
CHANGED
|
@@ -23,8 +23,25 @@ import type { ExecutorKind } from "./executor.ts";
|
|
|
23
23
|
import type { DefinitionDigest } from "./definitions.ts";
|
|
24
24
|
import type { ApprovalScope, ApprovalSource } from "./approval.ts";
|
|
25
25
|
import type { PromptOutcomeKind } from "./approval-prompt.ts";
|
|
26
|
-
|
|
26
|
+
import type { CorrelationMetadata } from "./correlation.ts";
|
|
27
|
+
import type { StructuredRefusal } from "./refusals.ts";
|
|
28
|
+
import type { RuntimeLedgerEvent } from "./ledger-events.ts";
|
|
29
|
+
export declare const LEDGER_VERSION: 2;
|
|
30
|
+
export interface LedgerEventBase {
|
|
31
|
+
/** Optional only on the legacy-compatible `GrantRecord` public type; every v2 event builder writes it. */
|
|
32
|
+
ledgerVersion?: typeof LEDGER_VERSION;
|
|
33
|
+
event?: "capability_decision" | "workspace_lease" | "child_lifecycle" | "check_receipt";
|
|
27
34
|
ts: string;
|
|
35
|
+
childId?: string;
|
|
36
|
+
correlation?: CorrelationMetadata;
|
|
37
|
+
}
|
|
38
|
+
export interface GrantRecord extends LedgerEventBase {
|
|
39
|
+
/**
|
|
40
|
+
* Present only when a trusted `taskDigest` was supplied — that is what makes a line v2. `buildRecord`
|
|
41
|
+
* does NOT always emit it, and the comment here used to say it did while the emission site 200 lines
|
|
42
|
+
* down said the opposite. Two comments asserting contradictory facts about one field is R-28's shape.
|
|
43
|
+
*/
|
|
44
|
+
event?: "capability_decision";
|
|
28
45
|
parentId: string;
|
|
29
46
|
childId: string;
|
|
30
47
|
depth: number;
|
|
@@ -71,6 +88,13 @@ export interface GrantRecord {
|
|
|
71
88
|
* one capability while claiming to describe the set was not merely a reporting defect.
|
|
72
89
|
*/
|
|
73
90
|
approvalScopes?: Record<Capability, ApprovalScope>;
|
|
91
|
+
/** Persisted approval expiry, by capability. Session-scoped approvals have no wall-clock expiry. */
|
|
92
|
+
approvalExpiresAt?: Record<Capability, string>;
|
|
93
|
+
/** Count bounds where one exists. A consumed `once` approval records `{max:1, remaining:0}`. */
|
|
94
|
+
approvalUses?: Record<Capability, {
|
|
95
|
+
max: number;
|
|
96
|
+
remaining: number;
|
|
97
|
+
}>;
|
|
74
98
|
/** Present only when the source was a live prompt, and only when one scope covers the whole set. */
|
|
75
99
|
approvalScope?: ApprovalScope;
|
|
76
100
|
/** A human was asked and declined. Distinct from `denied`, which is an escalation attempt. */
|
|
@@ -128,6 +152,10 @@ export interface GrantRecord {
|
|
|
128
152
|
* `definitionDigest` names its instructions, and neither says where the TASK came from.
|
|
129
153
|
*/
|
|
130
154
|
taskFrom?: string;
|
|
155
|
+
/** Trusted SHA-256 of the exact task; task text remains forbidden (ADR-0034). */
|
|
156
|
+
taskDigest?: string;
|
|
157
|
+
/** Stable machine-readable refusal accompanying `reason`. */
|
|
158
|
+
refusal?: StructuredRefusal;
|
|
131
159
|
}
|
|
132
160
|
export interface LedgerOptions {
|
|
133
161
|
/** Path to the JSONL file. Parent directories are created on demand. */
|
|
@@ -139,6 +167,11 @@ export interface LedgerOptions {
|
|
|
139
167
|
* closed. Set false only where the ledger is advisory.
|
|
140
168
|
*/
|
|
141
169
|
strict?: boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Called when a NON-strict append failed. Required in spirit rather than in types: a caller that opts
|
|
172
|
+
* out of failing closed still has to say something, or the ledger silently develops holes.
|
|
173
|
+
*/
|
|
174
|
+
onFailure?: (error: unknown) => void;
|
|
142
175
|
}
|
|
143
176
|
export declare function buildRecord(args: {
|
|
144
177
|
parentId: string;
|
|
@@ -153,6 +186,11 @@ export declare function buildRecord(args: {
|
|
|
153
186
|
approved?: Capability[];
|
|
154
187
|
approvalSources?: Record<Capability, ApprovalSource>;
|
|
155
188
|
approvalScopes?: Record<Capability, ApprovalScope>;
|
|
189
|
+
approvalExpiresAt?: Record<Capability, string>;
|
|
190
|
+
approvalUses?: Record<Capability, {
|
|
191
|
+
max: number;
|
|
192
|
+
remaining: number;
|
|
193
|
+
}>;
|
|
156
194
|
humanDenied?: boolean;
|
|
157
195
|
gateOutcome?: PromptOutcomeKind;
|
|
158
196
|
definitionDigest?: DefinitionDigest;
|
|
@@ -160,11 +198,16 @@ export declare function buildRecord(args: {
|
|
|
160
198
|
executor: ExecutorKind;
|
|
161
199
|
/** The child whose output composed this task (ADR-0033). Absent for anything but a chain step. */
|
|
162
200
|
taskFrom?: string;
|
|
201
|
+
taskDigest?: string;
|
|
202
|
+
correlation?: CorrelationMetadata;
|
|
203
|
+
refusal?: StructuredRefusal;
|
|
163
204
|
now: Date;
|
|
164
205
|
}): GrantRecord;
|
|
165
206
|
export { LOCK_TIMEOUT_MS, STALE_LOCK_MS } from "./file-lock.ts";
|
|
166
207
|
export { verifyLedger, type LedgerReport } from "./ledger-report.ts";
|
|
208
|
+
export declare function appendLedgerEvent(options: LedgerOptions, event: RuntimeLedgerEvent | GrantRecord): Promise<void>;
|
|
167
209
|
export declare function appendRecord(options: LedgerOptions, record: GrantRecord): Promise<void>;
|
|
168
210
|
/** True when this record shows an agent asking for more than it holds. */
|
|
169
211
|
export declare function isEscalationAttempt(record: GrantRecord): boolean;
|
|
212
|
+
export { buildChildLifecycleEvent, buildWorkspaceLeaseEvent, type ChildLifecycleEvent, type CheckReceiptLedgerEvent, type RuntimeLedgerEvent, type WorkspaceLeaseEvent, type WorkspaceLeaseOutcome, } from "./ledger-events.ts";
|
|
170
213
|
//# sourceMappingURL=ledger.d.ts.map
|
package/dist/ledger.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,eAAO,MAAM,cAAc,EAAG,CAAU,CAAC;AAEzC,MAAM,WAAW,eAAe;IAC9B,0GAA0G;IAC1G,aAAa,CAAC,EAAE,OAAO,cAAc,CAAC;IACtC,KAAK,CAAC,EAAE,qBAAqB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,eAAe,CAAC;IACxF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,mBAAmB,CAAC;CACnC;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD;;;;OAIG;IACH,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACrD;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACnD,oGAAoG;IACpG,iBAAiB,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,oGAAoG;IACpG,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,8FAA8F;IAC9F,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;;;;OAYG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACnD,iBAAiB,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,0FAA0F;IAC1F,QAAQ,EAAE,YAAY,CAAC;IACvB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,GAAG,EAAE,IAAI,CAAC;CACX,GAAG,WAAW,CA6Cd;AAID,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIhE,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAgBrE,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CActH;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEhE;AAED,OAAO,EACL,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,GAC3B,MAAM,oBAAoB,CAAC"}
|
package/dist/ledger.js
CHANGED
|
@@ -22,6 +22,7 @@ import { appendFile, mkdir, readFile } from "node:fs/promises";
|
|
|
22
22
|
import { withFileLock } from "./file-lock.js";
|
|
23
23
|
import { dirname } from "node:path";
|
|
24
24
|
import { DELEGATE_SUBJECT } from "./approval.js";
|
|
25
|
+
export const LEDGER_VERSION = 2;
|
|
25
26
|
export function buildRecord(args) {
|
|
26
27
|
// R-46: the scalar is a SUMMARY, emitted only when it cannot mislead. `buildRecord` derives it rather
|
|
27
28
|
// than accepting it, so a call site cannot supply one that disagrees with the map beside it.
|
|
@@ -30,6 +31,9 @@ export function buildRecord(args) {
|
|
|
30
31
|
const scopes = args.approvalScopes ?? {};
|
|
31
32
|
const distinctScopes = [...new Set(Object.values(scopes))];
|
|
32
33
|
return {
|
|
34
|
+
// A trusted task digest is what distinguishes a v2 capability event from the legacy construction API.
|
|
35
|
+
// Production delegation always supplies it; old TypeScript callers remain able to append legacy lines.
|
|
36
|
+
...(args.taskDigest ? { ledgerVersion: LEDGER_VERSION, event: "capability_decision" } : {}),
|
|
33
37
|
ts: args.now.toISOString(),
|
|
34
38
|
parentId: args.parentId,
|
|
35
39
|
childId: args.childId,
|
|
@@ -37,6 +41,9 @@ export function buildRecord(args) {
|
|
|
37
41
|
agentType: args.agentType,
|
|
38
42
|
executor: args.executor,
|
|
39
43
|
...(args.taskFrom ? { taskFrom: args.taskFrom } : {}),
|
|
44
|
+
...(args.taskDigest ? { taskDigest: args.taskDigest } : {}),
|
|
45
|
+
...(args.correlation ? { correlation: structuredClone(args.correlation) } : {}),
|
|
46
|
+
...(args.refusal ? { refusal: structuredClone(args.refusal) } : {}),
|
|
40
47
|
requested: args.requested,
|
|
41
48
|
parentGrant: args.parentGrant,
|
|
42
49
|
effective: args.result.effective,
|
|
@@ -50,6 +57,10 @@ export function buildRecord(args) {
|
|
|
50
57
|
...(Object.keys(sources).length > 0 ? { approvalSources: sources } : {}),
|
|
51
58
|
...(distinctScopes.length === 1 ? { approvalScope: distinctScopes[0] } : {}),
|
|
52
59
|
...(Object.keys(scopes).length > 0 ? { approvalScopes: scopes } : {}),
|
|
60
|
+
...(args.approvalExpiresAt && Object.keys(args.approvalExpiresAt).length > 0
|
|
61
|
+
? { approvalExpiresAt: args.approvalExpiresAt }
|
|
62
|
+
: {}),
|
|
63
|
+
...(args.approvalUses && Object.keys(args.approvalUses).length > 0 ? { approvalUses: args.approvalUses } : {}),
|
|
53
64
|
...(args.humanDenied ? { humanDenied: true } : {}),
|
|
54
65
|
// Written whenever a gate was reached and not satisfied by a yes. `granted` is omitted deliberately —
|
|
55
66
|
// an approved spawn already says so through `approvalSources`, and a field that appears on every record
|
|
@@ -76,8 +87,8 @@ export { verifyLedger } from "./ledger-report.js";
|
|
|
76
87
|
* prevent. That is the opposite of what the approvals store does with the same lock, and deliberately so.
|
|
77
88
|
*/
|
|
78
89
|
const withLedgerLock = (path, write) => withFileLock(path, "grant ledger", write);
|
|
79
|
-
export async function
|
|
80
|
-
const line = `${JSON.stringify(
|
|
90
|
+
export async function appendLedgerEvent(options, event) {
|
|
91
|
+
const line = `${JSON.stringify(event)}\n`;
|
|
81
92
|
try {
|
|
82
93
|
await mkdir(dirname(options.path), { recursive: true });
|
|
83
94
|
// O_APPEND alone is not enough once several processes write to one ledger — see `withLedgerLock`.
|
|
@@ -87,10 +98,17 @@ export async function appendRecord(options, record) {
|
|
|
87
98
|
if (options.strict ?? true) {
|
|
88
99
|
throw new Error(`grant ledger write failed (failing closed): ${String(error)}`);
|
|
89
100
|
}
|
|
101
|
+
// A non-strict append is a deliberate choice not to fail closed. It is NOT a choice to be silent:
|
|
102
|
+
// a silent safe-mode is as confusing as a silent unsafe one, so the caller is always told.
|
|
103
|
+
options.onFailure?.(error);
|
|
90
104
|
}
|
|
91
105
|
}
|
|
106
|
+
export async function appendRecord(options, record) {
|
|
107
|
+
return appendLedgerEvent(options, record);
|
|
108
|
+
}
|
|
92
109
|
/** True when this record shows an agent asking for more than it holds. */
|
|
93
110
|
export function isEscalationAttempt(record) {
|
|
94
111
|
return record.denied.length > 0;
|
|
95
112
|
}
|
|
113
|
+
export { buildChildLifecycleEvent, buildWorkspaceLeaseEvent, } from "./ledger-events.js";
|
|
96
114
|
//# sourceMappingURL=ledger.js.map
|
package/dist/ledger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../src/ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const REFUSAL_CODES: readonly ["CAPABILITY_ESCALATION", "DEFINITION_NOT_AUTHORIZED", "UNDECLARED_TOOLS", "UNKNOWN_TOOL", "GATED_UNAPPROVED", "APPROVAL_EXPIRED", "APPROVAL_SCOPE_MISMATCH", "APPROVAL_FLOW_FAILED", "DEPTH_EXCEEDED", "FANOUT_EXCEEDED", "EXECUTOR_UNAVAILABLE", "CHILD_TIMED_OUT", "CHILD_CANCELLED", "CHILD_EXIT_NONZERO", "TASK_MISSING", "UNKNOWN_DEFINITION", "CEILING_PATTERNS_UNRESOLVED", "NARROWING_VIOLATED", "DEFINITION_UNREADABLE", "CORRELATION_TOO_LARGE", "CORRELATION_INVALID", "LEDGER_WRITE_FAILED", "FANOUT_FAILED", "WORKSPACE_NOT_REGISTERED", "WORKSPACE_WRITE_CONFLICT", "WORKSPACE_LEASE_STALE", "CHECK_NOT_CONFIGURED", "CHECK_CONFIGURATION_INVALID", "CHECK_IDENTITY_UNAVAILABLE", "CHECK_IDENTITY_MISMATCH"];
|
|
2
|
+
export type RefusalCode = (typeof REFUSAL_CODES)[number];
|
|
3
|
+
export interface StructuredRefusal {
|
|
4
|
+
code: RefusalCode;
|
|
5
|
+
/** Existing actionable diagnostic. Codes accompany rather than replace it. */
|
|
6
|
+
message: string;
|
|
7
|
+
details?: Record<string, string | number | boolean | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare function refusal(code: RefusalCode, message: string, details?: StructuredRefusal["details"]): StructuredRefusal;
|
|
10
|
+
/** Error shape for API callers. pi-facing tools still throw, as pi requires, while retaining a stable code. */
|
|
11
|
+
export declare class GovernanceRefusal extends Error {
|
|
12
|
+
readonly code: RefusalCode;
|
|
13
|
+
readonly details?: StructuredRefusal["details"];
|
|
14
|
+
constructor(value: StructuredRefusal);
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=refusals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusals.d.ts","sourceRoot":"","sources":["../src/refusals.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,ssBAmChB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;CAC5D;AAED,wBAAgB,OAAO,CACrB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,GACrC,iBAAiB,CAEnB;AAED,+GAA+G;AAC/G,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAEpC,KAAK,EAAE,iBAAiB;CAMrC"}
|