@agntk/agent-harness 0.1.6 → 0.1.8

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 (113) hide show
  1. package/README.md +25 -0
  2. package/defaults/agents/summarizer.md +4 -0
  3. package/dist/{auto-processor-QIRUOGEI.js → auto-processor-KLEP2NMV.js} +3 -3
  4. package/dist/{chunk-UXCHAS3Z.js → chunk-2GPXPU6U.js} +4 -4
  5. package/dist/{chunk-PMFAYKBD.js → chunk-36W2VC3L.js} +2 -2
  6. package/dist/{chunk-EC42HQQH.js → chunk-44R2VV33.js} +2 -2
  7. package/dist/{chunk-AN6Y4MDD.js → chunk-5QME3GHF.js} +6 -6
  8. package/dist/{chunk-QMOIVORH.js → chunk-6DIHJF2A.js} +3 -3
  9. package/dist/{chunk-SEHAQTBO.js → chunk-CKLJTFMV.js} +6 -6
  10. package/dist/{chunk-5O5OGOOQ.js → chunk-CNOHSYI5.js} +2 -2
  11. package/dist/{chunk-D7AWV24Z.js → chunk-ESBLYOXU.js} +3 -3
  12. package/dist/{chunk-4TQQZILG.js → chunk-EXO47RET.js} +4 -2
  13. package/dist/chunk-EXO47RET.js.map +1 -0
  14. package/dist/{chunk-M6PDMK2O.js → chunk-MASZOYMQ.js} +4 -4
  15. package/dist/{chunk-UMXPOYZR.js → chunk-NGF7UZY5.js} +5 -5
  16. package/dist/{chunk-4P6TRFPZ.js → chunk-O2YV52TH.js} +4 -4
  17. package/dist/{chunk-7GZ4D6V6.js → chunk-P7EFJ7CN.js} +2 -2
  18. package/dist/{chunk-KLYMGWQJ.js → chunk-QILHQNSM.js} +5 -5
  19. package/dist/{chunk-IZ6UZ3ZL.js → chunk-WCYBFALM.js} +10 -3
  20. package/dist/chunk-WCYBFALM.js.map +1 -0
  21. package/dist/{chunk-NVC2WY4K.js → chunk-WHRYPI2T.js} +2 -2
  22. package/dist/{chunk-5CO5JTYT.js → chunk-X47HHTNV.js} +2 -2
  23. package/dist/{chunk-2UVWCTAY.js → chunk-XPEDVA35.js} +2 -2
  24. package/dist/{chunk-M62KLIEK.js → chunk-XTV7HH5M.js} +30 -6
  25. package/dist/chunk-XTV7HH5M.js.map +1 -0
  26. package/dist/cli/index.js +101 -101
  27. package/dist/{config-PYSS3QY6.js → config-KRGEWBPM.js} +3 -3
  28. package/dist/context-loader-GKLLIDVC.js +12 -0
  29. package/dist/{conversation-TBTFIJVU.js → conversation-EU47O5MU.js} +7 -7
  30. package/dist/{delegate-3KJAL4NZ.js → delegate-BPTJVYU3.js} +8 -8
  31. package/dist/{export-GYLWROMB.js → export-OPR3SVVJ.js} +3 -3
  32. package/dist/graph-VW5GH2FZ.js +13 -0
  33. package/dist/{harness-R5FKRICG.js → harness-FZR52COJ.js} +9 -9
  34. package/dist/{indexer-L5UC6J2V.js → indexer-SEALD6HO.js} +4 -4
  35. package/dist/instinct-learner-MNROY6L4.js +19 -0
  36. package/dist/{intake-SVJKFHTL.js → intake-BU2WHPWF.js} +5 -5
  37. package/dist/{intelligence-XPV3MC5U.js → intelligence-TUNH5ZMA.js} +11 -11
  38. package/dist/{journal-ITUMKT6U.js → journal-E2DJGCNS.js} +6 -6
  39. package/dist/{loader-27PLDCOJ.js → loader-NVVXVFBH.js} +3 -3
  40. package/dist/{mcp-installer-X2TJ2S2G.js → mcp-installer-4LOYB3PP.js} +3 -3
  41. package/dist/{primitive-registry-ZMGGXSO5.js → primitive-registry-KQOL7LNU.js} +3 -3
  42. package/dist/{provider-HQY6SPZI.js → provider-75AKTYGB.js} +2 -2
  43. package/dist/{rule-engine-DM26S77N.js → rule-engine-EPFMNBEG.js} +3 -3
  44. package/dist/{scaffold-2F36YVW6.js → scaffold-FBUNVFYQ.js} +5 -5
  45. package/dist/{scheduler-Q7GB2KCW.js → scheduler-UCFJU4BF.js} +12 -12
  46. package/dist/{search-6Y6NCOLQ.js → search-7RAQA6UV.js} +3 -3
  47. package/dist/{semantic-search-FN6FZIXI.js → semantic-search-OSRMCW2H.js} +3 -3
  48. package/dist/{serve-MXRTP2HE.js → serve-2QUR74CS.js} +10 -10
  49. package/dist/{telemetry-RS2JZUZP.js → telemetry-R34GXFVW.js} +4 -4
  50. package/dist/{tool-executor-6I5PHQDY.js → tool-executor-URY2ZB6G.js} +5 -5
  51. package/dist/{tools-NDFJNVHK.js → tools-2HWMJ5CJ.js} +4 -4
  52. package/dist/{types-NPJZAI72.js → types-KSGYUZZO.js} +2 -2
  53. package/dist/{universal-installer-LCAZHFZR.js → universal-installer-ZNA3HA2S.js} +6 -6
  54. package/dist/validator-JNIHKGWA.js +21 -0
  55. package/dist/{verification-gate-2O6DF2B7.js → verification-gate-FFKVJN5N.js} +3 -3
  56. package/dist/{watcher-GZWQSWZ6.js → watcher-L5SJGTZ2.js} +5 -5
  57. package/dist/{web-server-2Y4CHD2W.js → web-server-N3YIT47Z.js} +9 -9
  58. package/package.json +1 -1
  59. package/dist/chunk-4TQQZILG.js.map +0 -1
  60. package/dist/chunk-IZ6UZ3ZL.js.map +0 -1
  61. package/dist/chunk-M62KLIEK.js.map +0 -1
  62. package/dist/context-loader-RSXXFW5R.js +0 -12
  63. package/dist/graph-LEEO37L3.js +0 -13
  64. package/dist/instinct-learner-QGAMIS3X.js +0 -19
  65. package/dist/validator-LM7RZWSH.js +0 -21
  66. /package/dist/{auto-processor-QIRUOGEI.js.map → auto-processor-KLEP2NMV.js.map} +0 -0
  67. /package/dist/{chunk-UXCHAS3Z.js.map → chunk-2GPXPU6U.js.map} +0 -0
  68. /package/dist/{chunk-PMFAYKBD.js.map → chunk-36W2VC3L.js.map} +0 -0
  69. /package/dist/{chunk-EC42HQQH.js.map → chunk-44R2VV33.js.map} +0 -0
  70. /package/dist/{chunk-AN6Y4MDD.js.map → chunk-5QME3GHF.js.map} +0 -0
  71. /package/dist/{chunk-QMOIVORH.js.map → chunk-6DIHJF2A.js.map} +0 -0
  72. /package/dist/{chunk-SEHAQTBO.js.map → chunk-CKLJTFMV.js.map} +0 -0
  73. /package/dist/{chunk-5O5OGOOQ.js.map → chunk-CNOHSYI5.js.map} +0 -0
  74. /package/dist/{chunk-D7AWV24Z.js.map → chunk-ESBLYOXU.js.map} +0 -0
  75. /package/dist/{chunk-M6PDMK2O.js.map → chunk-MASZOYMQ.js.map} +0 -0
  76. /package/dist/{chunk-UMXPOYZR.js.map → chunk-NGF7UZY5.js.map} +0 -0
  77. /package/dist/{chunk-4P6TRFPZ.js.map → chunk-O2YV52TH.js.map} +0 -0
  78. /package/dist/{chunk-7GZ4D6V6.js.map → chunk-P7EFJ7CN.js.map} +0 -0
  79. /package/dist/{chunk-KLYMGWQJ.js.map → chunk-QILHQNSM.js.map} +0 -0
  80. /package/dist/{chunk-NVC2WY4K.js.map → chunk-WHRYPI2T.js.map} +0 -0
  81. /package/dist/{chunk-5CO5JTYT.js.map → chunk-X47HHTNV.js.map} +0 -0
  82. /package/dist/{chunk-2UVWCTAY.js.map → chunk-XPEDVA35.js.map} +0 -0
  83. /package/dist/{config-PYSS3QY6.js.map → config-KRGEWBPM.js.map} +0 -0
  84. /package/dist/{context-loader-RSXXFW5R.js.map → context-loader-GKLLIDVC.js.map} +0 -0
  85. /package/dist/{conversation-TBTFIJVU.js.map → conversation-EU47O5MU.js.map} +0 -0
  86. /package/dist/{delegate-3KJAL4NZ.js.map → delegate-BPTJVYU3.js.map} +0 -0
  87. /package/dist/{export-GYLWROMB.js.map → export-OPR3SVVJ.js.map} +0 -0
  88. /package/dist/{graph-LEEO37L3.js.map → graph-VW5GH2FZ.js.map} +0 -0
  89. /package/dist/{harness-R5FKRICG.js.map → harness-FZR52COJ.js.map} +0 -0
  90. /package/dist/{indexer-L5UC6J2V.js.map → indexer-SEALD6HO.js.map} +0 -0
  91. /package/dist/{instinct-learner-QGAMIS3X.js.map → instinct-learner-MNROY6L4.js.map} +0 -0
  92. /package/dist/{intake-SVJKFHTL.js.map → intake-BU2WHPWF.js.map} +0 -0
  93. /package/dist/{intelligence-XPV3MC5U.js.map → intelligence-TUNH5ZMA.js.map} +0 -0
  94. /package/dist/{journal-ITUMKT6U.js.map → journal-E2DJGCNS.js.map} +0 -0
  95. /package/dist/{loader-27PLDCOJ.js.map → loader-NVVXVFBH.js.map} +0 -0
  96. /package/dist/{mcp-installer-X2TJ2S2G.js.map → mcp-installer-4LOYB3PP.js.map} +0 -0
  97. /package/dist/{primitive-registry-ZMGGXSO5.js.map → primitive-registry-KQOL7LNU.js.map} +0 -0
  98. /package/dist/{provider-HQY6SPZI.js.map → provider-75AKTYGB.js.map} +0 -0
  99. /package/dist/{rule-engine-DM26S77N.js.map → rule-engine-EPFMNBEG.js.map} +0 -0
  100. /package/dist/{scaffold-2F36YVW6.js.map → scaffold-FBUNVFYQ.js.map} +0 -0
  101. /package/dist/{scheduler-Q7GB2KCW.js.map → scheduler-UCFJU4BF.js.map} +0 -0
  102. /package/dist/{search-6Y6NCOLQ.js.map → search-7RAQA6UV.js.map} +0 -0
  103. /package/dist/{semantic-search-FN6FZIXI.js.map → semantic-search-OSRMCW2H.js.map} +0 -0
  104. /package/dist/{serve-MXRTP2HE.js.map → serve-2QUR74CS.js.map} +0 -0
  105. /package/dist/{telemetry-RS2JZUZP.js.map → telemetry-R34GXFVW.js.map} +0 -0
  106. /package/dist/{tool-executor-6I5PHQDY.js.map → tool-executor-URY2ZB6G.js.map} +0 -0
  107. /package/dist/{tools-NDFJNVHK.js.map → tools-2HWMJ5CJ.js.map} +0 -0
  108. /package/dist/{types-NPJZAI72.js.map → types-KSGYUZZO.js.map} +0 -0
  109. /package/dist/{universal-installer-LCAZHFZR.js.map → universal-installer-ZNA3HA2S.js.map} +0 -0
  110. /package/dist/{validator-LM7RZWSH.js.map → validator-JNIHKGWA.js.map} +0 -0
  111. /package/dist/{verification-gate-2O6DF2B7.js.map → verification-gate-FFKVJN5N.js.map} +0 -0
  112. /package/dist/{watcher-GZWQSWZ6.js.map → watcher-L5SJGTZ2.js.map} +0 -0
  113. /package/dist/{web-server-2Y4CHD2W.js.map → web-server-N3YIT47Z.js.map} +0 -0
