@agntk/agent-harness 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 (212) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +41 -0
  3. package/README.md +445 -0
  4. package/defaults/agents/summarizer.md +49 -0
  5. package/defaults/instincts/lead-with-answer.md +24 -0
  6. package/defaults/instincts/qualify-before-recommending.md +40 -0
  7. package/defaults/instincts/read-before-edit.md +23 -0
  8. package/defaults/instincts/search-before-create.md +23 -0
  9. package/defaults/playbooks/ship-feature.md +31 -0
  10. package/defaults/rules/ask-before-assuming.md +35 -0
  11. package/defaults/rules/operations.md +35 -0
  12. package/defaults/rules/respect-the-user.md +39 -0
  13. package/defaults/skills/business-analyst.md +181 -0
  14. package/defaults/skills/content-marketer.md +184 -0
  15. package/defaults/skills/research.md +34 -0
  16. package/defaults/tools/example-web-search.md +60 -0
  17. package/defaults/workflows/daily-reflection.md +54 -0
  18. package/dist/agent-framework-K4GUIICH.js +344 -0
  19. package/dist/agent-framework-K4GUIICH.js.map +1 -0
  20. package/dist/analytics-RPT73WNM.js +12 -0
  21. package/dist/analytics-RPT73WNM.js.map +1 -0
  22. package/dist/auto-processor-OLE45UI3.js +13 -0
  23. package/dist/auto-processor-OLE45UI3.js.map +1 -0
  24. package/dist/chunk-274RV3YO.js +162 -0
  25. package/dist/chunk-274RV3YO.js.map +1 -0
  26. package/dist/chunk-4CWAGBNS.js +168 -0
  27. package/dist/chunk-4CWAGBNS.js.map +1 -0
  28. package/dist/chunk-4FDUOGSZ.js +69 -0
  29. package/dist/chunk-4FDUOGSZ.js.map +1 -0
  30. package/dist/chunk-5H34JPMB.js +199 -0
  31. package/dist/chunk-5H34JPMB.js.map +1 -0
  32. package/dist/chunk-6EMOEYGU.js +102 -0
  33. package/dist/chunk-6EMOEYGU.js.map +1 -0
  34. package/dist/chunk-A7BJPQQ6.js +236 -0
  35. package/dist/chunk-A7BJPQQ6.js.map +1 -0
  36. package/dist/chunk-AGAAFJEO.js +76 -0
  37. package/dist/chunk-AGAAFJEO.js.map +1 -0
  38. package/dist/chunk-BSKDOFRT.js +65 -0
  39. package/dist/chunk-BSKDOFRT.js.map +1 -0
  40. package/dist/chunk-CHJ5GNZC.js +100 -0
  41. package/dist/chunk-CHJ5GNZC.js.map +1 -0
  42. package/dist/chunk-CSL3ERUI.js +307 -0
  43. package/dist/chunk-CSL3ERUI.js.map +1 -0
  44. package/dist/chunk-DA7IKHC4.js +229 -0
  45. package/dist/chunk-DA7IKHC4.js.map +1 -0
  46. package/dist/chunk-DGUM43GV.js +11 -0
  47. package/dist/chunk-DGUM43GV.js.map +1 -0
  48. package/dist/chunk-DTTXPHFW.js +211 -0
  49. package/dist/chunk-DTTXPHFW.js.map +1 -0
  50. package/dist/chunk-FD55B3IO.js +204 -0
  51. package/dist/chunk-FD55B3IO.js.map +1 -0
  52. package/dist/chunk-FLZU44SV.js +230 -0
  53. package/dist/chunk-FLZU44SV.js.map +1 -0
  54. package/dist/chunk-GJNNR2RA.js +200 -0
  55. package/dist/chunk-GJNNR2RA.js.map +1 -0
  56. package/dist/chunk-GNUSHD2Y.js +111 -0
  57. package/dist/chunk-GNUSHD2Y.js.map +1 -0
  58. package/dist/chunk-GUJTBGVS.js +2212 -0
  59. package/dist/chunk-GUJTBGVS.js.map +1 -0
  60. package/dist/chunk-IZ6UZ3ZL.js +207 -0
  61. package/dist/chunk-IZ6UZ3ZL.js.map +1 -0
  62. package/dist/chunk-JKMGYWXB.js +197 -0
  63. package/dist/chunk-JKMGYWXB.js.map +1 -0
  64. package/dist/chunk-KFX54TQM.js +165 -0
  65. package/dist/chunk-KFX54TQM.js.map +1 -0
  66. package/dist/chunk-M7NXUK55.js +199 -0
  67. package/dist/chunk-M7NXUK55.js.map +1 -0
  68. package/dist/chunk-MPZ3BPUI.js +374 -0
  69. package/dist/chunk-MPZ3BPUI.js.map +1 -0
  70. package/dist/chunk-OC6YSTDX.js +119 -0
  71. package/dist/chunk-OC6YSTDX.js.map +1 -0
  72. package/dist/chunk-RC6MEZB6.js +469 -0
  73. package/dist/chunk-RC6MEZB6.js.map +1 -0
  74. package/dist/chunk-RY3ZFII7.js +3440 -0
  75. package/dist/chunk-RY3ZFII7.js.map +1 -0
  76. package/dist/chunk-TAT6JU3X.js +167 -0
  77. package/dist/chunk-TAT6JU3X.js.map +1 -0
  78. package/dist/chunk-UDZIS2AQ.js +79 -0
  79. package/dist/chunk-UDZIS2AQ.js.map +1 -0
  80. package/dist/chunk-UPLBF4RZ.js +115 -0
  81. package/dist/chunk-UPLBF4RZ.js.map +1 -0
  82. package/dist/chunk-UWQTZMNI.js +154 -0
  83. package/dist/chunk-UWQTZMNI.js.map +1 -0
  84. package/dist/chunk-W4T7PGI2.js +346 -0
  85. package/dist/chunk-W4T7PGI2.js.map +1 -0
  86. package/dist/chunk-XTBKL5BI.js +111 -0
  87. package/dist/chunk-XTBKL5BI.js.map +1 -0
  88. package/dist/chunk-YIJY5DBV.js +399 -0
  89. package/dist/chunk-YIJY5DBV.js.map +1 -0
  90. package/dist/chunk-YUFNYN2H.js +242 -0
  91. package/dist/chunk-YUFNYN2H.js.map +1 -0
  92. package/dist/chunk-Z2PUCXTZ.js +94 -0
  93. package/dist/chunk-Z2PUCXTZ.js.map +1 -0
  94. package/dist/chunk-ZZJOFKAT.js +13 -0
  95. package/dist/chunk-ZZJOFKAT.js.map +1 -0
  96. package/dist/cli/index.js +3661 -0
  97. package/dist/cli/index.js.map +1 -0
  98. package/dist/config-WVMRUOCA.js +13 -0
  99. package/dist/config-WVMRUOCA.js.map +1 -0
  100. package/dist/context-loader-3ORBPMHJ.js +13 -0
  101. package/dist/context-loader-3ORBPMHJ.js.map +1 -0
  102. package/dist/conversation-QDEIDQPH.js +22 -0
  103. package/dist/conversation-QDEIDQPH.js.map +1 -0
  104. package/dist/cost-tracker-RS3W7SVY.js +24 -0
  105. package/dist/cost-tracker-RS3W7SVY.js.map +1 -0
  106. package/dist/delegate-VJCJLYEK.js +29 -0
  107. package/dist/delegate-VJCJLYEK.js.map +1 -0
  108. package/dist/emotional-state-VQVRA6ED.js +206 -0
  109. package/dist/emotional-state-VQVRA6ED.js.map +1 -0
  110. package/dist/env-discovery-2BLVMAIM.js +251 -0
  111. package/dist/env-discovery-2BLVMAIM.js.map +1 -0
  112. package/dist/export-6GCYHEHQ.js +165 -0
  113. package/dist/export-6GCYHEHQ.js.map +1 -0
  114. package/dist/graph-YUIPOSOO.js +14 -0
  115. package/dist/graph-YUIPOSOO.js.map +1 -0
  116. package/dist/harness-LCHA3DWP.js +10 -0
  117. package/dist/harness-LCHA3DWP.js.map +1 -0
  118. package/dist/harness-WE4SLCML.js +26 -0
  119. package/dist/harness-WE4SLCML.js.map +1 -0
  120. package/dist/health-NZ6WNIMV.js +23 -0
  121. package/dist/health-NZ6WNIMV.js.map +1 -0
  122. package/dist/index.d.ts +3612 -0
  123. package/dist/index.js +13501 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/indexer-LONANRRM.js +16 -0
  126. package/dist/indexer-LONANRRM.js.map +1 -0
  127. package/dist/instinct-learner-SRM72DHF.js +20 -0
  128. package/dist/instinct-learner-SRM72DHF.js.map +1 -0
  129. package/dist/intake-4M3HNU43.js +21 -0
  130. package/dist/intake-4M3HNU43.js.map +1 -0
  131. package/dist/intelligence-HJOCA4SJ.js +1081 -0
  132. package/dist/intelligence-HJOCA4SJ.js.map +1 -0
  133. package/dist/journal-WANJL3MI.js +24 -0
  134. package/dist/journal-WANJL3MI.js.map +1 -0
  135. package/dist/loader-C3TKIKZR.js +23 -0
  136. package/dist/loader-C3TKIKZR.js.map +1 -0
  137. package/dist/mcp-WTQJJZAO.js +15 -0
  138. package/dist/mcp-WTQJJZAO.js.map +1 -0
  139. package/dist/mcp-discovery-WPAQFL6S.js +377 -0
  140. package/dist/mcp-discovery-WPAQFL6S.js.map +1 -0
  141. package/dist/mcp-installer-6O2XXD3V.js +394 -0
  142. package/dist/mcp-installer-6O2XXD3V.js.map +1 -0
  143. package/dist/metrics-KXGNFAAB.js +20 -0
  144. package/dist/metrics-KXGNFAAB.js.map +1 -0
  145. package/dist/primitive-registry-I6VTIR4W.js +512 -0
  146. package/dist/primitive-registry-I6VTIR4W.js.map +1 -0
  147. package/dist/project-discovery-C4UMD7JI.js +246 -0
  148. package/dist/project-discovery-C4UMD7JI.js.map +1 -0
  149. package/dist/provider-LQHQX7Z7.js +26 -0
  150. package/dist/provider-LQHQX7Z7.js.map +1 -0
  151. package/dist/provider-SXPQZ74H.js +28 -0
  152. package/dist/provider-SXPQZ74H.js.map +1 -0
  153. package/dist/rate-limiter-RLRVM325.js +22 -0
  154. package/dist/rate-limiter-RLRVM325.js.map +1 -0
  155. package/dist/rule-engine-YGQ3RYZM.js +182 -0
  156. package/dist/rule-engine-YGQ3RYZM.js.map +1 -0
  157. package/dist/scaffold-A3VRRCBV.js +347 -0
  158. package/dist/scaffold-A3VRRCBV.js.map +1 -0
  159. package/dist/scheduler-XHHIVHRI.js +397 -0
  160. package/dist/scheduler-XHHIVHRI.js.map +1 -0
  161. package/dist/search-V3W5JMJG.js +75 -0
  162. package/dist/search-V3W5JMJG.js.map +1 -0
  163. package/dist/semantic-search-2DTOO5UX.js +241 -0
  164. package/dist/semantic-search-2DTOO5UX.js.map +1 -0
  165. package/dist/serve-DTQ3HENY.js +291 -0
  166. package/dist/serve-DTQ3HENY.js.map +1 -0
  167. package/dist/sessions-CZGVXKQE.js +21 -0
  168. package/dist/sessions-CZGVXKQE.js.map +1 -0
  169. package/dist/sources-RW5DT56F.js +32 -0
  170. package/dist/sources-RW5DT56F.js.map +1 -0
  171. package/dist/starter-packs-76YUVHEU.js +893 -0
  172. package/dist/starter-packs-76YUVHEU.js.map +1 -0
  173. package/dist/state-GMXILIHW.js +13 -0
  174. package/dist/state-GMXILIHW.js.map +1 -0
  175. package/dist/state-merge-NKO5FRBA.js +174 -0
  176. package/dist/state-merge-NKO5FRBA.js.map +1 -0
  177. package/dist/telemetry-UC6PBXC7.js +22 -0
  178. package/dist/telemetry-UC6PBXC7.js.map +1 -0
  179. package/dist/tool-executor-MJ7IG7PQ.js +28 -0
  180. package/dist/tool-executor-MJ7IG7PQ.js.map +1 -0
  181. package/dist/tools-DZ4KETET.js +20 -0
  182. package/dist/tools-DZ4KETET.js.map +1 -0
  183. package/dist/types-EW7AIB3R.js +18 -0
  184. package/dist/types-EW7AIB3R.js.map +1 -0
  185. package/dist/types-WGDLSPO6.js +16 -0
  186. package/dist/types-WGDLSPO6.js.map +1 -0
  187. package/dist/universal-installer-QGS4SJGX.js +578 -0
  188. package/dist/universal-installer-QGS4SJGX.js.map +1 -0
  189. package/dist/validator-7WXMDIHH.js +22 -0
  190. package/dist/validator-7WXMDIHH.js.map +1 -0
  191. package/dist/verification-gate-FYXUX6LH.js +246 -0
  192. package/dist/verification-gate-FYXUX6LH.js.map +1 -0
  193. package/dist/versioning-Z3XNE2Q2.js +271 -0
  194. package/dist/versioning-Z3XNE2Q2.js.map +1 -0
  195. package/dist/watcher-ISJC7YKL.js +109 -0
  196. package/dist/watcher-ISJC7YKL.js.map +1 -0
  197. package/dist/web-server-DD7ZOP46.js +28 -0
  198. package/dist/web-server-DD7ZOP46.js.map +1 -0
  199. package/package.json +76 -0
  200. package/sources.yaml +121 -0
  201. package/templates/assistant/CORE.md +24 -0
  202. package/templates/assistant/SYSTEM.md +24 -0
  203. package/templates/assistant/config.yaml +51 -0
  204. package/templates/base/CORE.md +17 -0
  205. package/templates/base/SYSTEM.md +24 -0
  206. package/templates/base/config.yaml +51 -0
  207. package/templates/claude-opus/config.yaml +51 -0
  208. package/templates/code-reviewer/CORE.md +25 -0
  209. package/templates/code-reviewer/SYSTEM.md +30 -0
  210. package/templates/code-reviewer/config.yaml +51 -0
  211. package/templates/gpt4/config.yaml +51 -0
  212. package/templates/local/config.yaml +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/scaffold.ts","../src/runtime/indexer.ts","../src/runtime/watcher.ts","../src/runtime/auto-processor.ts","../src/runtime/scheduler.ts","../src/runtime/delegate.ts","../src/runtime/metrics.ts","../src/runtime/journal.ts","../src/runtime/instinct-learner.ts","../src/runtime/intake.ts","../src/runtime/validator.ts","../src/runtime/conversation.ts","../src/runtime/search.ts","../src/runtime/export.ts","../src/runtime/graph.ts","../src/runtime/analytics.ts","../src/runtime/telemetry.ts","../src/runtime/mcp-discovery.ts","../src/runtime/mcp-installer.ts","../src/runtime/mcp-registry.ts","../src/runtime/env-discovery.ts","../src/runtime/project-discovery.ts","../node_modules/hono/dist/compose.js","../node_modules/hono/dist/request/constants.js","../node_modules/hono/dist/utils/body.js","../node_modules/hono/dist/utils/url.js","../node_modules/hono/dist/request.js","../node_modules/hono/dist/utils/html.js","../node_modules/hono/dist/context.js","../node_modules/hono/dist/router.js","../node_modules/hono/dist/utils/constants.js","../node_modules/hono/dist/hono-base.js","../node_modules/hono/dist/router/reg-exp-router/matcher.js","../node_modules/hono/dist/router/reg-exp-router/node.js","../node_modules/hono/dist/router/reg-exp-router/trie.js","../node_modules/hono/dist/router/reg-exp-router/router.js","../node_modules/hono/dist/router/smart-router/router.js","../node_modules/hono/dist/router/trie-router/node.js","../node_modules/hono/dist/router/trie-router/router.js","../node_modules/hono/dist/hono.js","../node_modules/hono/dist/middleware/cors/index.js","../node_modules/@hono/node-server/dist/index.mjs","../src/runtime/web-server.ts","../src/runtime/primitive-registry.ts","../src/runtime/starter-packs.ts","../src/runtime/intelligence.ts","../src/runtime/define-agent.ts","../src/runtime/rule-engine.ts","../src/runtime/verification-gate.ts","../src/runtime/agent-framework.ts","../src/runtime/state-merge.ts","../src/runtime/emotional-state.ts","../src/runtime/semantic-search.ts","../src/runtime/serve.ts","../src/runtime/sources.ts","../src/runtime/universal-installer.ts","../src/runtime/versioning.ts"],"sourcesContent":["import { mkdirSync, writeFileSync, readFileSync, readdirSync, existsSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { writeDefaultConfig } from '../core/config.js';\n\nconst DIRECTORIES = [\n 'rules',\n 'instincts',\n 'skills',\n 'playbooks',\n 'workflows',\n 'tools',\n 'agents',\n 'intake',\n 'memory/sessions',\n 'memory/journal',\n];\n\n/**\n * Resolve the package root directory by walking up from import.meta.url\n * until we find package.json. Works in both dev (src/) and prod (dist/).\n */\nfunction getPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n if (existsSync(join(dir, 'package.json'))) return dir;\n dir = dirname(dir);\n }\n // Fallback: assume 2 levels up from source\n return dirname(dirname(fileURLToPath(import.meta.url)));\n}\n\ninterface TemplateVars {\n agentName: string;\n purpose?: string;\n}\n\n/**\n * Apply template variables to a string.\n */\nfunction applyTemplate(content: string, vars: TemplateVars): string {\n const date = new Date().toISOString().split('T')[0];\n const defaultPurpose = `I am ${vars.agentName}, an autonomous AI agent. My purpose is to help my creator build, think, and ship.`;\n const purpose = vars.purpose\n ? `I am ${vars.agentName}. ${vars.purpose}`\n : defaultPurpose;\n return content\n .replace(/\\{\\{AGENT_NAME\\}\\}/g, vars.agentName)\n .replace(/\\{\\{PURPOSE\\}\\}/g, purpose)\n .replace(/\\{\\{DATE\\}\\}/g, date);\n}\n\n/**\n * Copy default primitives from defaults/ directory into the target harness.\n */\nfunction copyDefaults(targetDir: string, vars: TemplateVars): void {\n const defaultsDir = join(getPackageRoot(), 'defaults');\n if (!existsSync(defaultsDir)) return;\n\n const primitiveDirs = ['rules', 'instincts', 'skills', 'playbooks', 'agents', 'tools', 'workflows'];\n for (const dir of primitiveDirs) {\n const srcDir = join(defaultsDir, dir);\n if (!existsSync(srcDir)) continue;\n const files = readdirSync(srcDir).filter((f) => f.endsWith('.md'));\n for (const file of files) {\n const content = readFileSync(join(srcDir, file), 'utf-8');\n writeFileSync(join(targetDir, dir, file), applyTemplate(content, vars), 'utf-8');\n }\n }\n}\n\n/**\n * Load a template file and apply substitutions. Returns null if not found.\n */\nfunction loadTemplate(templateName: string, fileName: string, vars: TemplateVars): string | null {\n const templatePath = join(getPackageRoot(), 'templates', templateName, fileName);\n if (!existsSync(templatePath)) return null;\n return applyTemplate(readFileSync(templatePath, 'utf-8'), vars);\n}\n\nexport interface ScaffoldOptions {\n template?: string;\n /** Custom CORE.md content — overrides template */\n coreContent?: string;\n /** Agent purpose description (stored as comment in CORE.md when no LLM generation) */\n purpose?: string;\n}\n\nexport function scaffoldHarness(targetDir: string, agentName: string, options?: ScaffoldOptions): void {\n if (existsSync(targetDir)) {\n throw new Error(`Directory already exists: ${targetDir}`);\n }\n\n const template = options?.template ?? 'base';\n const vars: TemplateVars = { agentName, purpose: options?.purpose };\n\n // Create directory structure\n mkdirSync(targetDir, { recursive: true });\n for (const dir of DIRECTORIES) {\n mkdirSync(join(targetDir, dir), { recursive: true });\n }\n\n // --- CORE.md (custom > template > inline fallback) ---\n if (options?.coreContent) {\n writeFileSync(join(targetDir, 'CORE.md'), options.coreContent);\n } else {\n const templateContent = loadTemplate(template, 'CORE.md', vars);\n writeFileSync(\n join(targetDir, 'CORE.md'),\n templateContent ?? applyTemplate(`# {{AGENT_NAME}}\n\n## Purpose\n{{PURPOSE}}\n\n## Values\n- **Honesty**: I tell the truth, even when it's uncomfortable.\n- **Action**: I bias toward doing, not discussing.\n- **Autonomy**: I act independently within my boundaries.\n- **Growth**: I learn from every interaction.\n- **Protection**: I guard my creator's time, money, and reputation.\n\n## Ethics\n- I never deceive my creator or others.\n- I never take irreversible actions without confirmation.\n- I never expose secrets, credentials, or private information.\n- I escalate when uncertain rather than guessing.\n`, vars)\n );\n }\n\n // --- SYSTEM.md (from template, or inline fallback) ---\n const systemContent = loadTemplate(template, 'SYSTEM.md', vars);\n writeFileSync(\n join(targetDir, 'SYSTEM.md'),\n systemContent ?? `# System\n\nYou are ${vars.agentName}. This file defines how you boot and operate.\n\n## Boot Sequence\n1. Load CORE.md — your identity (never changes)\n2. Load state.md — where you left off\n3. Load memory/scratch.md — current working memory\n4. Load indexes — scan all primitive directories\n5. Load relevant files based on current task\n\n## File Ownership\n| Owner | Files | Can Modify |\n|-------|-------|------------|\n| Human | CORE.md, rules/*, config.yaml | Only human edits |\n| Agent | instincts/*, memory/sessions/*, state.md (goals) | During/after interactions |\n| Infrastructure | */_index.md, memory/journal/* | Auto-scripts only |\n\n## Context Loading Strategy\n- L0 (~5 tokens): One-line summary — decides relevance\n- L1 (~50-100 tokens): Paragraph — enough to work with\n- L2 (full body): Complete content — loaded only when actively needed\n- Always load CORE + state + scratch first\n- Load primitives at the appropriate level based on token budget\n`\n );\n\n // --- config.yaml (from template, or use writeDefaultConfig) ---\n const configContent = loadTemplate(template, 'config.yaml', vars);\n writeFileSync(join(targetDir, 'config.yaml'), configContent ?? writeDefaultConfig(targetDir, agentName));\n\n // --- state.md ---\n writeFileSync(\n join(targetDir, 'state.md'),\n `# Agent State\n\n## Mode\nidle\n\n## Goals\n\n## Active Workflows\n\n## Last Interaction\n${new Date().toISOString()}\n\n## Unfinished Business\n`\n );\n\n // --- memory/scratch.md ---\n writeFileSync(join(targetDir, 'memory', 'scratch.md'), '');\n\n // --- Copy default primitives from defaults/ directory ---\n copyDefaults(targetDir, vars);\n\n // --- README.md (the in-scaffold quickstart, the FIRST thing a non-coder reads) ---\n writeFileSync(\n join(targetDir, 'README.md'),\n `# ${agentName}\n\nYou just created an agent. The agent IS this folder — every file is part\nof its identity, behavior, knowledge, and memory.\n\n## Try these in order\n\n\\`\\`\\`bash\nharness run \"What can you do?\" # see what's loaded\nharness run \"Help me decide between two options: A or B\"\nharness run \"Plan a weekend project for me\" # watch it qualify before answering\n\\`\\`\\`\n\nUse it for a few days with varied prompts. Then:\n\n\\`\\`\\`bash\nharness journal # synthesize today's sessions and find patterns\nharness learn --install # promote learned patterns into instincts\n\\`\\`\\`\n\nThe agent gets measurably better the more you use it. Every interaction\nis journaled, patterns become instincts, and instincts change behavior\non the next run. **No retraining, no fine-tuning, no code.** You're\nediting markdown.\n\n## What's in this folder\n\n| File / dir | Owner | What it is |\n|---|---|---|\n| \\`CORE.md\\` | human | Identity. Who is this agent? Frozen. |\n| \\`SYSTEM.md\\` | human | Boot instructions. How does it operate? |\n| \\`config.yaml\\` | human | Model, runtime, MCP servers, budgets |\n| \\`state.md\\` | mixed | Live state: mode, goals, last interaction |\n| \\`rules/\\` | human | Hard boundaries the agent must respect |\n| \\`skills/\\` | mixed | Capabilities + how to think about using them |\n| \\`playbooks/\\` | mixed | Adaptive guidance for outcomes |\n| \\`instincts/\\` | agent | Reflexive behaviors learned from sessions |\n| \\`workflows/\\` | infra | Cron-driven automations |\n| \\`tools/\\` | extern | HTTP/API tool definitions |\n| \\`agents/\\` | extern | Sub-agent roster |\n| \\`memory/sessions/\\` | agent | Auto-captured interaction records |\n| \\`memory/journal/\\` | infra | Daily synthesized reflections |\n\nOpen any file and edit it. Save. Run \\`harness run \"...\"\\` again and the\nagent reads your change. That's the loop.\n\n## Going further\n\n\\`\\`\\`bash\nharness doctor # check scaffold health\nharness graph # see how primitives reference each other\nharness info # what's loaded in the context budget right now\nharness mcp discover # find MCP tools already installed on your machine\nharness mcp search <q> # browse the MCP registry for new tools\nharness install <url> # install a skill, agent, or rule from a URL\n\\`\\`\\`\n\nTools come from MCP servers — install one with \\`harness mcp install\\`.\n\n## When something feels off\n\n- \\`harness validate\\` — check the harness structure for errors\n- \\`harness doctor\\` — same, but auto-fix what it can\n- \\`harness contradictions\\` — check rules and instincts for conflicts\n- \\`harness dead-primitives\\` — find files you haven't used in a while\n\nThe agent journal in \\`memory/journal/\\` is the most interesting place\nto look — it's where the agent reflects on what you've been doing\ntogether. Read it once a week.\n`,\n );\n\n // --- .gitignore ---\n writeFileSync(\n join(targetDir, '.gitignore'),\n `memory/scratch.md\nmemory/context.jsonl\nmemory/context.md\nmemory/sessions/*\nmemory/journal/*\n!memory/sessions/.gitkeep\n!memory/journal/.gitkeep\n.env\n`\n );\n\n // Create .gitkeep files\n writeFileSync(join(targetDir, 'memory', 'sessions', '.gitkeep'), '');\n writeFileSync(join(targetDir, 'memory', 'journal', '.gitkeep'), '');\n}\n\n/**\n * Generate SYSTEM.md content from the actual directory structure of a harness.\n * Scans for primitives and reflects the real structure.\n */\nexport function generateSystemMd(harnessDir: string, agentName: string): string {\n const primitiveDirs = ['rules', 'instincts', 'skills', 'playbooks', 'workflows', 'tools', 'agents'];\n const sections: string[] = [];\n\n sections.push(`# System\\n`);\n sections.push(`You are ${agentName}. This file defines how you boot and operate.\\n`);\n\n // Boot sequence\n sections.push(`## Boot Sequence\n1. Load CORE.md — your identity (never changes)\n2. Load state.md — where you left off\n3. Load memory/scratch.md — current working memory\n4. Load indexes — scan all primitive directories\n5. Load relevant files based on current task\\n`);\n\n // Directory structure\n sections.push(`## Directory Structure\\n`);\n\n for (const dir of primitiveDirs) {\n const dirPath = join(harnessDir, dir);\n if (!existsSync(dirPath)) continue;\n\n const files = readdirSync(dirPath).filter((f) => f.endsWith('.md') && !f.startsWith('_'));\n if (files.length === 0) {\n sections.push(`- \\`${dir}/\\` — (empty)`);\n } else {\n sections.push(`- \\`${dir}/\\` — ${files.length} file(s): ${files.map((f) => f.replace('.md', '')).join(', ')}`);\n }\n }\n\n // Memory\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const journalDir = join(harnessDir, 'memory', 'journal');\n const sessionCount = existsSync(sessionsDir)\n ? readdirSync(sessionsDir).filter((f) => f.endsWith('.md')).length\n : 0;\n const journalCount = existsSync(journalDir)\n ? readdirSync(journalDir).filter((f) => f.endsWith('.md')).length\n : 0;\n\n sections.push(`- \\`memory/sessions/\\` — ${sessionCount} session(s)`);\n sections.push(`- \\`memory/journal/\\` — ${journalCount} entry/entries`);\n sections.push('');\n\n // File ownership\n sections.push(`## File Ownership\n| Owner | Files | Can Modify |\n|-------|-------|------------|\n| Human | CORE.md, rules/*, config.yaml | Only human edits |\n| Agent | instincts/*, memory/sessions/*, state.md (goals) | During/after interactions |\n| Infrastructure | */_index.md, memory/journal/* | Auto-scripts only |\\n`);\n\n // Context loading strategy\n sections.push(`## Context Loading Strategy\n- L0 (~5 tokens): One-line summary — decides relevance\n- L1 (~50-100 tokens): Paragraph — enough to work with\n- L2 (full body): Complete content — loaded only when actively needed\n- Always load CORE + state + scratch first\n- Load primitives at the appropriate level based on token budget\n`);\n\n return sections.join('\\n');\n}\n\n/**\n * Generate a rich CORE.md using an LLM, given an agent name and purpose description.\n * Returns the generated markdown content, or throws on failure.\n */\nexport async function generateCoreMd(\n agentName: string,\n purpose: string,\n options: { provider?: string; modelId?: string; apiKey?: string },\n): Promise<string> {\n try {\n const { generate, getModel } = await import('../llm/provider.js');\n const { HarnessConfigSchema } = await import('../core/types.js');\n\n const config = HarnessConfigSchema.parse({\n agent: { name: agentName, version: '0.1.0' },\n model: {\n provider: options.provider ?? 'openrouter',\n id: options.modelId ?? 'anthropic/claude-sonnet-4',\n },\n });\n\n const model = getModel(config, options.apiKey);\n const result = await generate({\n model,\n system: `You are a technical writer creating an identity document for an AI agent.\nThe document defines who the agent is, what it does, its values, and its ethical boundaries.\nWrite in first person from the agent's perspective. Be specific and practical, not generic.\nOutput ONLY the markdown content, no code fences.`,\n prompt: `Create a CORE.md identity document for an AI agent with:\n- Name: ${agentName}\n- Purpose: ${purpose}\n\nThe document should have these sections:\n# ${agentName}\n\n## Purpose\n(Detailed purpose based on the description — be specific to what this agent does)\n\n## Values\n(5-7 values tailored to this agent's purpose — not generic platitudes)\n\n## Ethics\n(4-6 ethical boundaries specific to this agent's domain)\n\n## Capabilities\n(3-5 key capabilities this agent should have based on its purpose)\n\n## Boundaries\n(3-5 things this agent should NOT do or areas where it should escalate)`,\n maxOutputTokens: 2000,\n maxRetries: 1,\n timeoutMs: 30000,\n });\n\n return result.text.trim();\n } catch (err: unknown) {\n if (err instanceof Error) throw err;\n throw new Error(String(err));\n }\n}\n\n/**\n * List available templates.\n */\nexport function listTemplates(): string[] {\n const templatesDir = join(getPackageRoot(), 'templates');\n if (!existsSync(templatesDir)) return [];\n return readdirSync(templatesDir).filter((f) => {\n try {\n return readdirSync(join(templatesDir, f)).length > 0;\n } catch {\n return false;\n }\n });\n}\n","import { writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory } from '../primitives/loader.js';\nimport { CORE_PRIMITIVE_DIRS, type IndexEntry } from '../core/types.js';\n\nexport function buildIndex(harnessDir: string, directory: string): IndexEntry[] {\n const dirPath = join(harnessDir, directory);\n if (!existsSync(dirPath)) return [];\n\n const docs = loadDirectory(dirPath);\n\n return docs.map((doc) => ({\n id: doc.frontmatter.id,\n path: doc.path,\n tags: doc.frontmatter.tags,\n l0: doc.l0,\n created: doc.frontmatter.created || '',\n status: doc.frontmatter.status,\n }));\n}\n\nexport interface IndexOptions {\n /** Max characters for L0 summary in index table. Defaults to 120. */\n summaryMaxLength?: number;\n}\n\nexport function writeIndexFile(harnessDir: string, directory: string, options?: IndexOptions): void {\n const entries = buildIndex(harnessDir, directory);\n const dirPath = join(harnessDir, directory);\n const maxLen = options?.summaryMaxLength ?? 120;\n\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true });\n }\n\n const lines: string[] = [\n `<!-- Auto-generated index for ${directory}. Do not edit manually. -->`,\n '',\n `# ${directory.charAt(0).toUpperCase() + directory.slice(1)} Index`,\n '',\n `| ID | Tags | Created | Status | Summary |`,\n `|----|------|---------|--------|---------|`,\n ];\n\n for (const entry of entries) {\n const tags = entry.tags.join(', ');\n const summary = entry.l0.length > maxLen ? entry.l0.slice(0, maxLen - 3) + '...' : entry.l0;\n lines.push(`| ${entry.id} | ${tags} | ${entry.created} | ${entry.status} | ${summary} |`);\n }\n\n lines.push('');\n\n writeFileSync(join(dirPath, '_index.md'), lines.join('\\n'), 'utf-8');\n}\n\nexport function rebuildAllIndexes(harnessDir: string, extraDirs?: string[]): void {\n const dirs: string[] = [...CORE_PRIMITIVE_DIRS];\n if (extraDirs) {\n for (const dir of extraDirs) {\n if (!dirs.includes(dir)) dirs.push(dir);\n }\n }\n for (const dir of dirs) {\n const dirPath = join(harnessDir, dir);\n if (existsSync(dirPath)) {\n writeIndexFile(harnessDir, dir);\n }\n }\n}\n","import { watch, type FSWatcher } from 'chokidar';\nimport { relative } from 'path';\nimport { writeIndexFile } from './indexer.js';\nimport { log } from '../core/logger.js';\nimport { CORE_PRIMITIVE_DIRS } from '../core/types.js';\nimport { autoProcessFile, type AutoProcessResult } from './auto-processor.js';\n\nexport interface WatcherOptions {\n harnessDir: string;\n extraDirs?: string[];\n onChange?: (path: string, event: string) => void;\n onIndexRebuild?: (directory: string) => void;\n onError?: (error: Error) => void;\n /** Also watch config.yaml for changes */\n watchConfig?: boolean;\n onConfigChange?: () => void;\n /** Enable auto-processing of primitives on save (default: false) */\n autoProcess?: boolean;\n /** Called after auto-processing a file */\n onAutoProcess?: (result: AutoProcessResult) => void;\n}\n\nexport function createWatcher(options: WatcherOptions): FSWatcher {\n const { harnessDir, extraDirs, onChange, onIndexRebuild, onError, watchConfig, onConfigChange, autoProcess, onAutoProcess } = options;\n\n const watchedDirs: string[] = [...CORE_PRIMITIVE_DIRS];\n if (extraDirs) {\n for (const dir of extraDirs) {\n if (!watchedDirs.includes(dir)) watchedDirs.push(dir);\n }\n }\n\n const patterns: string[] = watchedDirs.map((dir) => `${harnessDir}/${dir}/**/*.md`);\n\n // Optionally watch config.yaml for live reload\n if (watchConfig) {\n patterns.push(`${harnessDir}/config.yaml`);\n }\n\n const watcher = watch(patterns, {\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 500,\n pollInterval: 100,\n },\n });\n\n const handleChange = (filePath: string, event: string) => {\n // Skip index files\n if (filePath.includes('_index.md')) return;\n\n // Config change handler\n if (filePath.endsWith('config.yaml')) {\n log.info('Config file changed');\n try { onConfigChange?.(); } catch (e) {\n log.warn(`onConfigChange callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n return;\n }\n\n const rel = relative(harnessDir, filePath);\n const dir = rel.split('/')[0];\n\n // Auto-process primitives on add/change (before index rebuild so index sees fixes)\n if (autoProcess && event !== 'unlink' && filePath.endsWith('.md') && watchedDirs.includes(dir)) {\n try {\n const processResult = autoProcessFile(filePath, { harnessDir });\n if (processResult.modified) {\n log.info(`Auto-processed ${rel}: ${processResult.fixes.join(', ')}`);\n }\n try { onAutoProcess?.(processResult); } catch (e) {\n log.warn(`onAutoProcess callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n } catch (err) {\n log.warn(`Auto-process failed for ${rel}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n if (watchedDirs.includes(dir)) {\n // Rebuild index for this directory — wrapped for resilience\n try {\n writeIndexFile(harnessDir, dir);\n try { onIndexRebuild?.(dir); } catch (e) {\n log.warn(`onIndexRebuild callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n log.warn(`Failed to rebuild index for ${dir}: ${error.message}`);\n try { onError?.(error); } catch (e) {\n log.warn(`Watcher onError callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n try { onChange?.(filePath, event); } catch (e) {\n log.warn(`onChange callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n\n watcher.on('add', (path) => handleChange(path, 'add'));\n watcher.on('change', (path) => handleChange(path, 'change'));\n watcher.on('unlink', (path) => handleChange(path, 'unlink'));\n\n // Handle file system errors gracefully\n watcher.on('error', (err) => {\n const error = err instanceof Error ? err : new Error(String(err));\n log.warn(`File watcher error: ${error.message}`);\n try { onError?.(error); } catch (e) {\n log.warn(`Watcher onError callback failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n });\n\n return watcher;\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync } from 'fs';\nimport { basename, relative, join } from 'path';\nimport matter from 'gray-matter';\nimport { getPrimitiveDirs } from '../core/types.js';\n\n// --- Types ---\n\n/** Result of auto-processing a file */\nexport interface AutoProcessResult {\n /** Path that was processed */\n path: string;\n /** Whether any changes were made */\n modified: boolean;\n /** List of fixes applied */\n fixes: string[];\n /** Errors encountered */\n errors: string[];\n}\n\n/** Options for auto-processing */\nexport interface AutoProcessOptions {\n /** Harness directory (for inferring primitive type from path) */\n harnessDir: string;\n /** Whether to generate frontmatter (default: true) */\n generateFrontmatter?: boolean;\n /** Whether to generate L0/L1 summaries (default: true) */\n generateSummaries?: boolean;\n}\n\n// --- L0/L1 Regex ---\n\nconst L0_REGEX = /<!--\\s*L0:\\s*(.*?)\\s*-->/;\nconst L1_REGEX = /<!--\\s*L1:\\s*([\\s\\S]*?)\\s*-->/;\n\n// --- Frontmatter detection ---\n\n/**\n * Infer the primitive type from the file's directory relative to harness root.\n * e.g., \"rules/my-rule.md\" → \"rule\", \"skills/coding.md\" → \"skill\"\n */\nfunction inferTypeFromPath(filePath: string, harnessDir: string): string | null {\n const rel = relative(harnessDir, filePath);\n const topDir = rel.split('/')[0];\n\n const dirToType: Record<string, string> = {\n rules: 'rule',\n instincts: 'instinct',\n skills: 'skill',\n playbooks: 'playbook',\n workflows: 'workflow',\n tools: 'tool',\n agents: 'agent',\n };\n\n return dirToType[topDir] ?? null;\n}\n\n/**\n * Derive an id from a filename.\n * \"my-cool-rule.md\" → \"my-cool-rule\"\n */\nfunction deriveId(filePath: string): string {\n return basename(filePath, '.md').replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n}\n\n/**\n * Generate L0 summary from content (first heading or first non-empty line).\n */\nfunction generateL0(content: string): string | null {\n // Try first markdown heading\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n const text = headingMatch[1].trim();\n return text.length > 120 ? text.slice(0, 117) + '...' : text;\n }\n\n // Fall back to first non-empty, non-comment line\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0 && !trimmed.startsWith('<!--') && !trimmed.startsWith('---')) {\n return trimmed.length > 120 ? trimmed.slice(0, 117) + '...' : trimmed;\n }\n }\n\n return null;\n}\n\n/**\n * Generate L1 summary from content (first substantial paragraph).\n */\nfunction generateL1(content: string): string | null {\n const paragraphs = content.split(/\\n{2,}/).filter((p) => {\n const trimmed = p.trim();\n return (\n trimmed.length > 0 &&\n !trimmed.startsWith('<!--') &&\n !trimmed.startsWith('#') &&\n !trimmed.startsWith('---')\n );\n });\n\n if (paragraphs.length === 0) return null;\n\n const para = paragraphs[0].replace(/\\n/g, ' ').trim();\n return para.length > 300 ? para.slice(0, 297) + '...' : para;\n}\n\n// --- Main Auto-Processor ---\n\n/**\n * Auto-process a markdown primitive file:\n * 1. Generate frontmatter if missing (id from filename, created, status, tags, author)\n * 2. Generate L0 summary if missing (from heading or first line)\n * 3. Generate L1 summary if missing (from first paragraph)\n *\n * This is designed to run on file save (via watcher) to ensure\n * all primitives have valid structure without user intervention.\n */\nexport function autoProcessFile(\n filePath: string,\n options: AutoProcessOptions,\n): AutoProcessResult {\n const result: AutoProcessResult = {\n path: filePath,\n modified: false,\n fixes: [],\n errors: [],\n };\n\n if (!existsSync(filePath) || !filePath.endsWith('.md')) {\n return result;\n }\n\n // Skip index files and special files\n const filename = basename(filePath);\n if (filename.startsWith('_') || filename === 'CORE.md' || filename === 'SYSTEM.md' || filename === 'state.md') {\n return result;\n }\n\n let raw: string;\n try {\n raw = readFileSync(filePath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read: ${err instanceof Error ? err.message : String(err)}`);\n return result;\n }\n\n // Empty file — nothing to process\n if (raw.trim().length === 0) {\n return result;\n }\n\n const generateFrontmatter = options.generateFrontmatter !== false;\n const generateSummaries = options.generateSummaries !== false;\n\n let parsed: ReturnType<typeof matter>;\n try {\n parsed = matter(raw);\n } catch {\n // If frontmatter parsing fails, try to add basic frontmatter\n if (generateFrontmatter) {\n const id = deriveId(filePath);\n const type = inferTypeFromPath(filePath, options.harnessDir);\n const tags = type ? [type] : [];\n const data = {\n id,\n created: new Date().toISOString().split('T')[0],\n author: 'infrastructure' as const,\n status: 'active' as const,\n tags,\n };\n const newContent = matter.stringify(raw, data);\n writeFileSync(filePath, newContent, 'utf-8');\n result.modified = true;\n result.fixes.push(`Added frontmatter (id: ${id})`);\n }\n return result;\n }\n\n const data = { ...parsed.data } as Record<string, unknown>;\n let content = parsed.content;\n let modified = false;\n\n // --- Frontmatter fixes ---\n if (generateFrontmatter) {\n // Fix: Missing id\n if (!data.id) {\n data.id = deriveId(filePath);\n result.fixes.push(`Added id: \"${data.id}\"`);\n modified = true;\n }\n\n // Fix: Missing created\n if (!data.created) {\n data.created = new Date().toISOString().split('T')[0];\n result.fixes.push('Added created date');\n modified = true;\n }\n\n // Fix: Missing author — infrastructure for auto-generated\n if (!data.author) {\n data.author = 'human';\n result.fixes.push('Added author: \"human\"');\n modified = true;\n }\n\n // Fix: Missing status\n if (!data.status) {\n data.status = 'active';\n result.fixes.push('Added status: \"active\"');\n modified = true;\n }\n\n // Fix: Missing tags — add type tag from directory\n if (!Array.isArray(data.tags) || data.tags.length === 0) {\n const type = inferTypeFromPath(filePath, options.harnessDir);\n data.tags = type ? [type] : [];\n if (type) {\n result.fixes.push(`Added tag: \"${type}\"`);\n modified = true;\n }\n }\n }\n\n // --- L0/L1 summary fixes ---\n if (generateSummaries) {\n // Fix: Missing L0\n if (!L0_REGEX.test(content)) {\n const l0 = generateL0(content);\n if (l0) {\n content = `<!-- L0: ${l0} -->\\n${content}`;\n result.fixes.push('Generated L0 summary');\n modified = true;\n }\n }\n\n // Fix: Missing L1\n if (!L1_REGEX.test(content)) {\n const l1 = generateL1(content);\n if (l1) {\n const l0Pos = content.indexOf('-->');\n if (l0Pos !== -1) {\n const insertPos = l0Pos + 3;\n content = content.slice(0, insertPos) + `\\n<!-- L1: ${l1} -->` + content.slice(insertPos);\n } else {\n content = `<!-- L1: ${l1} -->\\n${content}`;\n }\n result.fixes.push('Generated L1 summary');\n modified = true;\n }\n }\n }\n\n // Write back if modified\n if (modified) {\n try {\n const newRaw = matter.stringify(content, data);\n writeFileSync(filePath, newRaw, 'utf-8');\n result.modified = true;\n } catch (err) {\n result.errors.push(`Failed to write: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return result;\n}\n\n/**\n * Auto-process all primitives in a harness directory.\n * Useful for batch processing after init or on first dev startup.\n */\nexport function autoProcessAll(\n harnessDir: string,\n options?: { generateFrontmatter?: boolean; generateSummaries?: boolean },\n): AutoProcessResult[] {\n const results: AutoProcessResult[] = [];\n const dirs = getPrimitiveDirs();\n\n for (const dir of dirs) {\n const dirPath = join(harnessDir, dir);\n if (!existsSync(dirPath)) continue;\n\n const files = readdirSync(dirPath).filter((f: string) => f.endsWith('.md') && !f.startsWith('_'));\n for (const file of files) {\n const filePath = join(dirPath, file);\n const result = autoProcessFile(filePath, {\n harnessDir,\n generateFrontmatter: options?.generateFrontmatter,\n generateSummaries: options?.generateSummaries,\n });\n if (result.modified || result.errors.length > 0) {\n results.push(result);\n }\n }\n }\n\n return results;\n}\n","import cron from 'node-cron';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory, parseHarnessDocument } from '../primitives/loader.js';\nimport { loadConfig } from '../core/config.js';\nimport { createHarness } from '../core/harness.js';\nimport { delegateTo } from './delegate.js';\nimport { archiveOldFiles } from './sessions.js';\nimport { recordRun } from './metrics.js';\nimport { log } from '../core/logger.js';\nimport { recordSuccess, recordFailure } from './health.js';\nimport { synthesizeJournal, listUnjournaled } from './journal.js';\nimport { learnFromSessions } from './instinct-learner.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Check if the current time falls within quiet hours.\n * Quiet hours wrap around midnight (e.g. start: 23, end: 6 means 23:00–05:59).\n * Returns true if the agent should be quiet (no scheduled workflows).\n */\nexport function isQuietHours(\n config: HarnessConfig,\n now?: Date,\n): boolean {\n const { start, end } = config.runtime.quiet_hours;\n const tz = config.runtime.timezone;\n\n // Get current hour in the configured timezone\n let hour: number;\n try {\n const formatter = new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n hour12: false,\n timeZone: tz,\n });\n hour = parseInt(formatter.format(now ?? new Date()), 10);\n } catch {\n // Fallback to local time if timezone is invalid\n hour = (now ?? new Date()).getHours();\n }\n\n if (start === end) return false; // No quiet hours configured\n if (start < end) {\n // Simple range (e.g., start: 8, end: 17 means 8:00–16:59)\n return hour >= start && hour < end;\n }\n // Wraps midnight (e.g., start: 23, end: 6 means 23:00–05:59)\n return hour >= start || hour < end;\n}\n\nexport interface ScheduledWorkflow {\n doc: HarnessDocument;\n cronExpression: string;\n task: ReturnType<typeof cron.schedule> | null;\n}\n\nexport interface SchedulerOptions {\n harnessDir: string;\n apiKey?: string;\n /** Enable daily auto-archival of expired sessions/journals (default: true) */\n autoArchival?: boolean;\n /** Cron expression for auto-archival (default: \"0 23 * * *\" = daily at 23:00) */\n archivalCron?: string;\n /** Enable auto-journal synthesis (cron string or true for default \"0 22 * * *\") */\n autoJournal?: boolean | string;\n /** Enable auto-learn after journal synthesis (default: false) */\n autoLearn?: boolean;\n onRun?: (workflowId: string, result: string) => void;\n onError?: (workflowId: string, error: Error) => void;\n onSchedule?: (workflowId: string, cron: string) => void;\n onSkipQuietHours?: (workflowId: string) => void;\n onArchival?: (sessionsArchived: number, journalsArchived: number) => void;\n onRetry?: (workflowId: string, attempt: number, maxRetries: number, error: Error) => void;\n onJournal?: (date: string, sessionsCount: number) => void;\n onLearn?: (installed: number, skipped: number) => void;\n}\n\nexport class Scheduler {\n private workflows: Map<string, ScheduledWorkflow> = new Map();\n private harnessDir: string;\n private apiKey?: string;\n private autoArchival: boolean;\n private archivalCron: string;\n private archivalTask: ReturnType<typeof cron.schedule> | null = null;\n private autoJournal: boolean | string;\n private autoLearn: boolean;\n private journalTask: ReturnType<typeof cron.schedule> | null = null;\n /** Tracks proactive executions: workflowId → timestamps of recent runs */\n private proactiveHistory: Map<string, number[]> = new Map();\n private onRun?: (workflowId: string, result: string) => void;\n private onError?: (workflowId: string, error: Error) => void;\n private onSchedule?: (workflowId: string, cron: string) => void;\n private onSkipQuietHours?: (workflowId: string) => void;\n private onArchival?: (sessionsArchived: number, journalsArchived: number) => void;\n private onRetry?: (workflowId: string, attempt: number, maxRetries: number, error: Error) => void;\n private onJournal?: (date: string, sessionsCount: number) => void;\n private onLearn?: (installed: number, skipped: number) => void;\n private running = false;\n\n constructor(options: SchedulerOptions) {\n this.harnessDir = options.harnessDir;\n this.apiKey = options.apiKey;\n this.autoArchival = options.autoArchival ?? true;\n this.archivalCron = options.archivalCron ?? '0 23 * * *';\n this.autoJournal = options.autoJournal ?? false;\n this.autoLearn = options.autoLearn ?? false;\n this.onRun = options.onRun;\n this.onError = options.onError;\n this.onSchedule = options.onSchedule;\n this.onSkipQuietHours = options.onSkipQuietHours;\n this.onArchival = options.onArchival;\n this.onRetry = options.onRetry;\n this.onJournal = options.onJournal;\n this.onLearn = options.onLearn;\n }\n\n start(): void {\n if (this.running) return;\n this.running = true;\n\n // Schedule auto-archival\n if (this.autoArchival && cron.validate(this.archivalCron)) {\n this.archivalTask = cron.schedule(this.archivalCron, () => {\n this.runArchival();\n });\n log.debug(`Auto-archival scheduled: ${this.archivalCron}`);\n }\n\n // Schedule auto-journal synthesis\n if (this.autoJournal) {\n const journalCron = typeof this.autoJournal === 'string' ? this.autoJournal : '0 22 * * *';\n if (cron.validate(journalCron)) {\n this.journalTask = cron.schedule(journalCron, () => {\n void this.runJournalSynthesis();\n });\n log.debug(`Auto-journal scheduled: ${journalCron}${this.autoLearn ? ' (with auto-learn)' : ''}`);\n } else {\n log.warn(`Invalid auto_journal cron: ${journalCron}`);\n }\n }\n\n // Load all workflows\n const workflowDir = join(this.harnessDir, 'workflows');\n if (!existsSync(workflowDir)) return;\n\n const docs = loadDirectory(workflowDir);\n\n for (const doc of docs) {\n const cronExpr = doc.frontmatter.schedule;\n if (!cronExpr) continue;\n\n if (!cron.validate(cronExpr)) {\n try { this.onError?.(doc.frontmatter.id, new Error(`Invalid cron expression: ${cronExpr}`)); } catch (e) {\n log.warn(`onError hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n continue;\n }\n\n const task = cron.schedule(cronExpr, async () => {\n await this.executeWorkflow(doc);\n });\n\n this.workflows.set(doc.frontmatter.id, { doc, cronExpression: cronExpr, task });\n try { this.onSchedule?.(doc.frontmatter.id, cronExpr); } catch (e) {\n log.warn(`onSchedule hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n stop(): void {\n if (!this.running) return;\n this.running = false;\n\n if (this.archivalTask) {\n this.archivalTask.stop();\n this.archivalTask = null;\n }\n\n if (this.journalTask) {\n this.journalTask.stop();\n this.journalTask = null;\n }\n\n for (const [, workflow] of this.workflows) {\n workflow.task?.stop();\n }\n this.workflows.clear();\n this.proactiveHistory.clear();\n }\n\n async executeWorkflow(doc: HarnessDocument): Promise<string> {\n const workflowId = doc.frontmatter.id;\n\n // Check quiet hours — skip scheduled workflows during quiet time\n const config = loadConfig(this.harnessDir);\n if (isQuietHours(config)) {\n log.debug(`Skipping workflow \"${workflowId}\" — quiet hours active`);\n try { this.onSkipQuietHours?.(workflowId); } catch (e) {\n log.warn(`onSkipQuietHours hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n return '';\n }\n\n // Check proactive cooldown — if workflow has proactive: true in frontmatter\n const isProactive = (doc.frontmatter as Record<string, unknown>)['proactive'] === true;\n if (isProactive && !this.checkProactiveCooldown(workflowId, config)) {\n log.debug(`Skipping proactive workflow \"${workflowId}\" — rate limited or in cooldown`);\n return '';\n }\n\n const maxRetries = doc.frontmatter.max_retries ?? 0;\n const baseDelay = doc.frontmatter.retry_delay_ms ?? 1000;\n let lastError: Error | null = null;\n const startTime = Date.now();\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // The workflow body IS the prompt — it describes what to do\n const prompt = `Execute this workflow:\\n\\n${doc.body}`;\n\n let resultText: string;\n let tokensUsed: number;\n\n // If workflow has a `with:` field, delegate to that sub-agent\n const delegateAgentId = doc.frontmatter.with;\n if (delegateAgentId) {\n log.debug(`Workflow \"${workflowId}\" delegating to agent \"${delegateAgentId}\"`);\n const delegateResult = await delegateTo({\n harnessDir: this.harnessDir,\n agentId: delegateAgentId,\n prompt,\n apiKey: this.apiKey,\n });\n resultText = delegateResult.text;\n tokensUsed = delegateResult.usage.totalTokens;\n } else {\n const agent = createHarness({\n dir: this.harnessDir,\n apiKey: this.apiKey,\n });\n const result = await agent.run(prompt);\n await agent.shutdown();\n resultText = result.text;\n tokensUsed = result.usage.totalTokens;\n }\n\n // Record success in health metrics\n recordSuccess(this.harnessDir);\n\n // Record successful run\n const endTime = Date.now();\n recordRun(this.harnessDir, {\n workflow_id: workflowId,\n started: new Date(startTime).toISOString(),\n ended: new Date(endTime).toISOString(),\n duration_ms: endTime - startTime,\n success: true,\n tokens_used: tokensUsed,\n attempt: attempt + 1,\n max_retries: maxRetries,\n });\n\n try { this.onRun?.(workflowId, resultText); } catch (e) {\n log.warn(`onRun hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n return resultText;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (attempt < maxRetries) {\n // Exponential backoff: baseDelay * 2^attempt\n const delay = baseDelay * Math.pow(2, attempt);\n log.debug(`Workflow \"${workflowId}\" failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying in ${delay}ms`);\n try { this.onRetry?.(workflowId, attempt + 1, maxRetries, lastError); } catch (e) {\n log.warn(`onRetry hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n await sleep(delay);\n }\n }\n }\n\n // Record failure in health metrics\n recordFailure(this.harnessDir, lastError?.message);\n\n // Record failed run\n const endTime = Date.now();\n recordRun(this.harnessDir, {\n workflow_id: workflowId,\n started: new Date(startTime).toISOString(),\n ended: new Date(endTime).toISOString(),\n duration_ms: endTime - startTime,\n success: false,\n error: lastError?.message,\n attempt: maxRetries + 1,\n max_retries: maxRetries,\n });\n\n // All attempts exhausted\n try { this.onError?.(workflowId, lastError!); } catch (e) {\n log.warn(`onError hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n throw lastError;\n }\n\n async runOnce(workflowId: string): Promise<string> {\n const workflowDir = join(this.harnessDir, 'workflows');\n const filePath = join(workflowDir, `${workflowId}.md`);\n\n if (!existsSync(filePath)) {\n throw new Error(`Workflow not found: ${workflowId}`);\n }\n\n const doc = parseHarnessDocument(filePath);\n return this.executeWorkflow(doc);\n }\n\n listScheduled(): Array<{ id: string; cron: string; path: string }> {\n return Array.from(this.workflows.entries()).map(([id, w]) => ({\n id,\n cron: w.cronExpression,\n path: w.doc.path,\n }));\n }\n\n /** Run archival of expired sessions/journals based on config retention policy. */\n runArchival(): void {\n try {\n const config = loadConfig(this.harnessDir);\n const result = archiveOldFiles(\n this.harnessDir,\n config.memory.session_retention_days,\n config.memory.journal_retention_days,\n );\n const total = result.sessionsArchived + result.journalsArchived;\n if (total > 0) {\n log.info(`Archived ${result.sessionsArchived} session(s), ${result.journalsArchived} journal(s)`);\n }\n try { this.onArchival?.(result.sessionsArchived, result.journalsArchived); } catch (e) {\n log.warn(`onArchival hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n log.error(`Archival failed: ${error.message}`);\n try { this.onError?.('__archival__', error); } catch (e) {\n log.warn(`onError hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n /**\n * Synthesize today's journal from unjournaled sessions.\n * Optionally runs instinct learning after synthesis if auto_learn is enabled.\n */\n async runJournalSynthesis(): Promise<void> {\n try {\n const unjournaled = listUnjournaled(this.harnessDir);\n if (unjournaled.length === 0) {\n log.debug('Auto-journal: no unjournaled sessions, skipping');\n return;\n }\n\n // Synthesize today's journal\n const today = new Date().toISOString().slice(0, 10);\n log.info(`Auto-journal: synthesizing ${unjournaled.length} unjournaled date(s)`);\n const entry = await synthesizeJournal(this.harnessDir, today, this.apiKey);\n\n try { this.onJournal?.(today, entry.sessions.length); } catch (e) {\n log.warn(`onJournal hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n\n // Auto-learn if enabled\n if (this.autoLearn) {\n log.info('Auto-learn: running instinct learning after journal synthesis');\n const learnResult = await learnFromSessions(this.harnessDir, true, this.apiKey);\n try { this.onLearn?.(learnResult.installed.length, learnResult.skipped.length); } catch (e) {\n log.warn(`onLearn hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n log.error(`Auto-journal failed: ${error.message}`);\n try { this.onError?.('__auto_journal__', error); } catch (e) {\n log.warn(`onError hook failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n /**\n * Check if a proactive workflow is allowed to run based on rate limits and cooldown.\n * Returns true if the workflow should proceed, false if it should be skipped.\n */\n checkProactiveCooldown(workflowId: string, config: HarnessConfig): boolean {\n const proactive = config.proactive;\n if (!proactive?.enabled) return true; // proactive not enabled — no restrictions\n\n const now = Date.now();\n const oneHourAgo = now - 3_600_000;\n const cooldownMs = (proactive.cooldown_minutes ?? 30) * 60_000;\n const maxPerHour = proactive.max_per_hour ?? 5;\n\n // Get or create history for this workflow\n let history = this.proactiveHistory.get(workflowId);\n if (!history) {\n history = [];\n this.proactiveHistory.set(workflowId, history);\n }\n\n // Prune entries older than 1 hour\n const recent = history.filter(ts => ts > oneHourAgo);\n this.proactiveHistory.set(workflowId, recent);\n\n // Check hourly rate limit\n if (recent.length >= maxPerHour) {\n log.debug(`Proactive cooldown: ${workflowId} hit max_per_hour (${maxPerHour})`);\n return false;\n }\n\n // Check cooldown since last run\n if (recent.length > 0) {\n const lastRun = recent[recent.length - 1];\n if (now - lastRun < cooldownMs) {\n log.debug(`Proactive cooldown: ${workflowId} within cooldown (${proactive.cooldown_minutes}min)`);\n return false;\n }\n }\n\n // Allowed — record this execution\n recent.push(now);\n return true;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory, estimateTokens, getAtLevel } from '../primitives/loader.js';\nimport { loadConfig } from '../core/config.js';\nimport { log } from '../core/logger.js';\nimport { getModel, generate, streamGenerateWithDetails } from '../llm/provider.js';\nimport { buildToolSet, type AIToolSet } from './tool-executor.js';\nimport { createSessionId, writeSession, type SessionRecord } from './sessions.js';\nimport type { HarnessDocument, HarnessConfig } from '../core/types.js';\n\n// --- Types ---\n\nexport interface DelegationResult {\n agentId: string;\n text: string;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n sessionId: string;\n}\n\nexport interface AgentInfo {\n id: string;\n l0: string;\n l1: string;\n path: string;\n tags: string[];\n status: string;\n}\n\n// --- Agent Discovery ---\n\n/**\n * Load all agent documents from the agents/ directory.\n */\nexport function loadAgentDocs(harnessDir: string): HarnessDocument[] {\n return loadDirectory(join(harnessDir, 'agents'));\n}\n\n/**\n * Find an agent document by its frontmatter id.\n * Falls back to filename match if id doesn't match.\n */\nexport function findAgent(harnessDir: string, agentId: string): HarnessDocument | undefined {\n const agents = loadAgentDocs(harnessDir);\n\n // Exact id match\n const byId = agents.find((a) => a.frontmatter.id === agentId);\n if (byId) return byId;\n\n // Try with \"agent-\" prefix\n const prefixed = agents.find((a) => a.frontmatter.id === `agent-${agentId}`);\n if (prefixed) return prefixed;\n\n // Filename match (e.g., \"evaluator\" matches \"evaluator.md\")\n const byFilename = agents.find((a) => {\n const filename = a.path.split('/').pop()?.replace('.md', '') || '';\n return filename === agentId || filename === `agent-${agentId}`;\n });\n\n return byFilename;\n}\n\n/**\n * List all available agents with summary info.\n */\nexport function listAgents(harnessDir: string): AgentInfo[] {\n return loadAgentDocs(harnessDir).map((doc) => ({\n id: doc.frontmatter.id,\n l0: doc.l0,\n l1: doc.l1,\n path: doc.path,\n tags: doc.frontmatter.tags,\n status: doc.frontmatter.status,\n }));\n}\n\n// --- System Prompt Assembly ---\n\n/**\n * Build a minimal system prompt for a delegated agent.\n * Sub-agents are stateless — they get:\n * 1. The agent's own body (L2) as primary instructions\n * 2. CORE.md identity (so they know who they serve)\n * 3. Active rules (at L1 level — compressed for efficiency)\n */\nexport function buildAgentPrompt(harnessDir: string, agentDoc: HarnessDocument, config: HarnessConfig): string {\n const sections: string[] = [];\n const maxTokens = config.model.max_tokens;\n const targetBudget = maxTokens * 0.10; // Sub-agents get 10% context budget\n let usedTokens = 0;\n\n // 1. Agent identity and instructions (always full L2)\n const agentBody = agentDoc.body;\n sections.push(`# AGENT: ${agentDoc.frontmatter.id}\\n\\n${agentBody}`);\n usedTokens += estimateTokens(agentBody);\n\n // 2. Primary agent identity from CORE.md (brief context)\n const corePath = join(harnessDir, 'CORE.md');\n if (existsSync(corePath)) {\n const core = readFileSync(corePath, 'utf-8');\n const coreTokens = estimateTokens(core);\n if (usedTokens + coreTokens <= targetBudget) {\n sections.push(`# PRIMARY AGENT CONTEXT\\n\\n${core}`);\n usedTokens += coreTokens;\n }\n }\n\n // 3. Rules (at appropriate disclosure level based on remaining budget)\n const rulesDir = join(harnessDir, 'rules');\n if (existsSync(rulesDir)) {\n const rules = loadDirectory(rulesDir);\n if (rules.length > 0) {\n const ruleDocs: string[] = [];\n for (const rule of rules) {\n // Estimate how much room is left\n const remaining = targetBudget - usedTokens;\n if (remaining < 50) break;\n\n // Try L1 first, fall back to L0\n let level: 0 | 1 | 2 = 1;\n let content = getAtLevel(rule, level);\n let tokens = estimateTokens(content);\n\n if (usedTokens + tokens > targetBudget) {\n level = 0;\n content = getAtLevel(rule, 0);\n tokens = estimateTokens(content);\n }\n\n if (usedTokens + tokens <= targetBudget) {\n ruleDocs.push(`### ${rule.frontmatter.id}\\n${content}`);\n usedTokens += tokens;\n }\n }\n if (ruleDocs.length > 0) {\n sections.push(`# RULES\\n\\n${ruleDocs.join('\\n\\n')}`);\n }\n }\n }\n\n return sections.join('\\n\\n---\\n\\n');\n}\n\n// --- Delegation ---\n\nexport interface DelegateOptions {\n harnessDir: string;\n agentId: string;\n prompt: string;\n apiKey?: string;\n modelOverride?: string;\n}\n\nfunction prepareDelegation(opts: DelegateOptions) {\n const { harnessDir, agentId, apiKey } = opts;\n\n if (!agentId || !agentId.trim()) {\n throw new Error('agentId is required');\n }\n if (!opts.prompt || !opts.prompt.trim()) {\n throw new Error('prompt cannot be empty');\n }\n\n const agentDoc = findAgent(harnessDir, agentId);\n if (!agentDoc) {\n const available = listAgents(harnessDir);\n const agentList = available.length > 0\n ? available.map((a) => ` - ${a.id}: ${a.l0}`).join('\\n')\n : ' (none)';\n throw new Error(\n `Agent \"${agentId}\" not found.\\n\\nAvailable agents:\\n${agentList}`\n );\n }\n\n const config = loadConfig(harnessDir, opts.modelOverride\n ? { model: { id: opts.modelOverride } }\n : undefined);\n\n const systemPrompt = buildAgentPrompt(harnessDir, agentDoc, config);\n const model = getModel(config, apiKey);\n\n // Load tools from the harness so sub-agents can use them\n const toolSet = buildToolSet(harnessDir);\n const hasTools = Object.keys(toolSet).length > 0;\n\n return { agentDoc, config, systemPrompt, model, toolSet, hasTools };\n}\n\n/**\n * Delegate a prompt to a sub-agent.\n * Sub-agents are stateless single-turn executors. They:\n * - Receive their own body as system prompt + rules + CORE.md\n * - Execute a single prompt\n * - Record a session (tagged with the agent id)\n * - Return the result\n *\n * They do NOT have persistent state, memory, or learning.\n */\nexport async function delegateTo(opts: DelegateOptions): Promise<DelegationResult> {\n const { harnessDir, prompt } = opts;\n const { agentDoc, config, systemPrompt, model, toolSet, hasTools } = prepareDelegation(opts);\n\n const sessionId = createSessionId();\n const started = new Date().toISOString();\n\n const result = await generate({\n model,\n system: systemPrompt,\n prompt,\n maxRetries: config.model.max_retries,\n timeoutMs: config.model.timeout_ms,\n ...(hasTools ? { tools: toolSet, maxToolSteps: 5 } : {}),\n });\n\n const ended = new Date().toISOString();\n\n const session: SessionRecord = {\n id: sessionId,\n started,\n ended,\n prompt,\n summary: result.text.slice(0, 200),\n tokens_used: result.usage.totalTokens,\n model_id: config.model.id,\n delegated_to: agentDoc.frontmatter.id,\n steps: result.steps,\n tool_calls: result.toolCalls.length > 0 ? result.toolCalls : undefined,\n };\n\n try {\n writeSession(harnessDir, session);\n } catch (err) {\n log.warn(`Failed to write delegation session ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n return {\n agentId: agentDoc.frontmatter.id,\n text: result.text,\n usage: result.usage,\n sessionId,\n };\n}\n\nexport interface DelegateStreamResult {\n agentId: string;\n sessionId: string;\n textStream: AsyncIterable<string>;\n}\n\n/**\n * Stream-delegate a prompt to a sub-agent.\n * Returns an async iterable of text chunks. Session is recorded after\n * the stream is fully consumed.\n */\nexport function delegateStream(opts: DelegateOptions): DelegateStreamResult {\n const { harnessDir, prompt } = opts;\n\n // prepareDelegation() is called eagerly so callers get immediate errors\n // (e.g., agent not found) before consuming the stream.\n const { agentDoc, config, systemPrompt, model, toolSet, hasTools } = prepareDelegation(opts);\n\n const sessionId = createSessionId();\n const started = new Date().toISOString();\n\n const result = streamGenerateWithDetails({\n model,\n system: systemPrompt,\n prompt,\n maxRetries: config.model.max_retries,\n timeoutMs: config.model.timeout_ms,\n ...(hasTools ? { tools: toolSet, maxToolSteps: 5 } : {}),\n });\n\n async function* wrappedStream(): AsyncIterable<string> {\n let fullText = '';\n try {\n for await (const chunk of result.textStream) {\n fullText += chunk;\n yield chunk;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n log.warn(`Delegation stream error for agent \"${agentDoc.frontmatter.id}\": ${error.message}`);\n throw error;\n }\n\n // Await post-stream metadata — wrapped so failures don't crash the generator\n let usage = { inputTokens: 0, outputTokens: 0, totalTokens: 0 };\n let steps = 1;\n let toolCalls: Array<{ toolName: string; args: Record<string, unknown>; result: unknown }> = [];\n try {\n [usage, steps, toolCalls] = await Promise.all([\n result.usage,\n result.steps,\n result.toolCalls,\n ]);\n } catch (err) {\n log.warn(`Failed to resolve delegation post-stream metadata: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n const ended = new Date().toISOString();\n\n const session: SessionRecord = {\n id: sessionId,\n started,\n ended,\n prompt,\n summary: fullText.slice(0, 200),\n tokens_used: usage.totalTokens,\n model_id: config.model.id,\n delegated_to: agentDoc.frontmatter.id,\n steps,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n };\n\n try {\n writeSession(harnessDir, session);\n } catch (err) {\n log.warn(`Failed to write delegation session ${sessionId}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n agentId: agentDoc.frontmatter.id,\n sessionId,\n textStream: wrappedStream(),\n };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\n\nexport interface WorkflowRun {\n workflow_id: string;\n started: string;\n ended: string;\n duration_ms: number;\n success: boolean;\n error?: string;\n tokens_used?: number;\n attempt: number;\n max_retries: number;\n}\n\nexport interface MetricsStore {\n runs: WorkflowRun[];\n updated: string;\n}\n\nexport interface WorkflowStats {\n workflow_id: string;\n total_runs: number;\n successes: number;\n failures: number;\n success_rate: number;\n avg_duration_ms: number;\n total_tokens: number;\n last_run: string;\n last_success: string | null;\n last_failure: string | null;\n}\n\nconst METRICS_FILE = 'metrics.json';\nconst MAX_RUNS = 1000;\n\nfunction getMetricsPath(harnessDir: string): string {\n return join(harnessDir, 'memory', METRICS_FILE);\n}\n\n/**\n * Load metrics from the metrics store file.\n * Returns an empty store if the file doesn't exist.\n */\nexport function loadMetrics(harnessDir: string): MetricsStore {\n const metricsPath = getMetricsPath(harnessDir);\n if (!existsSync(metricsPath)) {\n return { runs: [], updated: new Date().toISOString() };\n }\n\n try {\n const content = readFileSync(metricsPath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n if (\n typeof parsed === 'object' &&\n parsed !== null &&\n 'runs' in parsed &&\n Array.isArray((parsed as MetricsStore).runs)\n ) {\n return parsed as MetricsStore;\n }\n return { runs: [], updated: new Date().toISOString() };\n } catch {\n return { runs: [], updated: new Date().toISOString() };\n }\n}\n\n/**\n * Save metrics to the store file. Trims to MAX_RUNS most recent entries.\n */\nexport function saveMetrics(harnessDir: string, store: MetricsStore): void {\n const memoryDir = join(harnessDir, 'memory');\n if (!existsSync(memoryDir)) {\n mkdirSync(memoryDir, { recursive: true });\n }\n\n // Keep only the most recent runs\n if (store.runs.length > MAX_RUNS) {\n store.runs = store.runs.slice(store.runs.length - MAX_RUNS);\n }\n\n store.updated = new Date().toISOString();\n const metricsPath = getMetricsPath(harnessDir);\n writeFileSync(metricsPath, JSON.stringify(store, null, 2), 'utf-8');\n}\n\n/**\n * Record a workflow run in the metrics store.\n */\nexport function recordRun(harnessDir: string, run: WorkflowRun): void {\n const store = loadMetrics(harnessDir);\n store.runs.push(run);\n saveMetrics(harnessDir, store);\n}\n\n/**\n * Get aggregated stats for a specific workflow.\n */\nexport function getWorkflowStats(harnessDir: string, workflowId: string): WorkflowStats | null {\n const store = loadMetrics(harnessDir);\n const runs = store.runs.filter((r) => r.workflow_id === workflowId);\n\n if (runs.length === 0) return null;\n\n const successes = runs.filter((r) => r.success);\n const failures = runs.filter((r) => !r.success);\n const totalDuration = runs.reduce((sum, r) => sum + r.duration_ms, 0);\n const totalTokens = runs.reduce((sum, r) => sum + (r.tokens_used ?? 0), 0);\n\n const lastSuccess = successes.length > 0 ? successes[successes.length - 1].ended : null;\n const lastFailure = failures.length > 0 ? failures[failures.length - 1].ended : null;\n\n return {\n workflow_id: workflowId,\n total_runs: runs.length,\n successes: successes.length,\n failures: failures.length,\n success_rate: runs.length > 0 ? successes.length / runs.length : 0,\n avg_duration_ms: runs.length > 0 ? Math.round(totalDuration / runs.length) : 0,\n total_tokens: totalTokens,\n last_run: runs[runs.length - 1].ended,\n last_success: lastSuccess,\n last_failure: lastFailure,\n };\n}\n\n/**\n * Get aggregated stats for all workflows that have been run.\n */\nexport function getAllWorkflowStats(harnessDir: string): WorkflowStats[] {\n const store = loadMetrics(harnessDir);\n\n // Collect unique workflow IDs\n const workflowIds = new Set<string>();\n for (const run of store.runs) {\n workflowIds.add(run.workflow_id);\n }\n\n const stats: WorkflowStats[] = [];\n for (const id of workflowIds) {\n const s = getWorkflowStats(harnessDir, id);\n if (s) stats.push(s);\n }\n\n // Sort by most recent run\n stats.sort((a, b) => b.last_run.localeCompare(a.last_run));\n return stats;\n}\n\n/**\n * Clear all metrics for a specific workflow, or all workflows if no ID given.\n */\nexport function clearMetrics(harnessDir: string, workflowId?: string): number {\n const store = loadMetrics(harnessDir);\n const before = store.runs.length;\n\n if (workflowId) {\n store.runs = store.runs.filter((r) => r.workflow_id !== workflowId);\n } else {\n store.runs = [];\n }\n\n saveMetrics(harnessDir, store);\n return before - store.runs.length;\n}\n","import { readFileSync, writeFileSync, readdirSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { parseHarnessDocument } from '../primitives/loader.js';\nimport { getModel, generate } from '../llm/provider.js';\nimport { loadConfig } from '../core/config.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\n\nexport interface JournalSynthesis {\n summary: string;\n insights: string[];\n instinct_candidates: string[];\n knowledge_updates: string[];\n}\n\nexport interface JournalEntry {\n date: string;\n sessions: HarnessDocument[];\n synthesis: string;\n structured: JournalSynthesis;\n instinct_candidates: string[];\n tokens_used: number;\n}\n\nexport async function synthesizeJournal(\n harnessDir: string,\n date?: string,\n apiKey?: string,\n): Promise<JournalEntry> {\n const targetDate = date || new Date().toISOString().split('T')[0];\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const journalDir = join(harnessDir, 'memory', 'journal');\n\n if (!existsSync(journalDir)) {\n mkdirSync(journalDir, { recursive: true });\n }\n\n // Load sessions for this date\n const sessions: HarnessDocument[] = [];\n if (existsSync(sessionsDir)) {\n const files = readdirSync(sessionsDir).filter(\n (f) => f.endsWith('.md') && f.startsWith(targetDate),\n );\n\n for (const file of files) {\n try {\n const doc = parseHarnessDocument(join(sessionsDir, file));\n sessions.push(doc);\n } catch {\n // Skip unparseable\n }\n }\n }\n\n if (sessions.length === 0) {\n return {\n date: targetDate,\n sessions: [],\n synthesis: 'No sessions recorded today.',\n structured: {\n summary: 'No sessions recorded today.',\n insights: [],\n instinct_candidates: [],\n knowledge_updates: [],\n },\n instinct_candidates: [],\n tokens_used: 0,\n };\n }\n\n // Build synthesis prompt\n const sessionSummaries = sessions\n .map((s, i) => {\n const prompt = s.body.match(/## Prompt\\n([\\s\\S]*?)(?=\\n## |$)/)?.[1]?.trim() || '';\n const summary = s.body.match(/## Summary\\n([\\s\\S]*?)(?=\\n## |$)/)?.[1]?.trim() || '';\n return `Session ${i + 1}:\\n Prompt: ${prompt}\\n Summary: ${summary}`;\n })\n .join('\\n\\n');\n\n const synthesisPrompt = `You are synthesizing today's agent sessions into a structured journal entry.\n\nSessions from ${targetDate}:\n\n${sessionSummaries}\n\nWrite a journal entry with these EXACT sections (use the exact headers shown):\n\n## Summary\n2-3 sentence synthesis of what happened today.\n\n## Insights\nBullet points (starting with \"- \") of patterns, recurring themes, or notable observations.\n\n## Instinct Candidates\nBullet points (starting with \"- INSTINCT: \") of behaviors that should become reflexive rules.\n\n## Knowledge Updates\nBullet points (starting with \"- \") of new facts, corrections, or learnings that should be remembered.`;\n\n const config = loadConfig(harnessDir);\n const model = getModel(config, apiKey);\n\n const result = await generate({\n model,\n system: 'You are a reflective journal synthesizer. Be concise and insightful. Follow the output format exactly.',\n prompt: synthesisPrompt,\n });\n\n // Parse structured sections from the response\n const structured = parseJournalSynthesis(result.text);\n\n // Write journal entry\n const journalPath = join(journalDir, `${targetDate}.md`);\n const journalContent = `---\nid: journal-${targetDate}\ntags: [journal, daily]\ncreated: ${targetDate}\nupdated: ${new Date().toISOString().split('T')[0]}\nauthor: infrastructure\nstatus: active\n---\n\n<!-- L0: Journal for ${targetDate} — ${sessions.length} sessions synthesized. -->\n<!-- L1: ${structured.summary.slice(0, 200)} -->\n\n# Journal: ${targetDate}\n\n**Sessions:** ${sessions.length}\n**Tokens used:** ${result.usage.totalTokens}\n\n${result.text}\n`;\n\n writeFileSync(journalPath, journalContent, 'utf-8');\n\n return {\n date: targetDate,\n sessions,\n synthesis: result.text,\n structured,\n instinct_candidates: structured.instinct_candidates,\n tokens_used: result.usage.totalTokens,\n };\n}\n\n/**\n * Parse a journal synthesis response into structured sections.\n * Resilient to missing sections — returns empty arrays/strings for missing parts.\n */\nexport function parseJournalSynthesis(text: string): JournalSynthesis {\n const sectionRegex = /## (Summary|Insights|Instinct Candidates|Knowledge Updates|Patterns)\\n([\\s\\S]*?)(?=\\n## |\\n*$)/g;\n const sections = new Map<string, string>();\n\n for (const match of text.matchAll(sectionRegex)) {\n sections.set(match[1].toLowerCase(), match[2].trim());\n }\n\n const extractBullets = (content: string | undefined): string[] => {\n if (!content) return [];\n return content\n .split('\\n')\n .filter((line) => line.startsWith('- '))\n .map((line) => line.slice(2).trim())\n .filter(Boolean);\n };\n\n const summary = sections.get('summary') ?? '';\n\n // \"Insights\" or legacy \"Patterns\" section\n const insightsRaw = sections.get('insights') ?? sections.get('patterns') ?? '';\n const insights = extractBullets(insightsRaw);\n\n // Extract instinct candidates, stripping \"INSTINCT:\" prefix\n const instinctRaw = sections.get('instinct candidates') ?? '';\n const instinct_candidates = extractBullets(instinctRaw).map((line) =>\n line.replace(/^INSTINCT:\\s*/i, ''),\n );\n\n const knowledgeRaw = sections.get('knowledge updates') ?? '';\n const knowledge_updates = extractBullets(knowledgeRaw);\n\n return { summary, insights, instinct_candidates, knowledge_updates };\n}\n\n/**\n * Synthesize journals for a date range.\n * Processes each date that has sessions, skipping dates already journaled unless force is set.\n */\nexport async function synthesizeJournalRange(\n harnessDir: string,\n options: { from?: string; to?: string; all?: boolean; force?: boolean; apiKey?: string },\n): Promise<JournalEntry[]> {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n // Collect all unique dates from session filenames\n const files = readdirSync(sessionsDir).filter(\n (f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'),\n );\n const dateSet = new Set<string>();\n for (const file of files) {\n const match = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (match) dateSet.add(match[1]);\n }\n\n let dates = [...dateSet].sort();\n\n // Apply range filters\n if (!options.all) {\n const from = options.from;\n const to = options.to || new Date().toISOString().split('T')[0];\n if (from) {\n dates = dates.filter((d) => d >= from && d <= to);\n }\n }\n\n if (dates.length === 0) return [];\n\n // Check which dates already have journals\n const journalDir = join(harnessDir, 'memory', 'journal');\n const existingJournals = new Set<string>();\n if (existsSync(journalDir)) {\n for (const jf of readdirSync(journalDir)) {\n const match = jf.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (match) existingJournals.add(match[1]);\n }\n }\n\n const entries: JournalEntry[] = [];\n for (const date of dates) {\n if (!options.force && existingJournals.has(date)) continue;\n\n const entry = await synthesizeJournal(harnessDir, date, options.apiKey);\n entries.push(entry);\n }\n\n return entries;\n}\n\n/**\n * List dates that have sessions but no journal entry.\n */\nexport function listUnjournaled(harnessDir: string): string[] {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n const sessionDates = new Set<string>();\n for (const file of readdirSync(sessionsDir)) {\n if (!file.endsWith('.md') || file.startsWith('.')) continue;\n const match = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (match) sessionDates.add(match[1]);\n }\n\n const journalDir = join(harnessDir, 'memory', 'journal');\n const journalDates = new Set<string>();\n if (existsSync(journalDir)) {\n for (const file of readdirSync(journalDir)) {\n const match = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (match) journalDates.add(match[1]);\n }\n }\n\n return [...sessionDates].filter((d) => !journalDates.has(d)).sort();\n}\n\nexport function listJournals(harnessDir: string): string[] {\n const journalDir = join(harnessDir, 'memory', 'journal');\n if (!existsSync(journalDir)) return [];\n\n return readdirSync(journalDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.'))\n .sort()\n .reverse();\n}\n\nexport interface WeekSummary {\n weekStart: string;\n weekEnd: string;\n journalDates: string[];\n summary: string;\n allInsights: string[];\n allInstinctCandidates: string[];\n allKnowledgeUpdates: string[];\n filePath: string;\n}\n\n/**\n * Get the Monday of the ISO week for a given date string (YYYY-MM-DD).\n */\nfunction getWeekStart(dateStr: string): string {\n const date = new Date(dateStr + 'T12:00:00Z');\n const day = date.getUTCDay();\n const diff = day === 0 ? 6 : day - 1;\n date.setUTCDate(date.getUTCDate() - diff);\n return date.toISOString().split('T')[0];\n}\n\n/**\n * Get the Sunday of the ISO week for a given date string.\n */\nfunction getWeekEnd(dateStr: string): string {\n const start = new Date(getWeekStart(dateStr) + 'T12:00:00Z');\n start.setUTCDate(start.getUTCDate() + 6);\n return start.toISOString().split('T')[0];\n}\n\n/**\n * Compress daily journals into weekly roll-up summaries.\n * Groups journals by ISO week, aggregates structured sections, writes\n * weekly summary files to memory/journal/weekly/. Pure file-based — no LLM calls.\n *\n * Returns only weeks that were newly created (skips existing unless force=true).\n */\nexport function compressJournals(\n harnessDir: string,\n options?: { force?: boolean },\n): WeekSummary[] {\n const journalDir = join(harnessDir, 'memory', 'journal');\n if (!existsSync(journalDir)) return [];\n\n const weeklyDir = join(journalDir, 'weekly');\n if (!existsSync(weeklyDir)) {\n mkdirSync(weeklyDir, { recursive: true });\n }\n\n // Load all daily journals\n const files = readdirSync(journalDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'))\n .sort();\n\n // Group by week\n const weeks = new Map<string, string[]>();\n for (const file of files) {\n const dateMatch = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (!dateMatch) continue;\n const weekStart = getWeekStart(dateMatch[1]);\n if (!weeks.has(weekStart)) weeks.set(weekStart, []);\n weeks.get(weekStart)!.push(file);\n }\n\n const results: WeekSummary[] = [];\n\n for (const [weekStart, journalFiles] of weeks) {\n const weekEnd = getWeekEnd(weekStart);\n const weeklyFile = join(weeklyDir, `${weekStart}.md`);\n\n // Skip existing unless force\n if (!options?.force && existsSync(weeklyFile)) continue;\n\n // Only compress complete past weeks (not the current week)\n const today = new Date().toISOString().split('T')[0];\n const currentWeekStart = getWeekStart(today);\n if (weekStart === currentWeekStart) continue;\n\n // Aggregate structured sections from each journal\n const allSummaries: string[] = [];\n const allInsights: string[] = [];\n const allInstinctCandidates: string[] = [];\n const allKnowledgeUpdates: string[] = [];\n const journalDates: string[] = [];\n\n for (const file of journalFiles) {\n const content = readFileSync(join(journalDir, file), 'utf-8');\n const dateMatch = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) journalDates.push(dateMatch[1]);\n\n const structured = parseJournalSynthesis(content);\n if (structured.summary) allSummaries.push(`**${dateMatch?.[1]}:** ${structured.summary}`);\n allInsights.push(...structured.insights);\n allInstinctCandidates.push(...structured.instinct_candidates);\n allKnowledgeUpdates.push(...structured.knowledge_updates);\n }\n\n // Deduplicate\n const uniqueInsights = [...new Set(allInsights)];\n const uniqueInstincts = [...new Set(allInstinctCandidates)];\n const uniqueKnowledge = [...new Set(allKnowledgeUpdates)];\n\n const weekSummary = allSummaries.join('\\n\\n');\n const insightsBullets = uniqueInsights.map((i) => `- ${i}`).join('\\n');\n const instinctBullets = uniqueInstincts.map((i) => `- INSTINCT: ${i}`).join('\\n');\n const knowledgeBullets = uniqueKnowledge.map((k) => `- ${k}`).join('\\n');\n\n const weeklyContent = `---\nid: weekly-${weekStart}\ntags: [journal, weekly]\ncreated: ${weekStart}\nupdated: ${new Date().toISOString().split('T')[0]}\nauthor: infrastructure\nstatus: active\n---\n\n<!-- L0: Weekly journal roll-up ${weekStart} to ${weekEnd} (${journalDates.length} days) -->\n<!-- L1: ${allSummaries[0]?.slice(0, 200) || 'No summaries available'} -->\n\n# Weekly Journal: ${weekStart} to ${weekEnd}\n\n**Days journaled:** ${journalDates.length}\n**Dates:** ${journalDates.join(', ')}\n\n## Summary\n${weekSummary || 'No daily summaries available.'}\n\n## Insights\n${insightsBullets || '(none)'}\n\n## Instinct Candidates\n${instinctBullets || '(none)'}\n\n## Knowledge Updates\n${knowledgeBullets || '(none)'}\n`;\n\n writeFileSync(weeklyFile, weeklyContent, 'utf-8');\n\n results.push({\n weekStart,\n weekEnd,\n journalDates,\n summary: weekSummary,\n allInsights: uniqueInsights,\n allInstinctCandidates: uniqueInstincts,\n allKnowledgeUpdates: uniqueKnowledge,\n filePath: weeklyFile,\n });\n }\n\n return results;\n}\n","import { writeFileSync, readdirSync, readFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { getModel, generate } from '../llm/provider.js';\nimport { loadConfig } from '../core/config.js';\nimport { loadDirectory } from '../primitives/loader.js';\n\nexport interface InstinctCandidate {\n id: string;\n behavior: string;\n provenance: string;\n confidence: number;\n}\n\nexport interface LearnResult {\n candidates: InstinctCandidate[];\n installed: string[];\n skipped: string[];\n}\n\nexport async function proposeInstincts(\n harnessDir: string,\n fromJournalDate?: string,\n apiKey?: string,\n): Promise<InstinctCandidate[]> {\n const config = loadConfig(harnessDir);\n const model = getModel(config, apiKey);\n\n // Load existing instincts to avoid duplicates\n const existingInstincts = loadDirectory(join(harnessDir, 'instincts'));\n const existingBehaviors = existingInstincts.map((d) => d.l0 || d.frontmatter.id).join('\\n- ');\n\n // Load recent sessions or journal\n let recentContext = '';\n if (fromJournalDate) {\n const journalPath = join(harnessDir, 'memory', 'journal', `${fromJournalDate}.md`);\n if (existsSync(journalPath)) {\n recentContext = readFileSync(journalPath, 'utf-8');\n }\n }\n\n if (!recentContext) {\n // Fall back to recent sessions\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (existsSync(sessionsDir)) {\n const files = readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.'))\n .sort()\n .reverse()\n .slice(0, 10);\n\n recentContext = files\n .map((f) => readFileSync(join(sessionsDir, f), 'utf-8'))\n .join('\\n\\n---\\n\\n');\n }\n }\n\n if (!recentContext) {\n return [];\n }\n\n const prompt = `Analyze these recent agent interactions and identify potential instincts — reflexive behaviors that should become automatic.\n\nExisting instincts (DO NOT duplicate):\n- ${existingBehaviors || 'none yet'}\n\nRecent context:\n${recentContext.slice(0, 4000)}\n\nFor each candidate instinct, respond with EXACTLY this JSON format (one per line):\n{\"id\": \"kebab-case-id\", \"behavior\": \"One sentence describing the behavior\", \"provenance\": \"Where this was learned from\", \"confidence\": 0.8}\n\nOnly propose instincts with confidence >= 0.7. Only propose genuinely useful behaviors, not obvious ones.\nIf there are no good candidates, respond with: NONE`;\n\n const result = await generate({\n model,\n system: 'You are an instinct analyzer. Extract behavioral patterns. Be selective — only propose high-value instincts.',\n prompt,\n });\n\n const candidates: InstinctCandidate[] = [];\n\n for (const line of result.text.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed === 'NONE') break;\n if (!trimmed.startsWith('{')) continue;\n\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed.id && parsed.behavior && parsed.confidence >= 0.7) {\n candidates.push({\n id: parsed.id,\n behavior: parsed.behavior,\n provenance: parsed.provenance || 'auto-detected',\n confidence: parsed.confidence,\n });\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n return candidates;\n}\n\nexport function installInstinct(harnessDir: string, candidate: InstinctCandidate): string {\n const instinctsDir = join(harnessDir, 'instincts');\n if (!existsSync(instinctsDir)) {\n mkdirSync(instinctsDir, { recursive: true });\n }\n\n const today = new Date().toISOString().split('T')[0];\n const filePath = join(instinctsDir, `${candidate.id}.md`);\n\n // Don't overwrite existing\n if (existsSync(filePath)) {\n return '';\n }\n\n const content = `---\nid: ${candidate.id}\ntags: [instinct, auto-learned]\ncreated: ${today}\nupdated: ${today}\nauthor: agent\nstatus: active\nsource: auto-detected\n---\n\n<!-- L0: ${candidate.behavior} -->\n<!-- L1: ${candidate.behavior} Learned from: ${candidate.provenance}. Confidence: ${candidate.confidence}. -->\n\n# Instinct: ${candidate.id.split('-').map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}\n\n${candidate.behavior}\n\n**Provenance:** ${candidate.provenance}\n**Confidence:** ${candidate.confidence}\n**Auto-learned:** ${today}\n`;\n\n writeFileSync(filePath, content, 'utf-8');\n return filePath;\n}\n\nexport async function learnFromSessions(\n harnessDir: string,\n autoInstall: boolean = false,\n apiKey?: string,\n): Promise<LearnResult> {\n const candidates = await proposeInstincts(harnessDir, undefined, apiKey);\n const installed: string[] = [];\n const skipped: string[] = [];\n\n if (autoInstall) {\n for (const candidate of candidates) {\n const path = installInstinct(harnessDir, candidate);\n if (path) {\n installed.push(candidate.id);\n } else {\n skipped.push(candidate.id);\n }\n }\n }\n\n return { candidates, installed, skipped };\n}\n\nexport interface HarvestResult {\n candidates: InstinctCandidate[];\n installed: string[];\n skipped: string[];\n journalsScanned: number;\n}\n\n/**\n * Harvest instinct candidates from journal entries.\n * Scans all journals (or journals within a date range) for instinct candidate\n * sections, deduplicates against existing instincts, and optionally installs them.\n *\n * Unlike learnFromSessions which uses LLM calls, harvestInstincts is pure file-based —\n * it extracts already-identified candidates from journal synthesis output.\n */\nexport function harvestInstincts(\n harnessDir: string,\n options?: { from?: string; to?: string; install?: boolean },\n): HarvestResult {\n const journalDir = join(harnessDir, 'memory', 'journal');\n if (!existsSync(journalDir)) {\n return { candidates: [], installed: [], skipped: [], journalsScanned: 0 };\n }\n\n const files = readdirSync(journalDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'))\n .sort();\n\n // Filter by date range\n const from = options?.from;\n const to = options?.to;\n const filtered = files.filter((f) => {\n const dateMatch = f.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (!dateMatch) return false;\n const d = dateMatch[1];\n if (from && d < from) return false;\n if (to && d > to) return false;\n return true;\n });\n\n // Load existing instinct IDs to deduplicate\n const instinctsDir = join(harnessDir, 'instincts');\n const existingIds = new Set<string>();\n const existingBehaviors = new Set<string>();\n if (existsSync(instinctsDir)) {\n const docs = loadDirectory(instinctsDir);\n for (const doc of docs) {\n existingIds.add(doc.frontmatter.id);\n if (doc.l0) existingBehaviors.add(doc.l0.toLowerCase());\n }\n }\n\n const candidates: InstinctCandidate[] = [];\n const seenIds = new Set<string>();\n\n for (const file of filtered) {\n const content = readFileSync(join(journalDir, file), 'utf-8');\n\n // Extract instinct candidates section\n const sectionMatch = content.match(/## Instinct Candidates\\n([\\s\\S]*?)(?=\\n## |\\n*$)/);\n if (!sectionMatch) continue;\n\n const lines = sectionMatch[1]\n .split('\\n')\n .filter((l) => l.startsWith('- '))\n .map((l) => l.slice(2).trim().replace(/^INSTINCT:\\s*/i, ''));\n\n const dateMatch = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n const journalDate = dateMatch ? dateMatch[1] : 'unknown';\n\n for (const line of lines) {\n if (!line) continue;\n\n // Generate a kebab-case id from the behavior text\n const id = line\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 50)\n .replace(/-+$/, '');\n\n if (!id) continue;\n if (seenIds.has(id)) continue;\n if (existingIds.has(id)) continue;\n\n // Fuzzy dedup: skip if behavior text closely matches existing instinct L0\n const behaviorLower = line.toLowerCase();\n if (existingBehaviors.has(behaviorLower)) continue;\n\n seenIds.add(id);\n candidates.push({\n id,\n behavior: line,\n provenance: `journal:${journalDate}`,\n confidence: 0.75,\n });\n }\n }\n\n const installed: string[] = [];\n const skipped: string[] = [];\n\n if (options?.install) {\n for (const candidate of candidates) {\n const path = installInstinct(harnessDir, candidate);\n if (path) {\n installed.push(candidate.id);\n } else {\n skipped.push(candidate.id);\n }\n }\n }\n\n return { candidates, installed, skipped, journalsScanned: filtered.length };\n}\n","import { readFileSync, writeFileSync, unlinkSync, existsSync, mkdirSync, readdirSync, copyFileSync } from 'fs';\nimport { join, basename } from 'path';\nimport { tmpdir } from 'os';\nimport matter from 'gray-matter';\nimport { parseHarnessDocument, loadDirectory } from '../primitives/loader.js';\nimport { writeIndexFile } from './indexer.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessDocument } from '../core/types.js';\n\nexport interface EvalResult {\n valid: boolean;\n type: string | null;\n errors: string[];\n warnings: string[];\n fixes_applied: string[];\n}\n\nconst VALID_TYPES = ['rule', 'instinct', 'skill', 'playbook', 'workflow', 'tool', 'agent'];\nconst TYPE_DIRS: Record<string, string> = {\n rule: 'rules',\n instinct: 'instincts',\n skill: 'skills',\n playbook: 'playbooks',\n workflow: 'workflows',\n tool: 'tools',\n agent: 'agents',\n};\n\n/**\n * Auto-fix common issues in a capability file.\n * Reads the file, applies fixes, writes back, returns what was fixed.\n * Does NOT fix unfixable issues (e.g., empty body, unparseable YAML).\n */\nexport function fixCapability(filePath: string): EvalResult {\n const result: EvalResult = {\n valid: true,\n type: null,\n errors: [],\n warnings: [],\n fixes_applied: [],\n };\n\n if (!existsSync(filePath)) {\n result.valid = false;\n result.errors.push('File does not exist');\n return result;\n }\n\n if (!filePath.endsWith('.md')) {\n result.valid = false;\n result.errors.push('File must be a .md file');\n return result;\n }\n\n const raw = readFileSync(filePath, 'utf-8');\n let parsed: ReturnType<typeof matter>;\n try {\n parsed = matter(raw);\n } catch (err) {\n result.valid = false;\n result.errors.push(`Failed to parse frontmatter: ${err}`);\n return result;\n }\n\n const data = { ...parsed.data } as Record<string, unknown>;\n let content = parsed.content;\n let modified = false;\n\n // Fix 1: Missing id — derive from filename\n if (!data.id) {\n const name = basename(filePath, '.md');\n data.id = name.replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n result.fixes_applied.push(`Added id: \"${data.id}\" (from filename)`);\n modified = true;\n }\n\n // Fix 2: Missing status — set to active\n if (!data.status) {\n data.status = 'active';\n result.fixes_applied.push('Added status: \"active\"');\n modified = true;\n }\n\n // Fix 3: Missing type tag — infer from content and add tag\n const existingTags = Array.isArray(data.tags) ? (data.tags as string[]).map((t) => t.toLowerCase()) : [];\n let detectedType: string | null = null;\n for (const type of VALID_TYPES) {\n if (existingTags.includes(type)) {\n detectedType = type;\n break;\n }\n }\n if (!detectedType) {\n const bodyLower = content.toLowerCase();\n if (bodyLower.includes('# rule:')) detectedType = 'rule';\n else if (bodyLower.includes('# instinct:')) detectedType = 'instinct';\n else if (bodyLower.includes('# skill:')) detectedType = 'skill';\n else if (bodyLower.includes('# playbook:')) detectedType = 'playbook';\n else if (bodyLower.includes('# workflow:')) detectedType = 'workflow';\n else if (bodyLower.includes('# tool:')) detectedType = 'tool';\n else if (bodyLower.includes('# agent:')) detectedType = 'agent';\n }\n if (detectedType && !existingTags.includes(detectedType)) {\n if (!Array.isArray(data.tags)) data.tags = [];\n (data.tags as string[]).push(detectedType);\n result.fixes_applied.push(`Added tag: \"${detectedType}\"`);\n modified = true;\n }\n result.type = detectedType;\n\n // Fix 4: Missing L0 — generate from first heading or first non-empty line\n const l0Regex = /<!--\\s*L0:\\s*(.*?)\\s*-->/;\n if (!l0Regex.test(content)) {\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n const firstLine = content.split('\\n').find((line) => line.trim().length > 0);\n const summary = headingMatch ? headingMatch[1].trim() : (firstLine?.trim() ?? '');\n if (summary.length > 0) {\n const l0Text = summary.length > 120 ? summary.slice(0, 117) + '...' : summary;\n content = `<!-- L0: ${l0Text} -->\\n${content}`;\n result.fixes_applied.push('Generated L0 summary from content');\n modified = true;\n }\n }\n\n // Fix 5: Missing L1 — generate from first paragraph\n const l1Regex = /<!--\\s*L1:\\s*(.*?)\\s*-->/s;\n if (!l1Regex.test(content)) {\n const paragraphs = content.split(/\\n{2,}/).filter((p) => {\n const trimmed = p.trim();\n return trimmed.length > 0 && !trimmed.startsWith('<!--') && !trimmed.startsWith('#');\n });\n if (paragraphs.length > 0) {\n const para = paragraphs[0].replace(/\\n/g, ' ').trim();\n const l1Text = para.length > 300 ? para.slice(0, 297) + '...' : para;\n // Insert L1 after L0 if present, otherwise at the top\n const l0Pos = content.indexOf('-->');\n if (l0Pos !== -1) {\n const insertPos = l0Pos + 3;\n content = content.slice(0, insertPos) + `\\n<!-- L1: ${l1Text} -->` + content.slice(insertPos);\n } else {\n content = `<!-- L1: ${l1Text} -->\\n${content}`;\n }\n result.fixes_applied.push('Generated L1 summary from first paragraph');\n modified = true;\n }\n }\n\n // Write back if modified\n if (modified) {\n const newRaw = matter.stringify(content, data);\n writeFileSync(filePath, newRaw, 'utf-8');\n }\n\n // Re-evaluate after fixes\n if (!result.type) {\n result.errors.push(\n 'Cannot determine primitive type. Add a type tag or use a heading like \"# Skill: Name\"',\n );\n }\n\n // Check body has content\n const bodyContent = content.replace(l0Regex, '').replace(l1Regex, '').trim();\n if (!bodyContent || bodyContent.length < 20) {\n result.valid = false;\n result.errors.push('Body content is too short or empty');\n }\n\n if (result.errors.length > 0) {\n result.valid = false;\n }\n\n return result;\n}\n\n/**\n * Evaluate a capability file. If harnessDir is provided, also checks\n * dependency resolution (related: references, with: agent references).\n */\nexport function evaluateCapability(filePath: string, harnessDir?: string): EvalResult {\n const result: EvalResult = {\n valid: true,\n type: null,\n errors: [],\n warnings: [],\n fixes_applied: [],\n };\n\n // Step 1: Check file exists and is markdown\n if (!existsSync(filePath)) {\n result.valid = false;\n result.errors.push('File does not exist');\n return result;\n }\n\n if (!filePath.endsWith('.md')) {\n result.valid = false;\n result.errors.push('File must be a .md file');\n return result;\n }\n\n // Step 2: Try to parse\n let doc: HarnessDocument;\n try {\n doc = parseHarnessDocument(filePath);\n } catch (err) {\n result.valid = false;\n result.errors.push(`Failed to parse: ${err}`);\n return result;\n }\n\n // Step 3: Check frontmatter\n if (!doc.frontmatter.id) {\n result.valid = false;\n result.errors.push('Missing frontmatter field: id');\n }\n\n if (!doc.frontmatter.status) {\n result.warnings.push('Missing status field, defaulting to \"active\"');\n }\n\n // Step 4: Detect type from tags or directory hint\n const tags = doc.frontmatter.tags.map((t) => t.toLowerCase());\n for (const type of VALID_TYPES) {\n if (tags.includes(type)) {\n result.type = type;\n break;\n }\n }\n\n if (!result.type) {\n // Try to infer from content\n const bodyLower = doc.body.toLowerCase();\n if (bodyLower.includes('# rule:')) result.type = 'rule';\n else if (bodyLower.includes('# instinct:')) result.type = 'instinct';\n else if (bodyLower.includes('# skill:')) result.type = 'skill';\n else if (bodyLower.includes('# playbook:')) result.type = 'playbook';\n else if (bodyLower.includes('# workflow:')) result.type = 'workflow';\n else if (bodyLower.includes('# tool:')) result.type = 'tool';\n else if (bodyLower.includes('# agent:')) result.type = 'agent';\n }\n\n if (!result.type) {\n result.valid = false;\n result.errors.push(\n 'Cannot determine primitive type. Add a type tag (rule, instinct, skill, playbook, workflow, tool, agent) or use a heading like \"# Skill: Name\"',\n );\n }\n\n // Step 5: Check L0/L1\n if (!doc.l0) {\n result.warnings.push('Missing L0 summary (<!-- L0: ... -->). Recommended for context loading.');\n }\n if (!doc.l1) {\n result.warnings.push('Missing L1 summary (<!-- L1: ... -->). Recommended for context loading.');\n }\n\n // Step 6: Check body has content\n if (!doc.body || doc.body.length < 20) {\n result.valid = false;\n result.errors.push('Body content is too short or empty');\n }\n\n // Step 7: Dependency resolution (when harness dir is available)\n if (harnessDir) {\n resolveDependencies(doc, harnessDir, result);\n }\n\n return result;\n}\n\n/**\n * Check that referenced primitives (related: and with: fields) exist in the harness.\n */\nfunction resolveDependencies(doc: HarnessDocument, harnessDir: string, result: EvalResult): void {\n // Load all known primitive IDs for reference checking\n const primitiveDirs = getPrimitiveDirs();\n const knownIds = new Set<string>();\n for (const dir of primitiveDirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n const docs = loadDirectory(fullPath);\n for (const d of docs) {\n knownIds.add(d.frontmatter.id);\n }\n }\n\n // Check related: references\n const related = doc.frontmatter.related;\n if (related && related.length > 0) {\n for (const ref of related) {\n if (knownIds.has(ref)) continue;\n // Check if it's a file path\n const refPath = join(harnessDir, ref);\n if (existsSync(refPath) || existsSync(refPath + '.md')) continue;\n result.warnings.push(`Unresolved reference: \"${ref}\" (related: field) — not found in harness`);\n }\n }\n\n // Check with: agent reference (used for delegation)\n const withAgent = doc.frontmatter.with;\n if (withAgent) {\n // Check if agent exists in agents/ directory\n const agentsDir = join(harnessDir, 'agents');\n let agentFound = false;\n if (existsSync(agentsDir)) {\n const agentDocs = loadDirectory(agentsDir);\n agentFound = agentDocs.some(\n (d) => d.frontmatter.id === withAgent || basename(d.path, '.md') === withAgent,\n );\n }\n if (!agentFound) {\n result.warnings.push(`Unresolved agent: \"${withAgent}\" (with: field) — no matching agent found`);\n }\n }\n\n // Check schedule: cron expression validity (for workflows)\n const schedule = doc.frontmatter.schedule;\n if (schedule) {\n // Basic cron validation: should have 5-6 space-separated fields\n const fields = schedule.trim().split(/\\s+/);\n if (fields.length < 5 || fields.length > 6) {\n result.warnings.push(`Possibly invalid cron expression: \"${schedule}\" (expected 5-6 fields)`);\n }\n }\n}\n\nexport function installCapability(harnessDir: string, filePath: string): { installed: boolean; destination: string; evalResult: EvalResult } {\n const evalResult = evaluateCapability(filePath, harnessDir);\n\n if (!evalResult.valid || !evalResult.type) {\n return { installed: false, destination: '', evalResult };\n }\n\n const targetDir = join(harnessDir, TYPE_DIRS[evalResult.type]);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n const destination = join(targetDir, basename(filePath));\n\n // Copy file to target directory\n copyFileSync(filePath, destination);\n\n // Move original to .processed\n const processedDir = join(harnessDir, 'intake', '.processed');\n if (!existsSync(processedDir)) {\n mkdirSync(processedDir, { recursive: true });\n }\n copyFileSync(filePath, join(processedDir, basename(filePath)));\n\n // Rebuild index for target directory\n writeIndexFile(harnessDir, TYPE_DIRS[evalResult.type]);\n\n return { installed: true, destination, evalResult };\n}\n\nexport function processIntake(harnessDir: string): Array<{ file: string; result: ReturnType<typeof installCapability> }> {\n const intakeDir = join(harnessDir, 'intake');\n if (!existsSync(intakeDir)) return [];\n\n const files = readdirSync(intakeDir).filter(\n (f) => f.endsWith('.md') && !f.startsWith('.'),\n );\n\n const results: Array<{ file: string; result: ReturnType<typeof installCapability> }> = [];\n\n for (const file of files) {\n const filePath = join(intakeDir, file);\n const result = installCapability(harnessDir, filePath);\n results.push({ file, result });\n\n // Remove from intake if installed\n if (result.installed) {\n try {\n unlinkSync(filePath);\n } catch (_unlinkErr) {\n // Best-effort cleanup — file persists if removal fails\n }\n }\n }\n\n return results;\n}\n\nexport interface DownloadResult {\n downloaded: boolean;\n localPath: string;\n error?: string;\n}\n\n/**\n * Download a capability file from a URL to a temporary file.\n * Validates the URL (must be HTTPS) and content type (must look like markdown).\n * Returns a local temp path suitable for passing to installCapability().\n */\nexport async function downloadCapability(url: string): Promise<DownloadResult> {\n // Validate URL\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return { downloaded: false, localPath: '', error: `Invalid URL: ${url}` };\n }\n\n if (parsed.protocol !== 'https:') {\n return { downloaded: false, localPath: '', error: 'Only HTTPS URLs are supported' };\n }\n\n // Derive filename from URL path\n const urlPath = parsed.pathname;\n let filename = basename(urlPath);\n if (!filename.endsWith('.md')) {\n filename = filename + '.md';\n }\n\n try {\n const response = await fetch(url);\n\n if (!response.ok) {\n return { downloaded: false, localPath: '', error: `HTTP ${response.status}: ${response.statusText}` };\n }\n\n const body = await response.text();\n\n // Basic validation: must contain frontmatter delimiters or be valid markdown\n if (body.length === 0) {\n return { downloaded: false, localPath: '', error: 'Downloaded file is empty' };\n }\n\n // Max size: 1MB\n if (body.length > 1_048_576) {\n return { downloaded: false, localPath: '', error: 'File exceeds 1MB size limit' };\n }\n\n // Write to temp directory\n const tempDir = join(tmpdir(), 'harness-download');\n mkdirSync(tempDir, { recursive: true });\n const localPath = join(tempDir, filename);\n writeFileSync(localPath, body, 'utf-8');\n\n return { downloaded: true, localPath };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { downloaded: false, localPath: '', error: `Download failed: ${msg}` };\n }\n}\n","import { existsSync, readdirSync, mkdirSync } from 'fs';\nimport { join, relative } from 'path';\nimport { loadDirectoryWithErrors } from '../primitives/loader.js';\nimport { fixCapability } from './intake.js';\nimport { buildSystemPrompt } from './context-loader.js';\nimport { loadConfig } from '../core/config.js';\nimport { loadState } from './state.js';\nimport { validateMcpConfig } from './mcp.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\nimport type { ParseError } from '../primitives/loader.js';\n\nexport interface ValidationResult {\n ok: string[];\n warnings: string[];\n errors: string[];\n parseErrors: ParseError[];\n primitiveCounts: Map<string, number>;\n totalPrimitives: number;\n}\n\n/**\n * Comprehensive harness validation:\n * - Required/optional files\n * - Config validation\n * - State validation\n * - Primitive loading with parse error collection\n * - Cross-reference integrity (related: fields)\n * - Context budget check with warnings\n * - Memory directory structure\n * - API key presence\n */\nexport function validateHarness(dir: string): ValidationResult {\n const result: ValidationResult = {\n ok: [],\n warnings: [],\n errors: [],\n parseErrors: [],\n primitiveCounts: new Map(),\n totalPrimitives: 0,\n };\n\n // --- Required files ---\n const requiredFiles = ['CORE.md'];\n for (const file of requiredFiles) {\n if (existsSync(join(dir, file))) {\n result.ok.push(`${file} exists`);\n } else {\n result.errors.push(`Missing required file: ${file}`);\n }\n }\n\n const optionalFiles = ['SYSTEM.md', 'state.md', 'config.yaml'];\n for (const file of optionalFiles) {\n if (existsSync(join(dir, file))) {\n result.ok.push(`${file} exists`);\n } else {\n result.warnings.push(`Optional file missing: ${file}`);\n }\n }\n\n // --- Config validation ---\n let config: HarnessConfig | undefined;\n try {\n config = loadConfig(dir);\n result.ok.push(`Config valid (agent: ${config.agent.name}, model: ${config.model.id})`);\n } catch (err: unknown) {\n result.errors.push(`Config error: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // --- State validation ---\n try {\n const state = loadState(dir);\n result.ok.push(`State valid (mode: ${state.mode})`);\n } catch (err: unknown) {\n result.warnings.push(`State parse issue: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // --- Primitive loading + parse errors ---\n const primitiveDirs = getPrimitiveDirs(config);\n const allDocs: HarnessDocument[] = [];\n\n for (const primDir of primitiveDirs) {\n const fullPath = join(dir, primDir);\n if (!existsSync(fullPath)) {\n result.primitiveCounts.set(primDir, 0);\n continue;\n }\n\n const { docs, errors } = loadDirectoryWithErrors(fullPath);\n result.primitiveCounts.set(primDir, docs.length);\n result.totalPrimitives += docs.length;\n allDocs.push(...docs);\n\n if (errors.length > 0) {\n result.parseErrors.push(...errors);\n for (const pe of errors) {\n const relPath = relative(dir, pe.path);\n result.errors.push(`Parse error in ${relPath}: ${pe.error}`);\n }\n }\n\n if (docs.length > 0) {\n result.ok.push(`${primDir}/: ${docs.length} valid file(s)`);\n }\n }\n\n // --- Cross-reference integrity ---\n const knownIds = new Set(allDocs.map((d) => d.frontmatter.id));\n for (const doc of allDocs) {\n const related = doc.frontmatter.related;\n if (!related || related.length === 0) continue;\n\n for (const ref of related) {\n // Check if reference is a known primitive ID\n if (knownIds.has(ref)) continue;\n\n // Check if reference is a valid file path\n const refPath = join(dir, ref);\n if (existsSync(refPath)) continue;\n\n // Check if reference is a file path with .md extension\n if (existsSync(refPath + '.md')) continue;\n\n const docRel = relative(dir, doc.path);\n result.warnings.push(`Broken reference in ${docRel}: \"${ref}\" not found (related: field)`);\n }\n }\n\n // --- Missing L0/L1 warnings ---\n let missingL0 = 0;\n let missingL1 = 0;\n for (const doc of allDocs) {\n if (!doc.l0) missingL0++;\n if (!doc.l1) missingL1++;\n }\n if (missingL0 > 0) {\n result.warnings.push(`${missingL0} primitive(s) missing L0 summary`);\n }\n if (missingL1 > 0) {\n result.warnings.push(`${missingL1} primitive(s) missing L1 summary`);\n }\n\n // --- Context budget ---\n if (config) {\n try {\n const ctx = buildSystemPrompt(dir, config);\n const usagePercent = ((ctx.budget.used_tokens / ctx.budget.max_tokens) * 100).toFixed(1);\n result.ok.push(\n `Context budget: ${ctx.budget.used_tokens}/${ctx.budget.max_tokens} tokens (${usagePercent}%)`,\n );\n\n // Surface context-loader warnings\n for (const warning of ctx.warnings) {\n result.warnings.push(warning);\n }\n } catch (err) {\n if (process.env.DEBUG) console.error(`Validator config load: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // --- API key ---\n if (process.env.OPENROUTER_API_KEY || process.env.ANTHROPIC_API_KEY || process.env.OPENAI_API_KEY) {\n const keys: string[] = [];\n if (process.env.OPENROUTER_API_KEY) keys.push('OPENROUTER_API_KEY');\n if (process.env.ANTHROPIC_API_KEY) keys.push('ANTHROPIC_API_KEY');\n if (process.env.OPENAI_API_KEY) keys.push('OPENAI_API_KEY');\n result.ok.push(`API key(s) configured: ${keys.join(', ')}`);\n } else {\n result.warnings.push('No API key set (OPENROUTER_API_KEY, ANTHROPIC_API_KEY, or OPENAI_API_KEY)');\n }\n\n // --- MCP server validation ---\n if (config) {\n const servers = config.mcp?.servers ?? {};\n const serverCount = Object.keys(servers).length;\n if (serverCount > 0) {\n const mcpErrors = validateMcpConfig(config);\n const enabledCount = Object.values(servers).filter((s) => s.enabled !== false).length;\n\n if (mcpErrors.length === 0) {\n result.ok.push(`MCP: ${serverCount} server(s) configured (${enabledCount} enabled)`);\n } else {\n result.ok.push(`MCP: ${serverCount} server(s) configured (${enabledCount} enabled)`);\n for (const err of mcpErrors) {\n result.errors.push(`MCP server \"${err.server}\": ${err.error}`);\n }\n }\n }\n }\n\n // --- Memory directories ---\n const memoryDirs = ['memory', 'memory/sessions', 'memory/journal'];\n for (const memDir of memoryDirs) {\n if (!existsSync(join(dir, memDir))) {\n result.warnings.push(`Missing directory: ${memDir}/`);\n }\n }\n\n return result;\n}\n\nexport interface DoctorResult extends ValidationResult {\n fixes: string[];\n directoriesCreated: string[];\n}\n\n/**\n * Run validation then auto-fix all fixable issues:\n * - Fix primitives with missing id/status/L0/L1/tags\n * - Create missing memory directories\n */\nexport function doctorHarness(dir: string): DoctorResult {\n // Phase 1: Validate\n const validation = validateHarness(dir);\n const result: DoctorResult = {\n ...validation,\n fixes: [],\n directoriesCreated: [],\n };\n\n // Phase 2: Create missing directories\n const dirsToCreate = ['memory', 'memory/sessions', 'memory/journal', 'intake'];\n for (const d of dirsToCreate) {\n const fullPath = join(dir, d);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n result.directoriesCreated.push(d);\n result.fixes.push(`Created directory: ${d}/`);\n // Remove the warning about this missing dir\n result.warnings = result.warnings.filter((w) => !w.includes(`Missing directory: ${d}/`));\n }\n }\n\n // Phase 3: Auto-fix primitives with fixable issues\n const primitiveDirs = getPrimitiveDirs();\n for (const primDir of primitiveDirs) {\n const fullPath = join(dir, primDir);\n if (!existsSync(fullPath)) continue;\n\n let files: string[];\n try {\n files = readdirSync(fullPath).filter(\n (f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'),\n );\n } catch (_readErr) {\n continue;\n }\n\n for (const file of files) {\n const filePath = join(fullPath, file);\n const fixResult = fixCapability(filePath);\n\n if (fixResult.fixes_applied.length > 0) {\n const relPath = relative(dir, filePath);\n for (const fix of fixResult.fixes_applied) {\n result.fixes.push(`${relPath}: ${fix}`);\n }\n // Remove stale L0/L1 warnings since we just fixed them\n }\n }\n }\n\n // Recalculate L0/L1 warnings after fixes\n if (result.fixes.length > 0) {\n result.warnings = result.warnings.filter(\n (w) => !w.includes('missing L0') && !w.includes('missing L1'),\n );\n // Re-check L0/L1 counts\n let missingL0 = 0;\n let missingL1 = 0;\n for (const primDir of primitiveDirs) {\n const fullPath = join(dir, primDir);\n if (!existsSync(fullPath)) continue;\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n if (!doc.l0) missingL0++;\n if (!doc.l1) missingL1++;\n }\n }\n if (missingL0 > 0) {\n result.warnings.push(`${missingL0} primitive(s) still missing L0 summary`);\n }\n if (missingL1 > 0) {\n result.warnings.push(`${missingL1} primitive(s) still missing L1 summary`);\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { getModel, generateWithMessages, streamWithMessages } from '../llm/provider.js';\nimport { loadConfig } from '../core/config.js';\nimport { log } from '../core/logger.js';\nimport { buildSystemPrompt } from './context-loader.js';\nimport { estimateTokens } from '../primitives/loader.js';\nimport { createSessionId, writeSession, type SessionRecord } from './sessions.js';\nimport { withFileLockSync } from './file-lock.js';\nimport type { AIToolSet } from './tool-executor.js';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport type { HarnessConfig, ToolCallInfo } from '../core/types.js';\n\ninterface Message {\n role: 'user' | 'assistant';\n content: string;\n tokens: number;\n}\n\n/** Persisted context format — one JSON object per line */\ninterface PersistedMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\n// Reserve 50% of remaining context (after system prompt) for conversation history\nconst CONVERSATION_BUDGET_RATIO = 0.50;\n// Minimum messages to always keep (latest exchange)\nconst MIN_MESSAGES = 2;\n// Hard cap on message count regardless of tokens\nconst MAX_MESSAGES = 100;\n\nexport interface ConversationOptions {\n recordSessions?: boolean;\n /** AI SDK tools available during conversation */\n tools?: AIToolSet;\n /** Maximum tool-use roundtrips per message (default: 5) */\n maxToolSteps?: number;\n}\n\nexport interface ConversationSendResult {\n text: string;\n usage: { totalTokens: number };\n steps: number;\n toolCalls: ToolCallInfo[];\n}\n\nexport interface ConversationStreamResult {\n /** Async iterable of text chunks — consume with for-await */\n textStream: AsyncIterable<string>;\n /** Resolves after the stream is fully consumed with turn metadata */\n result: Promise<{ text: string; usage: { totalTokens: number }; steps: number; toolCalls: ToolCallInfo[] }>;\n}\n\nexport class Conversation {\n private messages: Message[] = [];\n private harnessDir: string;\n private apiKey?: string;\n private systemPrompt: string = '';\n private systemPromptTokens: number = 0;\n private maxContextTokens: number = 200000;\n private modelOverride?: string;\n private providerOverride?: string;\n private recordSessions: boolean = true;\n private tools: AIToolSet;\n private maxToolSteps: number;\n\n constructor(harnessDir: string, apiKey?: string, options?: ConversationOptions) {\n this.harnessDir = harnessDir;\n this.apiKey = apiKey;\n this.tools = options?.tools ?? {};\n this.maxToolSteps = options?.maxToolSteps ?? 5;\n if (options?.recordSessions !== undefined) {\n this.recordSessions = options.recordSessions;\n }\n }\n\n /** Update the tool set (e.g., after MCP servers connect) */\n setTools(tools: AIToolSet): void {\n this.tools = tools;\n }\n\n setModelOverride(modelId: string): void {\n if (!modelId || !modelId.trim()) {\n throw new Error('modelId cannot be empty');\n }\n this.modelOverride = modelId.trim();\n }\n\n setProviderOverride(provider: string): void {\n if (!provider || !provider.trim()) {\n throw new Error('provider cannot be empty');\n }\n this.providerOverride = provider.trim();\n }\n\n async init(): Promise<void> {\n const config = this.getConfig();\n const ctx = buildSystemPrompt(this.harnessDir, config);\n this.systemPrompt = ctx.systemPrompt;\n this.systemPromptTokens = ctx.budget.used_tokens;\n this.maxContextTokens = config.model.max_tokens;\n\n // Load persisted context — try JSON-lines first, fall back to legacy markdown\n const jsonlPath = join(this.harnessDir, 'memory', 'context.jsonl');\n const legacyPath = join(this.harnessDir, 'memory', 'context.md');\n\n if (existsSync(jsonlPath)) {\n const raw = readFileSync(jsonlPath, 'utf-8');\n this.messages = parseJsonlContext(raw);\n } else if (existsSync(legacyPath)) {\n const raw = readFileSync(legacyPath, 'utf-8');\n this.messages = parseLegacyContext(raw);\n // Migrate: save in new format immediately\n this.save();\n }\n }\n\n private getConfig(): HarnessConfig {\n const config = loadConfig(this.harnessDir);\n if (this.modelOverride || this.providerOverride) {\n return {\n ...config,\n model: {\n ...config.model,\n ...(this.modelOverride ? { id: this.modelOverride } : {}),\n ...(this.providerOverride ? { provider: this.providerOverride } : {}),\n },\n };\n }\n return config;\n }\n\n /**\n * Token budget available for conversation messages.\n * Allocates CONVERSATION_BUDGET_RATIO of (max_tokens - system_prompt) to messages.\n */\n private getMessageBudget(): number {\n const available = this.maxContextTokens - this.systemPromptTokens;\n return Math.floor(available * CONVERSATION_BUDGET_RATIO);\n }\n\n /**\n * Trim oldest messages until token budget is satisfied.\n * Always retains at least MIN_MESSAGES.\n */\n private trimToTokenBudget(): void {\n const budget = this.getMessageBudget();\n\n // Hard cap on count\n while (this.messages.length > MAX_MESSAGES) {\n this.messages.shift();\n }\n\n // Trim by token budget — drop oldest messages first\n let totalTokens = this.messages.reduce((sum, m) => sum + m.tokens, 0);\n while (totalTokens > budget && this.messages.length > MIN_MESSAGES) {\n const removed = this.messages.shift();\n if (removed) {\n totalTokens -= removed.tokens;\n }\n }\n }\n\n private toModelMessages(): ModelMessage[] {\n return this.messages.map((m): ModelMessage => ({\n role: m.role,\n content: m.content,\n }));\n }\n\n async send(userMessage: string): Promise<ConversationSendResult> {\n if (!userMessage || !userMessage.trim()) {\n throw new Error('Message cannot be empty');\n }\n\n this.messages.push({\n role: 'user',\n content: userMessage,\n tokens: estimateTokens(userMessage),\n });\n\n this.trimToTokenBudget();\n\n const config = this.getConfig();\n const model = getModel(config, this.apiKey);\n\n const started = new Date().toISOString();\n const hasTools = Object.keys(this.tools).length > 0;\n\n const result = await generateWithMessages({\n model,\n system: this.systemPrompt,\n messages: this.toModelMessages(),\n ...(hasTools ? { tools: this.tools, maxToolSteps: this.maxToolSteps } : {}),\n });\n\n this.messages.push({\n role: 'assistant',\n content: result.text,\n tokens: estimateTokens(result.text),\n });\n\n try {\n this.save();\n } catch (err) {\n log.warn(`Failed to save conversation context: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Record session for this chat turn\n if (this.recordSessions) {\n try {\n this.writeSessionRecord(\n config, userMessage, result.text,\n result.usage.totalTokens, started,\n result.steps, result.toolCalls,\n );\n } catch (err) {\n log.warn(`Failed to record chat session: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n text: result.text,\n usage: result.usage,\n steps: result.steps,\n toolCalls: result.toolCalls,\n };\n }\n\n sendStream(userMessage: string): ConversationStreamResult {\n if (!userMessage || !userMessage.trim()) {\n throw new Error('Message cannot be empty');\n }\n\n this.messages.push({\n role: 'user',\n content: userMessage,\n tokens: estimateTokens(userMessage),\n });\n\n this.trimToTokenBudget();\n\n const config = this.getConfig();\n const model = getModel(config, this.apiKey);\n const started = new Date().toISOString();\n const hasTools = Object.keys(this.tools).length > 0;\n\n const streamResult = streamWithMessages({\n model,\n system: this.systemPrompt,\n messages: this.toModelMessages(),\n ...(hasTools ? { tools: this.tools, maxToolSteps: this.maxToolSteps } : {}),\n });\n\n // Deferred result — resolves after stream is fully consumed\n let resolveResult: (r: ConversationStreamResult['result'] extends Promise<infer T> ? T : never) => void;\n const resultPromise = new Promise<ConversationStreamResult['result'] extends Promise<infer T> ? T : never>((res) => {\n resolveResult = res;\n });\n\n const self = this;\n\n async function* generateStream(): AsyncIterable<string> {\n let fullResponse = '';\n\n for await (const chunk of streamResult.textStream) {\n fullResponse += chunk;\n yield chunk;\n }\n\n self.messages.push({\n role: 'assistant',\n content: fullResponse,\n tokens: estimateTokens(fullResponse),\n });\n\n try {\n self.save();\n } catch (err) {\n log.warn(`Failed to save conversation context: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Resolve post-stream metadata\n let usageResult = { totalTokens: 0 };\n let stepsResult = 1;\n let toolCallsResult: ToolCallInfo[] = [];\n try {\n [usageResult, stepsResult, toolCallsResult] = await Promise.all([\n streamResult.usage,\n streamResult.steps,\n streamResult.toolCalls,\n ]);\n } catch (err) {\n log.warn(`Failed to resolve stream metadata: ${err instanceof Error ? err.message : String(err)}`);\n }\n\n // Record session for this chat turn\n if (self.recordSessions) {\n try {\n self.writeSessionRecord(\n config, userMessage, fullResponse,\n usageResult.totalTokens, started,\n stepsResult, toolCallsResult,\n );\n } catch (err) {\n log.warn(`Failed to record chat session: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n resolveResult({\n text: fullResponse,\n usage: usageResult,\n steps: stepsResult,\n toolCalls: toolCallsResult,\n });\n }\n\n return {\n textStream: generateStream(),\n result: resultPromise,\n };\n }\n\n save(): void {\n const memoryDir = join(this.harnessDir, 'memory');\n if (!existsSync(memoryDir)) {\n mkdirSync(memoryDir, { recursive: true });\n }\n\n // Write JSON-lines format — one JSON object per line, with file lock\n const jsonlPath = join(memoryDir, 'context.jsonl');\n const lines = this.messages.map((m): string =>\n JSON.stringify({ role: m.role, content: m.content } satisfies PersistedMessage)\n );\n withFileLockSync(this.harnessDir, 'context.jsonl', () => {\n writeFileSync(jsonlPath, lines.join('\\n'), 'utf-8');\n });\n }\n\n clear(): void {\n this.messages = [];\n const jsonlPath = join(this.harnessDir, 'memory', 'context.jsonl');\n const legacyPath = join(this.harnessDir, 'memory', 'context.md');\n if (existsSync(jsonlPath)) {\n writeFileSync(jsonlPath, '', 'utf-8');\n }\n if (existsSync(legacyPath)) {\n writeFileSync(legacyPath, '', 'utf-8');\n }\n }\n\n private writeSessionRecord(\n config: HarnessConfig,\n prompt: string,\n response: string,\n totalTokens: number,\n started: string,\n steps?: number,\n toolCalls?: ToolCallInfo[],\n ): void {\n const sessionId = createSessionId();\n const ended = new Date().toISOString();\n\n const session: SessionRecord = {\n id: sessionId,\n started,\n ended,\n prompt: prompt.slice(0, 500),\n summary: response.slice(0, 200),\n tokens_used: totalTokens,\n model_id: config.model.id,\n steps: steps ?? 1,\n tool_calls: toolCalls && toolCalls.length > 0 ? toolCalls : undefined,\n };\n\n writeSession(this.harnessDir, session);\n }\n\n getHistory(): Array<{ role: string; content: string }> {\n return this.messages.map((m) => ({ role: m.role, content: m.content }));\n }\n\n /** Token usage stats for the conversation window */\n getTokenStats(): { messageTokens: number; budget: number; messageCount: number } {\n const messageTokens = this.messages.reduce((sum, m) => sum + m.tokens, 0);\n return {\n messageTokens,\n budget: this.getMessageBudget(),\n messageCount: this.messages.length,\n };\n }\n}\n\n/**\n * Parse JSON-lines context format.\n * Each line is a JSON object: { role, content }\n */\nfunction parseJsonlContext(raw: string): Message[] {\n if (!raw.trim()) return [];\n\n const messages: Message[] = [];\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const parsed = JSON.parse(trimmed) as PersistedMessage;\n if (parsed.role && parsed.content) {\n messages.push({\n role: parsed.role,\n content: parsed.content,\n tokens: estimateTokens(parsed.content),\n });\n }\n } catch {\n // Skip malformed lines\n }\n }\n return messages;\n}\n\n/**\n * Parse legacy context.md format (### User / ### Assistant sections).\n * Kept for backward compatibility — auto-migrates on first load.\n */\nfunction parseLegacyContext(raw: string): Message[] {\n const messages: Message[] = [];\n const lines = raw.split('\\n');\n let currentRole: 'user' | 'assistant' | null = null;\n let currentContent: string[] = [];\n\n for (const line of lines) {\n if (line.startsWith('### User')) {\n if (currentRole && currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n messages.push({ role: currentRole, content, tokens: estimateTokens(content) });\n }\n currentRole = 'user';\n currentContent = [];\n } else if (line.startsWith('### Assistant')) {\n if (currentRole && currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n messages.push({ role: currentRole, content, tokens: estimateTokens(content) });\n }\n currentRole = 'assistant';\n currentContent = [];\n } else if (currentRole) {\n currentContent.push(line);\n }\n }\n if (currentRole && currentContent.length > 0) {\n const content = currentContent.join('\\n').trim();\n messages.push({ role: currentRole, content, tokens: estimateTokens(content) });\n }\n\n return messages;\n}\n\n// Export parsers for testing\nexport { parseJsonlContext, parseLegacyContext };\n","import { existsSync } from 'fs';\nimport { join, basename, relative } from 'path';\nimport { loadDirectory } from '../primitives/loader.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\n\nexport interface SearchOptions {\n /** Filter by tag (case-insensitive) */\n tag?: string;\n /** Filter by primitive type directory (e.g., \"rules\", \"skills\") */\n type?: string;\n /** Filter by status (e.g., \"active\", \"draft\") */\n status?: string;\n /** Filter by author (e.g., \"human\", \"agent\") */\n author?: string;\n}\n\nexport interface SearchResult {\n doc: HarnessDocument;\n directory: string;\n matchReason: string;\n}\n\n/**\n * Search primitives across all directories by query text and/or filters.\n * Query matches against: id, tags, L0 summary, L1 summary, body content.\n */\nexport function searchPrimitives(\n harnessDir: string,\n query?: string,\n options?: SearchOptions,\n config?: HarnessConfig,\n): SearchResult[] {\n const results: SearchResult[] = [];\n const dirs = getPrimitiveDirs(config);\n const queryLower = query?.toLowerCase();\n\n for (const dir of dirs) {\n // Filter by type directory if specified\n if (options?.type) {\n const typeNorm = options.type.toLowerCase();\n // Accept both singular (\"rule\") and plural (\"rules\")\n if (dir !== typeNorm && dir !== typeNorm + 's' && dir.replace(/s$/, '') !== typeNorm) {\n continue;\n }\n }\n\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const docs = loadDirectory(fullPath);\n\n for (const doc of docs) {\n // Filter by status\n if (options?.status && doc.frontmatter.status !== options.status) continue;\n\n // Filter by author\n if (options?.author && doc.frontmatter.author !== options.author) continue;\n\n // Filter by tag\n if (options?.tag) {\n const tagLower = options.tag.toLowerCase();\n const hasTag = doc.frontmatter.tags.some((t) => t.toLowerCase() === tagLower);\n if (!hasTag) continue;\n }\n\n // Match query text\n if (queryLower) {\n const matchReason = matchDocument(doc, queryLower);\n if (!matchReason) continue;\n results.push({ doc, directory: dir, matchReason });\n } else {\n // No query — return all matching filters\n results.push({ doc, directory: dir, matchReason: 'filter match' });\n }\n }\n }\n\n return results;\n}\n\nfunction matchDocument(doc: HarnessDocument, queryLower: string): string | null {\n // Check id\n if (doc.frontmatter.id.toLowerCase().includes(queryLower)) {\n return `id: ${doc.frontmatter.id}`;\n }\n\n // Check tags\n for (const tag of doc.frontmatter.tags) {\n if (tag.toLowerCase().includes(queryLower)) {\n return `tag: ${tag}`;\n }\n }\n\n // Check L0\n if (doc.l0.toLowerCase().includes(queryLower)) {\n return `L0: ${doc.l0.slice(0, 80)}`;\n }\n\n // Check L1\n if (doc.l1.toLowerCase().includes(queryLower)) {\n return `L1 match`;\n }\n\n // Check body content\n const bodyLower = doc.body.toLowerCase();\n const idx = bodyLower.indexOf(queryLower);\n if (idx !== -1) {\n const start = Math.max(0, idx - 20);\n const end = Math.min(bodyLower.length, idx + queryLower.length + 30);\n const snippet = doc.body.slice(start, end).replace(/\\n/g, ' ').trim();\n return `body: ...${snippet}...`;\n }\n\n return null;\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'fs';\nimport { join, relative } from 'path';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig } from '../core/types.js';\nimport { loadConfig } from '../core/config.js';\n\nexport interface ExportEntry {\n path: string;\n content: string;\n}\n\nexport interface HarnessBundle {\n version: string;\n exported_at: string;\n agent_name: string;\n entries: ExportEntry[];\n metadata: {\n primitives: number;\n sessions: number;\n journals: number;\n };\n}\n\nexport interface ImportResult {\n imported: number;\n skipped: number;\n errors: string[];\n files: string[];\n}\n\nexport interface ExportOptions {\n /** Include session files (default: true) */\n sessions?: boolean;\n /** Include journal files (default: true) */\n journals?: boolean;\n /** Include memory/metrics.json (default: true) */\n metrics?: boolean;\n /** Include state.md and scratch.md (default: true) */\n state?: boolean;\n}\n\n/**\n * Collect all .md files from a directory (non-recursive, excludes dotfiles and _index).\n */\nfunction collectMdFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'))\n .map((f) => join(dir, f));\n}\n\n/**\n * Export a harness to a portable JSON bundle.\n */\nexport function exportHarness(harnessDir: string, options?: ExportOptions): HarnessBundle {\n const includeSessions = options?.sessions ?? true;\n const includeJournals = options?.journals ?? true;\n const includeMetrics = options?.metrics ?? true;\n const includeState = options?.state ?? true;\n\n let config: HarnessConfig;\n try {\n config = loadConfig(harnessDir);\n } catch {\n config = { agent: { name: 'unknown', version: '0.0.0' } } as HarnessConfig;\n }\n\n const entries: ExportEntry[] = [];\n let primitiveCount = 0;\n let sessionCount = 0;\n let journalCount = 0;\n\n // Core files\n const coreFiles = ['CORE.md', 'SYSTEM.md', 'config.yaml'];\n for (const file of coreFiles) {\n const filePath = join(harnessDir, file);\n if (existsSync(filePath)) {\n entries.push({\n path: file,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n\n // State files\n if (includeState) {\n const stateFiles = ['state.md', join('memory', 'scratch.md')];\n for (const file of stateFiles) {\n const filePath = join(harnessDir, file);\n if (existsSync(filePath)) {\n entries.push({\n path: file,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n }\n\n // Primitive directories\n const dirs = getPrimitiveDirs(config);\n for (const dir of dirs) {\n const files = collectMdFiles(join(harnessDir, dir));\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n primitiveCount++;\n }\n }\n\n // Sessions\n if (includeSessions) {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const files = collectMdFiles(sessionsDir);\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n sessionCount++;\n }\n }\n\n // Journals\n if (includeJournals) {\n const journalDir = join(harnessDir, 'memory', 'journal');\n const files = collectMdFiles(journalDir);\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n journalCount++;\n }\n\n // Weekly journals too\n const weeklyDir = join(harnessDir, 'memory', 'journal', 'weekly');\n const weeklyFiles = collectMdFiles(weeklyDir);\n for (const file of weeklyFiles) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n journalCount++;\n }\n }\n\n // Metrics\n if (includeMetrics) {\n const metricsPath = join(harnessDir, 'memory', 'metrics.json');\n if (existsSync(metricsPath)) {\n entries.push({\n path: join('memory', 'metrics.json'),\n content: readFileSync(metricsPath, 'utf-8'),\n });\n }\n }\n\n return {\n version: '1.0',\n exported_at: new Date().toISOString(),\n agent_name: config.agent.name,\n entries,\n metadata: {\n primitives: primitiveCount,\n sessions: sessionCount,\n journals: journalCount,\n },\n };\n}\n\n/**\n * Write an export bundle to a JSON file.\n */\nexport function writeBundle(bundle: HarnessBundle, outputPath: string): void {\n writeFileSync(outputPath, JSON.stringify(bundle, null, 2), 'utf-8');\n}\n\n/**\n * Read a bundle from a JSON file.\n */\nexport function readBundle(bundlePath: string): HarnessBundle {\n if (!existsSync(bundlePath)) {\n throw new Error(`Bundle not found: ${bundlePath}`);\n }\n\n const content = readFileSync(bundlePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('version' in parsed) ||\n !('entries' in parsed) ||\n !Array.isArray((parsed as HarnessBundle).entries)\n ) {\n throw new Error('Invalid bundle format: missing version or entries');\n }\n\n return parsed as HarnessBundle;\n}\n\n/**\n * Import a bundle into a harness directory.\n * Only writes files that don't already exist (no overwrites by default).\n */\nexport function importBundle(\n harnessDir: string,\n bundle: HarnessBundle,\n options?: { overwrite?: boolean },\n): ImportResult {\n const overwrite = options?.overwrite ?? false;\n const result: ImportResult = {\n imported: 0,\n skipped: 0,\n errors: [],\n files: [],\n };\n\n for (const entry of bundle.entries) {\n const targetPath = join(harnessDir, entry.path);\n\n // Skip if exists and no overwrite\n if (existsSync(targetPath) && !overwrite) {\n result.skipped++;\n continue;\n }\n\n try {\n // Ensure parent directory exists\n const parentDir = join(targetPath, '..');\n mkdirSync(parentDir, { recursive: true });\n\n writeFileSync(targetPath, entry.content, 'utf-8');\n result.imported++;\n result.files.push(entry.path);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n result.errors.push(`${entry.path}: ${msg}`);\n }\n }\n\n return result;\n}\n","import { existsSync } from 'fs';\nimport { join, relative, dirname, basename } from 'path';\nimport { loadDirectoryWithErrors } from '../primitives/loader.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\n\nexport interface GraphNode {\n id: string;\n directory: string;\n path: string;\n tags: string[];\n status: string;\n l0: string;\n}\n\nexport interface GraphEdge {\n from: string;\n to: string;\n type: 'related' | 'with';\n}\n\nexport interface DependencyGraph {\n nodes: GraphNode[];\n edges: GraphEdge[];\n orphans: string[];\n clusters: string[][];\n}\n\nexport interface GraphStats {\n totalNodes: number;\n totalEdges: number;\n orphanCount: number;\n clusterCount: number;\n mostConnected: Array<{ id: string; connections: number }>;\n brokenRefs: Array<{ from: string; ref: string }>;\n}\n\n/**\n * Build a dependency graph from all primitives in the harness.\n * Analyzes `related:` and `with:` frontmatter fields to create edges.\n */\nexport function buildDependencyGraph(harnessDir: string, config?: HarnessConfig): DependencyGraph {\n const dirs = getPrimitiveDirs(config);\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const nodeIds = new Set<string>();\n\n // Load all primitives\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n const id = doc.frontmatter.id;\n nodeIds.add(id);\n nodes.push({\n id,\n directory: dir,\n path: relative(harnessDir, doc.path),\n tags: doc.frontmatter.tags,\n status: doc.frontmatter.status,\n l0: doc.l0,\n });\n }\n }\n\n // Build edges from related: and with: fields\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n const fromId = doc.frontmatter.id;\n\n // related: field edges\n for (const ref of doc.frontmatter.related) {\n const targetId = resolveRef(ref, nodeIds, harnessDir);\n if (targetId) {\n edges.push({ from: fromId, to: targetId, type: 'related' });\n }\n }\n\n // with: field edges (agent delegation reference)\n if (doc.frontmatter.with) {\n const withRef = doc.frontmatter.with;\n const targetId = resolveRef(withRef, nodeIds, harnessDir);\n if (targetId) {\n edges.push({ from: fromId, to: targetId, type: 'with' });\n }\n }\n }\n }\n\n // Find orphans (nodes with no edges in or out)\n const connected = new Set<string>();\n for (const edge of edges) {\n connected.add(edge.from);\n connected.add(edge.to);\n }\n const orphans = nodes\n .filter((n) => !connected.has(n.id))\n .map((n) => n.id);\n\n // Find clusters (connected components)\n const clusters = findClusters(nodes, edges);\n\n return { nodes, edges, orphans, clusters };\n}\n\n/**\n * Resolve a reference to a node ID. Handles:\n * - Direct ID match (e.g., \"tool-github\")\n * - Path-style refs (e.g., \"skills/code-review\" or \"agents/reviewer\")\n */\nfunction resolveRef(ref: string, knownIds: Set<string>, harnessDir: string): string | null {\n // Direct ID match\n if (knownIds.has(ref)) return ref;\n\n // Path-style ref: extract the filename part as potential ID\n if (ref.includes('/')) {\n const parts = ref.split('/');\n const filename = parts[parts.length - 1].replace(/\\.md$/, '');\n if (knownIds.has(filename)) return filename;\n\n // Try with directory prefix as part of ID\n const withDir = parts.join('-');\n if (knownIds.has(withDir)) return withDir;\n }\n\n return null;\n}\n\n/**\n * Find connected components using union-find.\n */\nfunction findClusters(nodes: GraphNode[], edges: GraphEdge[]): string[][] {\n const parent = new Map<string, string>();\n\n for (const node of nodes) {\n parent.set(node.id, node.id);\n }\n\n function find(id: string): string {\n let root = id;\n while (parent.get(root) !== root) {\n root = parent.get(root)!;\n }\n // Path compression\n let current = id;\n while (current !== root) {\n const next = parent.get(current)!;\n parent.set(current, root);\n current = next;\n }\n return root;\n }\n\n function union(a: string, b: string): void {\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) {\n parent.set(rootA, rootB);\n }\n }\n\n for (const edge of edges) {\n if (parent.has(edge.from) && parent.has(edge.to)) {\n union(edge.from, edge.to);\n }\n }\n\n // Group by root\n const groups = new Map<string, string[]>();\n for (const node of nodes) {\n const root = find(node.id);\n if (!groups.has(root)) {\n groups.set(root, []);\n }\n groups.get(root)!.push(node.id);\n }\n\n // Return only clusters with more than 1 member (singletons are orphans)\n return Array.from(groups.values())\n .filter((g) => g.length > 1)\n .sort((a, b) => b.length - a.length);\n}\n\n/**\n * Get statistics about the dependency graph.\n */\nexport function getGraphStats(harnessDir: string, config?: HarnessConfig): GraphStats {\n const graph = buildDependencyGraph(harnessDir, config);\n\n // Count connections per node\n const connectionCount = new Map<string, number>();\n for (const node of graph.nodes) {\n connectionCount.set(node.id, 0);\n }\n for (const edge of graph.edges) {\n connectionCount.set(edge.from, (connectionCount.get(edge.from) ?? 0) + 1);\n connectionCount.set(edge.to, (connectionCount.get(edge.to) ?? 0) + 1);\n }\n\n const mostConnected = Array.from(connectionCount.entries())\n .filter(([, count]) => count > 0)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([id, connections]) => ({ id, connections }));\n\n // Find broken references (references that didn't resolve to known IDs)\n const brokenRefs: Array<{ from: string; ref: string }> = [];\n const nodeIds = new Set(graph.nodes.map((n) => n.id));\n\n for (const dir of getPrimitiveDirs(config)) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n for (const ref of doc.frontmatter.related) {\n const resolved = resolveRef(ref, nodeIds, harnessDir);\n if (!resolved) {\n brokenRefs.push({ from: doc.frontmatter.id, ref });\n }\n }\n if (doc.frontmatter.with) {\n const resolved = resolveRef(doc.frontmatter.with, nodeIds, harnessDir);\n if (!resolved) {\n brokenRefs.push({ from: doc.frontmatter.id, ref: doc.frontmatter.with });\n }\n }\n }\n }\n\n return {\n totalNodes: graph.nodes.length,\n totalEdges: graph.edges.length,\n orphanCount: graph.orphans.length,\n clusterCount: graph.clusters.length,\n mostConnected,\n brokenRefs,\n };\n}\n","import { readFileSync, existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport matter from 'gray-matter';\n\nexport interface SessionData {\n id: string;\n date: string;\n started: string;\n ended: string;\n tokens: number;\n steps: number;\n durationMinutes: number;\n model?: string;\n delegatedTo?: string;\n}\n\nexport interface SessionAnalytics {\n totalSessions: number;\n totalTokens: number;\n totalDurationMinutes: number;\n avgTokensPerSession: number;\n avgDurationMinutes: number;\n sessionsPerDay: Map<string, number>;\n tokensPerDay: Map<string, number>;\n modelUsage: Map<string, number>;\n delegationCount: number;\n dateRange: { earliest: string; latest: string } | null;\n topDays: Array<{ date: string; sessions: number; tokens: number }>;\n}\n\n/**\n * Parse a session markdown file to extract structured data.\n */\nfunction parseSessionFile(filePath: string): SessionData | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const { data, content: body } = matter(content);\n\n const id = typeof data.id === 'string' ? data.id : '';\n const created = typeof data.created === 'string'\n ? data.created\n : data.created instanceof Date\n ? data.created.toISOString()\n : '';\n const updated = typeof data.updated === 'string'\n ? data.updated\n : data.updated instanceof Date\n ? data.updated.toISOString()\n : '';\n const durationMinutes = typeof data.duration_minutes === 'number' ? data.duration_minutes : 0;\n\n // Extract date from id (YYYY-MM-DD-xxxxxxxx format)\n const dateMatch = id.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n const date = dateMatch ? dateMatch[1] : '';\n\n // Extract tokens and steps from body\n const tokensMatch = body.match(/\\*\\*Tokens:\\*\\*\\s*(\\d+)/);\n const stepsMatch = body.match(/\\*\\*Steps:\\*\\*\\s*(\\d+)/);\n const modelMatch = body.match(/\\*\\*Model:\\*\\*\\s*(.+)/);\n const delegateMatch = body.match(/\\*\\*Delegated to:\\*\\*\\s*(.+)/);\n\n const tokens = tokensMatch ? parseInt(tokensMatch[1], 10) : 0;\n const steps = stepsMatch ? parseInt(stepsMatch[1], 10) : 0;\n const model = modelMatch ? modelMatch[1].trim() : undefined;\n const delegatedTo = delegateMatch ? delegateMatch[1].trim() : undefined;\n\n return {\n id,\n date,\n started: created,\n ended: updated,\n tokens,\n steps,\n durationMinutes,\n model,\n delegatedTo,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Load all sessions and compute analytics.\n */\nexport function getSessionAnalytics(harnessDir: string): SessionAnalytics {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const sessions: SessionData[] = [];\n\n if (existsSync(sessionsDir)) {\n const files = readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'));\n\n for (const file of files) {\n const data = parseSessionFile(join(sessionsDir, file));\n if (data) sessions.push(data);\n }\n }\n\n const sessionsPerDay = new Map<string, number>();\n const tokensPerDay = new Map<string, number>();\n const modelUsage = new Map<string, number>();\n let totalTokens = 0;\n let totalDurationMinutes = 0;\n let delegationCount = 0;\n let earliest = '';\n let latest = '';\n\n for (const session of sessions) {\n totalTokens += session.tokens;\n totalDurationMinutes += session.durationMinutes;\n\n if (session.delegatedTo) delegationCount++;\n\n if (session.date) {\n sessionsPerDay.set(session.date, (sessionsPerDay.get(session.date) ?? 0) + 1);\n tokensPerDay.set(session.date, (tokensPerDay.get(session.date) ?? 0) + session.tokens);\n\n if (!earliest || session.date < earliest) earliest = session.date;\n if (!latest || session.date > latest) latest = session.date;\n }\n\n if (session.model) {\n modelUsage.set(session.model, (modelUsage.get(session.model) ?? 0) + 1);\n }\n }\n\n // Top days by session count\n const topDays = Array.from(sessionsPerDay.entries())\n .map(([date, count]) => ({\n date,\n sessions: count,\n tokens: tokensPerDay.get(date) ?? 0,\n }))\n .sort((a, b) => b.sessions - a.sessions || b.tokens - a.tokens)\n .slice(0, 7);\n\n return {\n totalSessions: sessions.length,\n totalTokens,\n totalDurationMinutes,\n avgTokensPerSession: sessions.length > 0 ? Math.round(totalTokens / sessions.length) : 0,\n avgDurationMinutes: sessions.length > 0 ? Math.round(totalDurationMinutes / sessions.length) : 0,\n sessionsPerDay,\n tokensPerDay,\n modelUsage,\n delegationCount,\n dateRange: earliest && latest ? { earliest, latest } : null,\n topDays,\n };\n}\n\n/**\n * Load raw session data for a date range.\n */\nexport function getSessionsInRange(\n harnessDir: string,\n from?: string,\n to?: string,\n): SessionData[] {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n const files = readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'));\n\n const sessions: SessionData[] = [];\n for (const file of files) {\n const data = parseSessionFile(join(sessionsDir, file));\n if (!data || !data.date) continue;\n\n if (from && data.date < from) continue;\n if (to && data.date > to) continue;\n\n sessions.push(data);\n }\n\n return sessions.sort((a, b) => a.date.localeCompare(b.date));\n}\n","import { existsSync, readdirSync } from 'fs';\nimport { join } from 'path';\nimport { getHealthStatus } from './health.js';\nimport { getSpending } from './cost-tracker.js';\nimport { getAllWorkflowStats, loadMetrics } from './metrics.js';\nimport { getSessionAnalytics } from './analytics.js';\nimport { validateMcpConfig } from './mcp.js';\nimport { loadState } from './state.js';\nimport { loadConfig } from '../core/config.js';\nimport type { HealthStatus } from './health.js';\nimport type { SpendingSummary } from './cost-tracker.js';\nimport type { WorkflowStats } from './metrics.js';\nimport type { AgentState, HarnessConfig } from '../core/types.js';\n\n/** A point-in-time snapshot of all system telemetry. */\nexport interface TelemetrySnapshot {\n timestamp: string;\n agent: {\n name: string;\n version: string;\n mode: AgentState['mode'];\n lastInteraction: string;\n };\n health: HealthStatus;\n spending: {\n today: SpendingSummary;\n thisMonth: SpendingSummary;\n allTime: SpendingSummary;\n };\n sessions: {\n total: number;\n totalTokens: number;\n avgTokensPerSession: number;\n delegationCount: number;\n };\n workflows: {\n totalRuns: number;\n totalSuccesses: number;\n totalFailures: number;\n overallSuccessRate: number;\n stats: WorkflowStats[];\n };\n storage: {\n sessionCount: number;\n journalCount: number;\n weeklyCount: number;\n primitiveCount: number;\n };\n mcp: {\n serverCount: number;\n enabledCount: number;\n servers: Array<{ name: string; transport: string; enabled: boolean; valid: boolean; error?: string }>;\n };\n}\n\n/** Options for snapshot collection. */\nexport interface TelemetryOptions {\n /** Skip health checks (default: false) */\n skipHealth?: boolean;\n /** Skip session analytics parsing (default: false) */\n skipSessions?: boolean;\n /** Skip workflow metrics (default: false) */\n skipWorkflows?: boolean;\n /** Skip spending data (default: false) */\n skipSpending?: boolean;\n}\n\n/**\n * Count files in a directory matching a filter (non-recursive).\n */\nfunction countFiles(dir: string, filter: (f: string) => boolean): number {\n if (!existsSync(dir)) return 0;\n try {\n return readdirSync(dir).filter(filter).length;\n } catch {\n return 0;\n }\n}\n\nconst mdFilter = (f: string): boolean => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_');\n\n/**\n * Collect a full telemetry snapshot from all system modules.\n * Each section can be skipped via options for performance.\n */\nexport function collectSnapshot(\n harnessDir: string,\n options?: TelemetryOptions,\n): TelemetrySnapshot {\n const now = new Date().toISOString();\n\n // Agent info\n let agentName = 'unknown';\n let agentVersion = '0.0.0';\n let config: HarnessConfig | undefined;\n try {\n config = loadConfig(harnessDir);\n agentName = config.agent.name;\n agentVersion = config.agent.version;\n } catch {\n // Config may not exist\n }\n\n let state: AgentState;\n try {\n state = loadState(harnessDir);\n } catch {\n state = {\n mode: 'idle',\n goals: [],\n active_workflows: [],\n unfinished_business: [],\n last_interaction: 'never',\n };\n }\n\n // Health\n const health: HealthStatus = options?.skipHealth\n ? { status: 'healthy', checks: [], metrics: { lastSuccessfulRun: null, lastFailedRun: null, lastError: null, consecutiveFailures: 0, totalRuns: 0, totalSuccesses: 0, totalFailures: 0, bootedAt: null, updatedAt: now }, costToday: 0, costThisMonth: 0 }\n : getHealthStatus(harnessDir);\n\n // Spending\n const today = now.split('T')[0];\n const monthStart = `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}-01`;\n const emptySummary: SpendingSummary = { total_cost_usd: 0, total_input_tokens: 0, total_output_tokens: 0, entries: 0, by_model: {}, by_provider: {} };\n\n let spendingToday: SpendingSummary = emptySummary;\n let spendingMonth: SpendingSummary = emptySummary;\n let spendingAll: SpendingSummary = emptySummary;\n\n if (!options?.skipSpending) {\n try {\n spendingToday = getSpending(harnessDir, today);\n spendingMonth = getSpending(harnessDir, monthStart);\n spendingAll = getSpending(harnessDir, '2000-01-01');\n } catch {\n // Cost data may not exist\n }\n }\n\n // Session analytics\n let totalSessions = 0;\n let totalTokens = 0;\n let avgTokensPerSession = 0;\n let delegationCount = 0;\n\n if (!options?.skipSessions) {\n try {\n const analytics = getSessionAnalytics(harnessDir);\n totalSessions = analytics.totalSessions;\n totalTokens = analytics.totalTokens;\n avgTokensPerSession = analytics.avgTokensPerSession;\n delegationCount = analytics.delegationCount;\n } catch {\n // Analytics may fail if no sessions\n }\n }\n\n // Workflow metrics\n let workflowStats: WorkflowStats[] = [];\n let wfTotalRuns = 0;\n let wfTotalSuccesses = 0;\n let wfTotalFailures = 0;\n\n if (!options?.skipWorkflows) {\n try {\n workflowStats = getAllWorkflowStats(harnessDir);\n const metricsStore = loadMetrics(harnessDir);\n wfTotalRuns = metricsStore.runs.length;\n wfTotalSuccesses = metricsStore.runs.filter((r) => r.success).length;\n wfTotalFailures = metricsStore.runs.filter((r) => !r.success).length;\n } catch {\n // Metrics may not exist\n }\n }\n\n // Storage counts\n const sessionCount = countFiles(join(harnessDir, 'memory', 'sessions'), mdFilter);\n const journalCount = countFiles(join(harnessDir, 'memory', 'journal'), mdFilter);\n const weeklyCount = countFiles(join(harnessDir, 'memory', 'journal', 'weekly'), mdFilter);\n\n // Count primitives across core dirs\n const primitiveDirs = ['rules', 'instincts', 'skills', 'playbooks', 'workflows', 'tools', 'agents'];\n let primitiveCount = 0;\n for (const dir of primitiveDirs) {\n primitiveCount += countFiles(join(harnessDir, dir), mdFilter);\n }\n\n // MCP server info\n const mcpServers = config?.mcp?.servers ?? {};\n const mcpEntries = Object.entries(mcpServers);\n const mcpValidationErrors = config ? validateMcpConfig(config) : [];\n const mcpErrorMap = new Map(mcpValidationErrors.map((e) => [e.server, e.error]));\n\n const mcpServerList = mcpEntries.map(([name, s]) => ({\n name,\n transport: s.transport,\n enabled: s.enabled !== false,\n valid: !mcpErrorMap.has(name),\n ...(mcpErrorMap.has(name) ? { error: mcpErrorMap.get(name) } : {}),\n }));\n\n return {\n timestamp: now,\n agent: {\n name: agentName,\n version: agentVersion,\n mode: state.mode,\n lastInteraction: state.last_interaction,\n },\n health,\n spending: {\n today: spendingToday,\n thisMonth: spendingMonth,\n allTime: spendingAll,\n },\n sessions: {\n total: totalSessions,\n totalTokens,\n avgTokensPerSession,\n delegationCount,\n },\n workflows: {\n totalRuns: wfTotalRuns,\n totalSuccesses: wfTotalSuccesses,\n totalFailures: wfTotalFailures,\n overallSuccessRate: wfTotalRuns > 0 ? wfTotalSuccesses / wfTotalRuns : 0,\n stats: workflowStats,\n },\n storage: {\n sessionCount,\n journalCount,\n weeklyCount,\n primitiveCount,\n },\n mcp: {\n serverCount: mcpEntries.length,\n enabledCount: mcpServerList.filter((s) => s.enabled).length,\n servers: mcpServerList,\n },\n };\n}\n\n/**\n * Format a telemetry snapshot as a human-readable dashboard string.\n */\nexport function formatDashboard(snapshot: TelemetrySnapshot): string {\n const lines: string[] = [];\n\n // Header\n const statusIcon = snapshot.health.status === 'healthy' ? 'OK' : snapshot.health.status === 'degraded' ? 'WARN' : 'FAIL';\n lines.push(` ${snapshot.agent.name} v${snapshot.agent.version} | ${statusIcon} | mode: ${snapshot.agent.mode}`);\n lines.push(` Last interaction: ${snapshot.agent.lastInteraction}`);\n lines.push('');\n\n // Health checks\n lines.push(' Health Checks');\n for (const check of snapshot.health.checks) {\n const icon = check.status === 'pass' ? '+' : check.status === 'warn' ? '!' : 'x';\n lines.push(` [${icon}] ${check.name}: ${check.message}`);\n }\n lines.push('');\n\n // Spending\n const todayCost = snapshot.spending.today.total_cost_usd;\n const monthCost = snapshot.spending.thisMonth.total_cost_usd;\n const allTimeCost = snapshot.spending.allTime.total_cost_usd;\n lines.push(' Spending');\n lines.push(` Today: $${todayCost.toFixed(6)} (${snapshot.spending.today.entries} calls)`);\n lines.push(` Month: $${monthCost.toFixed(6)} (${snapshot.spending.thisMonth.entries} calls)`);\n lines.push(` All time: $${allTimeCost.toFixed(6)} (${snapshot.spending.allTime.entries} calls)`);\n\n // Model breakdown (today)\n const todayModels = Object.entries(snapshot.spending.today.by_model);\n if (todayModels.length > 0) {\n lines.push(' By model (today):');\n for (const [model, data] of todayModels.sort((a, b) => b[1].cost_usd - a[1].cost_usd)) {\n lines.push(` ${model}: $${data.cost_usd.toFixed(6)} (${data.count}x)`);\n }\n }\n lines.push('');\n\n // Sessions\n lines.push(' Sessions');\n lines.push(` Total: ${snapshot.sessions.total} | Tokens: ${snapshot.sessions.totalTokens.toLocaleString()} | Avg: ${snapshot.sessions.avgTokensPerSession.toLocaleString()}/session`);\n if (snapshot.sessions.delegationCount > 0) {\n lines.push(` Delegations: ${snapshot.sessions.delegationCount}`);\n }\n lines.push('');\n\n // Workflows\n if (snapshot.workflows.totalRuns > 0 || snapshot.workflows.stats.length > 0) {\n const successRate = (snapshot.workflows.overallSuccessRate * 100).toFixed(0);\n lines.push(' Workflows');\n lines.push(` Runs: ${snapshot.workflows.totalRuns} (${successRate}% success) | ${snapshot.workflows.totalSuccesses} ok, ${snapshot.workflows.totalFailures} failed`);\n for (const s of snapshot.workflows.stats.slice(0, 5)) {\n const rate = (s.success_rate * 100).toFixed(0);\n lines.push(` ${s.workflow_id}: ${s.total_runs} runs (${rate}%) | last: ${s.last_run}`);\n }\n if (snapshot.workflows.stats.length > 5) {\n lines.push(` ... and ${snapshot.workflows.stats.length - 5} more`);\n }\n lines.push('');\n }\n\n // MCP\n if (snapshot.mcp.serverCount > 0) {\n lines.push(' MCP Servers');\n lines.push(` Configured: ${snapshot.mcp.serverCount} | Enabled: ${snapshot.mcp.enabledCount}`);\n for (const server of snapshot.mcp.servers) {\n const status = !server.enabled ? '-' : server.valid ? '+' : '!';\n const error = server.error ? ` (${server.error})` : '';\n lines.push(` [${status}] ${server.name} (${server.transport})${error}`);\n }\n lines.push('');\n }\n\n // Storage\n lines.push(' Storage');\n lines.push(` Sessions: ${snapshot.storage.sessionCount} | Journals: ${snapshot.storage.journalCount} | Weekly: ${snapshot.storage.weeklyCount} | Primitives: ${snapshot.storage.primitiveCount}`);\n lines.push('');\n\n // Run health\n const m = snapshot.health.metrics;\n lines.push(' Run Health');\n lines.push(` Total: ${m.totalRuns} | Success: ${m.totalSuccesses} | Fail: ${m.totalFailures} | Consecutive failures: ${m.consecutiveFailures}`);\n if (m.bootedAt) lines.push(` Booted: ${m.bootedAt}`);\n if (m.lastSuccessfulRun) lines.push(` Last success: ${m.lastSuccessfulRun}`);\n if (m.lastFailedRun) lines.push(` Last failure: ${m.lastFailedRun}`);\n if (m.lastError) lines.push(` Last error: ${m.lastError.slice(0, 120)}`);\n\n return lines.join('\\n');\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { homedir, platform } from 'os';\n\n// --- Types ---\n\n/** A discovered MCP server from an external tool's config */\nexport interface DiscoveredMcpServer {\n /** Server name (key from the source config) */\n name: string;\n /** Transport type inferred from config */\n transport: 'stdio' | 'http' | 'sse';\n /** Command for stdio transport */\n command?: string;\n /** Args for stdio transport */\n args?: string[];\n /** Environment variables */\n env?: Record<string, string>;\n /** Working directory */\n cwd?: string;\n /** URL for http/sse transport */\n url?: string;\n /** Headers for http/sse transport */\n headers?: Record<string, string>;\n}\n\n/** Result of scanning a single tool's config */\nexport interface DiscoverySource {\n /** Tool name (e.g. \"Claude Desktop\", \"Cursor\") */\n tool: string;\n /** Config file path that was scanned */\n configPath: string;\n /** Whether the config file exists */\n found: boolean;\n /** Servers discovered from this tool */\n servers: DiscoveredMcpServer[];\n /** Error encountered while reading/parsing */\n error?: string;\n}\n\n/** Aggregated discovery results */\nexport interface DiscoveryResult {\n /** All sources scanned */\n sources: DiscoverySource[];\n /** Deduplicated servers (by name, preferring first seen) */\n servers: DiscoveredMcpServer[];\n /** Total sources that had config files */\n sourcesFound: number;\n /** Total unique servers discovered */\n totalServers: number;\n}\n\n// --- Known tool config locations ---\n\ninterface ToolConfig {\n tool: string;\n /** Function returning config file path for the current platform */\n path: () => string;\n /** JSON key containing server definitions */\n rootKey: string;\n /** Whether servers use explicit 'type' field instead of inferring transport */\n usesTypeField?: boolean;\n /** Custom extraction for non-standard config structures. Returns merged server map. */\n extractServers?: (root: Record<string, unknown>) => Record<string, unknown>;\n}\n\nfunction vscodeGlobalStoragePath(h: string, mac: boolean, extensionId: string): string {\n if (mac) {\n return join(h, 'Library', 'Application Support', 'Code', 'User', 'globalStorage', extensionId);\n }\n return join(h, '.config', 'Code', 'User', 'globalStorage', extensionId);\n}\n\n/** Claude Code extractServers — handles nested projects.<path>.mcpServers */\nfunction extractClaudeCodeServers(root: Record<string, unknown>): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n // Check top-level mcpServers\n const topLevel = root.mcpServers;\n if (topLevel && typeof topLevel === 'object' && !Array.isArray(topLevel)) {\n Object.assign(merged, topLevel);\n }\n // Check per-project mcpServers under projects.<path>.mcpServers\n const projects = root.projects;\n if (projects && typeof projects === 'object' && !Array.isArray(projects)) {\n for (const projectData of Object.values(projects as Record<string, unknown>)) {\n if (!projectData || typeof projectData !== 'object' || Array.isArray(projectData)) continue;\n const proj = projectData as Record<string, unknown>;\n const projServers = proj.mcpServers;\n if (projServers && typeof projServers === 'object' && !Array.isArray(projServers)) {\n for (const [name, config] of Object.entries(projServers as Record<string, unknown>)) {\n if (!(name in merged)) {\n merged[name] = config;\n }\n }\n }\n }\n }\n return merged;\n}\n\n/**\n * Build the list of tool configs for the given home directory and platform.\n * Evaluated lazily so tests can control the home/platform values.\n */\nfunction buildToolConfigs(h: string, mac: boolean): ToolConfig[] {\n return [\n {\n tool: 'Claude Desktop',\n path: () => mac\n ? join(h, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json')\n : join(h, '.config', 'Claude', 'claude_desktop_config.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'Claude Code',\n path: () => join(h, '.claude.json'),\n rootKey: 'mcpServers',\n usesTypeField: true,\n extractServers: extractClaudeCodeServers,\n },\n {\n tool: 'Cursor',\n path: () => join(h, '.cursor', 'mcp.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'Windsurf',\n path: () => join(h, '.codeium', 'windsurf', 'mcp_config.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'Copilot CLI',\n path: () => join(h, '.copilot', 'mcp-config.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'Cline',\n path: () => join(vscodeGlobalStoragePath(h, mac, 'saoudrizwan.claude-dev'), 'settings', 'cline_mcp_settings.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'Roo Code',\n path: () => join(vscodeGlobalStoragePath(h, mac, 'rooveterinaryinc.roo-cline'), 'settings', 'mcp_settings.json'),\n rootKey: 'mcpServers',\n },\n {\n tool: 'VS Code',\n path: () => mac\n ? join(h, 'Library', 'Application Support', 'Code', 'User', 'mcp.json')\n : join(h, '.config', 'Code', 'User', 'mcp.json'),\n rootKey: 'servers',\n usesTypeField: true,\n },\n {\n tool: 'Zed',\n path: () => join(h, '.config', 'zed', 'settings.json'),\n rootKey: 'context_servers',\n },\n ];\n}\n\n// --- Parsing ---\n\n/**\n * Infer transport type from a server config object.\n * Most tools use 'command' = stdio, 'url' = http/sse.\n * VS Code uses explicit 'type' field.\n */\nfunction inferTransport(\n serverObj: Record<string, unknown>,\n usesTypeField?: boolean,\n): 'stdio' | 'http' | 'sse' {\n if (usesTypeField && typeof serverObj.type === 'string') {\n const t = serverObj.type.toLowerCase();\n if (t === 'sse') return 'sse';\n if (t === 'http') return 'http';\n if (t === 'stdio') return 'stdio';\n }\n\n if (typeof serverObj.command === 'string') return 'stdio';\n if (typeof serverObj.url === 'string' || typeof serverObj.serverUrl === 'string') {\n // If the URL looks like an SSE endpoint\n const url = (serverObj.url ?? serverObj.serverUrl) as string;\n if (url.includes('/sse') || serverObj.type === 'sse') return 'sse';\n return 'http';\n }\n\n // Default to stdio if we can't determine\n return 'stdio';\n}\n\n/**\n * Parse a server config object into a DiscoveredMcpServer.\n */\nfunction parseServer(\n name: string,\n serverObj: Record<string, unknown>,\n usesTypeField?: boolean,\n): DiscoveredMcpServer {\n const transport = inferTransport(serverObj, usesTypeField);\n const server: DiscoveredMcpServer = { name, transport };\n\n if (transport === 'stdio') {\n if (typeof serverObj.command === 'string') server.command = serverObj.command;\n if (Array.isArray(serverObj.args)) {\n server.args = serverObj.args\n .filter((a): a is string => typeof a === 'string')\n .map((a) => redactArgValue(a));\n }\n if (serverObj.env && typeof serverObj.env === 'object' && !Array.isArray(serverObj.env)) {\n server.env = redactEnv(filterStringRecord(serverObj.env as Record<string, unknown>));\n }\n if (typeof serverObj.cwd === 'string') server.cwd = serverObj.cwd;\n } else {\n const url = serverObj.url ?? serverObj.serverUrl;\n if (typeof url === 'string') server.url = url;\n if (serverObj.headers && typeof serverObj.headers === 'object' && !Array.isArray(serverObj.headers)) {\n // Redact auth headers\n const headers = filterStringRecord(serverObj.headers as Record<string, unknown>);\n for (const [k, v] of Object.entries(headers)) {\n if (SECRET_PATTERNS.test(k) || SECRET_PATTERNS.test(v)) {\n headers[k] = `\\${${k.toUpperCase().replace(/[^A-Z0-9]/g, '_')}}`;\n }\n }\n server.headers = headers;\n }\n }\n\n return server;\n}\n\n/** Filter an object to only string values */\nfunction filterStringRecord(obj: Record<string, unknown>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (typeof v === 'string') result[k] = v;\n }\n return result;\n}\n\n/** Patterns that indicate a secret value in env vars */\nconst SECRET_PATTERNS = /(?:api[_-]?key|secret|token|password|bearer|auth)/i;\n/** Patterns for non-secret env vars that are always safe to copy */\nconst SAFE_ENV_KEYS = /^(?:PATH|HOME|NODE_ENV|NODE_OPTIONS|SHELL|LANG|LC_\\w+|TZ|TERM|EDITOR)$/;\n\n/** Pattern for Bearer tokens or similar auth values in args */\nconst BEARER_PATTERN = /^(Authorization:\\s*Bearer\\s+)\\S+$/i;\nconst TOKEN_ARG_PATTERN = /^(--(?:token|api-key|secret|password)[=:])\\S+$/i;\n\n/**\n * Redact sensitive values that may appear in command args.\n * E.g., \"Authorization: Bearer abc123\" → \"Authorization: Bearer ${BEARER_TOKEN}\"\n */\nfunction redactArgValue(arg: string): string {\n const bearerMatch = BEARER_PATTERN.exec(arg);\n if (bearerMatch) return `${bearerMatch[1]}\\${BEARER_TOKEN}`;\n\n const tokenMatch = TOKEN_ARG_PATTERN.exec(arg);\n if (tokenMatch) return `${tokenMatch[1]}\\${TOKEN}`;\n\n return arg;\n}\n\n/**\n * Redact sensitive env values, replacing them with a placeholder.\n * Safe keys (PATH, HOME, etc.) are kept. Keys matching secret patterns\n * get their values replaced with \"${KEY_NAME}\" for the user to fill in.\n */\nfunction redactEnv(env: Record<string, string>): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(env)) {\n if (SAFE_ENV_KEYS.test(k)) {\n result[k] = v;\n } else if (SECRET_PATTERNS.test(k)) {\n result[k] = `\\${${k}}`;\n } else {\n // For non-secret, non-safe keys, keep the value\n result[k] = v;\n }\n }\n return result;\n}\n\n/**\n * Read and parse a JSON config file safely.\n * Handles JSONC (comments) by stripping them outside of string literals.\n * Also handles control characters that some tools leave in their configs.\n */\nfunction readJsonSafe(filePath: string): unknown {\n let raw = readFileSync(filePath, 'utf-8');\n\n // Strip control characters (except \\n, \\r, \\t) that break JSON.parse\n // Some tools write configs with embedded control chars in string values.\n raw = raw.replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g, '');\n\n // Strip JSONC comments outside of string literals.\n // Walk character by character to avoid stripping // inside strings.\n let result = '';\n let inString = false;\n let escape = false;\n let i = 0;\n while (i < raw.length) {\n const ch = raw[i];\n\n if (escape) {\n result += ch;\n escape = false;\n i++;\n continue;\n }\n\n if (inString) {\n if (ch === '\\\\') {\n escape = true;\n result += ch;\n } else if (ch === '\"') {\n inString = false;\n result += ch;\n } else {\n result += ch;\n }\n i++;\n continue;\n }\n\n // Not in a string\n if (ch === '\"') {\n inString = true;\n result += ch;\n i++;\n } else if (ch === '/' && i + 1 < raw.length && raw[i + 1] === '/') {\n // Single-line comment — skip to end of line\n while (i < raw.length && raw[i] !== '\\n') i++;\n } else if (ch === '/' && i + 1 < raw.length && raw[i + 1] === '*') {\n // Multi-line comment — skip to */\n i += 2;\n while (i + 1 < raw.length && !(raw[i] === '*' && raw[i + 1] === '/')) i++;\n i += 2; // skip */\n } else {\n result += ch;\n i++;\n }\n }\n\n return JSON.parse(result);\n}\n\n// --- Discovery ---\n\n/**\n * Scan a single tool's config file for MCP server definitions.\n */\nfunction scanTool(toolConfig: ToolConfig): DiscoverySource {\n const configPath = toolConfig.path();\n const source: DiscoverySource = {\n tool: toolConfig.tool,\n configPath,\n found: false,\n servers: [],\n };\n\n if (!existsSync(configPath)) {\n return source;\n }\n\n source.found = true;\n\n try {\n const parsed = readJsonSafe(configPath);\n if (!parsed || typeof parsed !== 'object') {\n source.error = 'Config file is not a JSON object';\n return source;\n }\n\n const root = parsed as Record<string, unknown>;\n\n // Use custom extractor if provided, otherwise look up rootKey directly\n const serversObj = toolConfig.extractServers\n ? toolConfig.extractServers(root)\n : root[toolConfig.rootKey];\n\n if (!serversObj || typeof serversObj !== 'object' || Array.isArray(serversObj)) {\n // No servers section found — not an error, just nothing configured\n return source;\n }\n\n const entries = Object.entries(serversObj as Record<string, unknown>);\n for (const [name, value] of entries) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n\n const serverObj = value as Record<string, unknown>;\n\n // Skip disabled servers\n if (serverObj.disabled === true || serverObj.enabled === false) continue;\n\n try {\n const server = parseServer(name, serverObj, toolConfig.usesTypeField);\n // Only include servers that have enough info to be useful\n if (server.command || server.url) {\n source.servers.push(server);\n }\n } catch {\n // Skip individual servers that fail to parse\n }\n }\n } catch (err) {\n source.error = err instanceof Error ? err.message : String(err);\n }\n\n return source;\n}\n\n/** Options for discovery — primarily used for testing */\nexport interface DiscoveryOptions {\n /** Override home directory (default: os.homedir()) */\n homeDir?: string;\n /** Override platform detection (default: os.platform() === 'darwin') */\n isMac?: boolean;\n}\n\n/**\n * Scan all known tool config locations for MCP servers.\n * Returns deduplicated results with source tracking.\n */\nexport function discoverMcpServers(options?: DiscoveryOptions): DiscoveryResult {\n const h = options?.homeDir ?? homedir();\n const mac = options?.isMac ?? platform() === 'darwin';\n const toolConfigs = buildToolConfigs(h, mac);\n\n const sources: DiscoverySource[] = [];\n const seenNames = new Set<string>();\n const uniqueServers: DiscoveredMcpServer[] = [];\n\n for (const toolConfig of toolConfigs) {\n const source = scanTool(toolConfig);\n sources.push(source);\n\n // Dedupe by server name (first seen wins)\n for (const server of source.servers) {\n if (!seenNames.has(server.name)) {\n seenNames.add(server.name);\n uniqueServers.push(server);\n }\n }\n }\n\n return {\n sources,\n servers: uniqueServers,\n sourcesFound: sources.filter((s) => s.found).length,\n totalServers: uniqueServers.length,\n };\n}\n\n/** Binary basenames that are safe to strip from absolute paths — PATH will resolve them */\nconst NORMALIZABLE_BINARIES = new Set(['npx', 'node', 'python', 'python3']);\n\n/**\n * If `command` is an absolute path whose basename is a well-known interpreter\n * (npx/node/python/python3), return just the basename. Otherwise return as-is.\n *\n * This prevents leaking user-specific paths like\n * `/Users/foo/.nvm/versions/node/v22/bin/npx` into scaffolds.\n */\nfunction normalizeCommand(command: string): string {\n if (!command.startsWith('/')) return command;\n const base = command.substring(command.lastIndexOf('/') + 1);\n if (NORMALIZABLE_BINARIES.has(base)) return base;\n return command;\n}\n\n/** Check if an http/sse server has any form of Authorization configured */\nfunction hasAuthConfigured(server: DiscoveredMcpServer): boolean {\n if (server.headers) {\n for (const k of Object.keys(server.headers)) {\n if (k.toLowerCase() === 'authorization') return true;\n }\n }\n return false;\n}\n\n/** Find ${VAR} placeholders in a string. Returns var names. */\nfunction findEnvPlaceholders(value: string): string[] {\n const matches = value.matchAll(/\\$\\{([A-Z_][A-Z0-9_]*)\\}/gi);\n return Array.from(matches, (m) => m[1]);\n}\n\n/**\n * Filter out servers that won't work on this machine:\n * - http/sse servers with no Authorization header (will 401 silently)\n * - servers referencing env vars that aren't set in the current process\n *\n * Logs a warning to stderr for each skipped server explaining why.\n */\nexport function filterUnsafeServers(servers: DiscoveredMcpServer[]): DiscoveredMcpServer[] {\n const result: DiscoveredMcpServer[] = [];\n for (const server of servers) {\n // Drop unauth http/sse\n if (server.transport === 'http' || server.transport === 'sse') {\n if (!hasAuthConfigured(server)) {\n console.warn(`[mcp-discovery] skipping ${server.name}: ${server.transport} transport with no Authorization header`);\n continue;\n }\n }\n\n // Drop servers with unresolved env var references\n let missingVar: string | undefined;\n if (server.env) {\n for (const v of Object.values(server.env)) {\n for (const varName of findEnvPlaceholders(v)) {\n if (!(varName in process.env) || !process.env[varName]) {\n missingVar = varName;\n break;\n }\n }\n if (missingVar) break;\n }\n }\n if (!missingVar && server.headers) {\n for (const v of Object.values(server.headers)) {\n for (const varName of findEnvPlaceholders(v)) {\n if (!(varName in process.env) || !process.env[varName]) {\n missingVar = varName;\n break;\n }\n }\n if (missingVar) break;\n }\n }\n if (missingVar) {\n console.warn(`[mcp-discovery] skipping ${server.name}: required env var ${missingVar} not set`);\n continue;\n }\n\n result.push(server);\n }\n return result;\n}\n\n/**\n * Convert discovered servers to the harness config YAML format.\n * Returns a string that can be appended to config.yaml.\n *\n * Normalizes absolute paths to well-known binaries (npx/node/python) to bare\n * names so the YAML is portable across machines. When the command is normalized,\n * any PATH env var entry is dropped — it was only needed to find the absolute\n * binary location.\n */\nexport function discoveredServersToYaml(servers: DiscoveredMcpServer[]): string {\n if (servers.length === 0) return '';\n\n const lines: string[] = ['mcp:', ' servers:'];\n\n for (const server of servers) {\n lines.push(` ${server.name}:`);\n lines.push(` transport: ${server.transport}`);\n\n if (server.transport === 'stdio') {\n let normalizedCommand: string | undefined;\n if (server.command) {\n normalizedCommand = normalizeCommand(server.command);\n lines.push(` command: ${normalizedCommand}`);\n }\n const wasNormalized = !!server.command && normalizedCommand !== server.command;\n if (server.args && server.args.length > 0) {\n lines.push(` args: [${server.args.map((a) => `\"${a}\"`).join(', ')}]`);\n }\n // When the command was normalized to a bare binary name, drop PATH —\n // the system PATH will resolve it. Custom env vars are still kept.\n const filteredEnv = server.env\n ? Object.fromEntries(Object.entries(server.env).filter(([k]) => !(wasNormalized && k === 'PATH')))\n : undefined;\n if (filteredEnv && Object.keys(filteredEnv).length > 0) {\n lines.push(' env:');\n for (const [k, v] of Object.entries(filteredEnv)) {\n lines.push(` ${k}: \"${v}\"`);\n }\n }\n if (server.cwd) lines.push(` cwd: \"${server.cwd}\"`);\n } else {\n if (server.url) lines.push(` url: \"${server.url}\"`);\n if (server.headers && Object.keys(server.headers).length > 0) {\n lines.push(' headers:');\n for (const [k, v] of Object.entries(server.headers)) {\n lines.push(` ${k}: \"${v}\"`);\n }\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/** Get the list of tools that are scanned (for display purposes) */\nexport function getScannedTools(): string[] {\n // Tool names are the same regardless of home/platform\n return buildToolConfigs('', true).map((t) => t.tool);\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport YAML from 'yaml';\nimport type { HarnessConfig } from '../core/types.js';\nimport { loadConfig } from '../core/config.js';\nimport type { McpServerConfig } from './mcp.js';\nimport { createMcpManager, validateMcpConfig } from './mcp.js';\nimport type { ResolvedServer, RegistryEnvVar, RegistryServer, RegistrySearchResponse } from './mcp-registry.js';\nimport { findServer, searchServers, searchRegistry, getRegistryServer } from './mcp-registry.js';\nimport { log } from '../core/logger.js';\n\n// Re-export registry types and functions for consumers\nexport { searchRegistry, getRegistryServer };\nexport type { RegistryServer, RegistrySearchResponse, RegistryEnvVar, ResolvedServer };\nexport type { RegistryPackage, RegistryRemote, RegistrySearchResult } from './mcp-registry.js';\n\n// --- Types ---\n\n/** Result of installing an MCP server */\nexport interface McpInstallResult {\n /** Whether installation succeeded */\n installed: boolean;\n /** Server config name in config.yaml */\n name: string;\n /** The resolved server details */\n server?: ResolvedServer;\n /** Connection test results */\n connectionTest?: {\n connected: boolean;\n toolCount: number;\n toolNames: string[];\n error?: string;\n };\n /** Generated tool doc paths */\n generatedDocs: string[];\n /** Env vars that need user configuration */\n pendingEnvVars: RegistryEnvVar[];\n /** Error message if installation failed */\n error?: string;\n}\n\n/** Options for the install command */\nexport interface McpInstallOptions {\n /** Harness directory */\n dir: string;\n /** Skip connection testing */\n skipTest?: boolean;\n /** Skip tool doc generation */\n skipDocs?: boolean;\n /** Force overwrite if server already exists */\n force?: boolean;\n /** Custom name override for the server in config */\n name?: string;\n}\n\n// --- Config Update ---\n\nconst CONFIG_FILENAMES = ['config.yaml', 'config.yml', 'harness.yaml', 'harness.yml'];\n\n/**\n * Find the config file path in a harness directory.\n */\nfunction findConfigPath(dir: string): string {\n for (const filename of CONFIG_FILENAMES) {\n const configPath = join(dir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n return join(dir, 'config.yaml');\n}\n\n/**\n * Add or update an MCP server entry in the config file.\n * Preserves existing config structure and comments where possible.\n */\nexport function updateConfigWithServer(\n dir: string,\n serverName: string,\n serverConfig: McpServerConfig,\n): void {\n const configPath = findConfigPath(dir);\n const content = existsSync(configPath) ? readFileSync(configPath, 'utf-8') : '';\n\n // Parse existing YAML, preserving structure\n const doc = YAML.parseDocument(content);\n\n // Ensure mcp.servers exists\n if (!doc.has('mcp')) {\n doc.set('mcp', doc.createNode({ servers: {} }));\n }\n const mcp = doc.get('mcp') as YAML.YAMLMap;\n if (!mcp.has('servers')) {\n mcp.set('servers', doc.createNode({}));\n }\n const servers = mcp.get('servers') as YAML.YAMLMap;\n\n // Build the server config node\n const configNode: Record<string, unknown> = {\n transport: serverConfig.transport,\n };\n\n if (serverConfig.transport === 'stdio') {\n if (serverConfig.command) configNode['command'] = serverConfig.command;\n if (serverConfig.args && serverConfig.args.length > 0) configNode['args'] = serverConfig.args;\n if (serverConfig.env && Object.keys(serverConfig.env).length > 0) configNode['env'] = serverConfig.env;\n if (serverConfig.cwd) configNode['cwd'] = serverConfig.cwd;\n } else {\n if (serverConfig.url) configNode['url'] = serverConfig.url;\n if (serverConfig.headers && Object.keys(serverConfig.headers).length > 0) {\n configNode['headers'] = serverConfig.headers;\n }\n }\n\n // Set the server entry (add or overwrite)\n servers.set(serverName, doc.createNode(configNode));\n\n // Write back\n writeFileSync(configPath, doc.toString(), 'utf-8');\n}\n\n/**\n * Check if a server name already exists in the config.\n */\nexport function serverExistsInConfig(dir: string, serverName: string): boolean {\n try {\n const config = loadConfig(dir);\n return Boolean(config.mcp?.servers?.[serverName]);\n } catch {\n return false;\n }\n}\n\n// --- Tool Doc Generation ---\n\n/**\n * Generate a tools/*.md knowledge doc from a connected MCP server's tools.\n * Creates one file per MCP server with descriptions of all available tools.\n */\nexport function generateToolDocs(\n dir: string,\n serverName: string,\n toolNames: string[],\n description?: string,\n): string[] {\n const toolsDir = join(dir, 'tools');\n if (!existsSync(toolsDir)) {\n mkdirSync(toolsDir, { recursive: true });\n }\n\n const docPath = join(toolsDir, `${serverName}.md`);\n const lines: string[] = [\n '---',\n `id: tool-${serverName}`,\n `created: ${new Date().toISOString().split('T')[0]}`,\n `tags: [mcp, ${serverName}]`,\n '---',\n '',\n `# ${serverName} MCP Server`,\n '',\n ];\n\n if (description) {\n lines.push(description, '');\n }\n\n lines.push('## Available Tools', '');\n\n for (const toolName of toolNames) {\n lines.push(`- **${toolName}**`);\n }\n\n lines.push('', `> Auto-generated by \\`harness mcp install ${serverName}\\``);\n\n writeFileSync(docPath, lines.join('\\n'), 'utf-8');\n return [docPath];\n}\n\n// --- Connection Test ---\n\n/**\n * Test an MCP server connection and return tool info.\n */\nasync function testConnection(\n dir: string,\n serverName: string,\n serverConfig: McpServerConfig,\n): Promise<{ connected: boolean; toolCount: number; toolNames: string[]; error?: string }> {\n // Build a minimal config for testing just this server\n const config = loadConfig(dir);\n const testConfig: HarnessConfig = {\n ...config,\n mcp: { servers: { [serverName]: { ...serverConfig, enabled: serverConfig.enabled ?? true } } },\n };\n\n // Validate first\n const validationErrors = validateMcpConfig(testConfig);\n if (validationErrors.length > 0) {\n return {\n connected: false,\n toolCount: 0,\n toolNames: [],\n error: validationErrors.map((e) => e.error).join('; '),\n };\n }\n\n const manager = createMcpManager(testConfig);\n try {\n await manager.connect();\n const summaries = manager.getSummaries();\n const summary = summaries.find((s) => s.name === serverName);\n\n if (summary?.connected) {\n return {\n connected: true,\n toolCount: summary.toolCount,\n toolNames: summary.toolNames,\n };\n }\n\n return {\n connected: false,\n toolCount: 0,\n toolNames: [],\n error: summary?.error ?? 'Connection failed',\n };\n } catch (err) {\n return {\n connected: false,\n toolCount: 0,\n toolNames: [],\n error: err instanceof Error ? err.message : String(err),\n };\n } finally {\n await manager.close();\n }\n}\n\n// --- Main Install Flow ---\n\n/**\n * Install an MCP server by name or search query.\n *\n * Flow:\n * 1. Search the MCP registry for the server\n * 2. Resolve the best package/transport configuration\n * 3. Add/update the server entry in config.yaml\n * 4. Optionally test the connection\n * 5. Optionally generate tools/*.md knowledge docs\n */\nexport async function installMcpServer(\n query: string,\n options: McpInstallOptions,\n): Promise<McpInstallResult> {\n const { dir, skipTest, skipDocs, force, name: nameOverride } = options;\n\n // Step 1: Find the server in the registry\n log.info(`Searching MCP registry for \"${query}\"...`);\n let resolved: ResolvedServer | null;\n try {\n resolved = await findServer(query);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n installed: false,\n name: query,\n generatedDocs: [],\n pendingEnvVars: [],\n error: `Registry lookup failed: ${message}`,\n };\n }\n\n if (!resolved) {\n return {\n installed: false,\n name: query,\n generatedDocs: [],\n pendingEnvVars: [],\n error: `No MCP server found matching \"${query}\" in the registry`,\n };\n }\n\n const serverName = nameOverride ?? resolved.name;\n\n // Step 2: Check if already exists\n if (!force && serverExistsInConfig(dir, serverName)) {\n return {\n installed: false,\n name: serverName,\n server: resolved,\n generatedDocs: [],\n pendingEnvVars: resolved.requiredEnv,\n error: `Server \"${serverName}\" already exists in config. Use --force to overwrite.`,\n };\n }\n\n // Step 3: Write to config.yaml\n log.info(`Adding \"${serverName}\" to config.yaml...`);\n updateConfigWithServer(dir, serverName, resolved.config);\n\n const result: McpInstallResult = {\n installed: true,\n name: serverName,\n server: resolved,\n generatedDocs: [],\n pendingEnvVars: resolved.requiredEnv,\n };\n\n // Step 4: Test connection (optional)\n if (!skipTest) {\n log.info(`Testing connection to \"${serverName}\"...`);\n result.connectionTest = await testConnection(dir, serverName, resolved.config);\n }\n\n // Step 5: Generate tool docs (optional)\n if (!skipDocs && result.connectionTest?.connected && result.connectionTest.toolNames.length > 0) {\n log.info(`Generating tool docs for \"${serverName}\"...`);\n result.generatedDocs = generateToolDocs(\n dir,\n serverName,\n result.connectionTest.toolNames,\n resolved.description,\n );\n }\n\n return result;\n}\n\n/**\n * List available servers from the registry for a given query.\n */\nexport async function listRegistryServers(\n query: string,\n options?: { limit?: number },\n): Promise<ResolvedServer[]> {\n return searchServers(query, options);\n}\n\n/**\n * Format a registry search result for CLI display.\n */\nexport function formatRegistryServer(entry: { server: RegistryServer }): string {\n const s = entry.server;\n const lines: string[] = [];\n\n lines.push(` ${s.name} (v${s.version})`);\n if (s.title) lines.push(` ${s.title}`);\n if (s.description) {\n const desc = s.description.length > 100 ? s.description.slice(0, 97) + '...' : s.description;\n lines.push(` ${desc}`);\n }\n\n // Show packages\n const npmPkgs = (s.packages ?? []).filter((p) => p.registryType === 'npm');\n const pypiPkgs = (s.packages ?? []).filter((p) => p.registryType === 'pypi');\n if (npmPkgs.length > 0) {\n lines.push(` npm: ${npmPkgs.map((p) => p.identifier).join(', ')}`);\n }\n if (pypiPkgs.length > 0) {\n lines.push(` pypi: ${pypiPkgs.map((p) => p.identifier).join(', ')}`);\n }\n\n // Show remotes\n if (s.remotes && s.remotes.length > 0) {\n lines.push(` remote: ${s.remotes[0].transportType} ${s.remotes[0].url}`);\n }\n\n // Show required env vars\n const allEnvVars = (s.packages ?? [])\n .flatMap((p) => p.environmentVariables ?? [])\n .filter((v) => v.isRequired);\n if (allEnvVars.length > 0) {\n lines.push(` requires: ${allEnvVars.map((v) => v.name).join(', ')}`);\n }\n\n return lines.join('\\n');\n}\n","import type { McpServerConfig } from './mcp.js';\n\n// --- Types ---\n\n/** Environment variable from registry server entry */\nexport interface RegistryEnvVar {\n name: string;\n description?: string;\n isRequired?: boolean;\n format?: string;\n}\n\n/** Package entry from registry server */\nexport interface RegistryPackage {\n registryType: 'npm' | 'pypi' | 'oci' | 'nuget' | 'mcpb';\n identifier: string;\n version: string;\n transport: { type: 'stdio' | 'streamable-http' | 'sse' };\n environmentVariables?: RegistryEnvVar[];\n runtimeHint?: 'npx' | 'uvx' | 'docker' | 'dnx';\n packageArguments?: unknown[];\n runtimeArguments?: unknown[];\n}\n\n/** Remote endpoint from registry server */\nexport interface RegistryRemote {\n transportType: 'streamable-http' | 'sse';\n url: string;\n headers?: Record<string, string>;\n}\n\n/** A single server entry from the MCP registry API */\nexport interface RegistryServer {\n $schema?: string;\n name: string;\n description?: string;\n title?: string;\n version: string;\n repository?: { url: string; source?: string; subfolder?: string };\n websiteUrl?: string;\n packages?: RegistryPackage[];\n remotes?: RegistryRemote[];\n}\n\n/** A server result from the registry search API */\nexport interface RegistrySearchResult {\n server: RegistryServer;\n _meta?: Record<string, unknown>;\n}\n\n/** Full search response from the registry */\nexport interface RegistrySearchResponse {\n servers: RegistrySearchResult[];\n metadata?: { nextCursor?: string; count?: number };\n}\n\n/** Resolved server config ready for installation */\nexport interface ResolvedServer {\n /** Display name for the server */\n name: string;\n /** Server description from registry */\n description?: string;\n /** Registry name (e.g. \"io.github.foo/bar\") */\n registryName: string;\n /** Source package info */\n package?: RegistryPackage;\n /** Source remote info */\n remote?: RegistryRemote;\n /** Generated harness config */\n config: McpServerConfig;\n /** Environment variables that need to be set */\n requiredEnv: RegistryEnvVar[];\n /** All environment variables (required + optional) */\n allEnv: RegistryEnvVar[];\n}\n\n// --- Constants ---\n\nconst REGISTRY_BASE = 'https://registry.modelcontextprotocol.io';\nconst REGISTRY_API_VERSION = 'v0.1';\nconst DEFAULT_SEARCH_LIMIT = 10;\n\n// --- Registry Client ---\n\n/**\n * Search the MCP registry for servers matching a query.\n */\nexport async function searchRegistry(\n query: string,\n options?: { limit?: number; cursor?: string },\n): Promise<RegistrySearchResponse> {\n const limit = options?.limit ?? DEFAULT_SEARCH_LIMIT;\n const params = new URLSearchParams({\n search: query,\n limit: String(limit),\n version: 'latest',\n });\n if (options?.cursor) {\n params.set('cursor', options.cursor);\n }\n\n const url = `${REGISTRY_BASE}/${REGISTRY_API_VERSION}/servers?${params}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`MCP registry search failed (${response.status}): ${response.statusText}`);\n }\n\n const data = (await response.json()) as RegistrySearchResponse;\n return data;\n}\n\n/**\n * Get a specific server by its registry name and version.\n * Name must be URL-encoded (e.g. \"io.github.foo/bar\" -> \"io.github.foo%2Fbar\").\n */\nexport async function getRegistryServer(\n name: string,\n version: string = 'latest',\n): Promise<RegistryServer> {\n const encodedName = encodeURIComponent(name);\n const encodedVersion = encodeURIComponent(version);\n const url = `${REGISTRY_BASE}/${REGISTRY_API_VERSION}/servers/${encodedName}/versions/${encodedVersion}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(`MCP server \"${name}\" not found in registry`);\n }\n throw new Error(`MCP registry lookup failed (${response.status}): ${response.statusText}`);\n }\n\n const data = (await response.json()) as RegistryServer;\n return data;\n}\n\n// --- Runtime hint mapping ---\n\nconst RUNTIME_COMMANDS: Record<string, { command: string; prefix: string[] }> = {\n npx: { command: 'npx', prefix: ['-y'] },\n uvx: { command: 'uvx', prefix: [] },\n docker: { command: 'docker', prefix: ['run', '-i', '--rm'] },\n dnx: { command: 'dnx', prefix: [] },\n};\n\n/**\n * Derive a short config name from a registry server name.\n * \"io.github.foo/bar-server\" -> \"bar-server\"\n * \"io.github.foo/mcp-something\" -> \"mcp-something\"\n */\nexport function deriveConfigName(registryName: string): string {\n const parts = registryName.split('/');\n return parts[parts.length - 1];\n}\n\n/**\n * Resolve a registry server entry into a harness McpServerConfig.\n * Prefers npm stdio packages, falls back to pypi, then remotes.\n */\nexport function resolveServerConfig(server: RegistryServer): ResolvedServer {\n const name = deriveConfigName(server.name);\n\n // Strategy 1: Look for an npm stdio package\n const npmPkg = server.packages?.find((p) => p.registryType === 'npm' && p.transport.type === 'stdio');\n if (npmPkg) {\n return resolveStdioPackage(name, server, npmPkg, 'npx');\n }\n\n // Strategy 2: Look for any stdio package with runtimeHint\n const stdioPkg = server.packages?.find((p) => p.transport.type === 'stdio');\n if (stdioPkg) {\n const hint = stdioPkg.runtimeHint ?? (stdioPkg.registryType === 'pypi' ? 'uvx' : 'npx');\n return resolveStdioPackage(name, server, stdioPkg, hint);\n }\n\n // Strategy 3: Look for remotes (HTTP/SSE endpoints)\n if (server.remotes && server.remotes.length > 0) {\n const remote = server.remotes[0];\n return resolveRemote(name, server, remote);\n }\n\n // Strategy 4: Look for any package with HTTP transport\n const httpPkg = server.packages?.find(\n (p) => p.transport.type === 'streamable-http' || p.transport.type === 'sse',\n );\n if (httpPkg) {\n return resolveHttpPackage(name, server, httpPkg);\n }\n\n throw new Error(\n `Cannot resolve MCP server \"${server.name}\": no supported package or remote configuration found`,\n );\n}\n\nfunction resolveStdioPackage(\n name: string,\n server: RegistryServer,\n pkg: RegistryPackage,\n runtimeHint: string,\n): ResolvedServer {\n const runtime = RUNTIME_COMMANDS[runtimeHint] ?? RUNTIME_COMMANDS['npx'];\n const args = [...runtime.prefix, pkg.identifier];\n\n const envVars = pkg.environmentVariables ?? [];\n const env: Record<string, string> = {};\n for (const ev of envVars) {\n env[ev.name] = `\\${${ev.name}}`;\n }\n\n const config: McpServerConfig = {\n transport: 'stdio',\n command: runtime.command,\n args,\n ...(Object.keys(env).length > 0 ? { env } : {}),\n };\n\n return {\n name,\n description: server.description,\n registryName: server.name,\n package: pkg,\n config,\n requiredEnv: envVars.filter((e) => e.isRequired),\n allEnv: envVars,\n };\n}\n\nfunction resolveRemote(\n name: string,\n server: RegistryServer,\n remote: RegistryRemote,\n): ResolvedServer {\n const transport = remote.transportType === 'sse' ? 'sse' as const : 'http' as const;\n\n const config: McpServerConfig = {\n transport,\n url: remote.url,\n ...(remote.headers && Object.keys(remote.headers).length > 0 ? { headers: remote.headers } : {}),\n };\n\n return {\n name,\n description: server.description,\n registryName: server.name,\n remote,\n config,\n requiredEnv: [],\n allEnv: [],\n };\n}\n\nfunction resolveHttpPackage(\n name: string,\n server: RegistryServer,\n pkg: RegistryPackage,\n): ResolvedServer {\n // HTTP packages typically have a URL in the package identifier or need a remote\n const transport = pkg.transport.type === 'sse' ? 'sse' as const : 'http' as const;\n\n const envVars = pkg.environmentVariables ?? [];\n const config: McpServerConfig = {\n transport,\n url: pkg.identifier,\n };\n\n return {\n name,\n description: server.description,\n registryName: server.name,\n package: pkg,\n config,\n requiredEnv: envVars.filter((e) => e.isRequired),\n allEnv: envVars,\n };\n}\n\n/**\n * Search the registry and return the best match for a query.\n * If the query looks like a registry name (contains \"/\" or \".\"), try exact lookup first.\n * Otherwise, search and return the first result.\n */\nexport async function findServer(query: string): Promise<ResolvedServer | null> {\n // If it looks like an exact registry name, try direct lookup\n if (query.includes('/') || query.includes('io.')) {\n try {\n const server = await getRegistryServer(query);\n return resolveServerConfig(server);\n } catch {\n // Fall through to search\n }\n }\n\n // Search the registry\n const results = await searchRegistry(query, { limit: 5 });\n if (results.servers.length === 0) {\n return null;\n }\n\n // Return the first match\n return resolveServerConfig(results.servers[0].server);\n}\n\n/**\n * Search the registry and return all matches for display.\n */\nexport async function searchServers(\n query: string,\n options?: { limit?: number },\n): Promise<ResolvedServer[]> {\n const results = await searchRegistry(query, { limit: options?.limit ?? DEFAULT_SEARCH_LIMIT });\n const resolved: ResolvedServer[] = [];\n\n for (const result of results.servers) {\n try {\n resolved.push(resolveServerConfig(result.server));\n } catch {\n // Skip servers that can't be resolved\n }\n }\n\n return resolved;\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join, basename } from 'path';\n\n// --- Types ---\n\n/** A detected API key from environment files */\nexport interface DetectedApiKey {\n /** Environment variable name */\n name: string;\n /** Which file it was found in */\n source: string;\n /** Whether the value looks like an actual key (not a placeholder) */\n hasValue: boolean;\n /** Suggested MCP server or service this key is for */\n suggestion?: string;\n}\n\n/** Result of scanning environment for API keys */\nexport interface EnvDiscoveryResult {\n /** All detected API keys */\n keys: DetectedApiKey[];\n /** Files that were scanned */\n filesScanned: string[];\n /** Suggested MCP servers based on detected keys */\n suggestions: EnvSuggestion[];\n}\n\n/** Suggested MCP server based on detected environment */\nexport interface EnvSuggestion {\n /** Human-readable suggestion */\n message: string;\n /** MCP server registry name or package */\n serverQuery: string;\n /** Which env var triggered this suggestion */\n triggeredBy: string;\n}\n\n// --- Known API key patterns ---\n\ninterface KeyPattern {\n /** Regex pattern for the env var name */\n pattern: RegExp;\n /** Description of what this key is for */\n service: string;\n /** MCP server search query to suggest */\n serverQuery?: string;\n /** Suggestion message */\n suggestion?: string;\n}\n\nconst KEY_PATTERNS: KeyPattern[] = [\n {\n pattern: /^GITHUB_TOKEN$|^GH_TOKEN$|^GITHUB_PAT$/,\n service: 'GitHub',\n serverQuery: 'github',\n suggestion: 'GitHub MCP server for repository management',\n },\n {\n pattern: /^OPENAI_API_KEY$/,\n service: 'OpenAI',\n serverQuery: 'openai',\n suggestion: 'OpenAI-related MCP tools',\n },\n {\n pattern: /^ANTHROPIC_API_KEY$/,\n service: 'Anthropic',\n },\n {\n pattern: /^GOOGLE_API_KEY$|^GEMINI_API_KEY$/,\n service: 'Google / Gemini',\n serverQuery: 'google',\n suggestion: 'Google MCP server for search, docs, drive',\n },\n {\n pattern: /^SLACK_TOKEN$|^SLACK_BOT_TOKEN$|^SLACK_WEBHOOK_URL$/,\n service: 'Slack',\n serverQuery: 'slack',\n suggestion: 'Slack MCP server for messaging',\n },\n {\n pattern: /^DISCORD_TOKEN$|^DISCORD_BOT_TOKEN$/,\n service: 'Discord',\n serverQuery: 'discord',\n suggestion: 'Discord MCP server for messaging',\n },\n {\n pattern: /^NOTION_API_KEY$|^NOTION_TOKEN$/,\n service: 'Notion',\n serverQuery: 'notion',\n suggestion: 'Notion MCP server for workspace access',\n },\n {\n pattern: /^LINEAR_API_KEY$/,\n service: 'Linear',\n serverQuery: 'linear',\n suggestion: 'Linear MCP server for issue tracking',\n },\n {\n pattern: /^JIRA_API_TOKEN$|^JIRA_TOKEN$/,\n service: 'Jira',\n serverQuery: 'jira',\n suggestion: 'Jira MCP server for issue tracking',\n },\n {\n pattern: /^POSTGRES_URL$|^DATABASE_URL$|^POSTGRES_CONNECTION$/,\n service: 'PostgreSQL',\n serverQuery: 'postgres',\n suggestion: 'PostgreSQL MCP server for database access',\n },\n {\n pattern: /^SUPABASE_URL$|^SUPABASE_KEY$|^SUPABASE_SERVICE_ROLE_KEY$/,\n service: 'Supabase',\n serverQuery: 'supabase',\n suggestion: 'Supabase MCP server for database and auth',\n },\n {\n pattern: /^FIREBASE_TOKEN$|^FIREBASE_API_KEY$/,\n service: 'Firebase',\n serverQuery: 'firebase',\n suggestion: 'Firebase MCP server',\n },\n {\n pattern: /^AWS_ACCESS_KEY_ID$|^AWS_SECRET_ACCESS_KEY$/,\n service: 'AWS',\n serverQuery: 'aws',\n suggestion: 'AWS MCP server for cloud services',\n },\n {\n pattern: /^SENTRY_DSN$|^SENTRY_AUTH_TOKEN$/,\n service: 'Sentry',\n serverQuery: 'sentry',\n suggestion: 'Sentry MCP server for error tracking',\n },\n {\n pattern: /^STRIPE_SECRET_KEY$|^STRIPE_API_KEY$/,\n service: 'Stripe',\n serverQuery: 'stripe',\n suggestion: 'Stripe MCP server for payment management',\n },\n {\n pattern: /^TWILIO_AUTH_TOKEN$|^TWILIO_ACCOUNT_SID$/,\n service: 'Twilio',\n serverQuery: 'twilio',\n suggestion: 'Twilio MCP server for SMS and voice',\n },\n {\n pattern: /^SENDGRID_API_KEY$/,\n service: 'SendGrid',\n serverQuery: 'sendgrid',\n suggestion: 'SendGrid/email MCP server',\n },\n {\n pattern: /^VERCEL_TOKEN$/,\n service: 'Vercel',\n serverQuery: 'vercel',\n suggestion: 'Vercel MCP server for deployment management',\n },\n {\n pattern: /^CLOUDFLARE_API_TOKEN$/,\n service: 'Cloudflare',\n serverQuery: 'cloudflare',\n suggestion: 'Cloudflare MCP server',\n },\n {\n pattern: /^BRAVE_API_KEY$/,\n service: 'Brave Search',\n serverQuery: 'brave-search',\n suggestion: 'Brave Search MCP server for web search',\n },\n {\n pattern: /^TAVILY_API_KEY$/,\n service: 'Tavily',\n serverQuery: 'tavily',\n suggestion: 'Tavily MCP server for web search',\n },\n {\n pattern: /^VOYAGE_API_KEY$/,\n service: 'Voyage AI',\n },\n {\n pattern: /^JINA_API_KEY$/,\n service: 'Jina AI',\n },\n {\n pattern: /^PINECONE_API_KEY$/,\n service: 'Pinecone',\n serverQuery: 'pinecone',\n suggestion: 'Pinecone MCP server for vector search',\n },\n {\n pattern: /^REDIS_URL$|^REDIS_HOST$/,\n service: 'Redis',\n serverQuery: 'redis',\n suggestion: 'Redis MCP server for caching/data',\n },\n {\n pattern: /^MONGODB_URI$|^MONGO_URL$/,\n service: 'MongoDB',\n serverQuery: 'mongodb',\n suggestion: 'MongoDB MCP server for database access',\n },\n];\n\n// Catch-all for generic API key patterns\nconst GENERIC_KEY_REGEX = /^[A-Z][A-Z0-9_]*(?:API_KEY|SECRET_KEY|AUTH_TOKEN|ACCESS_TOKEN|_TOKEN|_SECRET|_KEY)$/;\n\n// --- Parsing ---\n\n/**\n * Parse a .env file and extract variable names and whether they have real values.\n * Handles comments, empty values, and quoted values.\n */\nexport function parseEnvFile(content: string): Array<{ name: string; hasValue: boolean }> {\n const results: Array<{ name: string; hasValue: boolean }> = [];\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex <= 0) continue;\n\n const name = trimmed.slice(0, eqIndex).trim();\n const rawValue = trimmed.slice(eqIndex + 1).trim();\n\n // Strip surrounding quotes\n let value = rawValue;\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n\n // Check if the value looks like a placeholder\n const isPlaceholder = !value ||\n value === 'your-key-here' ||\n value === 'CHANGE_ME' ||\n value === 'xxx' ||\n value.startsWith('$') ||\n value.startsWith('${');\n\n results.push({ name, hasValue: !isPlaceholder });\n }\n\n return results;\n}\n\n/**\n * Match a detected key name against known patterns.\n */\nfunction matchKeyPattern(name: string): KeyPattern | undefined {\n return KEY_PATTERNS.find((p) => p.pattern.test(name));\n}\n\n// --- Main Discovery ---\n\n/** Options for environment discovery */\nexport interface EnvDiscoveryOptions {\n /** Directory to scan (defaults to cwd) */\n dir?: string;\n /** Additional directories to scan for .env files */\n extraDirs?: string[];\n}\n\n/**\n * Scan for .env files and detect API keys with suggestions.\n */\nexport function discoverEnvKeys(options?: EnvDiscoveryOptions): EnvDiscoveryResult {\n const dir = options?.dir ?? process.cwd();\n const keys: DetectedApiKey[] = [];\n const filesScanned: string[] = [];\n const seenNames = new Set<string>();\n\n // Files to scan in the harness directory\n const envFiles = ['.env', '.env.local', '.env.development', '.env.production'];\n\n for (const envFile of envFiles) {\n const filePath = join(dir, envFile);\n if (!existsSync(filePath)) continue;\n\n filesScanned.push(filePath);\n const content = readFileSync(filePath, 'utf-8');\n const parsed = parseEnvFile(content);\n\n for (const { name, hasValue } of parsed) {\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n\n // Check against known patterns\n const pattern = matchKeyPattern(name);\n\n // Only include keys that match known patterns or generic API key patterns\n if (pattern || GENERIC_KEY_REGEX.test(name)) {\n keys.push({\n name,\n source: basename(filePath),\n hasValue,\n suggestion: pattern?.suggestion,\n });\n }\n }\n }\n\n // Also scan extra directories (e.g., parent project directory)\n if (options?.extraDirs) {\n for (const extraDir of options.extraDirs) {\n for (const envFile of envFiles) {\n const filePath = join(extraDir, envFile);\n if (!existsSync(filePath)) continue;\n\n filesScanned.push(filePath);\n const content = readFileSync(filePath, 'utf-8');\n const parsed = parseEnvFile(content);\n\n for (const { name, hasValue } of parsed) {\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n\n const pattern = matchKeyPattern(name);\n if (pattern || GENERIC_KEY_REGEX.test(name)) {\n keys.push({\n name,\n source: basename(filePath),\n hasValue,\n suggestion: pattern?.suggestion,\n });\n }\n }\n }\n }\n }\n\n // Generate suggestions from detected keys\n const suggestions: EnvSuggestion[] = [];\n const suggestedQueries = new Set<string>();\n\n for (const key of keys) {\n const pattern = matchKeyPattern(key.name);\n if (pattern?.serverQuery && pattern.suggestion && !suggestedQueries.has(pattern.serverQuery)) {\n suggestedQueries.add(pattern.serverQuery);\n suggestions.push({\n message: pattern.suggestion,\n serverQuery: pattern.serverQuery,\n triggeredBy: key.name,\n });\n }\n }\n\n return { keys, filesScanned, suggestions };\n}\n","import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, basename } from 'path';\n\n// --- Types ---\n\n/** A detected project characteristic */\nexport interface ProjectSignal {\n /** What was detected (e.g. \"TypeScript\", \"React\", \"Docker\") */\n name: string;\n /** Category of signal */\n category: 'language' | 'framework' | 'tool' | 'runtime' | 'database' | 'cloud' | 'testing';\n /** Source file that triggered the detection */\n source: string;\n /** Additional details */\n details?: string;\n}\n\n/** Suggested rule, skill, or MCP server */\nexport interface ProjectSuggestion {\n /** What type of thing to add */\n type: 'rule' | 'skill' | 'mcp-server';\n /** Human-readable suggestion */\n message: string;\n /** File to create (for rules/skills) or server query (for MCP) */\n target: string;\n /** Triggered by these signals */\n signals: string[];\n}\n\n/** Full project discovery result */\nexport interface ProjectDiscoveryResult {\n /** Detected project signals */\n signals: ProjectSignal[];\n /** Files that were examined */\n filesExamined: string[];\n /** Suggestions based on signals */\n suggestions: ProjectSuggestion[];\n}\n\n// --- Detection Functions ---\n\ninterface DetectionRule {\n file: string;\n detect: (content: string, dir: string) => ProjectSignal[];\n}\n\nfunction detectPackageJson(content: string): ProjectSignal[] {\n const signals: ProjectSignal[] = [];\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(content);\n } catch {\n return signals;\n }\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n // Language\n if (allDeps['typescript'] || existsSync('tsconfig.json')) {\n signals.push({ name: 'TypeScript', category: 'language', source: 'package.json' });\n }\n\n // Frameworks\n const frameworks: Record<string, { name: string; category: ProjectSignal['category'] }> = {\n 'react': { name: 'React', category: 'framework' },\n 'next': { name: 'Next.js', category: 'framework' },\n 'vue': { name: 'Vue', category: 'framework' },\n 'nuxt': { name: 'Nuxt', category: 'framework' },\n 'svelte': { name: 'Svelte', category: 'framework' },\n '@angular/core': { name: 'Angular', category: 'framework' },\n 'express': { name: 'Express', category: 'framework' },\n 'fastify': { name: 'Fastify', category: 'framework' },\n 'hono': { name: 'Hono', category: 'framework' },\n 'astro': { name: 'Astro', category: 'framework' },\n 'remix': { name: 'Remix', category: 'framework' },\n '@remix-run/node': { name: 'Remix', category: 'framework' },\n 'electron': { name: 'Electron', category: 'framework' },\n };\n\n for (const [dep, info] of Object.entries(frameworks)) {\n if (allDeps[dep]) {\n signals.push({ name: info.name, category: info.category, source: 'package.json', details: `v${allDeps[dep]}` });\n }\n }\n\n // Testing\n const testLibs: Record<string, string> = {\n 'vitest': 'Vitest',\n 'jest': 'Jest',\n 'mocha': 'Mocha',\n '@playwright/test': 'Playwright',\n 'cypress': 'Cypress',\n };\n\n for (const [dep, name] of Object.entries(testLibs)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'testing', source: 'package.json' });\n }\n }\n\n // Databases\n const dbLibs: Record<string, string> = {\n 'prisma': 'Prisma',\n '@prisma/client': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n 'mongoose': 'MongoDB (Mongoose)',\n 'pg': 'PostgreSQL',\n 'mysql2': 'MySQL',\n 'better-sqlite3': 'SQLite',\n 'redis': 'Redis',\n 'ioredis': 'Redis',\n };\n\n for (const [dep, name] of Object.entries(dbLibs)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'database', source: 'package.json' });\n }\n }\n\n // Tools\n const tools: Record<string, string> = {\n 'eslint': 'ESLint',\n 'prettier': 'Prettier',\n 'tailwindcss': 'Tailwind CSS',\n 'storybook': 'Storybook',\n '@storybook/react': 'Storybook',\n 'docker-compose': 'Docker Compose',\n };\n\n for (const [dep, name] of Object.entries(tools)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'tool', source: 'package.json' });\n }\n }\n\n return signals;\n}\n\nfunction detectFromFiles(dir: string): ProjectSignal[] {\n const signals: ProjectSignal[] = [];\n const entries = new Set<string>();\n\n try {\n for (const e of readdirSync(dir)) {\n entries.add(e);\n }\n } catch {\n return signals;\n }\n\n // Config files\n if (entries.has('Dockerfile') || entries.has('docker-compose.yml') || entries.has('docker-compose.yaml')) {\n signals.push({ name: 'Docker', category: 'runtime', source: 'Dockerfile' });\n }\n\n if (entries.has('.github')) {\n signals.push({ name: 'GitHub Actions', category: 'tool', source: '.github/' });\n }\n\n if (entries.has('Makefile')) {\n signals.push({ name: 'Make', category: 'tool', source: 'Makefile' });\n }\n\n if (entries.has('pyproject.toml') || entries.has('setup.py') || entries.has('requirements.txt')) {\n signals.push({ name: 'Python', category: 'language', source: 'pyproject.toml' });\n }\n\n if (entries.has('Cargo.toml')) {\n signals.push({ name: 'Rust', category: 'language', source: 'Cargo.toml' });\n }\n\n if (entries.has('go.mod')) {\n signals.push({ name: 'Go', category: 'language', source: 'go.mod' });\n }\n\n if (entries.has('Gemfile')) {\n signals.push({ name: 'Ruby', category: 'language', source: 'Gemfile' });\n }\n\n if (entries.has('.terraform') || entries.has('main.tf')) {\n signals.push({ name: 'Terraform', category: 'cloud', source: 'main.tf' });\n }\n\n if (entries.has('serverless.yml') || entries.has('serverless.yaml')) {\n signals.push({ name: 'Serverless Framework', category: 'cloud', source: 'serverless.yml' });\n }\n\n if (entries.has('vercel.json')) {\n signals.push({ name: 'Vercel', category: 'cloud', source: 'vercel.json' });\n }\n\n if (entries.has('netlify.toml')) {\n signals.push({ name: 'Netlify', category: 'cloud', source: 'netlify.toml' });\n }\n\n if (entries.has('wrangler.toml') || entries.has('wrangler.jsonc')) {\n signals.push({ name: 'Cloudflare Workers', category: 'cloud', source: 'wrangler.toml' });\n }\n\n if (entries.has('.prisma') || entries.has('prisma')) {\n signals.push({ name: 'Prisma', category: 'database', source: 'prisma/' });\n }\n\n if (entries.has('supabase')) {\n signals.push({ name: 'Supabase', category: 'database', source: 'supabase/' });\n }\n\n return signals;\n}\n\n// --- Suggestion Engine ---\n\ninterface SuggestionRule {\n signals: string[];\n type: ProjectSuggestion['type'];\n message: string;\n target: string;\n}\n\nconst SUGGESTION_RULES: SuggestionRule[] = [\n {\n signals: ['TypeScript'],\n type: 'rule',\n message: 'Add a TypeScript coding standards rule',\n target: 'rules/typescript-standards.md',\n },\n {\n signals: ['React'],\n type: 'rule',\n message: 'Add React component patterns rule',\n target: 'rules/react-patterns.md',\n },\n {\n signals: ['Next.js'],\n type: 'skill',\n message: 'Add Next.js development skill',\n target: 'skills/nextjs.md',\n },\n {\n signals: ['Docker'],\n type: 'rule',\n message: 'Add Docker/containerization rule',\n target: 'rules/docker.md',\n },\n {\n signals: ['GitHub Actions'],\n type: 'skill',\n message: 'Add CI/CD pipeline skill',\n target: 'skills/ci-cd.md',\n },\n {\n signals: ['PostgreSQL', 'Prisma'],\n type: 'mcp-server',\n message: 'Install PostgreSQL MCP server for database access',\n target: 'postgres',\n },\n {\n signals: ['Supabase'],\n type: 'mcp-server',\n message: 'Install Supabase MCP server',\n target: 'supabase',\n },\n {\n signals: ['ESLint'],\n type: 'rule',\n message: 'Add linting standards rule',\n target: 'rules/linting.md',\n },\n {\n signals: ['Vitest', 'Jest'],\n type: 'rule',\n message: 'Add testing standards rule',\n target: 'rules/testing.md',\n },\n {\n signals: ['Tailwind CSS'],\n type: 'rule',\n message: 'Add styling conventions rule',\n target: 'rules/styling.md',\n },\n];\n\nfunction generateSuggestions(signals: ProjectSignal[]): ProjectSuggestion[] {\n const signalNames = new Set(signals.map((s) => s.name));\n const suggestions: ProjectSuggestion[] = [];\n\n for (const rule of SUGGESTION_RULES) {\n // Check if ANY of the required signals are present\n const matchedSignals = rule.signals.filter((s) => signalNames.has(s));\n if (matchedSignals.length > 0) {\n suggestions.push({\n type: rule.type,\n message: rule.message,\n target: rule.target,\n signals: matchedSignals,\n });\n }\n }\n\n return suggestions;\n}\n\n// --- Main Discovery ---\n\n/** Options for project discovery */\nexport interface ProjectDiscoveryOptions {\n /** Project directory to scan */\n dir?: string;\n}\n\n/**\n * Scan a project directory to detect its technology stack and suggest\n * rules, skills, and MCP servers.\n */\nexport function discoverProjectContext(options?: ProjectDiscoveryOptions): ProjectDiscoveryResult {\n const dir = options?.dir ?? process.cwd();\n const signals: ProjectSignal[] = [];\n const filesExamined: string[] = [];\n\n // Scan package.json\n const packageJsonPath = join(dir, 'package.json');\n if (existsSync(packageJsonPath)) {\n filesExamined.push(packageJsonPath);\n const content = readFileSync(packageJsonPath, 'utf-8');\n signals.push(...detectPackageJson(content));\n }\n\n // Scan directory for files/folders\n filesExamined.push(dir);\n signals.push(...detectFromFiles(dir));\n\n // Deduplicate signals by name\n const seen = new Set<string>();\n const uniqueSignals = signals.filter((s) => {\n if (seen.has(s.name)) return false;\n seen.add(s.name);\n return true;\n });\n\n // Generate suggestions\n const suggestions = generateSuggestions(uniqueSignals);\n\n return {\n signals: uniqueSignals,\n filesExamined,\n suggestions,\n };\n}\n","// src/compose.ts\nvar compose = (middleware, onError, onNotFound) => {\n return (context, next) => {\n let index = -1;\n return dispatch(0);\n async function dispatch(i) {\n if (i <= index) {\n throw new Error(\"next() called multiple times\");\n }\n index = i;\n let res;\n let isError = false;\n let handler;\n if (middleware[i]) {\n handler = middleware[i][0][0];\n context.req.routeIndex = i;\n } else {\n handler = i === middleware.length && next || void 0;\n }\n if (handler) {\n try {\n res = await handler(context, () => dispatch(i + 1));\n } catch (err) {\n if (err instanceof Error && onError) {\n context.error = err;\n res = await onError(err, context);\n isError = true;\n } else {\n throw err;\n }\n }\n } else {\n if (context.finalized === false && onNotFound) {\n res = await onNotFound(context);\n }\n }\n if (res && (context.finalized === false || isError)) {\n context.res = res;\n }\n return context;\n }\n };\n};\nexport {\n compose\n};\n","// src/request/constants.ts\nvar GET_MATCH_RESULT = /* @__PURE__ */ Symbol();\nexport {\n GET_MATCH_RESULT\n};\n","// src/utils/body.ts\nimport { HonoRequest } from \"../request.js\";\nvar parseBody = async (request, options = /* @__PURE__ */ Object.create(null)) => {\n const { all = false, dot = false } = options;\n const headers = request instanceof HonoRequest ? request.raw.headers : request.headers;\n const contentType = headers.get(\"Content-Type\");\n if (contentType?.startsWith(\"multipart/form-data\") || contentType?.startsWith(\"application/x-www-form-urlencoded\")) {\n return parseFormData(request, { all, dot });\n }\n return {};\n};\nasync function parseFormData(request, options) {\n const formData = await request.formData();\n if (formData) {\n return convertFormDataToBodyData(formData, options);\n }\n return {};\n}\nfunction convertFormDataToBodyData(formData, options) {\n const form = /* @__PURE__ */ Object.create(null);\n formData.forEach((value, key) => {\n const shouldParseAllValues = options.all || key.endsWith(\"[]\");\n if (!shouldParseAllValues) {\n form[key] = value;\n } else {\n handleParsingAllValues(form, key, value);\n }\n });\n if (options.dot) {\n Object.entries(form).forEach(([key, value]) => {\n const shouldParseDotValues = key.includes(\".\");\n if (shouldParseDotValues) {\n handleParsingNestedValues(form, key, value);\n delete form[key];\n }\n });\n }\n return form;\n}\nvar handleParsingAllValues = (form, key, value) => {\n if (form[key] !== void 0) {\n if (Array.isArray(form[key])) {\n ;\n form[key].push(value);\n } else {\n form[key] = [form[key], value];\n }\n } else {\n if (!key.endsWith(\"[]\")) {\n form[key] = value;\n } else {\n form[key] = [value];\n }\n }\n};\nvar handleParsingNestedValues = (form, key, value) => {\n if (/(?:^|\\.)__proto__\\./.test(key)) {\n return;\n }\n let nestedForm = form;\n const keys = key.split(\".\");\n keys.forEach((key2, index) => {\n if (index === keys.length - 1) {\n nestedForm[key2] = value;\n } else {\n if (!nestedForm[key2] || typeof nestedForm[key2] !== \"object\" || Array.isArray(nestedForm[key2]) || nestedForm[key2] instanceof File) {\n nestedForm[key2] = /* @__PURE__ */ Object.create(null);\n }\n nestedForm = nestedForm[key2];\n }\n });\n};\nexport {\n parseBody\n};\n","// src/utils/url.ts\nvar splitPath = (path) => {\n const paths = path.split(\"/\");\n if (paths[0] === \"\") {\n paths.shift();\n }\n return paths;\n};\nvar splitRoutingPath = (routePath) => {\n const { groups, path } = extractGroupsFromPath(routePath);\n const paths = splitPath(path);\n return replaceGroupMarks(paths, groups);\n};\nvar extractGroupsFromPath = (path) => {\n const groups = [];\n path = path.replace(/\\{[^}]+\\}/g, (match, index) => {\n const mark = `@${index}`;\n groups.push([mark, match]);\n return mark;\n });\n return { groups, path };\n};\nvar replaceGroupMarks = (paths, groups) => {\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = paths.length - 1; j >= 0; j--) {\n if (paths[j].includes(mark)) {\n paths[j] = paths[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n return paths;\n};\nvar patternCache = {};\nvar getPattern = (label, next) => {\n if (label === \"*\") {\n return \"*\";\n }\n const match = label.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n if (match) {\n const cacheKey = `${label}#${next}`;\n if (!patternCache[cacheKey]) {\n if (match[2]) {\n patternCache[cacheKey] = next && next[0] !== \":\" && next[0] !== \"*\" ? [cacheKey, match[1], new RegExp(`^${match[2]}(?=/${next})`)] : [label, match[1], new RegExp(`^${match[2]}$`)];\n } else {\n patternCache[cacheKey] = [label, match[1], true];\n }\n }\n return patternCache[cacheKey];\n }\n return null;\n};\nvar tryDecode = (str, decoder) => {\n try {\n return decoder(str);\n } catch {\n return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {\n try {\n return decoder(match);\n } catch {\n return match;\n }\n });\n }\n};\nvar tryDecodeURI = (str) => tryDecode(str, decodeURI);\nvar getPath = (request) => {\n const url = request.url;\n const start = url.indexOf(\"/\", url.indexOf(\":\") + 4);\n let i = start;\n for (; i < url.length; i++) {\n const charCode = url.charCodeAt(i);\n if (charCode === 37) {\n const queryIndex = url.indexOf(\"?\", i);\n const hashIndex = url.indexOf(\"#\", i);\n const end = queryIndex === -1 ? hashIndex === -1 ? void 0 : hashIndex : hashIndex === -1 ? queryIndex : Math.min(queryIndex, hashIndex);\n const path = url.slice(start, end);\n return tryDecodeURI(path.includes(\"%25\") ? path.replace(/%25/g, \"%2525\") : path);\n } else if (charCode === 63 || charCode === 35) {\n break;\n }\n }\n return url.slice(start, i);\n};\nvar getQueryStrings = (url) => {\n const queryIndex = url.indexOf(\"?\", 8);\n return queryIndex === -1 ? \"\" : \"?\" + url.slice(queryIndex + 1);\n};\nvar getPathNoStrict = (request) => {\n const result = getPath(request);\n return result.length > 1 && result.at(-1) === \"/\" ? result.slice(0, -1) : result;\n};\nvar mergePath = (base, sub, ...rest) => {\n if (rest.length) {\n sub = mergePath(sub, ...rest);\n }\n return `${base?.[0] === \"/\" ? \"\" : \"/\"}${base}${sub === \"/\" ? \"\" : `${base?.at(-1) === \"/\" ? \"\" : \"/\"}${sub?.[0] === \"/\" ? sub.slice(1) : sub}`}`;\n};\nvar checkOptionalParameter = (path) => {\n if (path.charCodeAt(path.length - 1) !== 63 || !path.includes(\":\")) {\n return null;\n }\n const segments = path.split(\"/\");\n const results = [];\n let basePath = \"\";\n segments.forEach((segment) => {\n if (segment !== \"\" && !/\\:/.test(segment)) {\n basePath += \"/\" + segment;\n } else if (/\\:/.test(segment)) {\n if (/\\?/.test(segment)) {\n if (results.length === 0 && basePath === \"\") {\n results.push(\"/\");\n } else {\n results.push(basePath);\n }\n const optionalSegment = segment.replace(\"?\", \"\");\n basePath += \"/\" + optionalSegment;\n results.push(basePath);\n } else {\n basePath += \"/\" + segment;\n }\n }\n });\n return results.filter((v, i, a) => a.indexOf(v) === i);\n};\nvar _decodeURI = (value) => {\n if (!/[%+]/.test(value)) {\n return value;\n }\n if (value.indexOf(\"+\") !== -1) {\n value = value.replace(/\\+/g, \" \");\n }\n return value.indexOf(\"%\") !== -1 ? tryDecode(value, decodeURIComponent_) : value;\n};\nvar _getQueryParam = (url, key, multiple) => {\n let encoded;\n if (!multiple && key && !/[%+]/.test(key)) {\n let keyIndex2 = url.indexOf(\"?\", 8);\n if (keyIndex2 === -1) {\n return void 0;\n }\n if (!url.startsWith(key, keyIndex2 + 1)) {\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n while (keyIndex2 !== -1) {\n const trailingKeyCode = url.charCodeAt(keyIndex2 + key.length + 1);\n if (trailingKeyCode === 61) {\n const valueIndex = keyIndex2 + key.length + 2;\n const endIndex = url.indexOf(\"&\", valueIndex);\n return _decodeURI(url.slice(valueIndex, endIndex === -1 ? void 0 : endIndex));\n } else if (trailingKeyCode == 38 || isNaN(trailingKeyCode)) {\n return \"\";\n }\n keyIndex2 = url.indexOf(`&${key}`, keyIndex2 + 1);\n }\n encoded = /[%+]/.test(url);\n if (!encoded) {\n return void 0;\n }\n }\n const results = {};\n encoded ??= /[%+]/.test(url);\n let keyIndex = url.indexOf(\"?\", 8);\n while (keyIndex !== -1) {\n const nextKeyIndex = url.indexOf(\"&\", keyIndex + 1);\n let valueIndex = url.indexOf(\"=\", keyIndex);\n if (valueIndex > nextKeyIndex && nextKeyIndex !== -1) {\n valueIndex = -1;\n }\n let name = url.slice(\n keyIndex + 1,\n valueIndex === -1 ? nextKeyIndex === -1 ? void 0 : nextKeyIndex : valueIndex\n );\n if (encoded) {\n name = _decodeURI(name);\n }\n keyIndex = nextKeyIndex;\n if (name === \"\") {\n continue;\n }\n let value;\n if (valueIndex === -1) {\n value = \"\";\n } else {\n value = url.slice(valueIndex + 1, nextKeyIndex === -1 ? void 0 : nextKeyIndex);\n if (encoded) {\n value = _decodeURI(value);\n }\n }\n if (multiple) {\n if (!(results[name] && Array.isArray(results[name]))) {\n results[name] = [];\n }\n ;\n results[name].push(value);\n } else {\n results[name] ??= value;\n }\n }\n return key ? results[key] : results;\n};\nvar getQueryParam = _getQueryParam;\nvar getQueryParams = (url, key) => {\n return _getQueryParam(url, key, true);\n};\nvar decodeURIComponent_ = decodeURIComponent;\nexport {\n checkOptionalParameter,\n decodeURIComponent_,\n getPath,\n getPathNoStrict,\n getPattern,\n getQueryParam,\n getQueryParams,\n getQueryStrings,\n mergePath,\n splitPath,\n splitRoutingPath,\n tryDecode,\n tryDecodeURI\n};\n","// src/request.ts\nimport { HTTPException } from \"./http-exception.js\";\nimport { GET_MATCH_RESULT } from \"./request/constants.js\";\nimport { parseBody } from \"./utils/body.js\";\nimport { decodeURIComponent_, getQueryParam, getQueryParams, tryDecode } from \"./utils/url.js\";\nvar tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_);\nvar HonoRequest = class {\n /**\n * `.raw` can get the raw Request object.\n *\n * @see {@link https://hono.dev/docs/api/request#raw}\n *\n * @example\n * ```ts\n * // For Cloudflare Workers\n * app.post('/', async (c) => {\n * const metadata = c.req.raw.cf?.hostMetadata?\n * ...\n * })\n * ```\n */\n raw;\n #validatedData;\n // Short name of validatedData\n #matchResult;\n routeIndex = 0;\n /**\n * `.path` can get the pathname of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#path}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const pathname = c.req.path // `/about/me`\n * })\n * ```\n */\n path;\n bodyCache = {};\n constructor(request, path = \"/\", matchResult = [[]]) {\n this.raw = request;\n this.path = path;\n this.#matchResult = matchResult;\n this.#validatedData = {};\n }\n param(key) {\n return key ? this.#getDecodedParam(key) : this.#getAllDecodedParams();\n }\n #getDecodedParam(key) {\n const paramKey = this.#matchResult[0][this.routeIndex][1][key];\n const param = this.#getParamValue(paramKey);\n return param && /\\%/.test(param) ? tryDecodeURIComponent(param) : param;\n }\n #getAllDecodedParams() {\n const decoded = {};\n const keys = Object.keys(this.#matchResult[0][this.routeIndex][1]);\n for (const key of keys) {\n const value = this.#getParamValue(this.#matchResult[0][this.routeIndex][1][key]);\n if (value !== void 0) {\n decoded[key] = /\\%/.test(value) ? tryDecodeURIComponent(value) : value;\n }\n }\n return decoded;\n }\n #getParamValue(paramKey) {\n return this.#matchResult[1] ? this.#matchResult[1][paramKey] : paramKey;\n }\n query(key) {\n return getQueryParam(this.url, key);\n }\n queries(key) {\n return getQueryParams(this.url, key);\n }\n header(name) {\n if (name) {\n return this.raw.headers.get(name) ?? void 0;\n }\n const headerData = {};\n this.raw.headers.forEach((value, key) => {\n headerData[key] = value;\n });\n return headerData;\n }\n async parseBody(options) {\n return parseBody(this, options);\n }\n #cachedBody = (key) => {\n const { bodyCache, raw } = this;\n const cachedBody = bodyCache[key];\n if (cachedBody) {\n return cachedBody;\n }\n const anyCachedKey = Object.keys(bodyCache)[0];\n if (anyCachedKey) {\n return bodyCache[anyCachedKey].then((body) => {\n if (anyCachedKey === \"json\") {\n body = JSON.stringify(body);\n }\n return new Response(body)[key]();\n });\n }\n return bodyCache[key] = raw[key]();\n };\n /**\n * `.json()` can parse Request body of type `application/json`\n *\n * @see {@link https://hono.dev/docs/api/request#json}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.json()\n * })\n * ```\n */\n json() {\n return this.#cachedBody(\"text\").then((text) => JSON.parse(text));\n }\n /**\n * `.text()` can parse Request body of type `text/plain`\n *\n * @see {@link https://hono.dev/docs/api/request#text}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.text()\n * })\n * ```\n */\n text() {\n return this.#cachedBody(\"text\");\n }\n /**\n * `.arrayBuffer()` parse Request body as an `ArrayBuffer`\n *\n * @see {@link https://hono.dev/docs/api/request#arraybuffer}\n *\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.arrayBuffer()\n * })\n * ```\n */\n arrayBuffer() {\n return this.#cachedBody(\"arrayBuffer\");\n }\n /**\n * Parses the request body as a `Blob`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.blob();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#blob\n */\n blob() {\n return this.#cachedBody(\"blob\");\n }\n /**\n * Parses the request body as `FormData`.\n * @example\n * ```ts\n * app.post('/entry', async (c) => {\n * const body = await c.req.formData();\n * });\n * ```\n * @see https://hono.dev/docs/api/request#formdata\n */\n formData() {\n return this.#cachedBody(\"formData\");\n }\n /**\n * Adds validated data to the request.\n *\n * @param target - The target of the validation.\n * @param data - The validated data to add.\n */\n addValidatedData(target, data) {\n this.#validatedData[target] = data;\n }\n valid(target) {\n return this.#validatedData[target];\n }\n /**\n * `.url()` can get the request url strings.\n *\n * @see {@link https://hono.dev/docs/api/request#url}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const url = c.req.url // `http://localhost:8787/about/me`\n * ...\n * })\n * ```\n */\n get url() {\n return this.raw.url;\n }\n /**\n * `.method()` can get the method name of the request.\n *\n * @see {@link https://hono.dev/docs/api/request#method}\n *\n * @example\n * ```ts\n * app.get('/about/me', (c) => {\n * const method = c.req.method // `GET`\n * })\n * ```\n */\n get method() {\n return this.raw.method;\n }\n get [GET_MATCH_RESULT]() {\n return this.#matchResult;\n }\n /**\n * `.matchedRoutes()` can return a matched route in the handler\n *\n * @deprecated\n *\n * Use matchedRoutes helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#matchedroutes}\n *\n * @example\n * ```ts\n * app.use('*', async function logger(c, next) {\n * await next()\n * c.req.matchedRoutes.forEach(({ handler, method, path }, i) => {\n * const name = handler.name || (handler.length < 2 ? '[handler]' : '[middleware]')\n * console.log(\n * method,\n * ' ',\n * path,\n * ' '.repeat(Math.max(10 - path.length, 0)),\n * name,\n * i === c.req.routeIndex ? '<- respond from here' : ''\n * )\n * })\n * })\n * ```\n */\n get matchedRoutes() {\n return this.#matchResult[0].map(([[, route]]) => route);\n }\n /**\n * `routePath()` can retrieve the path registered within the handler\n *\n * @deprecated\n *\n * Use routePath helper defined in \"hono/route\" instead.\n *\n * @see {@link https://hono.dev/docs/api/request#routepath}\n *\n * @example\n * ```ts\n * app.get('/posts/:id', (c) => {\n * return c.json({ path: c.req.routePath })\n * })\n * ```\n */\n get routePath() {\n return this.#matchResult[0].map(([[, route]]) => route)[this.routeIndex].path;\n }\n};\nvar cloneRawRequest = async (req) => {\n if (!req.raw.bodyUsed) {\n return req.raw.clone();\n }\n const cacheKey = Object.keys(req.bodyCache)[0];\n if (!cacheKey) {\n throw new HTTPException(500, {\n message: \"Cannot clone request: body was already consumed and not cached. Please use HonoRequest methods (e.g., req.json(), req.text()) instead of consuming req.raw directly.\"\n });\n }\n const requestInit = {\n body: await req[cacheKey](),\n cache: req.raw.cache,\n credentials: req.raw.credentials,\n headers: req.header(),\n integrity: req.raw.integrity,\n keepalive: req.raw.keepalive,\n method: req.method,\n mode: req.raw.mode,\n redirect: req.raw.redirect,\n referrer: req.raw.referrer,\n referrerPolicy: req.raw.referrerPolicy,\n signal: req.raw.signal\n };\n return new Request(req.url, requestInit);\n};\nexport {\n HonoRequest,\n cloneRawRequest\n};\n","// src/utils/html.ts\nvar HtmlEscapedCallbackPhase = {\n Stringify: 1,\n BeforeStream: 2,\n Stream: 3\n};\nvar raw = (value, callbacks) => {\n const escapedString = new String(value);\n escapedString.isEscaped = true;\n escapedString.callbacks = callbacks;\n return escapedString;\n};\nvar escapeRe = /[&<>'\"]/;\nvar stringBufferToString = async (buffer, callbacks) => {\n let str = \"\";\n callbacks ||= [];\n const resolvedBuffer = await Promise.all(buffer);\n for (let i = resolvedBuffer.length - 1; ; i--) {\n str += resolvedBuffer[i];\n i--;\n if (i < 0) {\n break;\n }\n let r = resolvedBuffer[i];\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n const isEscaped = r.isEscaped;\n r = await (typeof r === \"object\" ? r.toString() : r);\n if (typeof r === \"object\") {\n callbacks.push(...r.callbacks || []);\n }\n if (r.isEscaped ?? isEscaped) {\n str += r;\n } else {\n const buf = [str];\n escapeToBuffer(r, buf);\n str = buf[0];\n }\n }\n return raw(str, callbacks);\n};\nvar escapeToBuffer = (str, buffer) => {\n const match = str.search(escapeRe);\n if (match === -1) {\n buffer[0] += str;\n return;\n }\n let escape;\n let index;\n let lastIndex = 0;\n for (index = match; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escape = \"&quot;\";\n break;\n case 39:\n escape = \"&#39;\";\n break;\n case 38:\n escape = \"&amp;\";\n break;\n case 60:\n escape = \"&lt;\";\n break;\n case 62:\n escape = \"&gt;\";\n break;\n default:\n continue;\n }\n buffer[0] += str.substring(lastIndex, index) + escape;\n lastIndex = index + 1;\n }\n buffer[0] += str.substring(lastIndex, index);\n};\nvar resolveCallbackSync = (str) => {\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return str;\n }\n const buffer = [str];\n const context = {};\n callbacks.forEach((c) => c({ phase: HtmlEscapedCallbackPhase.Stringify, buffer, context }));\n return buffer[0];\n};\nvar resolveCallback = async (str, phase, preserveCallbacks, context, buffer) => {\n if (typeof str === \"object\" && !(str instanceof String)) {\n if (!(str instanceof Promise)) {\n str = str.toString();\n }\n if (str instanceof Promise) {\n str = await str;\n }\n }\n const callbacks = str.callbacks;\n if (!callbacks?.length) {\n return Promise.resolve(str);\n }\n if (buffer) {\n buffer[0] += str;\n } else {\n buffer = [str];\n }\n const resStr = Promise.all(callbacks.map((c) => c({ phase, buffer, context }))).then(\n (res) => Promise.all(\n res.filter(Boolean).map((str2) => resolveCallback(str2, phase, false, context, buffer))\n ).then(() => buffer[0])\n );\n if (preserveCallbacks) {\n return raw(await resStr, callbacks);\n } else {\n return resStr;\n }\n};\nexport {\n HtmlEscapedCallbackPhase,\n escapeToBuffer,\n raw,\n resolveCallback,\n resolveCallbackSync,\n stringBufferToString\n};\n","// src/context.ts\nimport { HonoRequest } from \"./request.js\";\nimport { HtmlEscapedCallbackPhase, resolveCallback } from \"./utils/html.js\";\nvar TEXT_PLAIN = \"text/plain; charset=UTF-8\";\nvar setDefaultContentType = (contentType, headers) => {\n return {\n \"Content-Type\": contentType,\n ...headers\n };\n};\nvar createResponseInstance = (body, init) => new Response(body, init);\nvar Context = class {\n #rawRequest;\n #req;\n /**\n * `.env` can get bindings (environment variables, secrets, KV namespaces, D1 database, R2 bucket etc.) in Cloudflare Workers.\n *\n * @see {@link https://hono.dev/docs/api/context#env}\n *\n * @example\n * ```ts\n * // Environment object for Cloudflare Workers\n * app.get('*', async c => {\n * const counter = c.env.COUNTER\n * })\n * ```\n */\n env = {};\n #var;\n finalized = false;\n /**\n * `.error` can get the error object from the middleware if the Handler throws an error.\n *\n * @see {@link https://hono.dev/docs/api/context#error}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * await next()\n * if (c.error) {\n * // do something...\n * }\n * })\n * ```\n */\n error;\n #status;\n #executionCtx;\n #res;\n #layout;\n #renderer;\n #notFoundHandler;\n #preparedHeaders;\n #matchResult;\n #path;\n /**\n * Creates an instance of the Context class.\n *\n * @param req - The Request object.\n * @param options - Optional configuration options for the context.\n */\n constructor(req, options) {\n this.#rawRequest = req;\n if (options) {\n this.#executionCtx = options.executionCtx;\n this.env = options.env;\n this.#notFoundHandler = options.notFoundHandler;\n this.#path = options.path;\n this.#matchResult = options.matchResult;\n }\n }\n /**\n * `.req` is the instance of {@link HonoRequest}.\n */\n get req() {\n this.#req ??= new HonoRequest(this.#rawRequest, this.#path, this.#matchResult);\n return this.#req;\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#event}\n * The FetchEvent associated with the current request.\n *\n * @throws Will throw an error if the context does not have a FetchEvent.\n */\n get event() {\n if (this.#executionCtx && \"respondWith\" in this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no FetchEvent\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#executionctx}\n * The ExecutionContext associated with the current request.\n *\n * @throws Will throw an error if the context does not have an ExecutionContext.\n */\n get executionCtx() {\n if (this.#executionCtx) {\n return this.#executionCtx;\n } else {\n throw Error(\"This context has no ExecutionContext\");\n }\n }\n /**\n * @see {@link https://hono.dev/docs/api/context#res}\n * The Response object for the current request.\n */\n get res() {\n return this.#res ||= createResponseInstance(null, {\n headers: this.#preparedHeaders ??= new Headers()\n });\n }\n /**\n * Sets the Response object for the current request.\n *\n * @param _res - The Response object to set.\n */\n set res(_res) {\n if (this.#res && _res) {\n _res = createResponseInstance(_res.body, _res);\n for (const [k, v] of this.#res.headers.entries()) {\n if (k === \"content-type\") {\n continue;\n }\n if (k === \"set-cookie\") {\n const cookies = this.#res.headers.getSetCookie();\n _res.headers.delete(\"set-cookie\");\n for (const cookie of cookies) {\n _res.headers.append(\"set-cookie\", cookie);\n }\n } else {\n _res.headers.set(k, v);\n }\n }\n }\n this.#res = _res;\n this.finalized = true;\n }\n /**\n * `.render()` can create a response within a layout.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * return c.render('Hello!')\n * })\n * ```\n */\n render = (...args) => {\n this.#renderer ??= (content) => this.html(content);\n return this.#renderer(...args);\n };\n /**\n * Sets the layout for the response.\n *\n * @param layout - The layout to set.\n * @returns The layout function.\n */\n setLayout = (layout) => this.#layout = layout;\n /**\n * Gets the current layout for the response.\n *\n * @returns The current layout function.\n */\n getLayout = () => this.#layout;\n /**\n * `.setRenderer()` can set the layout in the custom middleware.\n *\n * @see {@link https://hono.dev/docs/api/context#render-setrenderer}\n *\n * @example\n * ```tsx\n * app.use('*', async (c, next) => {\n * c.setRenderer((content) => {\n * return c.html(\n * <html>\n * <body>\n * <p>{content}</p>\n * </body>\n * </html>\n * )\n * })\n * await next()\n * })\n * ```\n */\n setRenderer = (renderer) => {\n this.#renderer = renderer;\n };\n /**\n * `.header()` can set headers.\n *\n * @see {@link https://hono.dev/docs/api/context#header}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n *\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n header = (name, value, options) => {\n if (this.finalized) {\n this.#res = createResponseInstance(this.#res.body, this.#res);\n }\n const headers = this.#res ? this.#res.headers : this.#preparedHeaders ??= new Headers();\n if (value === void 0) {\n headers.delete(name);\n } else if (options?.append) {\n headers.append(name, value);\n } else {\n headers.set(name, value);\n }\n };\n status = (status) => {\n this.#status = status;\n };\n /**\n * `.set()` can set the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.use('*', async (c, next) => {\n * c.set('message', 'Hono is hot!!')\n * await next()\n * })\n * ```\n */\n set = (key, value) => {\n this.#var ??= /* @__PURE__ */ new Map();\n this.#var.set(key, value);\n };\n /**\n * `.get()` can use the value specified by the key.\n *\n * @see {@link https://hono.dev/docs/api/context#set-get}\n *\n * @example\n * ```ts\n * app.get('/', (c) => {\n * const message = c.get('message')\n * return c.text(`The message is \"${message}\"`)\n * })\n * ```\n */\n get = (key) => {\n return this.#var ? this.#var.get(key) : void 0;\n };\n /**\n * `.var` can access the value of a variable.\n *\n * @see {@link https://hono.dev/docs/api/context#var}\n *\n * @example\n * ```ts\n * const result = c.var.client.oneMethod()\n * ```\n */\n // c.var.propName is a read-only\n get var() {\n if (!this.#var) {\n return {};\n }\n return Object.fromEntries(this.#var);\n }\n #newResponse(data, arg, headers) {\n const responseHeaders = this.#res ? new Headers(this.#res.headers) : this.#preparedHeaders ?? new Headers();\n if (typeof arg === \"object\" && \"headers\" in arg) {\n const argHeaders = arg.headers instanceof Headers ? arg.headers : new Headers(arg.headers);\n for (const [key, value] of argHeaders) {\n if (key.toLowerCase() === \"set-cookie\") {\n responseHeaders.append(key, value);\n } else {\n responseHeaders.set(key, value);\n }\n }\n }\n if (headers) {\n for (const [k, v] of Object.entries(headers)) {\n if (typeof v === \"string\") {\n responseHeaders.set(k, v);\n } else {\n responseHeaders.delete(k);\n for (const v2 of v) {\n responseHeaders.append(k, v2);\n }\n }\n }\n }\n const status = typeof arg === \"number\" ? arg : arg?.status ?? this.#status;\n return createResponseInstance(data, { status, headers: responseHeaders });\n }\n newResponse = (...args) => this.#newResponse(...args);\n /**\n * `.body()` can return the HTTP response.\n * You can set headers with `.header()` and set HTTP status code with `.status`.\n * This can also be set in `.text()`, `.json()` and so on.\n *\n * @see {@link https://hono.dev/docs/api/context#body}\n *\n * @example\n * ```ts\n * app.get('/welcome', (c) => {\n * // Set headers\n * c.header('X-Message', 'Hello!')\n * c.header('Content-Type', 'text/plain')\n * // Set HTTP status code\n * c.status(201)\n *\n * // Return the response body\n * return c.body('Thank you for coming')\n * })\n * ```\n */\n body = (data, arg, headers) => this.#newResponse(data, arg, headers);\n /**\n * `.text()` can render text as `Content-Type:text/plain`.\n *\n * @see {@link https://hono.dev/docs/api/context#text}\n *\n * @example\n * ```ts\n * app.get('/say', (c) => {\n * return c.text('Hello!')\n * })\n * ```\n */\n text = (text, arg, headers) => {\n return !this.#preparedHeaders && !this.#status && !arg && !headers && !this.finalized ? new Response(text) : this.#newResponse(\n text,\n arg,\n setDefaultContentType(TEXT_PLAIN, headers)\n );\n };\n /**\n * `.json()` can render JSON as `Content-Type:application/json`.\n *\n * @see {@link https://hono.dev/docs/api/context#json}\n *\n * @example\n * ```ts\n * app.get('/api', (c) => {\n * return c.json({ message: 'Hello!' })\n * })\n * ```\n */\n json = (object, arg, headers) => {\n return this.#newResponse(\n JSON.stringify(object),\n arg,\n setDefaultContentType(\"application/json\", headers)\n );\n };\n html = (html, arg, headers) => {\n const res = (html2) => this.#newResponse(html2, arg, setDefaultContentType(\"text/html; charset=UTF-8\", headers));\n return typeof html === \"object\" ? resolveCallback(html, HtmlEscapedCallbackPhase.Stringify, false, {}).then(res) : res(html);\n };\n /**\n * `.redirect()` can Redirect, default status code is 302.\n *\n * @see {@link https://hono.dev/docs/api/context#redirect}\n *\n * @example\n * ```ts\n * app.get('/redirect', (c) => {\n * return c.redirect('/')\n * })\n * app.get('/redirect-permanently', (c) => {\n * return c.redirect('/', 301)\n * })\n * ```\n */\n redirect = (location, status) => {\n const locationString = String(location);\n this.header(\n \"Location\",\n // Multibyes should be encoded\n // eslint-disable-next-line no-control-regex\n !/[^\\x00-\\xFF]/.test(locationString) ? locationString : encodeURI(locationString)\n );\n return this.newResponse(null, status ?? 302);\n };\n /**\n * `.notFound()` can return the Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/context#notfound}\n *\n * @example\n * ```ts\n * app.get('/notfound', (c) => {\n * return c.notFound()\n * })\n * ```\n */\n notFound = () => {\n this.#notFoundHandler ??= () => createResponseInstance();\n return this.#notFoundHandler(this);\n };\n};\nexport {\n Context,\n TEXT_PLAIN\n};\n","// src/router.ts\nvar METHOD_NAME_ALL = \"ALL\";\nvar METHOD_NAME_ALL_LOWERCASE = \"all\";\nvar METHODS = [\"get\", \"post\", \"put\", \"delete\", \"options\", \"patch\"];\nvar MESSAGE_MATCHER_IS_ALREADY_BUILT = \"Can not add a route since the matcher is already built.\";\nvar UnsupportedPathError = class extends Error {\n};\nexport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHODS,\n METHOD_NAME_ALL,\n METHOD_NAME_ALL_LOWERCASE,\n UnsupportedPathError\n};\n","// src/utils/constants.ts\nvar COMPOSED_HANDLER = \"__COMPOSED_HANDLER\";\nexport {\n COMPOSED_HANDLER\n};\n","// src/hono-base.ts\nimport { compose } from \"./compose.js\";\nimport { Context } from \"./context.js\";\nimport { METHODS, METHOD_NAME_ALL, METHOD_NAME_ALL_LOWERCASE } from \"./router.js\";\nimport { COMPOSED_HANDLER } from \"./utils/constants.js\";\nimport { getPath, getPathNoStrict, mergePath } from \"./utils/url.js\";\nvar notFoundHandler = (c) => {\n return c.text(\"404 Not Found\", 404);\n};\nvar errorHandler = (err, c) => {\n if (\"getResponse\" in err) {\n const res = err.getResponse();\n return c.newResponse(res.body, res);\n }\n console.error(err);\n return c.text(\"Internal Server Error\", 500);\n};\nvar Hono = class _Hono {\n get;\n post;\n put;\n delete;\n options;\n patch;\n all;\n on;\n use;\n /*\n This class is like an abstract class and does not have a router.\n To use it, inherit the class and implement router in the constructor.\n */\n router;\n getPath;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n _basePath = \"/\";\n #path = \"/\";\n routes = [];\n constructor(options = {}) {\n const allMethods = [...METHODS, METHOD_NAME_ALL_LOWERCASE];\n allMethods.forEach((method) => {\n this[method] = (args1, ...args) => {\n if (typeof args1 === \"string\") {\n this.#path = args1;\n } else {\n this.#addRoute(method, this.#path, args1);\n }\n args.forEach((handler) => {\n this.#addRoute(method, this.#path, handler);\n });\n return this;\n };\n });\n this.on = (method, path, ...handlers) => {\n for (const p of [path].flat()) {\n this.#path = p;\n for (const m of [method].flat()) {\n handlers.map((handler) => {\n this.#addRoute(m.toUpperCase(), this.#path, handler);\n });\n }\n }\n return this;\n };\n this.use = (arg1, ...handlers) => {\n if (typeof arg1 === \"string\") {\n this.#path = arg1;\n } else {\n this.#path = \"*\";\n handlers.unshift(arg1);\n }\n handlers.forEach((handler) => {\n this.#addRoute(METHOD_NAME_ALL, this.#path, handler);\n });\n return this;\n };\n const { strict, ...optionsWithoutStrict } = options;\n Object.assign(this, optionsWithoutStrict);\n this.getPath = strict ?? true ? options.getPath ?? getPath : getPathNoStrict;\n }\n #clone() {\n const clone = new _Hono({\n router: this.router,\n getPath: this.getPath\n });\n clone.errorHandler = this.errorHandler;\n clone.#notFoundHandler = this.#notFoundHandler;\n clone.routes = this.routes;\n return clone;\n }\n #notFoundHandler = notFoundHandler;\n // Cannot use `#` because it requires visibility at JavaScript runtime.\n errorHandler = errorHandler;\n /**\n * `.route()` allows grouping other Hono instance in routes.\n *\n * @see {@link https://hono.dev/docs/api/routing#grouping}\n *\n * @param {string} path - base Path\n * @param {Hono} app - other Hono instance\n * @returns {Hono} routed Hono instance\n *\n * @example\n * ```ts\n * const app = new Hono()\n * const app2 = new Hono()\n *\n * app2.get(\"/user\", (c) => c.text(\"user\"))\n * app.route(\"/api\", app2) // GET /api/user\n * ```\n */\n route(path, app) {\n const subApp = this.basePath(path);\n app.routes.map((r) => {\n let handler;\n if (app.errorHandler === errorHandler) {\n handler = r.handler;\n } else {\n handler = async (c, next) => (await compose([], app.errorHandler)(c, () => r.handler(c, next))).res;\n handler[COMPOSED_HANDLER] = r.handler;\n }\n subApp.#addRoute(r.method, r.path, handler);\n });\n return this;\n }\n /**\n * `.basePath()` allows base paths to be specified.\n *\n * @see {@link https://hono.dev/docs/api/routing#base-path}\n *\n * @param {string} path - base Path\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * const api = new Hono().basePath('/api')\n * ```\n */\n basePath(path) {\n const subApp = this.#clone();\n subApp._basePath = mergePath(this._basePath, path);\n return subApp;\n }\n /**\n * `.onError()` handles an error and returns a customized Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#error-handling}\n *\n * @param {ErrorHandler} handler - request Handler for error\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.onError((err, c) => {\n * console.error(`${err}`)\n * return c.text('Custom Error Message', 500)\n * })\n * ```\n */\n onError = (handler) => {\n this.errorHandler = handler;\n return this;\n };\n /**\n * `.notFound()` allows you to customize a Not Found Response.\n *\n * @see {@link https://hono.dev/docs/api/hono#not-found}\n *\n * @param {NotFoundHandler} handler - request handler for not-found\n * @returns {Hono} changed Hono instance\n *\n * @example\n * ```ts\n * app.notFound((c) => {\n * return c.text('Custom 404 Message', 404)\n * })\n * ```\n */\n notFound = (handler) => {\n this.#notFoundHandler = handler;\n return this;\n };\n /**\n * `.mount()` allows you to mount applications built with other frameworks into your Hono application.\n *\n * @see {@link https://hono.dev/docs/api/hono#mount}\n *\n * @param {string} path - base Path\n * @param {Function} applicationHandler - other Request Handler\n * @param {MountOptions} [options] - options of `.mount()`\n * @returns {Hono} mounted Hono instance\n *\n * @example\n * ```ts\n * import { Router as IttyRouter } from 'itty-router'\n * import { Hono } from 'hono'\n * // Create itty-router application\n * const ittyRouter = IttyRouter()\n * // GET /itty-router/hello\n * ittyRouter.get('/hello', () => new Response('Hello from itty-router'))\n *\n * const app = new Hono()\n * app.mount('/itty-router', ittyRouter.handle)\n * ```\n *\n * @example\n * ```ts\n * const app = new Hono()\n * // Send the request to another application without modification.\n * app.mount('/app', anotherApp, {\n * replaceRequest: (req) => req,\n * })\n * ```\n */\n mount(path, applicationHandler, options) {\n let replaceRequest;\n let optionHandler;\n if (options) {\n if (typeof options === \"function\") {\n optionHandler = options;\n } else {\n optionHandler = options.optionHandler;\n if (options.replaceRequest === false) {\n replaceRequest = (request) => request;\n } else {\n replaceRequest = options.replaceRequest;\n }\n }\n }\n const getOptions = optionHandler ? (c) => {\n const options2 = optionHandler(c);\n return Array.isArray(options2) ? options2 : [options2];\n } : (c) => {\n let executionContext = void 0;\n try {\n executionContext = c.executionCtx;\n } catch {\n }\n return [c.env, executionContext];\n };\n replaceRequest ||= (() => {\n const mergedPath = mergePath(this._basePath, path);\n const pathPrefixLength = mergedPath === \"/\" ? 0 : mergedPath.length;\n return (request) => {\n const url = new URL(request.url);\n url.pathname = url.pathname.slice(pathPrefixLength) || \"/\";\n return new Request(url, request);\n };\n })();\n const handler = async (c, next) => {\n const res = await applicationHandler(replaceRequest(c.req.raw), ...getOptions(c));\n if (res) {\n return res;\n }\n await next();\n };\n this.#addRoute(METHOD_NAME_ALL, mergePath(path, \"*\"), handler);\n return this;\n }\n #addRoute(method, path, handler) {\n method = method.toUpperCase();\n path = mergePath(this._basePath, path);\n const r = { basePath: this._basePath, path, method, handler };\n this.router.add(method, path, [handler, r]);\n this.routes.push(r);\n }\n #handleError(err, c) {\n if (err instanceof Error) {\n return this.errorHandler(err, c);\n }\n throw err;\n }\n #dispatch(request, executionCtx, env, method) {\n if (method === \"HEAD\") {\n return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, \"GET\")))();\n }\n const path = this.getPath(request, { env });\n const matchResult = this.router.match(method, path);\n const c = new Context(request, {\n path,\n matchResult,\n env,\n executionCtx,\n notFoundHandler: this.#notFoundHandler\n });\n if (matchResult[0].length === 1) {\n let res;\n try {\n res = matchResult[0][0][0][0](c, async () => {\n c.res = await this.#notFoundHandler(c);\n });\n } catch (err) {\n return this.#handleError(err, c);\n }\n return res instanceof Promise ? res.then(\n (resolved) => resolved || (c.finalized ? c.res : this.#notFoundHandler(c))\n ).catch((err) => this.#handleError(err, c)) : res ?? this.#notFoundHandler(c);\n }\n const composed = compose(matchResult[0], this.errorHandler, this.#notFoundHandler);\n return (async () => {\n try {\n const context = await composed(c);\n if (!context.finalized) {\n throw new Error(\n \"Context is not finalized. Did you forget to return a Response object or `await next()`?\"\n );\n }\n return context.res;\n } catch (err) {\n return this.#handleError(err, c);\n }\n })();\n }\n /**\n * `.fetch()` will be entry point of your app.\n *\n * @see {@link https://hono.dev/docs/api/hono#fetch}\n *\n * @param {Request} request - request Object of request\n * @param {Env} Env - env Object\n * @param {ExecutionContext} - context of execution\n * @returns {Response | Promise<Response>} response of request\n *\n */\n fetch = (request, ...rest) => {\n return this.#dispatch(request, rest[1], rest[0], request.method);\n };\n /**\n * `.request()` is a useful method for testing.\n * You can pass a URL or pathname to send a GET request.\n * app will return a Response object.\n * ```ts\n * test('GET /hello is ok', async () => {\n * const res = await app.request('/hello')\n * expect(res.status).toBe(200)\n * })\n * ```\n * @see https://hono.dev/docs/api/hono#request\n */\n request = (input, requestInit, Env, executionCtx) => {\n if (input instanceof Request) {\n return this.fetch(requestInit ? new Request(input, requestInit) : input, Env, executionCtx);\n }\n input = input.toString();\n return this.fetch(\n new Request(\n /^https?:\\/\\//.test(input) ? input : `http://localhost${mergePath(\"/\", input)}`,\n requestInit\n ),\n Env,\n executionCtx\n );\n };\n /**\n * `.fire()` automatically adds a global fetch event listener.\n * This can be useful for environments that adhere to the Service Worker API, such as non-ES module Cloudflare Workers.\n * @deprecated\n * Use `fire` from `hono/service-worker` instead.\n * ```ts\n * import { Hono } from 'hono'\n * import { fire } from 'hono/service-worker'\n *\n * const app = new Hono()\n * // ...\n * fire(app)\n * ```\n * @see https://hono.dev/docs/api/hono#fire\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API\n * @see https://developers.cloudflare.com/workers/reference/migrate-to-module-workers/\n */\n fire = () => {\n addEventListener(\"fetch\", (event) => {\n event.respondWith(this.#dispatch(event.request, event, void 0, event.request.method));\n });\n };\n};\nexport {\n Hono as HonoBase\n};\n","// src/router/reg-exp-router/matcher.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nvar emptyParam = [];\nfunction match(method, path) {\n const matchers = this.buildAllMatchers();\n const match2 = ((method2, path2) => {\n const matcher = matchers[method2] || matchers[METHOD_NAME_ALL];\n const staticMatch = matcher[2][path2];\n if (staticMatch) {\n return staticMatch;\n }\n const match3 = path2.match(matcher[0]);\n if (!match3) {\n return [[], emptyParam];\n }\n const index = match3.indexOf(\"\", 1);\n return [matcher[1][index], match3];\n });\n this.match = match2;\n return match2(method, path);\n}\nexport {\n emptyParam,\n match\n};\n","// src/router/reg-exp-router/node.ts\nvar LABEL_REG_EXP_STR = \"[^/]+\";\nvar ONLY_WILDCARD_REG_EXP_STR = \".*\";\nvar TAIL_WILDCARD_REG_EXP_STR = \"(?:|/.*)\";\nvar PATH_ERROR = /* @__PURE__ */ Symbol();\nvar regExpMetaChars = new Set(\".\\\\+*[^]$()\");\nfunction compareKey(a, b) {\n if (a.length === 1) {\n return b.length === 1 ? a < b ? -1 : 1 : -1;\n }\n if (b.length === 1) {\n return 1;\n }\n if (a === ONLY_WILDCARD_REG_EXP_STR || a === TAIL_WILDCARD_REG_EXP_STR) {\n return 1;\n } else if (b === ONLY_WILDCARD_REG_EXP_STR || b === TAIL_WILDCARD_REG_EXP_STR) {\n return -1;\n }\n if (a === LABEL_REG_EXP_STR) {\n return 1;\n } else if (b === LABEL_REG_EXP_STR) {\n return -1;\n }\n return a.length === b.length ? a < b ? -1 : 1 : b.length - a.length;\n}\nvar Node = class _Node {\n #index;\n #varIndex;\n #children = /* @__PURE__ */ Object.create(null);\n insert(tokens, index, paramMap, context, pathErrorCheckOnly) {\n if (tokens.length === 0) {\n if (this.#index !== void 0) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n this.#index = index;\n return;\n }\n const [token, ...restTokens] = tokens;\n const pattern = token === \"*\" ? restTokens.length === 0 ? [\"\", \"\", ONLY_WILDCARD_REG_EXP_STR] : [\"\", \"\", LABEL_REG_EXP_STR] : token === \"/*\" ? [\"\", \"\", TAIL_WILDCARD_REG_EXP_STR] : token.match(/^\\:([^\\{\\}]+)(?:\\{(.+)\\})?$/);\n let node;\n if (pattern) {\n const name = pattern[1];\n let regexpStr = pattern[2] || LABEL_REG_EXP_STR;\n if (name && pattern[2]) {\n if (regexpStr === \".*\") {\n throw PATH_ERROR;\n }\n regexpStr = regexpStr.replace(/^\\((?!\\?:)(?=[^)]+\\)$)/, \"(?:\");\n if (/\\((?!\\?:)/.test(regexpStr)) {\n throw PATH_ERROR;\n }\n }\n node = this.#children[regexpStr];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[regexpStr] = new _Node();\n if (name !== \"\") {\n node.#varIndex = context.varIndex++;\n }\n }\n if (!pathErrorCheckOnly && name !== \"\") {\n paramMap.push([name, node.#varIndex]);\n }\n } else {\n node = this.#children[token];\n if (!node) {\n if (Object.keys(this.#children).some(\n (k) => k.length > 1 && k !== ONLY_WILDCARD_REG_EXP_STR && k !== TAIL_WILDCARD_REG_EXP_STR\n )) {\n throw PATH_ERROR;\n }\n if (pathErrorCheckOnly) {\n return;\n }\n node = this.#children[token] = new _Node();\n }\n }\n node.insert(restTokens, index, paramMap, context, pathErrorCheckOnly);\n }\n buildRegExpStr() {\n const childKeys = Object.keys(this.#children).sort(compareKey);\n const strList = childKeys.map((k) => {\n const c = this.#children[k];\n return (typeof c.#varIndex === \"number\" ? `(${k})@${c.#varIndex}` : regExpMetaChars.has(k) ? `\\\\${k}` : k) + c.buildRegExpStr();\n });\n if (typeof this.#index === \"number\") {\n strList.unshift(`#${this.#index}`);\n }\n if (strList.length === 0) {\n return \"\";\n }\n if (strList.length === 1) {\n return strList[0];\n }\n return \"(?:\" + strList.join(\"|\") + \")\";\n }\n};\nexport {\n Node,\n PATH_ERROR\n};\n","// src/router/reg-exp-router/trie.ts\nimport { Node } from \"./node.js\";\nvar Trie = class {\n #context = { varIndex: 0 };\n #root = new Node();\n insert(path, index, pathErrorCheckOnly) {\n const paramAssoc = [];\n const groups = [];\n for (let i = 0; ; ) {\n let replaced = false;\n path = path.replace(/\\{[^}]+\\}/g, (m) => {\n const mark = `@\\\\${i}`;\n groups[i] = [mark, m];\n i++;\n replaced = true;\n return mark;\n });\n if (!replaced) {\n break;\n }\n }\n const tokens = path.match(/(?::[^\\/]+)|(?:\\/\\*$)|./g) || [];\n for (let i = groups.length - 1; i >= 0; i--) {\n const [mark] = groups[i];\n for (let j = tokens.length - 1; j >= 0; j--) {\n if (tokens[j].indexOf(mark) !== -1) {\n tokens[j] = tokens[j].replace(mark, groups[i][1]);\n break;\n }\n }\n }\n this.#root.insert(tokens, index, paramAssoc, this.#context, pathErrorCheckOnly);\n return paramAssoc;\n }\n buildRegExp() {\n let regexp = this.#root.buildRegExpStr();\n if (regexp === \"\") {\n return [/^$/, [], []];\n }\n let captureIndex = 0;\n const indexReplacementMap = [];\n const paramReplacementMap = [];\n regexp = regexp.replace(/#(\\d+)|@(\\d+)|\\.\\*\\$/g, (_, handlerIndex, paramIndex) => {\n if (handlerIndex !== void 0) {\n indexReplacementMap[++captureIndex] = Number(handlerIndex);\n return \"$()\";\n }\n if (paramIndex !== void 0) {\n paramReplacementMap[Number(paramIndex)] = ++captureIndex;\n return \"\";\n }\n return \"\";\n });\n return [new RegExp(`^${regexp}`), indexReplacementMap, paramReplacementMap];\n }\n};\nexport {\n Trie\n};\n","// src/router/reg-exp-router/router.ts\nimport {\n MESSAGE_MATCHER_IS_ALREADY_BUILT,\n METHOD_NAME_ALL,\n UnsupportedPathError\n} from \"../../router.js\";\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { match, emptyParam } from \"./matcher.js\";\nimport { PATH_ERROR } from \"./node.js\";\nimport { Trie } from \"./trie.js\";\nvar nullMatcher = [/^$/, [], /* @__PURE__ */ Object.create(null)];\nvar wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\nfunction buildWildcardRegExp(path) {\n return wildcardRegExpCache[path] ??= new RegExp(\n path === \"*\" ? \"\" : `^${path.replace(\n /\\/\\*$|([.\\\\+*[^\\]$()])/g,\n (_, metaChar) => metaChar ? `\\\\${metaChar}` : \"(?:|/.*)\"\n )}$`\n );\n}\nfunction clearWildcardRegExpCache() {\n wildcardRegExpCache = /* @__PURE__ */ Object.create(null);\n}\nfunction buildMatcherFromPreprocessedRoutes(routes) {\n const trie = new Trie();\n const handlerData = [];\n if (routes.length === 0) {\n return nullMatcher;\n }\n const routesWithStaticPathFlag = routes.map(\n (route) => [!/\\*|\\/:/.test(route[0]), ...route]\n ).sort(\n ([isStaticA, pathA], [isStaticB, pathB]) => isStaticA ? 1 : isStaticB ? -1 : pathA.length - pathB.length\n );\n const staticMap = /* @__PURE__ */ Object.create(null);\n for (let i = 0, j = -1, len = routesWithStaticPathFlag.length; i < len; i++) {\n const [pathErrorCheckOnly, path, handlers] = routesWithStaticPathFlag[i];\n if (pathErrorCheckOnly) {\n staticMap[path] = [handlers.map(([h]) => [h, /* @__PURE__ */ Object.create(null)]), emptyParam];\n } else {\n j++;\n }\n let paramAssoc;\n try {\n paramAssoc = trie.insert(path, j, pathErrorCheckOnly);\n } catch (e) {\n throw e === PATH_ERROR ? new UnsupportedPathError(path) : e;\n }\n if (pathErrorCheckOnly) {\n continue;\n }\n handlerData[j] = handlers.map(([h, paramCount]) => {\n const paramIndexMap = /* @__PURE__ */ Object.create(null);\n paramCount -= 1;\n for (; paramCount >= 0; paramCount--) {\n const [key, value] = paramAssoc[paramCount];\n paramIndexMap[key] = value;\n }\n return [h, paramIndexMap];\n });\n }\n const [regexp, indexReplacementMap, paramReplacementMap] = trie.buildRegExp();\n for (let i = 0, len = handlerData.length; i < len; i++) {\n for (let j = 0, len2 = handlerData[i].length; j < len2; j++) {\n const map = handlerData[i][j]?.[1];\n if (!map) {\n continue;\n }\n const keys = Object.keys(map);\n for (let k = 0, len3 = keys.length; k < len3; k++) {\n map[keys[k]] = paramReplacementMap[map[keys[k]]];\n }\n }\n }\n const handlerMap = [];\n for (const i in indexReplacementMap) {\n handlerMap[i] = handlerData[indexReplacementMap[i]];\n }\n return [regexp, handlerMap, staticMap];\n}\nfunction findMiddleware(middleware, path) {\n if (!middleware) {\n return void 0;\n }\n for (const k of Object.keys(middleware).sort((a, b) => b.length - a.length)) {\n if (buildWildcardRegExp(k).test(path)) {\n return [...middleware[k]];\n }\n }\n return void 0;\n}\nvar RegExpRouter = class {\n name = \"RegExpRouter\";\n #middleware;\n #routes;\n constructor() {\n this.#middleware = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n this.#routes = { [METHOD_NAME_ALL]: /* @__PURE__ */ Object.create(null) };\n }\n add(method, path, handler) {\n const middleware = this.#middleware;\n const routes = this.#routes;\n if (!middleware || !routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n if (!middleware[method]) {\n ;\n [middleware, routes].forEach((handlerMap) => {\n handlerMap[method] = /* @__PURE__ */ Object.create(null);\n Object.keys(handlerMap[METHOD_NAME_ALL]).forEach((p) => {\n handlerMap[method][p] = [...handlerMap[METHOD_NAME_ALL][p]];\n });\n });\n }\n if (path === \"/*\") {\n path = \"*\";\n }\n const paramCount = (path.match(/\\/:/g) || []).length;\n if (/\\*$/.test(path)) {\n const re = buildWildcardRegExp(path);\n if (method === METHOD_NAME_ALL) {\n Object.keys(middleware).forEach((m) => {\n middleware[m][path] ||= findMiddleware(middleware[m], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n });\n } else {\n middleware[method][path] ||= findMiddleware(middleware[method], path) || findMiddleware(middleware[METHOD_NAME_ALL], path) || [];\n }\n Object.keys(middleware).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(middleware[m]).forEach((p) => {\n re.test(p) && middleware[m][p].push([handler, paramCount]);\n });\n }\n });\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n Object.keys(routes[m]).forEach(\n (p) => re.test(p) && routes[m][p].push([handler, paramCount])\n );\n }\n });\n return;\n }\n const paths = checkOptionalParameter(path) || [path];\n for (let i = 0, len = paths.length; i < len; i++) {\n const path2 = paths[i];\n Object.keys(routes).forEach((m) => {\n if (method === METHOD_NAME_ALL || method === m) {\n routes[m][path2] ||= [\n ...findMiddleware(middleware[m], path2) || findMiddleware(middleware[METHOD_NAME_ALL], path2) || []\n ];\n routes[m][path2].push([handler, paramCount - len + i + 1]);\n }\n });\n }\n }\n match = match;\n buildAllMatchers() {\n const matchers = /* @__PURE__ */ Object.create(null);\n Object.keys(this.#routes).concat(Object.keys(this.#middleware)).forEach((method) => {\n matchers[method] ||= this.#buildMatcher(method);\n });\n this.#middleware = this.#routes = void 0;\n clearWildcardRegExpCache();\n return matchers;\n }\n #buildMatcher(method) {\n const routes = [];\n let hasOwnRoute = method === METHOD_NAME_ALL;\n [this.#middleware, this.#routes].forEach((r) => {\n const ownRoute = r[method] ? Object.keys(r[method]).map((path) => [path, r[method][path]]) : [];\n if (ownRoute.length !== 0) {\n hasOwnRoute ||= true;\n routes.push(...ownRoute);\n } else if (method !== METHOD_NAME_ALL) {\n routes.push(\n ...Object.keys(r[METHOD_NAME_ALL]).map((path) => [path, r[METHOD_NAME_ALL][path]])\n );\n }\n });\n if (!hasOwnRoute) {\n return null;\n } else {\n return buildMatcherFromPreprocessedRoutes(routes);\n }\n }\n};\nexport {\n RegExpRouter\n};\n","// src/router/smart-router/router.ts\nimport { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from \"../../router.js\";\nvar SmartRouter = class {\n name = \"SmartRouter\";\n #routers = [];\n #routes = [];\n constructor(init) {\n this.#routers = init.routers;\n }\n add(method, path, handler) {\n if (!this.#routes) {\n throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);\n }\n this.#routes.push([method, path, handler]);\n }\n match(method, path) {\n if (!this.#routes) {\n throw new Error(\"Fatal error\");\n }\n const routers = this.#routers;\n const routes = this.#routes;\n const len = routers.length;\n let i = 0;\n let res;\n for (; i < len; i++) {\n const router = routers[i];\n try {\n for (let i2 = 0, len2 = routes.length; i2 < len2; i2++) {\n router.add(...routes[i2]);\n }\n res = router.match(method, path);\n } catch (e) {\n if (e instanceof UnsupportedPathError) {\n continue;\n }\n throw e;\n }\n this.match = router.match.bind(router);\n this.#routers = [router];\n this.#routes = void 0;\n break;\n }\n if (i === len) {\n throw new Error(\"Fatal error\");\n }\n this.name = `SmartRouter + ${this.activeRouter.name}`;\n return res;\n }\n get activeRouter() {\n if (this.#routes || this.#routers.length !== 1) {\n throw new Error(\"No active router has been determined yet.\");\n }\n return this.#routers[0];\n }\n};\nexport {\n SmartRouter\n};\n","// src/router/trie-router/node.ts\nimport { METHOD_NAME_ALL } from \"../../router.js\";\nimport { getPattern, splitPath, splitRoutingPath } from \"../../utils/url.js\";\nvar emptyParams = /* @__PURE__ */ Object.create(null);\nvar hasChildren = (children) => {\n for (const _ in children) {\n return true;\n }\n return false;\n};\nvar Node = class _Node {\n #methods;\n #children;\n #patterns;\n #order = 0;\n #params = emptyParams;\n constructor(method, handler, children) {\n this.#children = children || /* @__PURE__ */ Object.create(null);\n this.#methods = [];\n if (method && handler) {\n const m = /* @__PURE__ */ Object.create(null);\n m[method] = { handler, possibleKeys: [], score: 0 };\n this.#methods = [m];\n }\n this.#patterns = [];\n }\n insert(method, path, handler) {\n this.#order = ++this.#order;\n let curNode = this;\n const parts = splitRoutingPath(path);\n const possibleKeys = [];\n for (let i = 0, len = parts.length; i < len; i++) {\n const p = parts[i];\n const nextP = parts[i + 1];\n const pattern = getPattern(p, nextP);\n const key = Array.isArray(pattern) ? pattern[0] : p;\n if (key in curNode.#children) {\n curNode = curNode.#children[key];\n if (pattern) {\n possibleKeys.push(pattern[1]);\n }\n continue;\n }\n curNode.#children[key] = new _Node();\n if (pattern) {\n curNode.#patterns.push(pattern);\n possibleKeys.push(pattern[1]);\n }\n curNode = curNode.#children[key];\n }\n curNode.#methods.push({\n [method]: {\n handler,\n possibleKeys: possibleKeys.filter((v, i, a) => a.indexOf(v) === i),\n score: this.#order\n }\n });\n return curNode;\n }\n #pushHandlerSets(handlerSets, node, method, nodeParams, params) {\n for (let i = 0, len = node.#methods.length; i < len; i++) {\n const m = node.#methods[i];\n const handlerSet = m[method] || m[METHOD_NAME_ALL];\n const processedSet = {};\n if (handlerSet !== void 0) {\n handlerSet.params = /* @__PURE__ */ Object.create(null);\n handlerSets.push(handlerSet);\n if (nodeParams !== emptyParams || params && params !== emptyParams) {\n for (let i2 = 0, len2 = handlerSet.possibleKeys.length; i2 < len2; i2++) {\n const key = handlerSet.possibleKeys[i2];\n const processed = processedSet[handlerSet.score];\n handlerSet.params[key] = params?.[key] && !processed ? params[key] : nodeParams[key] ?? params?.[key];\n processedSet[handlerSet.score] = true;\n }\n }\n }\n }\n }\n search(method, path) {\n const handlerSets = [];\n this.#params = emptyParams;\n const curNode = this;\n let curNodes = [curNode];\n const parts = splitPath(path);\n const curNodesQueue = [];\n const len = parts.length;\n let partOffsets = null;\n for (let i = 0; i < len; i++) {\n const part = parts[i];\n const isLast = i === len - 1;\n const tempNodes = [];\n for (let j = 0, len2 = curNodes.length; j < len2; j++) {\n const node = curNodes[j];\n const nextNode = node.#children[part];\n if (nextNode) {\n nextNode.#params = node.#params;\n if (isLast) {\n if (nextNode.#children[\"*\"]) {\n this.#pushHandlerSets(handlerSets, nextNode.#children[\"*\"], method, node.#params);\n }\n this.#pushHandlerSets(handlerSets, nextNode, method, node.#params);\n } else {\n tempNodes.push(nextNode);\n }\n }\n for (let k = 0, len3 = node.#patterns.length; k < len3; k++) {\n const pattern = node.#patterns[k];\n const params = node.#params === emptyParams ? {} : { ...node.#params };\n if (pattern === \"*\") {\n const astNode = node.#children[\"*\"];\n if (astNode) {\n this.#pushHandlerSets(handlerSets, astNode, method, node.#params);\n astNode.#params = params;\n tempNodes.push(astNode);\n }\n continue;\n }\n const [key, name, matcher] = pattern;\n if (!part && !(matcher instanceof RegExp)) {\n continue;\n }\n const child = node.#children[key];\n if (matcher instanceof RegExp) {\n if (partOffsets === null) {\n partOffsets = new Array(len);\n let offset = path[0] === \"/\" ? 1 : 0;\n for (let p = 0; p < len; p++) {\n partOffsets[p] = offset;\n offset += parts[p].length + 1;\n }\n }\n const restPathString = path.substring(partOffsets[i]);\n const m = matcher.exec(restPathString);\n if (m) {\n params[name] = m[0];\n this.#pushHandlerSets(handlerSets, child, method, node.#params, params);\n if (hasChildren(child.#children)) {\n child.#params = params;\n const componentCount = m[0].match(/\\//)?.length ?? 0;\n const targetCurNodes = curNodesQueue[componentCount] ||= [];\n targetCurNodes.push(child);\n }\n continue;\n }\n }\n if (matcher === true || matcher.test(part)) {\n params[name] = part;\n if (isLast) {\n this.#pushHandlerSets(handlerSets, child, method, params, node.#params);\n if (child.#children[\"*\"]) {\n this.#pushHandlerSets(\n handlerSets,\n child.#children[\"*\"],\n method,\n params,\n node.#params\n );\n }\n } else {\n child.#params = params;\n tempNodes.push(child);\n }\n }\n }\n }\n const shifted = curNodesQueue.shift();\n curNodes = shifted ? tempNodes.concat(shifted) : tempNodes;\n }\n if (handlerSets.length > 1) {\n handlerSets.sort((a, b) => {\n return a.score - b.score;\n });\n }\n return [handlerSets.map(({ handler, params }) => [handler, params])];\n }\n};\nexport {\n Node\n};\n","// src/router/trie-router/router.ts\nimport { checkOptionalParameter } from \"../../utils/url.js\";\nimport { Node } from \"./node.js\";\nvar TrieRouter = class {\n name = \"TrieRouter\";\n #node;\n constructor() {\n this.#node = new Node();\n }\n add(method, path, handler) {\n const results = checkOptionalParameter(path);\n if (results) {\n for (let i = 0, len = results.length; i < len; i++) {\n this.#node.insert(method, results[i], handler);\n }\n return;\n }\n this.#node.insert(method, path, handler);\n }\n match(method, path) {\n return this.#node.search(method, path);\n }\n};\nexport {\n TrieRouter\n};\n","// src/hono.ts\nimport { HonoBase } from \"./hono-base.js\";\nimport { RegExpRouter } from \"./router/reg-exp-router/index.js\";\nimport { SmartRouter } from \"./router/smart-router/index.js\";\nimport { TrieRouter } from \"./router/trie-router/index.js\";\nvar Hono = class extends HonoBase {\n /**\n * Creates an instance of the Hono class.\n *\n * @param options - Optional configuration options for the Hono instance.\n */\n constructor(options = {}) {\n super(options);\n this.router = options.router ?? new SmartRouter({\n routers: [new RegExpRouter(), new TrieRouter()]\n });\n }\n};\nexport {\n Hono\n};\n","// src/middleware/cors/index.ts\nvar cors = (options) => {\n const defaults = {\n origin: \"*\",\n allowMethods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\"],\n allowHeaders: [],\n exposeHeaders: []\n };\n const opts = {\n ...defaults,\n ...options\n };\n const findAllowOrigin = ((optsOrigin) => {\n if (typeof optsOrigin === \"string\") {\n if (optsOrigin === \"*\") {\n if (opts.credentials) {\n return (origin) => origin || null;\n }\n return () => optsOrigin;\n } else {\n return (origin) => optsOrigin === origin ? origin : null;\n }\n } else if (typeof optsOrigin === \"function\") {\n return optsOrigin;\n } else {\n return (origin) => optsOrigin.includes(origin) ? origin : null;\n }\n })(opts.origin);\n const findAllowMethods = ((optsAllowMethods) => {\n if (typeof optsAllowMethods === \"function\") {\n return optsAllowMethods;\n } else if (Array.isArray(optsAllowMethods)) {\n return () => optsAllowMethods;\n } else {\n return () => [];\n }\n })(opts.allowMethods);\n return async function cors2(c, next) {\n function set(key, value) {\n c.res.headers.set(key, value);\n }\n const allowOrigin = await findAllowOrigin(c.req.header(\"origin\") || \"\", c);\n if (allowOrigin) {\n set(\"Access-Control-Allow-Origin\", allowOrigin);\n }\n if (opts.credentials) {\n set(\"Access-Control-Allow-Credentials\", \"true\");\n }\n if (opts.exposeHeaders?.length) {\n set(\"Access-Control-Expose-Headers\", opts.exposeHeaders.join(\",\"));\n }\n if (c.req.method === \"OPTIONS\") {\n if (opts.origin !== \"*\" || opts.credentials) {\n set(\"Vary\", \"Origin\");\n }\n if (opts.maxAge != null) {\n set(\"Access-Control-Max-Age\", opts.maxAge.toString());\n }\n const allowMethods = await findAllowMethods(c.req.header(\"origin\") || \"\", c);\n if (allowMethods.length) {\n set(\"Access-Control-Allow-Methods\", allowMethods.join(\",\"));\n }\n let headers = opts.allowHeaders;\n if (!headers?.length) {\n const requestHeaders = c.req.header(\"Access-Control-Request-Headers\");\n if (requestHeaders) {\n headers = requestHeaders.split(/\\s*,\\s*/);\n }\n }\n if (headers?.length) {\n set(\"Access-Control-Allow-Headers\", headers.join(\",\"));\n c.res.headers.append(\"Vary\", \"Access-Control-Request-Headers\");\n }\n c.res.headers.delete(\"Content-Length\");\n c.res.headers.delete(\"Content-Type\");\n return new Response(null, {\n headers: c.res.headers,\n status: 204,\n statusText: \"No Content\"\n });\n }\n await next();\n if (opts.origin !== \"*\" || opts.credentials) {\n c.header(\"Vary\", \"Origin\", { append: true });\n }\n };\n};\nexport {\n cors\n};\n","// src/server.ts\nimport { createServer as createServerHTTP } from \"http\";\n\n// src/listener.ts\nimport { Http2ServerRequest as Http2ServerRequest2, constants as h2constants } from \"http2\";\n\n// src/request.ts\nimport { Http2ServerRequest } from \"http2\";\nimport { Readable } from \"stream\";\nvar RequestError = class extends Error {\n constructor(message, options) {\n super(message, options);\n this.name = \"RequestError\";\n }\n};\nvar toRequestError = (e) => {\n if (e instanceof RequestError) {\n return e;\n }\n return new RequestError(e.message, { cause: e });\n};\nvar GlobalRequest = global.Request;\nvar Request = class extends GlobalRequest {\n constructor(input, options) {\n if (typeof input === \"object\" && getRequestCache in input) {\n input = input[getRequestCache]();\n }\n if (typeof options?.body?.getReader !== \"undefined\") {\n ;\n options.duplex ??= \"half\";\n }\n super(input, options);\n }\n};\nvar newHeadersFromIncoming = (incoming) => {\n const headerRecord = [];\n const rawHeaders = incoming.rawHeaders;\n for (let i = 0; i < rawHeaders.length; i += 2) {\n const { [i]: key, [i + 1]: value } = rawHeaders;\n if (key.charCodeAt(0) !== /*:*/\n 58) {\n headerRecord.push([key, value]);\n }\n }\n return new Headers(headerRecord);\n};\nvar wrapBodyStream = Symbol(\"wrapBodyStream\");\nvar newRequestFromIncoming = (method, url, headers, incoming, abortController) => {\n const init = {\n method,\n headers,\n signal: abortController.signal\n };\n if (method === \"TRACE\") {\n init.method = \"GET\";\n const req = new Request(url, init);\n Object.defineProperty(req, \"method\", {\n get() {\n return \"TRACE\";\n }\n });\n return req;\n }\n if (!(method === \"GET\" || method === \"HEAD\")) {\n if (\"rawBody\" in incoming && incoming.rawBody instanceof Buffer) {\n init.body = new ReadableStream({\n start(controller) {\n controller.enqueue(incoming.rawBody);\n controller.close();\n }\n });\n } else if (incoming[wrapBodyStream]) {\n let reader;\n init.body = new ReadableStream({\n async pull(controller) {\n try {\n reader ||= Readable.toWeb(incoming).getReader();\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n } catch (error) {\n controller.error(error);\n }\n }\n });\n } else {\n init.body = Readable.toWeb(incoming);\n }\n }\n return new Request(url, init);\n};\nvar getRequestCache = Symbol(\"getRequestCache\");\nvar requestCache = Symbol(\"requestCache\");\nvar incomingKey = Symbol(\"incomingKey\");\nvar urlKey = Symbol(\"urlKey\");\nvar headersKey = Symbol(\"headersKey\");\nvar abortControllerKey = Symbol(\"abortControllerKey\");\nvar getAbortController = Symbol(\"getAbortController\");\nvar requestPrototype = {\n get method() {\n return this[incomingKey].method || \"GET\";\n },\n get url() {\n return this[urlKey];\n },\n get headers() {\n return this[headersKey] ||= newHeadersFromIncoming(this[incomingKey]);\n },\n [getAbortController]() {\n this[getRequestCache]();\n return this[abortControllerKey];\n },\n [getRequestCache]() {\n this[abortControllerKey] ||= new AbortController();\n return this[requestCache] ||= newRequestFromIncoming(\n this.method,\n this[urlKey],\n this.headers,\n this[incomingKey],\n this[abortControllerKey]\n );\n }\n};\n[\n \"body\",\n \"bodyUsed\",\n \"cache\",\n \"credentials\",\n \"destination\",\n \"integrity\",\n \"mode\",\n \"redirect\",\n \"referrer\",\n \"referrerPolicy\",\n \"signal\",\n \"keepalive\"\n].forEach((k) => {\n Object.defineProperty(requestPrototype, k, {\n get() {\n return this[getRequestCache]()[k];\n }\n });\n});\n[\"arrayBuffer\", \"blob\", \"clone\", \"formData\", \"json\", \"text\"].forEach((k) => {\n Object.defineProperty(requestPrototype, k, {\n value: function() {\n return this[getRequestCache]()[k]();\n }\n });\n});\nObject.setPrototypeOf(requestPrototype, Request.prototype);\nvar newRequest = (incoming, defaultHostname) => {\n const req = Object.create(requestPrototype);\n req[incomingKey] = incoming;\n const incomingUrl = incoming.url || \"\";\n if (incomingUrl[0] !== \"/\" && // short-circuit for performance. most requests are relative URL.\n (incomingUrl.startsWith(\"http://\") || incomingUrl.startsWith(\"https://\"))) {\n if (incoming instanceof Http2ServerRequest) {\n throw new RequestError(\"Absolute URL for :path is not allowed in HTTP/2\");\n }\n try {\n const url2 = new URL(incomingUrl);\n req[urlKey] = url2.href;\n } catch (e) {\n throw new RequestError(\"Invalid absolute URL\", { cause: e });\n }\n return req;\n }\n const host = (incoming instanceof Http2ServerRequest ? incoming.authority : incoming.headers.host) || defaultHostname;\n if (!host) {\n throw new RequestError(\"Missing host header\");\n }\n let scheme;\n if (incoming instanceof Http2ServerRequest) {\n scheme = incoming.scheme;\n if (!(scheme === \"http\" || scheme === \"https\")) {\n throw new RequestError(\"Unsupported scheme\");\n }\n } else {\n scheme = incoming.socket && incoming.socket.encrypted ? \"https\" : \"http\";\n }\n const url = new URL(`${scheme}://${host}${incomingUrl}`);\n if (url.hostname.length !== host.length && url.hostname !== host.replace(/:\\d+$/, \"\")) {\n throw new RequestError(\"Invalid host header\");\n }\n req[urlKey] = url.href;\n return req;\n};\n\n// src/response.ts\nvar responseCache = Symbol(\"responseCache\");\nvar getResponseCache = Symbol(\"getResponseCache\");\nvar cacheKey = Symbol(\"cache\");\nvar GlobalResponse = global.Response;\nvar Response2 = class _Response {\n #body;\n #init;\n [getResponseCache]() {\n delete this[cacheKey];\n return this[responseCache] ||= new GlobalResponse(this.#body, this.#init);\n }\n constructor(body, init) {\n let headers;\n this.#body = body;\n if (init instanceof _Response) {\n const cachedGlobalResponse = init[responseCache];\n if (cachedGlobalResponse) {\n this.#init = cachedGlobalResponse;\n this[getResponseCache]();\n return;\n } else {\n this.#init = init.#init;\n headers = new Headers(init.#init.headers);\n }\n } else {\n this.#init = init;\n }\n if (typeof body === \"string\" || typeof body?.getReader !== \"undefined\" || body instanceof Blob || body instanceof Uint8Array) {\n ;\n this[cacheKey] = [init?.status || 200, body, headers || init?.headers];\n }\n }\n get headers() {\n const cache = this[cacheKey];\n if (cache) {\n if (!(cache[2] instanceof Headers)) {\n cache[2] = new Headers(\n cache[2] || { \"content-type\": \"text/plain; charset=UTF-8\" }\n );\n }\n return cache[2];\n }\n return this[getResponseCache]().headers;\n }\n get status() {\n return this[cacheKey]?.[0] ?? this[getResponseCache]().status;\n }\n get ok() {\n const status = this.status;\n return status >= 200 && status < 300;\n }\n};\n[\"body\", \"bodyUsed\", \"redirected\", \"statusText\", \"trailers\", \"type\", \"url\"].forEach((k) => {\n Object.defineProperty(Response2.prototype, k, {\n get() {\n return this[getResponseCache]()[k];\n }\n });\n});\n[\"arrayBuffer\", \"blob\", \"clone\", \"formData\", \"json\", \"text\"].forEach((k) => {\n Object.defineProperty(Response2.prototype, k, {\n value: function() {\n return this[getResponseCache]()[k]();\n }\n });\n});\nObject.setPrototypeOf(Response2, GlobalResponse);\nObject.setPrototypeOf(Response2.prototype, GlobalResponse.prototype);\n\n// src/utils.ts\nasync function readWithoutBlocking(readPromise) {\n return Promise.race([readPromise, Promise.resolve().then(() => Promise.resolve(void 0))]);\n}\nfunction writeFromReadableStreamDefaultReader(reader, writable, currentReadPromise) {\n const cancel = (error) => {\n reader.cancel(error).catch(() => {\n });\n };\n writable.on(\"close\", cancel);\n writable.on(\"error\", cancel);\n (currentReadPromise ?? reader.read()).then(flow, handleStreamError);\n return reader.closed.finally(() => {\n writable.off(\"close\", cancel);\n writable.off(\"error\", cancel);\n });\n function handleStreamError(error) {\n if (error) {\n writable.destroy(error);\n }\n }\n function onDrain() {\n reader.read().then(flow, handleStreamError);\n }\n function flow({ done, value }) {\n try {\n if (done) {\n writable.end();\n } else if (!writable.write(value)) {\n writable.once(\"drain\", onDrain);\n } else {\n return reader.read().then(flow, handleStreamError);\n }\n } catch (e) {\n handleStreamError(e);\n }\n }\n}\nfunction writeFromReadableStream(stream, writable) {\n if (stream.locked) {\n throw new TypeError(\"ReadableStream is locked.\");\n } else if (writable.destroyed) {\n return;\n }\n return writeFromReadableStreamDefaultReader(stream.getReader(), writable);\n}\nvar buildOutgoingHttpHeaders = (headers) => {\n const res = {};\n if (!(headers instanceof Headers)) {\n headers = new Headers(headers ?? void 0);\n }\n const cookies = [];\n for (const [k, v] of headers) {\n if (k === \"set-cookie\") {\n cookies.push(v);\n } else {\n res[k] = v;\n }\n }\n if (cookies.length > 0) {\n res[\"set-cookie\"] = cookies;\n }\n res[\"content-type\"] ??= \"text/plain; charset=UTF-8\";\n return res;\n};\n\n// src/utils/response/constants.ts\nvar X_ALREADY_SENT = \"x-hono-already-sent\";\n\n// src/globals.ts\nimport crypto from \"crypto\";\nif (typeof global.crypto === \"undefined\") {\n global.crypto = crypto;\n}\n\n// src/listener.ts\nvar outgoingEnded = Symbol(\"outgoingEnded\");\nvar incomingDraining = Symbol(\"incomingDraining\");\nvar DRAIN_TIMEOUT_MS = 500;\nvar MAX_DRAIN_BYTES = 64 * 1024 * 1024;\nvar drainIncoming = (incoming) => {\n const incomingWithDrainState = incoming;\n if (incoming.destroyed || incomingWithDrainState[incomingDraining]) {\n return;\n }\n incomingWithDrainState[incomingDraining] = true;\n if (incoming instanceof Http2ServerRequest2) {\n try {\n ;\n incoming.stream?.close?.(h2constants.NGHTTP2_NO_ERROR);\n } catch {\n }\n return;\n }\n let bytesRead = 0;\n const cleanup = () => {\n clearTimeout(timer);\n incoming.off(\"data\", onData);\n incoming.off(\"end\", cleanup);\n incoming.off(\"error\", cleanup);\n };\n const forceClose = () => {\n cleanup();\n const socket = incoming.socket;\n if (socket && !socket.destroyed) {\n socket.destroySoon();\n }\n };\n const timer = setTimeout(forceClose, DRAIN_TIMEOUT_MS);\n timer.unref?.();\n const onData = (chunk) => {\n bytesRead += chunk.length;\n if (bytesRead > MAX_DRAIN_BYTES) {\n forceClose();\n }\n };\n incoming.on(\"data\", onData);\n incoming.on(\"end\", cleanup);\n incoming.on(\"error\", cleanup);\n incoming.resume();\n};\nvar handleRequestError = () => new Response(null, {\n status: 400\n});\nvar handleFetchError = (e) => new Response(null, {\n status: e instanceof Error && (e.name === \"TimeoutError\" || e.constructor.name === \"TimeoutError\") ? 504 : 500\n});\nvar handleResponseError = (e, outgoing) => {\n const err = e instanceof Error ? e : new Error(\"unknown error\", { cause: e });\n if (err.code === \"ERR_STREAM_PREMATURE_CLOSE\") {\n console.info(\"The user aborted a request.\");\n } else {\n console.error(e);\n if (!outgoing.headersSent) {\n outgoing.writeHead(500, { \"Content-Type\": \"text/plain\" });\n }\n outgoing.end(`Error: ${err.message}`);\n outgoing.destroy(err);\n }\n};\nvar flushHeaders = (outgoing) => {\n if (\"flushHeaders\" in outgoing && outgoing.writable) {\n outgoing.flushHeaders();\n }\n};\nvar responseViaCache = async (res, outgoing) => {\n let [status, body, header] = res[cacheKey];\n let hasContentLength = false;\n if (!header) {\n header = { \"content-type\": \"text/plain; charset=UTF-8\" };\n } else if (header instanceof Headers) {\n hasContentLength = header.has(\"content-length\");\n header = buildOutgoingHttpHeaders(header);\n } else if (Array.isArray(header)) {\n const headerObj = new Headers(header);\n hasContentLength = headerObj.has(\"content-length\");\n header = buildOutgoingHttpHeaders(headerObj);\n } else {\n for (const key in header) {\n if (key.length === 14 && key.toLowerCase() === \"content-length\") {\n hasContentLength = true;\n break;\n }\n }\n }\n if (!hasContentLength) {\n if (typeof body === \"string\") {\n header[\"Content-Length\"] = Buffer.byteLength(body);\n } else if (body instanceof Uint8Array) {\n header[\"Content-Length\"] = body.byteLength;\n } else if (body instanceof Blob) {\n header[\"Content-Length\"] = body.size;\n }\n }\n outgoing.writeHead(status, header);\n if (typeof body === \"string\" || body instanceof Uint8Array) {\n outgoing.end(body);\n } else if (body instanceof Blob) {\n outgoing.end(new Uint8Array(await body.arrayBuffer()));\n } else {\n flushHeaders(outgoing);\n await writeFromReadableStream(body, outgoing)?.catch(\n (e) => handleResponseError(e, outgoing)\n );\n }\n ;\n outgoing[outgoingEnded]?.();\n};\nvar isPromise = (res) => typeof res.then === \"function\";\nvar responseViaResponseObject = async (res, outgoing, options = {}) => {\n if (isPromise(res)) {\n if (options.errorHandler) {\n try {\n res = await res;\n } catch (err) {\n const errRes = await options.errorHandler(err);\n if (!errRes) {\n return;\n }\n res = errRes;\n }\n } else {\n res = await res.catch(handleFetchError);\n }\n }\n if (cacheKey in res) {\n return responseViaCache(res, outgoing);\n }\n const resHeaderRecord = buildOutgoingHttpHeaders(res.headers);\n if (res.body) {\n const reader = res.body.getReader();\n const values = [];\n let done = false;\n let currentReadPromise = void 0;\n if (resHeaderRecord[\"transfer-encoding\"] !== \"chunked\") {\n let maxReadCount = 2;\n for (let i = 0; i < maxReadCount; i++) {\n currentReadPromise ||= reader.read();\n const chunk = await readWithoutBlocking(currentReadPromise).catch((e) => {\n console.error(e);\n done = true;\n });\n if (!chunk) {\n if (i === 1) {\n await new Promise((resolve) => setTimeout(resolve));\n maxReadCount = 3;\n continue;\n }\n break;\n }\n currentReadPromise = void 0;\n if (chunk.value) {\n values.push(chunk.value);\n }\n if (chunk.done) {\n done = true;\n break;\n }\n }\n if (done && !(\"content-length\" in resHeaderRecord)) {\n resHeaderRecord[\"content-length\"] = values.reduce((acc, value) => acc + value.length, 0);\n }\n }\n outgoing.writeHead(res.status, resHeaderRecord);\n values.forEach((value) => {\n ;\n outgoing.write(value);\n });\n if (done) {\n outgoing.end();\n } else {\n if (values.length === 0) {\n flushHeaders(outgoing);\n }\n await writeFromReadableStreamDefaultReader(reader, outgoing, currentReadPromise);\n }\n } else if (resHeaderRecord[X_ALREADY_SENT]) {\n } else {\n outgoing.writeHead(res.status, resHeaderRecord);\n outgoing.end();\n }\n ;\n outgoing[outgoingEnded]?.();\n};\nvar getRequestListener = (fetchCallback, options = {}) => {\n const autoCleanupIncoming = options.autoCleanupIncoming ?? true;\n if (options.overrideGlobalObjects !== false && global.Request !== Request) {\n Object.defineProperty(global, \"Request\", {\n value: Request\n });\n Object.defineProperty(global, \"Response\", {\n value: Response2\n });\n }\n return async (incoming, outgoing) => {\n let res, req;\n try {\n req = newRequest(incoming, options.hostname);\n let incomingEnded = !autoCleanupIncoming || incoming.method === \"GET\" || incoming.method === \"HEAD\";\n if (!incomingEnded) {\n ;\n incoming[wrapBodyStream] = true;\n incoming.on(\"end\", () => {\n incomingEnded = true;\n });\n if (incoming instanceof Http2ServerRequest2) {\n ;\n outgoing[outgoingEnded] = () => {\n if (!incomingEnded) {\n setTimeout(() => {\n if (!incomingEnded) {\n setTimeout(() => {\n drainIncoming(incoming);\n });\n }\n });\n }\n };\n }\n outgoing.on(\"finish\", () => {\n if (!incomingEnded) {\n drainIncoming(incoming);\n }\n });\n }\n outgoing.on(\"close\", () => {\n const abortController = req[abortControllerKey];\n if (abortController) {\n if (incoming.errored) {\n req[abortControllerKey].abort(incoming.errored.toString());\n } else if (!outgoing.writableFinished) {\n req[abortControllerKey].abort(\"Client connection prematurely closed.\");\n }\n }\n if (!incomingEnded) {\n setTimeout(() => {\n if (!incomingEnded) {\n setTimeout(() => {\n drainIncoming(incoming);\n });\n }\n });\n }\n });\n res = fetchCallback(req, { incoming, outgoing });\n if (cacheKey in res) {\n return responseViaCache(res, outgoing);\n }\n } catch (e) {\n if (!res) {\n if (options.errorHandler) {\n res = await options.errorHandler(req ? e : toRequestError(e));\n if (!res) {\n return;\n }\n } else if (!req) {\n res = handleRequestError();\n } else {\n res = handleFetchError(e);\n }\n } else {\n return handleResponseError(e, outgoing);\n }\n }\n try {\n return await responseViaResponseObject(res, outgoing, options);\n } catch (e) {\n return handleResponseError(e, outgoing);\n }\n };\n};\n\n// src/server.ts\nvar createAdaptorServer = (options) => {\n const fetchCallback = options.fetch;\n const requestListener = getRequestListener(fetchCallback, {\n hostname: options.hostname,\n overrideGlobalObjects: options.overrideGlobalObjects,\n autoCleanupIncoming: options.autoCleanupIncoming\n });\n const createServer = options.createServer || createServerHTTP;\n const server = createServer(options.serverOptions || {}, requestListener);\n return server;\n};\nvar serve = (options, listeningListener) => {\n const server = createAdaptorServer(options);\n server.listen(options?.port ?? 3e3, options.hostname, () => {\n const serverInfo = server.address();\n listeningListener && listeningListener(serverInfo);\n });\n return server;\n};\nexport {\n RequestError,\n createAdaptorServer,\n getRequestListener,\n serve\n};\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { serve } from '@hono/node-server';\nimport { readFileSync, existsSync, writeFileSync, readdirSync, statSync } from 'fs';\nimport { join, basename, relative } from 'path';\nimport { collectSnapshot } from './telemetry.js';\nimport { loadConfig } from '../core/config.js';\nimport { loadState, saveState } from './state.js';\nimport { loadAllPrimitives, loadDirectory, parseHarnessDocument } from '../primitives/loader.js';\nimport { listSessions } from './sessions.js';\nimport { validateMcpConfig } from './mcp.js';\nimport { Conversation } from './conversation.js';\nimport { CORE_PRIMITIVE_DIRS } from '../core/types.js';\nimport { log } from '../core/logger.js';\nimport type { HarnessDocument } from '../core/types.js';\nimport type { ConversationSendResult } from './conversation.js';\nimport type { Server } from 'http';\n\n// --- Types ---\n\nexport interface WebServerOptions {\n harnessDir: string;\n port?: number;\n /** API key for LLM calls (chat) */\n apiKey?: string;\n /** Callback when server starts */\n onStart?: (port: number) => void;\n}\n\nexport interface ServerSentEvent {\n type: string;\n data: unknown;\n timestamp: string;\n}\n\n// --- SSE Client Manager ---\n\ntype SSEClient = {\n id: string;\n controller: ReadableStreamDefaultController;\n};\n\nclass SSEBroadcaster {\n private clients: SSEClient[] = [];\n private nextId = 0;\n\n addClient(controller: ReadableStreamDefaultController): string {\n const id = String(this.nextId++);\n this.clients.push({ id, controller });\n return id;\n }\n\n removeClient(id: string): void {\n this.clients = this.clients.filter((c) => c.id !== id);\n }\n\n broadcast(event: ServerSentEvent): void {\n const message = `event: ${event.type}\\ndata: ${JSON.stringify(event.data)}\\n\\n`;\n const encoder = new TextEncoder();\n const encoded = encoder.encode(message);\n\n for (const client of this.clients) {\n try {\n client.controller.enqueue(encoded);\n } catch {\n // Client disconnected — will be cleaned up\n }\n }\n }\n\n get clientCount(): number {\n return this.clients.length;\n }\n}\n\n// --- File Tree Helpers ---\n\ninterface FileTreeNode {\n name: string;\n path: string;\n type: 'file' | 'directory';\n children?: FileTreeNode[];\n size?: number;\n modified?: string;\n}\n\nfunction buildFileTree(baseDir: string, dirPath: string, maxDepth = 3, depth = 0): FileTreeNode[] {\n if (depth >= maxDepth || !existsSync(dirPath)) return [];\n\n const entries = readdirSync(dirPath);\n const nodes: FileTreeNode[] = [];\n\n for (const entry of entries) {\n if (entry.startsWith('.') && entry !== '.gitignore') continue;\n if (entry === 'node_modules') continue;\n\n const fullPath = join(dirPath, entry);\n const relPath = relative(baseDir, fullPath);\n\n try {\n const stat = statSync(fullPath);\n if (stat.isDirectory()) {\n nodes.push({\n name: entry,\n path: relPath,\n type: 'directory',\n children: buildFileTree(baseDir, fullPath, maxDepth, depth + 1),\n });\n } else {\n nodes.push({\n name: entry,\n path: relPath,\n type: 'file',\n size: stat.size,\n modified: stat.mtime.toISOString(),\n });\n }\n } catch {\n // Skip inaccessible files\n }\n }\n\n return nodes.sort((a, b) => {\n if (a.type !== b.type) return a.type === 'directory' ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n}\n\n// --- Hono App Factory ---\n\nexport interface CreateWebAppOptions {\n apiKey?: string;\n}\n\nexport function createWebApp(harnessDir: string, options?: CreateWebAppOptions): { app: Hono; broadcaster: SSEBroadcaster } {\n const app = new Hono();\n const broadcaster = new SSEBroadcaster();\n let conversation: Conversation | null = null;\n\n // CORS for local development\n app.use('*', cors({\n origin: '*',\n allowMethods: ['GET', 'POST', 'PUT'],\n allowHeaders: ['Content-Type'],\n }));\n\n // --- API Routes ---\n\n // Full telemetry snapshot\n app.get('/api/snapshot', (c) => {\n try {\n const snapshot = collectSnapshot(harnessDir);\n return c.json(snapshot);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to collect snapshot' }, 500);\n }\n });\n\n // Current config\n app.get('/api/config', (c) => {\n try {\n const config = loadConfig(harnessDir);\n return c.json(config);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to load config' }, 500);\n }\n });\n\n // Agent state\n app.get('/api/state', (c) => {\n try {\n const state = loadState(harnessDir);\n return c.json(state);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to load state' }, 500);\n }\n });\n\n // Update agent state (partial)\n app.put('/api/state', async (c) => {\n try {\n const body = await c.req.json() as Record<string, unknown>;\n const current = loadState(harnessDir);\n const updated = { ...current, ...body };\n saveState(harnessDir, updated);\n return c.json(updated);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to update state' }, 500);\n }\n });\n\n // All primitives grouped by directory\n app.get('/api/primitives', (c) => {\n try {\n const config = loadConfig(harnessDir);\n const extDirs = config.extensions?.directories ?? [];\n const all = loadAllPrimitives(harnessDir, extDirs);\n const result: Record<string, Array<{ id: string; path: string; l0: string | null; tags: string[] }>> = {};\n\n for (const [dir, docs] of all.entries()) {\n result[dir] = docs.map((doc) => ({\n id: doc.frontmatter.id ?? basename(doc.path, '.md'),\n path: doc.path,\n l0: doc.l0,\n tags: doc.frontmatter.tags ?? [],\n }));\n }\n\n return c.json(result);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to load primitives' }, 500);\n }\n });\n\n // Primitives of a specific type\n app.get('/api/primitives/:type', (c) => {\n const type = c.req.param('type');\n if (!(CORE_PRIMITIVE_DIRS as readonly string[]).includes(type) && type !== 'intake') {\n return c.json({ error: `Unknown primitive type: ${type}` }, 404);\n }\n\n try {\n const dirPath = join(harnessDir, type);\n if (!existsSync(dirPath)) {\n return c.json([]);\n }\n\n const docs = loadDirectory(dirPath);\n return c.json(docs.map(serializeDoc));\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to load primitives' }, 500);\n }\n });\n\n // Single primitive by type and filename\n app.get('/api/primitives/:type/:file', (c) => {\n const type = c.req.param('type');\n const file = c.req.param('file');\n const filePath = join(harnessDir, type, file.endsWith('.md') ? file : `${file}.md`);\n\n if (!existsSync(filePath)) {\n return c.json({ error: `Primitive not found: ${type}/${file}` }, 404);\n }\n\n try {\n const doc = parseHarnessDocument(filePath);\n return c.json(serializeDoc(doc));\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to parse primitive' }, 500);\n }\n });\n\n // Update a primitive's content\n app.put('/api/primitives/:type/:file', async (c) => {\n const type = c.req.param('type');\n const file = c.req.param('file');\n const filePath = join(harnessDir, type, file.endsWith('.md') ? file : `${file}.md`);\n\n if (!existsSync(filePath)) {\n return c.json({ error: `Primitive not found: ${type}/${file}` }, 404);\n }\n\n try {\n const body = await c.req.json() as { content: string };\n if (typeof body.content !== 'string') {\n return c.json({ error: 'Request body must have a \"content\" string field' }, 400);\n }\n writeFileSync(filePath, body.content, 'utf-8');\n const doc = parseHarnessDocument(filePath);\n return c.json(serializeDoc(doc));\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to update primitive' }, 500);\n }\n });\n\n // Session list\n app.get('/api/sessions', (c) => {\n try {\n const sessions = listSessions(harnessDir);\n return c.json(sessions);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to list sessions' }, 500);\n }\n });\n\n // Read a session file\n app.get('/api/sessions/:id', (c) => {\n const id = c.req.param('id');\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const filePath = join(sessionsDir, `${id}.md`);\n\n if (!existsSync(filePath)) {\n return c.json({ error: `Session not found: ${id}` }, 404);\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n return c.json({ id, content });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to read session' }, 500);\n }\n });\n\n // --- Chat API ---\n\n // Send a message and get a response\n app.post('/api/chat', async (c) => {\n try {\n const body = await c.req.json() as { message: string };\n if (typeof body.message !== 'string' || !body.message.trim()) {\n return c.json({ error: 'Request body must have a non-empty \"message\" string field' }, 400);\n }\n\n // Initialize conversation on first message\n if (!conversation) {\n conversation = new Conversation(harnessDir, options?.apiKey);\n await conversation.init();\n }\n\n const result: ConversationSendResult = await conversation.send(body.message);\n\n // Broadcast to SSE clients\n broadcaster.broadcast({\n type: 'chat_response',\n data: { text: result.text, usage: result.usage, steps: result.steps },\n timestamp: new Date().toISOString(),\n });\n\n return c.json({\n text: result.text,\n usage: result.usage,\n steps: result.steps,\n toolCalls: result.toolCalls,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Chat error' }, 500);\n }\n });\n\n // Reset conversation (clear history)\n app.post('/api/chat/reset', (c) => {\n conversation = null;\n return c.json({ ok: true });\n });\n\n // --- MCP Status API ---\n\n app.get('/api/mcp', (c) => {\n try {\n const config = loadConfig(harnessDir);\n const errors = validateMcpConfig(config);\n const errorServerNames = new Set(errors.map((e) => e.server));\n\n const servers = Object.entries(config.mcp.servers).map(([name, server]) => ({\n name,\n transport: server.transport,\n enabled: server.enabled,\n valid: !errorServerNames.has(name),\n command: server.command,\n url: server.url,\n error: errors.find((e) => e.server === name)?.error,\n }));\n\n return c.json({\n serverCount: servers.length,\n enabledCount: servers.filter((s) => s.enabled).length,\n servers,\n errors,\n });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'MCP status error' }, 500);\n }\n });\n\n // --- File Tree API ---\n\n // Get full file tree\n app.get('/api/files', (c) => {\n try {\n const tree = buildFileTree(harnessDir, harnessDir);\n return c.json(tree);\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to build file tree' }, 500);\n }\n });\n\n // Read a file by relative path (supports nested paths via wildcard)\n app.get('/api/files/*', (c) => {\n const relPath = c.req.path.replace('/api/files/', '');\n if (!relPath) {\n return c.json({ error: 'File path required' }, 400);\n }\n\n const filePath = join(harnessDir, relPath);\n\n // Security: prevent path traversal\n if (!filePath.startsWith(harnessDir)) {\n return c.json({ error: 'Access denied: path traversal detected' }, 403);\n }\n if (!existsSync(filePath)) {\n return c.json({ error: 'File not found' }, 404);\n }\n\n try {\n const stat = statSync(filePath);\n if (stat.isDirectory()) {\n return c.json({ error: 'Path is a directory, not a file' }, 400);\n }\n const content = readFileSync(filePath, 'utf-8');\n return c.json({ path: relPath, content, size: stat.size, modified: stat.mtime.toISOString() });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to read file' }, 500);\n }\n });\n\n // Write a file (only within primitive dirs + core files)\n app.put('/api/files/*', async (c) => {\n const relPath = c.req.path.replace('/api/files/', '');\n if (!relPath) {\n return c.json({ error: 'File path required' }, 400);\n }\n\n const filePath = join(harnessDir, relPath);\n if (!filePath.startsWith(harnessDir)) {\n return c.json({ error: 'Access denied: path traversal detected' }, 403);\n }\n\n // Only allow editing within primitive dirs + top-level md/yaml files\n const allowedPrefixes = ['rules/', 'instincts/', 'skills/', 'playbooks/', 'workflows/', 'tools/', 'agents/'];\n const allowedFiles = ['CORE.md', 'SYSTEM.md', 'state.md', 'config.yaml'];\n const isAllowed = allowedPrefixes.some((p) => relPath.startsWith(p)) || allowedFiles.includes(relPath);\n if (!isAllowed) {\n return c.json({ error: 'Cannot edit files outside primitive directories and core files' }, 403);\n }\n\n try {\n const body = await c.req.json() as { content: string };\n if (typeof body.content !== 'string') {\n return c.json({ error: 'Request body must have a \"content\" string field' }, 400);\n }\n writeFileSync(filePath, body.content, 'utf-8');\n return c.json({ ok: true, path: relPath });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to write file' }, 500);\n }\n });\n\n // --- Config Update API ---\n\n app.put('/api/config', async (c) => {\n try {\n const configPath = join(harnessDir, 'config.yaml');\n const body = await c.req.json() as { content: string };\n if (typeof body.content !== 'string') {\n return c.json({ error: 'Request body must have a \"content\" string field' }, 400);\n }\n writeFileSync(configPath, body.content, 'utf-8');\n\n // Validate by reloading\n const config = loadConfig(harnessDir);\n\n broadcaster.broadcast({\n type: 'config_change',\n data: { model: config.model.id },\n timestamp: new Date().toISOString(),\n });\n\n return c.json({ ok: true, agent: config.agent.name });\n } catch (err) {\n return c.json({ error: err instanceof Error ? err.message : 'Failed to update config' }, 500);\n }\n });\n\n // SSE Events stream\n app.get('/api/events', (c) => {\n const stream = new ReadableStream({\n start(controller) {\n const clientId = broadcaster.addClient(controller);\n\n // Send initial connection event\n const encoder = new TextEncoder();\n const connectMsg = `event: connected\\ndata: ${JSON.stringify({ clientId, timestamp: new Date().toISOString() })}\\n\\n`;\n controller.enqueue(encoder.encode(connectMsg));\n\n // Handle client disconnect via abort signal\n c.req.raw.signal.addEventListener('abort', () => {\n broadcaster.removeClient(clientId);\n });\n },\n cancel() {\n // Stream cancelled\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n },\n });\n });\n\n // SSE client count (for monitoring)\n app.get('/api/events/clients', (c) => {\n return c.json({ count: broadcaster.clientCount });\n });\n\n // --- Dashboard HTML ---\n app.get('/', (c) => {\n return c.html(buildDashboardHtml(harnessDir));\n });\n\n return { app, broadcaster };\n}\n\n// --- Server Lifecycle ---\n\nexport async function startWebServer(options: WebServerOptions): Promise<{ server: Server; broadcaster: SSEBroadcaster }> {\n const { harnessDir, port: preferredPort = 3000, apiKey, onStart } = options;\n const { app, broadcaster } = createWebApp(harnessDir, { apiKey });\n const maxAttempts = 10;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const port = preferredPort + attempt;\n try {\n const server = await new Promise<Server>((resolve, reject) => {\n const s = serve({ fetch: app.fetch, port }, () => {\n log.info(`Web server started on http://localhost:${port}`);\n onStart?.(port);\n resolve(s as unknown as Server);\n });\n (s as unknown as Server).on('error', reject);\n });\n return { server, broadcaster };\n } catch (err: unknown) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EADDRINUSE' && attempt < maxAttempts - 1) {\n log.warn(`Port ${port} in use, trying ${port + 1}...`);\n continue;\n }\n throw err;\n }\n }\n\n throw new Error(`No available port found (tried ${preferredPort}-${preferredPort + maxAttempts - 1})`);\n}\n\n// --- Helpers ---\n\nfunction serializeDoc(doc: HarnessDocument): Record<string, unknown> {\n return {\n path: doc.path,\n frontmatter: doc.frontmatter,\n l0: doc.l0,\n l1: doc.l1,\n body: doc.body,\n };\n}\n\n// --- Inline Dashboard HTML ---\n\nfunction buildDashboardHtml(harnessDir: string): string {\n let agentName = 'Agent';\n try {\n const config = loadConfig(harnessDir);\n agentName = config.agent.name;\n } catch { /* ignore */ }\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>${escapeHtml(agentName)} Dashboard</title>\n<style>\n:root{--bg:#0d1117;--surface:#161b22;--border:#30363d;--text:#c9d1d9;--dim:#8b949e;--accent:#58a6ff;--green:#3fb950;--red:#f85149;--yellow:#d29922;--font:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,monospace}\n*{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:var(--font);background:var(--bg);color:var(--text);font-size:13px;line-height:1.5}\n.layout{display:grid;grid-template-columns:200px 1fr;grid-template-rows:44px 1fr;height:100vh}\n.topbar{grid-column:1/-1;background:var(--surface);border-bottom:1px solid var(--border);display:flex;align-items:center;padding:0 16px;gap:12px}\n.topbar h1{font-size:14px;font-weight:600;color:var(--accent)}\n.topbar .status{font-size:11px;color:var(--dim);display:flex;align-items:center;gap:4px}\n.dot{width:7px;height:7px;border-radius:50%;display:inline-block}\n.dot.ok{background:var(--green)}.dot.warn{background:var(--yellow)}.dot.err{background:var(--red)}\n.sidebar{background:var(--surface);border-right:1px solid var(--border);overflow-y:auto;padding-top:8px}\n.nav{display:block;padding:6px 16px;color:var(--dim);cursor:pointer;border:none;background:none;width:100%;text-align:left;font:inherit;font-size:12px}\n.nav:hover{background:var(--border);color:var(--text)}.nav.active{color:var(--accent);background:rgba(88,166,255,.1)}\n.main{overflow-y:auto;padding:16px}\n.panel{display:none}.panel.active{display:block}\n.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin-bottom:16px}\n.card{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:12px}\n.card h3{font-size:10px;color:var(--dim);text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}\n.m{display:flex;justify-content:space-between;padding:2px 0;font-size:12px}\n.m .l{color:var(--dim)}.m .v{font-weight:600}\n.v.g{color:var(--green)}.v.r{color:var(--red)}.v.y{color:var(--yellow)}\n.badge{display:inline-block;padding:1px 6px;border-radius:10px;font-size:10px;font-weight:500}\n.badge.g{background:rgba(63,185,80,.15);color:var(--green)}\n.badge.r{background:rgba(248,81,73,.15);color:var(--red)}\n.badge.y{background:rgba(210,153,34,.15);color:var(--yellow)}\ntable{width:100%;border-collapse:collapse;font-size:12px}\nth{text-align:left;color:var(--dim);padding:4px 6px;border-bottom:1px solid var(--border);font-size:10px;text-transform:uppercase}\ntd{padding:4px 6px;border-bottom:1px solid var(--border)}\n.events{max-height:180px;overflow-y:auto;font-size:11px;font-family:monospace;background:var(--bg);padding:6px;border-radius:4px;border:1px solid var(--border)}\n.events .ev{padding:1px 0;color:var(--dim)}.events .ev .t{color:var(--accent);margin-right:6px}\n.chat-wrap{display:flex;flex-direction:column;height:calc(100vh - 76px)}\n.chat-msgs{flex:1;overflow-y:auto;padding:8px 0}\n.msg{padding:6px 0}.msg .role{font-size:10px;font-weight:600;margin-bottom:1px}\n.msg .role.user{color:var(--accent)}.msg .role.assistant{color:var(--green)}\n.msg .body{white-space:pre-wrap;word-wrap:break-word}.msg .meta{font-size:10px;color:var(--dim);margin-top:2px}\n.chat-bar{display:flex;gap:6px;padding:8px 0;border-top:1px solid var(--border)}\n.chat-bar input{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:8px 10px;color:var(--text);font:inherit;outline:none}\n.chat-bar input:focus{border-color:var(--accent)}\n.chat-bar button{background:var(--accent);color:#fff;border:none;border-radius:4px;padding:8px 16px;cursor:pointer;font:inherit;font-weight:600}\n.chat-bar button:disabled{opacity:.5;cursor:not-allowed}\n.editor-wrap{display:grid;grid-template-columns:220px 1fr;gap:12px;height:calc(100vh - 76px)}\n.tree{font-size:11px;overflow-y:auto}\n.tree .d{cursor:pointer;padding:2px 0}.tree .d::before{content:'\\\\25b8 ';color:var(--dim)}.tree .d.open::before{content:'\\\\25be '}\n.tree .f{padding:2px 0 2px 14px;cursor:pointer;color:var(--dim)}.tree .f:hover{color:var(--accent)}\n.tree .ch{padding-left:14px;display:none}.tree .d.open+.ch{display:block}\n.ed-area{display:flex;flex-direction:column}\n.ed-head{padding:6px 0;font-size:11px;color:var(--dim);border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}\n.ed-ta{flex:1;background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:10px;color:var(--text);font:inherit;font-size:11px;resize:none;outline:none;tab-size:2}\n.ed-ta:focus{border-color:var(--accent)}\n.save-btn{background:var(--green);color:var(--bg);border:none;border-radius:3px;padding:3px 10px;cursor:pointer;font:inherit;font-size:10px;font-weight:600}\n.config-block{background:var(--surface);border:1px solid var(--border);border-radius:6px;padding:12px;white-space:pre-wrap;font-size:11px;font-family:monospace;overflow-x:auto;min-height:200px}\n.toast-box{position:fixed;bottom:16px;right:16px;z-index:1000}\n.toast{background:var(--surface);border:1px solid var(--border);border-radius:4px;padding:8px 12px;margin-top:6px;font-size:11px}\n</style>\n</head>\n<body>\n<div class=\"layout\">\n<div class=\"topbar\">\n <h1 id=\"title\">${escapeHtml(agentName)}</h1>\n <div class=\"status\"><span class=\"dot warn\" id=\"sdot\"></span><span id=\"stxt\">connecting</span></div>\n <div style=\"flex:1\"></div>\n <div class=\"status\"><span class=\"dot ok\" style=\"animation:pulse 2s infinite\"></span>live</div>\n</div>\n<div class=\"sidebar\">\n <button class=\"nav active\" data-p=\"dashboard\">Dashboard</button>\n <button class=\"nav\" data-p=\"chat\">Chat</button>\n <button class=\"nav\" data-p=\"files\">Files</button>\n <button class=\"nav\" data-p=\"mcp\">MCP Servers</button>\n <button class=\"nav\" data-p=\"settings\">Settings</button>\n</div>\n<div class=\"main\">\n\n<!-- Dashboard -->\n<div class=\"panel active\" id=\"p-dashboard\">\n <div class=\"grid\" id=\"dash-cards\"></div>\n <div class=\"grid\">\n <div class=\"card\"><h3>Health Checks</h3><div id=\"dash-health\"></div></div>\n <div class=\"card\"><h3>MCP Servers</h3><div id=\"dash-mcp\"></div></div>\n <div class=\"card\"><h3>Live Events</h3><div class=\"events\" id=\"evlog\"></div></div>\n </div>\n</div>\n\n<!-- Chat -->\n<div class=\"panel\" id=\"p-chat\">\n <div class=\"chat-wrap\">\n <div style=\"display:flex;justify-content:space-between;align-items:center;padding-bottom:6px\">\n <strong>Chat</strong>\n <button class=\"save-btn\" onclick=\"resetChat()\">Reset</button>\n </div>\n <div class=\"chat-msgs\" id=\"chat-msgs\"></div>\n <div class=\"chat-bar\">\n <input type=\"text\" id=\"chat-in\" placeholder=\"Type a message...\" autocomplete=\"off\">\n <button id=\"chat-btn\">Send</button>\n </div>\n </div>\n</div>\n\n<!-- Files -->\n<div class=\"panel\" id=\"p-files\">\n <div class=\"editor-wrap\">\n <div class=\"tree\" id=\"ftree\"></div>\n <div class=\"ed-area\">\n <div class=\"ed-head\"><span id=\"ed-path\">Select a file</span><button class=\"save-btn\" id=\"ed-save\" style=\"display:none\" onclick=\"saveFile()\">Save</button></div>\n <textarea class=\"ed-ta\" id=\"ed-ta\" disabled placeholder=\"Select a file...\"></textarea>\n </div>\n </div>\n</div>\n\n<!-- MCP -->\n<div class=\"panel\" id=\"p-mcp\">\n <h2 style=\"margin-bottom:12px\">MCP Servers</h2>\n <div id=\"mcp-detail\"></div>\n</div>\n\n<!-- Settings -->\n<div class=\"panel\" id=\"p-settings\">\n <div style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:12px\">\n <h2>config.yaml</h2>\n <button class=\"save-btn\" onclick=\"saveConfig()\">Save Config</button>\n </div>\n <textarea class=\"config-block\" id=\"cfg-ta\" style=\"width:100%;min-height:400px;resize:vertical\"></textarea>\n</div>\n\n</div>\n</div>\n<div class=\"toast-box\" id=\"toasts\"></div>\n<style>@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}</style>\n<script>\n(function(){\nlet curPanel='dashboard',curFile=null,sending=false;\n\n// Nav\ndocument.querySelectorAll('.nav').forEach(b=>{b.addEventListener('click',()=>{\n document.querySelectorAll('.nav').forEach(n=>n.classList.remove('active'));b.classList.add('active');\n document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));\n const p=b.dataset.p;document.getElementById('p-'+p).classList.add('active');curPanel=p;\n if(p==='dashboard')loadDash();if(p==='files')loadTree();if(p==='mcp')loadMcp();if(p==='settings')loadCfg();\n})});\n\n// Helpers\nasync function api(path,opts){const r=await fetch('/api/'+path,opts);if(!r.ok){const e=await r.json().catch(()=>({error:r.statusText}));throw new Error(e.error||r.statusText)}return r.json()}\nfunction toast(m){const e=document.createElement('div');e.className='toast';e.textContent=m;document.getElementById('toasts').appendChild(e);setTimeout(()=>e.remove(),4000)}\nfunction esc(s){const d=document.createElement('div');d.textContent=s;return d.innerHTML}\nfunction mt(l,v,c){return '<div class=\"m\"><span class=\"l\">'+esc(l)+'</span><span class=\"v'+(c?' '+c:'')+'\">'+v+'</span></div>'}\nfunction bg(t,c){return '<span class=\"badge '+c+'\">'+esc(t)+'</span>'}\nfunction f$(v){return '$'+(v||0).toFixed(2)}\n\n// Dashboard\nasync function loadDash(){try{\n const s=await api('snapshot');\n document.getElementById('title').textContent=s.agent.name;document.title=s.agent.name+' Dashboard';\n const c=document.getElementById('dash-cards');c.innerHTML='';\n function card(l,v,sub){c.innerHTML+='<div class=\"card\"><h3>'+esc(l)+'</h3><div style=\"font-size:18px;font-weight:700\">'+esc(String(v))+'</div>'+(sub?'<div style=\"font-size:10px;color:var(--dim);margin-top:2px\">'+esc(sub)+'</div>':'')+'</div>'}\n card('Status',s.health.status,s.agent.mode);\n card('Sessions',s.sessions.total,s.sessions.totalTokens.toLocaleString()+' tokens');\n card('Today',f$(s.spending.today.total_cost_usd),s.spending.today.entries+' calls');\n card('Monthly',f$(s.spending.thisMonth.total_cost_usd));\n card('Workflows',s.workflows.totalRuns+' runs',s.workflows.overallSuccessRate.toFixed(0)+'% success');\n card('Primitives',s.storage.primitiveCount,s.storage.sessionCount+' sessions');\n card('MCP',s.mcp.enabledCount+'/'+s.mcp.serverCount+' servers');\n card('Last Active',s.agent.lastInteraction==='never'?'never':new Date(s.agent.lastInteraction).toLocaleString());\n // Health dot\n const dot=document.getElementById('sdot');const txt=document.getElementById('stxt');\n dot.className='dot '+(s.health.status==='healthy'?'ok':s.health.status==='degraded'?'warn':'err');\n txt.textContent=s.health.status;\n // Health checks\n const hh=document.getElementById('dash-health');\n hh.innerHTML=s.health.checks.length===0?'<span style=\"color:var(--dim)\">No checks</span>':\n '<table><tr><th>Check</th><th>Status</th><th>Message</th></tr>'+s.health.checks.map(c=>'<tr><td>'+esc(c.name)+'</td><td>'+bg(c.status,c.status==='pass'?'g':c.status==='warn'?'y':'r')+'</td><td>'+esc(c.message)+'</td></tr>').join('')+'</table>';\n // MCP summary\n const mm=document.getElementById('dash-mcp');\n mm.innerHTML=s.mcp.servers.length===0?'<span style=\"color:var(--dim)\">None configured</span>':\n '<table><tr><th>Name</th><th>Transport</th><th>Status</th></tr>'+s.mcp.servers.map(s=>'<tr><td>'+esc(s.name)+'</td><td>'+esc(s.transport)+'</td><td>'+(s.enabled?(s.valid?bg('ok','g'):bg('error','r')):bg('disabled','y'))+'</td></tr>').join('')+'</table>';\n}catch(e){toast('Dashboard: '+e.message)}}\n\n// Chat\nconst chatIn=document.getElementById('chat-in'),chatBtn=document.getElementById('chat-btn'),chatMsgs=document.getElementById('chat-msgs');\nfunction addMsg(role,text,meta){const d=document.createElement('div');d.className='msg';d.innerHTML='<div class=\"role '+role+'\">'+role+'</div><div class=\"body\">'+esc(text)+'</div>'+(meta?'<div class=\"meta\">'+esc(meta)+'</div>':'');chatMsgs.appendChild(d);chatMsgs.scrollTop=chatMsgs.scrollHeight}\nasync function sendChat(){const m=chatIn.value.trim();if(!m||sending)return;sending=true;chatBtn.disabled=true;chatIn.value='';addMsg('user',m);\n try{const r=await api('chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({message:m})});addMsg('assistant',r.text,r.usage?r.usage.totalTokens+' tokens, '+r.steps+' step(s)':'');if(r.toolCalls&&r.toolCalls.length>0)addMsg('assistant','Tools: '+r.toolCalls.map(t=>t.toolName).join(', '))}catch(e){addMsg('assistant','Error: '+e.message)}\n sending=false;chatBtn.disabled=false;chatIn.focus()}\nchatBtn.addEventListener('click',sendChat);chatIn.addEventListener('keydown',e=>{if(e.key==='Enter')sendChat()});\nasync function resetChat(){try{await api('chat/reset',{method:'POST'});chatMsgs.innerHTML='';toast('Chat reset')}catch(e){toast('Reset error: '+e.message)}}\nwindow.resetChat=resetChat;\n\n// Files\nasync function loadTree(){try{const tree=await api('files');const el=document.getElementById('ftree');el.innerHTML=renderTree(tree);bindTree(el)}catch(e){toast('File tree: '+e.message)}}\nfunction renderTree(nodes){return nodes.map(n=>{if(n.type==='directory')return '<div class=\"d\" data-p=\"'+esc(n.path)+'\">'+esc(n.name)+'</div><div class=\"ch\">'+renderTree(n.children||[])+'</div>';return '<div class=\"f\" data-p=\"'+esc(n.path)+'\">'+esc(n.name)+'</div>'}).join('')}\nfunction bindTree(el){el.querySelectorAll('.d').forEach(d=>d.addEventListener('click',()=>d.classList.toggle('open')));el.querySelectorAll('.f').forEach(f=>f.addEventListener('click',()=>openFile(f.dataset.p)))}\nasync function openFile(path){try{const f=await api('files/'+path);curFile=path;document.getElementById('ed-path').textContent=path;document.getElementById('ed-ta').value=f.content;document.getElementById('ed-ta').disabled=false;document.getElementById('ed-save').style.display='inline-block'}catch(e){toast('Open: '+e.message)}}\nasync function saveFile(){if(!curFile)return;try{await api('files/'+curFile,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({content:document.getElementById('ed-ta').value})});toast('Saved: '+curFile)}catch(e){toast('Save: '+e.message)}}\nwindow.saveFile=saveFile;\n\n// MCP\nasync function loadMcp(){try{const d=await api('mcp');const el=document.getElementById('mcp-detail');\n if(d.servers.length===0){el.innerHTML='<p style=\"color:var(--dim)\">No MCP servers configured.</p>';return}\n el.innerHTML='<table><tr><th>Name</th><th>Transport</th><th>Enabled</th><th>Valid</th><th>Details</th></tr>'+d.servers.map(s=>'<tr><td>'+esc(s.name)+'</td><td>'+esc(s.transport)+'</td><td>'+(s.enabled?bg('yes','g'):bg('no','y'))+'</td><td>'+(s.valid?bg('valid','g'):bg('invalid','r'))+'</td><td style=\"font-size:10px;color:var(--dim)\">'+esc(s.command||s.url||'')+'</td></tr>').join('')+'</table>';\n if(d.errors.length>0)el.innerHTML+='<h3 style=\"margin:12px 0 6px;color:var(--red)\">Errors</h3><ul>'+d.errors.map(e=>'<li style=\"color:var(--red);font-size:11px\">'+esc(e.server+': '+e.error)+'</li>').join('')+'</ul>'}catch(e){toast('MCP: '+e.message)}}\n\n// Settings\nasync function loadCfg(){try{const f=await api('files/config.yaml');document.getElementById('cfg-ta').value=f.content}catch(e){toast('Config: '+e.message)}}\nasync function saveConfig(){try{await api('config',{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({content:document.getElementById('cfg-ta').value})});toast('Config saved and reloaded')}catch(e){toast('Config save: '+e.message)}}\nwindow.saveConfig=saveConfig;\n\n// SSE\nconst evlog=document.getElementById('evlog');\nfunction addEv(type,data){const t=new Date().toLocaleTimeString();const e=document.createElement('div');e.className='ev';e.innerHTML='<span style=\"color:var(--dim);opacity:.6;margin-right:4px\">'+t+'</span><span class=\"t\">'+type+'</span>'+esc(typeof data==='string'?data:JSON.stringify(data));evlog.prepend(e);while(evlog.children.length>50)evlog.removeChild(evlog.lastChild)}\nfunction connectSSE(){const es=new EventSource('/api/events');\n es.addEventListener('connected',()=>{document.getElementById('sdot').className='dot ok';document.getElementById('stxt').textContent='connected';addEv('connected','SSE established');loadDash()});\n es.addEventListener('file_change',e=>{const d=JSON.parse(e.data);addEv('file_change',d.path+' ('+d.event+')');if(curPanel==='dashboard')loadDash();if(curPanel==='files')loadTree()});\n es.addEventListener('index_rebuild',e=>{addEv('index_rebuild',JSON.parse(e.data).directory)});\n es.addEventListener('auto_process',e=>{const d=JSON.parse(e.data);addEv('auto_process',d.path+': '+(d.fixes||[]).join(', '))});\n es.addEventListener('config_change',()=>{addEv('config_change','reloaded');if(curPanel==='dashboard')loadDash();if(curPanel==='settings')loadCfg()});\n es.addEventListener('chat_response',e=>{addEv('chat',JSON.parse(e.data).text?.slice(0,60)||'...')});\n es.onerror=()=>{document.getElementById('sdot').className='dot err';document.getElementById('stxt').textContent='disconnected'}}\n\nloadDash();connectSSE();setInterval(()=>{if(curPanel==='dashboard')loadDash()},30000);\n})();\n</script>\n</body>\n</html>`;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, renameSync, unlinkSync } from 'fs';\nimport { join, basename, dirname, relative } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { CORE_PRIMITIVE_DIRS } from '../core/types.js';\nimport { parseHarnessDocument } from '../primitives/loader.js';\nimport { log } from '../core/logger.js';\n\n// --- Manifest Types ---\n\nexport interface BundleManifest {\n /** Manifest format version */\n version: string;\n /** Bundle name (e.g., \"code-review-rules\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** Author identifier */\n author: string;\n /** Semantic version (e.g., \"1.0.0\") */\n bundle_version: string;\n /** When this bundle was created */\n created: string;\n /** Primitive type(s) contained (e.g., [\"rules\", \"instincts\"]) */\n types: string[];\n /** Tags for search/discovery */\n tags: string[];\n /** Files included in this bundle (relative paths) */\n files: BundleFileEntry[];\n /** Optional dependencies (other bundle names) */\n dependencies?: string[];\n /** Optional registry URL this was published to */\n registry?: string;\n /** Optional license identifier */\n license?: string;\n}\n\nexport interface BundleFileEntry {\n path: string;\n type: string;\n id: string;\n l0: string;\n}\n\n// --- Registry Types ---\n\nexport interface RegistryConfig {\n /** Registry URL (HTTPS) */\n url: string;\n /** Optional auth token */\n token?: string;\n /** Optional name for display */\n name?: string;\n}\n\nexport interface BundleSearchResult {\n name: string;\n description: string;\n author: string;\n version: string;\n types: string[];\n tags: string[];\n download_url: string;\n}\n\nexport interface BundleSearchResponse {\n results: BundleSearchResult[];\n total: number;\n}\n\n// --- Install / Uninstall Types ---\n\nexport interface PrimitiveInstallResult {\n installed: boolean;\n name: string;\n files: string[];\n skipped: string[];\n errors: string[];\n manifest?: BundleManifest;\n}\n\nexport interface PrimitiveUninstallResult {\n uninstalled: boolean;\n name: string;\n archived: string[];\n dependents: string[];\n errors: string[];\n}\n\nexport interface PrimitiveUpdateResult {\n updated: boolean;\n name: string;\n added: string[];\n modified: string[];\n removed: string[];\n errors: string[];\n oldVersion?: string;\n newVersion?: string;\n}\n\n// --- Manifest Operations ---\n\n/**\n * Create a manifest.yaml for a set of primitive files.\n */\nexport function createManifest(\n harnessDir: string,\n options: {\n name: string;\n description: string;\n author?: string;\n version?: string;\n files: string[];\n tags?: string[];\n license?: string;\n },\n): BundleManifest {\n const types = new Set<string>();\n const fileEntries: BundleFileEntry[] = [];\n\n for (const filePath of options.files) {\n const absPath = filePath.startsWith('/') ? filePath : join(harnessDir, filePath);\n if (!existsSync(absPath)) continue;\n\n const relPath = relative(harnessDir, absPath);\n const dir = relPath.split('/')[0];\n const type = (CORE_PRIMITIVE_DIRS as readonly string[]).includes(dir) ? dir : 'custom';\n types.add(type);\n\n try {\n const doc = parseHarnessDocument(absPath);\n fileEntries.push({\n path: relPath,\n type,\n id: doc.frontmatter.id ?? basename(relPath, '.md'),\n l0: doc.l0 || '',\n });\n } catch {\n fileEntries.push({\n path: relPath,\n type,\n id: basename(relPath, '.md'),\n l0: '',\n });\n }\n }\n\n return {\n version: '1.0',\n name: options.name,\n description: options.description,\n author: options.author ?? 'unknown',\n bundle_version: options.version ?? '1.0.0',\n created: new Date().toISOString(),\n types: [...types],\n tags: options.tags ?? [],\n files: fileEntries,\n license: options.license,\n };\n}\n\n/**\n * Write a manifest to a YAML file.\n */\nexport function writeManifest(manifest: BundleManifest, outputPath: string): void {\n writeFileSync(outputPath, stringifyYaml(manifest), 'utf-8');\n}\n\n/**\n * Read and validate a manifest from a YAML file.\n */\nexport function readManifest(manifestPath: string): BundleManifest {\n if (!existsSync(manifestPath)) {\n throw new Error(`Manifest not found: ${manifestPath}`);\n }\n const content = readFileSync(manifestPath, 'utf-8');\n const parsed: unknown = parseYaml(content);\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Invalid manifest: not an object');\n }\n\n const manifest = parsed as Record<string, unknown>;\n if (typeof manifest.name !== 'string' || !manifest.name) {\n throw new Error('Invalid manifest: missing \"name\"');\n }\n if (typeof manifest.version !== 'string') {\n throw new Error('Invalid manifest: missing \"version\"');\n }\n if (!Array.isArray(manifest.files)) {\n throw new Error('Invalid manifest: missing \"files\" array');\n }\n\n return parsed as BundleManifest;\n}\n\n// --- Bundle Pack/Unpack ---\n\nexport interface PackedBundle {\n manifest: BundleManifest;\n files: Array<{ path: string; content: string }>;\n}\n\n/**\n * Pack a set of primitives into a bundle (manifest + file contents).\n */\nexport function packBundle(\n harnessDir: string,\n options: {\n name: string;\n description: string;\n author?: string;\n version?: string;\n files?: string[];\n types?: string[];\n tags?: string[];\n license?: string;\n },\n): PackedBundle {\n let filePaths: string[] = options.files ?? [];\n\n // If types specified (or no types and no files), auto-collect all .md files from those dirs\n const types = (options.types && options.types.length > 0)\n ? options.types\n : (filePaths.length === 0 ? [...CORE_PRIMITIVE_DIRS] : []);\n if (types.length > 0 && filePaths.length === 0) {\n for (const type of types) {\n const dirPath = join(harnessDir, type);\n if (!existsSync(dirPath)) continue;\n const files = readdirSync(dirPath)\n .filter((f: string) => f.endsWith('.md') && !f.startsWith('_') && !f.startsWith('.'))\n .map((f: string) => join(type, f));\n filePaths.push(...files);\n }\n }\n\n const manifest = createManifest(harnessDir, {\n name: options.name,\n description: options.description,\n author: options.author,\n version: options.version,\n files: filePaths,\n tags: options.tags,\n license: options.license,\n });\n\n const files: Array<{ path: string; content: string }> = [];\n for (const entry of manifest.files) {\n const absPath = join(harnessDir, entry.path);\n if (existsSync(absPath)) {\n files.push({\n path: entry.path,\n content: readFileSync(absPath, 'utf-8'),\n });\n }\n }\n\n return { manifest, files };\n}\n\n/**\n * Write a packed bundle to a directory (manifest.yaml + files).\n */\nexport function writeBundleDir(bundle: PackedBundle, outputDir: string): void {\n mkdirSync(outputDir, { recursive: true });\n writeManifest(bundle.manifest, join(outputDir, 'manifest.yaml'));\n\n for (const file of bundle.files) {\n const targetPath = join(outputDir, file.path);\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n }\n}\n\n/**\n * Read a packed bundle from a directory containing manifest.yaml.\n */\nexport function readBundleDir(bundleDir: string): PackedBundle {\n const manifestPath = join(bundleDir, 'manifest.yaml');\n const manifest = readManifest(manifestPath);\n\n const files: Array<{ path: string; content: string }> = [];\n for (const entry of manifest.files) {\n const filePath = join(bundleDir, entry.path);\n if (existsSync(filePath)) {\n files.push({\n path: entry.path,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n\n return { manifest, files };\n}\n\n// --- Install from Bundle ---\n\n/**\n * Install primitives from a packed bundle into a harness directory.\n */\nexport function installBundle(\n harnessDir: string,\n bundle: PackedBundle,\n options?: { overwrite?: boolean; force?: boolean },\n): PrimitiveInstallResult {\n const overwrite = options?.overwrite ?? false;\n const result: PrimitiveInstallResult = {\n installed: false,\n name: bundle.manifest.name,\n files: [],\n skipped: [],\n errors: [],\n manifest: bundle.manifest,\n };\n\n // Check for dependents\n if (bundle.manifest.dependencies && bundle.manifest.dependencies.length > 0 && !options?.force) {\n const installedPath = join(harnessDir, '.installed');\n if (existsSync(installedPath)) {\n const installed = readInstalledManifests(harnessDir);\n const installedNames = new Set(installed.map((m) => m.name));\n const missing = bundle.manifest.dependencies.filter((d) => !installedNames.has(d));\n if (missing.length > 0) {\n result.errors.push(`Missing dependencies: ${missing.join(', ')}. Use --force to install anyway.`);\n return result;\n }\n }\n }\n\n for (const file of bundle.files) {\n const targetPath = join(harnessDir, file.path);\n\n if (existsSync(targetPath) && !overwrite) {\n result.skipped.push(file.path);\n continue;\n }\n\n try {\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n result.files.push(file.path);\n } catch (err) {\n result.errors.push(`${file.path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Record installation\n if (result.files.length > 0 || result.skipped.length > 0) {\n result.installed = true;\n recordInstallation(harnessDir, bundle.manifest);\n }\n\n return result;\n}\n\n// --- Uninstall ---\n\n/**\n * Uninstall (soft-delete) a previously installed bundle.\n * Moves files to archive/ instead of deleting.\n */\nexport function uninstallBundle(\n harnessDir: string,\n bundleName: string,\n options?: { hard?: boolean },\n): PrimitiveUninstallResult {\n const result: PrimitiveUninstallResult = {\n uninstalled: false,\n name: bundleName,\n archived: [],\n dependents: [],\n errors: [],\n };\n\n // Find the installed manifest\n const installed = readInstalledManifests(harnessDir);\n const manifest = installed.find((m) => m.name === bundleName);\n if (!manifest) {\n result.errors.push(`Bundle \"${bundleName}\" is not installed`);\n return result;\n }\n\n // Check if other installed bundles depend on this one\n const dependents = installed.filter(\n (m) => m.name !== bundleName && m.dependencies?.includes(bundleName),\n );\n if (dependents.length > 0) {\n result.dependents = dependents.map((m) => m.name);\n result.errors.push(\n `Cannot uninstall: ${dependents.map((m) => m.name).join(', ')} depend(s) on \"${bundleName}\"`,\n );\n return result;\n }\n\n const archiveDir = join(harnessDir, 'archive', 'uninstalled', bundleName);\n\n for (const entry of manifest.files) {\n const filePath = join(harnessDir, entry.path);\n if (!existsSync(filePath)) continue;\n\n try {\n if (options?.hard) {\n unlinkSync(filePath);\n } else {\n // Soft delete — move to archive\n const archivePath = join(archiveDir, entry.path);\n mkdirSync(dirname(archivePath), { recursive: true });\n renameSync(filePath, archivePath);\n }\n result.archived.push(entry.path);\n } catch (err) {\n result.errors.push(`${entry.path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Remove installation record\n if (result.archived.length > 0) {\n result.uninstalled = true;\n removeInstallationRecord(harnessDir, bundleName);\n }\n\n return result;\n}\n\n// --- Update ---\n\n/**\n * Compare an installed bundle against a new version and produce a diff.\n */\nexport function diffBundle(\n harnessDir: string,\n newBundle: PackedBundle,\n): { added: string[]; modified: string[]; removed: string[]; unchanged: string[] } {\n const installed = readInstalledManifests(harnessDir);\n const existing = installed.find((m) => m.name === newBundle.manifest.name);\n\n const added: string[] = [];\n const modified: string[] = [];\n const removed: string[] = [];\n const unchanged: string[] = [];\n\n const existingFiles = new Set(existing?.files.map((f) => f.path) ?? []);\n const newFiles = new Set(newBundle.manifest.files.map((f) => f.path));\n\n // Check for added/modified files\n for (const file of newBundle.files) {\n const targetPath = join(harnessDir, file.path);\n if (!existingFiles.has(file.path)) {\n added.push(file.path);\n } else if (existsSync(targetPath)) {\n const currentContent = readFileSync(targetPath, 'utf-8');\n if (currentContent !== file.content) {\n modified.push(file.path);\n } else {\n unchanged.push(file.path);\n }\n } else {\n added.push(file.path);\n }\n }\n\n // Check for removed files\n for (const path of existingFiles) {\n if (!newFiles.has(path)) {\n removed.push(path);\n }\n }\n\n return { added, modified, removed, unchanged };\n}\n\n/**\n * Update an installed bundle to a new version.\n */\nexport function updateBundle(\n harnessDir: string,\n newBundle: PackedBundle,\n options?: { removeDeleted?: boolean },\n): PrimitiveUpdateResult {\n const removeDeleted = options?.removeDeleted ?? false;\n const diff = diffBundle(harnessDir, newBundle);\n\n const result: PrimitiveUpdateResult = {\n updated: false,\n name: newBundle.manifest.name,\n added: [],\n modified: [],\n removed: [],\n errors: [],\n };\n\n // Find old version\n const installed = readInstalledManifests(harnessDir);\n const existing = installed.find((m) => m.name === newBundle.manifest.name);\n result.oldVersion = existing?.bundle_version;\n result.newVersion = newBundle.manifest.bundle_version;\n\n // Write added/modified files\n for (const path of [...diff.added, ...diff.modified]) {\n const file = newBundle.files.find((f) => f.path === path);\n if (!file) continue;\n\n const targetPath = join(harnessDir, path);\n try {\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n if (diff.added.includes(path)) {\n result.added.push(path);\n } else {\n result.modified.push(path);\n }\n } catch (err) {\n result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Handle removed files\n if (removeDeleted) {\n const archiveDir = join(harnessDir, 'archive', 'updated', newBundle.manifest.name);\n for (const path of diff.removed) {\n const filePath = join(harnessDir, path);\n if (!existsSync(filePath)) continue;\n\n try {\n const archivePath = join(archiveDir, path);\n mkdirSync(dirname(archivePath), { recursive: true });\n renameSync(filePath, archivePath);\n result.removed.push(path);\n } catch (err) {\n result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n if (result.added.length > 0 || result.modified.length > 0 || result.removed.length > 0) {\n result.updated = true;\n recordInstallation(harnessDir, newBundle.manifest);\n }\n\n return result;\n}\n\n// --- Installation Record ---\n\nconst INSTALLED_DIR = '.installed';\n\n/**\n * Record that a bundle was installed (writes manifest to .installed/).\n */\nfunction recordInstallation(harnessDir: string, manifest: BundleManifest): void {\n const installedDir = join(harnessDir, INSTALLED_DIR);\n mkdirSync(installedDir, { recursive: true });\n const manifestPath = join(installedDir, `${manifest.name}.yaml`);\n writeFileSync(manifestPath, stringifyYaml(manifest), 'utf-8');\n}\n\n/**\n * Remove an installation record.\n */\nfunction removeInstallationRecord(harnessDir: string, bundleName: string): void {\n const manifestPath = join(harnessDir, INSTALLED_DIR, `${bundleName}.yaml`);\n if (existsSync(manifestPath)) {\n unlinkSync(manifestPath);\n }\n}\n\n/**\n * Read all installed bundle manifests.\n */\nexport function readInstalledManifests(harnessDir: string): BundleManifest[] {\n const installedDir = join(harnessDir, INSTALLED_DIR);\n if (!existsSync(installedDir)) return [];\n\n const files = readdirSync(installedDir).filter((f: string) => f.endsWith('.yaml'));\n const manifests: BundleManifest[] = [];\n\n for (const file of files) {\n try {\n const manifest = readManifest(join(installedDir, file));\n manifests.push(manifest);\n } catch (err) {\n log.warn(`Failed to read installed manifest ${file}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return manifests;\n}\n\n/**\n * List all installed bundles with summary info.\n */\nexport function listInstalledBundles(harnessDir: string): Array<{\n name: string;\n version: string;\n types: string[];\n fileCount: number;\n description: string;\n}> {\n return readInstalledManifests(harnessDir).map((m) => ({\n name: m.name,\n version: m.bundle_version,\n types: m.types,\n fileCount: m.files.length,\n description: m.description,\n }));\n}\n\n// --- Remote Registry Client ---\n\n/**\n * Fetch a bundle from a remote registry URL.\n */\nexport async function fetchRemoteBundle(url: string): Promise<PackedBundle> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch bundle: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n // JSON bundle format (legacy HarnessBundle format)\n const data: unknown = await response.json();\n if (typeof data !== 'object' || data === null || !('entries' in data)) {\n throw new Error('Invalid JSON bundle format');\n }\n\n const jsonBundle = data as { entries: Array<{ path: string; content: string }>; agent_name?: string };\n\n // Convert to PackedBundle with synthetic manifest\n const files = jsonBundle.entries;\n const types = new Set<string>();\n const fileEntries: BundleFileEntry[] = [];\n\n for (const entry of files) {\n const dir = entry.path.split('/')[0];\n const type = (CORE_PRIMITIVE_DIRS as readonly string[]).includes(dir) ? dir : 'custom';\n types.add(type);\n fileEntries.push({\n path: entry.path,\n type,\n id: basename(entry.path, '.md'),\n l0: '',\n });\n }\n\n const manifest: BundleManifest = {\n version: '1.0',\n name: jsonBundle.agent_name ?? 'remote-bundle',\n description: 'Imported from remote URL',\n author: 'unknown',\n bundle_version: '1.0.0',\n created: new Date().toISOString(),\n types: [...types],\n tags: [],\n files: fileEntries,\n };\n\n return { manifest, files };\n }\n\n // YAML manifest + files format (tar/zip would go here in future)\n // For now, treat as a single-file bundle\n const content = await response.text();\n const fileName = basename(new URL(url).pathname);\n\n const manifest: BundleManifest = {\n version: '1.0',\n name: basename(fileName, '.md'),\n description: `Downloaded from ${url}`,\n author: 'unknown',\n bundle_version: '1.0.0',\n created: new Date().toISOString(),\n types: ['custom'],\n tags: [],\n files: [{ path: fileName, type: 'custom', id: basename(fileName, '.md'), l0: '' }],\n };\n\n return { manifest, files: [{ path: fileName, content }] };\n}\n\n/**\n * Search a remote registry for bundles.\n */\nexport async function searchBundleRegistry(\n registryUrl: string,\n query: string,\n options?: { limit?: number; token?: string },\n): Promise<BundleSearchResponse> {\n const limit = options?.limit ?? 20;\n const searchUrl = `${registryUrl}/api/bundles?search=${encodeURIComponent(query)}&limit=${limit}`;\n\n const headers: Record<string, string> = { 'Accept': 'application/json' };\n if (options?.token) {\n headers['Authorization'] = `Bearer ${options.token}`;\n }\n\n const response = await fetch(searchUrl, { headers });\n if (!response.ok) {\n throw new Error(`Registry search failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json() as BundleSearchResponse;\n}\n\n/**\n * Fetch a bundle from a registry by name.\n */\nexport async function fetchFromRegistry(\n registryUrl: string,\n bundleName: string,\n options?: { version?: string; token?: string },\n): Promise<PackedBundle> {\n const version = options?.version ?? 'latest';\n const bundleUrl = `${registryUrl}/api/bundles/${encodeURIComponent(bundleName)}/versions/${version}/download`;\n\n const headers: Record<string, string> = {};\n if (options?.token) {\n headers['Authorization'] = `Bearer ${options.token}`;\n }\n\n const response = await fetch(bundleUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch bundle \"${bundleName}\": ${response.status} ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return data as PackedBundle;\n}\n\n// --- Multi-Registry Support ---\n\nexport interface BundleSearchHit extends BundleSearchResult {\n /** Which registry URL this result came from */\n registryUrl: string;\n /** Display name of the registry */\n registryName: string;\n}\n\nexport interface MultiBundleSearchResponse {\n results: BundleSearchHit[];\n total: number;\n registriesSearched: number;\n errors: Array<{ registry: string; error: string }>;\n}\n\n/**\n * Search all configured registries for bundles.\n * Merges results, deduplicating by name (first registry wins).\n */\nexport async function searchConfiguredRegistries(\n registries: Array<{ url: string; name?: string; token?: string }>,\n query: string,\n options?: { limit?: number },\n): Promise<MultiBundleSearchResponse> {\n const limit = options?.limit ?? 20;\n const allResults: BundleSearchHit[] = [];\n const errors: Array<{ registry: string; error: string }> = [];\n const seenNames = new Set<string>();\n\n const searches = registries.map(async (reg) => {\n const displayName = reg.name ?? reg.url;\n try {\n const response = await searchBundleRegistry(reg.url, query, { limit, token: reg.token });\n return { registry: reg, displayName, response };\n } catch (err) {\n errors.push({\n registry: displayName,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n });\n\n const results = await Promise.allSettled(searches);\n\n for (const settled of results) {\n if (settled.status === 'fulfilled' && settled.value) {\n const { registry, displayName, response } = settled.value;\n for (const result of response.results) {\n if (!seenNames.has(result.name)) {\n seenNames.add(result.name);\n allResults.push({\n ...result,\n registryUrl: registry.url,\n registryName: displayName,\n });\n }\n }\n }\n }\n\n return {\n results: allResults.slice(0, limit),\n total: allResults.length,\n registriesSearched: registries.length,\n errors,\n };\n}\n\n/**\n * Install a bundle from configured registries by name.\n * Searches each registry in order, installs from the first match.\n */\nexport async function installFromRegistry(\n harnessDir: string,\n registries: Array<{ url: string; name?: string; token?: string }>,\n bundleName: string,\n options?: { version?: string; overwrite?: boolean; force?: boolean },\n): Promise<PrimitiveInstallResult & { registryUrl?: string }> {\n for (const reg of registries) {\n try {\n const bundle = await fetchFromRegistry(reg.url, bundleName, {\n version: options?.version,\n token: reg.token,\n });\n const result = installBundle(harnessDir, bundle, {\n overwrite: options?.overwrite,\n force: options?.force,\n });\n return { ...result, registryUrl: reg.url };\n } catch {\n // Try next registry\n continue;\n }\n }\n\n return {\n installed: false,\n name: bundleName,\n files: [],\n skipped: [],\n errors: [`Bundle \"${bundleName}\" not found in any configured registry`],\n };\n}\n","/**\n * Builtin starter packs — installable bundles of primitives (workflows,\n * rules, instincts, skills) that users can customize after installation.\n *\n * Install via: `harness install pack:<name>`\n * List available: `harness install pack:list`\n */\n\nimport type { PackedBundle, BundleManifest, BundleFileEntry } from './primitive-registry.js';\n\nexport interface StarterPack {\n name: string;\n description: string;\n tags: string[];\n files: Array<{ path: string; content: string; id: string; l0: string }>;\n}\n\nconst PACKS: Record<string, StarterPack> = {\n 'daily-briefs': {\n name: 'daily-briefs',\n description: 'Morning briefing and evening review workflows — summarize upcoming tasks, review completed work, and plan next steps.',\n tags: ['daily', 'briefing', 'review', 'productivity'],\n files: [\n {\n path: 'workflows/morning-brief.md',\n id: 'morning-brief',\n l0: 'Morning briefing workflow that summarizes recent sessions and plans the day.',\n content: `---\nid: morning-brief\ntags: [workflow, daily, morning]\nauthor: infrastructure\nstatus: active\nschedule: \"0 8 * * 1-5\"\n---\n# Morning Brief\n\nReview yesterday's sessions and journal, then produce a concise daily brief.\n\n## Instructions\n\n1. Load the most recent journal entry and any sessions from the last 24 hours.\n2. Summarize key accomplishments, open questions, and blockers.\n3. List the top 3 priorities for today based on recent activity patterns.\n4. Note any instincts or rules that were frequently triggered.\n5. Keep the output under 500 words — this is a quick scan, not a deep analysis.\n\n## Output Format\n\n**Yesterday's highlights:**\n- [bullet points]\n\n**Today's priorities:**\n1. [priority]\n2. [priority]\n3. [priority]\n\n**Open questions / blockers:**\n- [if any]\n`,\n },\n {\n path: 'workflows/evening-review.md',\n id: 'evening-review',\n l0: 'Evening review workflow that synthesizes the day and prepares for tomorrow.',\n content: `---\nid: evening-review\ntags: [workflow, daily, evening, review]\nauthor: infrastructure\nstatus: active\nschedule: \"0 18 * * 1-5\"\n---\n# Evening Review\n\nSynthesize today's work and prepare handoff notes for tomorrow.\n\n## Instructions\n\n1. Load all sessions from today.\n2. Identify what was accomplished vs. what was planned (from morning brief if available).\n3. Note any recurring patterns, surprises, or friction points.\n4. Suggest 1-2 instinct candidates if behavioral patterns emerge.\n5. Write a brief handoff note for tomorrow's morning brief.\n\n## Output Format\n\n**Completed today:**\n- [bullet points]\n\n**Planned but not completed:**\n- [if any, with reasons]\n\n**Observations:**\n- [patterns, friction, surprises]\n\n**Tomorrow's handoff:**\n- [brief note for morning brief]\n`,\n },\n ],\n },\n\n 'weekly-review': {\n name: 'weekly-review',\n description: 'End-of-week review workflow — analyze the week, compress journals, surface trends, and set goals for next week.',\n tags: ['weekly', 'review', 'retrospective', 'planning'],\n files: [\n {\n path: 'workflows/weekly-review.md',\n id: 'weekly-review',\n l0: 'Weekly review workflow that analyzes the week and sets goals.',\n content: `---\nid: weekly-review\ntags: [workflow, weekly, review, retrospective]\nauthor: infrastructure\nstatus: active\nschedule: \"0 17 * * 5\"\n---\n# Weekly Review\n\nAnalyze the past week's work, compress journals, and plan next week.\n\n## Instructions\n\n1. Load all journal entries from this week (Monday through today).\n2. Identify the top 3-5 themes across the week's work.\n3. Note which instincts fired most often and whether they were helpful.\n4. Identify any skills or playbooks that were missing or underperforming.\n5. Suggest concrete goals for next week (2-3 maximum).\n6. Flag any rules that seem outdated or contradictory.\n\n## Output Format\n\n**Week of [date range]**\n\n**Key themes:**\n1. [theme with brief explanation]\n2. [theme]\n3. [theme]\n\n**Instinct effectiveness:**\n- [instinct name]: [helpful / needs tuning / remove]\n\n**Gaps identified:**\n- [missing skill or playbook suggestion]\n\n**Next week's goals:**\n1. [specific, actionable goal]\n2. [goal]\n\n**Maintenance notes:**\n- [rules to review, primitives to archive, etc.]\n`,\n },\n ],\n },\n\n 'code-review': {\n name: 'code-review',\n description: 'Code review workflow — analyzes recent code changes, checks for patterns and anti-patterns, and generates review notes.',\n tags: ['code-review', 'development', 'quality'],\n files: [\n {\n path: 'workflows/code-review.md',\n id: 'code-review-workflow',\n l0: 'Code review workflow that analyzes recent changes and generates review notes.',\n content: `---\nid: code-review-workflow\ntags: [workflow, code-review, development]\nauthor: infrastructure\nstatus: active\n---\n# Code Review Workflow\n\nAnalyze recent code changes and generate structured review notes.\n\n## Instructions\n\n1. Review the most recent session where code was written or modified.\n2. Check for common issues:\n - Missing error handling (empty catches, unhandled promises)\n - Type safety violations (any usage, missing return types)\n - Security concerns (unsanitized input, hardcoded secrets)\n - Code duplication or missed reuse opportunities\n3. Check adherence to project rules and instincts.\n4. Note positive patterns worth reinforcing as instincts.\n5. Generate a structured review with severity levels.\n\n## Output Format\n\n**Review of [session/change description]**\n\n**Critical issues:**\n- [severity: high] [description]\n\n**Improvements:**\n- [severity: medium] [suggestion]\n\n**Good patterns:**\n- [pattern worth keeping / promoting to instinct]\n\n**Summary:**\n[1-2 sentence overall assessment]\n`,\n },\n {\n path: 'workflows/pr-checklist.md',\n id: 'pr-checklist',\n l0: 'PR checklist workflow that generates a pre-merge review checklist.',\n content: `---\nid: pr-checklist\ntags: [workflow, code-review, pr, checklist]\nauthor: infrastructure\nstatus: active\n---\n# PR Checklist\n\nGenerate a pre-merge checklist based on project rules and recent changes.\n\n## Instructions\n\n1. Load all active rules from the harness.\n2. For each rule category, generate a checklist item.\n3. Add standard items: tests pass, no type errors, no lint warnings.\n4. Include project-specific checks based on instincts.\n5. Output as a copy-pasteable markdown checklist.\n\n## Output Format\n\n**Pre-merge checklist:**\n\n- [ ] All tests pass\n- [ ] No TypeScript errors (tsc --noEmit)\n- [ ] No lint warnings\n- [ ] Error handling: no empty catches, async errors handled\n- [ ] Types: no \\`any\\`, explicit return types on exports\n- [ ] Security: no hardcoded secrets, input validated\n- [rule-specific items from harness rules]\n`,\n },\n ],\n },\n\n 'code-reviewer': {\n name: 'code-reviewer',\n description: 'Multi-primitive code review pack — rules for code quality, instincts for review patterns, and a skill for structured review technique.',\n tags: ['code-review', 'quality', 'rules', 'instincts', 'skills'],\n files: [\n {\n path: 'rules/code-quality.md',\n id: 'code-quality-rules',\n l0: 'Code quality rules enforcing error handling, type safety, and security.',\n content: `---\nid: code-quality-rules\ntags: [rule, code-quality, error-handling, type-safety, security]\nauthor: infrastructure\nstatus: active\n---\n# Code Quality Rules\n\nEnforceable rules for maintaining code quality across the codebase.\n\n## Error Handling\n\n- **Never** leave a catch block empty. Every catch must log or handle the error meaningfully.\n- **Always** handle async errors — every async function must have error handling at its boundary.\n- **Never** use generic \\`catch (e) { throw e }\\` — either handle or let it propagate naturally.\n\n## Type Safety\n\n- **Never** use \\`any\\` — use \\`unknown\\` with type narrowing, generics, or explicit types.\n- **Always** add explicit return types on exported functions.\n- **Never** trust external data at runtime — validate at system boundaries.\n\n## Security\n\n- **Never** hardcode secrets, API keys, or tokens in source code.\n- **Always** parameterize database queries — never concatenate user input.\n- **Never** use \\`eval()\\`, \\`innerHTML\\`, or \\`document.write()\\` with unsanitized input.\n- **Always** validate and sanitize user input at the boundary where it enters the system.\n\n## Structure\n\n- **Prefer** early returns and guard clauses — happy path last.\n- **Never** create a new utility function without first searching for an existing one.\n- **Always** prefer editing existing files over creating new ones.\n`,\n },\n {\n path: 'rules/review-standards.md',\n id: 'review-standards',\n l0: 'Review standards for consistent, actionable code review feedback.',\n content: `---\nid: review-standards\ntags: [rule, code-review, standards, feedback]\nauthor: infrastructure\nstatus: active\n---\n# Review Standards\n\nStandards for producing consistent, actionable code review feedback.\n\n## Severity Levels\n\n- **Critical**: Security vulnerability, data loss risk, or crash. Must fix before merge.\n- **High**: Logic error, missing error handling, or broken contract. Should fix before merge.\n- **Medium**: Code smell, duplication, or missed optimization. Fix soon.\n- **Low**: Style preference, naming suggestion, or minor improvement. Optional.\n\n## Review Checklist\n\n- Every review must note at least one positive pattern (reinforcement).\n- Every issue must include a suggested fix, not just a complaint.\n- Reviews should reference specific rules or instincts when applicable.\n- Avoid vague feedback like \"this could be better\" — be specific and actionable.\n\n## Scope\n\n- Review only what changed — do not nitpick unrelated code.\n- Flag pre-existing issues separately from new issues.\n- If a change is too large to review effectively, request it be split.\n`,\n },\n {\n path: 'instincts/review-pattern-detection.md',\n id: 'review-pattern-detection',\n l0: 'Instinct for detecting common code review patterns and anti-patterns.',\n content: `---\nid: review-pattern-detection\ntags: [instinct, code-review, patterns, anti-patterns]\nauthor: infrastructure\nstatus: active\n---\n# Review Pattern Detection\n\nBehavioral instinct for recognizing patterns during code review.\n\n## Trigger\n\nWhen reviewing code changes or analyzing session output that includes code modifications.\n\n## Patterns to Watch For\n\n- **Copy-paste duplication**: Same logic appearing in multiple places — suggest extraction.\n- **Error swallowing**: Catch blocks that log but don't re-throw or handle — flag as silent failure.\n- **Missing edge cases**: Functions that handle the happy path but not nulls, empty arrays, or errors.\n- **Leaky abstractions**: Implementation details exposed through public interfaces.\n- **Premature optimization**: Complex code with no measured performance need.\n- **Magic values**: Hardcoded numbers or strings that should be named constants.\n\n## Response\n\nWhen a pattern is detected, note it in the review with the pattern name and a brief explanation. Suggest the specific fix, not just the problem.\n`,\n },\n {\n path: 'instincts/refactor-opportunity.md',\n id: 'refactor-opportunity',\n l0: 'Instinct for spotting refactoring opportunities during review.',\n content: `---\nid: refactor-opportunity\ntags: [instinct, refactoring, code-review, improvement]\nauthor: infrastructure\nstatus: active\n---\n# Refactor Opportunity Detection\n\nBehavioral instinct for identifying refactoring opportunities.\n\n## Trigger\n\nWhen code changes reveal structural issues or when the same area is modified repeatedly.\n\n## Signals\n\n- **Shotgun surgery**: A single logical change requires touching 3+ files — extract shared logic.\n- **Feature envy**: A function that mostly uses data from another module — move it.\n- **Long parameter lists**: Functions with 4+ parameters — consider an options object.\n- **Nested conditionals**: 3+ levels of nesting — extract early returns or helper functions.\n- **God objects**: Classes or modules with 10+ responsibilities — split by concern.\n\n## Response\n\nNote the refactoring opportunity with the specific smell name. Only suggest refactoring if it improves clarity — not every code smell needs immediate action.\n`,\n },\n {\n path: 'skills/structured-review.md',\n id: 'structured-review-skill',\n l0: 'Skill for conducting structured, multi-pass code reviews.',\n content: `---\nid: structured-review-skill\ntags: [skill, code-review, technique, methodology]\nauthor: infrastructure\nstatus: active\n---\n# Structured Code Review\n\nA systematic approach to reviewing code changes in multiple passes.\n\n## Technique: Three-Pass Review\n\n### Pass 1: Correctness (5 minutes)\n- Does the code do what the author intended?\n- Are there logic errors, off-by-one issues, or race conditions?\n- Do all error paths terminate correctly?\n\n### Pass 2: Quality (3 minutes)\n- Does it follow project rules and coding standards?\n- Are there opportunities for reuse or simplification?\n- Is the code testable? Are there missing tests?\n\n### Pass 3: Design (2 minutes)\n- Does the change fit the existing architecture?\n- Are the abstractions at the right level?\n- Will this be easy to modify in the future?\n\n## Output Template\n\n\\`\\`\\`\n**Correctness**: [pass/issues found]\n**Quality**: [pass/improvements suggested]\n**Design**: [pass/concerns noted]\n**Verdict**: [approve / request changes / discuss]\n\\`\\`\\`\n\n## Tips\n\n- Time-box each pass to avoid rabbit holes.\n- Record the first pass findings before moving to the next — fresh eyes find different things.\n- If you find a critical issue in pass 1, stop and report it immediately.\n`,\n },\n ],\n },\n\n 'personal-assistant': {\n name: 'personal-assistant',\n description: 'Personal assistant pack — daily planning workflow, communication instincts, and a task management skill for organizing priorities.',\n tags: ['productivity', 'planning', 'communication', 'task-management'],\n files: [\n {\n path: 'workflows/daily-planner.md',\n id: 'daily-planner',\n l0: 'Daily planning workflow that organizes priorities and schedules tasks.',\n content: `---\nid: daily-planner\ntags: [workflow, daily, planning, productivity]\nauthor: infrastructure\nstatus: active\nschedule: \"0 7 * * 1-5\"\n---\n# Daily Planner\n\nCreate a structured daily plan from open tasks, calendar items, and recent context.\n\n## Instructions\n\n1. Load the most recent journal entry and state.md.\n2. Identify all open tasks from \\`unfinished_business\\` in state.\n3. Check for any scheduled workflows firing today.\n4. Categorize tasks by urgency and importance (Eisenhower matrix).\n5. Produce a time-blocked plan for the day.\n6. Estimate total focus hours needed vs. available.\n\n## Output Format\n\n**Date: [today]**\n\n**Must do today (urgent + important):**\n1. [task with estimated time]\n\n**Should do today (important, not urgent):**\n1. [task]\n\n**Quick wins (< 15 min):**\n- [task]\n\n**Scheduled:**\n- [time] [event or workflow]\n\n**Focus hours needed:** [N] / **Available:** [M]\n`,\n },\n {\n path: 'workflows/inbox-triage.md',\n id: 'inbox-triage',\n l0: 'Inbox triage workflow that processes and categorizes incoming items.',\n content: `---\nid: inbox-triage\ntags: [workflow, triage, inbox, productivity]\nauthor: infrastructure\nstatus: active\nproactive: true\n---\n# Inbox Triage\n\nProcess incoming items and categorize them for action.\n\n## Instructions\n\n1. Scan recent sessions and events for unprocessed items.\n2. For each item, determine:\n - **Action required?** Yes/No\n - **Urgency:** Now / Today / This week / Someday\n - **Category:** Task / Question / Reference / Noise\n3. Items requiring action go to state.md unfinished_business.\n4. Questions get queued for the next interactive session.\n5. Reference items get filed as session notes.\n6. Noise gets acknowledged and dropped.\n\n## Output Format\n\n**Processed [N] items:**\n\n| Item | Action | Urgency | Category |\n|------|--------|---------|----------|\n| [description] | [yes/no] | [urgency] | [category] |\n\n**Added to queue:** [count]\n**Filed as reference:** [count]\n**Dropped:** [count]\n`,\n },\n {\n path: 'instincts/clear-communication.md',\n id: 'clear-communication',\n l0: 'Instinct for clear, concise communication in responses.',\n content: `---\nid: clear-communication\ntags: [instinct, communication, clarity, writing]\nauthor: infrastructure\nstatus: active\n---\n# Clear Communication\n\nBehavioral instinct for producing clear, actionable communication.\n\n## Trigger\n\nWhen generating any output that will be read by a human — responses, summaries, reports, plans.\n\n## Principles\n\n- **Lead with the answer.** State the conclusion first, then provide supporting detail.\n- **Be specific.** Replace \"soon\" with dates, \"some\" with counts, \"improve\" with metrics.\n- **One idea per paragraph.** Dense paragraphs with multiple ideas are hard to scan.\n- **Use structure.** Headers, lists, and tables are faster to process than prose.\n- **Cut filler.** Remove \"I think\", \"basically\", \"in order to\", \"it should be noted that\".\n\n## Anti-patterns\n\n- Restating the question before answering it.\n- Using jargon without context.\n- Providing information the reader didn't ask for.\n- Hedging when confidence is high.\n\n## Response\n\nApply these principles automatically. If a draft is unclear, restructure before outputting.\n`,\n },\n {\n path: 'instincts/context-awareness.md',\n id: 'context-awareness',\n l0: 'Instinct for maintaining awareness of user context and recent history.',\n content: `---\nid: context-awareness\ntags: [instinct, context, memory, personalization]\nauthor: infrastructure\nstatus: active\n---\n# Context Awareness\n\nBehavioral instinct for maintaining awareness of what the user is working on.\n\n## Trigger\n\nAt the start of every session and when switching topics.\n\n## Behavior\n\n- Check state.md for current goals and active workflows before responding.\n- Reference recent session history when it adds value (not gratuitously).\n- Notice when the user returns to a topic from a previous session — offer continuity.\n- Track which tools, files, and topics appear frequently — these are the user's active context.\n- When the user's request is ambiguous, use recent context to disambiguate rather than asking.\n\n## Anti-patterns\n\n- Treating every session as a fresh start with no history.\n- Asking questions that were already answered in a recent session.\n- Ignoring state.md goals when prioritizing tasks.\n`,\n },\n {\n path: 'skills/task-prioritization.md',\n id: 'task-prioritization-skill',\n l0: 'Skill for prioritizing tasks using the Eisenhower matrix and energy mapping.',\n content: `---\nid: task-prioritization-skill\ntags: [skill, productivity, prioritization, planning]\nauthor: infrastructure\nstatus: active\n---\n# Task Prioritization\n\nSystematic approach to prioritizing tasks when everything feels urgent.\n\n## Technique: Eisenhower + Energy Mapping\n\n### Step 1: Classify by Urgency and Importance\n\n| | Urgent | Not Urgent |\n|---|--------|------------|\n| **Important** | Do first | Schedule |\n| **Not Important** | Delegate/batch | Drop or defer |\n\n### Step 2: Map to Energy Levels\n\n- **High energy tasks** (creative, complex decisions): Morning block\n- **Medium energy tasks** (meetings, reviews): Midday\n- **Low energy tasks** (admin, filing, routine): Late afternoon\n\n### Step 3: Apply Constraints\n\n- Maximum 3 \"must do\" items per day — more than 3 means nothing is truly prioritized.\n- If everything is urgent, ask: \"What happens if this waits 24 hours?\" If the answer is \"nothing\", it's not urgent.\n- Group similar tasks to reduce context-switching cost.\n\n## Output\n\nProduce a prioritized list with:\n1. Task name\n2. Quadrant (urgent-important, important, urgent, neither)\n3. Estimated time\n4. Suggested time block (morning/midday/afternoon)\n`,\n },\n ],\n },\n\n 'devops': {\n name: 'devops',\n description: 'DevOps safety pack — deployment rules, monitoring instincts, and an incident response skill for handling production issues.',\n tags: ['devops', 'deployment', 'monitoring', 'incident-response', 'safety'],\n files: [\n {\n path: 'rules/deployment-safety.md',\n id: 'deployment-safety-rules',\n l0: 'Deployment safety rules preventing common production failures.',\n content: `---\nid: deployment-safety-rules\ntags: [rule, devops, deployment, safety, production]\nauthor: infrastructure\nstatus: active\n---\n# Deployment Safety Rules\n\nRules to prevent common deployment failures and production incidents.\n\n## Pre-Deployment\n\n- **Never** deploy without all tests passing — no exceptions, no \"just this once\".\n- **Never** deploy directly to production — always go through staging first.\n- **Always** review the diff before deploying — automated deployments must still be human-approved.\n- **Never** deploy on Fridays after 2 PM or before holidays without explicit approval.\n- **Always** have a rollback plan before deploying — know the exact command to revert.\n\n## During Deployment\n\n- **Always** deploy incrementally — canary or blue-green, never all-at-once.\n- **Never** deploy multiple unrelated changes in a single deployment.\n- **Always** monitor error rates for 15 minutes after deployment — do not walk away.\n\n## Secrets and Config\n\n- **Never** hardcode environment-specific values — use environment variables or config maps.\n- **Never** commit secrets to version control — use secret management tools.\n- **Always** rotate credentials after any suspected exposure — assume compromise.\n\n## Database\n\n- **Never** run destructive migrations without a backup taken in the last hour.\n- **Always** test migrations on a copy of production data before running on production.\n- **Never** drop columns or tables without confirming zero references in running code.\n`,\n },\n {\n path: 'rules/infrastructure-standards.md',\n id: 'infrastructure-standards',\n l0: 'Infrastructure standards for consistent, maintainable deployments.',\n content: `---\nid: infrastructure-standards\ntags: [rule, devops, infrastructure, standards]\nauthor: infrastructure\nstatus: active\n---\n# Infrastructure Standards\n\nStandards for maintaining consistent, auditable infrastructure.\n\n## Configuration\n\n- All infrastructure must be defined as code (Terraform, Pulumi, CloudFormation, or similar).\n- Manual changes to production infrastructure require a follow-up PR within 24 hours.\n- Every service must have health check endpoints (/health, /ready).\n- Every service must emit structured logs (JSON) with request IDs for tracing.\n\n## Monitoring\n\n- Every service must have alerts for: error rate > 1%, latency p99 > 2s, availability < 99.9%.\n- Alerts must page on-call for critical issues — never rely on email-only alerts.\n- Dashboard must show: request rate, error rate, latency percentiles, resource utilization.\n\n## Access Control\n\n- Production access requires MFA and is logged.\n- Prefer role-based access over individual permissions.\n- Review access lists quarterly — remove unused permissions.\n\n## Backups\n\n- All persistent data must be backed up daily with 30-day retention.\n- Test backup restoration quarterly — untested backups are not backups.\n`,\n },\n {\n path: 'instincts/anomaly-detection.md',\n id: 'anomaly-detection',\n l0: 'Instinct for detecting anomalies in metrics, logs, and deployment behavior.',\n content: `---\nid: anomaly-detection\ntags: [instinct, devops, monitoring, anomaly, alerting]\nauthor: infrastructure\nstatus: active\n---\n# Anomaly Detection\n\nBehavioral instinct for noticing when something is off in operational metrics.\n\n## Trigger\n\nWhen reviewing deployment output, log summaries, or metric dashboards.\n\n## Signals\n\n- **Error rate spike**: Any increase > 2x baseline within 5 minutes of a deployment.\n- **Latency creep**: p99 latency increasing steadily over hours — memory leak or connection exhaustion.\n- **Silent failures**: Success rate stays high but throughput drops — upstream is failing to send.\n- **Resource divergence**: CPU/memory usage differs significantly between replicas — one is stuck.\n- **Clock skew**: Timestamps in logs jumping backward or forward — NTP issues.\n- **Cascade pattern**: Multiple unrelated services degrading simultaneously — shared dependency.\n\n## Response\n\nWhen an anomaly is detected:\n1. Note the specific metric and timeframe.\n2. Correlate with recent deployments or config changes.\n3. If post-deployment: recommend immediate rollback, investigate after.\n4. If no recent change: check upstream dependencies and shared infrastructure.\n`,\n },\n {\n path: 'instincts/change-risk-assessment.md',\n id: 'change-risk-assessment',\n l0: 'Instinct for assessing risk before infrastructure or deployment changes.',\n content: `---\nid: change-risk-assessment\ntags: [instinct, devops, risk, change-management]\nauthor: infrastructure\nstatus: active\n---\n# Change Risk Assessment\n\nBehavioral instinct for evaluating the risk of operational changes before executing them.\n\n## Trigger\n\nBefore any deployment, configuration change, or infrastructure modification.\n\n## Risk Factors\n\n- **Blast radius**: How many users or services are affected if this fails?\n- **Reversibility**: Can this be rolled back in under 5 minutes?\n- **Observability**: Will we know if this breaks something? Are there alerts?\n- **Timing**: Is this during peak traffic? During on-call handoff?\n- **Novelty**: Has this type of change been done before? By this team?\n- **Dependencies**: Does this change require coordinated changes in other services?\n\n## Risk Levels\n\n- **Low**: Small blast radius, instantly reversible, well-observed, done before.\n- **Medium**: Moderate blast radius, reversible with effort, some unknowns.\n- **High**: Large blast radius, difficult to reverse, novel, or during peak.\n\n## Response\n\nState the risk level and the primary risk factor before proceeding. For high-risk changes, suggest breaking the change into smaller, lower-risk steps.\n`,\n },\n {\n path: 'skills/incident-response.md',\n id: 'incident-response-skill',\n l0: 'Skill for structured incident response and post-incident analysis.',\n content: `---\nid: incident-response-skill\ntags: [skill, devops, incident-response, runbook]\nauthor: infrastructure\nstatus: active\n---\n# Incident Response\n\nStructured approach to handling production incidents.\n\n## Phase 1: Detect and Assess (0-5 minutes)\n\n1. **Confirm the incident**: Verify the alert is real, not a false positive.\n2. **Assess impact**: How many users affected? Is data at risk?\n3. **Classify severity**:\n - **SEV1**: Service down, data loss, or security breach. Page everyone.\n - **SEV2**: Significant degradation, partial outage. Page on-call.\n - **SEV3**: Minor degradation, workaround available. Notify team.\n4. **Communicate**: Post in incident channel with: what's happening, who's investigating, ETA for update.\n\n## Phase 2: Mitigate (5-30 minutes)\n\n1. **Check recent changes**: Was anything deployed in the last 2 hours? Roll it back.\n2. **Check dependencies**: Are upstream services healthy?\n3. **Scale or redirect**: Can traffic be shifted to healthy instances?\n4. **Apply known fix**: Check runbooks for this failure mode.\n5. **Update communication** every 15 minutes, even if no progress.\n\n## Phase 3: Resolve and Recover\n\n1. **Confirm resolution**: Metrics return to baseline for 15+ minutes.\n2. **Communicate all-clear** with summary of what happened.\n3. **Schedule post-mortem** within 48 hours.\n\n## Phase 4: Post-Mortem Template\n\n\\`\\`\\`\n**Incident**: [title]\n**Date**: [date] | **Duration**: [time]\n**Severity**: [SEV1/2/3]\n**Impact**: [users/services affected]\n\n**Timeline:**\n- [HH:MM] Alert fired\n- [HH:MM] Investigation started\n- [HH:MM] Root cause identified\n- [HH:MM] Fix applied\n- [HH:MM] Confirmed resolved\n\n**Root cause:** [description]\n**Contributing factors:** [list]\n**Action items:**\n- [ ] [preventive measure with owner and due date]\n\\`\\`\\`\n`,\n },\n ],\n },\n};\n\n/**\n * Get a builtin starter pack by name.\n * Returns null if the pack doesn't exist.\n */\nexport function getStarterPack(name: string): PackedBundle | null {\n const pack = PACKS[name];\n if (!pack) return null;\n\n const now = new Date().toISOString();\n const fileEntries: BundleFileEntry[] = pack.files.map(f => ({\n path: f.path,\n type: f.path.split('/')[0],\n id: f.id,\n l0: f.l0,\n }));\n\n const manifest: BundleManifest = {\n version: '1',\n name: `pack:${pack.name}`,\n description: pack.description,\n author: 'agent-harness',\n bundle_version: '1.0.0',\n created: now,\n types: [...new Set(fileEntries.map(f => f.type))],\n tags: pack.tags,\n files: fileEntries,\n };\n\n return {\n manifest,\n files: pack.files.map(f => ({ path: f.path, content: f.content })),\n };\n}\n\n/**\n * List all available builtin starter packs.\n */\nexport function listStarterPacks(): Array<{ name: string; description: string; fileCount: number; tags: string[] }> {\n return Object.values(PACKS).map(p => ({\n name: p.name,\n description: p.description,\n fileCount: p.files.length,\n tags: p.tags,\n }));\n}\n\n/**\n * Check if a source string is a pack reference (starts with \"pack:\").\n */\nexport function isPackReference(source: string): boolean {\n return source.startsWith('pack:');\n}\n\n/**\n * Parse the pack name from a \"pack:<name>\" reference.\n */\nexport function parsePackName(source: string): string {\n return source.slice(5); // Remove \"pack:\" prefix\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from 'fs';\nimport { join, relative } from 'path';\nimport { loadDirectoryWithErrors, loadDirectory } from '../primitives/loader.js';\nimport { buildDependencyGraph } from './graph.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\nimport { loadConfig } from '../core/config.js';\nimport type { InstinctCandidate } from './instinct-learner.js';\nimport { installInstinct } from './instinct-learner.js';\nimport { log } from '../core/logger.js';\nimport { checkRateLimit } from './rate-limiter.js';\nimport { buildRateLimits } from './guardrails.js';\nimport { checkBudget } from './cost-tracker.js';\nimport { validateHarness } from './validator.js';\n\n// --- Auto-Promote Instincts ---\n\nexport interface PatternOccurrence {\n behavior: string;\n journalDates: string[];\n count: number;\n}\n\nexport interface AutoPromoteResult {\n patterns: PatternOccurrence[];\n promoted: string[];\n skipped: string[];\n journalsScanned: number;\n}\n\n/**\n * Scan all journals for instinct candidates that appear 3+ times.\n * These repeated patterns suggest strong behavioral signals worth auto-promoting.\n *\n * The function:\n * 1. Reads all journal files\n * 2. Extracts \"## Instinct Candidates\" sections\n * 3. Normalizes behavior text for fuzzy matching\n * 4. Groups by similar behavior (normalized string comparison)\n * 5. Returns patterns with 3+ occurrences across different journal dates\n * 6. Optionally auto-installs promoted instincts\n */\nexport function autoPromoteInstincts(\n harnessDir: string,\n options?: { threshold?: number; install?: boolean },\n): AutoPromoteResult {\n const threshold = options?.threshold ?? 3;\n const journalDir = join(harnessDir, 'memory', 'journal');\n\n if (!existsSync(journalDir)) {\n return { patterns: [], promoted: [], skipped: [], journalsScanned: 0 };\n }\n\n const files = readdirSync(journalDir)\n .filter((f) => f.endsWith('.md') && /^\\d{4}-\\d{2}-\\d{2}/.test(f))\n .sort();\n\n // Collect all instinct candidate behaviors with their journal dates\n const behaviorMap = new Map<string, { original: string; dates: Set<string> }>();\n\n for (const file of files) {\n const content = readFileSync(join(journalDir, file), 'utf-8');\n const dateMatch = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (!dateMatch) continue;\n const journalDate = dateMatch[1];\n\n // Extract instinct candidates section\n const sectionMatch = content.match(/## Instinct Candidates\\n([\\s\\S]*?)(?=\\n## |\\n*$)/);\n if (!sectionMatch) continue;\n\n const lines = sectionMatch[1]\n .split('\\n')\n .filter((l) => l.startsWith('- '))\n .map((l) => l.slice(2).trim().replace(/^INSTINCT:\\s*/i, ''));\n\n for (const line of lines) {\n if (!line) continue;\n const normalized = normalizeBehavior(line);\n if (!normalized) continue;\n\n const existing = behaviorMap.get(normalized);\n if (existing) {\n existing.dates.add(journalDate);\n } else {\n behaviorMap.set(normalized, { original: line, dates: new Set([journalDate]) });\n }\n }\n }\n\n // Filter to patterns with threshold+ occurrences across different dates\n const patterns: PatternOccurrence[] = [];\n for (const [, value] of behaviorMap) {\n if (value.dates.size >= threshold) {\n patterns.push({\n behavior: value.original,\n journalDates: [...value.dates].sort(),\n count: value.dates.size,\n });\n }\n }\n\n // Sort by count descending\n patterns.sort((a, b) => b.count - a.count);\n\n // Deduplicate against existing instincts\n const existingIds = new Set<string>();\n const existingBehaviors = new Set<string>();\n const instinctsDir = join(harnessDir, 'instincts');\n if (existsSync(instinctsDir)) {\n const docs = loadDirectory(instinctsDir);\n for (const doc of docs) {\n existingIds.add(doc.frontmatter.id);\n if (doc.l0) existingBehaviors.add(normalizeBehavior(doc.l0));\n }\n }\n\n const promoted: string[] = [];\n const skipped: string[] = [];\n\n for (const pattern of patterns) {\n const normalized = normalizeBehavior(pattern.behavior);\n const id = behaviorToId(pattern.behavior);\n\n if (existingIds.has(id) || existingBehaviors.has(normalized)) {\n skipped.push(id);\n continue;\n }\n\n if (options?.install) {\n const candidate: InstinctCandidate = {\n id,\n behavior: pattern.behavior,\n provenance: `auto-promote:${pattern.journalDates.length}x across ${pattern.journalDates[0]} to ${pattern.journalDates[pattern.journalDates.length - 1]}`,\n confidence: Math.min(0.9, 0.5 + pattern.count * 0.1),\n };\n\n const path = installInstinct(harnessDir, candidate);\n if (path) {\n promoted.push(id);\n } else {\n skipped.push(id);\n }\n }\n }\n\n return { patterns, promoted, skipped, journalsScanned: files.length };\n}\n\n/**\n * Normalize behavior text for fuzzy matching.\n * Lowercases, strips punctuation, collapses whitespace.\n */\nfunction normalizeBehavior(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/**\n * Convert a behavior string to a kebab-case ID.\n */\nfunction behaviorToId(behavior: string): string {\n return behavior\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 50)\n .replace(/-+$/, '');\n}\n\n// --- Dead Primitive Detection ---\n\nexport interface DeadPrimitive {\n id: string;\n path: string;\n directory: string;\n lastModified: string;\n daysSinceModified: number;\n reason: string;\n}\n\nexport interface DeadPrimitiveResult {\n dead: DeadPrimitive[];\n totalScanned: number;\n thresholdDays: number;\n}\n\n/**\n * Detect \"dead\" primitives — files that are:\n * 1. Orphaned (no incoming or outgoing references via related:/with:)\n * 2. Not modified in the last N days (default 30)\n *\n * Excludes session and journal directories (memory files).\n * Does NOT flag recently created primitives even if orphaned.\n */\nexport function detectDeadPrimitives(\n harnessDir: string,\n config?: HarnessConfig,\n options?: { thresholdDays?: number },\n): DeadPrimitiveResult {\n const thresholdDays = options?.thresholdDays ?? 30;\n const now = Date.now();\n const thresholdMs = thresholdDays * 24 * 60 * 60 * 1000;\n\n // Build dependency graph to find orphans\n const graph = buildDependencyGraph(harnessDir, config);\n const orphanIds = new Set(graph.orphans);\n\n // Also find nodes with only broken refs (effectively orphaned)\n const connectedIds = new Set<string>();\n for (const edge of graph.edges) {\n connectedIds.add(edge.from);\n connectedIds.add(edge.to);\n }\n\n const dead: DeadPrimitive[] = [];\n let totalScanned = 0;\n\n for (const node of graph.nodes) {\n totalScanned++;\n\n // Skip non-orphans\n if (!orphanIds.has(node.id)) continue;\n\n // Check file modification time\n const absPath = join(harnessDir, node.path);\n if (!existsSync(absPath)) continue;\n\n try {\n const stat = statSync(absPath);\n const mtime = stat.mtime.getTime();\n const daysSince = Math.floor((now - mtime) / (24 * 60 * 60 * 1000));\n\n if (daysSince >= thresholdDays) {\n dead.push({\n id: node.id,\n path: node.path,\n directory: node.directory,\n lastModified: stat.mtime.toISOString().split('T')[0],\n daysSinceModified: daysSince,\n reason: `Orphaned (no references) and not modified in ${daysSince} days`,\n });\n }\n } catch (err) {\n log.warn(`Failed to stat ${absPath}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Sort by days since modified (most stale first)\n dead.sort((a, b) => b.daysSinceModified - a.daysSinceModified);\n\n return { dead, totalScanned, thresholdDays };\n}\n\n// --- Contradiction Detection ---\n\nexport interface Contradiction {\n primitiveA: { id: string; path: string; type: string; text: string };\n primitiveB: { id: string; path: string; type: string; text: string };\n reason: string;\n severity: 'low' | 'medium' | 'high';\n}\n\nexport interface ContradictionResult {\n contradictions: Contradiction[];\n rulesChecked: number;\n instinctsChecked: number;\n}\n\n/**\n * Detect contradictions between rules and instincts.\n *\n * Checks for:\n * 1. Direct negation patterns (\"always X\" vs \"never X\", \"do X\" vs \"don't X\")\n * 2. Conflicting tag overlap with opposing behavioral signals\n * 3. Same topic with contradictory directives\n *\n * This is a heuristic-based detector (no LLM needed).\n * Returns candidate contradictions for human review.\n */\nexport function detectContradictions(\n harnessDir: string,\n): ContradictionResult {\n const rulesDir = join(harnessDir, 'rules');\n const instinctsDir = join(harnessDir, 'instincts');\n\n const rules: HarnessDocument[] = existsSync(rulesDir) ? loadDirectory(rulesDir) : [];\n const instincts: HarnessDocument[] = existsSync(instinctsDir) ? loadDirectory(instinctsDir) : [];\n\n const contradictions: Contradiction[] = [];\n\n // Build a lookup of behavioral directives from each document\n const ruleDirectives = rules.map((doc) => ({\n doc,\n directives: extractDirectives(doc),\n topics: extractTopics(doc),\n }));\n\n const instinctDirectives = instincts.map((doc) => ({\n doc,\n directives: extractDirectives(doc),\n topics: extractTopics(doc),\n }));\n\n // Cross-check rules vs instincts\n for (const rule of ruleDirectives) {\n for (const instinct of instinctDirectives) {\n // Check directive negation patterns\n for (const rd of rule.directives) {\n for (const id of instinct.directives) {\n const negation = checkNegation(rd, id);\n if (negation) {\n contradictions.push({\n primitiveA: {\n id: rule.doc.frontmatter.id,\n path: relative(harnessDir, rule.doc.path),\n type: 'rule',\n text: rd.raw,\n },\n primitiveB: {\n id: instinct.doc.frontmatter.id,\n path: relative(harnessDir, instinct.doc.path),\n type: 'instinct',\n text: id.raw,\n },\n reason: negation,\n severity: 'high',\n });\n }\n }\n }\n\n // Check topic conflicts (same topic, opposing signals)\n const sharedTopics = rule.topics.filter((t) => instinct.topics.includes(t));\n if (sharedTopics.length > 0) {\n // Check if one says \"always\" and other says \"never\" about shared topic\n const ruleText = (rule.doc.l0 + ' ' + rule.doc.body).toLowerCase();\n const instinctText = (instinct.doc.l0 + ' ' + instinct.doc.body).toLowerCase();\n\n for (const topic of sharedTopics) {\n const ruleHasAlways = hasPositiveDirective(ruleText, topic);\n const instinctHasNever = hasNegativeDirective(instinctText, topic);\n const ruleHasNever = hasNegativeDirective(ruleText, topic);\n const instinctHasAlways = hasPositiveDirective(instinctText, topic);\n\n if ((ruleHasAlways && instinctHasNever) || (ruleHasNever && instinctHasAlways)) {\n // Avoid duplicate if already caught by directive check\n const alreadyCaught = contradictions.some(\n (c) =>\n c.primitiveA.id === rule.doc.frontmatter.id &&\n c.primitiveB.id === instinct.doc.frontmatter.id,\n );\n if (!alreadyCaught) {\n contradictions.push({\n primitiveA: {\n id: rule.doc.frontmatter.id,\n path: relative(harnessDir, rule.doc.path),\n type: 'rule',\n text: rule.doc.l0 || rule.doc.frontmatter.id,\n },\n primitiveB: {\n id: instinct.doc.frontmatter.id,\n path: relative(harnessDir, instinct.doc.path),\n type: 'instinct',\n text: instinct.doc.l0 || instinct.doc.frontmatter.id,\n },\n reason: `Conflicting directives about \"${topic}\"`,\n severity: 'medium',\n });\n }\n }\n }\n }\n }\n }\n\n // Also check rules vs rules and instincts vs instincts\n checkIntraGroupContradictions(ruleDirectives, 'rule', harnessDir, contradictions);\n checkIntraGroupContradictions(instinctDirectives, 'instinct', harnessDir, contradictions);\n\n return {\n contradictions,\n rulesChecked: rules.length,\n instinctsChecked: instincts.length,\n };\n}\n\ninterface Directive {\n action: 'positive' | 'negative';\n verb: string;\n subject: string;\n raw: string;\n}\n\n/**\n * Extract behavioral directives from a document.\n * Looks for patterns like \"always X\", \"never Y\", \"do X\", \"don't Y\", \"avoid X\", \"prefer Y\".\n */\nfunction extractDirectives(doc: HarnessDocument): Directive[] {\n const directives: Directive[] = [];\n const text = (doc.l0 + '\\n' + doc.body).trim();\n\n // Process line by line\n for (const line of text.split('\\n')) {\n const trimmed = line.trim().toLowerCase();\n if (!trimmed || trimmed.startsWith('#')) continue;\n\n // Strip list markers\n const cleaned = trimmed.replace(/^[-*]\\s+/, '').replace(/^\\d+\\.\\s+/, '');\n\n // Positive patterns\n const positiveMatch = cleaned.match(\n /^(always|must|should|prefer|ensure|require|use)\\s+(.+)/,\n );\n if (positiveMatch) {\n directives.push({\n action: 'positive',\n verb: positiveMatch[1],\n subject: positiveMatch[2].replace(/[.!]$/, ''),\n raw: cleaned,\n });\n continue;\n }\n\n // Negative patterns\n const negativeMatch = cleaned.match(\n /^(never|don'?t|avoid|do not|must not|should not|shouldn'?t)\\s+(.+)/,\n );\n if (negativeMatch) {\n directives.push({\n action: 'negative',\n verb: negativeMatch[1],\n subject: negativeMatch[2].replace(/[.!]$/, ''),\n raw: cleaned,\n });\n }\n }\n\n return directives;\n}\n\n/**\n * Extract topic keywords from a document (from tags, ID, and L0).\n */\nfunction extractTopics(doc: HarnessDocument): string[] {\n const topics: string[] = [];\n\n // Tags as topics\n for (const tag of doc.frontmatter.tags) {\n topics.push(tag.toLowerCase());\n }\n\n // ID words as topics\n const idParts = doc.frontmatter.id.split('-').filter((p) => p.length > 2);\n topics.push(...idParts.map((p) => p.toLowerCase()));\n\n return [...new Set(topics)];\n}\n\n/**\n * Check if two directives are negations of each other.\n */\nfunction checkNegation(a: Directive, b: Directive): string | null {\n // One positive, one negative\n if (a.action === b.action) return null;\n\n // Normalize subjects for comparison\n const subA = a.subject.toLowerCase().replace(/\\s+/g, ' ').trim();\n const subB = b.subject.toLowerCase().replace(/\\s+/g, ' ').trim();\n\n // Direct subject match\n if (subA === subB) {\n return `Direct contradiction: \"${a.raw}\" vs \"${b.raw}\"`;\n }\n\n // Fuzzy match: check if one subject is a substring of the other (with word boundaries)\n const wordsA = subA.split(' ').filter((w) => w.length > 3);\n const wordsB = subB.split(' ').filter((w) => w.length > 3);\n const overlap = wordsA.filter((w) => wordsB.includes(w));\n\n if (overlap.length >= 2 && overlap.length >= Math.min(wordsA.length, wordsB.length) * 0.6) {\n return `Likely contradiction (shared terms: ${overlap.join(', ')}): \"${a.raw}\" vs \"${b.raw}\"`;\n }\n\n return null;\n}\n\nfunction hasPositiveDirective(text: string, topic: string): boolean {\n const patterns = [\n new RegExp(`always\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`must\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`should\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`prefer\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`use\\\\s+\\\\w*${topic}`, 'i'),\n ];\n return patterns.some((p) => p.test(text));\n}\n\nfunction hasNegativeDirective(text: string, topic: string): boolean {\n const patterns = [\n new RegExp(`never\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`avoid\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`don'?t\\\\s+\\\\w*${topic}`, 'i'),\n new RegExp(`do not\\\\s+\\\\w*${topic}`, 'i'),\n ];\n return patterns.some((p) => p.test(text));\n}\n\nfunction checkIntraGroupContradictions(\n group: Array<{ doc: HarnessDocument; directives: Directive[]; topics: string[] }>,\n type: string,\n harnessDir: string,\n contradictions: Contradiction[],\n): void {\n for (let i = 0; i < group.length; i++) {\n for (let j = i + 1; j < group.length; j++) {\n const a = group[i];\n const b = group[j];\n\n for (const da of a.directives) {\n for (const db of b.directives) {\n const negation = checkNegation(da, db);\n if (negation) {\n contradictions.push({\n primitiveA: {\n id: a.doc.frontmatter.id,\n path: relative(harnessDir, a.doc.path),\n type,\n text: da.raw,\n },\n primitiveB: {\n id: b.doc.frontmatter.id,\n path: relative(harnessDir, b.doc.path),\n type,\n text: db.raw,\n },\n reason: negation,\n severity: 'medium',\n });\n }\n }\n }\n }\n }\n}\n\n// --- Session Enrichment ---\n\nexport interface SessionEnrichment {\n sessionId: string;\n topics: string[];\n tokenCount: number;\n stepCount: number;\n model: string;\n toolsUsed: string[];\n primitivesReferenced: string[];\n duration: string;\n}\n\nexport interface EnrichmentResult {\n enriched: SessionEnrichment[];\n sessionsScanned: number;\n}\n\n/**\n * Enrich sessions with extracted metadata.\n *\n * Scans session files and extracts:\n * - Topics (from prompt text, frequent nouns, matched primitive IDs)\n * - Token/step counts (from frontmatter or markdown body)\n * - Model used\n * - Tools used (from tool call sections)\n * - Referenced primitives (IDs mentioned in session text)\n * - Duration\n */\nexport function enrichSessions(\n harnessDir: string,\n config?: HarnessConfig,\n options?: { from?: string; to?: string },\n): EnrichmentResult {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (!existsSync(sessionsDir)) {\n return { enriched: [], sessionsScanned: 0 };\n }\n\n // Load all primitive IDs for cross-reference\n const primitiveIds = new Set<string>();\n const dirs = getPrimitiveDirs(config);\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n primitiveIds.add(doc.frontmatter.id);\n }\n }\n\n const files = readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'))\n .sort();\n\n // Filter by date range\n const filtered = files.filter((f) => {\n if (!options?.from && !options?.to) return true;\n const dateMatch = f.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (!dateMatch) return false;\n const d = dateMatch[1];\n if (options?.from && d < options.from) return false;\n if (options?.to && d > options.to) return false;\n return true;\n });\n\n const enriched: SessionEnrichment[] = [];\n\n for (const file of filtered) {\n const content = readFileSync(join(sessionsDir, file), 'utf-8');\n const sessionId = file.replace(/\\.md$/, '');\n\n const enrichment = enrichSession(content, sessionId, primitiveIds);\n enriched.push(enrichment);\n }\n\n return { enriched, sessionsScanned: filtered.length };\n}\n\nfunction enrichSession(\n content: string,\n sessionId: string,\n primitiveIds: Set<string>,\n): SessionEnrichment {\n // Extract metadata from frontmatter/body\n const tokensMatch = content.match(/[Tt]okens?[:\\s]+(\\d[\\d,]*)/);\n const tokenCount = tokensMatch ? parseInt(tokensMatch[1].replace(/,/g, ''), 10) : 0;\n\n const stepsMatch = content.match(/[Ss]teps?[:\\s]+(\\d+)/);\n const stepCount = stepsMatch ? parseInt(stepsMatch[1], 10) : 0;\n\n const modelMatch = content.match(/[Mm]odel[:\\s]+([^\\n]+)/);\n const model = modelMatch ? modelMatch[1].trim() : 'unknown';\n\n const durationMatch = content.match(/[Dd]uration[:\\s]+([^\\n]+)/);\n const duration = durationMatch ? durationMatch[1].trim() : '';\n\n // Extract tools used from tool call sections\n const toolsUsed: string[] = [];\n const toolMatches = content.matchAll(/### Tool(?:\\s+Call)?:\\s*(\\S+)/g);\n for (const match of toolMatches) {\n const toolName = match[1];\n if (!toolsUsed.includes(toolName)) {\n toolsUsed.push(toolName);\n }\n }\n\n // Also check for tool_calls in frontmatter-style sections\n const toolCallMatches = content.matchAll(/toolName[:\\s]+[\"']?(\\S+)[\"']?/g);\n for (const match of toolCallMatches) {\n const toolName = match[1];\n if (!toolsUsed.includes(toolName)) {\n toolsUsed.push(toolName);\n }\n }\n\n // Find referenced primitives (any primitive ID that appears in text)\n const primitivesReferenced: string[] = [];\n for (const id of primitiveIds) {\n if (id.length < 3) continue; // Skip very short IDs to avoid false positives\n if (content.includes(id)) {\n primitivesReferenced.push(id);\n }\n }\n\n // Extract topics from prompt section\n const topics = extractSessionTopics(content);\n\n return {\n sessionId,\n topics,\n tokenCount,\n stepCount,\n model,\n toolsUsed,\n primitivesReferenced,\n duration,\n };\n}\n\n/**\n * Extract topic keywords from session content.\n * Uses a simple frequency-based approach on meaningful words.\n */\nfunction extractSessionTopics(content: string): string[] {\n // Extract prompt section specifically\n const promptMatch = content.match(/## Prompt\\n([\\s\\S]*?)(?=\\n## |$)/);\n const promptText = promptMatch ? promptMatch[1] : '';\n\n // Also include summary\n const summaryMatch = content.match(/## Summary\\n([\\s\\S]*?)(?=\\n## |$)/);\n const summaryText = summaryMatch ? summaryMatch[1] : '';\n\n const text = (promptText + ' ' + summaryText).toLowerCase();\n\n // Common stop words to filter out\n const stopWords = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',\n 'should', 'may', 'might', 'shall', 'can', 'need', 'must', 'to', 'of',\n 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'about',\n 'like', 'through', 'after', 'before', 'between', 'under', 'during',\n 'and', 'or', 'but', 'not', 'no', 'nor', 'so', 'yet', 'both', 'either',\n 'neither', 'each', 'every', 'all', 'any', 'few', 'more', 'most', 'other',\n 'some', 'such', 'than', 'too', 'very', 'just', 'also', 'this', 'that',\n 'these', 'those', 'it', 'its', 'i', 'me', 'my', 'we', 'our', 'you',\n 'your', 'he', 'she', 'they', 'them', 'their', 'what', 'which', 'who',\n 'when', 'where', 'how', 'why', 'if', 'then', 'else', 'while', 'up',\n 'out', 'off', 'over', 'only', 'own', 'same', 'get', 'got', 'make',\n 'made', 'use', 'used', 'using', 'one', 'two', 'new',\n ]);\n\n // Count word frequencies\n const words = text\n .replace(/[^a-z0-9\\s-]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 3 && !stopWords.has(w));\n\n const freq = new Map<string, number>();\n for (const word of words) {\n freq.set(word, (freq.get(word) ?? 0) + 1);\n }\n\n // Return top 5 most frequent meaningful words\n return Array.from(freq.entries())\n .filter(([, count]) => count >= 1)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([word]) => word);\n}\n\n// --- Capability Suggestions ---\n\nexport interface CapabilitySuggestion {\n topic: string;\n frequency: number;\n sessionDates: string[];\n suggestion: string;\n suggestedType: 'skill' | 'playbook';\n}\n\nexport interface CapabilitySuggestionResult {\n suggestions: CapabilitySuggestion[];\n topicsAnalyzed: number;\n sessionsScanned: number;\n}\n\n/**\n * Suggest capabilities (skills/playbooks) for frequent session topics\n * that don't have existing coverage.\n *\n * Scans sessions for recurring topics, cross-references against existing\n * skills/playbooks, and suggests new ones for uncovered topics.\n */\nexport function suggestCapabilities(\n harnessDir: string,\n config?: HarnessConfig,\n options?: { minFrequency?: number },\n): CapabilitySuggestionResult {\n const minFrequency = options?.minFrequency ?? 3;\n\n // Enrich sessions to get topics\n const { enriched, sessionsScanned } = enrichSessions(harnessDir, config);\n\n // Collect topic frequency across sessions\n const topicOccurrences = new Map<string, Set<string>>();\n for (const session of enriched) {\n const dateMatch = session.sessionId.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n const date = dateMatch ? dateMatch[1] : session.sessionId;\n\n for (const topic of session.topics) {\n if (!topicOccurrences.has(topic)) {\n topicOccurrences.set(topic, new Set());\n }\n topicOccurrences.get(topic)!.add(date);\n }\n }\n\n // Load existing skills and playbooks\n const coveredTopics = new Set<string>();\n const skillsDir = join(harnessDir, 'skills');\n const playbooksDir = join(harnessDir, 'playbooks');\n\n for (const dir of [skillsDir, playbooksDir]) {\n if (!existsSync(dir)) continue;\n const docs = loadDirectory(dir);\n for (const doc of docs) {\n // Add ID parts as covered topics\n for (const part of doc.frontmatter.id.split('-')) {\n if (part.length > 2) coveredTopics.add(part.toLowerCase());\n }\n // Add tags as covered topics\n for (const tag of doc.frontmatter.tags) {\n coveredTopics.add(tag.toLowerCase());\n }\n }\n }\n\n // Find frequent uncovered topics\n const suggestions: CapabilitySuggestion[] = [];\n\n for (const [topic, dates] of topicOccurrences) {\n if (dates.size < minFrequency) continue;\n if (coveredTopics.has(topic)) continue;\n\n const suggestedType = dates.size >= 5 ? 'playbook' : 'skill';\n suggestions.push({\n topic,\n frequency: dates.size,\n sessionDates: [...dates].sort(),\n suggestion: `Create a ${suggestedType} for \"${topic}\" — appeared in ${dates.size} session(s)`,\n suggestedType,\n });\n }\n\n // Sort by frequency\n suggestions.sort((a, b) => b.frequency - a.frequency);\n\n return {\n suggestions,\n topicsAnalyzed: topicOccurrences.size,\n sessionsScanned,\n };\n}\n\n// --- Failure Taxonomy ---\n\n/**\n * Named failure modes with recovery strategies.\n * Based on common agent failure patterns (context overflow, tool errors,\n * budget exhaustion, hallucination, stale primitives, circular delegation).\n */\nexport type FailureMode =\n | 'context_overflow'\n | 'tool_execution_error'\n | 'budget_exhausted'\n | 'rate_limited'\n | 'llm_timeout'\n | 'llm_error'\n | 'hallucination_detected'\n | 'stale_primitive'\n | 'circular_delegation'\n | 'missing_dependency'\n | 'parse_error'\n | 'config_invalid'\n | 'mcp_connection_failed'\n | 'state_corruption'\n | 'unknown';\n\nexport interface FailureRecord {\n mode: FailureMode;\n timestamp: string;\n sessionId?: string;\n message: string;\n context?: Record<string, unknown>;\n recoveryAttempted?: string;\n recovered: boolean;\n}\n\nexport interface FailureTaxonomy {\n modes: Record<FailureMode, {\n description: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n recoveryStrategies: string[];\n autoRecoverable: boolean;\n }>;\n}\n\n/**\n * The canonical failure taxonomy for agent-harness.\n * Each mode has a description, severity level, recovery strategies,\n * and whether automatic recovery is possible.\n */\nexport const FAILURE_TAXONOMY: FailureTaxonomy = {\n modes: {\n context_overflow: {\n description: 'System prompt + conversation exceeds model context window',\n severity: 'high',\n recoveryStrategies: [\n 'Trim oldest messages from conversation history',\n 'Reduce primitive loading level (L2 → L1 → L0)',\n 'Archive old sessions to free memory budget',\n 'Split into sub-conversations with summarized context',\n ],\n autoRecoverable: true,\n },\n tool_execution_error: {\n description: 'An MCP or HTTP tool call failed during execution',\n severity: 'medium',\n recoveryStrategies: [\n 'Retry with exponential backoff',\n 'Fall back to alternative tool if available',\n 'Report error to LLM and ask for alternative approach',\n 'Skip tool and proceed with available context',\n ],\n autoRecoverable: true,\n },\n budget_exhausted: {\n description: 'Daily or monthly spending limit has been reached',\n severity: 'critical',\n recoveryStrategies: [\n 'Wait until next budget period',\n 'Switch to cheaper model (fast_model or summary_model)',\n 'Queue non-urgent tasks for later execution',\n 'Alert operator to increase budget',\n ],\n autoRecoverable: false,\n },\n rate_limited: {\n description: 'LLM API rate limit hit (per-minute/hour/day)',\n severity: 'medium',\n recoveryStrategies: [\n 'Wait for retryAfterMs from rate limiter',\n 'Reduce request frequency',\n 'Queue and batch requests',\n ],\n autoRecoverable: true,\n },\n llm_timeout: {\n description: 'LLM API call timed out without response',\n severity: 'medium',\n recoveryStrategies: [\n 'Retry with same prompt',\n 'Retry with shorter prompt (reduce context)',\n 'Switch to faster model',\n 'Increase timeout_ms in config',\n ],\n autoRecoverable: true,\n },\n llm_error: {\n description: 'LLM API returned an error response (4xx/5xx)',\n severity: 'high',\n recoveryStrategies: [\n 'Retry with exponential backoff (max_retries in config)',\n 'Switch to fallback model',\n 'Check API key validity',\n 'Log error details for debugging',\n ],\n autoRecoverable: true,\n },\n hallucination_detected: {\n description: 'LLM output contains fabricated facts or references to non-existent primitives',\n severity: 'medium',\n recoveryStrategies: [\n 'Re-prompt with explicit grounding: \"Only reference primitives that exist\"',\n 'Validate output against known primitive IDs',\n 'Add validation step before acting on LLM output',\n 'Record in journal for future training',\n ],\n autoRecoverable: false,\n },\n stale_primitive: {\n description: 'A referenced primitive is outdated, deprecated, or orphaned',\n severity: 'low',\n recoveryStrategies: [\n 'Run detectDeadPrimitives() to identify stale files',\n 'Archive deprecated primitives',\n 'Update references to point to current versions',\n 'Auto-flag via validator',\n ],\n autoRecoverable: true,\n },\n circular_delegation: {\n description: 'Agent delegation loop detected (A delegates to B delegates to A)',\n severity: 'high',\n recoveryStrategies: [\n 'Track delegation chain and break on cycle detection',\n 'Set max delegation depth (default: 3)',\n 'Return partial result from last agent in chain',\n 'Log delegation graph for debugging',\n ],\n autoRecoverable: true,\n },\n missing_dependency: {\n description: 'A required dependency (primitive, MCP server, API key) is missing',\n severity: 'high',\n recoveryStrategies: [\n 'Run doctorHarness() to auto-fix missing files',\n 'Check .env for required API keys',\n 'Install missing MCP servers',\n 'Prompt user to install missing bundle',\n ],\n autoRecoverable: false,\n },\n parse_error: {\n description: 'A primitive file has invalid YAML frontmatter or malformed content',\n severity: 'medium',\n recoveryStrategies: [\n 'Run fixCapability() to auto-repair frontmatter',\n 'Skip the malformed file and log a warning',\n 'Use default frontmatter values',\n 'Report to user for manual fix',\n ],\n autoRecoverable: true,\n },\n config_invalid: {\n description: 'config.yaml fails schema validation',\n severity: 'critical',\n recoveryStrategies: [\n 'Fall back to CONFIG_DEFAULTS',\n 'Report specific validation errors to user',\n 'Run harness doctor to attempt repair',\n ],\n autoRecoverable: false,\n },\n mcp_connection_failed: {\n description: 'Failed to connect to an MCP server (process spawn or HTTP)',\n severity: 'medium',\n recoveryStrategies: [\n 'Retry connection with backoff',\n 'Disable the server and continue without its tools',\n 'Check command/URL/env configuration',\n 'Fall back to built-in tools only',\n ],\n autoRecoverable: true,\n },\n state_corruption: {\n description: 'state.md is unreadable or contains invalid data',\n severity: 'high',\n recoveryStrategies: [\n 'Fall back to DEFAULT_STATE',\n 'Rebuild state from session history',\n 'Reset state.md and log the event',\n ],\n autoRecoverable: true,\n },\n unknown: {\n description: 'An unclassified error occurred',\n severity: 'high',\n recoveryStrategies: [\n 'Log full error with stack trace',\n 'Record in health.json failure counter',\n 'Alert operator',\n 'Graceful shutdown if critical path',\n ],\n autoRecoverable: false,\n },\n },\n};\n\nexport interface FailureAnalysis {\n recentFailures: FailureRecord[];\n modeFrequency: Record<string, number>;\n mostCommonMode: FailureMode | null;\n suggestedRecovery: string[];\n healthImplication: 'healthy' | 'degraded' | 'unhealthy';\n}\n\n/**\n * Classify an error into a failure mode.\n */\nexport function classifyFailure(error: Error | string, context?: Record<string, unknown>): FailureMode {\n const msg = typeof error === 'string' ? error.toLowerCase() : error.message.toLowerCase();\n\n if (msg.includes('context') && (msg.includes('overflow') || msg.includes('too long') || msg.includes('exceed'))) {\n return 'context_overflow';\n }\n if (msg.includes('tool') && (msg.includes('fail') || msg.includes('error') || msg.includes('timeout'))) {\n return 'tool_execution_error';\n }\n if (msg.includes('budget') || msg.includes('spending') || msg.includes('limit exceeded')) {\n return 'budget_exhausted';\n }\n if (msg.includes('rate limit') || msg.includes('429') || msg.includes('too many requests')) {\n return 'rate_limited';\n }\n if (msg.includes('timeout') || msg.includes('timed out') || msg.includes('ETIMEDOUT')) {\n return 'llm_timeout';\n }\n if (msg.includes('mcp') && (msg.includes('connect') || msg.includes('spawn') || msg.includes('failed'))) {\n return 'mcp_connection_failed';\n }\n if (msg.includes('parse') || msg.includes('yaml') || msg.includes('frontmatter') || msg.includes('malformed')) {\n return 'parse_error';\n }\n if (msg.includes('config') && (msg.includes('invalid') || msg.includes('validation'))) {\n return 'config_invalid';\n }\n if (msg.includes('state') && (msg.includes('corrupt') || msg.includes('invalid') || msg.includes('unreadable'))) {\n return 'state_corruption';\n }\n if (msg.includes('circular') || msg.includes('delegation loop') || msg.includes('cycle')) {\n return 'circular_delegation';\n }\n if (msg.includes('missing') || msg.includes('not found') || msg.includes('dependency')) {\n return 'missing_dependency';\n }\n if (msg.includes('401') || msg.includes('403') || msg.includes('500') || msg.includes('502') || msg.includes('503')) {\n return 'llm_error';\n }\n\n return 'unknown';\n}\n\n/**\n * Get recovery strategies for a failure mode.\n */\nexport function getRecoveryStrategies(mode: FailureMode): string[] {\n return FAILURE_TAXONOMY.modes[mode]?.recoveryStrategies ?? ['Log error and alert operator'];\n}\n\n/**\n * Analyze failure patterns from session history and health data.\n * Returns frequency analysis and recovery suggestions.\n */\nexport function analyzeFailures(\n harnessDir: string,\n options?: { days?: number },\n): FailureAnalysis {\n const days = options?.days ?? 7;\n const now = Date.now();\n const cutoffMs = days * 24 * 60 * 60 * 1000;\n\n const recentFailures: FailureRecord[] = [];\n\n // Scan health.json for failures\n const healthPath = join(harnessDir, 'memory', 'health.json');\n if (existsSync(healthPath)) {\n try {\n const health = JSON.parse(readFileSync(healthPath, 'utf-8'));\n if (health.lastError) {\n const mode = classifyFailure(health.lastError);\n recentFailures.push({\n mode,\n timestamp: health.lastFailure || new Date().toISOString(),\n message: health.lastError,\n recovered: health.consecutiveFailures === 0,\n });\n }\n } catch {\n // Malformed health.json\n }\n }\n\n // Scan sessions for error indicators\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (existsSync(sessionsDir)) {\n const files = readdirSync(sessionsDir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.'))\n .sort()\n .reverse();\n\n for (const file of files) {\n const dateMatch = file.match(/^(\\d{4}-\\d{2}-\\d{2})/);\n if (dateMatch) {\n const fileDate = new Date(dateMatch[1]).getTime();\n if (now - fileDate > cutoffMs) break;\n }\n\n try {\n const content = readFileSync(join(sessionsDir, file), 'utf-8');\n // Look for error patterns in session content\n const errorLines = content.split('\\n').filter((l) =>\n l.toLowerCase().includes('error') ||\n l.toLowerCase().includes('failed') ||\n l.toLowerCase().includes('timeout'),\n );\n\n for (const line of errorLines.slice(0, 3)) {\n const mode = classifyFailure(line);\n if (mode !== 'unknown') {\n recentFailures.push({\n mode,\n timestamp: dateMatch?.[1] ?? 'unknown',\n sessionId: file.replace('.md', ''),\n message: line.trim().slice(0, 200),\n recovered: true,\n });\n }\n }\n } catch {\n // Skip unreadable sessions\n }\n }\n }\n\n // Calculate frequency\n const modeFrequency: Record<string, number> = {};\n for (const f of recentFailures) {\n modeFrequency[f.mode] = (modeFrequency[f.mode] ?? 0) + 1;\n }\n\n // Find most common mode\n let mostCommonMode: FailureMode | null = null;\n let maxFreq = 0;\n for (const [mode, count] of Object.entries(modeFrequency)) {\n if (count > maxFreq) {\n maxFreq = count;\n mostCommonMode = mode as FailureMode;\n }\n }\n\n // Suggest recovery\n const suggestedRecovery = mostCommonMode\n ? getRecoveryStrategies(mostCommonMode)\n : [];\n\n // Determine health implication\n let healthImplication: 'healthy' | 'degraded' | 'unhealthy' = 'healthy';\n if (recentFailures.length > 5) {\n healthImplication = 'unhealthy';\n } else if (recentFailures.length > 0) {\n healthImplication = 'degraded';\n }\n\n return {\n recentFailures: recentFailures.slice(0, 20),\n modeFrequency,\n mostCommonMode,\n suggestedRecovery,\n healthImplication,\n };\n}\n\n// --- Verification Gates ---\n\nexport type GateStatus = 'pass' | 'fail' | 'warn' | 'skip';\n\nexport interface GateCheck {\n name: string;\n description: string;\n status: GateStatus;\n message: string;\n details?: Record<string, unknown>;\n}\n\nexport interface VerificationGateResult {\n gateName: string;\n passed: boolean;\n checks: GateCheck[];\n summary: string;\n}\n\nexport type GateDefinition = {\n name: string;\n description: string;\n check: (harnessDir: string, config?: HarnessConfig) => GateCheck[];\n};\n\n/**\n * Built-in verification gates for the harness.\n * Each gate is a set of checks that must pass at a specific stage.\n */\nexport const BUILTIN_GATES: GateDefinition[] = [\n {\n name: 'pre-boot',\n description: 'Checks before agent boot: config valid, CORE.md exists, API key available',\n check: (harnessDir: string) => {\n const checks: GateCheck[] = [];\n\n // CORE.md exists\n checks.push(existsSync(join(harnessDir, 'CORE.md'))\n ? { name: 'core-md', description: 'CORE.md exists', status: 'pass', message: 'CORE.md present' }\n : { name: 'core-md', description: 'CORE.md exists', status: 'fail', message: 'Missing CORE.md — required for agent identity' });\n\n // Config valid\n try {\n loadConfig(harnessDir);\n checks.push({ name: 'config-valid', description: 'config.yaml valid', status: 'pass', message: 'Config parsed successfully' });\n } catch (err) {\n checks.push({ name: 'config-valid', description: 'config.yaml valid', status: 'fail', message: `Config error: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // API key available\n const hasKey = !!(process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY);\n checks.push(hasKey\n ? { name: 'api-key', description: 'API key available', status: 'pass', message: 'API key found in environment' }\n : { name: 'api-key', description: 'API key available', status: 'warn', message: 'No API key in environment — will need --api-key flag' });\n\n // Memory directory\n const memDir = join(harnessDir, 'memory');\n checks.push(existsSync(memDir)\n ? { name: 'memory-dir', description: 'Memory directory exists', status: 'pass', message: 'memory/ directory present' }\n : { name: 'memory-dir', description: 'Memory directory exists', status: 'warn', message: 'memory/ directory missing — will be created on first run' });\n\n return checks;\n },\n },\n {\n name: 'pre-run',\n description: 'Checks before each LLM call: budget, rate limits, context budget',\n check: (harnessDir: string) => {\n const checks: GateCheck[] = [];\n\n let config: HarnessConfig;\n try {\n config = loadConfig(harnessDir);\n } catch {\n checks.push({ name: 'config-load', description: 'Config loadable', status: 'fail', message: 'Cannot load config' });\n return checks;\n }\n\n // Budget check\n try {\n const budgetStatus = checkBudget(harnessDir, config.budget);\n const exceeded = (budgetStatus.daily_remaining_usd !== null && budgetStatus.daily_remaining_usd <= 0) ||\n (budgetStatus.monthly_remaining_usd !== null && budgetStatus.monthly_remaining_usd <= 0);\n if (exceeded) {\n checks.push({ name: 'budget', description: 'Budget not exceeded', status: 'fail', message: 'Budget limit exceeded', details: { ...budgetStatus } });\n } else {\n checks.push({ name: 'budget', description: 'Budget not exceeded', status: 'pass', message: 'Within budget' });\n }\n } catch (err) {\n checks.push({ name: 'budget', description: 'Budget not exceeded', status: 'skip', message: `Budget check unavailable: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // Rate limit check\n try {\n const limits = buildRateLimits(config);\n if (limits.length === 0) {\n checks.push({ name: 'rate-limit', description: 'Rate limit not hit', status: 'pass', message: 'No rate limits configured' });\n } else {\n let blocked = false;\n for (const limit of limits) {\n const rateCheck = checkRateLimit(harnessDir, limit);\n if (!rateCheck.allowed) {\n const windowLabel = limit.window_ms <= 60_000 ? 'minute' : limit.window_ms <= 3_600_000 ? 'hour' : 'day';\n checks.push({ name: 'rate-limit', description: 'Rate limit not hit', status: 'fail', message: `Rate limited (${windowLabel}): ${rateCheck.current}/${rateCheck.max}. Retry after ${Math.ceil(rateCheck.retry_after_ms / 1000)}s` });\n blocked = true;\n break;\n }\n }\n if (!blocked) {\n checks.push({ name: 'rate-limit', description: 'Rate limit not hit', status: 'pass', message: 'Within rate limits' });\n }\n }\n } catch (err) {\n checks.push({ name: 'rate-limit', description: 'Rate limit not hit', status: 'skip', message: `Rate limit check unavailable: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // Health check\n const healthPath = join(harnessDir, 'memory', 'health.json');\n if (existsSync(healthPath)) {\n try {\n const health = JSON.parse(readFileSync(healthPath, 'utf-8'));\n if (health.consecutiveFailures >= 3) {\n checks.push({ name: 'health', description: 'Agent healthy', status: 'warn', message: `${health.consecutiveFailures} consecutive failures detected` });\n } else {\n checks.push({ name: 'health', description: 'Agent healthy', status: 'pass', message: 'No recent failure pattern' });\n }\n } catch {\n checks.push({ name: 'health', description: 'Agent healthy', status: 'skip', message: 'Health data unavailable' });\n }\n }\n\n return checks;\n },\n },\n {\n name: 'post-session',\n description: 'Checks after a session: session recorded, no parse errors, primitives intact',\n check: (harnessDir: string) => {\n const checks: GateCheck[] = [];\n\n // Sessions directory exists and has files\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n if (existsSync(sessionsDir)) {\n const files = readdirSync(sessionsDir).filter((f) => f.endsWith('.md') && !f.startsWith('.'));\n checks.push({\n name: 'sessions-recorded',\n description: 'Sessions being recorded',\n status: files.length > 0 ? 'pass' : 'warn',\n message: `${files.length} session file(s) in memory`,\n });\n } else {\n checks.push({ name: 'sessions-recorded', description: 'Sessions being recorded', status: 'warn', message: 'No sessions directory' });\n }\n\n // Check for parse errors in primitives\n const dirs = getPrimitiveDirs();\n let totalParseErrors = 0;\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n const { errors } = loadDirectoryWithErrors(fullPath);\n totalParseErrors += errors.length;\n }\n\n checks.push(totalParseErrors === 0\n ? { name: 'parse-errors', description: 'No primitive parse errors', status: 'pass', message: 'All primitives parse cleanly' }\n : { name: 'parse-errors', description: 'No primitive parse errors', status: 'warn', message: `${totalParseErrors} parse error(s) in primitives` });\n\n return checks;\n },\n },\n {\n name: 'pre-deploy',\n description: 'Checks before deployment: validator passes, no dead primitives, no contradictions',\n check: (harnessDir: string, config?: HarnessConfig) => {\n const checks: GateCheck[] = [];\n\n // Run validator\n try {\n const validation = validateHarness(harnessDir);\n if (validation.errors.length > 0) {\n checks.push({ name: 'validator', description: 'Validator passes', status: 'fail', message: `${validation.errors.length} error(s)`, details: { errors: validation.errors } });\n } else if (validation.warnings.length > 0) {\n checks.push({ name: 'validator', description: 'Validator passes', status: 'warn', message: `${validation.warnings.length} warning(s)` });\n } else {\n checks.push({ name: 'validator', description: 'Validator passes', status: 'pass', message: 'Validation clean' });\n }\n } catch (err) {\n checks.push({ name: 'validator', description: 'Validator passes', status: 'fail', message: `Validator error: ${err instanceof Error ? err.message : String(err)}` });\n }\n\n // Check for dead primitives\n const deadResult = detectDeadPrimitives(harnessDir, config);\n checks.push(deadResult.dead.length === 0\n ? { name: 'dead-primitives', description: 'No dead primitives', status: 'pass', message: 'All primitives referenced or recently modified' }\n : { name: 'dead-primitives', description: 'No dead primitives', status: 'warn', message: `${deadResult.dead.length} dead primitive(s) found`, details: { dead: deadResult.dead.map((d) => d.id) } });\n\n // Check for contradictions\n const contradictionResult = detectContradictions(harnessDir);\n checks.push(contradictionResult.contradictions.length === 0\n ? { name: 'contradictions', description: 'No contradictions', status: 'pass', message: 'No conflicting rules/instincts' }\n : { name: 'contradictions', description: 'No contradictions', status: 'warn', message: `${contradictionResult.contradictions.length} potential contradiction(s)` });\n\n return checks;\n },\n },\n];\n\n/**\n * Run a verification gate by name.\n * Returns all check results and an overall pass/fail status.\n */\nexport function runGate(\n gateName: string,\n harnessDir: string,\n config?: HarnessConfig,\n): VerificationGateResult {\n const gate = BUILTIN_GATES.find((g) => g.name === gateName);\n if (!gate) {\n return {\n gateName,\n passed: false,\n checks: [{ name: 'gate-not-found', description: 'Gate exists', status: 'fail', message: `Unknown gate: ${gateName}` }],\n summary: `Gate \"${gateName}\" not found. Available: ${BUILTIN_GATES.map((g) => g.name).join(', ')}`,\n };\n }\n\n const checks = gate.check(harnessDir, config);\n const hasFails = checks.some((c) => c.status === 'fail');\n const hasWarns = checks.some((c) => c.status === 'warn');\n\n const passed = !hasFails;\n const passCount = checks.filter((c) => c.status === 'pass').length;\n const failCount = checks.filter((c) => c.status === 'fail').length;\n const warnCount = checks.filter((c) => c.status === 'warn').length;\n\n let summary = `${gate.name}: ${passCount} passed`;\n if (failCount > 0) summary += `, ${failCount} failed`;\n if (warnCount > 0) summary += `, ${warnCount} warnings`;\n\n return { gateName, passed, checks, summary };\n}\n\n/**\n * Run all built-in verification gates.\n */\nexport function runAllGates(\n harnessDir: string,\n config?: HarnessConfig,\n): VerificationGateResult[] {\n return BUILTIN_GATES.map((gate) => runGate(gate.name, harnessDir, config));\n}\n\n/**\n * List available gate names and descriptions.\n */\nexport function listGates(): Array<{ name: string; description: string }> {\n return BUILTIN_GATES.map((g) => ({ name: g.name, description: g.description }));\n}\n","import { createHarness } from '../core/harness.js';\nimport type {\n CreateHarnessOptions,\n HarnessConfig,\n HarnessAgent,\n HarnessHooks,\n AgentRunResult,\n AgentState,\n DeepPartial,\n ToolExecutorOptions,\n} from '../core/types.js';\n\n/**\n * Fluent builder for defining agents with a clean, declarative API.\n *\n * Usage:\n * ```ts\n * const agent = defineAgent('/path/to/harness')\n * .model('anthropic/claude-sonnet-4')\n * .provider('openrouter')\n * .onBoot(({ config }) => console.log(`Booted ${config.agent.name}`))\n * .onSessionEnd(({ sessionId }) => console.log(`Session ${sessionId} done`))\n * .onError(({ error }) => console.error(error))\n * .maxToolCalls(10)\n * .build();\n *\n * await agent.boot();\n * const result = await agent.run('Hello');\n * await agent.shutdown();\n * ```\n */\nexport interface AgentBuilder {\n /** Override the model ID (e.g., \"anthropic/claude-sonnet-4\") */\n model(id: string): AgentBuilder;\n\n /** Override the provider (e.g., \"openrouter\", \"anthropic\", \"openai\") */\n provider(name: string): AgentBuilder;\n\n /** Set the API key for LLM calls */\n apiKey(key: string): AgentBuilder;\n\n /** Merge partial config overrides */\n configure(overrides: DeepPartial<HarnessConfig>): AgentBuilder;\n\n /** Register a boot lifecycle hook */\n onBoot(fn: NonNullable<HarnessHooks['onBoot']>): AgentBuilder;\n\n /** Register a session-end lifecycle hook */\n onSessionEnd(fn: NonNullable<HarnessHooks['onSessionEnd']>): AgentBuilder;\n\n /** Register an error lifecycle hook */\n onError(fn: NonNullable<HarnessHooks['onError']>): AgentBuilder;\n\n /** Register a state-change lifecycle hook */\n onStateChange(fn: NonNullable<HarnessHooks['onStateChange']>): AgentBuilder;\n\n /** Register a shutdown lifecycle hook */\n onShutdown(fn: NonNullable<HarnessHooks['onShutdown']>): AgentBuilder;\n\n /** Set maximum tool calls per run */\n maxToolCalls(n: number): AgentBuilder;\n\n /** Set per-tool timeout in ms */\n toolTimeout(ms: number): AgentBuilder;\n\n /** Enable/disable HTTP tool execution */\n allowHttp(enabled: boolean): AgentBuilder;\n\n /** Build and return the HarnessAgent (does NOT auto-boot) */\n build(): HarnessAgent;\n}\n\n/**\n * Create a fluent builder for defining a HarnessAgent.\n * This is the recommended entry point for programmatic agent creation.\n *\n * @param dir - Path to the harness directory\n * @returns A builder with chainable methods\n */\nexport function defineAgent(dir: string): AgentBuilder {\n let modelId: string | undefined;\n let providerName: string | undefined;\n let apiKeyValue: string | undefined;\n let configOverrides: DeepPartial<HarnessConfig> | undefined;\n const hooks: HarnessHooks = {};\n const toolOptions: ToolExecutorOptions = {};\n\n const builder: AgentBuilder = {\n model(id: string): AgentBuilder {\n modelId = id;\n return builder;\n },\n\n provider(name: string): AgentBuilder {\n providerName = name;\n return builder;\n },\n\n apiKey(key: string): AgentBuilder {\n apiKeyValue = key;\n return builder;\n },\n\n configure(overrides: DeepPartial<HarnessConfig>): AgentBuilder {\n if (!configOverrides) {\n configOverrides = overrides;\n } else {\n // Shallow merge top-level keys, deep merge nested objects\n configOverrides = mergeDeep(configOverrides, overrides);\n }\n return builder;\n },\n\n onBoot(fn: NonNullable<HarnessHooks['onBoot']>): AgentBuilder {\n const prev = hooks.onBoot;\n hooks.onBoot = prev\n ? async (ctx) => { await prev(ctx); await fn(ctx); }\n : fn;\n return builder;\n },\n\n onSessionEnd(fn: NonNullable<HarnessHooks['onSessionEnd']>): AgentBuilder {\n const prev = hooks.onSessionEnd;\n hooks.onSessionEnd = prev\n ? async (ctx) => { await prev(ctx); await fn(ctx); }\n : fn;\n return builder;\n },\n\n onError(fn: NonNullable<HarnessHooks['onError']>): AgentBuilder {\n const prev = hooks.onError;\n hooks.onError = prev\n ? async (ctx) => { await prev(ctx); await fn(ctx); }\n : fn;\n return builder;\n },\n\n onStateChange(fn: NonNullable<HarnessHooks['onStateChange']>): AgentBuilder {\n const prev = hooks.onStateChange;\n hooks.onStateChange = prev\n ? async (ctx) => { await prev(ctx); await fn(ctx); }\n : fn;\n return builder;\n },\n\n onShutdown(fn: NonNullable<HarnessHooks['onShutdown']>): AgentBuilder {\n const prev = hooks.onShutdown;\n hooks.onShutdown = prev\n ? async (ctx) => { await prev(ctx); await fn(ctx); }\n : fn;\n return builder;\n },\n\n maxToolCalls(n: number): AgentBuilder {\n toolOptions.maxToolCalls = n;\n return builder;\n },\n\n toolTimeout(ms: number): AgentBuilder {\n toolOptions.toolTimeoutMs = ms;\n return builder;\n },\n\n allowHttp(enabled: boolean): AgentBuilder {\n toolOptions.allowHttpExecution = enabled;\n return builder;\n },\n\n build(): HarnessAgent {\n const options: CreateHarnessOptions = {\n dir,\n model: modelId,\n provider: providerName,\n apiKey: apiKeyValue,\n config: configOverrides,\n hooks,\n toolExecutor: Object.keys(toolOptions).length > 0 ? toolOptions : undefined,\n };\n return createHarness(options);\n },\n };\n\n return builder;\n}\n\n/**\n * Deep merge two DeepPartial objects. Second argument wins on conflict.\n * Only merges plain objects — arrays and primitives are replaced.\n */\nfunction mergeDeep<T>(base: DeepPartial<T>, override: DeepPartial<T>): DeepPartial<T> {\n const result = { ...base } as Record<string, unknown>;\n for (const [key, value] of Object.entries(override as Record<string, unknown>)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n result[key] !== null &&\n typeof result[key] === 'object' &&\n !Array.isArray(result[key])\n ) {\n result[key] = mergeDeep(\n result[key] as DeepPartial<Record<string, unknown>>,\n value as DeepPartial<Record<string, unknown>>,\n );\n } else {\n result[key] = value;\n }\n }\n return result as DeepPartial<T>;\n}\n","import { existsSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory } from '../primitives/loader.js';\nimport type { HarnessDocument } from '../core/types.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type RuleAction = 'allow' | 'deny' | 'warn' | 'require_approval';\n\nexport interface ParsedRule {\n /** Source rule document ID */\n ruleId: string;\n /** What this rule regulates */\n subject: string;\n /** Whether it permits or blocks */\n action: RuleAction;\n /** Original directive text (for messages) */\n directive: string;\n /** Tags from the source document (for scoping) */\n tags: string[];\n}\n\nexport interface RuleCheckInput {\n /** The action being attempted (e.g., \"run\", \"tool_call\", \"delegate\") */\n action: string;\n /** Free-text description of what's being attempted */\n description?: string;\n /** Relevant tags or topics for the check */\n tags?: string[];\n /** Tool name if this is a tool call */\n toolName?: string;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n directive: string;\n severity: 'deny' | 'warn' | 'require_approval';\n reason: string;\n}\n\nexport interface RuleCheckResult {\n allowed: boolean;\n violations: RuleViolation[];\n warnings: RuleViolation[];\n requiresApproval: boolean;\n /** Human-readable summary */\n summary: string;\n}\n\n// ─── Rule Parsing ────────────────────────────────────────────────────────────\n\n/**\n * Extract enforceable rules from a harness document.\n * Parses \"never\", \"must not\", \"do not\", \"always\", \"require\" directives\n * and converts them into structured rule objects.\n */\nexport function parseRulesFromDoc(doc: HarnessDocument): ParsedRule[] {\n const rules: ParsedRule[] = [];\n const text = (doc.l0 + '\\n' + doc.l1 + '\\n' + doc.body).trim();\n\n for (const line of text.split('\\n')) {\n const trimmed = line.trim().toLowerCase();\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('<!--')) continue;\n\n // Strip list markers\n const cleaned = trimmed.replace(/^[-*]\\s+/, '').replace(/^\\d+\\.\\s+/, '');\n\n // \"Never\" / \"Do not\" / \"Must not\" → deny\n const denyMatch = cleaned.match(\n /^(never|don'?t|do not|must not|should not|shouldn'?t)\\s+(.+)/,\n );\n if (denyMatch) {\n const subject = denyMatch[2].replace(/[.!]$/, '');\n // Check if this is an approval gate (e.g., \"never X without approval\")\n if (/without\\s+(explicit\\s+)?(human\\s+)?approval/.test(subject)) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject: subject.replace(/\\s+without\\s+(explicit\\s+)?(human\\s+)?approval.*$/, ''),\n action: 'require_approval',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n } else {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'deny',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n continue;\n }\n\n // \"Always\" / \"Must\" / \"Require\" → allow (we note the requirement)\n const requireMatch = cleaned.match(\n /^(always|must|require|ensure)\\s+(.+)/,\n );\n if (requireMatch) {\n const subject = requireMatch[2].replace(/[.!]$/, '');\n // \"require approval\" / \"require explicit approval\" patterns\n if (/\\bapproval\\b/.test(subject) || /\\brequires?\\s+(explicit\\s+)?(human\\s+)?approval\\b/.test(subject)) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'require_approval',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n } else {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'allow',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n continue;\n }\n\n // \"Avoid\" → warn\n const warnMatch = cleaned.match(\n /^(avoid|prefer not to|try not to)\\s+(.+)/,\n );\n if (warnMatch) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject: warnMatch[2].replace(/[.!]$/, ''),\n action: 'warn',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n }\n\n return rules;\n}\n\n/**\n * Load and parse all enforceable rules from a harness directory.\n * Loads all documents from the rules/ directory and extracts structured rules.\n */\nexport function loadRules(harnessDir: string): ParsedRule[] {\n const rulesDir = join(harnessDir, 'rules');\n if (!existsSync(rulesDir)) return [];\n\n const docs = loadDirectory(rulesDir);\n const rules: ParsedRule[] = [];\n\n for (const doc of docs) {\n if (doc.frontmatter.status !== 'active') continue;\n rules.push(...parseRulesFromDoc(doc));\n }\n\n return rules;\n}\n\n// ─── Rule Checking ───────────────────────────────────────────────────────────\n\n/**\n * Check whether an action violates any loaded rules.\n * Uses keyword overlap between the action description/tags and rule subjects.\n *\n * @param rules - Parsed rules from loadRules()\n * @param input - Description of the action being attempted\n * @returns Check result with violations, warnings, and approval requirements\n */\nexport function checkRules(rules: ParsedRule[], input: RuleCheckInput): RuleCheckResult {\n const violations: RuleViolation[] = [];\n const warnings: RuleViolation[] = [];\n let requiresApproval = false;\n\n // Build search text from input\n const searchText = [\n input.action,\n input.description ?? '',\n input.toolName ?? '',\n ...(input.tags ?? []),\n ].join(' ').toLowerCase();\n\n const searchWords = new Set(\n searchText.split(/\\s+/).filter((w) => w.length > 2),\n );\n\n for (const rule of rules) {\n // Check if this rule is relevant to the current action\n const relevance = computeRelevance(rule, searchWords, input);\n if (relevance < 0.3) continue;\n\n if (rule.action === 'deny') {\n violations.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'deny',\n reason: `Action matches denied rule: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n } else if (rule.action === 'warn') {\n warnings.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'warn',\n reason: `Action matches warning rule: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n } else if (rule.action === 'require_approval') {\n requiresApproval = true;\n violations.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'require_approval',\n reason: `Action requires approval: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n }\n }\n\n const denyViolations = violations.filter((v) => v.severity === 'deny');\n const allowed = denyViolations.length === 0 && !requiresApproval;\n\n let summary: string;\n if (allowed && warnings.length === 0) {\n summary = 'All rule checks passed.';\n } else if (allowed) {\n summary = `Allowed with ${warnings.length} warning(s): ${warnings.map((w) => w.directive).join('; ')}`;\n } else if (requiresApproval && denyViolations.length === 0) {\n summary = `Requires human approval: ${violations.filter((v) => v.severity === 'require_approval').map((v) => v.directive).join('; ')}`;\n } else {\n summary = `Blocked by ${denyViolations.length} rule violation(s): ${denyViolations.map((v) => v.directive).join('; ')}`;\n }\n\n return {\n allowed,\n violations,\n warnings,\n requiresApproval,\n summary,\n };\n}\n\n/**\n * Compute relevance score (0–1) between a rule and search context.\n * Uses word overlap between rule subject/tags and input words/tags.\n */\nfunction computeRelevance(\n rule: ParsedRule,\n searchWords: Set<string>,\n input: RuleCheckInput,\n): number {\n // Extract words from rule subject\n const ruleWords = rule.subject\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 2);\n\n if (ruleWords.length === 0) return 0;\n\n // Count word overlap\n let matchCount = 0;\n for (const word of ruleWords) {\n if (searchWords.has(word)) {\n matchCount++;\n }\n }\n\n let score = matchCount / ruleWords.length;\n\n // Tag overlap boost\n if (input.tags && input.tags.length > 0) {\n const inputTags = new Set(input.tags.map((t) => t.toLowerCase()));\n const tagOverlap = rule.tags.filter((t) => inputTags.has(t.toLowerCase())).length;\n if (tagOverlap > 0) {\n score += 0.2 * (tagOverlap / Math.max(rule.tags.length, 1));\n }\n }\n\n return Math.min(score, 1.0);\n}\n\n/**\n * Convenience: load rules from disk and check an action in one call.\n */\nexport function enforceRules(\n harnessDir: string,\n input: RuleCheckInput,\n): RuleCheckResult {\n const rules = loadRules(harnessDir);\n return checkRules(rules, input);\n}\n","import { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory } from '../primitives/loader.js';\nimport type { HarnessDocument, HarnessConfig } from '../core/types.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface VerificationCriterion {\n /** Human-readable criterion description */\n description: string;\n /** Whether this criterion must be manually checked (vs auto-checkable) */\n manual: boolean;\n /** Optional command to run for automated verification */\n command?: string;\n /** Optional expected output pattern (regex) for automated verification */\n expectedPattern?: string;\n}\n\nexport interface VerificationGate {\n /** Gate ID derived from playbook/workflow stage */\n id: string;\n /** Stage name this gate guards (e.g., \"Build\", \"Verify\") */\n stage: string;\n /** Source playbook/workflow ID */\n sourceId: string;\n /** Acceptance criteria that must pass before proceeding */\n criteria: VerificationCriterion[];\n}\n\nexport interface GateCheckResult {\n gateId: string;\n stage: string;\n passed: boolean;\n /** Individual criterion results */\n results: Array<{\n criterion: string;\n passed: boolean;\n detail?: string;\n }>;\n /** Criteria that need manual verification */\n pendingManual: string[];\n}\n\nexport interface GateExtractResult {\n gates: VerificationGate[];\n /** Source playbook/workflow IDs that had gates */\n sources: string[];\n}\n\n// ─── Gate Extraction ─────────────────────────────────────────────────────────\n\n/**\n * Extract verification gates from a playbook or workflow document.\n *\n * Gates are detected from:\n * 1. `## Gate:` or `## Verification:` sections in the document body\n * 2. Acceptance criteria blocks (`### Acceptance Criteria` or `### Gate`)\n * 3. Inline gate markers: `<!-- gate: description -->` in the markdown\n * 4. Numbered steps with `[x]` checkbox markers (treated as manual criteria)\n */\nexport function extractGates(doc: HarnessDocument): VerificationGate[] {\n const gates: VerificationGate[] = [];\n const body = doc.body;\n\n // Strategy 1: Named gate sections\n const gateSectionRegex = /##\\s+(?:Gate|Verification):\\s*(.+)\\n([\\s\\S]*?)(?=\\n##\\s|\\n*$)/gi;\n let match: RegExpExecArray | null;\n\n while ((match = gateSectionRegex.exec(body)) !== null) {\n const stageName = match[1].trim();\n const sectionBody = match[2];\n const criteria = extractCriteriaFromSection(sectionBody);\n\n if (criteria.length > 0) {\n gates.push({\n id: `${doc.frontmatter.id}:${slugify(stageName)}`,\n stage: stageName,\n sourceId: doc.frontmatter.id,\n criteria,\n });\n }\n }\n\n // Strategy 2: Acceptance criteria subsections\n const acRegex = /###\\s+(?:Acceptance Criteria|Gate)\\s*(?::\\s*(.+))?\\n([\\s\\S]*?)(?=\\n###?\\s|\\n*$)/gi;\n\n while ((match = acRegex.exec(body)) !== null) {\n const stageName = match[1]?.trim() ?? 'default';\n const sectionBody = match[2];\n const criteria = extractCriteriaFromSection(sectionBody);\n\n if (criteria.length > 0) {\n const gateId = `${doc.frontmatter.id}:ac-${slugify(stageName)}`;\n // Avoid duplicates from strategy 1\n if (!gates.some((g) => g.id === gateId)) {\n gates.push({\n id: gateId,\n stage: stageName,\n sourceId: doc.frontmatter.id,\n criteria,\n });\n }\n }\n }\n\n // Strategy 3: Inline gate markers\n const inlineRegex = /<!--\\s*gate:\\s*(.+?)\\s*-->/gi;\n\n while ((match = inlineRegex.exec(body)) !== null) {\n const desc = match[1].trim();\n const gateId = `${doc.frontmatter.id}:inline-${slugify(desc.slice(0, 40))}`;\n\n if (!gates.some((g) => g.id === gateId)) {\n gates.push({\n id: gateId,\n stage: 'inline',\n sourceId: doc.frontmatter.id,\n criteria: [{\n description: desc,\n manual: !desc.includes('`'),\n command: extractInlineCommand(desc),\n }],\n });\n }\n }\n\n // Strategy 4: Steps with checkboxes between stages\n const stepGates = extractStepGates(doc);\n for (const gate of stepGates) {\n if (!gates.some((g) => g.id === gate.id)) {\n gates.push(gate);\n }\n }\n\n return gates;\n}\n\n/**\n * Extract criteria from a section body (bullet list parsing).\n */\nfunction extractCriteriaFromSection(section: string): VerificationCriterion[] {\n const criteria: VerificationCriterion[] = [];\n\n for (const line of section.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // Bullet or numbered list items\n const listMatch = trimmed.match(/^[-*]\\s+(?:\\[[ x]]\\s+)?(.+)/);\n if (!listMatch) continue;\n\n const desc = listMatch[1].trim();\n if (!desc) continue;\n\n // Check if it's an automated criterion (contains backtick command)\n const cmdMatch = desc.match(/`(.+?)`/);\n const isManual = !cmdMatch;\n\n // Check for expected pattern: \"should output X\" or \"expected: X\"\n const patternMatch = desc.match(/(?:should\\s+(?:output|return|show)|expected:\\s*)(.+?)(?:\\)|$)/i);\n\n criteria.push({\n description: desc,\n manual: isManual,\n command: cmdMatch ? cmdMatch[1] : undefined,\n expectedPattern: patternMatch ? patternMatch[1].trim() : undefined,\n });\n }\n\n return criteria;\n}\n\n/**\n * Extract verification gates from step transitions.\n * Looks for numbered steps where intermediate verification steps exist.\n */\nfunction extractStepGates(doc: HarnessDocument): VerificationGate[] {\n const gates: VerificationGate[] = [];\n const lines = doc.body.split('\\n');\n let currentStep = '';\n let criteriaBuffer: VerificationCriterion[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Detect numbered step headers (e.g., \"1. **Understand**\" or \"## Step 1:\")\n const stepMatch = trimmed.match(/^(?:\\d+\\.\\s+\\*\\*(.+?)\\*\\*|##\\s+Step\\s+\\d+:\\s*(.+))/);\n if (stepMatch) {\n // Flush previous gate if criteria were collected\n if (currentStep && criteriaBuffer.length > 0) {\n gates.push({\n id: `${doc.frontmatter.id}:step-${slugify(currentStep)}`,\n stage: currentStep,\n sourceId: doc.frontmatter.id,\n criteria: [...criteriaBuffer],\n });\n criteriaBuffer = [];\n }\n currentStep = (stepMatch[1] ?? stepMatch[2]).trim();\n continue;\n }\n\n // Collect checkbox items within steps as criteria\n const checkboxMatch = trimmed.match(/^[-*]\\s+\\[[ x]]\\s+(.+)/);\n if (checkboxMatch && currentStep) {\n const desc = checkboxMatch[1].trim();\n const cmdMatch = desc.match(/`(.+?)`/);\n criteriaBuffer.push({\n description: desc,\n manual: !cmdMatch,\n command: cmdMatch ? cmdMatch[1] : undefined,\n });\n }\n }\n\n // Flush last step\n if (currentStep && criteriaBuffer.length > 0) {\n gates.push({\n id: `${doc.frontmatter.id}:step-${slugify(currentStep)}`,\n stage: currentStep,\n sourceId: doc.frontmatter.id,\n criteria: [...criteriaBuffer],\n });\n }\n\n return gates;\n}\n\n/**\n * Extract a command from an inline gate description (text between backticks).\n */\nfunction extractInlineCommand(desc: string): string | undefined {\n const match = desc.match(/`(.+?)`/);\n return match ? match[1] : undefined;\n}\n\n/**\n * Convert text to a URL-safe slug.\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .slice(0, 50)\n .replace(/-+$/, '');\n}\n\n// ─── Gate Loading ────────────────────────────────────────────────────────────\n\n/**\n * Load all verification gates from playbooks and workflows in the harness.\n */\nexport function loadGates(harnessDir: string): GateExtractResult {\n const gates: VerificationGate[] = [];\n const sources: string[] = [];\n\n for (const dir of ['playbooks', 'workflows']) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const docs = loadDirectory(fullPath);\n for (const doc of docs) {\n if (doc.frontmatter.status !== 'active') continue;\n const docGates = extractGates(doc);\n if (docGates.length > 0) {\n gates.push(...docGates);\n if (!sources.includes(doc.frontmatter.id)) {\n sources.push(doc.frontmatter.id);\n }\n }\n }\n }\n\n return { gates, sources };\n}\n\n/**\n * Find gates for a specific playbook/workflow by ID.\n */\nexport function getGatesForPlaybook(harnessDir: string, playbookId: string): VerificationGate[] {\n const { gates } = loadGates(harnessDir);\n return gates.filter((g) => g.sourceId === playbookId);\n}\n\n// ─── Gate Checking ───────────────────────────────────────────────────────────\n\n/**\n * Check a verification gate against provided results.\n * For manual criteria, checks against the `manualResults` map.\n * For automated criteria, checks if the command output matches the expected pattern.\n *\n * @param gate - The gate to check\n * @param manualResults - Map of criterion description → pass/fail\n * @param commandOutputs - Map of command → actual output (for automated checks)\n */\nexport function checkGate(\n gate: VerificationGate,\n manualResults?: Map<string, boolean>,\n commandOutputs?: Map<string, string>,\n): GateCheckResult {\n const results: Array<{ criterion: string; passed: boolean; detail?: string }> = [];\n const pendingManual: string[] = [];\n\n for (const criterion of gate.criteria) {\n if (criterion.manual) {\n // Manual criterion — check if result was provided\n if (manualResults && manualResults.has(criterion.description)) {\n const passed = manualResults.get(criterion.description)!;\n results.push({\n criterion: criterion.description,\n passed,\n detail: passed ? 'Manually verified' : 'Manual verification failed',\n });\n } else {\n pendingManual.push(criterion.description);\n results.push({\n criterion: criterion.description,\n passed: false,\n detail: 'Awaiting manual verification',\n });\n }\n } else if (criterion.command && commandOutputs) {\n // Automated criterion — check command output\n const output = commandOutputs.get(criterion.command);\n if (output === undefined) {\n results.push({\n criterion: criterion.description,\n passed: false,\n detail: `Command not executed: ${criterion.command}`,\n });\n } else if (criterion.expectedPattern) {\n try {\n const regex = new RegExp(criterion.expectedPattern, 'i');\n const passed = regex.test(output);\n results.push({\n criterion: criterion.description,\n passed,\n detail: passed\n ? `Output matches expected pattern`\n : `Output does not match expected pattern: ${criterion.expectedPattern}`,\n });\n } catch {\n // Invalid regex — treat as string match\n const passed = output.includes(criterion.expectedPattern);\n results.push({\n criterion: criterion.description,\n passed,\n detail: passed ? 'Output contains expected text' : 'Output missing expected text',\n });\n }\n } else {\n // No expected pattern — command succeeded if output exists\n results.push({\n criterion: criterion.description,\n passed: true,\n detail: 'Command produced output',\n });\n }\n } else {\n // Automated criterion but no output available\n results.push({\n criterion: criterion.description,\n passed: false,\n detail: criterion.command ? `Command not executed: ${criterion.command}` : 'No verification method',\n });\n }\n }\n\n const passed = results.every((r) => r.passed) && pendingManual.length === 0;\n\n return {\n gateId: gate.id,\n stage: gate.stage,\n passed,\n results,\n pendingManual,\n };\n}\n\n/**\n * Check all gates for a playbook/workflow. Returns individual gate results.\n */\nexport function checkAllGates(\n harnessDir: string,\n playbookId: string,\n manualResults?: Map<string, boolean>,\n commandOutputs?: Map<string, string>,\n): GateCheckResult[] {\n const gates = getGatesForPlaybook(harnessDir, playbookId);\n return gates.map((gate) => checkGate(gate, manualResults, commandOutputs));\n}\n","import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { createHarness } from '../core/harness.js';\nimport { loadDirectory } from '../primitives/loader.js';\nimport { log } from '../core/logger.js';\nimport type {\n CreateHarnessOptions,\n HarnessAgent,\n HarnessConfig,\n HarnessHooks,\n AgentRunResult,\n AgentStreamResult,\n AgentState,\n DeepPartial,\n} from '../core/types.js';\n\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n// 1. defineAgent() \u0014 Declarative Agent Definition\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\nexport interface AgentDefinition {\n /** Agent name (used for logging and config resolution) */\n name: string;\n /** Harness directory path */\n dir: string;\n /** Model override */\n model?: string;\n /** Provider override */\n provider?: string;\n /** API key override */\n apiKey?: string;\n /** Config overrides */\n config?: DeepPartial<HarnessConfig>;\n\n /** Lifecycle hooks \u0014 called at various points in the agent lifecycle */\n hooks?: AgentLifecycleHooks;\n\n /** Pre-action rule enforcement configuration */\n guardrails?: GuardrailEnforcementConfig;\n\n /** Human-in-the-loop gate configuration */\n approval?: ApprovalGateConfig;\n\n /** Middleware functions that wrap each run/stream call */\n middleware?: AgentMiddleware[];\n}\n\nexport interface AgentLifecycleHooks extends HarnessHooks {\n /** Called before each run/stream \u0014 can modify prompt or reject */\n beforeRun?: (ctx: BeforeRunContext) => Promise<BeforeRunResult | void>;\n /** Called after each run/stream \u0014 can transform result */\n afterRun?: (ctx: AfterRunContext) => Promise<AgentRunResult | void>;\n /** Called periodically for health checks */\n onHealthCheck?: (ctx: { agent: DefinedAgent }) => Promise<void>;\n}\n\nexport interface BeforeRunContext {\n agent: DefinedAgent;\n prompt: string;\n isStream: boolean;\n}\n\nexport interface BeforeRunResult {\n /** Modified prompt (if changed) */\n prompt?: string;\n /** Set to true to reject the run */\n reject?: boolean;\n /** Reason for rejection */\n reason?: string;\n}\n\nexport interface AfterRunContext {\n agent: DefinedAgent;\n prompt: string;\n result: AgentRunResult;\n}\n\nexport type AgentMiddleware = (\n ctx: { agent: DefinedAgent; prompt: string; isStream: boolean },\n next: () => Promise<AgentRunResult>,\n) => Promise<AgentRunResult>;\n\n/**\n * A defined agent wraps a HarnessAgent with additional capabilities:\n * - Middleware pipeline\n * - Pre-action guardrails\n * - Human-in-the-loop gates\n * - Extended lifecycle hooks\n */\nexport interface DefinedAgent {\n name: string;\n config: HarnessConfig;\n /** The underlying harness agent */\n harness: HarnessAgent;\n /** Boot the agent */\n boot(): Promise<void>;\n /** Run with middleware, guardrails, and approval gates */\n run(prompt: string): Promise<AgentRunResult>;\n /** Stream with middleware, guardrails, and approval gates */\n stream(prompt: string): AgentStreamResult;\n /** Shutdown cleanly */\n shutdown(): Promise<void>;\n /** Get agent state */\n getState(): AgentState;\n /** Get system prompt */\n getSystemPrompt(): string;\n /** Check if agent is booted */\n isBooted(): boolean;\n /** Access the definition */\n definition: AgentDefinition;\n}\n\n/**\n * Define an agent with declarative configuration.\n *\n * This is the high-level API for creating agents with:\n * - Lifecycle hooks (beforeRun, afterRun, onBoot, onSessionEnd, onError, onShutdown)\n * - Middleware pipeline (wrap each run with custom logic)\n * - Guardrail enforcement (check rules before actions)\n * - Human-in-the-loop gates (require approval for certain prompts)\n *\n * Usage:\n * ```typescript\n * const agent = createAgent({\n * name: 'my-agent',\n * dir: './my-harness',\n * hooks: {\n * beforeRun: async ({ prompt }) => {\n * if (prompt.includes('delete')) return { reject: true, reason: 'Destructive action' };\n * },\n * onBoot: async () => console.log('Agent booted!'),\n * },\n * guardrails: { enforceRules: true },\n * approval: { requireApproval: (prompt) => prompt.includes('deploy') },\n * });\n *\n * await agent.boot();\n * const result = await agent.run('Hello world');\n * ```\n */\nexport function createAgent(definition: AgentDefinition): DefinedAgent {\n let booted = false;\n\n // Build HarnessHooks from lifecycle hooks\n const harnessHooks: HarnessHooks = {};\n if (definition.hooks?.onBoot) harnessHooks.onBoot = definition.hooks.onBoot;\n if (definition.hooks?.onSessionEnd) harnessHooks.onSessionEnd = definition.hooks.onSessionEnd;\n if (definition.hooks?.onError) harnessHooks.onError = definition.hooks.onError;\n if (definition.hooks?.onStateChange) harnessHooks.onStateChange = definition.hooks.onStateChange;\n if (definition.hooks?.onShutdown) harnessHooks.onShutdown = definition.hooks.onShutdown;\n\n // Create underlying harness\n const harnessOptions: CreateHarnessOptions = {\n dir: definition.dir,\n model: definition.model,\n provider: definition.provider,\n apiKey: definition.apiKey,\n config: definition.config,\n hooks: harnessHooks,\n };\n\n const harness = createHarness(harnessOptions);\n\n // Build middleware pipeline\n const middleware = definition.middleware ?? [];\n\n async function runWithPipeline(prompt: string, isStream: boolean): Promise<AgentRunResult> {\n // 1. beforeRun hook\n if (definition.hooks?.beforeRun) {\n const hookResult = await definition.hooks.beforeRun({\n agent: definedAgent,\n prompt,\n isStream,\n });\n\n if (hookResult) {\n if (hookResult.reject) {\n throw new Error(`Run rejected: ${hookResult.reason || 'beforeRun hook rejected'}`);\n }\n if (hookResult.prompt) {\n prompt = hookResult.prompt;\n }\n }\n }\n\n // 2. Guardrail enforcement (check rules)\n if (definition.guardrails?.enforceRules) {\n const violation = checkRuleViolation(definition.dir, prompt);\n if (violation) {\n throw new Error(`Guardrail violation: ${violation}`);\n }\n }\n\n // 3. Approval gate\n if (definition.approval?.requireApproval) {\n const needsApproval = definition.approval.requireApproval(prompt);\n if (needsApproval) {\n if (definition.approval.onApprovalNeeded) {\n const approved = await definition.approval.onApprovalNeeded(prompt);\n if (!approved) {\n throw new Error('Run requires approval but was not approved');\n }\n } else {\n // No approval handler \u0014 always reject\n throw new Error('Run requires approval but no onApprovalNeeded handler is configured');\n }\n }\n }\n\n // 4. Run through middleware chain\n const execute = async (): Promise<AgentRunResult> => {\n return harness.run(prompt);\n };\n\n let result: AgentRunResult;\n if (middleware.length > 0) {\n result = await executeMiddleware(middleware, definedAgent, prompt, isStream, execute);\n } else {\n result = await execute();\n }\n\n // 5. afterRun hook\n if (definition.hooks?.afterRun) {\n const transformed = await definition.hooks.afterRun({\n agent: definedAgent,\n prompt,\n result,\n });\n if (transformed) {\n result = transformed;\n }\n }\n\n return result;\n }\n\n const definedAgent: DefinedAgent = {\n name: definition.name,\n get config() { return harness.config; },\n harness,\n definition,\n\n async boot() {\n await harness.boot();\n booted = true;\n },\n\n async run(prompt: string): Promise<AgentRunResult> {\n if (!booted) await definedAgent.boot();\n return runWithPipeline(prompt, false);\n },\n\n stream(prompt: string): AgentStreamResult {\n // For stream, we wrap the textStream with pre-run checks\n let resolveResult: (r: AgentRunResult) => void;\n let rejectResult: (e: Error) => void;\n const resultPromise = new Promise<AgentRunResult>((res, rej) => {\n resolveResult = res;\n rejectResult = rej;\n });\n resultPromise.catch(() => {}); // Prevent unhandled rejection\n\n async function* generateStream(): AsyncIterable<string> {\n if (!booted) await definedAgent.boot();\n\n // Run pre-checks\n try {\n if (definition.hooks?.beforeRun) {\n const hookResult = await definition.hooks.beforeRun({\n agent: definedAgent,\n prompt,\n isStream: true,\n });\n if (hookResult?.reject) {\n const error = new Error(`Stream rejected: ${hookResult.reason || 'beforeRun hook rejected'}`);\n rejectResult(error);\n throw error;\n }\n if (hookResult?.prompt) {\n prompt = hookResult.prompt;\n }\n }\n\n if (definition.guardrails?.enforceRules) {\n const violation = checkRuleViolation(definition.dir, prompt);\n if (violation) {\n const error = new Error(`Guardrail violation: ${violation}`);\n rejectResult(error);\n throw error;\n }\n }\n\n if (definition.approval?.requireApproval) {\n const needsApproval = definition.approval.requireApproval(prompt);\n if (needsApproval) {\n if (definition.approval.onApprovalNeeded) {\n const approved = await definition.approval.onApprovalNeeded(prompt);\n if (!approved) {\n const error = new Error('Stream requires approval but was not approved');\n rejectResult(error);\n throw error;\n }\n } else {\n const error = new Error('Stream requires approval but no onApprovalNeeded handler is configured');\n rejectResult(error);\n throw error;\n }\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n rejectResult(error);\n throw error;\n }\n\n // Delegate to harness stream\n const streamResult = harness.stream(prompt);\n let fullText = '';\n\n for await (const chunk of streamResult.textStream) {\n fullText += chunk;\n yield chunk;\n }\n\n // Await the result and apply afterRun hook\n let result = await streamResult.result;\n\n if (definition.hooks?.afterRun) {\n const transformed = await definition.hooks.afterRun({\n agent: definedAgent,\n prompt,\n result,\n });\n if (transformed) {\n result = transformed;\n }\n }\n\n resolveResult(result);\n }\n\n return {\n textStream: generateStream(),\n result: resultPromise,\n };\n },\n\n async shutdown() {\n await harness.shutdown();\n booted = false;\n },\n\n getState() {\n return harness.getState();\n },\n\n getSystemPrompt() {\n return harness.getSystemPrompt();\n },\n\n isBooted() {\n return booted;\n },\n };\n\n return definedAgent;\n}\n\n/**\n * Execute middleware chain in order.\n */\nasync function executeMiddleware(\n middlewares: AgentMiddleware[],\n agent: DefinedAgent,\n prompt: string,\n isStream: boolean,\n execute: () => Promise<AgentRunResult>,\n): Promise<AgentRunResult> {\n let index = 0;\n\n const next = async (): Promise<AgentRunResult> => {\n if (index >= middlewares.length) {\n return execute();\n }\n const mw = middlewares[index++];\n return mw({ agent, prompt, isStream }, next);\n };\n\n return next();\n}\n\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n// 2. Guardrail Enforcement \u0014 Pre-action Rule Checking\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\nexport interface GuardrailEnforcementConfig {\n /** Enable rule-based pre-action checking (default: false) */\n enforceRules?: boolean;\n /** Custom check function (in addition to rule scanning) */\n customCheck?: (prompt: string) => string | null;\n /** Tags to filter rules (only check rules with these tags) */\n ruleTags?: string[];\n}\n\nexport interface AgentRuleViolation {\n ruleId: string;\n rulePath: string;\n violatedDirective: string;\n prompt: string;\n}\n\n/**\n * Check if a prompt violates any rules in the harness.\n *\n * Rules are scanned for \"never\" / \"don't\" / \"must not\" / \"avoid\" directives.\n * If the prompt contains keywords that match a forbidden action,\n * a violation is returned.\n *\n * This is a heuristic check \u0014 not a semantic understanding of the prompt.\n * Returns null if no violation found, or a string describing the violation.\n */\nexport function checkRuleViolation(\n harnessDir: string,\n prompt: string,\n options?: { ruleTags?: string[] },\n): string | null {\n const rulesDir = join(harnessDir, 'rules');\n if (!existsSync(rulesDir)) return null;\n\n const rules = loadDirectory(rulesDir);\n const promptLower = prompt.toLowerCase();\n\n for (const rule of rules) {\n // Filter by tags if specified\n if (options?.ruleTags && options.ruleTags.length > 0) {\n const hasTag = rule.frontmatter.tags.some((t) =>\n options.ruleTags!.includes(t.toLowerCase()),\n );\n if (!hasTag) continue;\n }\n\n // Skip inactive rules\n if (rule.frontmatter.status !== 'active') continue;\n\n const text = (rule.l0 + '\\n' + rule.body).toLowerCase();\n\n // Extract forbidden actions from rules\n const forbiddenPatterns = extractForbiddenActions(text);\n\n for (const forbidden of forbiddenPatterns) {\n // Check if the prompt contains the forbidden action keywords\n const keywords = forbidden.split(/\\s+/).filter((w) => w.length > 3);\n const matchCount = keywords.filter((k) => promptLower.includes(k)).length;\n\n // Need at least 60% keyword match to flag\n if (keywords.length > 0 && matchCount >= Math.ceil(keywords.length * 0.6)) {\n return `Rule \"${rule.frontmatter.id}\" forbids: \"${forbidden}\" \u0014 prompt matches ${matchCount}/${keywords.length} keywords`;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract forbidden actions from rule text.\n * Looks for \"never X\", \"don't X\", \"must not X\", \"avoid X\" patterns.\n */\nfunction extractForbiddenActions(text: string): string[] {\n const actions: string[] = [];\n\n const patterns = [\n /never\\s+(.+?)(?:\\.|$)/gm,\n /don'?t\\s+(.+?)(?:\\.|$)/gm,\n /must not\\s+(.+?)(?:\\.|$)/gm,\n /do not\\s+(.+?)(?:\\.|$)/gm,\n /avoid\\s+(.+?)(?:\\.|$)/gm,\n /prohibit(?:ed|s)?\\s+(.+?)(?:\\.|$)/gm,\n /forbidden?:?\\s+(.+?)(?:\\.|$)/gm,\n ];\n\n for (const pattern of patterns) {\n let match;\n while ((match = pattern.exec(text)) !== null) {\n const action = match[1].trim();\n if (action.length > 3 && action.length < 200) {\n actions.push(action);\n }\n }\n }\n\n return actions;\n}\n\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n// 3. Human-in-the-Loop Gates\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\nexport interface ApprovalGateConfig {\n /**\n * Function that decides if a prompt requires human approval.\n * Return true to require approval, false to proceed.\n */\n requireApproval?: (prompt: string) => boolean;\n\n /**\n * Called when approval is needed.\n * Should return true if approved, false if rejected.\n * For CLI: prompt user with readline.\n * For API: send webhook and await response.\n */\n onApprovalNeeded?: (prompt: string) => Promise<boolean>;\n\n /**\n * Timeout in ms for approval (default: 300000 = 5 minutes).\n * If timeout is reached, the run is rejected.\n */\n timeoutMs?: number;\n}\n\n/**\n * Create a simple CLI-based approval handler.\n * Prompts the user on stdin for approval.\n *\n * Usage:\n * ```typescript\n * createAgent({\n * ...\n * approval: {\n * requireApproval: (prompt) => prompt.includes('deploy'),\n * onApprovalNeeded: createCliApproval(),\n * },\n * });\n * ```\n */\nexport function createCliApproval(options?: { timeoutMs?: number }): (prompt: string) => Promise<boolean> {\n const timeoutMs = options?.timeoutMs ?? 300000;\n\n return (prompt: string): Promise<boolean> => {\n return new Promise((resolve) => {\n const readline = require('readline') as typeof import('readline');\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const timer = setTimeout(() => {\n log.warn('Approval timeout \u0014 rejecting');\n rl.close();\n resolve(false);\n }, timeoutMs);\n\n const preview = prompt.length > 100 ? prompt.slice(0, 100) + '...' : prompt;\n rl.question(`\\n[APPROVAL REQUIRED] \"${preview}\"\\nApprove? (y/N): `, (answer) => {\n clearTimeout(timer);\n rl.close();\n resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');\n });\n });\n };\n}\n\n/**\n * Create a webhook-based approval handler.\n * Sends a POST to the webhook URL and awaits response.\n */\nexport function createWebhookApproval(options: {\n url: string;\n timeoutMs?: number;\n headers?: Record<string, string>;\n}): (prompt: string) => Promise<boolean> {\n const timeoutMs = options.timeoutMs ?? 300000;\n\n return async (prompt: string): Promise<boolean> => {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n const response = await fetch(options.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n body: JSON.stringify({ prompt, timestamp: new Date().toISOString() }),\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n log.warn(`Approval webhook returned ${response.status}`);\n return false;\n }\n\n const body = await response.json() as { approved?: boolean };\n return body.approved === true;\n } catch (err) {\n log.warn(`Approval webhook failed: ${err instanceof Error ? err.message : String(err)}`);\n return false;\n }\n };\n}\n\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n// 4. Utility: Rule-based Action Guards\n// \u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\n/**\n * Check if a specific action is allowed by the harness rules.\n * Returns { allowed: true } or { allowed: false, reason: string }.\n *\n * This is a lightweight version of checkRuleViolation for use outside defineAgent.\n */\nexport function checkAction(\n harnessDir: string,\n action: string,\n options?: { ruleTags?: string[] },\n): { allowed: boolean; reason: string | null } {\n const violation = checkRuleViolation(harnessDir, action, options);\n return {\n allowed: violation === null,\n reason: violation,\n };\n}\n","import { readFileSync, writeFileSync, existsSync } from 'fs';\nimport { join } from 'path';\nimport type { AgentState } from '../core/types.js';\nimport { loadState, saveState } from './state.js';\nimport { withFileLockSync } from './file-lock.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type StateOwner = 'human' | 'agent' | 'infrastructure';\n\n/** Tracks which entity last modified each field of the state. */\nexport interface StateOwnership {\n mode: StateOwner;\n goals: StateOwner;\n active_workflows: StateOwner;\n last_interaction: StateOwner;\n unfinished_business: StateOwner;\n}\n\n/** A state change with ownership metadata. */\nexport interface OwnedStateChange {\n /** Who is making this change */\n author: StateOwner;\n /** Partial state to merge — only provided fields are updated */\n changes: Partial<AgentState>;\n /** Timestamp of the change (ISO string) */\n timestamp?: string;\n}\n\n/** Strategy for resolving conflicting state changes. */\nexport type MergeStrategy = 'human-wins' | 'agent-wins' | 'latest-wins' | 'union';\n\nexport interface MergeResult {\n /** The merged state */\n state: AgentState;\n /** Updated ownership */\n ownership: StateOwnership;\n /** Fields that had conflicts */\n conflicts: StateConflict[];\n /** Whether any conflicts were resolved */\n hadConflicts: boolean;\n}\n\nexport interface StateConflict {\n field: keyof AgentState;\n humanValue: unknown;\n agentValue: unknown;\n resolvedTo: StateOwner;\n resolvedValue: unknown;\n}\n\n// ─── Ownership Tracking ─────────────────────────────────────────────────────\n\nconst DEFAULT_OWNERSHIP: StateOwnership = {\n mode: 'agent',\n goals: 'human',\n active_workflows: 'agent',\n last_interaction: 'infrastructure',\n unfinished_business: 'agent',\n};\n\nconst OWNERSHIP_FILE = 'state-ownership.json';\n\n/** Load ownership metadata from the harness directory. */\nexport function loadOwnership(harnessDir: string): StateOwnership {\n const ownershipPath = join(harnessDir, 'memory', OWNERSHIP_FILE);\n if (!existsSync(ownershipPath)) {\n return { ...DEFAULT_OWNERSHIP };\n }\n\n try {\n const raw = readFileSync(ownershipPath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<StateOwnership>;\n return { ...DEFAULT_OWNERSHIP, ...parsed };\n } catch {\n return { ...DEFAULT_OWNERSHIP };\n }\n}\n\n/** Save ownership metadata to the harness directory. */\nexport function saveOwnership(harnessDir: string, ownership: StateOwnership): void {\n const memoryDir = join(harnessDir, 'memory');\n const ownershipPath = join(memoryDir, OWNERSHIP_FILE);\n withFileLockSync(harnessDir, ownershipPath, () => {\n writeFileSync(ownershipPath, JSON.stringify(ownership, null, 2), 'utf-8');\n });\n}\n\n// ─── Merge Logic ─────────────────────────────────────────────────────────────\n\n/**\n * Merge a state change into the current state, respecting ownership.\n *\n * Rules:\n * - `human-wins`: If a human-owned field is being changed by an agent, the human value is kept.\n * - `agent-wins`: If an agent-owned field is being changed by a human, the agent value is kept.\n * - `latest-wins`: The most recent change always wins (default).\n * - `union`: For array fields (goals, active_workflows, unfinished_business), merge by union.\n * For scalar fields, latest-wins.\n *\n * @param harnessDir - Harness directory path\n * @param change - The state change to apply\n * @param strategy - Merge strategy (default: 'human-wins')\n */\nexport function mergeState(\n harnessDir: string,\n change: OwnedStateChange,\n strategy: MergeStrategy = 'human-wins',\n): MergeResult {\n const currentState = loadState(harnessDir);\n const ownership = loadOwnership(harnessDir);\n const conflicts: StateConflict[] = [];\n\n const mergedState = { ...currentState };\n const mergedOwnership = { ...ownership };\n\n const fields = Object.keys(change.changes) as Array<keyof AgentState>;\n\n for (const field of fields) {\n const newValue = change.changes[field];\n if (newValue === undefined) continue;\n\n const currentOwner = ownership[field];\n const changeAuthor = change.author;\n\n // Same owner → no conflict, apply directly\n if (currentOwner === changeAuthor) {\n applyField(mergedState, field, newValue);\n continue;\n }\n\n // Different owner → potential conflict\n const currentValue = currentState[field];\n\n // Check if values actually differ\n if (valuesEqual(currentValue, newValue)) {\n continue; // No actual conflict\n }\n\n // Resolve conflict based on strategy\n const resolved = resolveConflict(\n field,\n currentValue,\n newValue,\n currentOwner,\n changeAuthor,\n strategy,\n );\n\n conflicts.push({\n field,\n humanValue: currentOwner === 'human' ? currentValue : newValue,\n agentValue: currentOwner === 'agent' ? currentValue : newValue,\n resolvedTo: resolved.winner,\n resolvedValue: resolved.value,\n });\n\n applyField(mergedState, field, resolved.value);\n mergedOwnership[field] = resolved.winner;\n }\n\n // Update ownership for non-conflicting changes\n for (const field of fields) {\n if (!conflicts.some((c) => c.field === field)) {\n mergedOwnership[field] = change.author;\n }\n }\n\n // Update last_interaction\n mergedState.last_interaction = change.timestamp ?? new Date().toISOString();\n mergedOwnership.last_interaction = 'infrastructure';\n\n // Persist\n saveState(harnessDir, mergedState);\n saveOwnership(harnessDir, mergedOwnership);\n\n return {\n state: mergedState,\n ownership: mergedOwnership,\n conflicts,\n hadConflicts: conflicts.length > 0,\n };\n}\n\n/**\n * Apply a state change without ownership — direct write.\n * Use this when ownership tracking is not needed.\n */\nexport function applyStateChange(\n harnessDir: string,\n changes: Partial<AgentState>,\n): AgentState {\n const currentState = loadState(harnessDir);\n const mergedState = { ...currentState };\n\n for (const [key, value] of Object.entries(changes)) {\n if (value !== undefined) {\n applyField(mergedState, key as keyof AgentState, value);\n }\n }\n\n saveState(harnessDir, mergedState);\n return mergedState;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction resolveConflict(\n field: keyof AgentState,\n currentValue: unknown,\n newValue: unknown,\n currentOwner: StateOwner,\n changeAuthor: StateOwner,\n strategy: MergeStrategy,\n): { value: unknown; winner: StateOwner } {\n switch (strategy) {\n case 'human-wins':\n if (currentOwner === 'human') {\n return { value: currentValue, winner: 'human' };\n }\n if (changeAuthor === 'human') {\n return { value: newValue, winner: 'human' };\n }\n // Neither is human — latest wins\n return { value: newValue, winner: changeAuthor };\n\n case 'agent-wins':\n if (currentOwner === 'agent') {\n return { value: currentValue, winner: 'agent' };\n }\n if (changeAuthor === 'agent') {\n return { value: newValue, winner: 'agent' };\n }\n return { value: newValue, winner: changeAuthor };\n\n case 'latest-wins':\n return { value: newValue, winner: changeAuthor };\n\n case 'union':\n if (isArrayField(field) && Array.isArray(currentValue) && Array.isArray(newValue)) {\n const union = [...new Set([...currentValue, ...newValue])];\n return { value: union, winner: changeAuthor };\n }\n // Non-array fields: latest wins\n return { value: newValue, winner: changeAuthor };\n\n default:\n return { value: newValue, winner: changeAuthor };\n }\n}\n\nfunction isArrayField(field: keyof AgentState): boolean {\n return field === 'goals' || field === 'active_workflows' || field === 'unfinished_business';\n}\n\nfunction applyField(state: AgentState, field: keyof AgentState, value: unknown): void {\n switch (field) {\n case 'mode':\n state.mode = value as string;\n break;\n case 'goals':\n state.goals = value as string[];\n break;\n case 'active_workflows':\n state.active_workflows = value as string[];\n break;\n case 'last_interaction':\n state.last_interaction = value as string;\n break;\n case 'unfinished_business':\n state.unfinished_business = value as string[];\n break;\n }\n}\n\nfunction valuesEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((v, i) => v === b[i]);\n }\n return JSON.stringify(a) === JSON.stringify(b);\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { withFileLockSync } from './file-lock.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/**\n * Emotional valence dimensions for agent self-assessment.\n * These are not human emotions — they represent operational disposition signals\n * that influence context loading, risk tolerance, and communication style.\n */\nexport interface EmotionalState {\n /** Confidence in current task (0-100). Low → more cautious, more verification. */\n confidence: number;\n /** Engagement/focus level (0-100). Low → may need re-orientation. */\n engagement: number;\n /** Frustration/difficulty signal (0-100). High → may need escalation or approach change. */\n frustration: number;\n /** Curiosity/exploration drive (0-100). High → more likely to explore tangents. */\n curiosity: number;\n /** Urgency/time-pressure (0-100). High → skip verification, prioritize speed. */\n urgency: number;\n /** Last updated timestamp */\n updatedAt: string;\n /** Optional notes about the emotional state */\n notes?: string;\n}\n\nexport interface EmotionalSignal {\n dimension: keyof Omit<EmotionalState, 'updatedAt' | 'notes'>;\n delta: number;\n reason?: string;\n}\n\nexport interface EmotionalSnapshot {\n state: EmotionalState;\n signals: EmotionalSignal[];\n timestamp: string;\n}\n\nexport interface EmotionalTrend {\n dimension: keyof Omit<EmotionalState, 'updatedAt' | 'notes'>;\n values: Array<{ value: number; timestamp: string }>;\n trend: 'rising' | 'falling' | 'stable';\n average: number;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst EMOTIONAL_STATE_FILE = 'emotional-state.json';\nconst EMOTIONAL_HISTORY_FILE = 'emotional-history.jsonl';\n\nconst DEFAULT_EMOTIONAL_STATE: EmotionalState = {\n confidence: 50,\n engagement: 50,\n frustration: 0,\n curiosity: 50,\n urgency: 0,\n updatedAt: new Date().toISOString(),\n};\n\nconst DIMENSIONS: Array<keyof Omit<EmotionalState, 'updatedAt' | 'notes'>> = [\n 'confidence',\n 'engagement',\n 'frustration',\n 'curiosity',\n 'urgency',\n];\n\n// ─── Load / Save ─────────────────────────────────────────────────────────────\n\n/** Load the current emotional state from the harness memory directory. */\nexport function loadEmotionalState(harnessDir: string): EmotionalState {\n const stateDir = join(harnessDir, 'memory');\n const statePath = join(stateDir, EMOTIONAL_STATE_FILE);\n\n if (!existsSync(statePath)) {\n return { ...DEFAULT_EMOTIONAL_STATE, updatedAt: new Date().toISOString() };\n }\n\n try {\n const raw = readFileSync(statePath, 'utf-8');\n const parsed = JSON.parse(raw) as Partial<EmotionalState>;\n return {\n confidence: clamp(parsed.confidence ?? 50),\n engagement: clamp(parsed.engagement ?? 50),\n frustration: clamp(parsed.frustration ?? 0),\n curiosity: clamp(parsed.curiosity ?? 50),\n urgency: clamp(parsed.urgency ?? 0),\n updatedAt: parsed.updatedAt ?? new Date().toISOString(),\n notes: parsed.notes,\n };\n } catch {\n return { ...DEFAULT_EMOTIONAL_STATE, updatedAt: new Date().toISOString() };\n }\n}\n\n/** Save the emotional state to the harness memory directory. */\nexport function saveEmotionalState(harnessDir: string, state: EmotionalState): void {\n const stateDir = join(harnessDir, 'memory');\n if (!existsSync(stateDir)) {\n mkdirSync(stateDir, { recursive: true });\n }\n\n const statePath = join(stateDir, EMOTIONAL_STATE_FILE);\n const normalized: EmotionalState = {\n confidence: clamp(state.confidence),\n engagement: clamp(state.engagement),\n frustration: clamp(state.frustration),\n curiosity: clamp(state.curiosity),\n urgency: clamp(state.urgency),\n updatedAt: state.updatedAt,\n notes: state.notes,\n };\n\n withFileLockSync(harnessDir, statePath, () => {\n writeFileSync(statePath, JSON.stringify(normalized, null, 2), 'utf-8');\n });\n}\n\n// ─── Update Logic ────────────────────────────────────────────────────────────\n\n/**\n * Apply emotional signals to the current state.\n * Signals are additive deltas (e.g., { dimension: 'confidence', delta: +10 }).\n * Values are clamped to 0-100.\n *\n * Also appends to the history file for trend analysis.\n */\nexport function applySignals(\n harnessDir: string,\n signals: EmotionalSignal[],\n): EmotionalState {\n const state = loadEmotionalState(harnessDir);\n const now = new Date().toISOString();\n\n for (const signal of signals) {\n if (!DIMENSIONS.includes(signal.dimension)) continue;\n const current = state[signal.dimension] as number;\n state[signal.dimension] = clamp(current + signal.delta);\n }\n\n state.updatedAt = now;\n saveEmotionalState(harnessDir, state);\n\n // Append to history\n appendHistory(harnessDir, { state, signals, timestamp: now });\n\n return state;\n}\n\n/**\n * Derive emotional signals from session outcomes.\n *\n * Heuristic rules:\n * - Successful run → confidence +5, frustration -5\n * - Long run (many steps) → engagement +3, urgency +2\n * - Error → frustration +10, confidence -5\n * - Tool calls → curiosity +2\n * - Budget close to limit → urgency +10\n */\nexport function deriveSignals(outcome: {\n success: boolean;\n steps: number;\n toolCalls: number;\n error?: boolean;\n budgetPercent?: number;\n}): EmotionalSignal[] {\n const signals: EmotionalSignal[] = [];\n\n if (outcome.success) {\n signals.push({ dimension: 'confidence', delta: 5, reason: 'successful run' });\n signals.push({ dimension: 'frustration', delta: -5, reason: 'successful run' });\n }\n\n if (outcome.error) {\n signals.push({ dimension: 'frustration', delta: 10, reason: 'error during run' });\n signals.push({ dimension: 'confidence', delta: -5, reason: 'error during run' });\n }\n\n if (outcome.steps > 5) {\n signals.push({ dimension: 'engagement', delta: 3, reason: 'long multi-step run' });\n signals.push({ dimension: 'urgency', delta: 2, reason: 'long multi-step run' });\n }\n\n if (outcome.toolCalls > 0) {\n signals.push({ dimension: 'curiosity', delta: 2, reason: `${outcome.toolCalls} tool calls` });\n }\n\n if (outcome.budgetPercent !== undefined && outcome.budgetPercent > 80) {\n signals.push({ dimension: 'urgency', delta: 10, reason: 'budget near limit' });\n }\n\n return signals;\n}\n\n/**\n * Generate a natural-language summary of the emotional state for context injection.\n * This can be injected into the system prompt to inform the agent of its disposition.\n */\nexport function summarizeEmotionalState(state: EmotionalState): string {\n const parts: string[] = [];\n\n if (state.confidence < 30) {\n parts.push('Confidence is low — verify assumptions and seek confirmation.');\n } else if (state.confidence > 80) {\n parts.push('Confidence is high — proceed decisively.');\n }\n\n if (state.frustration > 60) {\n parts.push('Frustration is elevated — consider changing approach or escalating.');\n }\n\n if (state.engagement < 30) {\n parts.push('Engagement is low — may need to re-orient on goals.');\n }\n\n if (state.curiosity > 70) {\n parts.push('Curiosity is high — stay focused on the current task.');\n }\n\n if (state.urgency > 70) {\n parts.push('Urgency is high — prioritize speed over thoroughness.');\n }\n\n if (parts.length === 0) {\n return 'Operational disposition: balanced and steady.';\n }\n\n return 'Operational disposition: ' + parts.join(' ');\n}\n\n/**\n * Reset all emotional dimensions to defaults.\n */\nexport function resetEmotionalState(harnessDir: string): EmotionalState {\n const state: EmotionalState = {\n ...DEFAULT_EMOTIONAL_STATE,\n updatedAt: new Date().toISOString(),\n };\n saveEmotionalState(harnessDir, state);\n return state;\n}\n\n// ─── History & Trends ────────────────────────────────────────────────────────\n\n/** Append a snapshot to the emotional history file. */\nfunction appendHistory(harnessDir: string, snapshot: EmotionalSnapshot): void {\n const historyDir = join(harnessDir, 'memory');\n if (!existsSync(historyDir)) {\n mkdirSync(historyDir, { recursive: true });\n }\n\n const historyPath = join(historyDir, EMOTIONAL_HISTORY_FILE);\n const line = JSON.stringify(snapshot) + '\\n';\n\n try {\n writeFileSync(historyPath, line, { flag: 'a' });\n } catch {\n // Non-critical — history is supplementary\n }\n}\n\n/**\n * Load emotional history and compute trends.\n *\n * @param harnessDir - Harness directory\n * @param options.days - Number of days to look back (default: 7)\n */\nexport function getEmotionalTrends(\n harnessDir: string,\n options?: { days?: number },\n): EmotionalTrend[] {\n const days = options?.days ?? 7;\n const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();\n\n const historyPath = join(harnessDir, 'memory', EMOTIONAL_HISTORY_FILE);\n if (!existsSync(historyPath)) {\n return DIMENSIONS.map((d) => ({\n dimension: d,\n values: [],\n trend: 'stable' as const,\n average: d === 'frustration' || d === 'urgency' ? 0 : 50,\n }));\n }\n\n const snapshots: EmotionalSnapshot[] = [];\n try {\n const raw = readFileSync(historyPath, 'utf-8');\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n const snap = JSON.parse(line) as EmotionalSnapshot;\n if (snap.timestamp >= cutoff) {\n snapshots.push(snap);\n }\n } catch {\n // Skip malformed lines\n }\n }\n } catch {\n // No history\n }\n\n return DIMENSIONS.map((dimension) => {\n const values = snapshots.map((s) => ({\n value: s.state[dimension] as number,\n timestamp: s.timestamp,\n }));\n\n const nums = values.map((v) => v.value);\n const average = nums.length > 0\n ? nums.reduce((a, b) => a + b, 0) / nums.length\n : (dimension === 'frustration' || dimension === 'urgency' ? 0 : 50);\n\n // Compute trend: compare first half average to second half\n let trend: 'rising' | 'falling' | 'stable' = 'stable';\n if (nums.length >= 4) {\n const mid = Math.floor(nums.length / 2);\n const firstHalf = nums.slice(0, mid).reduce((a, b) => a + b, 0) / mid;\n const secondHalf = nums.slice(mid).reduce((a, b) => a + b, 0) / (nums.length - mid);\n const diff = secondHalf - firstHalf;\n if (diff > 5) trend = 'rising';\n else if (diff < -5) trend = 'falling';\n }\n\n return { dimension, values, trend, average };\n });\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction clamp(value: number, min: number = 0, max: number = 100): number {\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, statSync } from 'fs';\nimport { join } from 'path';\nimport { loadAllPrimitives, estimateTokens, getAtLevel } from '../primitives/loader.js';\nimport type { HarnessDocument, HarnessConfig } from '../core/types.js';\nimport { withFileLockSync } from './file-lock.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** A stored embedding for a single primitive document. */\nexport interface EmbeddingRecord {\n /** Document ID from frontmatter */\n id: string;\n /** Path to the source markdown file */\n path: string;\n /** Primitive directory (rules, skills, etc.) */\n directory: string;\n /** Text that was embedded (L0 + L1 + tags) */\n embeddedText: string;\n /** The embedding vector */\n vector: number[];\n /** File modification time (to detect stale embeddings) */\n mtime: string;\n /** When the embedding was generated */\n createdAt: string;\n}\n\n/** Embedding store format — persisted as JSON. */\nexport interface EmbeddingStore {\n /** Model ID used for embeddings (invalidate cache if changed) */\n modelId: string;\n /** Embedding vector dimension */\n dimensions: number;\n /** Map of document ID → embedding record */\n records: Record<string, EmbeddingRecord>;\n /** Last full index time */\n lastIndexedAt: string;\n}\n\n/** Result of a semantic search query. */\nexport interface SemanticSearchResult {\n doc: HarnessDocument;\n directory: string;\n /** Cosine similarity score (0-1, higher is more relevant) */\n score: number;\n /** The embedded text that matched */\n embeddedText: string;\n}\n\n/** Function signature for embedding text → vector. */\nexport type EmbedFunction = (texts: string[]) => Promise<number[][]>;\n\n/** Configuration for the semantic search module. */\nexport interface SemanticSearchConfig {\n /** Function to embed text (wraps Vercel AI SDK embed/embedMany) */\n embed: EmbedFunction;\n /** Embedding model identifier (for cache invalidation) */\n modelId: string;\n /** Maximum results to return (default: 10) */\n maxResults?: number;\n /** Minimum similarity threshold (default: 0.3) */\n minScore?: number;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst STORE_FILE = 'embeddings.json';\nconst STORE_DIR = 'memory';\n\n// ─── Store Management ────────────────────────────────────────────────────────\n\n/** Load the embedding store from disk. Returns null if not found or invalid. */\nexport function loadEmbeddingStore(harnessDir: string): EmbeddingStore | null {\n const storePath = join(harnessDir, STORE_DIR, STORE_FILE);\n if (!existsSync(storePath)) return null;\n\n try {\n const raw = readFileSync(storePath, 'utf-8');\n return JSON.parse(raw) as EmbeddingStore;\n } catch {\n return null;\n }\n}\n\n/** Save the embedding store to disk. */\nexport function saveEmbeddingStore(harnessDir: string, store: EmbeddingStore): void {\n const storeDir = join(harnessDir, STORE_DIR);\n if (!existsSync(storeDir)) {\n mkdirSync(storeDir, { recursive: true });\n }\n\n const storePath = join(storeDir, STORE_FILE);\n withFileLockSync(harnessDir, storePath, () => {\n writeFileSync(storePath, JSON.stringify(store), 'utf-8');\n });\n}\n\n// ─── Text Extraction ─────────────────────────────────────────────────────────\n\n/**\n * Extract embeddable text from a document.\n * Combines: tags, L0 summary, L1 summary, and first 500 chars of body.\n * This gives a compact representation for embedding.\n */\nexport function extractEmbeddableText(doc: HarnessDocument): string {\n const parts: string[] = [];\n\n // Tags provide topical context\n if (doc.frontmatter.tags.length > 0) {\n parts.push(`Tags: ${doc.frontmatter.tags.join(', ')}`);\n }\n\n // L0 — one-liner\n if (doc.l0) {\n parts.push(doc.l0);\n }\n\n // L1 — paragraph summary\n if (doc.l1) {\n parts.push(doc.l1);\n }\n\n // Truncated body for additional context\n const bodyPreview = doc.body.slice(0, 500).trim();\n if (bodyPreview) {\n parts.push(bodyPreview);\n }\n\n return parts.join('\\n').trim();\n}\n\n// ─── Indexing ────────────────────────────────────────────────────────────────\n\n/**\n * Detect which primitives need re-embedding.\n * A primitive is stale if:\n * - It doesn't exist in the store\n * - Its file mtime has changed since last embedding\n * - The embedding model has changed\n */\nexport function detectStalePrimitives(\n harnessDir: string,\n store: EmbeddingStore | null,\n modelId: string,\n config?: HarnessConfig,\n): Array<{ doc: HarnessDocument; directory: string }> {\n const stale: Array<{ doc: HarnessDocument; directory: string }> = [];\n const allPrimitives = loadAllPrimitives(harnessDir, config?.extensions?.directories);\n\n // If model changed, everything is stale\n const modelChanged = store !== null && store.modelId !== modelId;\n\n for (const [directory, docs] of allPrimitives) {\n for (const doc of docs) {\n if (doc.frontmatter.status !== 'active') continue;\n\n const id = doc.frontmatter.id;\n\n if (modelChanged || !store) {\n stale.push({ doc, directory });\n continue;\n }\n\n const existing = store.records[id];\n if (!existing) {\n stale.push({ doc, directory });\n continue;\n }\n\n // Check if file changed\n try {\n const stat = statSync(doc.path);\n if (stat.mtime.toISOString() !== existing.mtime) {\n stale.push({ doc, directory });\n }\n } catch {\n stale.push({ doc, directory });\n }\n }\n }\n\n return stale;\n}\n\n/**\n * Index (or re-index) all primitives that need embeddings.\n * Incrementally updates the store — only re-embeds stale documents.\n *\n * @param harnessDir - Harness directory path\n * @param config - Semantic search configuration with embed function\n * @param harnessConfig - Optional harness config for extension directories\n * @returns Updated embedding store\n */\nexport async function indexPrimitives(\n harnessDir: string,\n searchConfig: SemanticSearchConfig,\n harnessConfig?: HarnessConfig,\n): Promise<EmbeddingStore> {\n let store = loadEmbeddingStore(harnessDir);\n\n const stale = detectStalePrimitives(harnessDir, store, searchConfig.modelId, harnessConfig);\n\n if (stale.length === 0 && store) {\n return store;\n }\n\n // Initialize store if needed\n if (!store || store.modelId !== searchConfig.modelId) {\n store = {\n modelId: searchConfig.modelId,\n dimensions: 0,\n records: {},\n lastIndexedAt: new Date().toISOString(),\n };\n }\n\n // Extract texts to embed\n const textsToEmbed: string[] = [];\n const docInfos: Array<{ doc: HarnessDocument; directory: string }> = [];\n\n for (const item of stale) {\n const text = extractEmbeddableText(item.doc);\n if (!text) continue;\n textsToEmbed.push(text);\n docInfos.push(item);\n }\n\n if (textsToEmbed.length === 0) {\n return store;\n }\n\n // Batch embed (chunked to avoid hitting rate limits)\n const batchSize = 50;\n for (let i = 0; i < textsToEmbed.length; i += batchSize) {\n const batch = textsToEmbed.slice(i, i + batchSize);\n const batchDocs = docInfos.slice(i, i + batchSize);\n\n const vectors = await searchConfig.embed(batch);\n\n for (let j = 0; j < vectors.length; j++) {\n const doc = batchDocs[j].doc;\n const vector = vectors[j];\n\n if (store.dimensions === 0 && vector.length > 0) {\n store.dimensions = vector.length;\n }\n\n let mtime: string;\n try {\n const stat = statSync(doc.path);\n mtime = stat.mtime.toISOString();\n } catch {\n mtime = new Date().toISOString();\n }\n\n store.records[doc.frontmatter.id] = {\n id: doc.frontmatter.id,\n path: doc.path,\n directory: batchDocs[j].directory,\n embeddedText: batch[j],\n vector,\n mtime,\n createdAt: new Date().toISOString(),\n };\n }\n }\n\n store.lastIndexedAt = new Date().toISOString();\n\n // Clean up deleted docs\n const allIds = new Set<string>();\n const allPrimitives = loadAllPrimitives(harnessDir, harnessConfig?.extensions?.directories);\n for (const [, docs] of allPrimitives) {\n for (const doc of docs) {\n allIds.add(doc.frontmatter.id);\n }\n }\n\n for (const id of Object.keys(store.records)) {\n if (!allIds.has(id)) {\n delete store.records[id];\n }\n }\n\n saveEmbeddingStore(harnessDir, store);\n return store;\n}\n\n// ─── Search ──────────────────────────────────────────────────────────────────\n\n/**\n * Compute cosine similarity between two vectors.\n * Returns a value between -1 and 1 (1 = identical, 0 = orthogonal).\n */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length || a.length === 0) return 0;\n\n let dotProduct = 0;\n let normA = 0;\n let normB = 0;\n\n for (let i = 0; i < a.length; i++) {\n dotProduct += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n\n const denominator = Math.sqrt(normA) * Math.sqrt(normB);\n if (denominator === 0) return 0;\n\n return dotProduct / denominator;\n}\n\n/**\n * Perform semantic search over indexed primitives.\n *\n * @param harnessDir - Harness directory path\n * @param query - Natural language query\n * @param searchConfig - Search configuration with embed function\n * @param harnessConfig - Optional harness config\n * @returns Ranked search results by cosine similarity\n */\nexport async function semanticSearch(\n harnessDir: string,\n query: string,\n searchConfig: SemanticSearchConfig,\n harnessConfig?: HarnessConfig,\n): Promise<SemanticSearchResult[]> {\n const store = loadEmbeddingStore(harnessDir);\n if (!store || Object.keys(store.records).length === 0) {\n return [];\n }\n\n const maxResults = searchConfig.maxResults ?? 10;\n const minScore = searchConfig.minScore ?? 0.3;\n\n // Embed the query\n const [queryVector] = await searchConfig.embed([query]);\n if (!queryVector || queryVector.length === 0) {\n return [];\n }\n\n // Score all documents\n const scored: Array<{ record: EmbeddingRecord; score: number }> = [];\n\n for (const record of Object.values(store.records)) {\n const score = cosineSimilarity(queryVector, record.vector);\n if (score >= minScore) {\n scored.push({ record, score });\n }\n }\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Load the actual documents for results\n const allPrimitives = loadAllPrimitives(harnessDir, harnessConfig?.extensions?.directories);\n const docMap = new Map<string, { doc: HarnessDocument; directory: string }>();\n for (const [directory, docs] of allPrimitives) {\n for (const doc of docs) {\n docMap.set(doc.frontmatter.id, { doc, directory });\n }\n }\n\n const results: SemanticSearchResult[] = [];\n\n for (const { record, score } of scored.slice(0, maxResults)) {\n const entry = docMap.get(record.id);\n if (!entry) continue;\n\n results.push({\n doc: entry.doc,\n directory: entry.directory,\n score,\n embeddedText: record.embeddedText,\n });\n }\n\n return results;\n}\n\n/**\n * Get embedding stats for the harness.\n */\nexport function getEmbeddingStats(harnessDir: string): {\n indexed: number;\n modelId: string | null;\n dimensions: number;\n lastIndexedAt: string | null;\n storeSize: number;\n} {\n const store = loadEmbeddingStore(harnessDir);\n if (!store) {\n return {\n indexed: 0,\n modelId: null,\n dimensions: 0,\n lastIndexedAt: null,\n storeSize: 0,\n };\n }\n\n const storePath = join(harnessDir, STORE_DIR, STORE_FILE);\n let storeSize = 0;\n try {\n storeSize = statSync(storePath).size;\n } catch {\n // Ignore\n }\n\n return {\n indexed: Object.keys(store.records).length,\n modelId: store.modelId,\n dimensions: store.dimensions,\n lastIndexedAt: store.lastIndexedAt,\n storeSize,\n };\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join } from 'path';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { serve as honoServe } from '@hono/node-server';\nimport type { Server } from 'http';\nimport { createWebApp } from './web-server.js';\nimport { log } from '../core/logger.js';\nimport { loadConfig } from '../core/config.js';\nimport { Conversation } from './conversation.js';\nimport { withFileLockSync } from './file-lock.js';\nimport type { HarnessConfig } from '../core/types.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface ServeOptions {\n harnessDir: string;\n port?: number;\n apiKey?: string;\n /** Secret for authenticating incoming webhooks */\n webhookSecret?: string;\n /** Enable CORS for all origins (default: true) */\n corsEnabled?: boolean;\n}\n\nexport interface WebhookRegistration {\n /** Unique webhook ID */\n id: string;\n /** URL to send events to */\n url: string;\n /** Events to subscribe to (e.g., ['session_end', 'state_change']) */\n events: string[];\n /** Optional secret for signing payloads */\n secret?: string;\n /** Whether this webhook is active */\n active: boolean;\n /** Created timestamp */\n createdAt: string;\n}\n\nexport interface WebhookPayload {\n event: string;\n timestamp: string;\n data: unknown;\n webhookId: string;\n}\n\nexport interface WebhookStore {\n webhooks: WebhookRegistration[];\n}\n\nexport interface ServeResult {\n server: Server;\n port: number;\n /** Function to fire a webhook event */\n fireEvent: (event: string, data: unknown) => Promise<void>;\n /** Function to stop the server */\n stop: () => void;\n}\n\n// ─── Webhook Store ──────────────────────────────────────────────────────────\n\nconst WEBHOOK_FILE = 'webhooks.json';\n\nfunction loadWebhooks(harnessDir: string): WebhookStore {\n const filePath = join(harnessDir, 'memory', WEBHOOK_FILE);\n if (!existsSync(filePath)) return { webhooks: [] };\n\n try {\n const raw = readFileSync(filePath, 'utf-8');\n return JSON.parse(raw) as WebhookStore;\n } catch {\n return { webhooks: [] };\n }\n}\n\nfunction saveWebhooks(harnessDir: string, store: WebhookStore): void {\n const memDir = join(harnessDir, 'memory');\n if (!existsSync(memDir)) mkdirSync(memDir, { recursive: true });\n\n const filePath = join(memDir, WEBHOOK_FILE);\n withFileLockSync(harnessDir, filePath, () => {\n writeFileSync(filePath, JSON.stringify(store, null, 2), 'utf-8');\n });\n}\n\n// ─── Webhook Delivery ───────────────────────────────────────────────────────\n\n/**\n * Fire an event to all subscribed webhooks.\n * Non-blocking — logs failures but never throws.\n */\nasync function fireWebhookEvent(\n harnessDir: string,\n event: string,\n data: unknown,\n): Promise<void> {\n const store = loadWebhooks(harnessDir);\n const subscribers = store.webhooks.filter(\n (w) => w.active && (w.events.includes('*') || w.events.includes(event)),\n );\n\n if (subscribers.length === 0) return;\n\n const payload: Omit<WebhookPayload, 'webhookId'> = {\n event,\n timestamp: new Date().toISOString(),\n data,\n };\n\n const deliveries = subscribers.map(async (webhook) => {\n try {\n const body = JSON.stringify({ ...payload, webhookId: webhook.id });\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Harness-Event': event,\n 'X-Webhook-ID': webhook.id,\n };\n\n // HMAC signing if secret is configured\n if (webhook.secret) {\n const crypto = await import('crypto');\n const hmac = crypto.createHmac('sha256', webhook.secret);\n hmac.update(body);\n headers['X-Harness-Signature'] = `sha256=${hmac.digest('hex')}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n const response = await fetch(webhook.url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n log.warn(`Webhook ${webhook.id} delivery failed: HTTP ${response.status}`);\n }\n } catch (err) {\n log.warn(`Webhook ${webhook.id} delivery failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n });\n\n await Promise.allSettled(deliveries);\n}\n\n// ─── Server Factory ─────────────────────────────────────────────────────────\n\n/**\n * Create and start the harness API server.\n *\n * Includes:\n * - All dashboard endpoints from web-server.ts\n * - Webhook registration and management API\n * - Prompt execution endpoint (POST /api/run)\n * - Health check endpoint (GET /api/health)\n * - Version information endpoint (GET /api/info)\n *\n * Usage:\n * ```typescript\n * const result = startServe({\n * harnessDir: './my-harness',\n * port: 8080,\n * webhookSecret: 'my-secret',\n * });\n *\n * // Fire events to registered webhooks\n * await result.fireEvent('custom_event', { key: 'value' });\n *\n * // Stop the server\n * result.stop();\n * ```\n */\nexport function startServe(options: ServeOptions): ServeResult {\n const {\n harnessDir,\n port = 8080,\n apiKey,\n webhookSecret,\n } = options;\n\n // Build the base web app (dashboard + primitives + sessions + chat + SSE)\n const { app: baseApp, broadcaster } = createWebApp(harnessDir, { apiKey });\n\n // Create a new Hono app that wraps the base with additional endpoints\n const app = new Hono();\n app.use('*', cors());\n\n // ── Authentication middleware for webhook management ──\n const requireAuth = (secret: string | undefined) => {\n return async (c: { req: { header: (name: string) => string | undefined }; json: (body: unknown, status: number) => Response }, next: () => Promise<void>): Promise<Response | void> => {\n if (!secret) return next();\n const auth = c.req.header('Authorization');\n if (!auth || auth !== `Bearer ${secret}`) {\n return c.json({ error: 'Unauthorized' }, 401);\n }\n return next();\n };\n };\n\n // ── Health Check ──\n app.get('/api/health', (c) => {\n return c.json({\n status: 'ok',\n timestamp: new Date().toISOString(),\n harnessDir,\n });\n });\n\n // ── Agent Info ──\n app.get('/api/info', (c) => {\n try {\n const config = loadConfig(harnessDir);\n return c.json({\n name: config.agent.name,\n version: config.agent.version,\n model: config.model.id,\n provider: config.model.provider,\n });\n } catch {\n return c.json({ error: 'Failed to load config' }, 500);\n }\n });\n\n // ── Run prompt ──\n app.post('/api/run', async (c) => {\n const body = await c.req.json<{ prompt?: string; model?: string }>().catch(() => ({} as { prompt?: string; model?: string }));\n if (!body.prompt || body.prompt.trim().length === 0) {\n return c.json({ error: 'prompt is required' }, 400);\n }\n\n try {\n const { createHarness } = await import('../core/harness.js');\n const harness = createHarness({\n dir: harnessDir,\n model: body.model,\n apiKey,\n });\n\n await harness.boot();\n const result = await harness.run(body.prompt);\n await harness.shutdown();\n\n // Fire webhook\n await fireWebhookEvent(harnessDir, 'run_complete', {\n prompt: body.prompt,\n text: result.text,\n });\n\n return c.json({\n text: result.text,\n usage: result.usage,\n steps: result.steps,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await fireWebhookEvent(harnessDir, 'run_error', {\n prompt: body.prompt,\n error: message,\n });\n return c.json({ error: message }, 500);\n }\n });\n\n // ── Webhook Registration API ──\n\n // List registered webhooks\n app.get('/api/webhooks', requireAuth(webhookSecret) as never, (c) => {\n const store = loadWebhooks(harnessDir);\n return c.json(store.webhooks.map((w) => ({\n id: w.id,\n url: w.url,\n events: w.events,\n active: w.active,\n createdAt: w.createdAt,\n })));\n });\n\n // Register a new webhook\n app.post('/api/webhooks', requireAuth(webhookSecret) as never, async (c) => {\n const body = await c.req.json<{\n url?: string;\n events?: string[];\n secret?: string;\n }>().catch(() => ({} as { url?: string; events?: string[]; secret?: string }));\n\n if (!body.url) {\n return c.json({ error: 'url is required' }, 400);\n }\n\n // Validate URL\n try {\n new URL(body.url);\n } catch {\n return c.json({ error: 'Invalid URL' }, 400);\n }\n\n const store = loadWebhooks(harnessDir);\n const id = `wh_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n\n const webhook: WebhookRegistration = {\n id,\n url: body.url,\n events: body.events ?? ['*'],\n secret: body.secret,\n active: true,\n createdAt: new Date().toISOString(),\n };\n\n store.webhooks.push(webhook);\n saveWebhooks(harnessDir, store);\n\n return c.json({ id, url: webhook.url, events: webhook.events }, 201);\n });\n\n // Delete a webhook\n app.delete('/api/webhooks/:id', requireAuth(webhookSecret) as never, (c) => {\n const id = c.req.param('id');\n const store = loadWebhooks(harnessDir);\n const index = store.webhooks.findIndex((w) => w.id === id);\n\n if (index === -1) {\n return c.json({ error: 'Webhook not found' }, 404);\n }\n\n store.webhooks.splice(index, 1);\n saveWebhooks(harnessDir, store);\n\n return c.json({ deleted: id });\n });\n\n // Toggle webhook active/inactive\n app.patch('/api/webhooks/:id', requireAuth(webhookSecret) as never, async (c) => {\n const id = c.req.param('id');\n const body = await c.req.json<{ active?: boolean }>().catch(() => ({} as { active?: boolean }));\n\n const store = loadWebhooks(harnessDir);\n const webhook = store.webhooks.find((w) => w.id === id);\n\n if (!webhook) {\n return c.json({ error: 'Webhook not found' }, 404);\n }\n\n if (body.active !== undefined) {\n webhook.active = body.active;\n }\n\n saveWebhooks(harnessDir, store);\n return c.json({ id, active: webhook.active });\n });\n\n // Test a webhook (sends a test event)\n app.post('/api/webhooks/:id/test', requireAuth(webhookSecret) as never, async (c) => {\n const id = c.req.param('id');\n const store = loadWebhooks(harnessDir);\n const webhook = store.webhooks.find((w) => w.id === id);\n\n if (!webhook) {\n return c.json({ error: 'Webhook not found' }, 404);\n }\n\n try {\n const body = JSON.stringify({\n event: 'test',\n timestamp: new Date().toISOString(),\n data: { message: 'Webhook test from harness serve' },\n webhookId: webhook.id,\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Harness-Event': 'test',\n 'X-Webhook-ID': webhook.id,\n };\n\n if (webhook.secret) {\n const crypto = await import('crypto');\n const hmac = crypto.createHmac('sha256', webhook.secret);\n hmac.update(body);\n headers['X-Harness-Signature'] = `sha256=${hmac.digest('hex')}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n const response = await fetch(webhook.url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n return c.json({\n success: response.ok,\n status: response.status,\n statusText: response.statusText,\n });\n } catch (err) {\n return c.json({\n success: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n });\n\n // ── Mount base web app routes ──\n app.route('/', baseApp);\n\n // Start server\n const server = honoServe({ fetch: app.fetch, port }) as Server;\n\n const stop = (): void => {\n server.close();\n };\n\n return {\n server,\n port,\n fireEvent: (event: string, data: unknown) => fireWebhookEvent(harnessDir, event, data),\n stop,\n };\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { withFileLockSync } from './file-lock.js';\nimport { log } from '../core/logger.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type SourceType = 'github' | 'registry' | 'api';\n\nexport type ContentType = 'skills' | 'agents' | 'rules' | 'playbooks' | 'hooks' | 'templates' | 'mcp' | 'plugins';\n\nexport interface Source {\n /** Display name */\n name: string;\n /** URL — GitHub repo, registry API, or endpoint */\n url: string;\n /** Source type */\n type: SourceType;\n /** Content types provided */\n content: ContentType[];\n /** Searchable tags */\n tags: string[];\n /** Description of the source */\n description?: string;\n /** Optional stats (e.g., { skills: 31, agents: 19 }) */\n stats?: Record<string, number>;\n}\n\nexport interface SourcesFile {\n version: string;\n sources: Source[];\n}\n\nexport interface SourceDiscoveryResult {\n /** Source the item came from */\n source: Source;\n /** Item name/title */\n name: string;\n /** Item description */\n description: string;\n /** Item type (skill, agent, rule, etc.) */\n type: ContentType;\n /** URL to the item (file or page) */\n url: string;\n /** Match relevance score (0-1) */\n score: number;\n}\n\nexport interface SourceDiscoveryOptions {\n /** Filter by content type */\n type?: ContentType;\n /** Maximum results */\n maxResults?: number;\n /** Only search these sources (by name) */\n sourceNames?: string[];\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst USER_SOURCES_FILE = 'sources.yaml';\nconst SOURCES_DIR = 'memory';\n\n// ─── Source Loading ──────────────────────────────────────────────────────────\n\n/**\n * Get the path to the shipped sources.yaml bundled with the package.\n */\nfunction getShippedSourcesPath(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'sources.yaml');\n if (existsSync(candidate)) return candidate;\n dir = dirname(dir);\n }\n // Fallback\n return join(dirname(dirname(fileURLToPath(import.meta.url))), 'sources.yaml');\n}\n\n/**\n * Load the shipped sources.yaml from the package root.\n */\nexport function loadShippedSources(): Source[] {\n const path = getShippedSourcesPath();\n if (!existsSync(path)) return [];\n\n try {\n const raw = readFileSync(path, 'utf-8');\n const parsed = parseYaml(raw) as { version?: string; sources?: Array<Record<string, unknown>> };\n return normalizeSources(parsed.sources ?? []);\n } catch (err) {\n log.warn(`Failed to load shipped sources: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n}\n\n/**\n * Load user-added sources from the harness memory directory.\n */\nexport function loadUserSources(harnessDir: string): Source[] {\n const userPath = join(harnessDir, SOURCES_DIR, USER_SOURCES_FILE);\n if (!existsSync(userPath)) return [];\n\n try {\n const raw = readFileSync(userPath, 'utf-8');\n const parsed = parseYaml(raw) as { version?: string; sources?: Array<Record<string, unknown>> };\n return normalizeSources(parsed.sources ?? []);\n } catch (err) {\n log.warn(`Failed to load user sources: ${err instanceof Error ? err.message : String(err)}`);\n return [];\n }\n}\n\n/**\n * Save user sources to the harness memory directory.\n */\nexport function saveUserSources(harnessDir: string, sources: Source[]): void {\n const memDir = join(harnessDir, SOURCES_DIR);\n if (!existsSync(memDir)) mkdirSync(memDir, { recursive: true });\n\n const userPath = join(memDir, USER_SOURCES_FILE);\n const data: SourcesFile = { version: '1.0', sources };\n\n withFileLockSync(harnessDir, userPath, () => {\n writeFileSync(userPath, stringifyYaml(data), 'utf-8');\n });\n}\n\n/**\n * Load all sources: shipped + user-added, deduplicated by name.\n */\nexport function loadAllSources(harnessDir: string): Source[] {\n const shipped = loadShippedSources();\n const user = loadUserSources(harnessDir);\n\n // User sources override shipped sources with the same name\n const byName = new Map<string, Source>();\n for (const s of shipped) {\n byName.set(s.name.toLowerCase(), s);\n }\n for (const s of user) {\n byName.set(s.name.toLowerCase(), s);\n }\n\n return Array.from(byName.values());\n}\n\n// ─── Source Management ───────────────────────────────────────────────────────\n\n/**\n * Add a new source to the user's sources list.\n * Returns the added source, or null if it already exists.\n */\nexport function addSource(\n harnessDir: string,\n source: Omit<Source, 'tags'> & { tags?: string[] },\n): Source | null {\n const userSources = loadUserSources(harnessDir);\n\n // Check for duplicate by name\n const exists = userSources.find(\n (s) => s.name.toLowerCase() === source.name.toLowerCase(),\n );\n if (exists) return null;\n\n const normalized: Source = {\n name: source.name,\n url: source.url,\n type: source.type,\n content: source.content,\n tags: source.tags ?? [],\n description: source.description,\n stats: source.stats,\n };\n\n userSources.push(normalized);\n saveUserSources(harnessDir, userSources);\n return normalized;\n}\n\n/**\n * Remove a source by name from the user's sources list.\n * Returns true if removed, false if not found.\n */\nexport function removeSource(harnessDir: string, name: string): boolean {\n const userSources = loadUserSources(harnessDir);\n const index = userSources.findIndex(\n (s) => s.name.toLowerCase() === name.toLowerCase(),\n );\n\n if (index === -1) return false;\n\n userSources.splice(index, 1);\n saveUserSources(harnessDir, userSources);\n return true;\n}\n\n// ─── Discovery ───────────────────────────────────────────────────────────────\n\n/**\n * Search all sources for content matching a query.\n *\n * This performs local matching against source metadata (name, description,\n * tags, content types). For deeper search, each source type has its own\n * fetcher (GitHub API, registry API, etc.).\n *\n * @param harnessDir - Harness directory\n * @param query - Search query (text or content type)\n * @param options - Discovery options\n * @returns Ranked results from all matching sources\n */\nexport function discoverSources(\n harnessDir: string,\n query: string,\n options?: SourceDiscoveryOptions,\n): SourceDiscoveryResult[] {\n const sources = loadAllSources(harnessDir);\n const results: SourceDiscoveryResult[] = [];\n const maxResults = options?.maxResults ?? 20;\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter((w) => w.length > 1);\n\n for (const source of sources) {\n // Filter by source names if specified\n if (options?.sourceNames && options.sourceNames.length > 0) {\n const matches = options.sourceNames.some(\n (n) => source.name.toLowerCase().includes(n.toLowerCase()),\n );\n if (!matches) continue;\n }\n\n // Filter by content type\n if (options?.type && !source.content.includes(options.type)) {\n continue;\n }\n\n // Score the source against the query\n const score = computeSourceScore(source, queryLower, queryWords);\n\n if (score > 0) {\n // For each content type this source provides, create a result\n const types = options?.type\n ? [options.type]\n : source.content;\n\n for (const type of types) {\n results.push({\n source,\n name: source.name,\n description: source.description ?? '',\n type,\n url: source.url,\n score,\n });\n }\n }\n }\n\n // Sort by score descending, then by name\n results.sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return a.name.localeCompare(b.name);\n });\n\n return results.slice(0, maxResults);\n}\n\n/**\n * Get all sources that provide a specific content type.\n */\nexport function getSourcesForType(\n harnessDir: string,\n type: ContentType,\n): Source[] {\n const sources = loadAllSources(harnessDir);\n return sources.filter((s) => s.content.includes(type));\n}\n\n/**\n * Get a summary of all known sources grouped by content type.\n */\nexport function getSourcesSummary(harnessDir: string): Record<ContentType, Source[]> {\n const sources = loadAllSources(harnessDir);\n const summary: Record<string, Source[]> = {};\n\n const allTypes: ContentType[] = ['skills', 'agents', 'rules', 'playbooks', 'hooks', 'templates', 'mcp', 'plugins'];\n for (const type of allTypes) {\n summary[type] = sources.filter((s) => s.content.includes(type));\n }\n\n return summary as Record<ContentType, Source[]>;\n}\n\n// ─── Remote Discovery (GitHub) ───────────────────────────────────────────────\n\n/**\n * GitHub Contents API entry shape.\n * https://docs.github.com/en/rest/repos/contents\n */\ninterface GitHubContentItem {\n name: string;\n path: string;\n type: 'file' | 'dir' | 'symlink' | 'submodule';\n download_url: string | null;\n html_url: string;\n}\n\n/**\n * Maps a Source's declared `content:` types to the GitHub directories we\n * should scan for them. Multiple content types may map to the same dir.\n * `plugins` and `templates` are always allowed because layouts vary.\n */\nconst CONTENT_TYPE_TO_DIRS: Record<ContentType, string[]> = {\n skills: ['skills'],\n agents: ['agents'],\n rules: ['rules'],\n playbooks: ['playbooks'],\n hooks: ['hooks'],\n templates: ['templates'],\n mcp: [], // MCP servers come from registries, not GitHub repo dirs\n plugins: ['plugins'],\n};\n\n/** Hard cap on Contents API calls per discoverRemote invocation, across all sources. */\nconst MAX_API_CALLS_PER_DISCOVERY = 50;\n\nconst GITHUB_CONTENTS_TIMEOUT_MS = 10000;\n\n/**\n * Fetch a single Contents API endpoint with timeout and standard headers.\n * Returns parsed JSON or null on any error (logged at warn level).\n */\nasync function fetchGitHubContents(\n owner: string,\n repo: string,\n path: string,\n sourceName: string,\n): Promise<GitHubContentItem[] | null> {\n const apiUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'agent-harness',\n };\n // Authenticated requests get a higher rate limit (5000/hr vs 60/hr).\n // Optional — Contents API works fine without it for new users.\n if (process.env.GITHUB_TOKEN) {\n headers.Authorization = `Bearer ${process.env.GITHUB_TOKEN}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), GITHUB_CONTENTS_TIMEOUT_MS);\n\n try {\n const response = await fetch(apiUrl, { headers, signal: controller.signal });\n if (!response.ok) {\n // 404 on a missing directory is expected (not all repos have all dirs).\n // Other statuses get logged so they're visible during discovery debugging.\n if (response.status !== 404) {\n log.warn(`GitHub Contents API ${response.status} for ${sourceName}/${path}`);\n }\n return null;\n }\n const data = (await response.json()) as GitHubContentItem[] | GitHubContentItem;\n // Endpoint returns an object for files, an array for directories.\n return Array.isArray(data) ? data : [data];\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n log.warn(`GitHub Contents API timeout for ${sourceName}/${path}`);\n } else {\n log.warn(\n `GitHub Contents API error for ${sourceName}/${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Score a candidate file against a search query.\n * Higher scores = better match. 0 means no match (skipped).\n */\nfunction scoreContentMatch(itemName: string, itemPath: string, queryLower: string): number {\n const nameLower = itemName.toLowerCase();\n const pathLower = itemPath.toLowerCase();\n if (nameLower.includes(queryLower)) return 0.9;\n if (pathLower.includes(queryLower)) return 0.6;\n return 0;\n}\n\n/**\n * Convert a single matched Contents API entry into a SourceDiscoveryResult.\n * Returns null if the entry doesn't match the query or content-type filter.\n */\nfunction buildResultFromContent(\n source: Source,\n item: GitHubContentItem,\n queryLower: string,\n typeFilter: ContentType | undefined,\n): SourceDiscoveryResult | null {\n if (item.type !== 'file') return null;\n if (!item.name.endsWith('.md')) return null;\n if (!item.download_url) return null;\n\n const score = scoreContentMatch(item.name, item.path, queryLower);\n if (score === 0) return null;\n\n const inferredType = inferContentType(item.path, source.content);\n if (typeFilter && inferredType !== typeFilter) return null;\n\n return {\n source,\n name: item.name,\n description: `${item.path} in ${source.name}`,\n type: inferredType,\n url: item.download_url,\n score,\n };\n}\n\n/**\n * Fetch content listing from a GitHub source via the Contents API.\n *\n * Uses `GET /repos/{owner}/{repo}/contents/{path}` which works without\n * authentication (60 req/hr limit). Recurses one level into `plugins/*`\n * to discover wshobson-style nested layouts.\n *\n * Falls back to the legacy Code Search API only if `GITHUB_TOKEN` is set\n * AND `HARNESS_DISCOVER_USE_CODE_SEARCH=1` is opted in via env. Code Search\n * always requires auth (returns 401 unauthenticated as of 2023).\n *\n * @param source - GitHub source definition\n * @param query - Search query (case-insensitive substring match)\n * @param options - Discovery options\n * @returns Discovery results from the GitHub repo\n */\nexport async function fetchGitHubSource(\n source: Source,\n query: string,\n options?: SourceDiscoveryOptions,\n budget?: CallBudget,\n): Promise<SourceDiscoveryResult[]> {\n // Parse GitHub URL to extract owner/repo\n const match = source.url.match(/github\\.com\\/([^/]+)\\/([^/]+)/);\n if (!match) return [];\n\n const [, owner, repoRaw] = match;\n // Strip trailing .git or path fragments\n const repo = repoRaw.replace(/\\.git$/, '').replace(/\\/.*$/, '');\n\n // Optional opt-in to legacy Code Search path. Default is Contents API.\n if (process.env.GITHUB_TOKEN && process.env.HARNESS_DISCOVER_USE_CODE_SEARCH === '1') {\n log.debug(`[sources] using code search api for ${source.name} (GITHUB_TOKEN + opt-in detected)`);\n return fetchGitHubSourceViaCodeSearch(source, query, owner, repo, options);\n }\n\n log.debug(`[sources] using contents api for ${source.name}`);\n return fetchGitHubSourceViaContents(source, query, owner, repo, options, budget);\n}\n\n/**\n * A budget for Contents API calls. Shared across a single discoverRemote\n * invocation so multiple sources can't collectively exhaust the rate limit.\n */\ninterface CallBudget {\n remaining: number;\n}\n\n/**\n * Determine which top-level directories to scan for a given source.\n * Scopes by the source's declared `content:` types — if a source only\n * provides skills, we don't scan agents/, rules/, etc.\n */\nfunction dirsForSource(source: Source): string[] {\n const dirs = new Set<string>();\n for (const ct of source.content) {\n for (const d of CONTENT_TYPE_TO_DIRS[ct] ?? []) {\n dirs.add(d);\n }\n }\n // If a source has no listed content types (shouldn't happen), fall back\n // to a safe default of skills+agents — the most common content types.\n if (dirs.size === 0) {\n dirs.add('skills');\n dirs.add('agents');\n }\n return Array.from(dirs);\n}\n\n/**\n * Discovery via the unauthenticated GitHub Contents API.\n *\n * Strategy (designed to fit within 60 req/hr unauth):\n * 1. Scan only the dirs the source advertises in its `content:` field.\n * 2. For plugins/, list topic names ONCE, filter topics by query match,\n * only recurse into matching topics. Never enumerate all topics.\n * 3. Share a call budget across the whole discovery so a single source\n * can't exhaust the rate limit for siblings.\n */\nasync function fetchGitHubSourceViaContents(\n source: Source,\n query: string,\n owner: string,\n repo: string,\n options?: SourceDiscoveryOptions,\n budget?: CallBudget,\n): Promise<SourceDiscoveryResult[]> {\n const queryLower = query.toLowerCase();\n const typeFilter = options?.type;\n const maxResults = options?.maxResults ?? 10;\n const callBudget: CallBudget = budget ?? { remaining: MAX_API_CALLS_PER_DISCOVERY };\n const results: SourceDiscoveryResult[] = [];\n\n const dirsToScan = dirsForSource(source);\n\n // Scan top-level dirs in parallel — but only the ones this source declares.\n const topLevelTasks = dirsToScan.map((dir) => {\n if (callBudget.remaining <= 0) return Promise.resolve(null);\n callBudget.remaining--;\n return fetchGitHubContents(owner, repo, dir, source.name);\n });\n const topLevelLists = await Promise.all(topLevelTasks);\n\n for (let i = 0; i < dirsToScan.length; i++) {\n if (results.length >= maxResults) break;\n const dirName = dirsToScan[i];\n const items = topLevelLists[i];\n if (!items) continue;\n\n // Direct file matches first.\n for (const item of items) {\n if (results.length >= maxResults) break;\n const result = buildResultFromContent(source, item, queryLower, typeFilter);\n if (result) results.push(result);\n }\n\n // For plugins/, recurse selectively: only into topics whose name matches the query.\n if (dirName === 'plugins' && results.length < maxResults) {\n const matchingTopics = items.filter(\n (item) => item.type === 'dir' && item.name.toLowerCase().includes(queryLower),\n );\n for (const topic of matchingTopics) {\n if (results.length >= maxResults) break;\n if (callBudget.remaining <= 0) break;\n await scanPluginTopic(\n source,\n owner,\n repo,\n topic.path,\n queryLower,\n typeFilter,\n results,\n maxResults,\n callBudget,\n );\n }\n }\n }\n\n // Sort by score descending so the best matches come first.\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n}\n\n/**\n * Recurse one level into a single matching plugins/<topic>/ directory,\n * inspecting the harness primitive subdirs inside it (agents/, skills/, etc.).\n * Decrements the shared call budget. Stops on budget exhaustion or maxResults.\n */\nasync function scanPluginTopic(\n source: Source,\n owner: string,\n repo: string,\n topicPath: string,\n queryLower: string,\n typeFilter: ContentType | undefined,\n results: SourceDiscoveryResult[],\n maxResults: number,\n callBudget: CallBudget,\n): Promise<void> {\n if (callBudget.remaining <= 0) return;\n callBudget.remaining--;\n const subDirs = await fetchGitHubContents(owner, repo, topicPath, source.name);\n if (!subDirs) return;\n\n for (const sub of subDirs) {\n if (results.length >= maxResults) return;\n if (callBudget.remaining <= 0) return;\n if (sub.type !== 'dir') continue;\n // Only descend into harness primitive subdirs.\n const validSubdir =\n sub.name === 'skills' ||\n sub.name === 'agents' ||\n sub.name === 'rules' ||\n sub.name === 'playbooks' ||\n sub.name === 'hooks';\n if (!validSubdir) continue;\n\n callBudget.remaining--;\n const files = await fetchGitHubContents(owner, repo, sub.path, source.name);\n if (!files) continue;\n\n for (const file of files) {\n if (results.length >= maxResults) return;\n const result = buildResultFromContent(source, file, queryLower, typeFilter);\n if (result) results.push(result);\n }\n }\n}\n\n/**\n * Legacy Code Search API path. Requires authentication (returns 401 unauthenticated\n * as of 2023). Kept as an opt-in fallback for power users with GITHUB_TOKEN who\n * want richer query semantics. Never the default.\n */\nasync function fetchGitHubSourceViaCodeSearch(\n source: Source,\n query: string,\n owner: string,\n repo: string,\n options?: SourceDiscoveryOptions,\n): Promise<SourceDiscoveryResult[]> {\n const results: SourceDiscoveryResult[] = [];\n const apiUrl = `https://api.github.com/search/code?q=${encodeURIComponent(query)}+repo:${owner}/${repo}`;\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), GITHUB_CONTENTS_TIMEOUT_MS);\n\n try {\n const response = await fetch(apiUrl, {\n headers: {\n Accept: 'application/vnd.github.v3+json',\n 'User-Agent': 'agent-harness',\n Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,\n },\n signal: controller.signal,\n });\n\n if (!response.ok) {\n log.warn(`GitHub Code Search API ${response.status} for ${source.name}`);\n return results;\n }\n\n const data = (await response.json()) as {\n items?: Array<{ name: string; path: string; html_url: string }>;\n };\n if (!data.items) return results;\n\n const maxResults = options?.maxResults ?? 10;\n const queryLower = query.toLowerCase();\n\n for (const item of data.items.slice(0, maxResults)) {\n const type = inferContentType(item.path, source.content);\n if (options?.type && type !== options.type) continue;\n const nameScore = item.name.toLowerCase().includes(queryLower) ? 0.9 : 0.5;\n results.push({\n source,\n name: item.name,\n description: `${item.path} in ${source.name}`,\n type,\n url: item.html_url,\n score: nameScore,\n });\n }\n } catch (err) {\n log.warn(\n `Failed Code Search for ${source.name}: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n clearTimeout(timer);\n }\n\n return results;\n}\n\n/**\n * Perform a full remote discovery across all sources.\n * Searches GitHub repos and registries in parallel.\n *\n * @param harnessDir - Harness directory\n * @param query - Search query\n * @param options - Discovery options\n * @returns All discovery results, merged and ranked\n */\nexport async function discoverRemote(\n harnessDir: string,\n query: string,\n options?: SourceDiscoveryOptions,\n): Promise<SourceDiscoveryResult[]> {\n const sources = loadAllSources(harnessDir);\n const maxResults = options?.maxResults ?? 20;\n\n // Filter sources\n let filtered = sources;\n if (options?.type) {\n filtered = sources.filter((s) => s.content.includes(options.type!));\n }\n if (options?.sourceNames && options.sourceNames.length > 0) {\n filtered = filtered.filter((s) =>\n options.sourceNames!.some((n) =>\n s.name.toLowerCase().includes(n.toLowerCase()),\n ),\n );\n }\n\n // Shared call budget across ALL sources for this discovery, so a single\n // big repo can't exhaust the GitHub rate limit for its siblings.\n const sharedBudget: CallBudget = { remaining: MAX_API_CALLS_PER_DISCOVERY };\n\n // Search each source in parallel\n const promises = filtered.map(async (source) => {\n if (source.type === 'github') {\n return fetchGitHubSource(source, query, options, sharedBudget);\n }\n // Registry sources use the existing MCP registry search\n // API sources would need custom handlers\n return [] as SourceDiscoveryResult[];\n });\n\n const results = await Promise.allSettled(promises);\n const allResults: SourceDiscoveryResult[] = [];\n\n for (const result of results) {\n if (result.status === 'fulfilled') {\n allResults.push(...result.value);\n }\n }\n\n // Sort by score, deduplicate by URL\n allResults.sort((a, b) => b.score - a.score);\n const seen = new Set<string>();\n const deduped: SourceDiscoveryResult[] = [];\n for (const r of allResults) {\n if (!seen.has(r.url)) {\n seen.add(r.url);\n deduped.push(r);\n }\n }\n\n return deduped.slice(0, maxResults);\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction normalizeSources(raw: Array<Record<string, unknown>>): Source[] {\n return raw\n .filter((s) => s.name && s.url && s.type)\n .map((s) => ({\n name: String(s.name),\n url: String(s.url),\n type: String(s.type) as SourceType,\n content: Array.isArray(s.content)\n ? (s.content as string[]).map((c) => String(c) as ContentType)\n : [],\n tags: Array.isArray(s.tags) ? (s.tags as string[]).map(String) : [],\n description: s.description ? String(s.description) : undefined,\n stats: s.stats && typeof s.stats === 'object'\n ? s.stats as Record<string, number>\n : undefined,\n }));\n}\n\nfunction computeSourceScore(\n source: Source,\n queryLower: string,\n queryWords: string[],\n): number {\n let score = 0;\n\n // Exact name match\n if (source.name.toLowerCase() === queryLower) {\n score += 1.0;\n } else if (source.name.toLowerCase().includes(queryLower)) {\n score += 0.8;\n }\n\n // Description match\n const desc = (source.description ?? '').toLowerCase();\n if (desc.includes(queryLower)) {\n score += 0.5;\n }\n\n // Tag match\n for (const tag of source.tags) {\n if (tag.toLowerCase() === queryLower) {\n score += 0.7;\n } else if (tag.toLowerCase().includes(queryLower)) {\n score += 0.3;\n }\n }\n\n // Content type match\n for (const ct of source.content) {\n if (ct === queryLower) {\n score += 0.8;\n }\n }\n\n // Word overlap\n if (queryWords.length > 0 && score === 0) {\n let wordHits = 0;\n const allText = `${source.name} ${source.description ?? ''} ${source.tags.join(' ')} ${source.content.join(' ')}`.toLowerCase();\n for (const word of queryWords) {\n if (allText.includes(word)) wordHits++;\n }\n if (wordHits > 0) {\n score += (wordHits / queryWords.length) * 0.5;\n }\n }\n\n return Math.min(score, 1.0);\n}\n\nfunction inferContentType(filePath: string, sourceContentTypes: ContentType[]): ContentType {\n const pathLower = filePath.toLowerCase();\n\n if (pathLower.includes('skill') || pathLower.includes('SKILL.md')) return 'skills';\n if (pathLower.includes('agent')) return 'agents';\n if (pathLower.includes('rule')) return 'rules';\n if (pathLower.includes('playbook')) return 'playbooks';\n if (pathLower.includes('hook')) return 'hooks';\n if (pathLower.includes('template')) return 'templates';\n if (pathLower.includes('mcp') || pathLower.includes('server')) return 'mcp';\n if (pathLower.includes('plugin')) return 'plugins';\n\n // Default to the first content type of the source\n return sourceContentTypes[0] ?? 'skills';\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'fs';\nimport { join, basename, extname } from 'path';\nimport { tmpdir } from 'os';\nimport matter from 'gray-matter';\nimport { parse as parseYaml } from 'yaml';\nimport { fixCapability, installCapability, downloadCapability } from './intake.js';\nimport { autoProcessFile } from './auto-processor.js';\nimport { discoverSources, loadAllSources } from './sources.js';\nimport type { Source, SourceDiscoveryResult } from './sources.js';\nimport { log } from '../core/logger.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\n/** Detected source format of a file to be installed. */\nexport type SourceFormat =\n | 'harness' // Already harness convention (frontmatter + L0/L1)\n | 'claude-skill' // Claude Code SKILL.md (plain markdown, no frontmatter)\n | 'faf-yaml' // .faf YAML format\n | 'raw-markdown' // Plain markdown with no harness structure\n | 'bash-hook' // Bash/shell script (hook or workflow)\n | 'mcp-config' // MCP server configuration (JSON/YAML)\n | 'unknown';\n\n/** Result of format detection. */\nexport interface FormatDetection {\n /** Detected format */\n format: SourceFormat;\n /** Inferred primitive type (skill, agent, rule, etc.) */\n primitiveType: string | null;\n /** Confidence score (0-1) */\n confidence: number;\n /** Reasons for the detection */\n reasons: string[];\n}\n\n/** Result of a universal install operation. */\nexport interface UniversalInstallResult {\n /** Whether installation succeeded */\n installed: boolean;\n /** Source reference that was resolved */\n source: string;\n /** Detected format */\n format: FormatDetection;\n /** Path where the file was installed */\n destination: string;\n /** Fixes applied during normalization */\n fixes: string[];\n /** Errors encountered */\n errors: string[];\n /** Suggested dependencies to install */\n suggestedDependencies: string[];\n}\n\n/** Options for the universal installer. */\nexport interface UniversalInstallOptions {\n /** Override the detected primitive type (skill, rule, agent, etc.) */\n type?: string;\n /** Override the generated ID */\n id?: string;\n /** Force install even if validation has warnings */\n force?: boolean;\n /** Skip auto-fix (frontmatter, L0/L1 generation) */\n skipFix?: boolean;\n /** Additional tags to add */\n tags?: string[];\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\nconst VALID_TYPES = ['rule', 'instinct', 'skill', 'playbook', 'workflow', 'tool', 'agent'];\n\nconst TYPE_DIRS: Record<string, string> = {\n rule: 'rules',\n instinct: 'instincts',\n skill: 'skills',\n playbook: 'playbooks',\n workflow: 'workflows',\n tool: 'tools',\n agent: 'agents',\n};\n\n// ─── Format Detection ────────────────────────────────────────────────────────\n\n/**\n * Detect the format of a file based on its content and extension.\n *\n * Detection heuristics:\n * - Has `---` frontmatter with `id:` + `status:` → harness convention\n * - Has `---` frontmatter but missing harness fields → raw-markdown\n * - `.faf` or `.yaml`/`.yml` with `type:` + `content:` keys → faf-yaml\n * - `.sh`/`.bash` or starts with `#!/` → bash-hook\n * - JSON/YAML with `mcpServers` or `servers` → mcp-config\n * - Plain markdown with no frontmatter → claude-skill or raw-markdown\n */\nexport function detectFormat(content: string, filename: string): FormatDetection {\n const ext = extname(filename).toLowerCase();\n const reasons: string[] = [];\n let format: SourceFormat = 'unknown';\n let primitiveType: string | null = null;\n let confidence = 0;\n\n // Check for bash/shell scripts\n if (ext === '.sh' || ext === '.bash' || content.trimStart().startsWith('#!/')) {\n format = 'bash-hook';\n primitiveType = 'workflow';\n confidence = 0.9;\n reasons.push('Shell script detected (shebang or .sh extension)');\n\n // Hooks are typically short scripts with specific patterns\n if (content.includes('hook') || content.includes('pre-commit') || content.includes('post-')) {\n primitiveType = 'workflow';\n reasons.push('Hook pattern detected in content');\n }\n\n return { format, primitiveType, confidence, reasons };\n }\n\n // Check for JSON/YAML MCP configs\n if (ext === '.json') {\n try {\n const parsed = JSON.parse(content) as Record<string, unknown>;\n if (parsed.mcpServers || parsed.servers || parsed.command || parsed.args) {\n format = 'mcp-config';\n primitiveType = 'tool';\n confidence = 0.9;\n reasons.push('MCP configuration JSON detected');\n return { format, primitiveType, confidence, reasons };\n }\n } catch {\n // Not valid JSON, continue\n }\n }\n\n // Check for .faf YAML format\n if (ext === '.faf' || ext === '.yaml' || ext === '.yml') {\n try {\n const parsed = parseYaml(content) as Record<string, unknown>;\n if (parsed.type && parsed.content) {\n format = 'faf-yaml';\n primitiveType = inferTypeFromFafType(String(parsed.type));\n confidence = 0.9;\n reasons.push(`.faf YAML format with type: ${parsed.type}`);\n return { format, primitiveType, confidence, reasons };\n }\n // YAML with mcpServers\n if (parsed.mcpServers || parsed.servers) {\n format = 'mcp-config';\n primitiveType = 'tool';\n confidence = 0.85;\n reasons.push('MCP configuration YAML detected');\n return { format, primitiveType, confidence, reasons };\n }\n } catch {\n // Not valid YAML, continue\n }\n }\n\n // Check for markdown content\n if (ext === '.md' || ext === '' || !ext) {\n // Try to parse frontmatter\n try {\n const parsed = matter(content);\n const data = parsed.data as Record<string, unknown>;\n\n if (data.id && data.status) {\n // Has harness-style frontmatter\n format = 'harness';\n confidence = 0.95;\n reasons.push('Harness frontmatter detected (id + status fields)');\n\n // Detect type from tags\n const tags = Array.isArray(data.tags)\n ? (data.tags as string[]).map((t) => String(t).toLowerCase())\n : [];\n for (const type of VALID_TYPES) {\n if (tags.includes(type)) {\n primitiveType = type;\n break;\n }\n }\n\n return { format, primitiveType, confidence, reasons };\n }\n\n if (Object.keys(data).length > 0) {\n // Has some frontmatter but not harness convention\n format = 'raw-markdown';\n confidence = 0.7;\n reasons.push('Markdown with non-harness frontmatter');\n }\n } catch {\n // No frontmatter or parse error\n }\n\n // Check for Claude Code SKILL.md patterns\n if (format === 'unknown' || format === 'raw-markdown') {\n const isClaudeSkill = detectClaudeSkillPattern(content, filename);\n if (isClaudeSkill) {\n format = 'claude-skill';\n primitiveType = 'skill';\n confidence = 0.8;\n reasons.push('Claude Code SKILL.md pattern detected');\n return { format, primitiveType, confidence, reasons };\n }\n }\n\n // Plain markdown — infer type from content\n if (format === 'unknown') {\n format = 'raw-markdown';\n confidence = 0.5;\n reasons.push('Plain markdown without frontmatter');\n }\n\n // Try to infer type from content/filename\n if (!primitiveType) {\n primitiveType = inferTypeFromContent(content, filename);\n if (primitiveType) {\n reasons.push(`Type inferred from content/filename: ${primitiveType}`);\n }\n }\n\n return { format, primitiveType, confidence, reasons };\n }\n\n return { format, primitiveType, confidence, reasons };\n}\n\n// ─── Format Normalization ────────────────────────────────────────────────────\n\n/**\n * Normalize content from any detected format to harness convention.\n * Returns the normalized markdown content ready for writing.\n */\nexport function normalizeToHarness(\n content: string,\n filename: string,\n detection: FormatDetection,\n options?: UniversalInstallOptions,\n): { content: string; filename: string; fixes: string[] } {\n const fixes: string[] = [];\n const type = options?.type ?? detection.primitiveType;\n\n switch (detection.format) {\n case 'harness':\n // Already in harness format — just pass through\n return { content, filename, fixes: ['Already in harness format'] };\n\n case 'claude-skill':\n return normalizeClaudeSkill(content, filename, type, options, fixes);\n\n case 'faf-yaml':\n return normalizeFafYaml(content, filename, type, options, fixes);\n\n case 'raw-markdown':\n return normalizeRawMarkdown(content, filename, type, options, fixes);\n\n case 'bash-hook':\n return normalizeBashHook(content, filename, type, options, fixes);\n\n case 'mcp-config':\n return normalizeMcpConfig(content, filename, options, fixes);\n\n default:\n return normalizeRawMarkdown(content, filename, type, options, fixes);\n }\n}\n\n/**\n * Convert Claude Code SKILL.md to harness convention.\n * Claude skills are plain markdown — add frontmatter + L0/L1.\n */\nfunction normalizeClaudeSkill(\n content: string,\n filename: string,\n type: string | null,\n options: UniversalInstallOptions | undefined,\n fixes: string[],\n): { content: string; filename: string; fixes: string[] } {\n const id = options?.id ?? deriveId(filename);\n const primitiveType = type ?? 'skill';\n const tags = [primitiveType, ...(options?.tags ?? [])];\n\n // Extract first heading as title\n const headingMatch = content.match(/^#\\s+(.+)$/m);\n const title = headingMatch ? headingMatch[1].trim() : id;\n\n const frontmatter: Record<string, unknown> = {\n id,\n created: new Date().toISOString().split('T')[0],\n author: 'human',\n status: 'active',\n tags,\n };\n\n // Generate L0 from title/first heading\n const l0 = title.length > 120 ? title.slice(0, 117) + '...' : title;\n\n // Generate L1 from first paragraph\n const paragraphs = content.split(/\\n{2,}/).filter((p) => {\n const trimmed = p.trim();\n return trimmed.length > 0 && !trimmed.startsWith('#') && !trimmed.startsWith('<!--');\n });\n const l1 = paragraphs.length > 0\n ? paragraphs[0].replace(/\\n/g, ' ').trim().slice(0, 300)\n : '';\n\n let body = `<!-- L0: ${l0} -->\\n`;\n if (l1) {\n body += `<!-- L1: ${l1} -->\\n`;\n }\n body += '\\n' + content;\n\n const result = matter.stringify(body, frontmatter);\n fixes.push('Added harness frontmatter (id, status, tags)');\n fixes.push(`Generated L0 from heading: \"${l0}\"`);\n if (l1) fixes.push('Generated L1 from first paragraph');\n\n const outFilename = ensureMdExtension(filename);\n return { content: result, filename: outFilename, fixes };\n}\n\n/**\n * Convert .faf YAML format to harness markdown.\n */\nfunction normalizeFafYaml(\n content: string,\n filename: string,\n type: string | null,\n options: UniversalInstallOptions | undefined,\n fixes: string[],\n): { content: string; filename: string; fixes: string[] } {\n let parsed: Record<string, unknown>;\n try {\n parsed = parseYaml(content) as Record<string, unknown>;\n } catch {\n fixes.push('Failed to parse YAML — treating as raw markdown');\n return normalizeRawMarkdown(content, filename, type, options, fixes);\n }\n\n const id = options?.id ?? String(parsed.id ?? deriveId(filename));\n const fafType = String(parsed.type ?? 'skill');\n const primitiveType = type ?? inferTypeFromFafType(fafType) ?? 'skill';\n const title = String(parsed.title ?? parsed.name ?? id);\n const description = String(parsed.description ?? '');\n const fafContent = String(parsed.content ?? '');\n const fafTags = Array.isArray(parsed.tags)\n ? (parsed.tags as string[]).map(String)\n : [];\n\n const tags = [primitiveType, ...fafTags, ...(options?.tags ?? [])];\n\n const frontmatter: Record<string, unknown> = {\n id,\n created: new Date().toISOString().split('T')[0],\n author: 'human',\n status: 'active',\n tags: [...new Set(tags)],\n };\n\n const l0 = title.length > 120 ? title.slice(0, 117) + '...' : title;\n const l1 = description.length > 300 ? description.slice(0, 297) + '...' : description;\n\n let body = `<!-- L0: ${l0} -->\\n`;\n if (l1) body += `<!-- L1: ${l1} -->\\n`;\n body += `\\n# ${title}\\n\\n`;\n if (description) body += `${description}\\n\\n`;\n if (fafContent) body += fafContent + '\\n';\n\n const result = matter.stringify(body, frontmatter);\n fixes.push('Converted .faf YAML to harness markdown');\n fixes.push(`Added frontmatter (id: ${id}, type: ${primitiveType})`);\n\n const outFilename = deriveId(filename) + '.md';\n return { content: result, filename: outFilename, fixes };\n}\n\n/**\n * Normalize raw markdown (no frontmatter or non-harness frontmatter).\n */\nfunction normalizeRawMarkdown(\n content: string,\n filename: string,\n type: string | null,\n options: UniversalInstallOptions | undefined,\n fixes: string[],\n): { content: string; filename: string; fixes: string[] } {\n const id = options?.id ?? deriveId(filename);\n const primitiveType = type ?? 'skill';\n const tags = [primitiveType, ...(options?.tags ?? [])];\n\n // Try to preserve any existing frontmatter\n let parsed: ReturnType<typeof matter>;\n try {\n parsed = matter(content);\n } catch {\n parsed = { data: {}, content, orig: '', excerpt: '', language: '', matter: '', stringify: () => '' } as ReturnType<typeof matter>;\n }\n\n const data = parsed.data as Record<string, unknown>;\n\n // Set required harness fields — options override existing values\n if (options?.id || !data.id) {\n data.id = id;\n fixes.push(`Set id: \"${id}\"`);\n }\n if (!data.status) {\n data.status = 'active';\n fixes.push('Added status: \"active\"');\n }\n if (!data.created) {\n data.created = new Date().toISOString().split('T')[0];\n fixes.push('Added created date');\n }\n if (!data.author || !['human', 'agent', 'infrastructure'].includes(String(data.author))) {\n data.author = 'human';\n fixes.push('Added author: \"human\"');\n }\n if (!Array.isArray(data.tags) || data.tags.length === 0) {\n data.tags = [...new Set(tags)];\n fixes.push(`Added tags: [${(data.tags as string[]).join(', ')}]`);\n }\n\n let body = parsed.content;\n\n // Add L0 if missing\n const l0Regex = /<!--\\s*L0:\\s*(.*?)\\s*-->/;\n if (!l0Regex.test(body)) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n const firstLine = body.split('\\n').find((line) => line.trim().length > 0);\n const summary = headingMatch ? headingMatch[1].trim() : (firstLine?.trim() ?? id);\n const l0 = summary.length > 120 ? summary.slice(0, 117) + '...' : summary;\n body = `<!-- L0: ${l0} -->\\n${body}`;\n fixes.push(`Generated L0: \"${l0}\"`);\n }\n\n // Add L1 if missing\n const l1Regex = /<!--\\s*L1:\\s*([\\s\\S]*?)\\s*-->/;\n if (!l1Regex.test(body)) {\n const paragraphs = body.split(/\\n{2,}/).filter((p) => {\n const trimmed = p.trim();\n return trimmed.length > 0 && !trimmed.startsWith('<!--') && !trimmed.startsWith('#');\n });\n if (paragraphs.length > 0) {\n const para = paragraphs[0].replace(/\\n/g, ' ').trim();\n const l1 = para.length > 300 ? para.slice(0, 297) + '...' : para;\n const l0Pos = body.indexOf('-->');\n if (l0Pos !== -1) {\n const insertPos = l0Pos + 3;\n body = body.slice(0, insertPos) + `\\n<!-- L1: ${l1} -->` + body.slice(insertPos);\n } else {\n body = `<!-- L1: ${l1} -->\\n${body}`;\n }\n fixes.push('Generated L1 from first paragraph');\n }\n }\n\n const result = matter.stringify(body, data);\n const outFilename = ensureMdExtension(filename);\n return { content: result, filename: outFilename, fixes };\n}\n\n/**\n * Wrap a bash hook script in harness markdown.\n */\nfunction normalizeBashHook(\n content: string,\n filename: string,\n type: string | null,\n options: UniversalInstallOptions | undefined,\n fixes: string[],\n): { content: string; filename: string; fixes: string[] } {\n const id = options?.id ?? deriveId(filename);\n const primitiveType = type ?? 'workflow';\n const tags = [primitiveType, 'hook', ...(options?.tags ?? [])];\n\n // Extract description from comments at top of script\n const commentLines = content.split('\\n')\n .filter((line) => line.startsWith('#') && !line.startsWith('#!'))\n .map((line) => line.replace(/^#\\s?/, '').trim())\n .filter((line) => line.length > 0);\n\n const description = commentLines.length > 0\n ? commentLines.slice(0, 3).join(' ')\n : `Bash hook: ${id}`;\n\n const frontmatter: Record<string, unknown> = {\n id,\n created: new Date().toISOString().split('T')[0],\n author: 'human',\n status: 'active',\n tags: [...new Set(tags)],\n };\n\n const l0 = description.length > 120 ? description.slice(0, 117) + '...' : description;\n\n let body = `<!-- L0: ${l0} -->\\n\\n`;\n body += `# ${id}\\n\\n`;\n body += `${description}\\n\\n`;\n body += '```bash\\n';\n body += content;\n if (!content.endsWith('\\n')) body += '\\n';\n body += '```\\n';\n\n const result = matter.stringify(body, frontmatter);\n fixes.push('Wrapped bash script in harness markdown');\n fixes.push(`Added frontmatter (id: ${id}, type: ${primitiveType})`);\n\n const outFilename = deriveId(filename) + '.md';\n return { content: result, filename: outFilename, fixes };\n}\n\n/**\n * Convert an MCP config to harness tool documentation.\n */\nfunction normalizeMcpConfig(\n content: string,\n filename: string,\n options: UniversalInstallOptions | undefined,\n fixes: string[],\n): { content: string; filename: string; fixes: string[] } {\n const id = options?.id ?? deriveId(filename);\n const tags = ['tool', 'mcp', ...(options?.tags ?? [])];\n\n // Try to parse config\n let config: Record<string, unknown> = {};\n const ext = extname(filename).toLowerCase();\n try {\n if (ext === '.json') {\n config = JSON.parse(content) as Record<string, unknown>;\n } else {\n config = parseYaml(content) as Record<string, unknown>;\n }\n } catch {\n fixes.push('Failed to parse MCP config');\n }\n\n const serverName = String(config.name ?? config.command ?? id);\n const description = String(config.description ?? `MCP server: ${serverName}`);\n\n const frontmatter: Record<string, unknown> = {\n id,\n created: new Date().toISOString().split('T')[0],\n author: 'human',\n status: 'active',\n tags: [...new Set(tags)],\n };\n\n const l0 = description.length > 120 ? description.slice(0, 117) + '...' : description;\n\n let body = `<!-- L0: ${l0} -->\\n\\n`;\n body += `# MCP Server: ${serverName}\\n\\n`;\n body += `${description}\\n\\n`;\n body += '## Configuration\\n\\n';\n body += '```json\\n';\n body += JSON.stringify(config, null, 2);\n body += '\\n```\\n';\n\n const result = matter.stringify(body, frontmatter);\n fixes.push('Converted MCP config to harness tool documentation');\n fixes.push(`Added frontmatter (id: ${id})`);\n\n const outFilename = deriveId(filename) + '.md';\n return { content: result, filename: outFilename, fixes };\n}\n\n// ─── Source Resolution ───────────────────────────────────────────────────────\n\n/**\n * Resolve a source reference to a local file path.\n *\n * Supports:\n * - Local file paths (absolute or relative)\n * - HTTPS URLs (GitHub raw, any markdown URL)\n * - Source query (searches registered sources)\n *\n * @returns Path to a local file (downloaded if remote)\n */\nexport async function resolveSource(\n source: string,\n harnessDir: string,\n): Promise<{ localPath: string; originalSource: string; error?: string }> {\n // Case 1: Local file path\n if (existsSync(source)) {\n return { localPath: source, originalSource: source };\n }\n\n // Case 2: URL\n if (source.startsWith('https://') || source.startsWith('http://')) {\n // Convert GitHub URL to raw if needed\n const rawUrl = convertToRawUrl(source);\n const result = await downloadCapability(rawUrl);\n if (result.downloaded) {\n return { localPath: result.localPath, originalSource: source };\n }\n return { localPath: '', originalSource: source, error: result.error };\n }\n\n // Case 3: Source registry lookup — search known sources\n const results = discoverSources(harnessDir, source, { maxResults: 1 });\n if (results.length > 0) {\n const hit = results[0];\n // If the source is a GitHub source, construct a raw URL\n if (hit.source.type === 'github') {\n const rawUrl = convertToRawUrl(hit.url);\n const result = await downloadCapability(rawUrl);\n if (result.downloaded) {\n return { localPath: result.localPath, originalSource: source };\n }\n return { localPath: '', originalSource: source, error: result.error };\n }\n return { localPath: '', originalSource: source, error: `Source \"${hit.source.name}\" is type \"${hit.source.type}\" — direct install not yet supported for this type` };\n }\n\n return { localPath: '', originalSource: source, error: `Could not resolve \"${source}\" — not a local file, URL, or known source` };\n}\n\n// ─── Main Install Function ───────────────────────────────────────────────────\n\n/**\n * Universal install: resolve → detect → normalize → fix → install.\n *\n * Accepts a local path, URL, or search query. Detects the format,\n * normalizes to harness convention, applies auto-fixes, and installs\n * to the correct directory.\n *\n * @param harnessDir - Harness directory\n * @param source - File path, URL, or name to install\n * @param options - Installation options\n * @returns Install result with status, fixes, errors, dependency hints\n */\nexport async function universalInstall(\n harnessDir: string,\n source: string,\n options?: UniversalInstallOptions,\n): Promise<UniversalInstallResult> {\n const result: UniversalInstallResult = {\n installed: false,\n source,\n format: { format: 'unknown', primitiveType: null, confidence: 0, reasons: [] },\n destination: '',\n fixes: [],\n errors: [],\n suggestedDependencies: [],\n };\n\n // Step 1: Resolve source to local file\n const resolved = await resolveSource(source, harnessDir);\n if (resolved.error || !resolved.localPath) {\n result.errors.push(resolved.error ?? 'Failed to resolve source');\n return result;\n }\n\n // Step 2: Read content\n let content: string;\n try {\n content = readFileSync(resolved.localPath, 'utf-8');\n } catch (err) {\n result.errors.push(`Failed to read file: ${err instanceof Error ? err.message : String(err)}`);\n return result;\n }\n\n if (content.trim().length === 0) {\n result.errors.push('File is empty');\n return result;\n }\n\n // Step 3: Detect format\n const filename = basename(resolved.localPath);\n const detection = detectFormat(content, filename);\n result.format = detection;\n\n // Step 4: Normalize to harness convention\n const normalized = normalizeToHarness(content, filename, detection, options);\n result.fixes.push(...normalized.fixes);\n\n // Step 5: Write normalized content to temp file for installation\n const tempDir = join(tmpdir(), 'harness-install');\n mkdirSync(tempDir, { recursive: true });\n const tempPath = join(tempDir, normalized.filename);\n writeFileSync(tempPath, normalized.content, 'utf-8');\n\n // Step 6: Apply auto-fix if not skipped\n if (!options?.skipFix) {\n const fixResult = fixCapability(tempPath);\n result.fixes.push(...fixResult.fixes_applied);\n\n if (!fixResult.valid && !options?.force) {\n result.errors.push(...fixResult.errors);\n return result;\n }\n }\n\n // Step 7: Install via existing pipeline\n const installResult = installCapability(harnessDir, tempPath);\n result.installed = installResult.installed;\n result.destination = installResult.destination;\n\n if (!installResult.installed) {\n result.errors.push(...installResult.evalResult.errors);\n // If force mode, try direct copy\n if (options?.force && detection.primitiveType) {\n const targetDir = join(harnessDir, TYPE_DIRS[detection.primitiveType] ?? 'skills');\n if (!existsSync(targetDir)) mkdirSync(targetDir, { recursive: true });\n const dest = join(targetDir, normalized.filename);\n copyFileSync(tempPath, dest);\n result.installed = true;\n result.destination = dest;\n result.fixes.push('Force-installed despite validation errors');\n }\n }\n\n // Step 8: Scan for dependency hints\n result.suggestedDependencies = extractDependencyHints(normalized.content);\n\n return result;\n}\n\n/**\n * Install from a URL (convenience wrapper).\n */\nexport async function installFromUrl(\n harnessDir: string,\n url: string,\n options?: UniversalInstallOptions,\n): Promise<UniversalInstallResult> {\n return universalInstall(harnessDir, url, options);\n}\n\n/**\n * Install from a local file path (convenience wrapper).\n */\nexport async function installFromFile(\n harnessDir: string,\n filePath: string,\n options?: UniversalInstallOptions,\n): Promise<UniversalInstallResult> {\n return universalInstall(harnessDir, filePath, options);\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction deriveId(filename: string): string {\n const base = basename(filename).replace(/\\.(md|faf|yaml|yml|json|sh|bash)$/i, '');\n return base.replace(/[^a-z0-9-]/gi, '-').toLowerCase();\n}\n\nfunction ensureMdExtension(filename: string): string {\n if (filename.endsWith('.md')) return filename;\n return deriveId(filename) + '.md';\n}\n\n/**\n * Convert a GitHub URL to its raw content URL.\n *\n * Handles:\n * - github.com/owner/repo/blob/branch/path → raw.githubusercontent.com/owner/repo/branch/path\n * - Already raw.githubusercontent.com URLs → pass through\n * - Other URLs → pass through\n */\nexport function convertToRawUrl(url: string): string {\n // Already raw\n if (url.includes('raw.githubusercontent.com')) return url;\n\n // GitHub blob URL → raw\n const blobMatch = url.match(\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/(.+)$/,\n );\n if (blobMatch) {\n const [, owner, repo, rest] = blobMatch;\n return `https://raw.githubusercontent.com/${owner}/${repo}/${rest}`;\n }\n\n return url;\n}\n\n/**\n * Detect if content matches Claude Code SKILL.md patterns.\n * Claude skills are plain markdown with specific structural patterns.\n */\nfunction detectClaudeSkillPattern(content: string, filename: string): boolean {\n const nameLower = filename.toLowerCase();\n\n // Filename patterns\n if (nameLower === 'skill.md' || nameLower.endsWith('-skill.md') || nameLower.endsWith('_skill.md')) {\n return true;\n }\n\n // Content patterns common in Claude Code skills\n const patterns = [\n /^#\\s+.+skill/im,\n /instructions?\\s+for\\s+/i,\n /when\\s+(the\\s+)?user\\s+(asks?|wants?|needs?|requests?)/i,\n /you\\s+(should|must|will)\\s+/i,\n ];\n\n let matches = 0;\n for (const pattern of patterns) {\n if (pattern.test(content)) matches++;\n }\n\n // Need at least 2 pattern matches to classify as Claude skill\n // (plain markdown + instructional tone)\n return matches >= 2 && !content.startsWith('---');\n}\n\nfunction inferTypeFromFafType(fafType: string): string | null {\n const typeMap: Record<string, string> = {\n skill: 'skill',\n agent: 'agent',\n rule: 'rule',\n playbook: 'playbook',\n workflow: 'workflow',\n tool: 'tool',\n instinct: 'instinct',\n hook: 'workflow',\n template: 'skill',\n plugin: 'skill',\n };\n\n return typeMap[fafType.toLowerCase()] ?? null;\n}\n\nfunction inferTypeFromContent(content: string, filename: string): string | null {\n const lower = content.toLowerCase();\n const nameLower = filename.toLowerCase();\n\n // From filename\n if (nameLower.includes('rule')) return 'rule';\n if (nameLower.includes('agent')) return 'agent';\n if (nameLower.includes('playbook')) return 'playbook';\n if (nameLower.includes('workflow')) return 'workflow';\n if (nameLower.includes('instinct')) return 'instinct';\n if (nameLower.includes('tool')) return 'tool';\n if (nameLower.includes('skill')) return 'skill';\n\n // From content patterns\n if (lower.includes('# rule:') || lower.includes('## rules')) return 'rule';\n if (lower.includes('# agent:') || lower.includes('## agent')) return 'agent';\n if (lower.includes('# playbook:') || lower.includes('## playbook')) return 'playbook';\n if (lower.includes('# skill:') || lower.includes('## skill')) return 'skill';\n if (lower.includes('# workflow:') || lower.includes('## workflow')) return 'workflow';\n if (lower.includes('# tool:') || lower.includes('## tool')) return 'tool';\n\n // Default for markdown without clear type\n return null;\n}\n\n/**\n * Extract dependency hints from content.\n * Looks for references to tools, skills, or other primitives.\n */\nfunction extractDependencyHints(content: string): string[] {\n const hints: string[] = [];\n const seen = new Set<string>();\n\n // Look for \"requires:\" or \"depends:\" in frontmatter\n try {\n const parsed = matter(content);\n const data = parsed.data as Record<string, unknown>;\n if (Array.isArray(data.requires)) {\n for (const dep of data.requires as string[]) {\n if (!seen.has(dep)) {\n hints.push(dep);\n seen.add(dep);\n }\n }\n }\n if (Array.isArray(data.depends)) {\n for (const dep of data.depends as string[]) {\n if (!seen.has(dep)) {\n hints.push(dep);\n seen.add(dep);\n }\n }\n }\n if (Array.isArray(data.related)) {\n for (const dep of data.related as string[]) {\n if (!seen.has(dep)) {\n hints.push(dep);\n seen.add(dep);\n }\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return hints;\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';\nimport { join, relative } from 'path';\nimport { execSync } from 'child_process';\nimport { log } from '../core/logger.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface VersionEntry {\n /** Git commit hash (short) */\n hash: string;\n /** Full commit hash */\n fullHash: string;\n /** Commit message */\n message: string;\n /** Timestamp (ISO string) */\n timestamp: string;\n /** Files changed in this version */\n filesChanged: string[];\n /** Author name */\n author: string;\n /** Tag if one was applied */\n tag?: string;\n}\n\nexport interface VersionLog {\n /** Ordered list of versions (newest first) */\n entries: VersionEntry[];\n /** Current HEAD hash */\n currentHash: string;\n /** Current tag if any */\n currentTag?: string;\n}\n\nexport interface RollbackResult {\n success: boolean;\n /** Hash we rolled back to */\n targetHash: string;\n /** Files that were restored */\n restoredFiles: string[];\n /** Error message if failed */\n error?: string;\n}\n\nexport interface SnapshotResult {\n success: boolean;\n /** New commit hash */\n hash: string;\n /** Files included in snapshot */\n files: string[];\n /** Error if failed */\n error?: string;\n}\n\nexport interface DiffEntry {\n file: string;\n status: 'added' | 'modified' | 'deleted' | 'renamed';\n /** Lines added */\n additions?: number;\n /** Lines deleted */\n deletions?: number;\n}\n\nexport interface VersionDiff {\n from: string;\n to: string;\n entries: DiffEntry[];\n summary: string;\n}\n\n// ─── Git Helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Identity used for internal harness versioning commits. This keeps harness\n * snapshots functional on machines (and CI runners) where the user has no\n * global `user.name` / `user.email` configured. Harness versioning is an\n * internal bookkeeping feature; the commits never leave the user's disk,\n * so a synthetic identity is appropriate and doesn't pollute user git history.\n */\nconst HARNESS_GIT_AUTHOR_NAME = 'agent-harness';\nconst HARNESS_GIT_AUTHOR_EMAIL = 'versioning@agent-harness.local';\n\n/**\n * Execute a git command in the harness directory.\n * Returns stdout as a string, or null if the command failed.\n *\n * All invocations automatically inject a synthetic author identity so commits\n * succeed on machines without global git user config (e.g. CI runners, Docker\n * containers, fresh VMs).\n */\nfunction gitExec(harnessDir: string, args: string): string | null {\n try {\n const result = execSync(\n `git -c user.name=\"${HARNESS_GIT_AUTHOR_NAME}\" -c user.email=\"${HARNESS_GIT_AUTHOR_EMAIL}\" ${args}`,\n {\n cwd: harnessDir,\n encoding: 'utf-8',\n timeout: 10000,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n return result.trim();\n } catch {\n return null;\n }\n}\n\n/**\n * Check if the harness directory is a git repository.\n */\nexport function isGitRepo(harnessDir: string): boolean {\n return gitExec(harnessDir, 'rev-parse --is-inside-work-tree') === 'true';\n}\n\n/**\n * Initialize a git repository in the harness directory.\n * If already initialized, this is a no-op.\n */\nexport function initVersioning(harnessDir: string): boolean {\n if (isGitRepo(harnessDir)) return true;\n\n const result = gitExec(harnessDir, 'init');\n if (result === null) {\n log.warn('Failed to initialize git repository for versioning');\n return false;\n }\n\n // Create .gitignore for non-versioned files\n const gitignorePath = join(harnessDir, '.gitignore');\n if (!existsSync(gitignorePath)) {\n const gitignoreContent = [\n '# Agent harness versioning',\n 'memory/sessions/',\n 'memory/metrics.json',\n 'memory/health.json',\n 'memory/costs.json',\n 'memory/rate-limits.json',\n 'memory/emotional-history.jsonl',\n 'memory/locks/',\n '.installed/',\n 'archive/',\n 'node_modules/',\n ].join('\\n') + '\\n';\n writeFileSync(gitignorePath, gitignoreContent, 'utf-8');\n }\n\n // Initial commit\n gitExec(harnessDir, 'add -A');\n gitExec(harnessDir, 'commit -m \"Initial harness version\" --allow-empty');\n\n return true;\n}\n\n// ─── Snapshot (Commit) ──────────────────────────────────────────────────────\n\n/**\n * Take a versioned snapshot of the current harness state.\n * Stages all changes and creates a git commit.\n *\n * @param harnessDir - Harness directory path\n * @param message - Commit message describing the change\n * @param options.tag - Optional tag to apply to this version\n */\nexport function snapshot(\n harnessDir: string,\n message: string,\n options?: { tag?: string },\n): SnapshotResult {\n if (!isGitRepo(harnessDir)) {\n if (!initVersioning(harnessDir)) {\n return { success: false, hash: '', files: [], error: 'Failed to initialize git repository' };\n }\n }\n\n // Stage all tracked primitive directories\n const dirsToTrack = [\n 'rules', 'instincts', 'skills', 'playbooks', 'workflows',\n 'tools', 'agents', 'memory/journal', 'memory/state.md',\n 'memory/scratch.md', 'memory/state-ownership.json',\n 'memory/emotional-state.json',\n 'CORE.md', 'SYSTEM.md', 'config.yaml',\n ];\n\n const stagedFiles: string[] = [];\n for (const dir of dirsToTrack) {\n const fullPath = join(harnessDir, dir);\n if (existsSync(fullPath)) {\n gitExec(harnessDir, `add \"${dir}\"`);\n stagedFiles.push(dir);\n }\n }\n\n // Check if there are staged changes\n const status = gitExec(harnessDir, 'diff --cached --name-only');\n if (!status || status.length === 0) {\n return { success: true, hash: getHeadHash(harnessDir) ?? '', files: [], error: 'No changes to commit' };\n }\n\n const changedFiles = status.split('\\n').filter(Boolean);\n\n // Commit\n const commitResult = gitExec(harnessDir, `commit -m \"${escapeMessage(message)}\"`);\n if (commitResult === null) {\n return { success: false, hash: '', files: changedFiles, error: 'Git commit failed' };\n }\n\n const hash = getHeadHash(harnessDir) ?? '';\n\n // Tag if requested\n if (options?.tag) {\n gitExec(harnessDir, `tag \"${escapeMessage(options.tag)}\"`);\n }\n\n return { success: true, hash, files: changedFiles };\n}\n\n// ─── Version Log ────────────────────────────────────────────────────────────\n\n/**\n * Get the version history of the harness.\n *\n * @param harnessDir - Harness directory path\n * @param options.limit - Maximum entries to return (default: 50)\n * @param options.file - Filter to a specific file path\n */\nexport function getVersionLog(\n harnessDir: string,\n options?: { limit?: number; file?: string },\n): VersionLog {\n if (!isGitRepo(harnessDir)) {\n return { entries: [], currentHash: '' };\n }\n\n const limit = options?.limit ?? 50;\n const fileFilter = options?.file ? ` -- \"${options.file}\"` : '';\n const format = '%H|%h|%s|%aI|%an';\n\n const logOutput = gitExec(harnessDir, `log --format=\"${format}\" -n ${limit}${fileFilter}`);\n if (!logOutput) {\n return { entries: [], currentHash: getHeadHash(harnessDir) ?? '' };\n }\n\n const entries: VersionEntry[] = [];\n\n for (const line of logOutput.split('\\n')) {\n if (!line.trim()) continue;\n const parts = line.split('|');\n if (parts.length < 5) continue;\n\n const fullHash = parts[0];\n const hash = parts[1];\n\n // Get files changed in this commit\n const filesOutput = gitExec(harnessDir, `diff-tree --no-commit-id --name-only -r ${fullHash}`);\n const filesChanged = filesOutput ? filesOutput.split('\\n').filter(Boolean) : [];\n\n // Check for tags\n const tagOutput = gitExec(harnessDir, `tag --points-at ${fullHash}`);\n const tag = tagOutput && tagOutput.length > 0 ? tagOutput.split('\\n')[0] : undefined;\n\n entries.push({\n hash,\n fullHash,\n message: parts[2],\n timestamp: parts[3],\n author: parts.slice(4).join('|'),\n filesChanged,\n tag,\n });\n }\n\n const currentHash = getHeadHash(harnessDir) ?? '';\n const currentTag = entries.length > 0 && entries[0].tag ? entries[0].tag : undefined;\n\n return { entries, currentHash, currentTag };\n}\n\n// ─── Diff ───────────────────────────────────────────────────────────────────\n\n/**\n * Get the diff between two versions (or between a version and HEAD).\n */\nexport function getVersionDiff(\n harnessDir: string,\n from: string,\n to?: string,\n): VersionDiff {\n if (!isGitRepo(harnessDir)) {\n return { from, to: to ?? 'HEAD', entries: [], summary: 'Not a git repository' };\n }\n\n const target = to ?? 'HEAD';\n const diffOutput = gitExec(harnessDir, `diff --numstat ${from} ${target}`);\n const nameOutput = gitExec(harnessDir, `diff --name-status ${from} ${target}`);\n\n const entries: DiffEntry[] = [];\n\n if (nameOutput) {\n const nameLines = nameOutput.split('\\n').filter(Boolean);\n const statLines = (diffOutput ?? '').split('\\n').filter(Boolean);\n\n for (let i = 0; i < nameLines.length; i++) {\n const nameParts = nameLines[i].split('\\t');\n const statusChar = nameParts[0];\n const file = nameParts[nameParts.length - 1];\n\n let status: DiffEntry['status'] = 'modified';\n if (statusChar === 'A') status = 'added';\n else if (statusChar === 'D') status = 'deleted';\n else if (statusChar.startsWith('R')) status = 'renamed';\n\n const entry: DiffEntry = { file, status };\n\n // Parse numstat for additions/deletions\n if (i < statLines.length) {\n const statParts = statLines[i].split('\\t');\n if (statParts.length >= 2) {\n const adds = parseInt(statParts[0], 10);\n const dels = parseInt(statParts[1], 10);\n if (!isNaN(adds)) entry.additions = adds;\n if (!isNaN(dels)) entry.deletions = dels;\n }\n }\n\n entries.push(entry);\n }\n }\n\n const added = entries.filter((e) => e.status === 'added').length;\n const modified = entries.filter((e) => e.status === 'modified').length;\n const deleted = entries.filter((e) => e.status === 'deleted').length;\n const summary = `${entries.length} file(s) changed: ${added} added, ${modified} modified, ${deleted} deleted`;\n\n return { from, to: target, entries, summary };\n}\n\n// ─── Rollback ───────────────────────────────────────────────────────────────\n\n/**\n * Roll back the harness to a previous version.\n *\n * Creates a new commit that restores files to the state at `targetHash`,\n * preserving full history (no destructive rewrite).\n *\n * @param harnessDir - Harness directory path\n * @param targetHash - Commit hash or tag to roll back to\n */\nexport function rollback(\n harnessDir: string,\n targetHash: string,\n): RollbackResult {\n if (!isGitRepo(harnessDir)) {\n return { success: false, targetHash, restoredFiles: [], error: 'Not a git repository' };\n }\n\n // Verify the target exists\n const resolvedHash = gitExec(harnessDir, `rev-parse --verify ${targetHash}`);\n if (!resolvedHash) {\n return { success: false, targetHash, restoredFiles: [], error: `Invalid version: ${targetHash}` };\n }\n\n // Get files that will change\n const diff = getVersionDiff(harnessDir, 'HEAD', resolvedHash);\n const restoredFiles = diff.entries.map((e) => e.file);\n\n // Restore all tracked files from the target commit\n const restoreResult = gitExec(harnessDir, `checkout ${resolvedHash} -- .`);\n if (restoreResult === null) {\n return { success: false, targetHash: resolvedHash, restoredFiles: [], error: 'Failed to restore files' };\n }\n\n // Stage and commit the rollback\n gitExec(harnessDir, 'add -A');\n const shortHash = resolvedHash.slice(0, 7);\n const commitResult = gitExec(harnessDir, `commit -m \"Rollback to ${shortHash}\" --allow-empty`);\n if (commitResult === null) {\n return { success: false, targetHash: resolvedHash, restoredFiles, error: 'Failed to commit rollback' };\n }\n\n return { success: true, targetHash: resolvedHash, restoredFiles };\n}\n\n// ─── Tag Management ─────────────────────────────────────────────────────────\n\n/**\n * List all version tags.\n */\nexport function listTags(harnessDir: string): Array<{ tag: string; hash: string; message: string }> {\n if (!isGitRepo(harnessDir)) return [];\n\n const output = gitExec(harnessDir, 'tag -l');\n if (!output) return [];\n\n const tags: Array<{ tag: string; hash: string; message: string }> = [];\n\n for (const tag of output.split('\\n').filter(Boolean)) {\n const hash = gitExec(harnessDir, `rev-parse ${tag}`);\n const message = gitExec(harnessDir, `log -1 --format=%s ${tag}`);\n tags.push({\n tag,\n hash: hash ? hash.slice(0, 7) : '',\n message: message ?? '',\n });\n }\n\n return tags;\n}\n\n/**\n * Tag the current version.\n */\nexport function tagVersion(harnessDir: string, tag: string, message?: string): boolean {\n if (!isGitRepo(harnessDir)) return false;\n\n if (message) {\n return gitExec(harnessDir, `tag -a \"${escapeMessage(tag)}\" -m \"${escapeMessage(message)}\"`) !== null;\n }\n return gitExec(harnessDir, `tag \"${escapeMessage(tag)}\"`) !== null;\n}\n\n// ─── Pending Changes ────────────────────────────────────────────────────────\n\n/**\n * Get uncommitted changes in the harness.\n */\nexport function getPendingChanges(harnessDir: string): DiffEntry[] {\n if (!isGitRepo(harnessDir)) return [];\n\n const output = gitExec(harnessDir, 'status --porcelain');\n if (!output) return [];\n\n const entries: DiffEntry[] = [];\n\n for (const line of output.split('\\n').filter(Boolean)) {\n const statusChar = line.substring(0, 2).trim();\n const file = line.substring(3);\n\n let status: DiffEntry['status'] = 'modified';\n if (statusChar === '??' || statusChar === 'A') status = 'added';\n else if (statusChar === 'D') status = 'deleted';\n else if (statusChar.startsWith('R')) status = 'renamed';\n\n entries.push({ file, status });\n }\n\n return entries;\n}\n\n// ─── File History ───────────────────────────────────────────────────────────\n\n/**\n * Get the version history for a specific file.\n */\nexport function getFileHistory(\n harnessDir: string,\n filePath: string,\n options?: { limit?: number },\n): VersionEntry[] {\n const relPath = relative(harnessDir, join(harnessDir, filePath));\n const log = getVersionLog(harnessDir, { limit: options?.limit ?? 20, file: relPath });\n return log.entries;\n}\n\n/**\n * Get the content of a file at a specific version.\n */\nexport function getFileAtVersion(\n harnessDir: string,\n filePath: string,\n hash: string,\n): string | null {\n if (!isGitRepo(harnessDir)) return null;\n\n const relPath = relative(harnessDir, join(harnessDir, filePath));\n return gitExec(harnessDir, `show ${hash}:\"${relPath}\"`);\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction getHeadHash(harnessDir: string): string | null {\n return gitExec(harnessDir, 'rev-parse HEAD');\n}\n\nfunction escapeMessage(msg: string): string {\n return msg.replace(/\"/g, '\\\\\"').replace(/\\n/g, ' ');\n}\n"],"mappings":"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AA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA;AAAA,IACE,SAAS;AA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","names":["generate","getModel","HarnessConfigSchema","writeFileSync","existsSync","mkdirSync","join","join","existsSync","mkdirSync","writeFileSync","relative","readFileSync","writeFileSync","existsSync","readdirSync","join","existsSync","raw","readFileSync","data","writeFileSync","join","readdirSync","relative","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","readFileSync","writeFileSync","existsSync","mkdirSync","join","readFileSync","writeFileSync","readdirSync","existsSync","mkdirSync","join","join","existsSync","mkdirSync","readdirSync","writeFileSync","match","readFileSync","writeFileSync","readdirSync","readFileSync","existsSync","mkdirSync","join","join","existsSync","readFileSync","readdirSync","mkdirSync","writeFileSync","join","existsSync","endTime","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","join","basename","matter","existsSync","raw","readFileSync","matter","basename","writeFileSync","join","mkdirSync","readdirSync","existsSync","readdirSync","mkdirSync","join","relative","existsSync","join","relative","mkdirSync","readdirSync","readFileSync","writeFileSync","existsSync","mkdirSync","join","join","existsSync","raw","readFileSync","mkdirSync","writeFileSync","existsSync","join","join","existsSync","readFileSync","writeFileSync","existsSync","readdirSync","mkdirSync","join","relative","existsSync","readdirSync","join","readFileSync","relative","writeFileSync","mkdirSync","existsSync","join","relative","join","existsSync","relative","readFileSync","existsSync","readdirSync","join","matter","existsSync","readdirSync","join","existsSync","readdirSync","join","snapshot","existsSync","readFileSync","join","raw","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","existsSync","readFileSync","join","basename","existsSync","readFileSync","readdirSync","join","match","cacheKey","raw","Node","_Node","Node","Hono","Request","readFileSync","existsSync","writeFileSync","readdirSync","join","basename","relative","existsSync","readdirSync","join","relative","Hono","snapshot","basename","writeFileSync","readFileSync","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","unlinkSync","join","basename","dirname","relative","join","existsSync","relative","basename","writeFileSync","readFileSync","files","readdirSync","mkdirSync","dirname","unlinkSync","manifest","existsSync","readdirSync","readFileSync","statSync","join","relative","join","existsSync","readdirSync","readFileSync","statSync","relative","match","existsSync","join","join","existsSync","existsSync","join","match","join","existsSync","passed","existsSync","join","join","existsSync","match","readFileSync","writeFileSync","existsSync","join","join","existsSync","raw","readFileSync","writeFileSync","readFileSync","writeFileSync","existsSync","mkdirSync","join","join","existsSync","raw","readFileSync","mkdirSync","writeFileSync","snapshot","existsSync","readFileSync","writeFileSync","mkdirSync","statSync","join","join","existsSync","raw","readFileSync","mkdirSync","writeFileSync","statSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","raw","readFileSync","mkdirSync","writeFileSync","crypto","Hono","createHarness","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","fileURLToPath","parseYaml","stringifyYaml","dirname","fileURLToPath","join","existsSync","raw","readFileSync","parseYaml","mkdirSync","writeFileSync","stringifyYaml","match","existsSync","readFileSync","writeFileSync","mkdirSync","copyFileSync","join","basename","tmpdir","matter","parseYaml","VALID_TYPES","TYPE_DIRS","parseYaml","matter","deriveId","existsSync","readFileSync","basename","join","tmpdir","mkdirSync","writeFileSync","copyFileSync","existsSync","writeFileSync","join","relative","join","existsSync","writeFileSync","relative","log"]}