@agntk/agent-harness 0.1.6 → 0.1.7

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 (39) hide show
  1. package/dist/{chunk-UMXPOYZR.js → chunk-7MSZVP7A.js} +2 -2
  2. package/dist/{chunk-SEHAQTBO.js → chunk-IFVCU33I.js} +2 -2
  3. package/dist/{chunk-KLYMGWQJ.js → chunk-LACZLSC4.js} +2 -2
  4. package/dist/{chunk-M6PDMK2O.js → chunk-LBT43BZA.js} +2 -2
  5. package/dist/{chunk-M62KLIEK.js → chunk-QU566LZE.js} +2 -2
  6. package/dist/{chunk-IZ6UZ3ZL.js → chunk-WCYBFALM.js} +10 -3
  7. package/dist/chunk-WCYBFALM.js.map +1 -0
  8. package/dist/{chunk-4P6TRFPZ.js → chunk-Z4HEHWFM.js} +2 -2
  9. package/dist/cli/index.js +35 -35
  10. package/dist/{conversation-TBTFIJVU.js → conversation-OKBO4L66.js} +3 -3
  11. package/dist/{delegate-3KJAL4NZ.js → delegate-YOGVA3HB.js} +3 -3
  12. package/dist/{harness-R5FKRICG.js → harness-NU2UU6J4.js} +3 -3
  13. package/dist/{instinct-learner-QGAMIS3X.js → instinct-learner-EECG4L24.js} +3 -3
  14. package/dist/{intelligence-XPV3MC5U.js → intelligence-BANUEAI4.js} +3 -3
  15. package/dist/{journal-ITUMKT6U.js → journal-O4SEANIC.js} +3 -3
  16. package/dist/{provider-HQY6SPZI.js → provider-75AKTYGB.js} +2 -2
  17. package/dist/{scaffold-2F36YVW6.js → scaffold-LA54KYKJ.js} +2 -2
  18. package/dist/{scheduler-Q7GB2KCW.js → scheduler-MFBVGFZQ.js} +6 -6
  19. package/dist/{serve-MXRTP2HE.js → serve-TQLN4OTP.js} +5 -5
  20. package/dist/{web-server-2Y4CHD2W.js → web-server-SJ6NS5IX.js} +4 -4
  21. package/package.json +1 -1
  22. package/dist/chunk-IZ6UZ3ZL.js.map +0 -1
  23. /package/dist/{chunk-UMXPOYZR.js.map → chunk-7MSZVP7A.js.map} +0 -0
  24. /package/dist/{chunk-SEHAQTBO.js.map → chunk-IFVCU33I.js.map} +0 -0
  25. /package/dist/{chunk-KLYMGWQJ.js.map → chunk-LACZLSC4.js.map} +0 -0
  26. /package/dist/{chunk-M6PDMK2O.js.map → chunk-LBT43BZA.js.map} +0 -0
  27. /package/dist/{chunk-M62KLIEK.js.map → chunk-QU566LZE.js.map} +0 -0
  28. /package/dist/{chunk-4P6TRFPZ.js.map → chunk-Z4HEHWFM.js.map} +0 -0
  29. /package/dist/{conversation-TBTFIJVU.js.map → conversation-OKBO4L66.js.map} +0 -0
  30. /package/dist/{delegate-3KJAL4NZ.js.map → delegate-YOGVA3HB.js.map} +0 -0
  31. /package/dist/{harness-R5FKRICG.js.map → harness-NU2UU6J4.js.map} +0 -0
  32. /package/dist/{instinct-learner-QGAMIS3X.js.map → instinct-learner-EECG4L24.js.map} +0 -0
  33. /package/dist/{intelligence-XPV3MC5U.js.map → intelligence-BANUEAI4.js.map} +0 -0
  34. /package/dist/{journal-ITUMKT6U.js.map → journal-O4SEANIC.js.map} +0 -0
  35. /package/dist/{provider-HQY6SPZI.js.map → provider-75AKTYGB.js.map} +0 -0
  36. /package/dist/{scaffold-2F36YVW6.js.map → scaffold-LA54KYKJ.js.map} +0 -0
  37. /package/dist/{scheduler-Q7GB2KCW.js.map → scheduler-MFBVGFZQ.js.map} +0 -0
  38. /package/dist/{serve-MXRTP2HE.js.map → serve-TQLN4OTP.js.map} +0 -0
  39. /package/dist/{web-server-2Y4CHD2W.js.map → web-server-SJ6NS5IX.js.map} +0 -0
@@ -20,7 +20,7 @@ import {
20
20
  generateWithMessages,
21
21
  getModel,
22
22
  streamWithMessages
23
- } from "./chunk-IZ6UZ3ZL.js";
23
+ } from "./chunk-WCYBFALM.js";
24
24
  import {
25
25
  loadConfig
26
26
  } from "./chunk-EC42HQQH.js";
@@ -371,4 +371,4 @@ export {
371
371
  parseJsonlContext,
372
372
  parseLegacyContext
373
373
  };
374
- //# sourceMappingURL=chunk-UMXPOYZR.js.map
374
+ //# sourceMappingURL=chunk-7MSZVP7A.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-5H34JPMB.js";
9
9
  import {
10
10
  Conversation
11
- } from "./chunk-UMXPOYZR.js";
11
+ } from "./chunk-7MSZVP7A.js";
12
12
  import {
13
13
  loadState,
14
14
  saveState
@@ -3437,4 +3437,4 @@ export {
3437
3437
  createWebApp,
3438
3438
  startWebServer
3439
3439
  };
3440
- //# sourceMappingURL=chunk-SEHAQTBO.js.map
3440
+ //# sourceMappingURL=chunk-IFVCU33I.js.map
@@ -35,7 +35,7 @@ import {
35
35
  generate,
36
36
  getModel,
37
37
  streamGenerateWithDetails
38
- } from "./chunk-IZ6UZ3ZL.js";
38
+ } from "./chunk-WCYBFALM.js";
39
39
  import {
40
40
  loadConfig
41
41
  } from "./chunk-EC42HQQH.js";
