@dungle-scrubs/harness-cli-normalizer 0.1.1

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.
Files changed (178) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/execution/channel.d.ts +33 -0
  4. package/dist/execution/channel.d.ts.map +1 -0
  5. package/dist/execution/channel.js +86 -0
  6. package/dist/execution/channel.js.map +1 -0
  7. package/dist/execution/decode.d.ts +16 -0
  8. package/dist/execution/decode.d.ts.map +1 -0
  9. package/dist/execution/decode.js +60 -0
  10. package/dist/execution/decode.js.map +1 -0
  11. package/dist/execution/deps.d.ts +53 -0
  12. package/dist/execution/deps.d.ts.map +1 -0
  13. package/dist/execution/deps.js +8 -0
  14. package/dist/execution/deps.js.map +1 -0
  15. package/dist/execution/events.d.ts +54 -0
  16. package/dist/execution/events.d.ts.map +1 -0
  17. package/dist/execution/events.js +2 -0
  18. package/dist/execution/events.js.map +1 -0
  19. package/dist/execution/index.d.ts +19 -0
  20. package/dist/execution/index.d.ts.map +1 -0
  21. package/dist/execution/index.js +19 -0
  22. package/dist/execution/index.js.map +1 -0
  23. package/dist/execution/lines.d.ts +21 -0
  24. package/dist/execution/lines.d.ts.map +1 -0
  25. package/dist/execution/lines.js +70 -0
  26. package/dist/execution/lines.js.map +1 -0
  27. package/dist/execution/node-deps.d.ts +13 -0
  28. package/dist/execution/node-deps.d.ts.map +1 -0
  29. package/dist/execution/node-deps.js +164 -0
  30. package/dist/execution/node-deps.js.map +1 -0
  31. package/dist/execution/open-session.d.ts +31 -0
  32. package/dist/execution/open-session.d.ts.map +1 -0
  33. package/dist/execution/open-session.js +360 -0
  34. package/dist/execution/open-session.js.map +1 -0
  35. package/dist/execution/stream-turn.d.ts +43 -0
  36. package/dist/execution/stream-turn.d.ts.map +1 -0
  37. package/dist/execution/stream-turn.js +283 -0
  38. package/dist/execution/stream-turn.js.map +1 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +8 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/interpretation/argv.d.ts +35 -0
  44. package/dist/interpretation/argv.d.ts.map +1 -0
  45. package/dist/interpretation/argv.js +147 -0
  46. package/dist/interpretation/argv.js.map +1 -0
  47. package/dist/interpretation/capabilities.d.ts +19 -0
  48. package/dist/interpretation/capabilities.d.ts.map +1 -0
  49. package/dist/interpretation/capabilities.js +25 -0
  50. package/dist/interpretation/capabilities.js.map +1 -0
  51. package/dist/interpretation/content.d.ts +33 -0
  52. package/dist/interpretation/content.d.ts.map +1 -0
  53. package/dist/interpretation/content.js +169 -0
  54. package/dist/interpretation/content.js.map +1 -0
  55. package/dist/interpretation/context.d.ts +17 -0
  56. package/dist/interpretation/context.d.ts.map +1 -0
  57. package/dist/interpretation/context.js +16 -0
  58. package/dist/interpretation/context.js.map +1 -0
  59. package/dist/interpretation/dimensions.d.ts +13 -0
  60. package/dist/interpretation/dimensions.d.ts.map +1 -0
  61. package/dist/interpretation/dimensions.js +6 -0
  62. package/dist/interpretation/dimensions.js.map +1 -0
  63. package/dist/interpretation/identity.d.ts +32 -0
  64. package/dist/interpretation/identity.d.ts.map +1 -0
  65. package/dist/interpretation/identity.js +44 -0
  66. package/dist/interpretation/identity.js.map +1 -0
  67. package/dist/interpretation/index.d.ts +23 -0
  68. package/dist/interpretation/index.d.ts.map +1 -0
  69. package/dist/interpretation/index.js +23 -0
  70. package/dist/interpretation/index.js.map +1 -0
  71. package/dist/interpretation/limits.d.ts +20 -0
  72. package/dist/interpretation/limits.d.ts.map +1 -0
  73. package/dist/interpretation/limits.js +35 -0
  74. package/dist/interpretation/limits.js.map +1 -0
  75. package/dist/interpretation/parse-resume.d.ts +28 -0
  76. package/dist/interpretation/parse-resume.d.ts.map +1 -0
  77. package/dist/interpretation/parse-resume.js +91 -0
  78. package/dist/interpretation/parse-resume.js.map +1 -0
  79. package/dist/interpretation/presence.d.ts +16 -0
  80. package/dist/interpretation/presence.d.ts.map +1 -0
  81. package/dist/interpretation/presence.js +32 -0
  82. package/dist/interpretation/presence.js.map +1 -0
  83. package/dist/interpretation/resume-last.d.ts +32 -0
  84. package/dist/interpretation/resume-last.d.ts.map +1 -0
  85. package/dist/interpretation/resume-last.js +70 -0
  86. package/dist/interpretation/resume-last.js.map +1 -0
  87. package/dist/interpretation/session-id.d.ts +22 -0
  88. package/dist/interpretation/session-id.d.ts.map +1 -0
  89. package/dist/interpretation/session-id.js +29 -0
  90. package/dist/interpretation/session-id.js.map +1 -0
  91. package/dist/interpretation/session-input.d.ts +13 -0
  92. package/dist/interpretation/session-input.d.ts.map +1 -0
  93. package/dist/interpretation/session-input.js +32 -0
  94. package/dist/interpretation/session-input.js.map +1 -0
  95. package/dist/interpretation/shape.d.ts +17 -0
  96. package/dist/interpretation/shape.d.ts.map +1 -0
  97. package/dist/interpretation/shape.js +54 -0
  98. package/dist/interpretation/shape.js.map +1 -0
  99. package/dist/interpretation/store.d.ts +16 -0
  100. package/dist/interpretation/store.d.ts.map +1 -0
  101. package/dist/interpretation/store.js +27 -0
  102. package/dist/interpretation/store.js.map +1 -0
  103. package/dist/interpretation/versions.d.ts +16 -0
  104. package/dist/interpretation/versions.d.ts.map +1 -0
  105. package/dist/interpretation/versions.js +44 -0
  106. package/dist/interpretation/versions.js.map +1 -0
  107. package/dist/interpretation/vocabulary.d.ts +29 -0
  108. package/dist/interpretation/vocabulary.d.ts.map +1 -0
  109. package/dist/interpretation/vocabulary.js +55 -0
  110. package/dist/interpretation/vocabulary.js.map +1 -0
  111. package/dist/knowledge/claude-code.d.ts +8 -0
  112. package/dist/knowledge/claude-code.d.ts.map +1 -0
  113. package/dist/knowledge/claude-code.js +132 -0
  114. package/dist/knowledge/claude-code.js.map +1 -0
  115. package/dist/knowledge/codex.d.ts +9 -0
  116. package/dist/knowledge/codex.d.ts.map +1 -0
  117. package/dist/knowledge/codex.js +106 -0
  118. package/dist/knowledge/codex.js.map +1 -0
  119. package/dist/knowledge/descriptor.d.ts +211 -0
  120. package/dist/knowledge/descriptor.d.ts.map +1 -0
  121. package/dist/knowledge/descriptor.js +20 -0
  122. package/dist/knowledge/descriptor.js.map +1 -0
  123. package/dist/knowledge/index.d.ts +19 -0
  124. package/dist/knowledge/index.d.ts.map +1 -0
  125. package/dist/knowledge/index.js +19 -0
  126. package/dist/knowledge/index.js.map +1 -0
  127. package/dist/knowledge/matchers.d.ts +10 -0
  128. package/dist/knowledge/matchers.d.ts.map +1 -0
  129. package/dist/knowledge/matchers.js +11 -0
  130. package/dist/knowledge/matchers.js.map +1 -0
  131. package/dist/knowledge/muse.d.ts +12 -0
  132. package/dist/knowledge/muse.d.ts.map +1 -0
  133. package/dist/knowledge/muse.js +94 -0
  134. package/dist/knowledge/muse.js.map +1 -0
  135. package/dist/knowledge/overrides.d.ts +11 -0
  136. package/dist/knowledge/overrides.d.ts.map +1 -0
  137. package/dist/knowledge/overrides.js +166 -0
  138. package/dist/knowledge/overrides.js.map +1 -0
  139. package/dist/knowledge/pi.d.ts +11 -0
  140. package/dist/knowledge/pi.d.ts.map +1 -0
  141. package/dist/knowledge/pi.js +97 -0
  142. package/dist/knowledge/pi.js.map +1 -0
  143. package/package.json +69 -0
  144. package/src/execution/channel.ts +86 -0
  145. package/src/execution/decode.ts +79 -0
  146. package/src/execution/deps.ts +59 -0
  147. package/src/execution/events.ts +37 -0
  148. package/src/execution/index.ts +18 -0
  149. package/src/execution/lines.ts +71 -0
  150. package/src/execution/node-deps.ts +179 -0
  151. package/src/execution/open-session.ts +392 -0
  152. package/src/execution/stream-turn.ts +310 -0
  153. package/src/index.ts +7 -0
  154. package/src/interpretation/argv.ts +188 -0
  155. package/src/interpretation/capabilities.ts +51 -0
  156. package/src/interpretation/content.ts +191 -0
  157. package/src/interpretation/context.ts +28 -0
  158. package/src/interpretation/dimensions.ts +20 -0
  159. package/src/interpretation/identity.ts +81 -0
  160. package/src/interpretation/index.ts +22 -0
  161. package/src/interpretation/limits.ts +63 -0
  162. package/src/interpretation/parse-resume.ts +117 -0
  163. package/src/interpretation/presence.ts +49 -0
  164. package/src/interpretation/resume-last.ts +93 -0
  165. package/src/interpretation/session-id.ts +35 -0
  166. package/src/interpretation/session-input.ts +45 -0
  167. package/src/interpretation/shape.ts +55 -0
  168. package/src/interpretation/store.ts +43 -0
  169. package/src/interpretation/versions.ts +43 -0
  170. package/src/interpretation/vocabulary.ts +74 -0
  171. package/src/knowledge/claude-code.ts +132 -0
  172. package/src/knowledge/codex.ts +106 -0
  173. package/src/knowledge/descriptor.ts +217 -0
  174. package/src/knowledge/index.ts +23 -0
  175. package/src/knowledge/matchers.ts +19 -0
  176. package/src/knowledge/muse.ts +94 -0
  177. package/src/knowledge/overrides.ts +182 -0
  178. package/src/knowledge/pi.ts +97 -0
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The claude-code descriptor: facts about the `claude` CLI as data, verified
3
+ * against claude 2.1.227 and the 00-chat-substrate spike evidence (A-001,
4
+ * A-002, A-005). No process logic lives here.
5
+ */
6
+ import { deepFreeze, UUID_SHAPE } from "./descriptor.js";
7
+ import { SHARED_AUTH_MATCHERS, SHARED_LIMIT_MATCHERS } from "./matchers.js";
8
+ export const claudeCode = deepFreeze({
9
+ name: "claude",
10
+ bin: "claude",
11
+ verifiedAgainst: "2.1.227",
12
+ versionSource: { kind: "npm", package: "@anthropic-ai/claude-code" },
13
+ launch: {
14
+ baseFlags: ["-p"],
15
+ subcommands: [],
16
+ promptStyle: "positional",
17
+ toolsFlag: "--allowedTools",
18
+ // A headless turn launches with the full stream-json output set so the
19
+ // runner can decode identity/limits and stream token deltas; bare -p
20
+ // (granularity none) is a degraded invocation this builder never emits.
21
+ streamFlags: ["--output-format", "stream-json", "--verbose", "--include-partial-messages"],
22
+ idFlag: "--session-id",
23
+ },
24
+ resume: {
25
+ // A-005: claude resumes are id-stable - the caller-assigned id survives
26
+ // every resume, so there is no rotation handling and forking is only the
27
+ // explicit --fork-session flag (deliberate branching, never a default).
28
+ style: "flag",
29
+ flag: "--resume",
30
+ aliases: ["-r"],
31
+ idShape: UUID_SHAPE,
32
+ onMissing: "error",
33
+ extraFlags: ["-p"],
34
+ },
35
+ sessionMode: {
36
+ // A-001: one process, many turns; `result` delimits turns; mid-turn sends
37
+ // queue. --setting-sources project isolates the child from user-level
38
+ // hooks (D-025). Token deltas require this exact output flag set.
39
+ flags: [
40
+ "--input-format",
41
+ "stream-json",
42
+ "--output-format",
43
+ "stream-json",
44
+ "--include-partial-messages",
45
+ "--verbose",
46
+ "--setting-sources",
47
+ "project",
48
+ ],
49
+ idFlag: "--session-id",
50
+ input: { kind: "claude-sdk-user-message" },
51
+ },
52
+ output: {
53
+ // --output-format/--include-partial-messages only work with --print, so
54
+ // -p is part of the pin, not an accident of the builders.
55
+ pins: [
56
+ {
57
+ flags: ["-p", "--output-format", "stream-json", "--verbose", "--include-partial-messages"],
58
+ granularity: "token",
59
+ },
60
+ ],
61
+ floor: "none",
62
+ flagAliases: { "--print": "-p" },
63
+ },
64
+ identity: {
65
+ authority: "caller-assigned",
66
+ announce: { match: { type: "system", subtype: "init" }, idField: "session_id" },
67
+ },
68
+ limitMatchers: [
69
+ // Observed phrasings from the live CLI (ported from lucid v1's limits.ts):
70
+ // "You've hit your session limit · resets 6:30pm"
71
+ [/you'?ve hit your session limit/i, "session-limit"],
72
+ // "You've hit your weekly limit · resets 2am (Asia/Bangkok)"
73
+ [/you'?ve hit your weekly limit/i, "weekly-limit"],
74
+ ...SHARED_LIMIT_MATCHERS,
75
+ ],
76
+ authMatchers: [
77
+ // A detached process cannot read Keychain creds, and misreading that as
78
+ // "not logged in" sends the human to redo a login that was never broken.
79
+ [/oauth session expired|could not be refreshed/i, "expired"],
80
+ [/failed to authenticate/i, "expired"],
81
+ [/not logged in|please run \/login/i, "not-logged-in"],
82
+ ...SHARED_AUTH_MATCHERS,
83
+ ],
84
+ autonomy: { flag: "--dangerously-skip-permissions" },
85
+ vocabulary: {
86
+ modelFlag: "--model",
87
+ models: ["claude-fable-5", "claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5-20251001"],
88
+ aliases: {
89
+ fable: "claude-fable-5",
90
+ opus: "claude-opus-5",
91
+ sonnet: "claude-sonnet-5",
92
+ haiku: "claude-haiku-4-5-20251001",
93
+ },
94
+ efforts: ["low", "medium", "high", "xhigh", "max"],
95
+ // Effort is an in-session command for claude, not a launch flag.
96
+ effortFlag: null,
97
+ extensible: false,
98
+ },
99
+ store: {
100
+ // Verified against the A-001 fixture's memory_paths slug and real
101
+ // ~/.claude/projects entries: '/', '.' -> '-'; '_' preserved.
102
+ template: "{home}/.claude/projects/{cwdSlug}/{sessionId}.jsonl",
103
+ cwdSlug: "dash-separators",
104
+ },
105
+ contextHook: {
106
+ // claude statusline payload: { context_window: { used_percentage } }.
107
+ // This arrives on the statusline channel, never on stream-json stdout -
108
+ // route accordingly, do not call per stdout line.
109
+ object: "context_window",
110
+ usedPctField: "used_percentage",
111
+ },
112
+ resumeLast: null,
113
+ provider: null,
114
+ stdin: "inherit",
115
+ // D-025: project-only setting sources is claude's discovery-isolation
116
+ // spelling; the child loads no user-level hooks or skills.
117
+ discoveryDisableFlags: ["--setting-sources", "project"],
118
+ presence: {
119
+ headlessMarkers: ["-p", "--print"],
120
+ },
121
+ capabilities: {
122
+ vision: true,
123
+ images: true,
124
+ streamingByMode: {
125
+ "headless-turn": "token",
126
+ "headless-session": "token",
127
+ interactive: "message",
128
+ },
129
+ session: true,
130
+ },
131
+ });
132
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/knowledge/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The codex descriptor: facts about the `codex` CLI as data, verified
3
+ * against codex-cli 0.147.0 and lucid v1's registry. Descriptor groundwork
4
+ * only (D-003): not exercised through the chat protocol until the claude
5
+ * vertical slice is green.
6
+ */
7
+ import { type HarnessDescriptor } from "./descriptor.js";
8
+ export declare const codexCli: HarnessDescriptor;
9
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +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,iBAgGrB,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * The codex descriptor: facts about the `codex` CLI as data, verified
3
+ * against codex-cli 0.147.0 and lucid v1's registry. Descriptor groundwork
4
+ * only (D-003): not exercised through the chat protocol until the claude
5
+ * vertical slice is green.
6
+ */
7
+ import { deepFreeze, UUID_SHAPE } from "./descriptor.js";
8
+ import { SHARED_AUTH_MATCHERS, SHARED_LIMIT_MATCHERS } from "./matchers.js";
9
+ export const codexCli = deepFreeze({
10
+ name: "codex",
11
+ bin: "codex",
12
+ verifiedAgainst: "0.147.0",
13
+ versionSource: { kind: "npm", package: "@openai/codex" },
14
+ launch: {
15
+ // exec --json emits structured item events; without --json, identity
16
+ // discovery is blind (v1: requiredArgument "--json"). The sandbox grant
17
+ // is v1's proven spawn shape - codex's built-in default is read-only,
18
+ // under which a non-autonomy turn cannot write files.
19
+ // --skip-git-repo-check: codex exec refuses to run outside a trusted
20
+ // git dir without it (verified 0.147.0). cwd targeting is the spawner's
21
+ // job (spawn opts.cwd), not descriptor data.
22
+ baseFlags: ["exec", "--json", "--sandbox", "workspace-write", "--skip-git-repo-check"],
23
+ subcommands: ["exec"],
24
+ promptStyle: "positional",
25
+ toolsFlag: null,
26
+ streamFlags: [],
27
+ // Codex mints its own thread id; there is nothing to assign at launch.
28
+ idFlag: null,
29
+ },
30
+ resume: {
31
+ // `codex exec resume <id> [--json] <prompt>` - the resume word is a
32
+ // subcommand of exec (verified: `codex exec resume --help`).
33
+ style: "positional",
34
+ flag: "resume",
35
+ aliases: [],
36
+ idShape: UUID_SHAPE,
37
+ onMissing: "error",
38
+ // `codex exec resume` accepts --json and --skip-git-repo-check but
39
+ // REJECTS --sandbox (verified 0.147.0: "unexpected argument").
40
+ extraFlags: ["--json", "--skip-git-repo-check"],
41
+ },
42
+ sessionMode: null,
43
+ output: {
44
+ // exec --json emits item-level events (message granularity); a bare
45
+ // exec emits nothing structured at all.
46
+ pins: [{ flags: ["--json"], granularity: "message" }],
47
+ floor: "none",
48
+ flagAliases: {},
49
+ },
50
+ identity: {
51
+ // Codex mints its own thread id and announces it on stdout-jsonl.
52
+ authority: "harness-minted",
53
+ announce: { match: { type: "thread.started" }, idField: "thread_id" },
54
+ },
55
+ limitMatchers: [...SHARED_LIMIT_MATCHERS],
56
+ authMatchers: [[/run codex login/i, "not-logged-in"], ...SHARED_AUTH_MATCHERS],
57
+ // Accepted by codex 0.147.0 as a hidden alias (not in --help).
58
+ autonomy: { flag: "--yolo" },
59
+ vocabulary: {
60
+ modelFlag: "--model",
61
+ models: ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "gpt-5.5"],
62
+ aliases: {},
63
+ efforts: ["minimal", "low", "medium", "high", "xhigh", "max", "ultra"],
64
+ // Codex constrains ladders per model generation (v1 registry).
65
+ effortsByModel: {
66
+ "gpt-5.5": ["minimal", "low", "medium", "high"],
67
+ "gpt-5.6-sol": ["medium", "high", "xhigh", "max", "ultra"],
68
+ "gpt-5.6-terra": ["medium", "high", "xhigh", "max", "ultra"],
69
+ "gpt-5.6-luna": ["medium", "high", "xhigh", "max", "ultra"],
70
+ },
71
+ // Reasoning effort is a config key (-c model_reasoning_effort=...), not
72
+ // a plain flag; argv-level insertion has no spelling to use.
73
+ effortFlag: null,
74
+ extensible: false,
75
+ },
76
+ store: {
77
+ // ~/.codex/sessions/YYYY/MM/DD/rollout-<stamp>-<threadId>.jsonl - the
78
+ // date/stamp components need a store scan, so the template names the
79
+ // sessions root; the execution layer resolves the rollout file.
80
+ template: "{home}/.codex/sessions",
81
+ cwdSlug: "verbatim",
82
+ },
83
+ contextHook: null,
84
+ // Valid only in the `exec resume` context: `codex exec resume --last`.
85
+ resumeLast: { flag: "--last" },
86
+ provider: null,
87
+ // codex exec appends piped stdin as a <stdin> block and can block on an
88
+ // open stdin - close it (verified 0.147.0: "Reading additional input
89
+ // from stdin...").
90
+ stdin: "close-required",
91
+ discoveryDisableFlags: [],
92
+ presence: {
93
+ headlessMarkers: ["exec"],
94
+ },
95
+ capabilities: {
96
+ vision: true,
97
+ images: true,
98
+ streamingByMode: {
99
+ "headless-turn": "message",
100
+ "headless-session": "none",
101
+ interactive: "none",
102
+ },
103
+ session: false,
104
+ },
105
+ });
106
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/knowledge/codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAA0B,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,CAAC,MAAM,QAAQ,GAAsB,UAAU,CAAC;IACpD,IAAI,EAAE,OAAO;IACb,GAAG,EAAE,OAAO;IACZ,eAAe,EAAE,SAAS;IAC1B,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE;IACxD,MAAM,EAAE;QACN,qEAAqE;QACrE,wEAAwE;QACxE,sEAAsE;QACtE,sDAAsD;QACtD,qEAAqE;QACrE,wEAAwE;QACxE,6CAA6C;QAC7C,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,uBAAuB,CAAC;QACtF,WAAW,EAAE,CAAC,MAAM,CAAC;QACrB,WAAW,EAAE,YAAY;QACzB,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,EAAE;QACf,uEAAuE;QACvE,MAAM,EAAE,IAAI;KACb;IACD,MAAM,EAAE;QACN,oEAAoE;QACpE,6DAA6D;QAC7D,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,OAAO;QAClB,mEAAmE;QACnE,+DAA+D;QAC/D,UAAU,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KAChD;IACD,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE;QACN,oEAAoE;QACpE,wCAAwC;QACxC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;QACrD,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,EAAE;KAChB;IACD,QAAQ,EAAE;QACR,kEAAkE;QAClE,SAAS,EAAE,gBAAgB;QAC3B,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;KACtE;IACD,aAAa,EAAE,CAAC,GAAG,qBAAqB,CAAC;IACzC,YAAY,EAAE,CAAC,CAAC,kBAAkB,EAAE,eAAe,CAAC,EAAE,GAAG,oBAAoB,CAAC;IAC9E,+DAA+D;IAC/D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC5B,UAAU,EAAE;QACV,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,CAAC;QACnE,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;QACtE,+DAA+D;QAC/D,cAAc,EAAE;YACd,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC;YAC/C,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;YAC1D,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;YAC5D,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC;SAC5D;QACD,wEAAwE;QACxE,6DAA6D;QAC7D,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,KAAK;KAClB;IACD,KAAK,EAAE;QACL,sEAAsE;QACtE,qEAAqE;QACrE,gEAAgE;QAChE,QAAQ,EAAE,wBAAwB;QAClC,OAAO,EAAE,UAAU;KACpB;IACD,WAAW,EAAE,IAAI;IACjB,uEAAuE;IACvE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC9B,QAAQ,EAAE,IAAI;IACd,wEAAwE;IACxE,qEAAqE;IACrE,mBAAmB;IACnB,KAAK,EAAE,gBAAgB;IACvB,qBAAqB,EAAE,EAAE;IACzB,QAAQ,EAAE;QACR,eAAe,EAAE,CAAC,MAAM,CAAC;KAC1B;IACD,YAAY,EAAE;QACZ,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,eAAe,EAAE;YACf,eAAe,EAAE,SAAS;YAC1B,kBAAkB,EAAE,MAAM;YAC1B,WAAW,EAAE,MAAM;SACpB;QACD,OAAO,EAAE,KAAK;KACf;CACF,CAAC,CAAC"}
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Descriptor types: the shape of what is KNOWN about a harness CLI, as pure
3
+ * data. Interpretation functions consume these; nothing here executes.
4
+ */
5
+ export declare const HARNESS_NAMES: readonly ["claude", "codex", "pi", "muse"];
6
+ export type HarnessName = (typeof HARNESS_NAMES)[number];
7
+ /** Descriptors are process-wide defaults shared by reference into merged
8
+ * override sets - freezing makes an accidental in-place edit throw instead
9
+ * of corrupting every consumer. */
10
+ /** A 36-char UUID - how every supported harness names its sessions. */
11
+ export declare const UUID_SHAPE: RegExp;
12
+ export declare const deepFreeze: <T>(value: T) => T;
13
+ export type StreamingGranularity = "token" | "message" | "none";
14
+ export type HarnessMode = "headless-turn" | "headless-session" | "interactive";
15
+ export declare const SESSION_INPUT_KINDS: readonly ["claude-sdk-user-message"];
16
+ export type SessionInputKind = (typeof SESSION_INPUT_KINDS)[number];
17
+ export interface SessionInputContract {
18
+ readonly kind: SessionInputKind;
19
+ }
20
+ /** Consumers branch on these (session-limit: wait for reset; weekly-limit:
21
+ * route elsewhere), so the vocabulary is closed - a descriptor cannot invent
22
+ * a code a consumer has no arm for. */
23
+ export type LimitCode = "usage-limit" | "session-limit" | "weekly-limit" | "credits" | "quota";
24
+ /** Auth walls are separate from usage limits because the remedy is entirely
25
+ * different (re-auth vs wait), and a detached process misreading one as the
26
+ * other sends the human to fix the wrong thing. */
27
+ export type AuthFailureKind = "not-logged-in" | "expired" | "invalid-key";
28
+ export interface HarnessDescriptor {
29
+ readonly name: HarnessName;
30
+ readonly bin: string;
31
+ /** The CLI version every fact in this descriptor - argv shapes, event
32
+ * vocabularies, capability claims, resume semantics - was verified
33
+ * against, as `<bin> --version` reports it. This is the anchor for the
34
+ * harness-update pipeline: CI compares the published/installed version to
35
+ * this, and a mismatch means the descriptor's facts are unverified for the
36
+ * new version (drift possible, or a capability the descriptor says is
37
+ * absent may now exist). Bump it only when the facts have been re-verified
38
+ * against that version (and the fixtures re-captured). */
39
+ readonly verifiedAgainst: string;
40
+ /** Where the latest published version is found, so the update pipeline can
41
+ * detect a new release WITHOUT installing the CLI or running inference.
42
+ * `npm` is a pure registry query (credential-free, CI-friendly);
43
+ * `installed` harnesses (muse ships a shell script, not an npm package)
44
+ * have no registry to poll, so the check falls back to the locally
45
+ * installed `<bin> --version` and is skipped where the CLI is absent. */
46
+ readonly versionSource: {
47
+ readonly kind: "npm";
48
+ readonly package: string;
49
+ } | {
50
+ readonly kind: "installed";
51
+ };
52
+ /** Headless one-turn launch shape. `promptStyle: "positional"` means the
53
+ * prompt travels as a bare argv entry (ordering constraints apply).
54
+ * `streamFlags` is the output flag set a headless turn launches with so
55
+ * its stream is parseable and token-granular where the harness supports
56
+ * it - the v1 stall-watchdog scar was launching bare and then waiting for
57
+ * deltas the invocation could not emit. */
58
+ readonly launch: {
59
+ readonly baseFlags: readonly string[];
60
+ /** The subcommand words among baseFlags (codex/muse `exec`), declared
61
+ * explicitly - resume parsing anchors on them, and deriving them by
62
+ * filtering non-dash tokens would silently promote flag VALUES like
63
+ * `workspace-write` into subcommands. */
64
+ readonly subcommands: readonly string[];
65
+ readonly promptStyle: "positional";
66
+ readonly toolsFlag: string | null;
67
+ readonly streamFlags: readonly string[];
68
+ /** The flag that pins a caller-assigned id at LAUNCH (spawn-time
69
+ * assignment; the execution layer consumes it), or null when the
70
+ * harness mints its own. */
71
+ readonly idFlag: string | null;
72
+ };
73
+ /** How a named session id is resumed. `flag` style: `<bin> <flag> <id>`;
74
+ * `positional` style: `<bin> resume <id>` (muse) - the resume token must
75
+ * sit at argv position 1. `idShape` is the shape of the harness's own ids;
76
+ * parseResumeCommand refuses commands where an id-shaped token appears
77
+ * anywhere else (the v1 first-UUID-wins scar: a UUID inside quoted prompt
78
+ * text was returned as the session id, and resuming it started a stranger). */
79
+ readonly resume: {
80
+ readonly style: "flag" | "positional";
81
+ readonly flag: string;
82
+ readonly aliases: readonly string[];
83
+ readonly idShape: RegExp;
84
+ /** Flags valid in the RESUME grammar - resume argv never inherits
85
+ * launch flags, because subcommand grammars differ (codex exec resume
86
+ * rejects --sandbox). */
87
+ readonly extraFlags: readonly string[];
88
+ /** A parse-only positional spelling (muse's interactive `muse resume
89
+ * <id>`) recognized when pasted, but never built - the builder uses
90
+ * `style`/`flag`. */
91
+ readonly positionalParseWord?: string;
92
+ /** What resuming a NONEXISTENT id does (verified live): "error" -
93
+ * claude/codex refuse an unknown session; "create" - pi/muse treat the
94
+ * id as create-if-missing and silently start a FRESH session under it.
95
+ * The protocol layer must know this: a consumer resuming a session it
96
+ * believes exists gets a blank session, not an error, on a "create"
97
+ * harness. */
98
+ readonly onMissing: "error" | "create";
99
+ };
100
+ /** Persistent headless session support: the exact flag set that opens one
101
+ * lucid-owned process serving many turns, or null when the harness has no
102
+ * such mode. `idFlag` pins the caller-assigned session identity. */
103
+ readonly sessionMode: {
104
+ readonly flags: readonly string[];
105
+ readonly idFlag: string;
106
+ readonly input: SessionInputContract;
107
+ } | null;
108
+ /** Streaming is a property of the INVOCATION, not the harness: each pin
109
+ * names the flag set that unlocks a granularity, checked in order, first
110
+ * fully-satisfied pin wins; an argv satisfying none gets `floor`. This
111
+ * carries claude (token under stream-json), codex (message under --json,
112
+ * none bare), and muse/pi in one shape - a single conditional tier could
113
+ * not. `flagAliases` maps alternate spellings onto pin members. */
114
+ readonly output: {
115
+ readonly pins: ReadonlyArray<{
116
+ readonly flags: readonly string[];
117
+ readonly granularity: StreamingGranularity;
118
+ }>;
119
+ readonly floor: StreamingGranularity;
120
+ readonly flagAliases: Readonly<Record<string, string>>;
121
+ };
122
+ /** Where native identity appears in the stream, and who mints it. Every
123
+ * key/value pair in `announce.match` must match the raw event; claude:
124
+ * {type: "system", subtype: "init"}, re-emitted at every turn start with
125
+ * the same value (A-001) - consumers dedupe via decodeIdentity. */
126
+ readonly identity: {
127
+ readonly authority: "caller-assigned" | "harness-minted";
128
+ /** `idField` is a dot-path (muse nests its id at `stream.id`); an empty
129
+ * `match` means "any record carrying the id path". */
130
+ readonly announce: {
131
+ readonly match: Readonly<Record<string, string>>;
132
+ readonly idField: string;
133
+ };
134
+ };
135
+ /** "Stopped on a limit" vs crash vs clean exit: the harness's own wall
136
+ * phrasings. First match wins per line. */
137
+ readonly limitMatchers: ReadonlyArray<readonly [RegExp, LimitCode]>;
138
+ /** Auth-wall phrasings, same scan discipline as limitMatchers. */
139
+ readonly authMatchers: ReadonlyArray<readonly [RegExp, AuthFailureKind]>;
140
+ /** The "run unattended without stops" flag, or null when the harness has
141
+ * no such mode. */
142
+ readonly autonomy: {
143
+ readonly flag: string;
144
+ } | null;
145
+ /** The harness's own model-id spellings, alias map, and effort ladder.
146
+ * Curated baseline - pi's registry is runtime-extensible, so validation
147
+ * against this vocabulary is a default, not a final word (D-008).
148
+ * `effortFlag` is null where effort is not a launch-time flag (claude:
149
+ * effort is an in-session command, not argv). */
150
+ readonly vocabulary: {
151
+ readonly modelFlag: string;
152
+ readonly models: readonly string[];
153
+ readonly aliases: Readonly<Record<string, string>>;
154
+ readonly efforts: readonly string[];
155
+ /** Per-model effort ladders where the harness constrains them (codex:
156
+ * gpt-5.5 tops out at high; gpt-5.6-* starts at medium). Falls back to
157
+ * the harness-wide `efforts`. */
158
+ readonly effortsByModel?: Readonly<Record<string, readonly string[]>>;
159
+ readonly effortFlag: string | null;
160
+ /** D-008: an extensible vocabulary (pi) accepts clean unknown model
161
+ * selectors at argv time; capability claims for them degrade to
162
+ * unknown until runtime verification. */
163
+ readonly extensible: boolean;
164
+ };
165
+ /** Where the harness files sessions/transcripts, as a template over
166
+ * {home}, {cwdSlug} and {sessionId}. Slugging rule is per-harness. */
167
+ readonly store: {
168
+ readonly template: string;
169
+ /** claude: '/', '.' -> '-'; pi: '/' -> '-' wrapped in leading/trailing
170
+ * dashes, dots preserved. */
171
+ readonly cwdSlug: "dash-separators" | "pi-dash-wrapped" | "verbatim";
172
+ };
173
+ /** How the harness exposes context-window usage; the interpretation layer
174
+ * surfaces it as a `context` HarnessEvent. */
175
+ readonly contextHook: {
176
+ readonly object: string;
177
+ readonly usedPctField: string;
178
+ } | null;
179
+ /** Resume-most-recent support (codex --last), or null. The race it opens
180
+ * is owned by the corroboration ranking in interpretation. */
181
+ readonly resumeLast: {
182
+ readonly flag: string;
183
+ } | null;
184
+ /** Provider/model-route flag where present (pi --provider). */
185
+ readonly provider: {
186
+ readonly flag: string;
187
+ } | null;
188
+ /** Whether backgrounded headless calls must have stdin closed (pi hangs
189
+ * without `< /dev/null`). */
190
+ readonly stdin: "inherit" | "close-required";
191
+ /** Flags that disable instruction-file/skill/MCP auto-discovery, in the
192
+ * spelling the harness accepts. */
193
+ readonly discoveryDisableFlags: readonly string[];
194
+ /** Presence recognition: how an interactive process for a session id shows
195
+ * up in a process listing. `headlessMarkers` mark a process as headless
196
+ * (not interactive presence). Known blind spot, inherent to argv matching:
197
+ * an interactive session carrying no id in argv (`claude --continue`) is
198
+ * invisible here - presence corroborates, it never proves. */
199
+ readonly presence: {
200
+ readonly headlessMarkers: readonly string[];
201
+ };
202
+ /** Curated capability baseline per mode (D-008: a default, never a final
203
+ * word - runtime verification upgrades source/confidence at attach). */
204
+ readonly capabilities: {
205
+ readonly vision: boolean;
206
+ readonly images: boolean;
207
+ readonly streamingByMode: Readonly<Record<HarnessMode, StreamingGranularity>>;
208
+ readonly session: boolean;
209
+ };
210
+ }
211
+ //# sourceMappingURL=descriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.d.ts","sourceRoot":"","sources":["../../src/knowledge/descriptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Descriptor types: the shape of what is KNOWN about a harness CLI, as pure
3
+ * data. Interpretation functions consume these; nothing here executes.
4
+ */
5
+ export const HARNESS_NAMES = ["claude", "codex", "pi", "muse"];
6
+ /** Descriptors are process-wide defaults shared by reference into merged
7
+ * override sets - freezing makes an accidental in-place edit throw instead
8
+ * of corrupting every consumer. */
9
+ /** A 36-char UUID - how every supported harness names its sessions. */
10
+ export const UUID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
11
+ export const deepFreeze = (value) => {
12
+ if (typeof value === "object" && value !== null) {
13
+ for (const inner of Object.values(value))
14
+ deepFreeze(inner);
15
+ Object.freeze(value);
16
+ }
17
+ return value;
18
+ };
19
+ export const SESSION_INPUT_KINDS = ["claude-sdk-user-message"];
20
+ //# sourceMappingURL=descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/knowledge/descriptor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAU,CAAC;AAGxE;;mCAEmC;AACnC,uEAAuE;AACvE,MAAM,CAAC,MAAM,UAAU,GAAG,iEAAiE,CAAC;AAE5F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,KAAQ,EAAK,EAAE;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,yBAAyB,CAAU,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Knowledge layer: owns harness descriptors as pure data.
3
+ *
4
+ * Each supported CLI (claude, codex, pi, muse) is described by an immutable
5
+ * descriptor capturing its argv shapes, identity and store locations, flag
6
+ * sets, and capability claims. The point of this module is to keep every fact
7
+ * about a harness in one declarative place as data, rather than scattered
8
+ * through branching logic. It is intentionally NOT responsible for
9
+ * interpreting descriptors or executing processes - those live in the
10
+ * interpretation and execution layers.
11
+ */
12
+ export { claudeCode } from "./claude-code.js";
13
+ export { codexCli } from "./codex.js";
14
+ export * from "./descriptor.js";
15
+ export { SHARED_AUTH_MATCHERS, SHARED_LIMIT_MATCHERS } from "./matchers.js";
16
+ export { museCode } from "./muse.js";
17
+ export { type DescriptorSet, defaultDescriptors, OverrideRefusalError, parseOverrides, } from "./overrides.js";
18
+ export { piCli } from "./pi.js";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,KAAK,aAAa,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Knowledge layer: owns harness descriptors as pure data.
3
+ *
4
+ * Each supported CLI (claude, codex, pi, muse) is described by an immutable
5
+ * descriptor capturing its argv shapes, identity and store locations, flag
6
+ * sets, and capability claims. The point of this module is to keep every fact
7
+ * about a harness in one declarative place as data, rather than scattered
8
+ * through branching logic. It is intentionally NOT responsible for
9
+ * interpreting descriptors or executing processes - those live in the
10
+ * interpretation and execution layers.
11
+ */
12
+ export { claudeCode } from "./claude-code.js";
13
+ export { codexCli } from "./codex.js";
14
+ export * from "./descriptor.js";
15
+ export { SHARED_AUTH_MATCHERS, SHARED_LIMIT_MATCHERS } from "./matchers.js";
16
+ export { museCode } from "./muse.js";
17
+ export { defaultDescriptors, OverrideRefusalError, parseOverrides, } from "./overrides.js";
18
+ export { piCli } from "./pi.js";
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/knowledge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAEL,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Wall phrasings every harness shares. v1 applied every pattern to every
3
+ * harness deliberately - a muse turn dying on "You've hit your usage limit"
4
+ * or a provider 401 must classify no matter which CLI printed it. Each
5
+ * descriptor spreads these after its harness-specific phrasings.
6
+ */
7
+ import type { AuthFailureKind, LimitCode } from "./descriptor.js";
8
+ export declare const SHARED_LIMIT_MATCHERS: ReadonlyArray<readonly [RegExp, LimitCode]>;
9
+ export declare const SHARED_AUTH_MATCHERS: ReadonlyArray<readonly [RegExp, AuthFailureKind]>;
10
+ //# sourceMappingURL=matchers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.d.ts","sourceRoot":"","sources":["../../src/knowledge/matchers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAO,MAAM,qBAAqB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAK7E,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,CAAC,CAGlF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const SHARED_LIMIT_MATCHERS = [
2
+ [/you'?ve hit your usage limit/i, "usage-limit"],
3
+ [/usage limit (?:reached|exceeded)/i, "usage-limit"],
4
+ [/purchase more credits|insufficient credits|out of credits/i, "credits"],
5
+ [/resource_exhausted|quota exceeded|exceeded your current quota/i, "quota"],
6
+ ];
7
+ export const SHARED_AUTH_MATCHERS = [
8
+ [/401 unauthorized/i, "expired"],
9
+ [/invalid api key/i, "invalid-key"],
10
+ ];
11
+ //# sourceMappingURL=matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matchers.js","sourceRoot":"","sources":["../../src/knowledge/matchers.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,qBAAqB,GAAgD;IAChF,CAAC,+BAA+B,EAAE,aAAa,CAAC;IAChD,CAAC,mCAAmC,EAAE,aAAa,CAAC;IACpD,CAAC,4DAA4D,EAAE,SAAS,CAAC;IACzE,CAAC,gEAAgE,EAAE,OAAO,CAAC;CAC5E,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsD;IACrF,CAAC,mBAAmB,EAAE,SAAS,CAAC;IAChC,CAAC,kBAAkB,EAAE,aAAa,CAAC;CACpC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The muse descriptor: facts about the `muse` CLI as data, verified against
3
+ * Muse Code 0.1.0 and lucid v1's registry. Descriptor groundwork only
4
+ * (D-003). The v1 scars this encodes: headless re-entry is `muse exec
5
+ * --session-id <id>` (the positional `muse resume <id>` is the INTERACTIVE
6
+ * picker - recognized when pasted, never built), and `muse exec` exits 0
7
+ * even when the work inside failed (verification always reruns the
8
+ * project's own checks).
9
+ */
10
+ import { type HarnessDescriptor } from "./descriptor.js";
11
+ export declare const museCode: HarnessDescriptor;
12
+ //# sourceMappingURL=muse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"muse.d.ts","sourceRoot":"","sources":["../../src/knowledge/muse.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAc,KAAK,iBAAiB,EAAc,MAAM,iBAAiB,CAAC;AAGjF,eAAO,MAAM,QAAQ,EAAE,iBAiFrB,CAAC"}