@dungle-scrubs/harness-cli-normalizer 0.5.6 → 0.5.7
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/cli/resume-guard.d.ts.map +1 -1
- package/dist/cli/resume-guard.js +37 -7
- package/dist/cli/resume-guard.js.map +1 -1
- package/dist/knowledge/codex.d.ts.map +1 -1
- package/dist/knowledge/codex.js +10 -1
- package/dist/knowledge/codex.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/resume-guard.ts +35 -7
- package/src/knowledge/codex.ts +10 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-guard.d.ts","sourceRoot":"","sources":["../../src/cli/resume-guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resume-guard.d.ts","sourceRoot":"","sources":["../../src/cli/resume-guard.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B;wCACoC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;gDAIgD;AAChD,eAAO,MAAM,WAAW,MACnB,iBAAiB,QACd;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAChF,gBAeF,CAAC"}
|
package/dist/cli/resume-guard.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
2
3
|
import { storePath } from "../interpretation/store.js";
|
|
3
4
|
/** Where a harness that creates sessions on an unknown id (pi, muse) would
|
|
4
5
|
* have filed this session. The cwd is resolved to its real path first: the
|
|
@@ -25,12 +26,18 @@ export const resumeStore = (h, opts) => {
|
|
|
25
26
|
};
|
|
26
27
|
/** A store template that resolves to a FILE names the session directly and
|
|
27
28
|
* existence is the file's. One that resolves to a DIRECTORY names where the
|
|
28
|
-
* harness files every session
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
29
|
+
* harness files every session, and the session is an entry somewhere under it
|
|
30
|
+
* whose name carries the id - not at a position a template can express:
|
|
31
|
+
*
|
|
32
|
+
* pi <root>/<cwdSlug>/<timestamp>_<id>.jsonl one level down
|
|
33
|
+
* muse <root>/YYYY/MM/DD/<id>/session.jsonl three levels down
|
|
34
|
+
*
|
|
35
|
+
* The first version of this search looked one level only, written against
|
|
36
|
+
* pi, and refused every muse resume (#103) for a session that was right
|
|
37
|
+
* there. It now walks the tree, bounded: the id's own directory is a match
|
|
38
|
+
* and is not descended, and depth is capped so a pathological store cannot
|
|
39
|
+
* turn a pre-spawn check into a crawl. */
|
|
40
|
+
const MAX_STORE_DEPTH = 4;
|
|
34
41
|
const sessionExistsAt = (path, sessionId) => {
|
|
35
42
|
if (!existsSync(path))
|
|
36
43
|
return false;
|
|
@@ -43,11 +50,34 @@ const sessionExistsAt = (path, sessionId) => {
|
|
|
43
50
|
}
|
|
44
51
|
if (!isDir)
|
|
45
52
|
return true;
|
|
53
|
+
return containsSessionId(path, sessionId, 0);
|
|
54
|
+
};
|
|
55
|
+
const containsSessionId = (dir, sessionId, depth) => {
|
|
56
|
+
if (depth > MAX_STORE_DEPTH)
|
|
57
|
+
return false;
|
|
58
|
+
let entries;
|
|
46
59
|
try {
|
|
47
|
-
|
|
60
|
+
entries = readdirSync(dir);
|
|
48
61
|
}
|
|
49
62
|
catch {
|
|
50
63
|
return false;
|
|
51
64
|
}
|
|
65
|
+
for (const name of entries) {
|
|
66
|
+
if (name.includes(sessionId))
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
for (const name of entries) {
|
|
70
|
+
const child = join(dir, name);
|
|
71
|
+
let childIsDir = false;
|
|
72
|
+
try {
|
|
73
|
+
childIsDir = statSync(child).isDirectory();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (childIsDir && containsSessionId(child, sessionId, depth + 1))
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
52
82
|
};
|
|
53
83
|
//# sourceMappingURL=resume-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-guard.js","sourceRoot":"","sources":["../../src/cli/resume-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAUvD;;;;gDAIgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAoB,EACpB,IAAiF,EAC/D,EAAE;IACpB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,0CAA0C;IAC5C,CAAC;IACD,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"resume-guard.js","sourceRoot":"","sources":["../../src/cli/resume-guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAUvD;;;;gDAIgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,CAAoB,EACpB,IAAiF,EAC/D,EAAE;IACpB,IAAI,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACnB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,qEAAqE;QACrE,0CAA0C;IAC5C,CAAC;IACD,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,IAAI,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AAClF,CAAC,CAAC;AAEF;;;;;;;;;;;;0CAY0C;AAC1C,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAW,EAAE;IACnE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAE,KAAa,EAAW,EAAE;IACnF,IAAI,KAAK,GAAG,eAAe;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;IAC5C,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,UAAU,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/knowledge/codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAc,KAAK,iBAAiB,EAAc,MAAM,iBAAiB,CAAC;AAGjF,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/knowledge/codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAc,KAAK,iBAAiB,EAAc,MAAM,iBAAiB,CAAC;AAGjF,eAAO,MAAM,QAAQ,EAAE,iBAiKrB,CAAC"}
|
package/dist/knowledge/codex.js
CHANGED
|
@@ -126,7 +126,16 @@ export const codexCli = deepFreeze({
|
|
|
126
126
|
values: ["read-only", "workspace-write", "danger-full-access"],
|
|
127
127
|
default: "workspace-write",
|
|
128
128
|
render: { kind: "flag-value", flag: "--sandbox" },
|
|
129
|
-
|
|
129
|
+
// Spike A-001, resolved 2026-08-23 on 0.147.0 (issue #72): `codex exec
|
|
130
|
+
// resume` still rejects --sandbox, but `-c sandbox_mode=<mode>` on the
|
|
131
|
+
// resume grammar is ENFORCED, not merely accepted. A thread that wrote
|
|
132
|
+
// a file under workspace-write was resumed under -c sandbox_mode=
|
|
133
|
+
// "read-only" and could not write (model reported BLOCKED, no file);
|
|
134
|
+
// the same thread resumed under workspace-write wrote again. So the
|
|
135
|
+
// sandbox dimension is expressible on resume through the config-kv
|
|
136
|
+
// spelling, and a resumed turn no longer silently runs wider than the
|
|
137
|
+
// caller asked.
|
|
138
|
+
resumeRender: { kind: "config-kv", flag: "-c", key: "sandbox_mode" },
|
|
130
139
|
},
|
|
131
140
|
access: {
|
|
132
141
|
kind: "flag-value",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/knowledge/codex.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/knowledge/codex.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/resume-guard.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
2
3
|
import { storePath } from "../interpretation/store.js";
|
|
3
4
|
import type { HarnessDescriptor } from "../knowledge/descriptor.js";
|
|
4
5
|
|
|
@@ -36,12 +37,19 @@ export const resumeStore = (
|
|
|
36
37
|
|
|
37
38
|
/** A store template that resolves to a FILE names the session directly and
|
|
38
39
|
* existence is the file's. One that resolves to a DIRECTORY names where the
|
|
39
|
-
* harness files every session
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
40
|
+
* harness files every session, and the session is an entry somewhere under it
|
|
41
|
+
* whose name carries the id - not at a position a template can express:
|
|
42
|
+
*
|
|
43
|
+
* pi <root>/<cwdSlug>/<timestamp>_<id>.jsonl one level down
|
|
44
|
+
* muse <root>/YYYY/MM/DD/<id>/session.jsonl three levels down
|
|
45
|
+
*
|
|
46
|
+
* The first version of this search looked one level only, written against
|
|
47
|
+
* pi, and refused every muse resume (#103) for a session that was right
|
|
48
|
+
* there. It now walks the tree, bounded: the id's own directory is a match
|
|
49
|
+
* and is not descended, and depth is capped so a pathological store cannot
|
|
50
|
+
* turn a pre-spawn check into a crawl. */
|
|
51
|
+
const MAX_STORE_DEPTH = 4;
|
|
52
|
+
|
|
45
53
|
const sessionExistsAt = (path: string, sessionId: string): boolean => {
|
|
46
54
|
if (!existsSync(path)) return false;
|
|
47
55
|
let isDir = false;
|
|
@@ -51,9 +59,29 @@ const sessionExistsAt = (path: string, sessionId: string): boolean => {
|
|
|
51
59
|
return false;
|
|
52
60
|
}
|
|
53
61
|
if (!isDir) return true;
|
|
62
|
+
return containsSessionId(path, sessionId, 0);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const containsSessionId = (dir: string, sessionId: string, depth: number): boolean => {
|
|
66
|
+
if (depth > MAX_STORE_DEPTH) return false;
|
|
67
|
+
let entries: string[];
|
|
54
68
|
try {
|
|
55
|
-
|
|
69
|
+
entries = readdirSync(dir);
|
|
56
70
|
} catch {
|
|
57
71
|
return false;
|
|
58
72
|
}
|
|
73
|
+
for (const name of entries) {
|
|
74
|
+
if (name.includes(sessionId)) return true;
|
|
75
|
+
}
|
|
76
|
+
for (const name of entries) {
|
|
77
|
+
const child = join(dir, name);
|
|
78
|
+
let childIsDir = false;
|
|
79
|
+
try {
|
|
80
|
+
childIsDir = statSync(child).isDirectory();
|
|
81
|
+
} catch {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (childIsDir && containsSessionId(child, sessionId, depth + 1)) return true;
|
|
85
|
+
}
|
|
86
|
+
return false;
|
|
59
87
|
};
|
package/src/knowledge/codex.ts
CHANGED
|
@@ -127,7 +127,16 @@ export const codexCli: HarnessDescriptor = deepFreeze({
|
|
|
127
127
|
values: ["read-only", "workspace-write", "danger-full-access"],
|
|
128
128
|
default: "workspace-write",
|
|
129
129
|
render: { kind: "flag-value", flag: "--sandbox" },
|
|
130
|
-
|
|
130
|
+
// Spike A-001, resolved 2026-08-23 on 0.147.0 (issue #72): `codex exec
|
|
131
|
+
// resume` still rejects --sandbox, but `-c sandbox_mode=<mode>` on the
|
|
132
|
+
// resume grammar is ENFORCED, not merely accepted. A thread that wrote
|
|
133
|
+
// a file under workspace-write was resumed under -c sandbox_mode=
|
|
134
|
+
// "read-only" and could not write (model reported BLOCKED, no file);
|
|
135
|
+
// the same thread resumed under workspace-write wrote again. So the
|
|
136
|
+
// sandbox dimension is expressible on resume through the config-kv
|
|
137
|
+
// spelling, and a resumed turn no longer silently runs wider than the
|
|
138
|
+
// caller asked.
|
|
139
|
+
resumeRender: { kind: "config-kv", flag: "-c", key: "sandbox_mode" },
|
|
131
140
|
},
|
|
132
141
|
access: {
|
|
133
142
|
kind: "flag-value",
|