@su-record/vibe 4.2.35 → 4.2.36
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/dist/cli/common.js +4 -1
- package/dist/cli/common.js.map +1 -1
- package/dist/cli/heldout.js +10 -4
- package/dist/cli/heldout.js.map +1 -1
- package/dist/cli/human.js +8 -4
- package/dist/cli/human.js.map +1 -1
- package/dist/cli/internal.js +37 -24
- package/dist/cli/internal.js.map +1 -1
- package/dist/cli/ledger.js +67 -0
- package/dist/cli/ledger.js.map +1 -0
- package/dist/cli/map.js +5 -3
- package/dist/cli/map.js.map +1 -1
- package/dist/cli/memory.js +104 -74
- package/dist/cli/memory.js.map +1 -1
- package/dist/cli/risks.js +20 -3
- package/dist/cli/risks.js.map +1 -1
- package/dist/cli/session.js +4 -2
- package/dist/cli/session.js.map +1 -1
- package/dist/cli/setup.js +44 -13
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/work.js +73 -21
- package/dist/cli/work.js.map +1 -1
- package/dist/cli.js +18 -6
- package/dist/cli.js.map +1 -1
- package/dist/core/analyze.js +21 -7
- package/dist/core/analyze.js.map +1 -1
- package/dist/core/artifact-paths.js +14 -3
- package/dist/core/artifact-paths.js.map +1 -1
- package/dist/core/capabilities.js +69 -15
- package/dist/core/capabilities.js.map +1 -1
- package/dist/core/check-authorization.js +37 -0
- package/dist/core/check-authorization.js.map +1 -0
- package/dist/core/check-process.js +12 -4
- package/dist/core/check-process.js.map +1 -1
- package/dist/core/check-report.js +66 -0
- package/dist/core/check-report.js.map +1 -0
- package/dist/core/check.js +59 -71
- package/dist/core/check.js.map +1 -1
- package/dist/core/checks/changed.js +20 -6
- package/dist/core/checks/changed.js.map +1 -1
- package/dist/core/checks/eval.js +35 -10
- package/dist/core/checks/eval.js.map +1 -1
- package/dist/core/checks/file.js +26 -23
- package/dist/core/checks/file.js.map +1 -1
- package/dist/core/checks/fileRules.js +42 -16
- package/dist/core/checks/fileRules.js.map +1 -1
- package/dist/core/checks/http.js +35 -34
- package/dist/core/checks/http.js.map +1 -1
- package/dist/core/checks/packs.js +1 -1
- package/dist/core/checks/packs.js.map +1 -1
- package/dist/core/checks/review.js +75 -40
- package/dist/core/checks/review.js.map +1 -1
- package/dist/core/checks/run.js +5 -2
- package/dist/core/checks/run.js.map +1 -1
- package/dist/core/checks/schema.js +25 -0
- package/dist/core/checks/schema.js.map +1 -0
- package/dist/core/checks/source.js +11 -6
- package/dist/core/checks/source.js.map +1 -1
- package/dist/core/config.js +9 -2
- package/dist/core/config.js.map +1 -1
- package/dist/core/consent.js +24 -16
- package/dist/core/consent.js.map +1 -1
- package/dist/core/context-notes.js +15 -7
- package/dist/core/context-notes.js.map +1 -1
- package/dist/core/context.js +24 -12
- package/dist/core/context.js.map +1 -1
- package/dist/core/conventions.js +22 -9
- package/dist/core/conventions.js.map +1 -1
- package/dist/core/docs/cfb.js +81 -45
- package/dist/core/docs/cfb.js.map +1 -1
- package/dist/core/docs/html.js +14 -3
- package/dist/core/docs/html.js.map +1 -1
- package/dist/core/docs/hwp.js +44 -22
- package/dist/core/docs/hwp.js.map +1 -1
- package/dist/core/docs/office.js +20 -10
- package/dist/core/docs/office.js.map +1 -1
- package/dist/core/docs/pdf.js +10 -4
- package/dist/core/docs/pdf.js.map +1 -1
- package/dist/core/docs/read.js +32 -24
- package/dist/core/docs/read.js.map +1 -1
- package/dist/core/docs/zip.js +32 -15
- package/dist/core/docs/zip.js.map +1 -1
- package/dist/core/evidence.js +17 -7
- package/dist/core/evidence.js.map +1 -1
- package/dist/core/failure-message.js +35 -13
- package/dist/core/failure-message.js.map +1 -1
- package/dist/core/failure.js +49 -14
- package/dist/core/failure.js.map +1 -1
- package/dist/core/github.js +3 -1
- package/dist/core/github.js.map +1 -1
- package/dist/core/handoff.js +20 -7
- package/dist/core/handoff.js.map +1 -1
- package/dist/core/heldout-run.js +6 -3
- package/dist/core/heldout-run.js.map +1 -1
- package/dist/core/heldout.js +24 -13
- package/dist/core/heldout.js.map +1 -1
- package/dist/core/inbox.js +3 -1
- package/dist/core/inbox.js.map +1 -1
- package/dist/core/inputs.js +6 -3
- package/dist/core/inputs.js.map +1 -1
- package/dist/core/inspect.js +61 -20
- package/dist/core/inspect.js.map +1 -1
- package/dist/core/intent.js +35 -13
- package/dist/core/intent.js.map +1 -1
- package/dist/core/knowledge-find.js +31 -12
- package/dist/core/knowledge-find.js.map +1 -1
- package/dist/core/knowledge.js +22 -12
- package/dist/core/knowledge.js.map +1 -1
- package/dist/core/lang.js +5 -2
- package/dist/core/lang.js.map +1 -1
- package/dist/core/ledger.js +44 -20
- package/dist/core/ledger.js.map +1 -1
- package/dist/core/locations.js +12 -0
- package/dist/core/locations.js.map +1 -0
- package/dist/core/map/imports.js +20 -9
- package/dist/core/map/imports.js.map +1 -1
- package/dist/core/map/index.js +28 -13
- package/dist/core/map/index.js.map +1 -1
- package/dist/core/map/symbols.js +27 -12
- package/dist/core/map/symbols.js.map +1 -1
- package/dist/core/output-capture.js +7 -4
- package/dist/core/output-capture.js.map +1 -1
- package/dist/core/paths.js +2 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/core/performance.js +43 -17
- package/dist/core/performance.js.map +1 -1
- package/dist/core/profile.js +6 -3
- package/dist/core/profile.js.map +1 -1
- package/dist/core/reader.js +32 -16
- package/dist/core/reader.js.map +1 -1
- package/dist/core/readerSession.js +34 -14
- package/dist/core/readerSession.js.map +1 -1
- package/dist/core/recent.js +20 -6
- package/dist/core/recent.js.map +1 -1
- package/dist/core/regress.js +21 -12
- package/dist/core/regress.js.map +1 -1
- package/dist/core/repair.js +22 -4
- package/dist/core/repair.js.map +1 -1
- package/dist/core/research-queries.js +85 -0
- package/dist/core/research-queries.js.map +1 -0
- package/dist/core/research.js +89 -88
- package/dist/core/research.js.map +1 -1
- package/dist/core/results.js +15 -6
- package/dist/core/results.js.map +1 -1
- package/dist/core/risk-signals.js +53 -15
- package/dist/core/risk-signals.js.map +1 -1
- package/dist/core/run-id.js +10 -6
- package/dist/core/run-id.js.map +1 -1
- package/dist/core/scenarios.js +91 -60
- package/dist/core/scenarios.js.map +1 -1
- package/dist/core/session.js +3 -2
- package/dist/core/session.js.map +1 -1
- package/dist/core/size.js +28 -8
- package/dist/core/size.js.map +1 -1
- package/dist/core/skills.js +66 -28
- package/dist/core/skills.js.map +1 -1
- package/dist/core/skillsmp.js +26 -12
- package/dist/core/skillsmp.js.map +1 -1
- package/dist/core/source-basis.js +21 -9
- package/dist/core/source-basis.js.map +1 -1
- package/dist/core/status.js +26 -13
- package/dist/core/status.js.map +1 -1
- package/dist/core/table.js +8 -1
- package/dist/core/table.js.map +1 -1
- package/dist/core/tokens.js +20 -10
- package/dist/core/tokens.js.map +1 -1
- package/dist/core/tree.js +26 -16
- package/dist/core/tree.js.map +1 -1
- package/dist/core/verification-plan.js +24 -8
- package/dist/core/verification-plan.js.map +1 -1
- package/dist/core/verification.js +14 -7
- package/dist/core/verification.js.map +1 -1
- package/dist/core/view.js +93 -44
- package/dist/core/view.js.map +1 -1
- package/dist/install/global.js +37 -18
- package/dist/install/global.js.map +1 -1
- package/dist/install/hooks.js +17 -8
- package/dist/install/hooks.js.map +1 -1
- package/dist/install/manifest.js +11 -0
- package/dist/install/manifest.js.map +1 -0
- package/dist/install/mcpb.js +52 -23
- package/dist/install/mcpb.js.map +1 -1
- package/dist/install/plugin.js +73 -33
- package/dist/install/plugin.js.map +1 -1
- package/dist/install/project.js +8 -7
- package/dist/install/project.js.map +1 -1
- package/dist/install/register.js +83 -48
- package/dist/install/register.js.map +1 -1
- package/dist/install/tree.js +27 -11
- package/dist/install/tree.js.map +1 -1
- package/dist/install/update.js +46 -20
- package/dist/install/update.js.map +1 -1
- package/hooks/code-map.cjs +22 -9
- package/hooks/journal.cjs +18 -16
- package/hooks/knowledge-auto.cjs +55 -21
- package/hooks/knowledge-journal.cjs +47 -20
- package/hooks/knowledge-projects.cjs +50 -21
- package/hooks/knowledge-recall.cjs +16 -6
- package/hooks/knowledge-upkeep.cjs +22 -5
- package/hooks/locations.cjs +35 -0
- package/hooks/notify.js +52 -24
- package/hooks/obsidian.cjs +17 -7
- package/hooks/private-store.cjs +25 -10
- package/hooks/retest.cjs +39 -16
- package/hooks/session-context.cjs +30 -13
- package/hooks/session-files.cjs +44 -21
- package/hooks/session-repair.cjs +26 -11
- package/hooks/session-state.cjs +78 -38
- package/hooks/session.js +19 -8
- package/hooks/slice-command.cjs +38 -17
- package/hooks/slice-guard.cjs +20 -6
- package/hooks/slice-store.cjs +25 -12
- package/mcpb/server/index.js +40 -12
- package/package.json +1 -1
package/dist/core/handoff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/core/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/core/handoff.ts"],"names":[],"mappings":"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"}
|
package/dist/core/heldout-run.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { assertNoLeak, runExam } from './heldout.js';
|
|
2
2
|
export const HELDOUT_PREFIX = 'heldout:';
|
|
3
|
+
const CODE_FAILED = 'heldout-failed';
|
|
4
|
+
const CODE_LEAK = 'heldout-leak';
|
|
5
|
+
const CODE_LEAK_SCAN_INCOMPLETE = 'heldout-leak-scan-incomplete';
|
|
3
6
|
/**
|
|
4
7
|
* Sealed exams, judged after the declared scenarios so that nothing of the project is still
|
|
5
8
|
* running when a program arrives on the shell's stdin. The outcome is `{id, status}`: no tail, no
|
|
@@ -10,14 +13,14 @@ export async function runHeldOut(root, exams, shownSoFar) {
|
|
|
10
13
|
const outcomes = [];
|
|
11
14
|
for (const exam of exams) {
|
|
12
15
|
const result = await runExam(root, exam);
|
|
13
|
-
|
|
14
|
-
|
|
16
|
+
const failed = result.status === 'pass' ? {} : { failureCode: CODE_FAILED, reason: CODE_FAILED };
|
|
17
|
+
outcomes.push({ id: `${HELDOUT_PREFIX}${exam.id}`, type: 'heldout', status: result.status, exit: null, ms: result.ms, tail: '', ...failed });
|
|
15
18
|
}
|
|
16
19
|
// Fails closed: a scan that could not finish is not a clean scan.
|
|
17
20
|
const leak = assertNoLeak(root, exams, JSON.stringify([...shownSoFar, ...outcomes]));
|
|
18
21
|
if (leak.found.length === 0 && leak.complete)
|
|
19
22
|
return outcomes;
|
|
20
|
-
const reason = leak.found.length > 0 ?
|
|
23
|
+
const reason = leak.found.length > 0 ? CODE_LEAK : CODE_LEAK_SCAN_INCOMPLETE;
|
|
21
24
|
return outcomes.map((outcome) => ({ ...outcome, status: 'fail', failureCode: reason, reason,
|
|
22
25
|
// Paths only. A surface that holds the program is one the session wrote it to.
|
|
23
26
|
sources: leak.found }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heldout-run.js","sourceRoot":"","sources":["../../src/core/heldout-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"heldout-run.js","sourceRoot":"","sources":["../../src/core/heldout-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAmB,MAAM,cAAc,CAAC;AAEtE,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AACzC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AACrC,MAAM,SAAS,GAAG,cAAc,CAAC;AACjC,MAAM,yBAAyB,GAAG,8BAA8B,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,KAAmB,EAAE,UAA6B;IAC/F,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QACjG,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IAC/I,CAAC;IACD,kEAAkE;IAClE,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC;IAC7E,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,MAAe,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM;QAClG,+EAA+E;QAC/E,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|
package/dist/core/heldout.js
CHANGED
|
@@ -8,9 +8,19 @@ import { executionShell, fingerprint } from './inspect.js';
|
|
|
8
8
|
import { readPrivate, writePrivate, privateDirectory } from './private-store.js';
|
|
9
9
|
import { vibePath } from './paths.js';
|
|
10
10
|
import { nowIso } from './store.js';
|
|
11
|
-
const EXAM_TIMEOUT_MS =
|
|
11
|
+
const EXAM_TIMEOUT_MS = 10 * 60 * 1000;
|
|
12
12
|
const SCAN_FILE_LIMIT = 4_000;
|
|
13
|
-
const SCAN_BYTES_LIMIT = 64 *
|
|
13
|
+
const SCAN_BYTES_LIMIT = 64 * 1024 * 1024;
|
|
14
|
+
const SCAN_DEPTH_LIMIT = 12;
|
|
15
|
+
const GIT_LIST_TIMEOUT_MS = 30_000;
|
|
16
|
+
const STORE_SCHEMA_VERSION = 1;
|
|
17
|
+
const EXAM_ID = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
18
|
+
/** The owner sees this much of an exam's digest, never the program. */
|
|
19
|
+
const DIGEST_PREVIEW_CHARS = 12;
|
|
20
|
+
const MALFORMED_STORE = 'the held-out store is malformed; re-seal the exams';
|
|
21
|
+
/** `sh -s` reads the program from stdin. */
|
|
22
|
+
const SHELL_READS_STDIN = ['-s'];
|
|
23
|
+
const REPORT_SURFACE = 'the run report';
|
|
14
24
|
/** A line short enough to collide by accident is not evidence of a leak. */
|
|
15
25
|
const LEAK_LINE_MIN = 16;
|
|
16
26
|
function storeName(root) {
|
|
@@ -31,16 +41,16 @@ export function readExams(root) {
|
|
|
31
41
|
parsed = JSON.parse(text);
|
|
32
42
|
}
|
|
33
43
|
catch {
|
|
34
|
-
throw denied(
|
|
44
|
+
throw denied(MALFORMED_STORE);
|
|
35
45
|
}
|
|
36
46
|
const exams = parsed.exams;
|
|
37
|
-
if (parsed.schemaVersion !==
|
|
38
|
-
throw denied(
|
|
47
|
+
if (parsed.schemaVersion !== STORE_SCHEMA_VERSION || !Array.isArray(exams)) {
|
|
48
|
+
throw denied(MALFORMED_STORE);
|
|
39
49
|
}
|
|
40
50
|
return exams.map((entry) => {
|
|
41
51
|
const exam = entry;
|
|
42
52
|
if (typeof exam.id !== 'string' || typeof exam.program !== 'string' || typeof exam.sha256 !== 'string') {
|
|
43
|
-
throw denied(
|
|
53
|
+
throw denied(MALFORMED_STORE);
|
|
44
54
|
}
|
|
45
55
|
if (programDigest(exam.program) !== exam.sha256)
|
|
46
56
|
throw denied(`held-out exam ${exam.id} does not match its own digest; re-seal it`);
|
|
@@ -51,11 +61,11 @@ export function programDigest(program) {
|
|
|
51
61
|
return createHash('sha256').update(program, 'utf8').digest('hex');
|
|
52
62
|
}
|
|
53
63
|
function writeExams(root, exams) {
|
|
54
|
-
writePrivate(root, storeName(root), JSON.stringify({ schemaVersion:
|
|
64
|
+
writePrivate(root, storeName(root), JSON.stringify({ schemaVersion: STORE_SCHEMA_VERSION, exams }));
|
|
55
65
|
}
|
|
56
66
|
/** Sealing is the owner's act; the caller establishes it under the token policy (cli/heldout.ts) before calling this. */
|
|
57
67
|
export function sealExam(root, id, program, sealedBy) {
|
|
58
|
-
if (
|
|
68
|
+
if (!EXAM_ID.test(id))
|
|
59
69
|
throw usage('a held-out id is lower-case letters, digits and hyphens');
|
|
60
70
|
if (!program.trim())
|
|
61
71
|
throw usage('a held-out exam needs a program on stdin');
|
|
@@ -75,14 +85,14 @@ export function dropExam(root, id) {
|
|
|
75
85
|
* description of what is tested is part of the exam, and this output can reach a session.
|
|
76
86
|
*/
|
|
77
87
|
export function examSummaries(root) {
|
|
78
|
-
return readExams(root).map((exam) => ({ id: exam.id, sealedAt: exam.sealedAt, sealedBy: exam.sealedBy, digest: exam.sha256.slice(0,
|
|
88
|
+
return readExams(root).map((exam) => ({ id: exam.id, sealedAt: exam.sealedAt, sealedBy: exam.sealedBy, digest: exam.sha256.slice(0, DIGEST_PREVIEW_CHARS) }));
|
|
79
89
|
}
|
|
80
90
|
/**
|
|
81
91
|
* Runs one exam with its program on stdin — the channel vica's judge uses, and the reason masking
|
|
82
92
|
* its store did not break it. Nothing but the exit code is kept.
|
|
83
93
|
*/
|
|
84
94
|
export async function runExam(root, exam) {
|
|
85
|
-
const result = await checkProcess(executionShell(), { cwd: root, timeoutMs: EXAM_TIMEOUT_MS, input: exam.program, args:
|
|
95
|
+
const result = await checkProcess(executionShell(), { cwd: root, timeoutMs: EXAM_TIMEOUT_MS, input: exam.program, args: SHELL_READS_STDIN });
|
|
86
96
|
const passed = result.failureCode === null && !result.signal && result.exit === 0;
|
|
87
97
|
return { id: exam.id, status: passed ? 'pass' : 'fail', ms: result.ms };
|
|
88
98
|
}
|
|
@@ -100,7 +110,7 @@ function leakNeedles(exams) {
|
|
|
100
110
|
return [...needles];
|
|
101
111
|
}
|
|
102
112
|
function walk(directory, into, depth = 0) {
|
|
103
|
-
if (depth >
|
|
113
|
+
if (depth > SCAN_DEPTH_LIMIT || into.length > SCAN_FILE_LIMIT)
|
|
104
114
|
return;
|
|
105
115
|
let entries;
|
|
106
116
|
try {
|
|
@@ -122,7 +132,8 @@ function walk(directory, into, depth = 0) {
|
|
|
122
132
|
* — minus the store file that holds the exams, which is the one place they belong.
|
|
123
133
|
*/
|
|
124
134
|
function scanFiles(root) {
|
|
125
|
-
const
|
|
135
|
+
const gitList = ['ls-files', '-co', '--exclude-standard', '-z'];
|
|
136
|
+
const tracked = spawnSync('git', gitList, { cwd: root, encoding: 'utf8', timeout: GIT_LIST_TIMEOUT_MS });
|
|
126
137
|
const files = tracked.status === 0 ? tracked.stdout.split('\0').filter(Boolean).map((name) => path.join(root, name)) : [];
|
|
127
138
|
const extra = [];
|
|
128
139
|
for (const directory of [vibePath(root, ''), privateDirectory(root, false)])
|
|
@@ -139,7 +150,7 @@ export function assertNoLeak(root, exams, shown) {
|
|
|
139
150
|
const found = new Set();
|
|
140
151
|
for (const needle of needles)
|
|
141
152
|
if (shown.includes(needle))
|
|
142
|
-
found.add(
|
|
153
|
+
found.add(REPORT_SURFACE);
|
|
143
154
|
const files = scanFiles(root);
|
|
144
155
|
let bytes = 0;
|
|
145
156
|
let scanned = 0;
|
package/dist/core/heldout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heldout.js","sourceRoot":"","sources":["../../src/core/heldout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAyCpC,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"heldout.js","sourceRoot":"","sources":["../../src/core/heldout.ts"],"names":[],"mappings":"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"}
|
package/dist/core/inbox.js
CHANGED
|
@@ -2,11 +2,13 @@ import { randomInt } from 'node:crypto';
|
|
|
2
2
|
import { vibePath } from './paths.js';
|
|
3
3
|
import { appendJsonl, nowIso, readJsonl } from './store.js';
|
|
4
4
|
import { issueToken } from './tokens.js';
|
|
5
|
+
/** Upper bound of the random suffix of a question id. */
|
|
6
|
+
const ID_RANDOM_RANGE = 4096;
|
|
5
7
|
export function inboxPath(root) {
|
|
6
8
|
return vibePath(root, 'inbox.jsonl');
|
|
7
9
|
}
|
|
8
10
|
export function ask(root, input) {
|
|
9
|
-
const id = `q-${Date.now().toString(36)}-${randomInt(0,
|
|
11
|
+
const id = `q-${Date.now().toString(36)}-${randomInt(0, ID_RANDOM_RANGE).toString(36)}`;
|
|
10
12
|
let token = null;
|
|
11
13
|
let expiresAt = null;
|
|
12
14
|
let tokenId;
|
package/dist/core/inbox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/core/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAiCzD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;AACvC,CAAC;AAUD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,KAAe;IAC/C,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../src/core/inbox.ts"],"names":[],"mappings":"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"}
|
package/dist/core/inputs.js
CHANGED
|
@@ -7,6 +7,7 @@ import { relPosix } from './paths.js';
|
|
|
7
7
|
import { SOURCE } from './size.js';
|
|
8
8
|
import { treeHash } from './tree.js';
|
|
9
9
|
const SKIP_DIRS = new Set(['.git', 'node_modules', '.stryker-tmp']);
|
|
10
|
+
const INPUTS_HASH_LENGTH = 16;
|
|
10
11
|
function filesUnder(root, input, into) {
|
|
11
12
|
const full = path.resolve(root, input);
|
|
12
13
|
const stat = fs.statSync(full, { throwIfNoEntry: false });
|
|
@@ -52,9 +53,11 @@ export function inputsHash(root, inputs) {
|
|
|
52
53
|
for (const input of [...inputs].sort())
|
|
53
54
|
if (!fs.existsSync(path.resolve(root, input)))
|
|
54
55
|
hash.update(`missing:${input}\n`);
|
|
55
|
-
for (const file of inputFiles(root, inputs))
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
for (const file of inputFiles(root, inputs)) {
|
|
57
|
+
const content = createHash('sha1').update(fs.readFileSync(path.resolve(root, file))).digest('hex');
|
|
58
|
+
hash.update(`${file}:${content}\n`);
|
|
59
|
+
}
|
|
60
|
+
return hash.digest('hex').slice(0, INPUTS_HASH_LENGTH);
|
|
58
61
|
}
|
|
59
62
|
/**
|
|
60
63
|
* What a pass is bound to: the hash of its declared inputs, or the whole working tree for a check
|
package/dist/core/inputs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/core/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../../src/core/inputs.ts"],"names":[],"mappings":"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"}
|
package/dist/core/inspect.js
CHANGED
|
@@ -10,7 +10,23 @@ import { CAPTURE_LIMIT, CAPTURE_GRACE_MS } from './output-capture.js';
|
|
|
10
10
|
import { readerHome, REVIEWER_DRIVER, withChoice } from './readerSession.js';
|
|
11
11
|
export const hashBytes = (value) => createHash('sha256').update(value).digest('hex');
|
|
12
12
|
export const fingerprint = (value) => hashBytes(JSON.stringify(value));
|
|
13
|
-
const MAX_INPUT =
|
|
13
|
+
const MAX_INPUT = 1024 * 1024;
|
|
14
|
+
const MAX_REJECTIONS = 100;
|
|
15
|
+
const MAX_REJECTION_REASON = 500;
|
|
16
|
+
const MAX_REGRESSION_FILES = 256;
|
|
17
|
+
const PLAN_SCHEMA_VERSION = 1;
|
|
18
|
+
const DEFAULT_INTENT_FILE = '.vibe/intent.md';
|
|
19
|
+
const DEFAULT_SCENARIOS_FILE = '.vibe/scenarios.yaml';
|
|
20
|
+
const WINDOWS_SHELL = 'C:\\Windows\\System32\\cmd.exe';
|
|
21
|
+
const POSIX_SHELL = '/bin/sh';
|
|
22
|
+
/** Timeout a check gets when it declares none. */
|
|
23
|
+
const DEFAULT_TIMEOUT_MS = { run: 10 * 60 * 1000, review: 10 * 60 * 1000, http: 30_000, eval: 60_000 };
|
|
24
|
+
const UNRESOLVED_DEPENDENCIES = 'Only explicitly declared verifier files are bound. Shell, package and dynamic dependencies have not been transitively audited.';
|
|
25
|
+
/** Environment variables that change what a check does; the receipt binds their values. */
|
|
26
|
+
const BOUND_ENVIRONMENT = [
|
|
27
|
+
'HOME', 'USERPROFILE', 'VIBE_HOME_DIR', 'VIBE_REVIEW_CMD', 'VIBE_REVIEW_CLIENT', 'VIBE_REVIEWER_MODEL', 'VIBE_REVIEWER_EFFORT',
|
|
28
|
+
];
|
|
29
|
+
const SHA256_HEX = /^[a-f0-9]{64}$/;
|
|
14
30
|
export function boundedFile(file, limit = MAX_INPUT) {
|
|
15
31
|
const absolute = path.resolve(file);
|
|
16
32
|
let part = path.parse(absolute).root;
|
|
@@ -25,8 +41,9 @@ export function boundedFile(file, limit = MAX_INPUT) {
|
|
|
25
41
|
const fd = fs.openSync(absolute, fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW ?? 0) | (fs.constants.O_NONBLOCK ?? 0));
|
|
26
42
|
try {
|
|
27
43
|
const stat = fs.fstatSync(fd);
|
|
28
|
-
if (!stat.isFile() || stat.size > limit || stat.ino !== before.ino || stat.dev !== before.dev)
|
|
44
|
+
if (!stat.isFile() || stat.size > limit || stat.ino !== before.ino || stat.dev !== before.dev) {
|
|
29
45
|
throw denied('inspection input changed or is not a regular file within the byte limit');
|
|
46
|
+
}
|
|
30
47
|
const buffer = Buffer.alloc(limit + 1);
|
|
31
48
|
const length = fs.readSync(fd, buffer, 0, buffer.length, 0);
|
|
32
49
|
if (length > limit)
|
|
@@ -45,22 +62,24 @@ export function inspectContract(root, files = []) {
|
|
|
45
62
|
return boundedFile(path.resolve(root, file)).toString('utf8');
|
|
46
63
|
}
|
|
47
64
|
catch (error) {
|
|
48
|
-
rejections.push({ id: file, reason: String(error.message).slice(0,
|
|
65
|
+
rejections.push({ id: file, reason: String(error.message).slice(0, MAX_REJECTION_REASON) });
|
|
49
66
|
return '';
|
|
50
67
|
}
|
|
51
68
|
};
|
|
52
|
-
if (files.length !== 0 && files.length !== 2)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
if (files.length !== 0 && files.length !== 2) {
|
|
70
|
+
const rejection = { id: '(arguments)', reason: 'inspect takes intent.md and scenarios.yaml together' };
|
|
71
|
+
return { intent: '', scenarios: [], rejections: [rejection], untrusted: true };
|
|
72
|
+
}
|
|
73
|
+
const intent = read(files[0] ?? DEFAULT_INTENT_FILE);
|
|
74
|
+
const parsed = parseScenarios(read(files[1] ?? DEFAULT_SCENARIOS_FILE));
|
|
56
75
|
if (!intent.trim())
|
|
57
76
|
rejections.push({ id: '(intent)', reason: 'intent body is empty' });
|
|
58
77
|
if (!parsed.scenarios.length)
|
|
59
78
|
rejections.push({ id: '(scenarios)', reason: 'no scenarios' });
|
|
60
|
-
return { intent, scenarios: parsed.scenarios, rejections: [...rejections, ...parsed.rejections].slice(0,
|
|
79
|
+
return { intent, scenarios: parsed.scenarios, rejections: [...rejections, ...parsed.rejections].slice(0, MAX_REJECTIONS), untrusted: true };
|
|
61
80
|
}
|
|
62
81
|
export function executionShell() {
|
|
63
|
-
const requested = process.platform === 'win32' ? process.env['ComSpec'] ??
|
|
82
|
+
const requested = process.platform === 'win32' ? process.env['ComSpec'] ?? WINDOWS_SHELL : POSIX_SHELL;
|
|
64
83
|
return fs.realpathSync(requested);
|
|
65
84
|
}
|
|
66
85
|
function verifier(root, file) {
|
|
@@ -90,22 +109,34 @@ function inspectedReviewer(root) {
|
|
|
90
109
|
return { choice, driver: withChoice(REVIEWER_DRIVER, choice), command, client: process.env['VIBE_REVIEW_CLIENT'] ?? null,
|
|
91
110
|
cwd: command ? root : resolvedDirectory(readerHome()) };
|
|
92
111
|
}
|
|
112
|
+
function timeoutOf(check) {
|
|
113
|
+
if (check.type === 'run' || check.type === 'http' || check.type === 'eval' || check.type === 'review') {
|
|
114
|
+
return check.timeoutMs ?? DEFAULT_TIMEOUT_MS[check.type];
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
93
118
|
function planCheck(root, scenario, reviewer) {
|
|
94
119
|
const check = scenario.check;
|
|
95
120
|
const cwd = check.type === 'review' ? reviewer.cwd : fs.realpathSync(check.type === 'run' && check.cwd ? path.resolve(root, check.cwd) : root);
|
|
96
121
|
const declared = scenario.verifiers ?? [];
|
|
97
|
-
|
|
98
|
-
|
|
122
|
+
const runsCode = check.type === 'run' || check.type === 'eval' || check.type === 'review';
|
|
123
|
+
return {
|
|
124
|
+
id: scenario.id,
|
|
125
|
+
needs: scenario.needs ?? [],
|
|
126
|
+
check,
|
|
127
|
+
cwd,
|
|
128
|
+
timeoutMs: timeoutOf(check),
|
|
99
129
|
expectedExit: check.type === 'run' ? check.expect ?? 0 : null,
|
|
100
130
|
verifiers: declared.map((file) => verifier(root, file)),
|
|
101
|
-
unresolved:
|
|
131
|
+
unresolved: runsCode ? [UNRESOLVED_DEPENDENCIES] : [],
|
|
132
|
+
};
|
|
102
133
|
}
|
|
103
134
|
function inspectedRegressions(root) {
|
|
104
135
|
const directory = vibePath(root, 'regressions');
|
|
105
136
|
if (!fs.existsSync(directory))
|
|
106
137
|
return [];
|
|
107
138
|
const names = fs.readdirSync(directory).filter((name) => name.endsWith('.yaml'));
|
|
108
|
-
if (names.length >
|
|
139
|
+
if (names.length > MAX_REGRESSION_FILES)
|
|
109
140
|
throw denied('too many regression files to inspect safely');
|
|
110
141
|
return names.sort().flatMap((name) => {
|
|
111
142
|
const parsed = parseScenarios(boundedFile(path.join(directory, name)).toString('utf8'));
|
|
@@ -124,15 +155,25 @@ export function executionPlan(root) {
|
|
|
124
155
|
const definitions = boundedFile(vibePath(canonical, 'scenarios.yaml')).toString('utf8');
|
|
125
156
|
const sourceFile = vibePath(canonical, 'source-basis.json');
|
|
126
157
|
const sources = fs.lstatSync(sourceFile, { throwIfNoEntry: false }) ? JSON.parse(boundedFile(sourceFile).toString('utf8')) : [];
|
|
127
|
-
|
|
158
|
+
const sourceInvalid = (source) => !source || typeof source.path !== 'string' || !SHA256_HEX.test(source.sha256 ?? '');
|
|
159
|
+
if (!Array.isArray(sources) || sources.some(sourceInvalid))
|
|
128
160
|
throw denied('invalid source basis in execution preview');
|
|
129
161
|
const reviewer = inspectedReviewer(canonical);
|
|
130
|
-
return {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
162
|
+
return {
|
|
163
|
+
schemaVersion: PLAN_SCHEMA_VERSION,
|
|
164
|
+
project: canonical,
|
|
165
|
+
contract: fingerprint({ intent: contract.intent, definitions, sources }),
|
|
166
|
+
riskBase: riskBase(canonical),
|
|
167
|
+
riskRules: riskRules(canonical),
|
|
168
|
+
platform: process.platform,
|
|
169
|
+
shell: executionShell(),
|
|
170
|
+
node: fs.realpathSync(process.execPath),
|
|
171
|
+
path: process.env['PATH'] ?? '',
|
|
172
|
+
pathExt: process.env['PATHEXT'] ?? '',
|
|
173
|
+
environment: Object.fromEntries(BOUND_ENVIRONMENT.map((key) => [key, process.env[key] ?? null])),
|
|
135
174
|
capture: { perStreamBytes: CAPTURE_LIMIT, cleanupGraceMs: CAPTURE_GRACE_MS },
|
|
136
|
-
reviewer,
|
|
175
|
+
reviewer,
|
|
176
|
+
checks: scenarios.map((scenario) => planCheck(canonical, scenario, reviewer)),
|
|
177
|
+
};
|
|
137
178
|
}
|
|
138
179
|
//# sourceMappingURL=inspect.js.map
|
package/dist/core/inspect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/core/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAiC,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAsB,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACxF,MAAM,SAAS,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/core/inspect.ts"],"names":[],"mappings":"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"}
|
package/dist/core/intent.js
CHANGED
|
@@ -6,6 +6,7 @@ import { denied, usage } from './errors.js';
|
|
|
6
6
|
import { openQuestions, resolve as resolveQuestion } from './inbox.js';
|
|
7
7
|
import { record } from './ledger.js';
|
|
8
8
|
import { vibePath } from './paths.js';
|
|
9
|
+
import { resultsPath } from './results.js';
|
|
9
10
|
import { parseScenarios } from './scenarios.js';
|
|
10
11
|
import { readState, transition } from './state.js';
|
|
11
12
|
import { captureSources, readSourceBasis, saveSourceBasis, sourceValidity } from './source-basis.js';
|
|
@@ -13,6 +14,10 @@ import { readJson, readText, writeAtomic, writeJson } from './store.js';
|
|
|
13
14
|
import { issueToken, verifyAndConsume } from './tokens.js';
|
|
14
15
|
import { changedVerifiers, consentStatus, saveConsent } from './consent.js';
|
|
15
16
|
import { executionPlan } from './inspect.js';
|
|
17
|
+
const INTENT_HASH_LENGTH = 16;
|
|
18
|
+
/** States from which a plain `approve` renews the receipt instead of approving a draft. */
|
|
19
|
+
const RENEWABLE_STATES = ['APPROVED', 'RUNNING', 'STUCK', 'DONE'];
|
|
20
|
+
const NO_SCENARIOS_ID = '(none)';
|
|
16
21
|
export function intentPath(root) {
|
|
17
22
|
return vibePath(root, 'intent.md');
|
|
18
23
|
}
|
|
@@ -23,7 +28,7 @@ export function intentHash(intentText, scenariosText, sources = []) {
|
|
|
23
28
|
const hash = createHash('sha256').update(intentText).update('\n---\n').update(scenariosText);
|
|
24
29
|
if (sources.length)
|
|
25
30
|
hash.update('\n---sources---\n').update(JSON.stringify(sources));
|
|
26
|
-
return hash.digest('hex').slice(0,
|
|
31
|
+
return hash.digest('hex').slice(0, INTENT_HASH_LENGTH);
|
|
27
32
|
}
|
|
28
33
|
export function loadScenarios(root) {
|
|
29
34
|
const text = readText(scenariosPath(root));
|
|
@@ -47,8 +52,9 @@ function definition(s) {
|
|
|
47
52
|
function keptResults(root, next) {
|
|
48
53
|
const before = new Map(loadScenarios(root).map((s) => [s.id, definition(s)]));
|
|
49
54
|
const after = new Map(next.map((s) => [s.id, definition(s)]));
|
|
50
|
-
const stored = readJson(
|
|
51
|
-
|
|
55
|
+
const stored = readJson(resultsPath(root)) ?? {};
|
|
56
|
+
const keep = ([id]) => after.has(id) ? before.get(id) === after.get(id) : !before.has(id);
|
|
57
|
+
return Object.fromEntries(Object.entries(stored).filter(keep));
|
|
52
58
|
}
|
|
53
59
|
/**
|
|
54
60
|
* Save intent + scenarios. If any scenario lacks a check type nothing is written — the
|
|
@@ -61,7 +67,7 @@ export function draft(root, intentText, scenariosText, sources) {
|
|
|
61
67
|
if (parsed.rejections.length > 0)
|
|
62
68
|
return { ok: false, rejections: parsed.rejections };
|
|
63
69
|
if (parsed.scenarios.length === 0)
|
|
64
|
-
return { ok: false, rejections: [{ id:
|
|
70
|
+
return { ok: false, rejections: [{ id: NO_SCENARIOS_ID, reason: 'no scenarios' }] };
|
|
65
71
|
const sourceBasis = captureSources(root, sources);
|
|
66
72
|
// The hash covers the exact bytes written — approve recomputes it from the files.
|
|
67
73
|
const intentNorm = intentText.endsWith('\n') ? intentText : `${intentText}\n`;
|
|
@@ -74,13 +80,24 @@ export function draft(root, intentText, scenariosText, sources) {
|
|
|
74
80
|
writeAtomic(intentPath(root), intentNorm);
|
|
75
81
|
writeAtomic(scenariosPath(root), scenariosNorm);
|
|
76
82
|
saveSourceBasis(root, sourceBasis);
|
|
77
|
-
writeJson(
|
|
78
|
-
transition(root, 'DRAFT', {
|
|
83
|
+
writeJson(resultsPath(root), kept);
|
|
84
|
+
transition(root, 'DRAFT', {
|
|
85
|
+
intentHash: hash,
|
|
86
|
+
approvedAt: null,
|
|
87
|
+
runs: previousState.runs,
|
|
88
|
+
failStreak: 0,
|
|
89
|
+
lastFailHash: null,
|
|
90
|
+
repair: null,
|
|
91
|
+
doneAt: null,
|
|
92
|
+
doneTree: null,
|
|
93
|
+
abandonedReason: null,
|
|
94
|
+
});
|
|
79
95
|
const policy = readConfig(root).tokens;
|
|
80
96
|
const issued = approvalNeedsToken(policy) ? issueToken(root, 'approve', hash) : null;
|
|
81
97
|
const edges = previous && previous !== hash ? [{ type: 'supersedes', from: `intent:${hash}`, to: `intent:${previous}` }] : [];
|
|
82
98
|
record(root, { event: 'draft', client: detectClient(), model: detectModel(), detail: hash, edges });
|
|
83
|
-
|
|
99
|
+
const { token, id: tokenId, expiresAt } = issued ?? { token: null, id: null, expiresAt: null };
|
|
100
|
+
return { ok: true, hash, scenarios: parsed.scenarios, token, tokenId, expiresAt, policy };
|
|
84
101
|
}
|
|
85
102
|
/**
|
|
86
103
|
* APPROVED — under `strict` only a human token does it; otherwise a plain approve is recorded as
|
|
@@ -89,7 +106,7 @@ export function draft(root, intentText, scenariosText, sources) {
|
|
|
89
106
|
*/
|
|
90
107
|
export function approve(root, token) {
|
|
91
108
|
const state = readState(root);
|
|
92
|
-
const renewal =
|
|
109
|
+
const renewal = RENEWABLE_STATES.includes(state.state) && !consentStatus(root).valid;
|
|
93
110
|
if ((state.state !== 'DRAFT' && !renewal) || !state.intentHash)
|
|
94
111
|
throw denied(`nothing to approve (current state ${state.state})`);
|
|
95
112
|
const sourceBasis = readSourceBasis(root);
|
|
@@ -97,15 +114,19 @@ export function approve(root, token) {
|
|
|
97
114
|
if (current !== state.intentHash)
|
|
98
115
|
throw denied('intent changed since the draft — run `intent draft` again to get a new token');
|
|
99
116
|
const validity = sourceValidity(root, sourceBasis);
|
|
100
|
-
if (validity && !validity.valid)
|
|
101
|
-
|
|
117
|
+
if (validity && !validity.valid) {
|
|
118
|
+
const files = [...validity.changed, ...validity.missing, ...validity.unreadable].join(', ');
|
|
119
|
+
throw denied(`source changed or missing since the draft: ${files} — re-evaluate affected findings and run \`intent draft\` again`);
|
|
120
|
+
}
|
|
102
121
|
const policy = readConfig(root).tokens;
|
|
103
122
|
const waiting = openQuestions(root).filter((question) => !question.answer?.trim());
|
|
104
123
|
// A pending approval question for this draft is what this approval answers, by token or, when the policy asks none, by chat.
|
|
105
124
|
const answers = token !== null || !approvalNeedsToken(policy);
|
|
106
125
|
const blocked = waiting.filter((question) => !(answers && question.needs === 'approve' && question.target === state.intentHash));
|
|
107
|
-
if (blocked.length)
|
|
108
|
-
|
|
126
|
+
if (blocked.length) {
|
|
127
|
+
const ids = blocked.map((question) => question.id).join(', ');
|
|
128
|
+
throw denied(`unanswered customer decisions: ${ids} — obtain an answer or resolve a withdrawn question before approval; defaults are not agreement`);
|
|
129
|
+
}
|
|
109
130
|
const plan = executionPlan(root);
|
|
110
131
|
// A renewal that changed the declared verifiers re-approves the files that judge the work. The
|
|
111
132
|
// person's policy decides whether that needs a token (only `strict` does, as for any approval);
|
|
@@ -128,7 +149,8 @@ export function approve(root, token) {
|
|
|
128
149
|
for (const question of waiting)
|
|
129
150
|
resolveQuestion(root, question.id);
|
|
130
151
|
const detail = `${state.intentHash} by ${basis}${regraded.length ? `; verifiers changed: ${regraded.join(', ')}` : ''}`;
|
|
131
|
-
|
|
152
|
+
const edges = [{ type: 'decided-by', from: `intent:${state.intentHash}`, to: by }];
|
|
153
|
+
record(root, { event: 'approve', client: detectClient(), model: detectModel(), detail, edges });
|
|
132
154
|
return { hash: state.intentHash, basis, verifiers: regraded };
|
|
133
155
|
}
|
|
134
156
|
export function abandon(root, reason) {
|