@@ -7,14 +7,14 @@ import {
7
7
  downloadCapability,
8
8
  fixCapability,
9
9
  installCapability
10
- } from "./chunk-UXCHAS3Z.js";
11
- import "./chunk-D7AWV24Z.js";
10
+ } from "./chunk-2GPXPU6U.js";
11
+ import "./chunk-ESBLYOXU.js";
12
12
  import "./chunk-Z2PUCXTZ.js";
13
- import "./chunk-2UVWCTAY.js";
13
+ import "./chunk-XPEDVA35.js";
14
14
  import {
15
15
  log
16
16
  } from "./chunk-BSKDOFRT.js";
17
- import "./chunk-4TQQZILG.js";
17
+ import "./chunk-EXO47RET.js";
18
18
 
19
19
  // src/runtime/universal-installer.ts
20
20
  import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from "fs";
@@ -669,7 +669,7 @@ async function universalInstall(harnessDir, source, options) {
669
669
  finalContent = await recordProvenance(finalContent, source);
670
670
  result.fixes.push("Recorded provenance (source, installed_at, installed_by)");
671
671
  try {
672
- const { loadConfig } = await import("./config-PYSS3QY6.js");
672
+ const { loadConfig } = await import("./config-KRGEWBPM.js");
673
673
  const config = loadConfig(harnessDir);
674
674
  const installPolicy = config.install;
675
675
  const parsed = matter(finalContent);
@@ -873,4 +873,4 @@ export {
873
873
  resolveSource,
874
874
  universalInstall
875
875
  };
876
- //# sourceMappingURL=universal-installer-LCAZHFZR.js.map
876
+ //# sourceMappingURL=universal-installer-ZNA3HA2S.js.map
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ doctorHarness,
5
+ validateHarness
6
+ } from "./chunk-5QME3GHF.js";
7
+ import "./chunk-2GPXPU6U.js";
8
+ import "./chunk-5H34JPMB.js";
9
+ import "./chunk-ESBLYOXU.js";
10
+ import "./chunk-P7EFJ7CN.js";
11
+ import "./chunk-UDZIS2AQ.js";
12
+ import "./chunk-Z2PUCXTZ.js";
13
+ import "./chunk-XPEDVA35.js";
14
+ import "./chunk-BSKDOFRT.js";
15
+ import "./chunk-44R2VV33.js";
16
+ import "./chunk-EXO47RET.js";
17
+ export {
18
+ doctorHarness,
19
+ validateHarness
20
+ };
21
+ //# sourceMappingURL=validator-JNIHKGWA.js.map
@@ -2,8 +2,8 @@
2
2
 
3
3
  import {
4
4
  loadDirectory
5
- } from "./chunk-2UVWCTAY.js";
6
- import "./chunk-4TQQZILG.js";
5
+ } from "./chunk-XPEDVA35.js";
6
+ import "./chunk-EXO47RET.js";
7
7
 
