@theokit/sdk 4.54.0 → 4.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/dist/a2a/index.cjs +13 -4
  3. package/dist/a2a/index.cjs.map +1 -1
  4. package/dist/a2a/index.d.cts +1 -1
  5. package/dist/a2a/index.d.ts +1 -1
  6. package/dist/a2a/index.js +13 -5
  7. package/dist/a2a/index.js.map +1 -1
  8. package/dist/a2a/message-bus.d.cts +33 -4
  9. package/dist/a2a/message-bus.d.ts +33 -4
  10. package/dist/{agent-CIUgz7cN.d.cts → agent-D3Xr_-6Z.d.cts} +61 -6
  11. package/dist/{agent-DSec-E0c.d.ts → agent-DIu6FooJ.d.ts} +61 -6
  12. package/dist/{agent-VGD5WL4N.js → agent-K3PQBS7D.js} +10 -9
  13. package/dist/{agent-VGD5WL4N.js.map → agent-K3PQBS7D.js.map} +1 -1
  14. package/dist/{agent-NOEGF4GI.cjs → agent-PJMBK7HQ.cjs} +11 -10
  15. package/dist/{agent-NOEGF4GI.cjs.map → agent-PJMBK7HQ.cjs.map} +1 -1
  16. package/dist/{chunk-SSQZA3DZ.js → chunk-2BDH744Z.js} +3 -3
  17. package/dist/{chunk-SSQZA3DZ.js.map → chunk-2BDH744Z.js.map} +1 -1
  18. package/dist/chunk-6HTXPPHK.cjs +18 -0
  19. package/dist/{chunk-3KGLRRFC.cjs.map → chunk-6HTXPPHK.cjs.map} +1 -1
  20. package/dist/{chunk-5UOVYM3P.cjs → chunk-6VLKVX7O.cjs} +131 -54
  21. package/dist/chunk-6VLKVX7O.cjs.map +1 -0
  22. package/dist/{chunk-5PHVENFV.js → chunk-7FHZ4VQX.js} +3 -55
  23. package/dist/chunk-7FHZ4VQX.js.map +1 -0
  24. package/dist/{chunk-Q47R5E2X.cjs → chunk-E3WZ6Y4H.cjs} +7 -59
  25. package/dist/chunk-E3WZ6Y4H.cjs.map +1 -0
  26. package/dist/{chunk-TTHBHAJI.cjs → chunk-H5GOSXSC.cjs} +4 -4
  27. package/dist/{chunk-TTHBHAJI.cjs.map → chunk-H5GOSXSC.cjs.map} +1 -1
  28. package/dist/{chunk-UNDROG5N.cjs → chunk-HLPSLDGL.cjs} +94 -26
  29. package/dist/chunk-HLPSLDGL.cjs.map +1 -0
  30. package/dist/{chunk-TPTZA6NI.js → chunk-KBXWEWKS.js} +70 -29
  31. package/dist/chunk-KBXWEWKS.js.map +1 -0
  32. package/dist/chunk-KRD3GQAA.cjs +71 -0
  33. package/dist/chunk-KRD3GQAA.cjs.map +1 -0
  34. package/dist/chunk-KVNWIAO4.js +68 -0
  35. package/dist/chunk-KVNWIAO4.js.map +1 -0
  36. package/dist/{chunk-UFAO4T7Z.cjs → chunk-LQYQHXIW.cjs} +129 -88
  37. package/dist/chunk-LQYQHXIW.cjs.map +1 -0
  38. package/dist/{chunk-AGSBJD2L.js → chunk-M7UHYBEY.js} +3 -3
  39. package/dist/{chunk-AGSBJD2L.js.map → chunk-M7UHYBEY.js.map} +1 -1
  40. package/dist/{chunk-VDEWG5TV.js → chunk-MVAPK2BX.js} +77 -9
  41. package/dist/chunk-MVAPK2BX.js.map +1 -0
  42. package/dist/{chunk-RM7Y65IG.cjs → chunk-NIRE5CNO.cjs} +10 -3
  43. package/dist/{chunk-FXEUP75G.js.map → chunk-NIRE5CNO.cjs.map} +1 -1
  44. package/dist/{chunk-DAPSQZT4.js → chunk-ODTZ7HX3.js} +131 -54
  45. package/dist/chunk-ODTZ7HX3.js.map +1 -0
  46. package/dist/{chunk-DUIF54UP.js → chunk-OHBIUXKM.js} +3 -3
  47. package/dist/{chunk-DUIF54UP.js.map → chunk-OHBIUXKM.js.map} +1 -1
  48. package/dist/{chunk-FXEUP75G.js → chunk-Q4CMI2LP.js} +9 -2
  49. package/dist/chunk-Q4CMI2LP.js.map +1 -0
  50. package/dist/{chunk-5BJV5UPY.cjs → chunk-V2UUGUY4.cjs} +3 -3
  51. package/dist/{chunk-5BJV5UPY.cjs.map → chunk-V2UUGUY4.cjs.map} +1 -1
  52. package/dist/{compact-session-K5LXTBPJ.js → compact-session-FUJDVF7B.js} +4 -4
  53. package/dist/{compact-session-K5LXTBPJ.js.map → compact-session-FUJDVF7B.js.map} +1 -1
  54. package/dist/{compact-session-YCT6JMBX.cjs → compact-session-LEWF554G.cjs} +12 -12
  55. package/dist/{compact-session-YCT6JMBX.cjs.map → compact-session-LEWF554G.cjs.map} +1 -1
  56. package/dist/context/index.cjs +6 -5
  57. package/dist/context/index.cjs.map +1 -1
  58. package/dist/context/index.js +3 -2
  59. package/dist/context/index.js.map +1 -1
  60. package/dist/{cron-DxxeQ-sK.d.cts → cron-BcWmzWzT.d.cts} +1 -1
  61. package/dist/{cron-CRwy2JBF.d.ts → cron-De6hzWCF.d.ts} +1 -1
  62. package/dist/cron.cjs +10 -9
  63. package/dist/cron.d.cts +2 -2
  64. package/dist/cron.d.ts +2 -2
  65. package/dist/cron.js +9 -8
  66. package/dist/eval.cjs +9 -8
  67. package/dist/eval.cjs.map +1 -1
  68. package/dist/eval.js +8 -7
  69. package/dist/eval.js.map +1 -1
  70. package/dist/{index-manager-ZMRJ6ZII.js → index-manager-WBIMDVQT.js} +4 -3
  71. package/dist/{index-manager-ZMRJ6ZII.js.map → index-manager-WBIMDVQT.js.map} +1 -1
  72. package/dist/{index-manager-NG5YENWO.cjs → index-manager-WC5ZVJWO.cjs} +5 -4
  73. package/dist/{index-manager-NG5YENWO.cjs.map → index-manager-WC5ZVJWO.cjs.map} +1 -1
  74. package/dist/index.cjs +47 -46
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.d.cts +3 -3
  77. package/dist/index.d.ts +3 -3
  78. package/dist/index.js +12 -11
  79. package/dist/index.js.map +1 -1
  80. package/dist/{inject-session-DDR6X6PC.js → inject-session-BJMJH5BX.js} +3 -3
  81. package/dist/{inject-session-DDR6X6PC.js.map → inject-session-BJMJH5BX.js.map} +1 -1
  82. package/dist/{inject-session-XLO3KTBM.cjs → inject-session-WQGGMCQY.cjs} +4 -4
  83. package/dist/{inject-session-XLO3KTBM.cjs.map → inject-session-WQGGMCQY.cjs.map} +1 -1
  84. package/dist/internal/llm/prompt-cache-key.d.ts +1 -0
  85. package/dist/internal/llm/responses.d.ts +67 -1
  86. package/dist/internal/llm/types.d.ts +15 -0
  87. package/dist/internal/local-agent/real-local-run-tools.d.ts +17 -6
  88. package/dist/internal/memory/storage/markdown-store.d.ts +14 -2
  89. package/dist/internal/memory/storage/memory-file.d.ts +54 -0
  90. package/dist/internal/memory/types.d.ts +28 -0
  91. package/dist/models.cjs +9 -9
  92. package/dist/models.js +1 -1
  93. package/dist/providers.cjs +4 -4
  94. package/dist/providers.js +2 -2
  95. package/dist/sandbox/index.cjs +1 -1
  96. package/dist/sandbox/index.cjs.map +1 -1
  97. package/dist/sandbox/index.js +1 -1
  98. package/dist/sandbox/index.js.map +1 -1
  99. package/dist/subagents-loader.d.cts +1 -1
  100. package/dist/subagents-loader.d.ts +1 -1
  101. package/dist/types/agent.d.ts +47 -5
  102. package/dist/types/provider-profile.d.ts +13 -0
  103. package/docs/error-codes.md +22 -20
  104. package/docs/harness-capability-map.md +3 -1
  105. package/package.json +1 -1
  106. package/dist/chunk-3KGLRRFC.cjs +0 -18
  107. package/dist/chunk-5PHVENFV.js.map +0 -1
  108. package/dist/chunk-5UOVYM3P.cjs.map +0 -1
  109. package/dist/chunk-DAPSQZT4.js.map +0 -1
  110. package/dist/chunk-Q47R5E2X.cjs.map +0 -1
  111. package/dist/chunk-RM7Y65IG.cjs.map +0 -1
  112. package/dist/chunk-TPTZA6NI.js.map +0 -1
  113. package/dist/chunk-UFAO4T7Z.cjs.map +0 -1
  114. package/dist/chunk-UNDROG5N.cjs.map +0 -1
  115. package/dist/chunk-VDEWG5TV.js.map +0 -1
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ // src/internal/runtime/context/context-yaml-lite.ts
4
+ var FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;
5
+ function splitFrontmatter(content) {
6
+ const m = FRONTMATTER_RE.exec(content);
7
+ if (m === null) return { yaml: void 0, body: content };
8
+ return { yaml: m[1] ?? "", body: m[2] ?? "" };
9
+ }
10
+ function parseSimpleYaml(yaml) {
11
+ const out = {};
12
+ const lines = yaml.split(/\r?\n/);
13
+ let i = 0;
14
+ while (i < lines.length) {
15
+ const line = lines[i];
16
+ i += 1;
17
+ if (line === void 0) continue;
18
+ const trimmed = line.trim();
19
+ if (trimmed === "" || trimmed.startsWith("#")) continue;
20
+ const colon = trimmed.indexOf(":");
21
+ if (colon === -1) throw new Error(`Invalid YAML line: ${trimmed}`);
22
+ const key = trimmed.slice(0, colon).trim();
23
+ const rest = trimmed.slice(colon + 1).trim();
24
+ if (rest === "") {
25
+ const items = [];
26
+ const nested = {};
27
+ let sawNested = false;
28
+ while (i < lines.length) {
29
+ const next = lines[i];
30
+ if (next === void 0) break;
31
+ const nextTrim = next.trim();
32
+ if (nextTrim === "") {
33
+ i += 1;
34
+ continue;
35
+ }
36
+ const indented = /^\s/.test(next);
37
+ if (nextTrim.startsWith("- ")) {
38
+ items.push(parseScalar(nextTrim.slice(2).trim()));
39
+ i += 1;
40
+ } else if (indented && nextTrim.includes(":")) {
41
+ const nestedColon = nextTrim.indexOf(":");
42
+ nested[nextTrim.slice(0, nestedColon).trim()] = parseScalar(
43
+ nextTrim.slice(nestedColon + 1).trim()
44
+ );
45
+ sawNested = true;
46
+ i += 1;
47
+ } else {
48
+ break;
49
+ }
50
+ }
51
+ out[key] = sawNested ? nested : items;
52
+ } else if (rest.startsWith("[") && rest.endsWith("]")) {
53
+ const inner = rest.slice(1, -1).trim();
54
+ out[key] = inner === "" ? [] : inner.split(",").map((s) => parseScalar(s.trim().replace(/^["']|["']$/g, "")));
55
+ } else {
56
+ out[key] = parseScalar(rest);
57
+ }
58
+ }
59
+ return out;
60
+ }
61
+ function parseScalar(s) {
62
+ if (s === "true") return true;
63
+ if (s === "false") return false;
64
+ if (/^-?\d+$/.test(s)) return parseInt(s, 10);
65
+ return s.replace(/^["']|["']$/g, "");
66
+ }
67
+
68
+ exports.parseSimpleYaml = parseSimpleYaml;
69
+ exports.splitFrontmatter = splitFrontmatter;
70
+ //# sourceMappingURL=chunk-KRD3GQAA.cjs.map
71
+ //# sourceMappingURL=chunk-KRD3GQAA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/context/context-yaml-lite.ts"],"names":[],"mappings":"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","file":"chunk-KRD3GQAA.cjs","sourcesContent":["/**\n * Minimal YAML-subset frontmatter parsing shared by the `.cursor/rules/*.mdc`\n * and `.theokit/rules/*.md` parsers (extracted for DRY — one parser, one set\n * of edge-case behaviours, no new dependency).\n *\n * Handles `key: value` lines (string scalars, booleans, integers) and `key:`\n * followed by indented `- item` arrays or inline `[a, b]` arrays. Sufficient\n * for the small, fixed frontmatter field sets these rule files use. Throws on\n * a truly malformed line (no colon).\n *\n * NOTE — distinct from the sibling `yaml-frontmatter.ts` `parseSimpleYaml` on\n * purpose: that one parses INLINE arrays only (`key: [a, b]`), whereas rule\n * files (`.cursor/rules/*.mdc`, `.theokit/rules/*.md`) use MULTI-LINE `- item`\n * lists (`paths:` / `globs:`), which this parser adds. Unifying onto the inline\n * parser would drop multi-line list support; unifying the other way would touch\n * the skills/subagents/persistence loaders that depend on the inline one. The\n * two intentionally coexist until a shared parser handles both shapes.\n *\n * @internal\n */\n\nconst FRONTMATTER_RE = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\nexport interface FrontmatterSplit {\n /** Raw YAML block between the `---` fences, or undefined when absent. */\n readonly yaml: string | undefined;\n /** The markdown body after the frontmatter (or the whole content). */\n readonly body: string;\n}\n\n/**\n * Split `---`-fenced frontmatter from the body. When no frontmatter fence is\n * present, `yaml` is undefined and `body` is the whole content.\n *\n * @internal\n */\nexport function splitFrontmatter(content: string): FrontmatterSplit {\n const m = FRONTMATTER_RE.exec(content);\n if (m === null) return { yaml: undefined, body: content };\n return { yaml: m[1] ?? \"\", body: m[2] ?? \"\" };\n}\n\n/**\n * Parse the minimal YAML subset. Throws on a line without a colon (malformed).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: YAML-subset parser handles scalars + multi-line arrays + inline arrays in a single pass; extracting helpers fragments the line-state machine.\nexport function parseSimpleYaml(yaml: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const lines = yaml.split(/\\r?\\n/);\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n i += 1;\n if (line === undefined) continue;\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) throw new Error(`Invalid YAML line: ${trimmed}`);\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (rest === \"\") {\n // `key:` with nothing after it opens either an indented `- item` list or an indented nested\n // map. Which one is decided by the first non-empty indented line, so both are collected here.\n //\n // The map branch is not a new feature so much as a repair: before it, `metadata:` followed by\n // ` type: x` set `metadata` to `[]` AND parsed the indented lines as TOP-LEVEL entries, so\n // the nesting silently flattened and a caller reading `metadata.type` got `undefined` while\n // `type` appeared where it never was. Claude Code's memory files carry exactly that shape.\n const items: string[] = [];\n const nested: Record<string, unknown> = {};\n let sawNested = false;\n while (i < lines.length) {\n const next = lines[i];\n if (next === undefined) break;\n const nextTrim = next.trim();\n if (nextTrim === \"\") {\n i += 1;\n continue;\n }\n const indented = /^\\s/.test(next);\n if (nextTrim.startsWith(\"- \")) {\n items.push(parseScalar(nextTrim.slice(2).trim()) as string);\n i += 1;\n } else if (indented && nextTrim.includes(\":\")) {\n const nestedColon = nextTrim.indexOf(\":\");\n nested[nextTrim.slice(0, nestedColon).trim()] = parseScalar(\n nextTrim.slice(nestedColon + 1).trim(),\n );\n sawNested = true;\n i += 1;\n } else {\n break;\n }\n }\n // An empty `key:` stays `[]` — the pre-existing contract every `paths:` in a rule file relies\n // on. Only an actually-indented `key: value` under it makes it a map.\n out[key] = sawNested ? nested : items;\n } else if (rest.startsWith(\"[\") && rest.endsWith(\"]\")) {\n // Inline array `globs: [\"**/*.ts\", \"**/*.tsx\"]`\n const inner = rest.slice(1, -1).trim();\n out[key] =\n inner === \"\"\n ? []\n : inner.split(\",\").map((s) => parseScalar(s.trim().replace(/^[\"']|[\"']$/g, \"\")));\n } else {\n out[key] = parseScalar(rest);\n }\n }\n return out;\n}\n\nfunction parseScalar(s: string): string | boolean | number {\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n if (/^-?\\d+$/.test(s)) return parseInt(s, 10);\n // Strip surrounding quotes if present.\n return s.replace(/^[\"']|[\"']$/g, \"\");\n}\n"]}
@@ -0,0 +1,68 @@
1
+ // src/internal/runtime/context/context-yaml-lite.ts
2
+ var FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/;
3
+ function splitFrontmatter(content) {
4
+ const m = FRONTMATTER_RE.exec(content);
5
+ if (m === null) return { yaml: void 0, body: content };
6
+ return { yaml: m[1] ?? "", body: m[2] ?? "" };
7
+ }
8
+ function parseSimpleYaml(yaml) {
9
+ const out = {};
10
+ const lines = yaml.split(/\r?\n/);
11
+ let i = 0;
12
+ while (i < lines.length) {
13
+ const line = lines[i];
14
+ i += 1;
15
+ if (line === void 0) continue;
16
+ const trimmed = line.trim();
17
+ if (trimmed === "" || trimmed.startsWith("#")) continue;
18
+ const colon = trimmed.indexOf(":");
19
+ if (colon === -1) throw new Error(`Invalid YAML line: ${trimmed}`);
20
+ const key = trimmed.slice(0, colon).trim();
21
+ const rest = trimmed.slice(colon + 1).trim();
22
+ if (rest === "") {
23
+ const items = [];
24
+ const nested = {};
25
+ let sawNested = false;
26
+ while (i < lines.length) {
27
+ const next = lines[i];
28
+ if (next === void 0) break;
29
+ const nextTrim = next.trim();
30
+ if (nextTrim === "") {
31
+ i += 1;
32
+ continue;
33
+ }
34
+ const indented = /^\s/.test(next);
35
+ if (nextTrim.startsWith("- ")) {
36
+ items.push(parseScalar(nextTrim.slice(2).trim()));
37
+ i += 1;
38
+ } else if (indented && nextTrim.includes(":")) {
39
+ const nestedColon = nextTrim.indexOf(":");
40
+ nested[nextTrim.slice(0, nestedColon).trim()] = parseScalar(
41
+ nextTrim.slice(nestedColon + 1).trim()
42
+ );
43
+ sawNested = true;
44
+ i += 1;
45
+ } else {
46
+ break;
47
+ }
48
+ }
49
+ out[key] = sawNested ? nested : items;
50
+ } else if (rest.startsWith("[") && rest.endsWith("]")) {
51
+ const inner = rest.slice(1, -1).trim();
52
+ out[key] = inner === "" ? [] : inner.split(",").map((s) => parseScalar(s.trim().replace(/^["']|["']$/g, "")));
53
+ } else {
54
+ out[key] = parseScalar(rest);
55
+ }
56
+ }
57
+ return out;
58
+ }
59
+ function parseScalar(s) {
60
+ if (s === "true") return true;
61
+ if (s === "false") return false;
62
+ if (/^-?\d+$/.test(s)) return parseInt(s, 10);
63
+ return s.replace(/^["']|["']$/g, "");
64
+ }
65
+
66
+ export { parseSimpleYaml, splitFrontmatter };
67
+ //# sourceMappingURL=chunk-KVNWIAO4.js.map
68
+ //# sourceMappingURL=chunk-KVNWIAO4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/runtime/context/context-yaml-lite.ts"],"names":[],"mappings":"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","file":"chunk-KVNWIAO4.js","sourcesContent":["/**\n * Minimal YAML-subset frontmatter parsing shared by the `.cursor/rules/*.mdc`\n * and `.theokit/rules/*.md` parsers (extracted for DRY — one parser, one set\n * of edge-case behaviours, no new dependency).\n *\n * Handles `key: value` lines (string scalars, booleans, integers) and `key:`\n * followed by indented `- item` arrays or inline `[a, b]` arrays. Sufficient\n * for the small, fixed frontmatter field sets these rule files use. Throws on\n * a truly malformed line (no colon).\n *\n * NOTE — distinct from the sibling `yaml-frontmatter.ts` `parseSimpleYaml` on\n * purpose: that one parses INLINE arrays only (`key: [a, b]`), whereas rule\n * files (`.cursor/rules/*.mdc`, `.theokit/rules/*.md`) use MULTI-LINE `- item`\n * lists (`paths:` / `globs:`), which this parser adds. Unifying onto the inline\n * parser would drop multi-line list support; unifying the other way would touch\n * the skills/subagents/persistence loaders that depend on the inline one. The\n * two intentionally coexist until a shared parser handles both shapes.\n *\n * @internal\n */\n\nconst FRONTMATTER_RE = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n([\\s\\S]*)$/;\n\nexport interface FrontmatterSplit {\n /** Raw YAML block between the `---` fences, or undefined when absent. */\n readonly yaml: string | undefined;\n /** The markdown body after the frontmatter (or the whole content). */\n readonly body: string;\n}\n\n/**\n * Split `---`-fenced frontmatter from the body. When no frontmatter fence is\n * present, `yaml` is undefined and `body` is the whole content.\n *\n * @internal\n */\nexport function splitFrontmatter(content: string): FrontmatterSplit {\n const m = FRONTMATTER_RE.exec(content);\n if (m === null) return { yaml: undefined, body: content };\n return { yaml: m[1] ?? \"\", body: m[2] ?? \"\" };\n}\n\n/**\n * Parse the minimal YAML subset. Throws on a line without a colon (malformed).\n *\n * @internal\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: YAML-subset parser handles scalars + multi-line arrays + inline arrays in a single pass; extracting helpers fragments the line-state machine.\nexport function parseSimpleYaml(yaml: string): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const lines = yaml.split(/\\r?\\n/);\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n i += 1;\n if (line === undefined) continue;\n const trimmed = line.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) throw new Error(`Invalid YAML line: ${trimmed}`);\n const key = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (rest === \"\") {\n // `key:` with nothing after it opens either an indented `- item` list or an indented nested\n // map. Which one is decided by the first non-empty indented line, so both are collected here.\n //\n // The map branch is not a new feature so much as a repair: before it, `metadata:` followed by\n // ` type: x` set `metadata` to `[]` AND parsed the indented lines as TOP-LEVEL entries, so\n // the nesting silently flattened and a caller reading `metadata.type` got `undefined` while\n // `type` appeared where it never was. Claude Code's memory files carry exactly that shape.\n const items: string[] = [];\n const nested: Record<string, unknown> = {};\n let sawNested = false;\n while (i < lines.length) {\n const next = lines[i];\n if (next === undefined) break;\n const nextTrim = next.trim();\n if (nextTrim === \"\") {\n i += 1;\n continue;\n }\n const indented = /^\\s/.test(next);\n if (nextTrim.startsWith(\"- \")) {\n items.push(parseScalar(nextTrim.slice(2).trim()) as string);\n i += 1;\n } else if (indented && nextTrim.includes(\":\")) {\n const nestedColon = nextTrim.indexOf(\":\");\n nested[nextTrim.slice(0, nestedColon).trim()] = parseScalar(\n nextTrim.slice(nestedColon + 1).trim(),\n );\n sawNested = true;\n i += 1;\n } else {\n break;\n }\n }\n // An empty `key:` stays `[]` — the pre-existing contract every `paths:` in a rule file relies\n // on. Only an actually-indented `key: value` under it makes it a map.\n out[key] = sawNested ? nested : items;\n } else if (rest.startsWith(\"[\") && rest.endsWith(\"]\")) {\n // Inline array `globs: [\"**/*.ts\", \"**/*.tsx\"]`\n const inner = rest.slice(1, -1).trim();\n out[key] =\n inner === \"\"\n ? []\n : inner.split(\",\").map((s) => parseScalar(s.trim().replace(/^[\"']|[\"']$/g, \"\")));\n } else {\n out[key] = parseScalar(rest);\n }\n }\n return out;\n}\n\nfunction parseScalar(s: string): string | boolean | number {\n if (s === \"true\") return true;\n if (s === \"false\") return false;\n if (/^-?\\d+$/.test(s)) return parseInt(s, 10);\n // Strip surrounding quotes if present.\n return s.replace(/^[\"']|[\"']$/g, \"\");\n}\n"]}