@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.
@@ -1 +1 @@
1
- {"version":3,"file":"resume-guard.d.ts","sourceRoot":"","sources":["../../src/cli/resume-guard.ts"],"names":[],"mappings":"AAEA,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"}
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"}
@@ -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 for this cwd, and the session is one entry in
29
- * it whose name carries the id somewhere - pi writes `<timestamp>_<id>.jsonl`,
30
- * so the id's position is not a template. Checking only that the directory
31
- * exists reported every id as present once any session had ever run in the
32
- * cwd, which made the guard pass unknown ids on pi and, once `origin` rode
33
- * on it, reported a brand-new session as resumed. */
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
- return readdirSync(path).some((name) => name.includes(sessionId));
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;;;;;;;qDAOqD;AACrD,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,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC"}
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,iBAwJrB,CAAC"}
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"}
@@ -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
- resumeRender: null,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dungle-scrubs/harness-cli-normalizer",
3
- "version": "0.5.6",
3
+ "version": "0.5.7",
4
4
  "description": "One stable CLI to four coding-agent harnesses: normalized flags, defaults, and events.",
5
5
  "license": "MIT",
6
6
  "author": "Kevin Frilot",
@@ -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 for this cwd, and the session is one entry in
40
- * it whose name carries the id somewhere - pi writes `<timestamp>_<id>.jsonl`,
41
- * so the id's position is not a template. Checking only that the directory
42
- * exists reported every id as present once any session had ever run in the
43
- * cwd, which made the guard pass unknown ids on pi and, once `origin` rode
44
- * on it, reported a brand-new session as resumed. */
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
- return readdirSync(path).some((name) => name.includes(sessionId));
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
  };
@@ -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
- resumeRender: null,
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",