chain-insights 0.2.16

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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +165 -0
  3. package/bin/cli.js +10 -0
  4. package/bin/install.cjs +252 -0
  5. package/bin/mcp-proxy.cjs +10 -0
  6. package/dist/active-BSrxLKwn.mjs +50 -0
  7. package/dist/active-BSrxLKwn.mjs.map +1 -0
  8. package/dist/active-Dv7Tu-O4.cjs +68 -0
  9. package/dist/app-BjjuQM0B.mjs +155 -0
  10. package/dist/app-BjjuQM0B.mjs.map +1 -0
  11. package/dist/app-Dq1TdB6p.cjs +161 -0
  12. package/dist/artifact-server-DoxJ7fCx.cjs +47 -0
  13. package/dist/artifact-server-Dxz5YbuQ.mjs +48 -0
  14. package/dist/artifact-server-Dxz5YbuQ.mjs.map +1 -0
  15. package/dist/assets/bg-pattern.png +0 -0
  16. package/dist/assets/logo.png +0 -0
  17. package/dist/call-args-DQA2QcRA.cjs +27 -0
  18. package/dist/call-args-Lk_wOJxd.mjs +29 -0
  19. package/dist/call-args-Lk_wOJxd.mjs.map +1 -0
  20. package/dist/capabilities-CB97WMA5.cjs +83 -0
  21. package/dist/capabilities-DliMBim-.mjs +84 -0
  22. package/dist/capabilities-DliMBim-.mjs.map +1 -0
  23. package/dist/cases-By7INiOa.mjs +6 -0
  24. package/dist/cases-CDcNU91B.cjs +9 -0
  25. package/dist/chunk-CZWwpsFl.cjs +43 -0
  26. package/dist/cli.cjs +752 -0
  27. package/dist/cli.d.cts +1 -0
  28. package/dist/cli.d.mts +1 -0
  29. package/dist/cli.mjs +753 -0
  30. package/dist/cli.mjs.map +1 -0
  31. package/dist/client-D4Bq0rp9.mjs +111 -0
  32. package/dist/client-D4Bq0rp9.mjs.map +1 -0
  33. package/dist/client-D4fZgIaO.cjs +132 -0
  34. package/dist/config-Bmdl5hdk.cjs +67 -0
  35. package/dist/config-BwrBYmiC.mjs +44 -0
  36. package/dist/config-BwrBYmiC.mjs.map +1 -0
  37. package/dist/data-extractor-BNGj7ECT.cjs +347 -0
  38. package/dist/data-extractor-DFzsa5CS.mjs +336 -0
  39. package/dist/data-extractor-DFzsa5CS.mjs.map +1 -0
  40. package/dist/dossier-BsroDgD3.mjs +76 -0
  41. package/dist/dossier-BsroDgD3.mjs.map +1 -0
  42. package/dist/dossier-DtxREpPm.cjs +76 -0
  43. package/dist/evidence-BGcdKxuV.cjs +200 -0
  44. package/dist/evidence-BhvFW-y_.mjs +195 -0
  45. package/dist/evidence-BhvFW-y_.mjs.map +1 -0
  46. package/dist/format-Ce1RObVl.mjs +22 -0
  47. package/dist/format-Ce1RObVl.mjs.map +1 -0
  48. package/dist/format-DOrPvXEr.cjs +20 -0
  49. package/dist/frontmatter-D8wWCeOa.mjs +26 -0
  50. package/dist/frontmatter-D8wWCeOa.mjs.map +1 -0
  51. package/dist/frontmatter-DgAuai7E.cjs +35 -0
  52. package/dist/graph-normalizer-Cv9yK9Pg.mjs +130 -0
  53. package/dist/graph-normalizer-Cv9yK9Pg.mjs.map +1 -0
  54. package/dist/graph-normalizer-DeIj6Ses.cjs +133 -0
  55. package/dist/graph-reports-C4TBjCkM.mjs +63 -0
  56. package/dist/graph-reports-C4TBjCkM.mjs.map +1 -0
  57. package/dist/graph-reports-DU05YCei.cjs +64 -0
  58. package/dist/html-generator-CAv81IWH.cjs +85 -0
  59. package/dist/html-generator-V6Bp0uRb.mjs +68 -0
  60. package/dist/html-generator-V6Bp0uRb.mjs.map +1 -0
  61. package/dist/index.cjs +31 -0
  62. package/dist/index.d.cts +187 -0
  63. package/dist/index.d.cts.map +1 -0
  64. package/dist/index.d.mts +187 -0
  65. package/dist/index.d.mts.map +1 -0
  66. package/dist/index.mjs +9 -0
  67. package/dist/init-BjuFt54X.cjs +232 -0
  68. package/dist/init-CaOsHTIo.mjs +232 -0
  69. package/dist/init-CaOsHTIo.mjs.map +1 -0
  70. package/dist/mcp-proxy.cjs +1257 -0
  71. package/dist/mcp-proxy.d.cts +12 -0
  72. package/dist/mcp-proxy.d.cts.map +1 -0
  73. package/dist/mcp-proxy.d.mts +12 -0
  74. package/dist/mcp-proxy.d.mts.map +1 -0
  75. package/dist/mcp-proxy.mjs +1255 -0
  76. package/dist/mcp-proxy.mjs.map +1 -0
  77. package/dist/output-root-CFYms3ad.cjs +43 -0
  78. package/dist/output-root-CmWM7aV2.mjs +33 -0
  79. package/dist/output-root-CmWM7aV2.mjs.map +1 -0
  80. package/dist/parser-BUIWW1OH.cjs +182 -0
  81. package/dist/parser-DO0_SssG.mjs +182 -0
  82. package/dist/parser-DO0_SssG.mjs.map +1 -0
  83. package/dist/public-tools-D4UI-Zb0.mjs +2554 -0
  84. package/dist/public-tools-D4UI-Zb0.mjs.map +1 -0
  85. package/dist/public-tools-XSpkz2ky.cjs +2556 -0
  86. package/dist/resolver-C2ZS7oC8.mjs +201 -0
  87. package/dist/resolver-C2ZS7oC8.mjs.map +1 -0
  88. package/dist/resolver-zYbu4wDV.cjs +203 -0
  89. package/dist/rolldown-runtime-wcPFST8Q.mjs +13 -0
  90. package/dist/runner-1Eq55OYb.cjs +148 -0
  91. package/dist/runner-BhUHbiHG.mjs +149 -0
  92. package/dist/runner-BhUHbiHG.mjs.map +1 -0
  93. package/dist/schema-4XpzDFQM.cjs +55 -0
  94. package/dist/schema-8d0rVIdZ.mjs +37 -0
  95. package/dist/schema-8d0rVIdZ.mjs.map +1 -0
  96. package/dist/schema-cache-9CksD7tX.mjs +34 -0
  97. package/dist/schema-cache-9CksD7tX.mjs.map +1 -0
  98. package/dist/schema-cache-CgWRCN2N.cjs +36 -0
  99. package/dist/selector-CkFcTXzz.cjs +10 -0
  100. package/dist/selector-xjm6NTHI.mjs +12 -0
  101. package/dist/selector-xjm6NTHI.mjs.map +1 -0
  102. package/dist/server-BkM5xrXb.mjs +45 -0
  103. package/dist/server-BkM5xrXb.mjs.map +1 -0
  104. package/dist/server-DXowbpfi.cjs +54 -0
  105. package/dist/session-BpNylyuJ.cjs +115 -0
  106. package/dist/session-CcTgYxsj.mjs +115 -0
  107. package/dist/session-CcTgYxsj.mjs.map +1 -0
  108. package/dist/setup-DOpKPrlx.cjs +81 -0
  109. package/dist/setup-DyrWHuwQ.mjs +80 -0
  110. package/dist/setup-DyrWHuwQ.mjs.map +1 -0
  111. package/dist/store-BiUhQOIf.cjs +230 -0
  112. package/dist/store-BoWE-Gtl.mjs +225 -0
  113. package/dist/store-BoWE-Gtl.mjs.map +1 -0
  114. package/dist/templates/graph.html +1406 -0
  115. package/dist/tool-visibility-3Z_KvO9Q.mjs +28 -0
  116. package/dist/tool-visibility-3Z_KvO9Q.mjs.map +1 -0
  117. package/dist/tool-visibility-CwgY205r.cjs +36 -0
  118. package/dist/tools-Cp2jAAAb.mjs +100 -0
  119. package/dist/tools-Cp2jAAAb.mjs.map +1 -0
  120. package/dist/tools-f_vJUZAF.cjs +139 -0
  121. package/dist/topup-server-BZuQifvh.cjs +940 -0
  122. package/dist/topup-server-DUjyFftI.mjs +919 -0
  123. package/dist/topup-server-DUjyFftI.mjs.map +1 -0
  124. package/dist/version-1gP19Lhi.mjs +8 -0
  125. package/dist/version-1gP19Lhi.mjs.map +1 -0
  126. package/dist/version-BNGtdpmH.cjs +18 -0
  127. package/dist/viz-BlCJe6Tk.mjs +35 -0
  128. package/dist/viz-BlCJe6Tk.mjs.map +1 -0
  129. package/dist/viz-ClezVXrJ.cjs +44 -0
  130. package/dist/wallet-BMelXBYP.mjs +104 -0
  131. package/dist/wallet-BMelXBYP.mjs.map +1 -0
  132. package/dist/wallet-RnvvSpV2.cjs +146 -0
  133. package/docs/architecture.md +145 -0
  134. package/docs/contributing.md +68 -0
  135. package/docs/debugging.md +68 -0
  136. package/docs/development.md +44 -0
  137. package/docs/graph-tools.md +251 -0
  138. package/docs/images/graph-mcp-iframe.png +0 -0
  139. package/docs/images/graph-visualization.png +0 -0
  140. package/docs/images/topup-page.png +0 -0
  141. package/docs/investigation-workspaces.md +151 -0
  142. package/docs/mcp-proxy.md +180 -0
  143. package/package.json +59 -0
  144. package/skills/chain-insights-developer-experience/SKILL.md +101 -0
  145. package/skills/chain-insights-investigation/SKILL.md +285 -0
  146. package/skills/chain-insights-investigation/agents/openai.yaml +4 -0
  147. package/skills/chain-insights-investigation/scripts/run-target-uat.sh +197 -0
  148. package/skills/chain-insights-trace-funds/SKILL.md +249 -0
  149. package/skills/ci-case/SKILL.md +43 -0
  150. package/skills/ci-status/SKILL.md +45 -0
  151. package/skills/test-chain-insights-graphrag-mcp/SKILL.md +75 -0
  152. package/skills/test-chain-insights-graphrag-mcp/agents/openai.yaml +4 -0
  153. package/skills/test-chain-insights-graphrag-mcp/scripts/run-uat.sh +414 -0