@@ -396,4 +396,4 @@ function createHarness(options) {
396
396
  export {
397
397
  createHarness
398
398
  };
399
- //# sourceMappingURL=chunk-KLYMGWQJ.js.map
399
+ //# sourceMappingURL=chunk-LACZLSC4.js.map
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  generate,
8
8
  getModel
9
- } from "./chunk-IZ6UZ3ZL.js";
9
+ } from "./chunk-WCYBFALM.js";
10
10
  import {
11
11
  loadConfig
12
12
  } from "./chunk-EC42HQQH.js";
@@ -197,4 +197,4 @@ export {
197
197
  learnFromSessions,
198
198
  harvestInstincts
199
199
  };
200
- //# sourceMappingURL=chunk-M6PDMK2O.js.map
200
+ //# sourceMappingURL=chunk-LBT43BZA.js.map
@@ -19,7 +19,7 @@ import {
19
19
  generate,
20
20
  getModel,
21
21
  streamGenerateWithDetails
22
- } from "./chunk-IZ6UZ3ZL.js";
22
+ } from "./chunk-WCYBFALM.js";
23
23
  import {
24
24
  loadConfig
25
25
  } from "./chunk-EC42HQQH.js";
@@ -239,4 +239,4 @@ export {
239
239
  delegateTo,
240
240
  delegateStream
241
241
  };
242
- //# sourceMappingURL=chunk-M62KLIEK.js.map
242
+ //# sourceMappingURL=chunk-QU566LZE.js.map
@@ -11,13 +11,14 @@ var ENV_KEYS = {
11
11
  anthropic: "ANTHROPIC_API_KEY",
12
12
  openai: "OPENAI_API_KEY"
13
13
  };
14
+ var OLLAMA_DEFAULT_BASE_URL = "http://localhost:11434/v1";
14
15
  var _providers = /* @__PURE__ */ new Map();
15
16
  function getOrCreateFactory(providerName, apiKey) {
16
17
  const cacheKey = `${providerName}:${apiKey ?? "env"}`;
17
18
  const cached = _providers.get(cacheKey);
18
19
  if (cached) return cached;
19
20
  const envKey = ENV_KEYS[providerName];
20
- const key = apiKey ?? process.env[envKey];
21
+ const key = apiKey ?? (envKey ? process.env[envKey] : void 0);
21
22
  let factory;
22
23
  switch (providerName) {
23
24
  case "openrouter": {
@@ -40,9 +41,15 @@ function getOrCreateFactory(providerName, apiKey) {
40
41
  factory = (modelId) => provider(modelId);
41
42
  break;
42
43
  }
44
+ case "ollama": {
45
+ const baseURL = process.env.OLLAMA_BASE_URL ?? OLLAMA_DEFAULT_BASE_URL;
46
+ const provider = createOpenAI({ baseURL, apiKey: "ollama" });
47
+ factory = (modelId) => provider(modelId);
48
+ break;
49
+ }
43
50
  default:
44
51
  throw new Error(
45
- `Unknown provider "${providerName}". Supported providers: ${Object.keys(ENV_KEYS).join(", ")}`
52
+ `Unknown provider "${providerName}". Supported providers: openrouter, anthropic, openai, ollama`
46
53
  );
47
54
  }
48
55
  _providers.set(cacheKey, factory);
@@ -204,4 +211,4 @@ export {
204
211
  streamWithMessages,
205
212
  streamGenerateWithDetails
206
213
  };
207
- //# sourceMappingURL=chunk-IZ6UZ3ZL.js.map
214
+ //# sourceMappingURL=chunk-WCYBFALM.js.map
@@ -0,0 +1 @@
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' | 'ollama';\n\n/** Provider factory — maps provider names to (apiKey) => LanguageModel functions */\ntype ProviderFactory = (modelId: string, apiKey?: string) => LanguageModel;\n\n/**\n * Environment variable each provider reads its API key from.\n * Ollama runs locally and needs no auth, so it has no env key.\n */\nconst ENV_KEYS: Partial<Record<ProviderName, string>> = {\n openrouter: 'OPENROUTER_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY',\n openai: 'OPENAI_API_KEY',\n};\n\n/**\n * Default base URL for the local Ollama HTTP server. Ollama exposes an\n * OpenAI-compatible chat completions endpoint at /v1 on this port.\n * Override with the OLLAMA_BASE_URL env var when running on a non-default\n * host or port (e.g. in Docker, on a remote box, behind a proxy).\n */\nconst OLLAMA_DEFAULT_BASE_URL = 'http://localhost:11434/v1';\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 ?? (envKey ? process.env[envKey] : undefined);\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 case 'ollama': {\n // Ollama exposes an OpenAI-compatible chat completions endpoint at\n // http://localhost:11434/v1 by default. Reuses @ai-sdk/openai with a\n // baseURL override and a dummy apiKey (Ollama doesn't authenticate but\n // the OpenAI SDK requires the field to be set to something).\n // Override the host with OLLAMA_BASE_URL env var when needed.\n const baseURL = process.env.OLLAMA_BASE_URL ?? OLLAMA_DEFAULT_BASE_URL;\n const provider = createOpenAI({ baseURL, apiKey: 'ollama' });\n factory = (modelId) => provider(modelId);\n break;\n }\n default:\n throw new Error(\n `Unknown provider \"${providerName}\". ` +\n `Supported providers: openrouter, anthropic, openai, ollama`\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":[]}
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  generate,
8
8
  getModel
9
- } from "./chunk-IZ6UZ3ZL.js";
9
+ } from "./chunk-WCYBFALM.js";
10
10
  import {
11
11
  loadConfig
12
12
  } from "./chunk-EC42HQQH.js";
@@ -304,4 +304,4 @@ export {
304
304
  listJournals,
305
305
  compressJournals
306
306
  };
307
- //# sourceMappingURL=chunk-4P6TRFPZ.js.map
307
+ //# sourceMappingURL=chunk-Z4HEHWFM.js.map
package/dist/cli/index.js CHANGED
@@ -100,7 +100,7 @@ function askQuestion(rl, question, defaultValue) {
100
100
  });
101
101
  }
