@garygentry/system1-core 0.4.0 → 0.5.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/dist/config/consent.d.ts +11 -0
- package/dist/config/consent.d.ts.map +1 -1
- package/dist/config/consent.js +56 -2
- package/dist/config/consent.js.map +1 -1
- package/dist/config/load.d.ts +14 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +48 -6
- package/dist/config/load.js.map +1 -1
- package/dist/decide.d.ts +2 -0
- package/dist/decide.d.ts.map +1 -1
- package/dist/decide.js +2 -1
- package/dist/decide.js.map +1 -1
- package/dist/guard/check.d.ts +44 -0
- package/dist/guard/check.d.ts.map +1 -0
- package/dist/guard/check.js +325 -0
- package/dist/guard/check.js.map +1 -0
- package/dist/guard/done-check.d.ts +67 -0
- package/dist/guard/done-check.d.ts.map +1 -0
- package/dist/guard/done-check.js +165 -0
- package/dist/guard/done-check.js.map +1 -0
- package/dist/guard/gather.d.ts +65 -0
- package/dist/guard/gather.d.ts.map +1 -0
- package/dist/guard/gather.js +288 -0
- package/dist/guard/gather.js.map +1 -0
- package/dist/guard/git.d.ts +15 -0
- package/dist/guard/git.d.ts.map +1 -0
- package/dist/guard/git.js +44 -0
- package/dist/guard/git.js.map +1 -0
- package/dist/guard/packs.d.ts +51 -0
- package/dist/guard/packs.d.ts.map +1 -0
- package/dist/guard/packs.js +160 -0
- package/dist/guard/packs.js.map +1 -0
- package/dist/guard/state.d.ts +94 -0
- package/dist/guard/state.d.ts.map +1 -0
- package/dist/guard/state.js +181 -0
- package/dist/guard/state.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/opportunities/backlog.d.ts.map +1 -1
- package/dist/opportunities/backlog.js +9 -34
- package/dist/opportunities/backlog.js.map +1 -1
- package/dist/prepare.d.ts +2 -0
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +1 -0
- package/dist/prepare.js.map +1 -1
- package/dist/run/spend.d.ts +3 -0
- package/dist/run/spend.d.ts.map +1 -1
- package/dist/run/spend.js +1 -0
- package/dist/run/spend.js.map +1 -1
- package/dist/sources/read.d.ts +2 -0
- package/dist/sources/read.d.ts.map +1 -1
- package/dist/sources/read.js +31 -17
- package/dist/sources/read.js.map +1 -1
- package/dist/sources/types.d.ts +4 -1
- package/dist/sources/types.d.ts.map +1 -1
- package/dist/spec/lint.js +0 -1
- package/dist/spec/lint.js.map +1 -1
- package/dist/store/file.d.ts +25 -0
- package/dist/store/file.d.ts.map +1 -0
- package/dist/store/file.js +111 -0
- package/dist/store/file.js.map +1 -0
- package/dist/tools/context.d.ts +3 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +2 -1
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/doctor.d.ts +10 -1
- package/dist/tools/doctor.d.ts.map +1 -1
- package/dist/tools/doctor.js +107 -10
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/hook.d.ts +46 -0
- package/dist/tools/hook.d.ts.map +1 -0
- package/dist/tools/hook.js +156 -0
- package/dist/tools/hook.js.map +1 -0
- package/dist/tools/schemas.d.ts +24 -0
- package/dist/tools/schemas.d.ts.map +1 -1
- package/dist/tools/schemas.js +15 -0
- package/dist/tools/schemas.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wiring.d.ts.map +1 -1
- package/dist/wiring.js +11 -2
- package/dist/wiring.js.map +1 -1
- package/package.json +6 -2
- package/dist/config.d.ts +0 -28
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -64
- package/dist/config.js.map +0 -1
- package/dist/testdata/index.d.ts +0 -5
- package/dist/testdata/index.d.ts.map +0 -1
- package/dist/testdata/index.js +0 -6
- package/dist/testdata/index.js.map +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard packs (M10): hooks that check an agent's work at a harness event and
|
|
3
|
+
* send content to the decision model when they do. Each pack is dormant until
|
|
4
|
+
* the user enables it in this repo, on top of egress consent. Enabling is a
|
|
5
|
+
* consent act (plan X6), so `enabled` is read only from the repo layer, like
|
|
6
|
+
* `egress.consent` (decision 0009): a user-level setting can't switch on
|
|
7
|
+
* egress in every repo.
|
|
8
|
+
*/
|
|
9
|
+
export const PACKS = {
|
|
10
|
+
"done-check": {
|
|
11
|
+
summary: "At Stop, checks the change against the criteria files' bullets and blocks once on a confidently unmet one",
|
|
12
|
+
defaults: {
|
|
13
|
+
latencyMs: 5000,
|
|
14
|
+
maxUsdPerSession: 0.01,
|
|
15
|
+
criteria: ["TASK.md", ".system1/done.md"],
|
|
16
|
+
evidence: [],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
export const PACK_NAMES = Object.keys(PACKS);
|
|
21
|
+
export function isPackName(name) {
|
|
22
|
+
return Object.hasOwn(PACKS, name);
|
|
23
|
+
}
|
|
24
|
+
/** Keys a pack section may hold. The `enabled*` ones are read from the repo layer only. */
|
|
25
|
+
const PACK_KEYS = [
|
|
26
|
+
"enabled",
|
|
27
|
+
"enabledAt",
|
|
28
|
+
"enabledBy",
|
|
29
|
+
"latencyMs",
|
|
30
|
+
"maxUsdPerSession",
|
|
31
|
+
"criteria",
|
|
32
|
+
"evidence",
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* `guard:` from both layers, with warnings for everything ignored. Options:
|
|
36
|
+
* the repo wins over the user, then the pack default; a list is taken whole
|
|
37
|
+
* from the first layer that sets it. A value of the wrong type is ignored
|
|
38
|
+
* with a warning, like the other config keys, so a bad file never stops
|
|
39
|
+
* `decide`.
|
|
40
|
+
*/
|
|
41
|
+
export function readGuard(user, userFile, repo, repoFile, warnings) {
|
|
42
|
+
// Repo first: it wins.
|
|
43
|
+
const layers = [
|
|
44
|
+
{ packs: packSections(repo, repoFile, warnings), file: repoFile, which: "repo" },
|
|
45
|
+
{ packs: packSections(user, userFile, warnings), file: userFile, which: "user" },
|
|
46
|
+
];
|
|
47
|
+
const packs = {};
|
|
48
|
+
for (const name of PACK_NAMES) {
|
|
49
|
+
const defaults = PACKS[name].defaults;
|
|
50
|
+
const pack = {
|
|
51
|
+
enabled: false,
|
|
52
|
+
latencyMs: defaults.latencyMs,
|
|
53
|
+
maxUsdPerSession: defaults.maxUsdPerSession,
|
|
54
|
+
criteria: [...defaults.criteria],
|
|
55
|
+
evidence: [...defaults.evidence],
|
|
56
|
+
};
|
|
57
|
+
const seen = new Set();
|
|
58
|
+
for (const { packs: sections, file, which } of layers) {
|
|
59
|
+
const section = sections[name];
|
|
60
|
+
if (!section)
|
|
61
|
+
continue;
|
|
62
|
+
const set = (key, value) => {
|
|
63
|
+
if (seen.has(key))
|
|
64
|
+
return;
|
|
65
|
+
seen.add(key);
|
|
66
|
+
pack[key] = value;
|
|
67
|
+
};
|
|
68
|
+
for (const [key, value] of Object.entries(section)) {
|
|
69
|
+
if (value === undefined || value === null)
|
|
70
|
+
continue;
|
|
71
|
+
const path = `guard.packs.${name}.${key}`;
|
|
72
|
+
if (!PACK_KEYS.includes(key)) {
|
|
73
|
+
warnings.push(`${file}: unknown key ${path}`);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (key.startsWith("enabled") && which === "user") {
|
|
77
|
+
warnings.push(`${file}: ${path} is read only from the repo file (ignored)`);
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const bad = (expected) => warnings.push(`${file}: ${path} must be ${expected} (ignored)`);
|
|
81
|
+
switch (key) {
|
|
82
|
+
case "enabled":
|
|
83
|
+
if (typeof value === "boolean")
|
|
84
|
+
set("enabled", value);
|
|
85
|
+
else
|
|
86
|
+
bad("true or false");
|
|
87
|
+
break;
|
|
88
|
+
case "enabledAt":
|
|
89
|
+
case "enabledBy":
|
|
90
|
+
if (typeof value === "string" && value.trim())
|
|
91
|
+
set(key, value);
|
|
92
|
+
else
|
|
93
|
+
bad("text");
|
|
94
|
+
break;
|
|
95
|
+
case "latencyMs":
|
|
96
|
+
if (typeof value === "number" && Number.isFinite(value) && value > 0)
|
|
97
|
+
set(key, value);
|
|
98
|
+
else
|
|
99
|
+
bad("a number above 0");
|
|
100
|
+
break;
|
|
101
|
+
case "maxUsdPerSession":
|
|
102
|
+
if (typeof value === "number" && Number.isFinite(value) && value >= 0)
|
|
103
|
+
set(key, value);
|
|
104
|
+
else
|
|
105
|
+
bad("a number of at least 0");
|
|
106
|
+
break;
|
|
107
|
+
case "criteria":
|
|
108
|
+
case "evidence":
|
|
109
|
+
if (Array.isArray(value) && value.every((v) => typeof v === "string" && v.trim()))
|
|
110
|
+
set(key, value);
|
|
111
|
+
else
|
|
112
|
+
bad("a list of file paths");
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
packs[name] = pack;
|
|
118
|
+
}
|
|
119
|
+
return { packs };
|
|
120
|
+
}
|
|
121
|
+
/** The `guard.packs` mappings of one layer, by pack name; anything else is a warning. */
|
|
122
|
+
function packSections(layer, file, warnings) {
|
|
123
|
+
const guard = layer?.guard;
|
|
124
|
+
if (guard === undefined || guard === null)
|
|
125
|
+
return {};
|
|
126
|
+
if (!isMapping(guard)) {
|
|
127
|
+
warnings.push(`${file}: guard must be a mapping (ignored)`);
|
|
128
|
+
return {};
|
|
129
|
+
}
|
|
130
|
+
for (const key of Object.keys(guard)) {
|
|
131
|
+
if (key !== "packs")
|
|
132
|
+
warnings.push(`${file}: unknown key guard.${key}`);
|
|
133
|
+
}
|
|
134
|
+
const packs = guard.packs;
|
|
135
|
+
if (packs === undefined || packs === null)
|
|
136
|
+
return {};
|
|
137
|
+
if (!isMapping(packs)) {
|
|
138
|
+
warnings.push(`${file}: guard.packs must be a mapping (ignored)`);
|
|
139
|
+
return {};
|
|
140
|
+
}
|
|
141
|
+
const out = {};
|
|
142
|
+
for (const [name, section] of Object.entries(packs)) {
|
|
143
|
+
if (!isPackName(name)) {
|
|
144
|
+
warnings.push(`${file}: unknown guard pack ${name} (known: ${PACK_NAMES.join(", ")})`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (section === undefined || section === null)
|
|
148
|
+
continue;
|
|
149
|
+
if (!isMapping(section)) {
|
|
150
|
+
warnings.push(`${file}: guard.packs.${name} must be a mapping (ignored)`);
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
out[name] = section;
|
|
154
|
+
}
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
function isMapping(value) {
|
|
158
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=packs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packs.js","sourceRoot":"","sources":["../../src/guard/packs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type Static, Type } from "typebox";
|
|
2
|
+
export declare const GUARD_STATE_FORMAT = 1;
|
|
3
|
+
/** Past this the file is refused (fail open), never trimmed or deleted by decide. */
|
|
4
|
+
export declare const GUARD_STATE_MAX_BYTES = 1000000;
|
|
5
|
+
/** The most text kept per criteria file; a longer file is kept by hash only. */
|
|
6
|
+
export declare const CRITERIA_SNAPSHOT_MAX_CHARS = 16384;
|
|
7
|
+
/** Sessions idle longer than this are pruned on the next write. */
|
|
8
|
+
export declare const SESSION_TTL_MS: number;
|
|
9
|
+
/** At most this many sessions are kept, newest first. */
|
|
10
|
+
export declare const MAX_SESSIONS = 200;
|
|
11
|
+
/** `<harness>:<harness session id>`, the same id the spend ledger uses. */
|
|
12
|
+
export declare const SESSION_ID_PATTERN = "^(claude|codex):[A-Za-z0-9._-]{1,128}$";
|
|
13
|
+
/** The most criteria files a session snapshots. */
|
|
14
|
+
export declare const MAX_CRITERIA_FILES = 20;
|
|
15
|
+
declare const SessionSchema: Type.TObject<{
|
|
16
|
+
harness: Type.TUnion<[Type.TLiteral<"claude">, Type.TLiteral<"codex">]>;
|
|
17
|
+
/** The commit the session started from; `null` in a repo with no commits yet. */
|
|
18
|
+
base: Type.TUnion<[Type.TString, Type.TNull]>;
|
|
19
|
+
/** `first-stop`: SessionStart didn't run, so the base is HEAD at the first Stop. */
|
|
20
|
+
baseSource: Type.TUnion<[Type.TLiteral<"session-start">, Type.TLiteral<"first-stop">]>;
|
|
21
|
+
startedAt: Type.TString;
|
|
22
|
+
updatedAt: Type.TString;
|
|
23
|
+
/** The criteria files at the base, by hash; the text too when it fits. */
|
|
24
|
+
criteria: Type.TArray<Type.TObject<{
|
|
25
|
+
path: Type.TString;
|
|
26
|
+
sha256: Type.TString;
|
|
27
|
+
text: Type.TOptional<Type.TString>;
|
|
28
|
+
}>>;
|
|
29
|
+
/** The last check: the hash of what it looked at, and what it did. */
|
|
30
|
+
last: Type.TOptional<Type.TObject<{
|
|
31
|
+
hash: Type.TString;
|
|
32
|
+
at: Type.TString;
|
|
33
|
+
outcome: Type.TUnion<[Type.TLiteral<"allow">, Type.TLiteral<"block">, Type.TLiteral<"skipped">]>;
|
|
34
|
+
}>>;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const GuardStateSchema: Type.TObject<{
|
|
37
|
+
version: Type.TLiteral<1>;
|
|
38
|
+
sessions: Type.TRecord<"^.*$", Type.TObject<{
|
|
39
|
+
harness: Type.TUnion<[Type.TLiteral<"claude">, Type.TLiteral<"codex">]>;
|
|
40
|
+
/** The commit the session started from; `null` in a repo with no commits yet. */
|
|
41
|
+
base: Type.TUnion<[Type.TString, Type.TNull]>;
|
|
42
|
+
/** `first-stop`: SessionStart didn't run, so the base is HEAD at the first Stop. */
|
|
43
|
+
baseSource: Type.TUnion<[Type.TLiteral<"session-start">, Type.TLiteral<"first-stop">]>;
|
|
44
|
+
startedAt: Type.TString;
|
|
45
|
+
updatedAt: Type.TString;
|
|
46
|
+
/** The criteria files at the base, by hash; the text too when it fits. */
|
|
47
|
+
criteria: Type.TArray<Type.TObject<{
|
|
48
|
+
path: Type.TString;
|
|
49
|
+
sha256: Type.TString;
|
|
50
|
+
text: Type.TOptional<Type.TString>;
|
|
51
|
+
}>>;
|
|
52
|
+
/** The last check: the hash of what it looked at, and what it did. */
|
|
53
|
+
last: Type.TOptional<Type.TObject<{
|
|
54
|
+
hash: Type.TString;
|
|
55
|
+
at: Type.TString;
|
|
56
|
+
outcome: Type.TUnion<[Type.TLiteral<"allow">, Type.TLiteral<"block">, Type.TLiteral<"skipped">]>;
|
|
57
|
+
}>>;
|
|
58
|
+
}>>;
|
|
59
|
+
}>;
|
|
60
|
+
export type GuardSession = Static<typeof SessionSchema>;
|
|
61
|
+
export type GuardState = Static<typeof GuardStateSchema>;
|
|
62
|
+
export declare function guardStatePath(repoRoot: string): string;
|
|
63
|
+
/** Every problem with a state value, as `path message` lines. Empty when valid. */
|
|
64
|
+
export declare function guardStateProblems(value: unknown): string[];
|
|
65
|
+
/**
|
|
66
|
+
* Read the state. A missing file is an empty state. A file that is too large
|
|
67
|
+
* or malformed is an error and is left as it is: the hook fails open with the
|
|
68
|
+
* message, and the user deletes the file if they want to start over.
|
|
69
|
+
*/
|
|
70
|
+
export declare function readGuardState(file: string): GuardState;
|
|
71
|
+
/** Drop sessions idle past the TTL, then keep the newest `MAX_SESSIONS`. */
|
|
72
|
+
export declare function pruneSessions(state: GuardState, now: Date): GuardState;
|
|
73
|
+
export interface UpdateOptions {
|
|
74
|
+
now?: Date;
|
|
75
|
+
/** How long to wait for another hook holding the lock. A hook keeps this short. */
|
|
76
|
+
waitMs?: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read, change and write the state under its lock, pruning as it writes.
|
|
80
|
+
* `change` returns the new state, or `undefined` to write nothing.
|
|
81
|
+
*/
|
|
82
|
+
export declare function updateGuardState<T>(file: string, change: (state: GuardState) => {
|
|
83
|
+
state?: GuardState;
|
|
84
|
+
result: T;
|
|
85
|
+
}, options?: UpdateOptions): T;
|
|
86
|
+
/**
|
|
87
|
+
* The state as JSON within `GUARD_STATE_MAX_BYTES`, so a write can never make
|
|
88
|
+
* the next read fail. Over the limit, the oldest sessions lose their criteria
|
|
89
|
+
* text first (their hashes stay, so a changed file is still noticed), then the
|
|
90
|
+
* oldest sessions go. Sessions are ordered newest first by `pruneSessions`.
|
|
91
|
+
*/
|
|
92
|
+
export declare function fitToSize(state: GuardState): string;
|
|
93
|
+
export {};
|
|
94
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/guard/state.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAM3C,eAAO,MAAM,kBAAkB,IAAI,CAAA;AACnC,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,UAAY,CAAA;AAC9C,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,mEAAmE;AACnE,eAAO,MAAM,cAAc,QAA2B,CAAA;AACtD,yDAAyD;AACzD,eAAO,MAAM,YAAY,MAAM,CAAA;AAM/B,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,2CAA2C,CAAA;AAC1E,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC,QAAA,MAAM,aAAa;;IAGf,iFAAiF;;IAEjF,oFAAoF;;;;IAIpF,0EAA0E;;;;;;IAY1E,sEAAsE;;;;;;EAiBzE,CAAA;AAED,eAAO,MAAM,gBAAgB;;;;QArCzB,iFAAiF;;QAEjF,oFAAoF;;;;QAIpF,0EAA0E;;;;;;QAY1E,sEAAsE;;;;;;;EAyBzE,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAExD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAc3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAsBvD;AAUD,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,GAAG,UAAU,CAStE;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,EAChE,OAAO,GAAE,aAAkB,GAC1B,CAAC,CA+BH;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAmBnD"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guard state (M10 §3): what a guard pack remembers per harness session.
|
|
3
|
+
* `done-check` needs the commit the session started from (so a session that
|
|
4
|
+
* commits before stopping is still checked, and other people's uncommitted
|
|
5
|
+
* work is not), the criteria files as they were then (so an agent that edits
|
|
6
|
+
* or empties its own criteria is checked against the originals), and a hash
|
|
7
|
+
* of what it last checked (so an unchanged re-stop sends nothing).
|
|
8
|
+
*
|
|
9
|
+
* Spend is not kept here: the spend ledger is the measured, append-only
|
|
10
|
+
* record, keyed by session and tag (plans/m10-hooks.md, decision 4).
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { Type } from "typebox";
|
|
15
|
+
import { Value } from "typebox/value";
|
|
16
|
+
import { stateDir } from "../config/load.js";
|
|
17
|
+
import { DecisionsError } from "../errors.js";
|
|
18
|
+
import { withFileLock, writeTextAtomic } from "../store/file.js";
|
|
19
|
+
export const GUARD_STATE_FORMAT = 1;
|
|
20
|
+
/** Past this the file is refused (fail open), never trimmed or deleted by decide. */
|
|
21
|
+
export const GUARD_STATE_MAX_BYTES = 1_000_000;
|
|
22
|
+
/** The most text kept per criteria file; a longer file is kept by hash only. */
|
|
23
|
+
export const CRITERIA_SNAPSHOT_MAX_CHARS = 16_384;
|
|
24
|
+
/** Sessions idle longer than this are pruned on the next write. */
|
|
25
|
+
export const SESSION_TTL_MS = 14 * 24 * 60 * 60 * 1000;
|
|
26
|
+
/** At most this many sessions are kept, newest first. */
|
|
27
|
+
export const MAX_SESSIONS = 200;
|
|
28
|
+
const CLOSED = { additionalProperties: false };
|
|
29
|
+
const Sha256 = Type.String({ pattern: "^[0-9a-f]{64}$" });
|
|
30
|
+
/** An ISO-8601 UTC timestamp, as `Date.toISOString` writes it. */
|
|
31
|
+
const Time = Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{1,3})?Z$" });
|
|
32
|
+
/** `<harness>:<harness session id>`, the same id the spend ledger uses. */
|
|
33
|
+
export const SESSION_ID_PATTERN = "^(claude|codex):[A-Za-z0-9._-]{1,128}$";
|
|
34
|
+
/** The most criteria files a session snapshots. */
|
|
35
|
+
export const MAX_CRITERIA_FILES = 20;
|
|
36
|
+
const SessionSchema = Type.Object({
|
|
37
|
+
harness: Type.Union([Type.Literal("claude"), Type.Literal("codex")]),
|
|
38
|
+
/** The commit the session started from; `null` in a repo with no commits yet. */
|
|
39
|
+
base: Type.Union([Type.String({ pattern: "^[0-9a-f]{40}([0-9a-f]{24})?$" }), Type.Null()]),
|
|
40
|
+
/** `first-stop`: SessionStart didn't run, so the base is HEAD at the first Stop. */
|
|
41
|
+
baseSource: Type.Union([Type.Literal("session-start"), Type.Literal("first-stop")]),
|
|
42
|
+
startedAt: Time,
|
|
43
|
+
updatedAt: Time,
|
|
44
|
+
/** The criteria files at the base, by hash; the text too when it fits. */
|
|
45
|
+
criteria: Type.Array(Type.Object({
|
|
46
|
+
path: Type.String({ minLength: 1 }),
|
|
47
|
+
sha256: Sha256,
|
|
48
|
+
text: Type.Optional(Type.String({ maxLength: CRITERIA_SNAPSHOT_MAX_CHARS })),
|
|
49
|
+
}, CLOSED), { maxItems: MAX_CRITERIA_FILES }),
|
|
50
|
+
/** The last check: the hash of what it looked at, and what it did. */
|
|
51
|
+
last: Type.Optional(Type.Object({
|
|
52
|
+
hash: Sha256,
|
|
53
|
+
at: Time,
|
|
54
|
+
outcome: Type.Union([
|
|
55
|
+
Type.Literal("allow"),
|
|
56
|
+
Type.Literal("block"),
|
|
57
|
+
Type.Literal("skipped"),
|
|
58
|
+
]),
|
|
59
|
+
}, CLOSED)),
|
|
60
|
+
}, CLOSED);
|
|
61
|
+
export const GuardStateSchema = Type.Object({
|
|
62
|
+
version: Type.Literal(GUARD_STATE_FORMAT),
|
|
63
|
+
sessions: Type.Record(Type.String({ pattern: SESSION_ID_PATTERN }), SessionSchema),
|
|
64
|
+
}, CLOSED);
|
|
65
|
+
export function guardStatePath(repoRoot) {
|
|
66
|
+
return join(stateDir(repoRoot), "guard", "state.json");
|
|
67
|
+
}
|
|
68
|
+
/** Every problem with a state value, as `path message` lines. Empty when valid. */
|
|
69
|
+
export function guardStateProblems(value) {
|
|
70
|
+
const problems = [...Value.Errors(GuardStateSchema, value)].map((e) => `${e.instancePath || "/"} ${e.message}`);
|
|
71
|
+
// The schema's key pattern isn't enforced by the validator, so check ids here:
|
|
72
|
+
// this also keeps `__proto__` and friends out.
|
|
73
|
+
const sessions = value?.sessions;
|
|
74
|
+
if (typeof sessions === "object" && sessions !== null) {
|
|
75
|
+
const pattern = new RegExp(SESSION_ID_PATTERN);
|
|
76
|
+
for (const id of Object.keys(sessions)) {
|
|
77
|
+
if (!pattern.test(id))
|
|
78
|
+
problems.push(`/sessions ${JSON.stringify(id)} is not a session id`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return problems;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read the state. A missing file is an empty state. A file that is too large
|
|
85
|
+
* or malformed is an error and is left as it is: the hook fails open with the
|
|
86
|
+
* message, and the user deletes the file if they want to start over.
|
|
87
|
+
*/
|
|
88
|
+
export function readGuardState(file) {
|
|
89
|
+
if (!existsSync(file))
|
|
90
|
+
return { version: GUARD_STATE_FORMAT, sessions: {} };
|
|
91
|
+
let size;
|
|
92
|
+
let text;
|
|
93
|
+
try {
|
|
94
|
+
size = statSync(file).size;
|
|
95
|
+
if (size > GUARD_STATE_MAX_BYTES)
|
|
96
|
+
throw unreadable(file, [`it is ${size} bytes, over the limit`]);
|
|
97
|
+
text = readFileSync(file, "utf8");
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
if (error instanceof DecisionsError)
|
|
101
|
+
throw error;
|
|
102
|
+
throw unreadable(file, [`cannot read it: ${error.message}`]);
|
|
103
|
+
}
|
|
104
|
+
let value;
|
|
105
|
+
try {
|
|
106
|
+
value = JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
throw unreadable(file, [`not JSON: ${error.message}`]);
|
|
110
|
+
}
|
|
111
|
+
const problems = guardStateProblems(value);
|
|
112
|
+
if (problems.length)
|
|
113
|
+
throw unreadable(file, problems);
|
|
114
|
+
return value;
|
|
115
|
+
}
|
|
116
|
+
function unreadable(file, problems) {
|
|
117
|
+
return new DecisionsError("invalid-request", `${file} is not a valid guard state (it was left as it is; delete it to start over):\n ${problems.join("\n ")}`, { file, problems });
|
|
118
|
+
}
|
|
119
|
+
/** Drop sessions idle past the TTL, then keep the newest `MAX_SESSIONS`. */
|
|
120
|
+
export function pruneSessions(state, now) {
|
|
121
|
+
const cutoff = now.getTime() - SESSION_TTL_MS;
|
|
122
|
+
// A time in the future (clock skew) counts as now, so it still expires.
|
|
123
|
+
const at = (s) => Math.min(Date.parse(s.updatedAt), now.getTime());
|
|
124
|
+
const kept = Object.entries(state.sessions)
|
|
125
|
+
.filter(([, s]) => at(s) >= cutoff)
|
|
126
|
+
.sort(([, a], [, b]) => at(b) - at(a))
|
|
127
|
+
.slice(0, MAX_SESSIONS);
|
|
128
|
+
return { ...state, sessions: Object.fromEntries(kept) };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Read, change and write the state under its lock, pruning as it writes.
|
|
132
|
+
* `change` returns the new state, or `undefined` to write nothing.
|
|
133
|
+
*/
|
|
134
|
+
export function updateGuardState(file, change, options = {}) {
|
|
135
|
+
const now = options.now ?? new Date();
|
|
136
|
+
return withFileLock(file, {
|
|
137
|
+
waitMs: options.waitMs ?? 200,
|
|
138
|
+
staleMs: 30_000,
|
|
139
|
+
busy: (lock) => new DecisionsError("invalid-request", `${file} is locked by another guard hook (${lock}). Delete the lock file if no hook is running.`, { file, lock }),
|
|
140
|
+
}, () => {
|
|
141
|
+
const { state, result } = change(readGuardState(file));
|
|
142
|
+
if (state) {
|
|
143
|
+
const next = pruneSessions(state, now);
|
|
144
|
+
const problems = guardStateProblems(next);
|
|
145
|
+
if (problems.length) {
|
|
146
|
+
throw new DecisionsError("invalid-request", `Refused to write an invalid guard state to ${file} (a bug in decide; the file is unchanged):\n ${problems.join("\n ")}`, { file, problems });
|
|
147
|
+
}
|
|
148
|
+
writeTextAtomic(file, fitToSize(next));
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* The state as JSON within `GUARD_STATE_MAX_BYTES`, so a write can never make
|
|
155
|
+
* the next read fail. Over the limit, the oldest sessions lose their criteria
|
|
156
|
+
* text first (their hashes stay, so a changed file is still noticed), then the
|
|
157
|
+
* oldest sessions go. Sessions are ordered newest first by `pruneSessions`.
|
|
158
|
+
*/
|
|
159
|
+
export function fitToSize(state) {
|
|
160
|
+
const text = (s) => `${JSON.stringify(s, null, 2)}\n`;
|
|
161
|
+
let out = text(state);
|
|
162
|
+
if (Buffer.byteLength(out) <= GUARD_STATE_MAX_BYTES)
|
|
163
|
+
return out;
|
|
164
|
+
const entries = Object.entries(state.sessions).map(([id, s]) => [id, { ...s, criteria: s.criteria.map((c) => ({ ...c })) }]);
|
|
165
|
+
const current = () => ({ ...state, sessions: Object.fromEntries(entries) });
|
|
166
|
+
for (let i = entries.length - 1; i >= 0; i--) {
|
|
167
|
+
for (const c of entries[i]?.[1].criteria ?? [])
|
|
168
|
+
delete c.text;
|
|
169
|
+
out = text(current());
|
|
170
|
+
if (Buffer.byteLength(out) <= GUARD_STATE_MAX_BYTES)
|
|
171
|
+
return out;
|
|
172
|
+
}
|
|
173
|
+
while (entries.length > 0) {
|
|
174
|
+
entries.pop();
|
|
175
|
+
out = text(current());
|
|
176
|
+
if (Buffer.byteLength(out) <= GUARD_STATE_MAX_BYTES)
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/guard/state.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { assertConsent, setConsent } from "./config/consent.js";
|
|
1
|
+
export { assertConsent, setConsent, setGuardEnabled } from "./config/consent.js";
|
|
2
2
|
export type { Budget, Consent, DecisionsConfig, LoadOptions, ResolvedConfig, } from "./config/load.js";
|
|
3
3
|
export { allProfiles, DEFAULTS, findRepoRoot, loadConfig, repoConfigPath, userConfigDir, } from "./config/load.js";
|
|
4
4
|
export type { DetectedSession, Harness } from "./config/session.js";
|
|
@@ -13,6 +13,10 @@ export type { ErrorCode } from "./errors.js";
|
|
|
13
13
|
export { DecisionsError, isDecisionsError, ProviderError } from "./errors.js";
|
|
14
14
|
export type { FixtureRecord } from "./fixtures/store.js";
|
|
15
15
|
export { canonicalJson, FIXTURE_VERSION, FixtureStore, fixtureKey } from "./fixtures/store.js";
|
|
16
|
+
export type { GuardConfig, GuardPackConfig, PackName } from "./guard/packs.js";
|
|
17
|
+
export { isPackName, PACK_NAMES, PACKS } from "./guard/packs.js";
|
|
18
|
+
export type { GuardSession, GuardState } from "./guard/state.js";
|
|
19
|
+
export { GUARD_STATE_FORMAT, guardStatePath, guardStateProblems, readGuardState, updateGuardState, } from "./guard/state.js";
|
|
16
20
|
export { confidenceOf, DEFAULT_UNDECIDED_FLOOR, isChoice, isNoul, isScore, isUndecided, noulConfidence, rankedProbabilities, undecidedNames, } from "./model/answers.js";
|
|
17
21
|
export type { ModelProfile } from "./model/profiles.js";
|
|
18
22
|
export { DEFAULT_MODEL_ID, PROFILES, projectCost, resolveProfile } from "./model/profiles.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { assertConsent, setConsent } from "./config/consent.js";
|
|
1
|
+
export { assertConsent, setConsent, setGuardEnabled } from "./config/consent.js";
|
|
2
2
|
export { allProfiles, DEFAULTS, findRepoRoot, loadConfig, repoConfigPath, userConfigDir, } from "./config/load.js";
|
|
3
3
|
export { detectHarness, detectSession } from "./config/session.js";
|
|
4
4
|
export { createDecider } from "./decide.js";
|
|
@@ -7,6 +7,8 @@ export { scrubQuestions, scrubState, scrubText } from "./egress/scrub.js";
|
|
|
7
7
|
export { assertStateFits, CHARS_PER_TOKEN, estimateTokens } from "./egress/size.js";
|
|
8
8
|
export { DecisionsError, isDecisionsError, ProviderError } from "./errors.js";
|
|
9
9
|
export { canonicalJson, FIXTURE_VERSION, FixtureStore, fixtureKey } from "./fixtures/store.js";
|
|
10
|
+
export { isPackName, PACK_NAMES, PACKS } from "./guard/packs.js";
|
|
11
|
+
export { GUARD_STATE_FORMAT, guardStatePath, guardStateProblems, readGuardState, updateGuardState, } from "./guard/state.js";
|
|
10
12
|
export { confidenceOf, DEFAULT_UNDECIDED_FLOOR, isChoice, isNoul, isScore, isUndecided, noulConfidence, rankedProbabilities, undecidedNames, } from "./model/answers.js";
|
|
11
13
|
export { DEFAULT_MODEL_ID, PROFILES, projectCost, resolveProfile } from "./model/profiles.js";
|
|
12
14
|
export { assertQuestionSet, parseDecisionResponse } from "./model/validate.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../src/opportunities/backlog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../src/opportunities/backlog.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
4
|
import { Type } from "typebox";
|
|
5
5
|
import { Value } from "typebox/value";
|
|
6
6
|
import { stateDir } from "../config/load.js";
|
|
@@ -8,6 +8,7 @@ import { DecisionsError } from "../errors.js";
|
|
|
8
8
|
import { QuestionSchema } from "../model/schema.js";
|
|
9
9
|
import { assertQuestionSet } from "../model/validate.js";
|
|
10
10
|
import { tokenizeFilter, tokenizeSort } from "../project/project.js";
|
|
11
|
+
import { withFileLock, writeJsonAtomic } from "../store/file.js";
|
|
11
12
|
/**
|
|
12
13
|
* The scout backlog: places where an LLM call, a hand-written heuristic or an
|
|
13
14
|
* agent fan-out is doing a decision model's job. The `scout` skill decides what
|
|
@@ -192,41 +193,15 @@ const LOCK_STALE_MS = 30_000;
|
|
|
192
193
|
* A lock older than 30 s is from a crashed run and is taken over.
|
|
193
194
|
*/
|
|
194
195
|
export function withBacklogLock(file, body) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
closeSync(openSync(lock, "wx"));
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
catch (error) {
|
|
204
|
-
if (error.code !== "EEXIST")
|
|
205
|
-
throw error;
|
|
206
|
-
try {
|
|
207
|
-
if (Date.now() - statSync(lock).mtimeMs > LOCK_STALE_MS)
|
|
208
|
-
rmSync(lock, { force: true });
|
|
209
|
-
}
|
|
210
|
-
catch { }
|
|
211
|
-
if (Date.now() > deadline) {
|
|
212
|
-
throw new DecisionsError("invalid-request", `${file} is locked by another \`decide opportunities add\` (${lock}). Retry, or delete the lock file if no add is running.`, { file, lock });
|
|
213
|
-
}
|
|
214
|
-
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 25);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
try {
|
|
218
|
-
return body();
|
|
219
|
-
}
|
|
220
|
-
finally {
|
|
221
|
-
rmSync(lock, { force: true });
|
|
222
|
-
}
|
|
196
|
+
return withFileLock(file, {
|
|
197
|
+
waitMs: LOCK_WAIT_MS,
|
|
198
|
+
staleMs: LOCK_STALE_MS,
|
|
199
|
+
busy: (lock) => new DecisionsError("invalid-request", `${file} is locked by another \`decide opportunities add\` (${lock}). Retry, or delete the lock file if no add is running.`, { file, lock }),
|
|
200
|
+
}, body);
|
|
223
201
|
}
|
|
224
202
|
/** Written whole, through a temp file, so a crash never leaves half a backlog. */
|
|
225
203
|
export function writeBacklog(file, backlog) {
|
|
226
|
-
|
|
227
|
-
const tmp = `${file}.${process.pid}.tmp`;
|
|
228
|
-
writeFileSync(tmp, `${JSON.stringify(backlog, null, 2)}\n`);
|
|
229
|
-
renameSync(tmp, file);
|
|
204
|
+
writeJsonAtomic(file, backlog);
|
|
230
205
|
}
|
|
231
206
|
/**
|
|
232
207
|
* Merge candidates into a backlog.
|