@@ -0,0 +1,182 @@
1
+ import * as z from "zod";
2
+ //#region src/playbooks/schema.ts
3
+ const ParamSpecSchema = z.object({
4
+ name: z.string(),
5
+ type: z.enum([
6
+ "string",
7
+ "number",
8
+ "boolean"
9
+ ]).default("string"),
10
+ required: z.boolean().default(true),
11
+ default: z.string().optional()
12
+ });
13
+ const StepSchema = z.object({
14
+ index: z.number().int().positive(),
15
+ label: z.string(),
16
+ tool: z.string().min(1),
17
+ params: z.record(z.string(), z.string())
18
+ });
19
+ const PlaybookSchema = z.object({
20
+ name: z.string().min(1),
21
+ description: z.string().default(""),
22
+ version: z.string().default("1.0.0"),
23
+ params: z.array(ParamSpecSchema).default([]),
24
+ steps: z.array(StepSchema)
25
+ });
26
+ //#endregion
27
+ //#region src/playbooks/parser.ts
28
+ /**
29
+ * Apply {{param}} template substitution to a string.
30
+ * Missing keys are left as-is: {{missing}} remains {{missing}}.
31
+ */
32
+ function applyTemplate(text, params) {
33
+ return text.replace(/\{\{(\w+)\}\}/g, (_, k) => params[k] ?? `{{${k}}}`);
34
+ }
35
+ /**
36
+ * Extract content of a fenced code block by language tag.
37
+ * Returns the trimmed content between the opening and closing fences, or null.
38
+ */
39
+ function extractFencedBlock(section, lang) {
40
+ const match = new RegExp("```" + lang + "\\n([\\s\\S]*?)```", "m").exec(section);
41
+ return match ? match[1]?.trim() ?? null : null;
42
+ }
43
+ /**
44
+ * Parse params block content into a Record<string, string>.
45
+ * Each line is expected to be "key: value" format.
46
+ */
47
+ function parseParamsBlock(content) {
48
+ const result = {};
49
+ for (const line of content.split("\n")) {
50
+ const trimmed = line.trim();
51
+ if (!trimmed) continue;
52
+ const colonIdx = trimmed.indexOf(":");
53
+ if (colonIdx === -1) continue;
54
+ const key = trimmed.slice(0, colonIdx).trim();
55
+ const val = trimmed.slice(colonIdx + 1).trim();
56
+ if (key) result[key] = val;
57
+ }
58
+ return result;
59
+ }
60
+ /**
61
+ * Parse flat YAML key: value frontmatter (without params arrays).
62
+ * Skips lines starting with '-' (YAML array items — not supported here).
63
+ */
64
+ function parseFlatFrontmatter(block) {
65
+ const result = {};
66
+ for (const line of block.split("\n")) {
67
+ const trimmed = line.trim();
68
+ if (!trimmed || trimmed.startsWith("-")) continue;
69
+ const colonIdx = trimmed.indexOf(":");
70
+ if (colonIdx === -1) continue;
71
+ const key = trimmed.slice(0, colonIdx).trim();
72
+ const val = trimmed.slice(colonIdx + 1).trim();
73
+ if (key && val !== void 0) result[key] = val;
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Parse the `params:` YAML array block from frontmatter.
79
+ * Handles the multi-line format:
80
+ * params:
81
+ * - name: address
82
+ * type: string
83
+ * required: true
84
+ * - name: hops
85
+ * type: number
86
+ * required: false
87
+ * default: "2"
88
+ *
89
+ * Returns an array of raw param objects (strings, to be validated by Zod).
90
+ */
91
+ function parseFrontmatterParamsArray(block) {
92
+ const results = [];
93
+ const lines = block.split("\n");
94
+ let inParams = false;
95
+ let current = null;
96
+ for (const line of lines) {
97
+ const trimmed = line.trim();
98
+ if (!trimmed) continue;
99
+ if (!inParams && /^params\s*:/.test(trimmed)) {
100
+ inParams = true;
101
+ continue;
102
+ }
103
+ if (!inParams) continue;
104
+ if (!line.startsWith(" ") && !line.startsWith(" ") && !trimmed.startsWith("-")) break;
105
+ if (trimmed.startsWith("- ")) {
106
+ if (current !== null) results.push(current);
107
+ current = {};
108
+ const rest = trimmed.slice(2).trim();
109
+ if (rest) {
110
+ const colonIdx = rest.indexOf(":");
111
+ if (colonIdx !== -1) {
112
+ const k = rest.slice(0, colonIdx).trim();
113
+ const v = rest.slice(colonIdx + 1).trim().replace(/^"(.*)"$/, "$1");
114
+ if (k) current[k] = v;
115
+ }
116
+ }
117
+ continue;
118
+ }
119
+ if (current !== null) {
120
+ const colonIdx = trimmed.indexOf(":");
121
+ if (colonIdx !== -1) {
122
+ const k = trimmed.slice(0, colonIdx).trim();
123
+ const v = trimmed.slice(colonIdx + 1).trim().replace(/^"(.*)"$/, "$1");
124
+ if (k) current[k] = v;
125
+ }
126
+ }
127
+ }
128
+ if (current !== null) results.push(current);
129
+ return results;
130
+ }
131
+ const PlaybookParser = {
132
+ /**
133
+ * Parse a playbook markdown file into a validated PlaybookDefinition.
134
+ *
135
+ * @param markdown - Raw markdown content of the playbook file
136
+ * @param resolvedParams - Key-value parameters for {{param}} substitution
137
+ * @returns Validated PlaybookDefinition (throws ZodError on invalid data)
138
+ */
139
+ parse(markdown, resolvedParams) {
140
+ const fmMatch = /^---\n([\s\S]*?)\n---/.exec(markdown);
141
+ const frontmatterBlock = fmMatch ? fmMatch[1] : "";
142
+ const frontmatter = parseFlatFrontmatter(frontmatterBlock);
143
+ const params = parseFrontmatterParamsArray(frontmatterBlock).map((raw) => {
144
+ const coerced = {
145
+ name: raw["name"] ?? "",
146
+ type: raw["type"] ?? "string",
147
+ required: raw["required"] !== void 0 ? raw["required"].toLowerCase() !== "false" : true
148
+ };
149
+ if (raw["default"] !== void 0) coerced["default"] = raw["default"];
150
+ return ParamSpecSchema.parse(coerced);
151
+ });
152
+ const templateParams = {};
153
+ for (const spec of params) if (spec.default !== void 0) templateParams[spec.name] = spec.default;
154
+ Object.assign(templateParams, resolvedParams);
155
+ let body = markdown;
156
+ if (fmMatch) body = markdown.slice(fmMatch.index + fmMatch[0].length);
157
+ const steps = body.split(/^## /m).slice(1).map((section, i) => {
158
+ const firstNewline = section.indexOf("\n");
159
+ const label = firstNewline === -1 ? section.trim() : section.slice(0, firstNewline).trim();
160
+ const tool = applyTemplate(extractFencedBlock(section, "tool") ?? "", templateParams);
161
+ const rawParams = parseParamsBlock(extractFencedBlock(section, "params") ?? "");
162
+ const params = {};
163
+ for (const [k, v] of Object.entries(rawParams)) params[applyTemplate(k, templateParams)] = applyTemplate(v, templateParams);
164
+ return {
165
+ index: i + 1,
166
+ label,
167
+ tool,
168
+ params
169
+ };
170
+ });
171
+ return PlaybookSchema.parse({
172
+ name: frontmatter["name"] ?? "",
173
+ description: frontmatter["description"] ?? "",
174
+ version: frontmatter["version"] ?? "1.0.0",
175
+ params,
176
+ steps
177
+ });
178
+ } };
179
+ //#endregion
180
+ export { PlaybookParser };
181
+
182
+ //# sourceMappingURL=parser-DO0_SssG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-DO0_SssG.mjs","names":[],"sources":["../src/playbooks/schema.ts","../src/playbooks/parser.ts"],"sourcesContent":["import * as z from 'zod'\n\nexport const ParamSpecSchema = z.object({\n name: z.string(),\n type: z.enum(['string', 'number', 'boolean']).default('string'),\n required: z.boolean().default(true),\n default: z.string().optional(),\n})\n\nexport const StepSchema = z.object({\n index: z.number().int().positive(),\n label: z.string(),\n tool: z.string().min(1),\n params: z.record(z.string(), z.string()),\n})\n\nexport const PlaybookSchema = z.object({\n name: z.string().min(1),\n description: z.string().default(''),\n version: z.string().default('1.0.0'),\n params: z.array(ParamSpecSchema).default([]),\n steps: z.array(StepSchema),\n})\n\nexport type PlaybookDefinition = z.infer<typeof PlaybookSchema>\nexport type StepDefinition = z.infer<typeof StepSchema>\nexport type ParamSpec = z.infer<typeof ParamSpecSchema>\n","import { PlaybookSchema, ParamSpecSchema, type PlaybookDefinition } from './schema.js'\n\n/**\n * Apply {{param}} template substitution to a string.\n * Missing keys are left as-is: {{missing}} remains {{missing}}.\n */\nfunction applyTemplate(text: string, params: Record<string, string>): string {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, k: string) => params[k] ?? `{{${k}}}`)\n}\n\n/**\n * Extract content of a fenced code block by language tag.\n * Returns the trimmed content between the opening and closing fences, or null.\n */\nfunction extractFencedBlock(section: string, lang: string): string | null {\n // Match ```lang\\n...\\n``` pattern\n const re = new RegExp('```' + lang + '\\\\n([\\\\s\\\\S]*?)```', 'm')\n const match = re.exec(section)\n return match ? (match[1]?.trim() ?? null) : null\n}\n\n/**\n * Parse params block content into a Record<string, string>.\n * Each line is expected to be \"key: value\" format.\n */\nfunction parseParamsBlock(content: string): Record<string, string> {\n const result: Record<string, string> = {}\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed) continue\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx === -1) continue\n const key = trimmed.slice(0, colonIdx).trim()\n const val = trimmed.slice(colonIdx + 1).trim()\n if (key) result[key] = val\n }\n return result\n}\n\n/**\n * Parse flat YAML key: value frontmatter (without params arrays).\n * Skips lines starting with '-' (YAML array items — not supported here).\n */\nfunction parseFlatFrontmatter(block: string): Record<string, string> {\n const result: Record<string, string> = {}\n for (const line of block.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('-')) continue\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx === -1) continue\n const key = trimmed.slice(0, colonIdx).trim()\n const val = trimmed.slice(colonIdx + 1).trim()\n if (key && val !== undefined) result[key] = val\n }\n return result\n}\n\n/**\n * Parse the `params:` YAML array block from frontmatter.\n * Handles the multi-line format:\n * params:\n * - name: address\n * type: string\n * required: true\n * - name: hops\n * type: number\n * required: false\n * default: \"2\"\n *\n * Returns an array of raw param objects (strings, to be validated by Zod).\n */\nfunction parseFrontmatterParamsArray(block: string): Array<Record<string, string>> {\n const results: Array<Record<string, string>> = []\n\n // Find the params: key\n const lines = block.split('\\n')\n let inParams = false\n let current: Record<string, string> | null = null\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n\n // Check for `params:` key (may or may not have value on same line)\n if (!inParams && /^params\\s*:/.test(trimmed)) {\n inParams = true\n continue\n }\n\n if (!inParams) continue\n\n // Stop at a top-level key (non-indented, non-list line that contains ':')\n // This detects keys like `name:`, `version:`, etc. at root level\n if (!line.startsWith(' ') && !line.startsWith('\\t') && !trimmed.startsWith('-')) {\n break\n }\n\n // New list item\n if (trimmed.startsWith('- ')) {\n if (current !== null) results.push(current)\n current = {}\n const rest = trimmed.slice(2).trim()\n if (rest) {\n const colonIdx = rest.indexOf(':')\n if (colonIdx !== -1) {\n const k = rest.slice(0, colonIdx).trim()\n const v = rest.slice(colonIdx + 1).trim().replace(/^\"(.*)\"$/, '$1')\n if (k) current[k] = v\n }\n }\n continue\n }\n\n // Key-value within a list item\n if (current !== null) {\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx !== -1) {\n const k = trimmed.slice(0, colonIdx).trim()\n const v = trimmed.slice(colonIdx + 1).trim().replace(/^\"(.*)\"$/, '$1')\n if (k) current[k] = v\n }\n }\n }\n\n if (current !== null) results.push(current)\n return results\n}\n\nexport const PlaybookParser = {\n /**\n * Parse a playbook markdown file into a validated PlaybookDefinition.\n *\n * @param markdown - Raw markdown content of the playbook file\n * @param resolvedParams - Key-value parameters for {{param}} substitution\n * @returns Validated PlaybookDefinition (throws ZodError on invalid data)\n */\n parse(markdown: string, resolvedParams: Record<string, string>): PlaybookDefinition {\n // 1. Split on first and second --- fences to extract frontmatter block\n const fmMatch = /^---\\n([\\s\\S]*?)\\n---/.exec(markdown)\n const frontmatterBlock = fmMatch ? fmMatch[1]! : ''\n const frontmatter = parseFlatFrontmatter(frontmatterBlock)\n\n // 2. Parse params spec from frontmatter YAML array before step parsing so\n // defaults are available for {{param}} substitution.\n const rawParamItems = parseFrontmatterParamsArray(frontmatterBlock)\n const params = rawParamItems.map(raw => {\n // Coerce required/default fields\n const coerced: Record<string, unknown> = {\n name: raw['name'] ?? '',\n type: raw['type'] ?? 'string',\n required: raw['required'] !== undefined\n ? raw['required'].toLowerCase() !== 'false'\n : true,\n }\n if (raw['default'] !== undefined) coerced['default'] = raw['default']\n return ParamSpecSchema.parse(coerced)\n })\n\n const templateParams: Record<string, string> = {}\n for (const spec of params) {\n if (spec.default !== undefined) templateParams[spec.name] = spec.default\n }\n Object.assign(templateParams, resolvedParams)\n\n // 3. Extract body (everything after closing ---)\n let body = markdown\n if (fmMatch) {\n body = markdown.slice(fmMatch.index + fmMatch[0].length)\n }\n\n // 4. Split body on H2 sections (## heading)\n const sections = body.split(/^## /m)\n // First element is content before first ##, skip it\n const stepSections = sections.slice(1)\n\n // 5. Parse each step section\n const steps = stepSections.map((section, i) => {\n // First line is the label (the H2 heading content)\n const firstNewline = section.indexOf('\\n')\n const label = firstNewline === -1\n ? section.trim()\n : section.slice(0, firstNewline).trim()\n\n // Extract tool name from ```tool block\n const rawTool = extractFencedBlock(section, 'tool') ?? ''\n const tool = applyTemplate(rawTool, templateParams)\n\n // Extract params from ```params block\n const rawParamsBlock = extractFencedBlock(section, 'params') ?? ''\n const rawParams = parseParamsBlock(rawParamsBlock)\n\n // Apply template substitution to all param values\n const params: Record<string, string> = {}\n for (const [k, v] of Object.entries(rawParams)) {\n params[applyTemplate(k, templateParams)] = applyTemplate(v, templateParams)\n }\n\n return {\n index: i + 1,\n label,\n tool,\n params,\n }\n })\n\n // 6. Build and validate the playbook definition\n return PlaybookSchema.parse({\n name: frontmatter['name'] ?? '',\n description: frontmatter['description'] ?? '',\n version: frontmatter['version'] ?? '1.0.0',\n params,\n steps,\n })\n },\n}\n"],"mappings":"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"}