102
102
  program.command("init [name]").description("Scaffold a new agent harness directory (interactive if no name given)").option("-d, --dir <path>", "Parent directory", ".").option("-t, --template <name>", "Config template (base, claude-opus, gpt4, local)", "base").option("-p, --purpose <description>", "Agent purpose description").option("-i, --interactive", "Force interactive mode", false).option("--generate", "Generate CORE.md using LLM (requires API key)", false).option("--no-discover-mcp", "Skip MCP server auto-discovery").option("--no-discover-env", "Skip environment variable scanning").option("--no-discover-project", "Skip project context detection").option("-y, --yes", "Accept defaults for all prompts (skip MCP confirmation)", false).action(async (name, opts) => {
103
- const { scaffoldHarness, generateCoreMd, listTemplates } = await import("../scaffold-2F36YVW6.js");
103
+ const { scaffoldHarness, generateCoreMd, listTemplates } = await import("../scaffold-LA54KYKJ.js");
104
104
  const isInteractive = !name || opts.interactive;
105
105
  let agentName = name ?? "";
106
106
  let purpose = opts.purpose ?? "";
@@ -249,7 +249,7 @@ The agent gets better the more you use it. See README.md inside`);
249
249
  }
250
250
  });
251
251
  program.command("run <prompt>").description("Run a prompt through the agent").option("-d, --dir <path>", "Harness directory", ".").option("-s, --stream", "Stream output", false).option("-m, --model <model>", "Model override (or alias: gemma, qwen, glm, claude)").option("-p, --provider <provider>", "Provider override (openrouter, anthropic, openai)").option("-k, --api-key <key>", "API key override (default: from environment)").action(async (prompt, opts) => {
252
- const { createHarness } = await import("../harness-R5FKRICG.js");
252
+ const { createHarness } = await import("../harness-NU2UU6J4.js");
253
253
  const dir = resolve(opts.dir);
254
254
  loadEnvFromDir(dir);
255
255
  requireHarness(dir);
@@ -290,7 +290,7 @@ program.command("run <prompt>").description("Run a prompt through the agent").op
290
290
  }
291
291
  });
292
292
  program.command("chat").description("Start an interactive chat session with conversation memory").option("-d, --dir <path>", "Harness directory", ".").option("-m, --model <model>", "Model override").option("-p, --provider <provider>", "Provider override (openrouter, anthropic, openai)").option("-k, --api-key <key>", "API key override (default: from environment)").option("--fresh", "Start fresh (clear conversation history)", false).action(async (opts) => {
293
- const { Conversation } = await import("../conversation-TBTFIJVU.js");
293
+ const { Conversation } = await import("../conversation-OKBO4L66.js");
294
294
  const { loadConfig } = await import("../config-PYSS3QY6.js");
295
295
  const { buildToolSet } = await import("../tool-executor-6I5PHQDY.js");
296
296
  const { createMcpManager } = await import("../mcp-JSIUJJZV.js");
@@ -477,9 +477,9 @@ program.command("dev").description("Start dev mode \u2014 watches for file chang
477
477
  const { loadConfig } = await import("../config-PYSS3QY6.js");
478
478
  const { rebuildAllIndexes } = await import("../indexer-L5UC6J2V.js");
479
479
  const { createWatcher } = await import("../watcher-GZWQSWZ6.js");
480
- const { Scheduler } = await import("../scheduler-Q7GB2KCW.js");
480
+ const { Scheduler } = await import("../scheduler-MFBVGFZQ.js");
481
481
  const { autoProcessAll } = await import("../auto-processor-QIRUOGEI.js");
482
- const { generateSystemMd } = await import("../scaffold-2F36YVW6.js");
482
+ const { generateSystemMd } = await import("../scaffold-LA54KYKJ.js");
483
483
  const { writeFileSync } = await import("fs");
484
484
  const dir = resolve(opts.dir);
485
485
  loadEnvFromDir(dir);
@@ -547,7 +547,7 @@ program.command("dev").description("Start dev mode \u2014 watches for file chang
547
547
  }
548
548
  let webServer = null;
549
549
  if (opts.web) {
550
- const { startWebServer } = await import("../web-server-2Y4CHD2W.js");
550
+ const { startWebServer } = await import("../web-server-SJ6NS5IX.js");
551
551
  const port = parseInt(opts.port, 10) || 3e3;
552
552
  webServer = await startWebServer({
553
553
  harnessDir: dir,
@@ -649,7 +649,7 @@ Processed ${modified} file(s)${errors > 0 ? `, ${errors} error(s)` : ""}`);
649
649
  });