8
8
  // src/runtime/verification-gate.ts
9
9
  import { existsSync } from "fs";
@@ -242,4 +242,4 @@ export {
242
242
  getGatesForPlaybook,
243
243
  loadGates
244
244
  };
245
- //# sourceMappingURL=verification-gate-2O6DF2B7.js.map
245
+ //# sourceMappingURL=verification-gate-FFKVJN5N.js.map
@@ -2,17 +2,17 @@
2
2
 
3
3
  import {
4
4
  writeIndexFile
5
- } from "./chunk-D7AWV24Z.js";
5
+ } from "./chunk-ESBLYOXU.js";
6
6
  import {
7
7
  autoProcessFile
8
- } from "./chunk-NVC2WY4K.js";
9
- import "./chunk-2UVWCTAY.js";
8
+ } from "./chunk-WHRYPI2T.js";
9
+ import "./chunk-XPEDVA35.js";
10
10
  import {
11
11
  log
12
12
  } from "./chunk-BSKDOFRT.js";
13
13
  import {
14
14
  CORE_PRIMITIVE_DIRS
15
- } from "./chunk-4TQQZILG.js";
15
+ } from "./chunk-EXO47RET.js";
16
16
 
17
17
  // src/runtime/watcher.ts
18
18
  import { watch } from "chokidar";
@@ -105,4 +105,4 @@ function createWatcher(options) {
105
105
  export {
106
106
  createWatcher
107
107
  };
108
- //# sourceMappingURL=watcher-GZWQSWZ6.js.map
108
+ //# sourceMappingURL=watcher-L5SJGTZ2.js.map
@@ -3,25 +3,25 @@
3
3
  import {
4
4
  createWebApp,
5
5
  startWebServer
6
- } from "./chunk-SEHAQTBO.js";
7
- import "./chunk-5O5OGOOQ.js";
6
+ } from "./chunk-CKLJTFMV.js";
7
+ import "./chunk-CNOHSYI5.js";
8
8
  import "./chunk-6EMOEYGU.js";
9
9
  import "./chunk-GNUSHD2Y.js";