650
650
  program.command("system").description("Regenerate SYSTEM.md from current directory structure").option("-d, --dir <path>", "Harness directory", ".").action(async (opts) => {
651
651
  const { loadConfig } = await import("../config-PYSS3QY6.js");
652
- const { generateSystemMd } = await import("../scaffold-2F36YVW6.js");
652
+ const { generateSystemMd } = await import("../scaffold-LA54KYKJ.js");
653
653
  const { writeFileSync } = await import("fs");
654
654
  const dir = resolve(opts.dir);
655
655
  requireHarness(dir);
@@ -664,7 +664,7 @@ program.command("journal").description("Synthesize sessions into journal entries
664
664
  loadEnvFromDir(dir);
665
665
  requireHarness(dir);
666
666
  if (opts.pending) {
667
- const { listUnjournaled } = await import("../journal-ITUMKT6U.js");
667
+ const { listUnjournaled } = await import("../journal-O4SEANIC.js");
668
668
  const dates = listUnjournaled(dir);
669
669
  if (dates.length === 0) {
670
670
  console.log("All sessions have been journaled.");
@@ -680,7 +680,7 @@ Run "harness journal --all" to synthesize them.
680
680
  return;
681
681
  }
682
682
  if (opts.from || opts.all) {
683
- const { synthesizeJournalRange } = await import("../journal-ITUMKT6U.js");
683
+ const { synthesizeJournalRange } = await import("../journal-O4SEANIC.js");
684
684
  try {
685
685
  const label = opts.all ? "all dates" : `${opts.from}${opts.to ? ` to ${opts.to}` : " to today"}`;
686
686
  console.log(`Synthesizing journals for ${label}${opts.force ? " (force)" : ""}...`);
@@ -704,7 +704,7 @@ Run "harness journal --all" to synthesize them.
704
704
  }
705
705
  console.log();
706
706
  if (opts.autoHarvest) {
707
- const { harvestInstincts } = await import("../instinct-learner-QGAMIS3X.js");
707
+ const { harvestInstincts } = await import("../instinct-learner-EECG4L24.js");
708
708
  const dates = entries.map((e) => e.date).sort();
709
709
  const harvest = harvestInstincts(dir, {
710
710
  from: dates[0],
@@ -723,7 +723,7 @@ Run "harness journal --all" to synthesize them.
723
723
  }
724
724
  return;
725
725
  }
726
- const { synthesizeJournal } = await import("../journal-ITUMKT6U.js");
726
+ const { synthesizeJournal } = await import("../journal-O4SEANIC.js");
727
727
  try {
728
728
  console.log(`Synthesizing journal...`);
729
729
  const entry = await synthesizeJournal(dir, opts.date);
@@ -735,7 +735,7 @@ Run "harness journal --all" to synthesize them.
735
735
  console.log(` Instinct candidates:`);
736
736
  entry.instinct_candidates.forEach((c) => console.log(` - ${c}`));
737
737
  if (opts.autoHarvest) {
738
- const { harvestInstincts } = await import("../instinct-learner-QGAMIS3X.js");
738
+ const { harvestInstincts } = await import("../instinct-learner-EECG4L24.js");
739
739
  const harvest = harvestInstincts(dir, {
740
740
  from: entry.date,
741
741
  to: entry.date,
@@ -755,7 +755,7 @@ ${entry.synthesis}`);
755
755
  }
756
756
  });
757
757
  program.command("compress").description("Compress daily journals into weekly roll-up summaries").option("-d, --dir <path>", "Harness directory", ".").option("--force", "Overwrite existing weekly summaries", false).action(async (opts) => {
758
- const { compressJournals } = await import("../journal-ITUMKT6U.js");
758
+ const { compressJournals } = await import("../journal-O4SEANIC.js");
759
759
  const dir = resolve(opts.dir);
760
760
  requireHarness(dir);
761
761
  const results = compressJournals(dir, { force: opts.force });
@@ -775,7 +775,7 @@ program.command("compress").description("Compress daily journals into weekly rol
775
775
  console.log();
776
776
  });
777
777
  program.command("learn").description("Analyze sessions and propose new instincts").option("-d, --dir <path>", "Harness directory", ".").option("--install", "Auto-install proposed instincts", false).action(async (opts) => {
778
- const { learnFromSessions } = await import("../instinct-learner-QGAMIS3X.js");
778
+ const { learnFromSessions } = await import("../instinct-learner-EECG4L24.js");
779
779
  const dir = resolve(opts.dir);
780
780
  requireHarness(dir);
781
781
  try {
@@ -801,7 +801,7 @@ ${result.candidates.length} instinct candidate(s):
801
801
  }
802
802
  });
803
803
  program.command("harvest").description("Extract instinct candidates from journal entries and optionally install them").option("-d, --dir <path>", "Harness directory", ".").option("--from <date>", "Start date (YYYY-MM-DD)").option("--to <date>", "End date (YYYY-MM-DD)").option("--install", "Auto-install candidates as draft instincts", false).action(async (opts) => {
804
- const { harvestInstincts } = await import("../instinct-learner-QGAMIS3X.js");
804
+ const { harvestInstincts } = await import("../instinct-learner-EECG4L24.js");
805
805
  const dir = resolve(opts.dir);
806
806
  requireHarness(dir);
807
807
  const result = harvestInstincts(dir, {
@@ -1144,7 +1144,7 @@ ${docs.length} workflow(s):
1144
1144
  console.log();
1145
1145
  });
1146
1146
  workflowCmd.command("run <id>").description("Execute a workflow by ID (bypasses quiet hours)").option("-d, --dir <path>", "Harness directory", ".").action(async (workflowId, opts) => {
1147
- const { Scheduler } = await import("../scheduler-Q7GB2KCW.js");
1147
+ const { Scheduler } = await import("../scheduler-MFBVGFZQ.js");
1148
1148
  const dir = resolve(opts.dir);
1149
1149
  loadEnvFromDir(dir);
1150
1150
  requireHarness(dir);
@@ -1969,7 +1969,7 @@ Session Analytics
1969
1969
  console.log();
1970
1970
  });
1971
1971
  program.command("auto-promote").description("Find instinct patterns appearing 3+ times across journals and optionally install them").option("-d, --dir <path>", "Harness directory", ".").option("--threshold <n>", "Minimum occurrences across different dates", "3").option("--install", "Auto-install promoted instincts", false).option("--json", "Output as JSON", false).action(async (opts) => {
1972
- const { autoPromoteInstincts } = await import("../intelligence-XPV3MC5U.js");
1972
+ const { autoPromoteInstincts } = await import("../intelligence-BANUEAI4.js");
1973
1973
  const dir = resolve(opts.dir);
1974
1974
  requireHarness(dir);
1975
1975
  const result = autoPromoteInstincts(dir, {
@@ -2003,7 +2003,7 @@ function behaviorToCliId(behavior) {
2003
2003
  return behavior.toLowerCase().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").slice(0, 50).replace(/-+$/, "");
2004
2004
  }
2005
2005
  program.command("dead-primitives").description("Detect orphaned primitives not modified in 30+ days").option("-d, --dir <path>", "Harness directory", ".").option("--days <n>", "Threshold days since last modification", "30").option("--json", "Output as JSON", false).action(async (opts) => {
2006
- const { detectDeadPrimitives } = await import("../intelligence-XPV3MC5U.js");
2006
+ const { detectDeadPrimitives } = await import("../intelligence-BANUEAI4.js");
2007
2007
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2008
2008
  const dir = resolve(opts.dir);
2009
2009
  requireHarness(dir);
@@ -2036,7 +2036,7 @@ Scanned ${result.totalScanned} primitive(s) (threshold: ${result.thresholdDays}
2036
2036
  }
2037
2037
  });
2038
2038
  program.command("contradictions").description("Detect contradictions between rules and instincts").option("-d, --dir <path>", "Harness directory", ".").option("--json", "Output as JSON", false).action(async (opts) => {
2039
- const { detectContradictions } = await import("../intelligence-XPV3MC5U.js");
2039
+ const { detectContradictions } = await import("../intelligence-BANUEAI4.js");
2040
2040
  const dir = resolve(opts.dir);
2041
2041
  requireHarness(dir);
2042
2042
  const result = detectContradictions(dir);
@@ -2061,7 +2061,7 @@ Checked ${result.rulesChecked} rule(s) and ${result.instinctsChecked} instinct(s
2061
2061
  }
2062
2062
  });
2063
2063
  program.command("enrich").description("Enrich sessions with extracted topics, tools, and primitive references").option("-d, --dir <path>", "Harness directory", ".").option("--from <date>", "Start date (YYYY-MM-DD)").option("--to <date>", "End date (YYYY-MM-DD)").option("--json", "Output as JSON", false).action(async (opts) => {
2064
- const { enrichSessions } = await import("../intelligence-XPV3MC5U.js");
2064
+ const { enrichSessions } = await import("../intelligence-BANUEAI4.js");
2065
2065
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2066
2066
  const dir = resolve(opts.dir);
2067
2067
  requireHarness(dir);
@@ -2093,7 +2093,7 @@ Enriched ${result.sessionsScanned} session(s)
2093
2093
  }
2094
2094
  });
2095
2095
  program.command("suggest").description("Suggest capabilities (skills/playbooks) for frequent uncovered session topics").option("-d, --dir <path>", "Harness directory", ".").option("--min-frequency <n>", "Minimum topic frequency", "3").option("--json", "Output as JSON", false).action(async (opts) => {
2096
- const { suggestCapabilities } = await import("../intelligence-XPV3MC5U.js");
2096
+ const { suggestCapabilities } = await import("../intelligence-BANUEAI4.js");
2097
2097
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2098
2098
  const dir = resolve(opts.dir);
2099
2099
  requireHarness(dir);
@@ -2126,7 +2126,7 @@ Analyzed ${result.topicsAnalyzed} topic(s) from ${result.sessionsScanned} sessio
2126
2126
  }
2127
2127
  });
2128
2128
  program.command("agents").description("List available sub-agents").option("-d, --dir <path>", "Harness directory", ".").action(async (opts) => {
2129
- const { listAgents } = await import("../delegate-3KJAL4NZ.js");
2129
+ const { listAgents } = await import("../delegate-YOGVA3HB.js");
2130
2130
  const dir = resolve(opts.dir);
2131
2131
  const agents = listAgents(dir);
2132
2132
  if (agents.length === 0) {
@@ -2159,7 +2159,7 @@ program.command("delegate <agent-id> <prompt>").description("Delegate a prompt t
2159
2159
  try {
2160
2160
  console.error(`[delegate] Invoking agent "${agentId}"${opts.stream ? " (streaming)" : ""}...`);
2161
2161
  if (opts.stream) {
2162
- const { delegateStream } = await import("../delegate-3KJAL4NZ.js");
2162
+ const { delegateStream } = await import("../delegate-YOGVA3HB.js");
2163
2163
  const result = delegateStream(delegateOpts);
2164
2164
  process.stdout.write("\n");
2165
2165
  for await (const chunk of result.textStream) {
@@ -2170,7 +2170,7 @@ program.command("delegate <agent-id> <prompt>").description("Delegate a prompt t
2170
2170
  `[delegate] Agent: ${result.agentId} | session: ${result.sessionId}`
2171
2171
  );
2172
2172
  } else {
2173
- const { delegateTo } = await import("../delegate-3KJAL4NZ.js");
2173
+ const { delegateTo } = await import("../delegate-YOGVA3HB.js");
2174
2174
  const result = await delegateTo(delegateOpts);
2175
2175
  console.log("\n" + result.text + "\n");
2176
2176
  console.error(
@@ -2664,7 +2664,7 @@ Suggestions:
2664
2664
  });
2665
2665
  var generateCmd = program.command("generate").description("Auto-generate harness files");
2666
2666
  generateCmd.command("system").description("Regenerate SYSTEM.md from actual directory structure").option("-d, --dir <path>", "Harness directory", ".").action(async (opts) => {
2667
- const { generateSystemMd } = await import("../scaffold-2F36YVW6.js");
2667
+ const { generateSystemMd } = await import("../scaffold-LA54KYKJ.js");
2668
2668
  const dir = resolve(opts.dir);
2669
2669
  requireHarness(dir);
2670
2670
  const { loadConfig } = await import("../config-PYSS3QY6.js");
@@ -2718,7 +2718,7 @@ var intelligenceCmd = program.command("intelligence").description("Intelligence
2718
2718
  intelligenceCmd.command("promote").description("Auto-promote instinct candidates that appear 3+ times across journals").option("-d, --dir <dir>", "Harness directory", ".").option("--threshold <n>", "Minimum occurrences to promote", "3").option("--install", "Install promoted instincts as .md files").option("--json", "Output as JSON").action(async (opts) => {
2719
2719
  const dir = resolve(opts.dir);
2720
2720
  loadEnvFromDir(dir);
2721
- const { autoPromoteInstincts } = await import("../intelligence-XPV3MC5U.js");
2721
+ const { autoPromoteInstincts } = await import("../intelligence-BANUEAI4.js");
2722
2722
  const result = autoPromoteInstincts(dir, {
2723
2723
  threshold: parseInt(opts.threshold, 10),
2724
2724
  install: opts.install ?? false
@@ -2749,7 +2749,7 @@ Promoted: ${result.promoted.join(", ")}`);
2749
2749
  intelligenceCmd.command("dead").description("Detect dead primitives (unreferenced and old)").option("-d, --dir <dir>", "Harness directory", ".").option("--threshold <days>", "Days since modification to consider dead", "30").option("--json", "Output as JSON").action(async (opts) => {
2750
2750
  const dir = resolve(opts.dir);
2751
2751
  loadEnvFromDir(dir);
2752
- const { detectDeadPrimitives } = await import("../intelligence-XPV3MC5U.js");
2752
+ const { detectDeadPrimitives } = await import("../intelligence-BANUEAI4.js");
2753
2753
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2754
2754
  let config;
2755
2755
  try {
@@ -2779,7 +2779,7 @@ Dead primitives (${result.dead.length}):`);
2779
2779
  intelligenceCmd.command("contradictions").description("Detect contradictions between rules and instincts").option("-d, --dir <dir>", "Harness directory", ".").option("--json", "Output as JSON").action(async (opts) => {
2780
2780
  const dir = resolve(opts.dir);
2781
2781
  loadEnvFromDir(dir);
2782
- const { detectContradictions } = await import("../intelligence-XPV3MC5U.js");
2782
+ const { detectContradictions } = await import("../intelligence-BANUEAI4.js");
2783
2783
  const result = detectContradictions(dir);
2784
2784
  if (opts.json) {
2785
2785
  console.log(JSON.stringify(result, null, 2));
@@ -2800,7 +2800,7 @@ Contradictions (${result.contradictions.length}):`);
2800
2800
  intelligenceCmd.command("enrich").description("Enrich sessions with topics, token counts, and related primitives").option("-d, --dir <dir>", "Harness directory", ".").option("--from <date>", "Start date (YYYY-MM-DD)").option("--to <date>", "End date (YYYY-MM-DD)").option("--json", "Output as JSON").action(async (opts) => {
2801
2801
  const dir = resolve(opts.dir);
2802
2802
  loadEnvFromDir(dir);
2803
- const { enrichSessions } = await import("../intelligence-XPV3MC5U.js");
2803
+ const { enrichSessions } = await import("../intelligence-BANUEAI4.js");
2804
2804
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2805
2805
  let config;
2806
2806
  try {
@@ -2827,7 +2827,7 @@ intelligenceCmd.command("enrich").description("Enrich sessions with topics, toke
2827
2827
  intelligenceCmd.command("suggest").description("Suggest new skills/playbooks for frequent uncovered topics").option("-d, --dir <dir>", "Harness directory", ".").option("--min-frequency <n>", "Minimum topic frequency", "3").option("--json", "Output as JSON").action(async (opts) => {
2828
2828
  const dir = resolve(opts.dir);
2829
2829
  loadEnvFromDir(dir);
2830
- const { suggestCapabilities } = await import("../intelligence-XPV3MC5U.js");
2830
+ const { suggestCapabilities } = await import("../intelligence-BANUEAI4.js");
2831
2831
  const { loadConfig } = await import("../config-PYSS3QY6.js");
2832
2832
  let config;
2833
2833
  try {
@@ -2857,7 +2857,7 @@ Suggestions (${result.suggestions.length}):`);
2857
2857
  intelligenceCmd.command("failures").description("Analyze recent failure patterns and suggest recovery strategies").option("-d, --dir <dir>", "Harness directory", ".").option("--days <n>", "Days to look back", "7").option("--json", "Output as JSON").action(async (opts) => {
2858
2858
  const dir = resolve(opts.dir);
2859
2859
  loadEnvFromDir(dir);
2860
- const { analyzeFailures } = await import("../intelligence-XPV3MC5U.js");
2860
+ const { analyzeFailures } = await import("../intelligence-BANUEAI4.js");
2861
2861
  const result = analyzeFailures(dir, { days: parseInt(opts.days, 10) });
2862
2862
  if (opts.json) {
2863
2863
  console.log(JSON.stringify(result, null, 2));
@@ -2882,7 +2882,7 @@ intelligenceCmd.command("failures").description("Analyze recent failure patterns
2882
2882
  }
2883
2883
  });
2884
2884
  intelligenceCmd.command("classify <error>").description("Classify an error message into a failure mode").action(async (errorMsg) => {
2885
- const { classifyFailure, getRecoveryStrategies, FAILURE_TAXONOMY } = await import("../intelligence-XPV3MC5U.js");
2885
+ const { classifyFailure, getRecoveryStrategies, FAILURE_TAXONOMY } = await import("../intelligence-BANUEAI4.js");
2886
2886
  const mode = classifyFailure(errorMsg);
2887
2887
  const info = FAILURE_TAXONOMY.modes[mode];
2888
2888
  const strategies = getRecoveryStrategies(mode);
@@ -2899,7 +2899,7 @@ var gateCmd = program.command("gate").description("Run verification gates");
2899
2899
  gateCmd.command("run [name]").description("Run a verification gate (or all gates if no name)").option("-d, --dir <dir>", "Harness directory", ".").option("--json", "Output as JSON").action(async (name, opts) => {
2900
2900
  const dir = resolve(opts.dir);
2901
2901
  loadEnvFromDir(dir);
2902
- const { runGate, runAllGates } = await import("../intelligence-XPV3MC5U.js");
2902
+ const { runGate, runAllGates } = await import("../intelligence-BANUEAI4.js");
2903
2903
  if (name) {
2904
2904
  const result = runGate(name, dir);
2905
2905
  if (opts.json) {
@@ -2929,7 +2929,7 @@ gateCmd.command("run [name]").description("Run a verification gate (or all gates
2929
2929
  }
2930
2930
  });
2931
2931
  gateCmd.command("list").description("List available verification gates").action(async () => {
2932
- const { listGates } = await import("../intelligence-XPV3MC5U.js");
2932
+ const { listGates } = await import("../intelligence-BANUEAI4.js");
2933
2933
  const gates = listGates();
2934
2934
  for (const g of gates) {
2935
2935
  console.log(` ${g.name}: ${g.description}`);
@@ -3122,7 +3122,7 @@ emoCmd.command("reset").description("Reset emotional state to defaults").option(
3122
3122
  program.command("serve").description("Start the harness HTTP API server for webhooks and integrations").option("-d, --dir <dir>", "Harness directory", ".").option("-p, --port <port>", "Port to listen on", "8080").option("--api-key <key>", "API key for LLM provider").option("--webhook-secret <secret>", "Secret for authenticating webhook management API").option("--no-cors", "Disable CORS").action(async (opts) => {
3123
3123
  const dir = resolve(opts.dir);
3124
3124
  loadEnvFromDir(dir);
3125
- const { startServe } = await import("../serve-MXRTP2HE.js");
3125
+ const { startServe } = await import("../serve-TQLN4OTP.js");
3126
3126
  const port = parseInt(opts.port, 10);
3127
3127
  const result = startServe({
3128
3128
  harnessDir: dir,
@@ -4,13 +4,13 @@ import {
4
4
  Conversation,
5
5
  parseJsonlContext,
6
6
  parseLegacyContext
7
- } from "./chunk-UMXPOYZR.js";
7
+ } from "./chunk-7MSZVP7A.js";
8
8
  import "./chunk-7GZ4D6V6.js";
9
9
  import "./chunk-DTTXPHFW.js";
10
10
  import "./chunk-Z2PUCXTZ.js";
11
11
  import "./chunk-2UVWCTAY.js";
12
12
  import "./chunk-BSKDOFRT.js";
13
- import "./chunk-IZ6UZ3ZL.js";
13
+ import "./chunk-WCYBFALM.js";
14
14
  import "./chunk-EC42HQQH.js";
15
15
  import "./chunk-4TQQZILG.js";
16
16
  export {
@@ -18,4 +18,4 @@ export {
18
18
  parseJsonlContext,
19
19
  parseLegacyContext
20
20
  };
21
- //# sourceMappingURL=conversation-TBTFIJVU.js.map
21
+ //# sourceMappingURL=conversation-OKBO4L66.js.map
@@ -7,14 +7,14 @@ import {
7
7
  findAgent,
8
8
  listAgents,
9
9
  loadAgentDocs
10
- } from "./chunk-M62KLIEK.js";
10
+ } from "./chunk-QU566LZE.js";
11
11
  import "./chunk-5CO5JTYT.js";
12
12
  import "./chunk-DTTXPHFW.js";
13
13
  import "./chunk-Z2PUCXTZ.js";
14
14
  import "./chunk-PMFAYKBD.js";
15
15
  import "./chunk-2UVWCTAY.js";
16
16
  import "./chunk-BSKDOFRT.js";
17
- import "./chunk-IZ6UZ3ZL.js";
17
+ import "./chunk-WCYBFALM.js";
18
18
  import "./chunk-EC42HQQH.js";
19
19
  import "./chunk-4TQQZILG.js";
20
20
  export {
@@ -25,4 +25,4 @@ export {
25
25
  listAgents,
26
26
  loadAgentDocs
27
27
  };
28
- //# sourceMappingURL=delegate-3KJAL4NZ.js.map
28
+ //# sourceMappingURL=delegate-YOGVA3HB.js.map
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  createHarness
5
- } from "./chunk-KLYMGWQJ.js";
5
+ } from "./chunk-LACZLSC4.js";
6
6
  import "./chunk-AGAAFJEO.js";
7
7
  import "./chunk-5H34JPMB.js";
8
8
  import "./chunk-5CO5JTYT.js";
@@ -16,10 +16,10 @@ import "./chunk-OC6YSTDX.js";
16
16
  import "./chunk-PMFAYKBD.js";
17
17
  import "./chunk-2UVWCTAY.js";
18
18
  import "./chunk-BSKDOFRT.js";
19
- import "./chunk-IZ6UZ3ZL.js";
19
+ import "./chunk-WCYBFALM.js";
20
20
  import "./chunk-EC42HQQH.js";
21
21
  import "./chunk-4TQQZILG.js";
22
22
  export {
23
23
  createHarness
24
24
  };
25
- //# sourceMappingURL=harness-R5FKRICG.js.map
25
+ //# sourceMappingURL=harness-NU2UU6J4.js.map
@@ -5,9 +5,9 @@ import {
5
5
  installInstinct,
6
6
  learnFromSessions,
7
7
  proposeInstincts
8
- } from "./chunk-M6PDMK2O.js";
8
+ } from "./chunk-LBT43BZA.js";
9
9
  import "./chunk-2UVWCTAY.js";
10
- import "./chunk-IZ6UZ3ZL.js";
10
+ import "./chunk-WCYBFALM.js";
11
11
  import "./chunk-EC42HQQH.js";
12
12
  import "./chunk-4TQQZILG.js";
13
13
  export {
@@ -16,4 +16,4 @@ export {
16
16
  learnFromSessions,
17
17
  proposeInstincts
18
18
  };
19
- //# sourceMappingURL=instinct-learner-QGAMIS3X.js.map
19
+ //# sourceMappingURL=instinct-learner-EECG4L24.js.map
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-QMOIVORH.js";
9
9
  import {
10
10
  installInstinct
11
- } from "./chunk-M6PDMK2O.js";
11
+ } from "./chunk-LBT43BZA.js";
12
12
  import "./chunk-UXCHAS3Z.js";
13
13
  import {
14
14
  buildRateLimits
@@ -31,7 +31,7 @@ import {
31
31
  import {
32
32
  log
33
33
  } from "./chunk-BSKDOFRT.js";
34
- import "./chunk-IZ6UZ3ZL.js";
34
+ import "./chunk-WCYBFALM.js";
35
35
  import {
36
36
  loadConfig
37
37
  } from "./chunk-EC42HQQH.js";
@@ -1075,4 +1075,4 @@ export {
1075
1075
  runGate,
1076
1076
  suggestCapabilities
1077
1077
  };
1078
- //# sourceMappingURL=intelligence-XPV3MC5U.js.map
1078
+ //# sourceMappingURL=intelligence-BANUEAI4.js.map
@@ -7,9 +7,9 @@ import {
7
7
  parseJournalSynthesis,
8
8
  synthesizeJournal,
9
9
  synthesizeJournalRange
10
- } from "./chunk-4P6TRFPZ.js";
10
+ } from "./chunk-Z4HEHWFM.js";
11
11
  import "./chunk-2UVWCTAY.js";
12
- import "./chunk-IZ6UZ3ZL.js";
12
+ import "./chunk-WCYBFALM.js";
13
13
  import "./chunk-EC42HQQH.js";
14
14
  import "./chunk-4TQQZILG.js";
15
15
  export {
@@ -20,4 +20,4 @@ export {
20
20
  synthesizeJournal,
21
21
  synthesizeJournalRange
22
22
  };
23
- //# sourceMappingURL=journal-ITUMKT6U.js.map
23
+ //# sourceMappingURL=journal-O4SEANIC.js.map
@@ -11,7 +11,7 @@ import {
11
11
  streamGenerate,
12
12
  streamGenerateWithDetails,
13
13
  streamWithMessages
14
- } from "./chunk-IZ6UZ3ZL.js";
14
+ } from "./chunk-WCYBFALM.js";
15
15
  export {
16
16
  generate,
17
17
  generateWithMessages,
@@ -24,4 +24,4 @@ export {
24
24
  streamGenerateWithDetails,
25
25
  streamWithMessages
26
26
  };
27
- //# sourceMappingURL=provider-HQY6SPZI.js.map
27
+ //# sourceMappingURL=provider-75AKTYGB.js.map
@@ -279,7 +279,7 @@ function generateSystemMd(harnessDir, agentName) {
279
279
  }
280
280
  async function generateCoreMd(agentName, purpose, options) {
281
281
  try {
282
- const { generate, getModel } = await import("./provider-HQY6SPZI.js");
282
+ const { generate, getModel } = await import("./provider-75AKTYGB.js");
283
283
  const { HarnessConfigSchema } = await import("./types-NPJZAI72.js");
284
284
  const config = HarnessConfigSchema.parse({
285
285
  agent: { name: agentName, version: "0.1.0" },
@@ -343,4 +343,4 @@ export {
343
343
  listTemplates,
344
344
  scaffoldHarness
345
345
  };
346
- //# sourceMappingURL=scaffold-2F36YVW6.js.map
346
+ //# sourceMappingURL=scaffold-LA54KYKJ.js.map
@@ -3,21 +3,21 @@
3
3
  import {
4
4
  listUnjournaled,
5
5
  synthesizeJournal
6
- } from "./chunk-4P6TRFPZ.js";
6
+ } from "./chunk-Z4HEHWFM.js";
7
7
  import {
8
8
  learnFromSessions
9
- } from "./chunk-M6PDMK2O.js";
9
+ } from "./chunk-LBT43BZA.js";
10
10
  import {
11
11
  recordRun
12
12
  } from "./chunk-6EMOEYGU.js";
13
13
  import {
14
14
  createHarness
15
- } from "./chunk-KLYMGWQJ.js";
15
+ } from "./chunk-LACZLSC4.js";
16
16
  import "./chunk-AGAAFJEO.js";
17
17
  import "./chunk-5H34JPMB.js";
18
18
  import {
19
19
  delegateTo
20
- } from "./chunk-M62KLIEK.js";
20
+ } from "./chunk-QU566LZE.js";
21
21
  import "./chunk-5CO5JTYT.js";
22
22
  import "./chunk-7GZ4D6V6.js";
23
23
  import "./chunk-UDZIS2AQ.js";
@@ -39,7 +39,7 @@ import {
39
39
  import {
40
40
  log
41
41
  } from "./chunk-BSKDOFRT.js";
42
- import "./chunk-IZ6UZ3ZL.js";
42
+ import "./chunk-WCYBFALM.js";
43
43
  import {
44
44
  loadConfig
45
45
  } from "./chunk-EC42HQQH.js";
@@ -393,4 +393,4 @@ export {
393
393
  Scheduler,
394
394
  isQuietHours
395
395
  };
396
- //# sourceMappingURL=scheduler-Q7GB2KCW.js.map
396
+ //# sourceMappingURL=scheduler-MFBVGFZQ.js.map
@@ -5,12 +5,12 @@ import {
5
5
  cors,
6
6
  createWebApp,
7
7
  serve
8
- } from "./chunk-SEHAQTBO.js";
8
+ } from "./chunk-IFVCU33I.js";
9
9
  import "./chunk-5O5OGOOQ.js";
10
10
  import "./chunk-6EMOEYGU.js";
11
11
  import "./chunk-GNUSHD2Y.js";
12
12
  import "./chunk-5H34JPMB.js";
13
- import "./chunk-UMXPOYZR.js";
13
+ import "./chunk-7MSZVP7A.js";
14
14
  import "./chunk-7GZ4D6V6.js";
15
15
  import "./chunk-UDZIS2AQ.js";
16
16
  import "./chunk-DTTXPHFW.js";
@@ -23,7 +23,7 @@ import "./chunk-2UVWCTAY.js";
23
23
  import {
24
24
  log
25
25
  } from "./chunk-BSKDOFRT.js";
26
- import "./chunk-IZ6UZ3ZL.js";
26
+ import "./chunk-WCYBFALM.js";
27
27
  import {
28
28
  loadConfig
29
29
  } from "./chunk-EC42HQQH.js";
@@ -140,7 +140,7 @@ function startServe(options) {
140
140
  return c.json({ error: "prompt is required" }, 400);
141
141
  }
142
142
  try {
143
- const { createHarness } = await import("./harness-R5FKRICG.js");
143
+ const { createHarness } = await import("./harness-NU2UU6J4.js");
144
144
  const harness = createHarness({
145
145
  dir: harnessDir,
146
146
  model: body.model,
@@ -287,4 +287,4 @@ function startServe(options) {
287
287
  export {
288
288
  startServe
289
289
  };
290
- //# sourceMappingURL=serve-MXRTP2HE.js.map
290
+ //# sourceMappingURL=serve-TQLN4OTP.js.map
@@ -3,12 +3,12 @@
3
3
  import {
4
4
  createWebApp,
5
5
  startWebServer
6
- } from "./chunk-SEHAQTBO.js";
6
+ } from "./chunk-IFVCU33I.js";
7
7
  import "./chunk-5O5OGOOQ.js";
8
8
  import "./chunk-6EMOEYGU.js";
9
9
  import "./chunk-GNUSHD2Y.js";
10
10
  import "./chunk-5H34JPMB.js";
11
- import "./chunk-UMXPOYZR.js";
11
+ import "./chunk-7MSZVP7A.js";
12
12
  import "./chunk-7GZ4D6V6.js";
13
13
  import "./chunk-UDZIS2AQ.js";
14
14
  import "./chunk-DTTXPHFW.js";
@@ -17,11 +17,11 @@ import "./chunk-TAT6JU3X.js";
17
17
  import "./chunk-JKMGYWXB.js";
18
18
  import "./chunk-2UVWCTAY.js";
19
19
  import "./chunk-BSKDOFRT.js";
20
- import "./chunk-IZ6UZ3ZL.js";
20
+ import "./chunk-WCYBFALM.js";
21
21
  import "./chunk-EC42HQQH.js";
22
22
  import "./chunk-4TQQZILG.js";
23
23
  export {
24
24
  createWebApp,
25
25
  startWebServer
26
26
  };
27
- //# sourceMappingURL=web-server-2Y4CHD2W.js.map
27
+ //# sourceMappingURL=web-server-SJ6NS5IX.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.7",
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/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":[]}