10
10
  import "./chunk-5H34JPMB.js";
11
- import "./chunk-UMXPOYZR.js";
12
- import "./chunk-7GZ4D6V6.js";
11
+ import "./chunk-NGF7UZY5.js";
12
+ import "./chunk-P7EFJ7CN.js";
13
13
  import "./chunk-UDZIS2AQ.js";
14
14
  import "./chunk-DTTXPHFW.js";
15
15
  import "./chunk-Z2PUCXTZ.js";
16
16
  import "./chunk-TAT6JU3X.js";
17
17
  import "./chunk-JKMGYWXB.js";
18
- import "./chunk-2UVWCTAY.js";
18
+ import "./chunk-XPEDVA35.js";
19
19
  import "./chunk-BSKDOFRT.js";
20
- import "./chunk-IZ6UZ3ZL.js";
21
- import "./chunk-EC42HQQH.js";
22
- import "./chunk-4TQQZILG.js";
20
+ import "./chunk-WCYBFALM.js";
21
+ import "./chunk-44R2VV33.js";
22
+ import "./chunk-EXO47RET.js";
23
23
  export {
24
24
  createWebApp,
25
25
  startWebServer
26
26
  };
27
- //# sourceMappingURL=web-server-2Y4CHD2W.js.map
27
+ //# sourceMappingURL=web-server-N3YIT47Z.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agntk/agent-harness",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "A file-first agent operating system. Build AI agents by editing markdown files, not writing code.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/types.ts"],"sourcesContent":["import { z } from 'zod';\n\n// --- Frontmatter ---\nexport const FrontmatterSchema = z.object({\n id: z.string(),\n tags: z.array(z.string()).default([]),\n created: z.string().optional(),\n updated: z.string().optional(),\n author: z.enum(['human', 'agent', 'infrastructure']).default('human'),\n status: z.enum(['active', 'archived', 'deprecated', 'draft']).default('active'),\n related: z.array(z.string()).default([]),\n schedule: z.string().optional(),\n with: z.string().optional(),\n channel: z.string().optional(),\n duration_minutes: z.number().optional(),\n max_retries: z.number().int().nonnegative().optional(),\n retry_delay_ms: z.number().int().positive().optional(),\n});\n\nexport type Frontmatter = z.infer<typeof FrontmatterSchema>;\n\n// --- Primitive Document ---\nexport interface HarnessDocument {\n path: string;\n frontmatter: Frontmatter;\n l0: string;\n l1: string;\n body: string;\n raw: string;\n}\n\n// --- Primitive Types ---\nexport type PrimitiveType =\n | 'rule'\n | 'instinct'\n | 'skill'\n | 'playbook'\n | 'workflow'\n | 'tool'\n | 'agent'\n | 'session'\n | 'journal';\n\nexport interface Primitive {\n type: PrimitiveType;\n doc: HarnessDocument;\n}\n\n// --- Config ---\nexport const HarnessConfigSchema = z.object({\n agent: z.object({\n name: z.string().min(1),\n version: z.string().default('0.1.0'),\n }).passthrough(),\n model: z.object({\n provider: z.string().default('openrouter'),\n id: z.string().min(1),\n max_tokens: z.number().int().positive().default(200000),\n max_retries: z.number().int().nonnegative().default(2),\n timeout_ms: z.number().int().positive().optional(),\n /** Cheap model for auto-generating summaries, tags, frontmatter (e.g. 'google/gemini-flash-1.5') */\n summary_model: z.string().optional(),\n /** Fast model for validation, checks, and quick decisions (e.g. 'google/gemini-flash-1.5') */\n fast_model: z.string().optional(),\n }).passthrough(),\n runtime: z.object({\n scratchpad_budget: z.number().int().nonnegative().default(10000),\n /** Reserved: cron expression for periodic heartbeat check (not yet implemented) */\n heartbeat: z.string().optional(),\n /** Reserved: cron expression for daily summary generation (not yet implemented) */\n daily_summary: z.string().optional(),\n /** Auto-process primitives on save: generate frontmatter, L0/L1 summaries (default: true) */\n auto_process: z.boolean().default(true),\n quiet_hours: z.object({\n start: z.number().int().min(0).max(23).default(23),\n end: z.number().int().min(0).max(23).default(6),\n }).passthrough().default({ start: 23, end: 6 }),\n timezone: z.string().default('America/New_York'),\n }).passthrough(),\n memory: z.object({\n session_retention_days: z.number().int().positive().default(7),\n journal_retention_days: z.number().int().positive().default(365),\n }).passthrough(),\n channels: z.object({\n primary: z.string().default('cli'),\n }).passthrough(),\n extensions: z.object({\n directories: z.array(z.string()).default([]),\n }).passthrough().default({ directories: [] }),\n rate_limits: z.object({\n /** Max LLM calls per minute (default: unlimited) */\n per_minute: z.number().int().positive().optional(),\n /** Max LLM calls per hour (default: unlimited) */\n per_hour: z.number().int().positive().optional(),\n /** Max LLM calls per day (default: unlimited) */\n per_day: z.number().int().positive().optional(),\n }).passthrough().default({}),\n budget: z.object({\n /** Max daily spend in USD (default: unlimited) */\n daily_limit_usd: z.number().positive().optional(),\n /** Max monthly spend in USD (default: unlimited) */\n monthly_limit_usd: z.number().positive().optional(),\n /** Block runs when budget exceeded (default: true) */\n enforce: z.boolean().default(true),\n }).passthrough().default({ enforce: true }),\n mcp: z.object({\n /** MCP server definitions keyed by server name */\n servers: z.record(z.string(), z.object({\n /** Transport type: 'stdio' for local processes, 'http' for remote, 'sse' for SSE */\n transport: z.enum(['stdio', 'http', 'sse']),\n /** Command to spawn (stdio transport only) */\n command: z.string().optional(),\n /** Command arguments (stdio transport only) */\n args: z.array(z.string()).optional(),\n /** Environment variables for the spawned process (stdio transport only) */\n env: z.record(z.string(), z.string()).optional(),\n /** Working directory for the spawned process (stdio transport only) */\n cwd: z.string().optional(),\n /** URL endpoint (http/sse transport only) */\n url: z.string().optional(),\n /** Additional HTTP headers (http/sse transport only) */\n headers: z.record(z.string(), z.string()).optional(),\n /** Whether this server is enabled (default: true) */\n enabled: z.boolean().default(true),\n }).passthrough()).default({}),\n }).passthrough().default({ servers: {} }),\n /** Intelligence & continuous learning config */\n intelligence: z.object({\n /** Auto-run journal synthesis on a cron schedule (default: off). Set to cron string e.g. \"0 22 * * *\" or true for default \"0 22 * * *\". */\n auto_journal: z.union([z.boolean(), z.string()]).default(false),\n /** Auto-run instinct learning after journal synthesis (default: off) */\n auto_learn: z.boolean().default(false),\n }).passthrough().default({ auto_journal: false, auto_learn: false }),\n /** Proactive execution config (scheduler rate-limiting) */\n proactive: z.object({\n /** Enable proactive scheduled workflows (default: false) */\n enabled: z.boolean().default(false),\n /** Max proactive workflow executions per hour (default: 5) */\n max_per_hour: z.number().int().positive().default(5),\n /** Cooldown in minutes between proactive runs of the same workflow (default: 30) */\n cooldown_minutes: z.number().int().nonnegative().default(30),\n /** Override quiet hours for proactive execution (start/end hours, inherits runtime.quiet_hours if not set) */\n quiet_hours: z.object({\n start: z.number().int().min(0).max(23).optional(),\n end: z.number().int().min(0).max(23).optional(),\n }).passthrough().optional(),\n }).passthrough().default({ enabled: false, max_per_hour: 5, cooldown_minutes: 30 }),\n /** Primitive bundle registries for search/install */\n registries: z.array(z.object({\n /** Registry URL (HTTPS endpoint) */\n url: z.string().url(),\n /** Optional display name */\n name: z.string().optional(),\n /** Optional auth token for private registries */\n token: z.string().optional(),\n }).passthrough()).default([]),\n /**\n * License policy for `harness install <url>`. Controls how the universal\n * installer reacts to the license detected on a fetched primitive (Level 3\n * of task 12.14). Detection itself runs unconditionally — this only governs\n * what happens after the license is determined.\n */\n install: z.object({\n /**\n * SPDX ids the installer accepts without warning. Permissive defaults\n * cover the OSI-approved ecosystem most users care about. Add or remove\n * here to tighten or loosen the policy.\n */\n allowed_licenses: z.array(z.string()).default([\n 'MIT',\n 'Apache-2.0',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'ISC',\n 'MPL-2.0',\n 'CC-BY-4.0',\n 'CC0-1.0',\n 'Unlicense',\n ]),\n /**\n * What to do when the detected license is not in `allowed_licenses` and\n * is not classified as PROPRIETARY. Includes the UNKNOWN case (no LICENSE\n * file found anywhere) and any non-permissive SPDX id like GPL-3.0.\n *\n * - allow: install silently (legacy v0.1.3 behavior — safest for migration)\n * - warn: install with a stderr warning naming the license_source\n * - prompt: ask Y/n on TTY; treats non-TTY as `block`\n * - block: refuse the install with an error showing the override flag\n */\n on_unknown_license: z.enum(['allow', 'warn', 'prompt', 'block']).default('warn'),\n /**\n * What to do when the detected license is PROPRIETARY (text contains\n * \"all rights reserved\" or no permission grant). Defaults to `block`\n * because shipping proprietary content was the v0.1.0 yank cause.\n */\n on_proprietary: z.enum(['allow', 'warn', 'prompt', 'block']).default('block'),\n }).passthrough().default({\n allowed_licenses: [\n 'MIT',\n 'Apache-2.0',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'ISC',\n 'MPL-2.0',\n 'CC-BY-4.0',\n 'CC0-1.0',\n 'Unlicense',\n ],\n on_unknown_license: 'warn',\n on_proprietary: 'block',\n }),\n}).passthrough();\n\nexport type HarnessConfig = z.infer<typeof HarnessConfigSchema>;\n\nexport const CONFIG_DEFAULTS: HarnessConfig = {\n agent: { name: 'agent', version: '0.1.0' },\n model: { provider: 'openrouter', id: 'anthropic/claude-sonnet-4', max_tokens: 200000, max_retries: 2 },\n runtime: {\n scratchpad_budget: 10000,\n auto_process: true,\n quiet_hours: { start: 23, end: 6 },\n timezone: 'America/New_York',\n },\n memory: { session_retention_days: 7, journal_retention_days: 365 },\n channels: { primary: 'cli' },\n extensions: { directories: [] },\n rate_limits: {},\n budget: { enforce: true },\n intelligence: { auto_journal: false, auto_learn: false },\n proactive: { enabled: false, max_per_hour: 5, cooldown_minutes: 30 },\n mcp: { servers: {} },\n registries: [],\n install: {\n allowed_licenses: [\n 'MIT',\n 'Apache-2.0',\n 'BSD-2-Clause',\n 'BSD-3-Clause',\n 'ISC',\n 'MPL-2.0',\n 'CC-BY-4.0',\n 'CC0-1.0',\n 'Unlicense',\n ],\n on_unknown_license: 'warn',\n on_proprietary: 'block',\n },\n};\n\nexport const CORE_PRIMITIVE_DIRS = ['rules', 'instincts', 'skills', 'playbooks', 'workflows', 'tools', 'agents'] as const;\n\nexport function getPrimitiveDirs(config?: HarnessConfig): string[] {\n const dirs: string[] = [...CORE_PRIMITIVE_DIRS];\n if (config?.extensions?.directories) {\n for (const dir of config.extensions.directories) {\n if (!dirs.includes(dir)) {\n dirs.push(dir);\n }\n }\n }\n return dirs;\n}\n\n// --- Agent State ---\nexport interface AgentState {\n mode: string;\n goals: string[];\n active_workflows: string[];\n last_interaction: string;\n unfinished_business: string[];\n}\n\n// --- Context Budget ---\nexport interface ContextBudget {\n max_tokens: number;\n used_tokens: number;\n remaining: number;\n loaded_files: string[];\n}\n\n// --- Utility Types ---\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n// --- Lifecycle Hooks ---\nexport interface HarnessHooks {\n /** Called after boot completes (context loaded, state ready) */\n onBoot?: (context: { agent: HarnessAgent; config: HarnessConfig; state: AgentState }) => void | Promise<void>;\n /** Called after each session completes (run or stream) */\n onSessionEnd?: (context: { agent: HarnessAgent; sessionId: string; prompt: string; result: AgentRunResult }) => void | Promise<void>;\n /** Called when an error occurs during run/stream */\n onError?: (context: { agent: HarnessAgent; error: Error; prompt?: string }) => void | Promise<void>;\n /** Called when agent state changes (boot, shutdown, after run) */\n onStateChange?: (context: { agent: HarnessAgent; previous: string; current: string }) => void | Promise<void>;\n /** Called before shutdown completes */\n onShutdown?: (context: { agent: HarnessAgent; state: AgentState }) => void | Promise<void>;\n}\n\n// --- Tool Executor Config (inline to avoid circular deps) ---\nexport interface ToolExecutorOptions {\n /** Maximum tool calls per run (default: 5) */\n maxToolCalls?: number;\n /** Timeout per tool call in ms (default: 30000) */\n toolTimeoutMs?: number;\n /** Whether to allow HTTP tool execution (default: true) */\n allowHttpExecution?: boolean;\n}\n\n// --- Agent Options (programmatic API) ---\nexport interface CreateHarnessOptions {\n dir: string;\n /** Model ID override (e.g., \"claude-sonnet-4-20250514\" or \"gpt-4o\") */\n model?: string;\n /** Provider override (e.g., \"anthropic\", \"openai\", \"openrouter\") */\n provider?: string;\n apiKey?: string;\n config?: DeepPartial<HarnessConfig>;\n /** Lifecycle hooks for agent events */\n hooks?: HarnessHooks;\n /** Tool execution configuration */\n toolExecutor?: ToolExecutorOptions;\n}\n\n/** Record of a single tool call made during a run */\nexport interface ToolCallInfo {\n toolName: string;\n args: Record<string, unknown>;\n result: unknown;\n}\n\n// --- Agent Interface ---\nexport interface AgentRunResult {\n text: string;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n session_id: string;\n steps: number;\n /** Tool calls made during the run (empty array if none) */\n toolCalls: ToolCallInfo[];\n}\n\nexport interface AgentStreamResult {\n /** Async iterable of text chunks — consume with for-await */\n textStream: AsyncIterable<string>;\n /** Resolves after the stream is fully consumed with session metadata */\n result: Promise<AgentRunResult>;\n}\n\nexport interface HarnessAgent {\n name: string;\n config: HarnessConfig;\n boot(): Promise<void>;\n run(prompt: string): Promise<AgentRunResult>;\n stream(prompt: string): AgentStreamResult;\n shutdown(): Promise<void>;\n getSystemPrompt(): string;\n getState(): AgentState;\n}\n\n// --- Index Entry ---\nexport interface IndexEntry {\n id: string;\n path: string;\n tags: string[];\n l0: string;\n created: string;\n status: string;\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/llm/provider.ts"],"sourcesContent":["import { createOpenRouter } from '@openrouter/ai-sdk-provider';\nimport { createAnthropic } from '@ai-sdk/anthropic';\nimport { createOpenAI } from '@ai-sdk/openai';\nimport { generateText, streamText, stepCountIs, type LanguageModel } from 'ai';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport type { HarnessConfig, ToolCallInfo } from '../core/types.js';\nimport type { AIToolSet } from '../runtime/tool-executor.js';\n\n/** Supported provider names for config.model.provider */\nexport type ProviderName = 'openrouter' | 'anthropic' | 'openai';\n\n/** Provider factory — maps provider names to (apiKey) => LanguageModel functions */\ntype ProviderFactory = (modelId: string, apiKey?: string) => LanguageModel;\n\nconst ENV_KEYS: Record<ProviderName, string> = {\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n};\n\n/** Cached provider instances keyed by provider name */\nconst _providers: Map<string, ProviderFactory> = new Map();\n\nfunction getOrCreateFactory(providerName: ProviderName, apiKey?: string): ProviderFactory {\n const cacheKey = `${providerName}:${apiKey ?? 'env'}`;\n const cached = _providers.get(cacheKey);\n if (cached) return cached;\n\n const envKey = ENV_KEYS[providerName];\n const key = apiKey ?? process.env[envKey];\n\n let factory: ProviderFactory;\n\n switch (providerName) {\n case 'openrouter': {\n if (!key) {\n throw new Error(\n `No API key found for provider \"${providerName}\". ` +\n `Set ${envKey} environment variable or pass apiKey option.`\n );\n }\n const provider = createOpenRouter({ apiKey: key });\n factory = (modelId) => provider(modelId);\n break;\n }\n case 'anthropic': {\n // createAnthropic reads ANTHROPIC_API_KEY from env by default\n const provider = createAnthropic(key ? { apiKey: key } : undefined);\n factory = (modelId) => provider(modelId);\n break;\n }\n case 'openai': {\n // createOpenAI reads OPENAI_API_KEY from env by default\n const provider = createOpenAI(key ? { apiKey: key } : undefined);\n factory = (modelId) => provider(modelId);\n break;\n }\n default:\n throw new Error(\n `Unknown provider \"${providerName}\". ` +\n `Supported providers: ${Object.keys(ENV_KEYS).join(', ')}`\n );\n }\n\n _providers.set(cacheKey, factory);\n return factory;\n}\n\n/**\n * Get the OpenRouter provider (backward-compatible).\n * @deprecated Use getModel() with config.model.provider instead.\n */\nexport function getProvider(apiKey?: string): ReturnType<typeof createOpenRouter> {\n const key = apiKey ?? process.env.OPENROUTER_API_KEY;\n if (!key) {\n throw new Error(\n 'No OpenRouter API key found. Set OPENROUTER_API_KEY environment variable or pass apiKey option.'\n );\n }\n return createOpenRouter({ apiKey: key });\n}\n\nexport function resetProvider(): void {\n _providers.clear();\n}\n\n/**\n * Get a LanguageModel from config. Supports openrouter, anthropic, and openai providers.\n *\n * Provider is selected from config.model.provider (defaults to 'openrouter').\n * Model ID format depends on provider:\n * - openrouter: \"anthropic/claude-sonnet-4\" (vendor/model)\n * - anthropic: \"claude-sonnet-4-20250514\" (native model ID)\n * - openai: \"gpt-4o\" (native model ID)\n */\nexport function getModel(config: HarnessConfig, apiKey?: string): LanguageModel {\n const providerName = (config.model.provider ?? 'openrouter') as ProviderName;\n const factory = getOrCreateFactory(providerName, apiKey);\n return factory(config.model.id);\n}\n\n/**\n * Get the summary model for cheap auto-generation tasks (L0/L1 summaries, tags, frontmatter).\n * Falls back to the primary model if summary_model is not configured.\n *\n * Usage: set `model.summary_model` in config.yaml, e.g.:\n * summary_model: \"google/gemini-flash-1.5\"\n */\nexport function getSummaryModel(config: HarnessConfig, apiKey?: string): LanguageModel {\n const modelId = config.model.summary_model ?? config.model.id;\n const providerName = (config.model.provider ?? 'openrouter') as ProviderName;\n const factory = getOrCreateFactory(providerName, apiKey);\n return factory(modelId);\n}\n\n/**\n * Get the fast model for validation, checks, and quick decisions.\n * Falls back to summary_model, then primary model.\n *\n * Usage: set `model.fast_model` in config.yaml, e.g.:\n * fast_model: \"google/gemini-flash-1.5\"\n */\nexport function getFastModel(config: HarnessConfig, apiKey?: string): LanguageModel {\n const modelId = config.model.fast_model ?? config.model.summary_model ?? config.model.id;\n const providerName = (config.model.provider ?? 'openrouter') as ProviderName;\n const factory = getOrCreateFactory(providerName, apiKey);\n return factory(modelId);\n}\n\nexport interface CallOptions {\n maxRetries?: number;\n timeoutMs?: number;\n abortSignal?: AbortSignal;\n}\n\nexport interface GenerateOptions extends CallOptions {\n model: LanguageModel;\n system: string;\n prompt: string;\n maxOutputTokens?: number;\n /** AI SDK tools to make available for the LLM */\n tools?: AIToolSet;\n /** Max tool-use roundtrips (default: 1 if tools provided, 0 otherwise) */\n maxToolSteps?: number;\n}\n\nexport interface GenerateWithMessagesOptions extends CallOptions {\n model: LanguageModel;\n system: string;\n messages: ModelMessage[];\n maxOutputTokens?: number;\n /** AI SDK tools to make available for the LLM */\n tools?: AIToolSet;\n /** Max tool-use roundtrips (default: 1 if tools provided, 0 otherwise) */\n maxToolSteps?: number;\n}\n\nexport interface GenerateResult {\n text: string;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n /** Tool calls made during generation (empty if no tools used) */\n toolCalls: ToolCallInfo[];\n /** Number of steps taken (1 = no tool calls, >1 = tool roundtrips) */\n steps: number;\n}\n\nfunction extractUsage(usage: { inputTokens?: number; outputTokens?: number } | undefined) {\n return {\n inputTokens: usage?.inputTokens ?? 0,\n outputTokens: usage?.outputTokens ?? 0,\n totalTokens: (usage?.inputTokens ?? 0) + (usage?.outputTokens ?? 0),\n };\n}\n\nfunction buildCallSettings(opts: CallOptions & { tools?: AIToolSet; maxToolSteps?: number }) {\n const hasTools = opts.tools && Object.keys(opts.tools).length > 0;\n return {\n ...(opts.maxRetries !== undefined ? { maxRetries: opts.maxRetries } : {}),\n ...(opts.timeoutMs !== undefined ? { timeout: opts.timeoutMs } : {}),\n ...(opts.abortSignal ? { abortSignal: opts.abortSignal } : {}),\n ...(hasTools ? { tools: opts.tools } : {}),\n ...(hasTools ? { stopWhen: stepCountIs(opts.maxToolSteps ?? 5) } : {}),\n };\n}\n\n/** Extract tool call info from AI SDK step results */\nfunction extractToolCalls(result: { steps?: Array<{ toolCalls?: Array<{ toolName: string; input: unknown }>; toolResults?: Array<{ toolName: string; output: unknown }> }> }): ToolCallInfo[] {\n const calls: ToolCallInfo[] = [];\n if (!result.steps) return calls;\n\n for (const step of result.steps) {\n if (!step.toolCalls) continue;\n for (let i = 0; i < step.toolCalls.length; i++) {\n const tc = step.toolCalls[i];\n const tr = step.toolResults?.[i];\n calls.push({\n toolName: tc.toolName,\n args: (tc.input ?? {}) as Record<string, unknown>,\n result: tr?.output ?? null,\n });\n }\n }\n return calls;\n}\n\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const result = await generateText({\n model: opts.model,\n system: opts.system,\n prompt: opts.prompt,\n maxOutputTokens: opts.maxOutputTokens,\n ...buildCallSettings(opts),\n });\n\n // Use totalUsage when available (multi-step) otherwise fall back to usage\n const usage = result.totalUsage ?? result.usage;\n\n return {\n text: result.text,\n usage: extractUsage(usage),\n toolCalls: extractToolCalls(result),\n steps: result.steps?.length ?? 1,\n };\n}\n\nexport async function generateWithMessages(opts: GenerateWithMessagesOptions): Promise<GenerateResult> {\n const result = await generateText({\n model: opts.model,\n system: opts.system,\n messages: opts.messages,\n maxOutputTokens: opts.maxOutputTokens,\n ...buildCallSettings(opts),\n });\n\n const usage = result.totalUsage ?? result.usage;\n\n return {\n text: result.text,\n usage: extractUsage(usage),\n toolCalls: extractToolCalls(result),\n steps: result.steps?.length ?? 1,\n };\n}\n\n/**\n * @deprecated Use `streamGenerateWithDetails()` instead — returns metadata (usage, toolCalls, steps).\n */\nexport async function* streamGenerate(opts: GenerateOptions): AsyncIterable<string> {\n const result = streamText({\n model: opts.model,\n system: opts.system,\n prompt: opts.prompt,\n maxOutputTokens: opts.maxOutputTokens,\n ...buildCallSettings(opts),\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n}\n\nexport interface StreamWithMessagesResult {\n textStream: AsyncIterable<string>;\n usage: Promise<GenerateResult['usage']>;\n /** Tool calls made across all steps (resolves after stream completes) */\n toolCalls: Promise<ToolCallInfo[]>;\n /** Number of steps (resolves after stream completes) */\n steps: Promise<number>;\n}\n\nexport function streamWithMessages(opts: GenerateWithMessagesOptions): StreamWithMessagesResult {\n const result = streamText({\n model: opts.model,\n system: opts.system,\n messages: opts.messages,\n maxOutputTokens: opts.maxOutputTokens,\n ...buildCallSettings(opts),\n });\n\n const totalUsage = Promise.resolve(result.totalUsage ?? result.usage).then((u) => extractUsage(u));\n const toolCalls = Promise.resolve(result.steps).then((s) => extractToolCalls({ steps: s }));\n const steps = Promise.resolve(result.steps).then((s) => s?.length ?? 1);\n\n return {\n textStream: result.textStream,\n usage: totalUsage,\n toolCalls,\n steps,\n };\n}\n\nexport interface StreamGenerateResult {\n textStream: AsyncIterable<string>;\n usage: Promise<GenerateResult['usage']>;\n toolCalls: Promise<ToolCallInfo[]>;\n steps: Promise<number>;\n}\n\nexport function streamGenerateWithDetails(opts: GenerateOptions): StreamGenerateResult {\n const result = streamText({\n model: opts.model,\n system: opts.system,\n prompt: opts.prompt,\n maxOutputTokens: opts.maxOutputTokens,\n ...buildCallSettings(opts),\n });\n\n const totalUsage = Promise.resolve(result.totalUsage ?? result.usage).then((u) => extractUsage(u));\n const toolCalls = Promise.resolve(result.steps).then((s) => extractToolCalls({ steps: s }));\n const steps = Promise.resolve(result.steps).then((s) => s?.length ?? 1);\n\n return {\n textStream: result.textStream,\n usage: totalUsage,\n toolCalls,\n steps,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/runtime/delegate.ts"],"sourcesContent":["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 } 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"],"mappings":"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","names":[]}
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import {
4
- buildSystemPrompt
5
- } from "./chunk-7GZ4D6V6.js";
6
- import "./chunk-2UVWCTAY.js";
7
- import "./chunk-BSKDOFRT.js";
8
- import "./chunk-4TQQZILG.js";
9
- export {
10
- buildSystemPrompt
11
- };
12
- //# sourceMappingURL=context-loader-RSXXFW5R.js.map
@@ -1,13 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import {
4
- buildDependencyGraph,
5
- getGraphStats
6
- } from "./chunk-QMOIVORH.js";
7
- import "./chunk-2UVWCTAY.js";
8
- import "./chunk-4TQQZILG.js";
9
- export {
10
- buildDependencyGraph,
11
- getGraphStats
12
- };
13
- //# sourceMappingURL=graph-LEEO37L3.js.map
@@ -1,19 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import {
4
- harvestInstincts,
5
- installInstinct,
6
- learnFromSessions,
7
- proposeInstincts
8
- } from "./chunk-M6PDMK2O.js";
9
- import "./chunk-2UVWCTAY.js";
10
- import "./chunk-IZ6UZ3ZL.js";
11
- import "./chunk-EC42HQQH.js";
12
- import "./chunk-4TQQZILG.js";
13
- export {
14
- harvestInstincts,
15
- installInstinct,
16
- learnFromSessions,
17
- proposeInstincts
18
- };
19
- //# sourceMappingURL=instinct-learner-QGAMIS3X.js.map
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import {
4
- doctorHarness,
5
- validateHarness
6
- } from "./chunk-AN6Y4MDD.js";
7
- import "./chunk-UXCHAS3Z.js";
8
- import "./chunk-5H34JPMB.js";
9
- import "./chunk-D7AWV24Z.js";
10
- import "./chunk-7GZ4D6V6.js";
11
- import "./chunk-UDZIS2AQ.js";
12
- import "./chunk-Z2PUCXTZ.js";
13
- import "./chunk-2UVWCTAY.js";
14
- import "./chunk-BSKDOFRT.js";
15
- import "./chunk-EC42HQQH.js";
16
- import "./chunk-4TQQZILG.js";
17
- export {
18
- doctorHarness,
19
- validateHarness
20
- };
21
- //# sourceMappingURL=validator-LM7RZWSH.js.map