@agntk/agent-harness 0.1.5 → 0.1.6
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.
- package/README.md +104 -43
- package/dist/{analytics-RPT73WNM.js → analytics-L24W3B7U.js} +1 -2
- package/dist/{auto-processor-SDAJF67T.js → auto-processor-QIRUOGEI.js} +1 -2
- package/dist/{chunk-NBEAK63K.js → chunk-4P6TRFPZ.js} +1 -1
- package/dist/chunk-4P6TRFPZ.js.map +1 -0
- package/dist/{chunk-NOJW5KG2.js → chunk-5CO5JTYT.js} +2 -2
- package/dist/chunk-5CO5JTYT.js.map +1 -0
- package/dist/{chunk-P74KXHA4.js → chunk-KLYMGWQJ.js} +2 -2
- package/dist/chunk-KLYMGWQJ.js.map +1 -0
- package/dist/{chunk-PTQ37NRI.js → chunk-M62KLIEK.js} +2 -2
- package/dist/chunk-M62KLIEK.js.map +1 -0
- package/dist/{chunk-2ENYRENZ.js → chunk-PMFAYKBD.js} +1 -1
- package/dist/chunk-PMFAYKBD.js.map +1 -0
- package/dist/{chunk-GX2RCSFJ.js → chunk-QMOIVORH.js} +1 -1
- package/dist/chunk-QMOIVORH.js.map +1 -0
- package/dist/cli/index.js +150 -165
- package/dist/cli/index.js.map +1 -1
- package/dist/{config-2O6S2YJO.js → config-PYSS3QY6.js} +1 -2
- package/dist/{context-loader-XCZ5EXNG.js → context-loader-RSXXFW5R.js} +1 -2
- package/dist/{conversation-OPLE23IM.js → conversation-TBTFIJVU.js} +1 -2
- package/dist/{cost-tracker-RS3W7SVY.js → cost-tracker-NZRZEHVA.js} +1 -2
- package/dist/{delegate-ZJCIADNN.js → delegate-3KJAL4NZ.js} +4 -5
- package/dist/{emotional-state-VQVRA6ED.js → emotional-state-IN4ZUL2Q.js} +1 -2
- package/dist/{emotional-state-VQVRA6ED.js.map → emotional-state-IN4ZUL2Q.js.map} +1 -1
- package/dist/{env-discovery-2BLVMAIM.js → env-discovery-PXBRE5FX.js} +1 -2
- package/dist/{env-discovery-2BLVMAIM.js.map → env-discovery-PXBRE5FX.js.map} +1 -1
- package/dist/{export-2HEAAOUF.js → export-GYLWROMB.js} +1 -2
- package/dist/{export-2HEAAOUF.js.map → export-GYLWROMB.js.map} +1 -1
- package/dist/{graph-5MKRTC3J.js → graph-LEEO37L3.js} +2 -3
- package/dist/{harness-XSBQBY7T.js → harness-R5FKRICG.js} +4 -5
- package/dist/{health-NZ6WNIMV.js → health-HL2JYHIY.js} +1 -2
- package/dist/{indexer-YKSGUVYT.js → indexer-L5UC6J2V.js} +1 -2
- package/dist/{instinct-learner-CWVMLUWX.js → instinct-learner-QGAMIS3X.js} +1 -2
- package/dist/{intake-M5NRR6QR.js → intake-SVJKFHTL.js} +1 -2
- package/dist/{intelligence-UW4TCOC7.js → intelligence-XPV3MC5U.js} +2 -5
- package/dist/intelligence-XPV3MC5U.js.map +1 -0
- package/dist/{journal-KN265YLU.js → journal-ITUMKT6U.js} +2 -3
- package/dist/{loader-BOCVXVCH.js → loader-27PLDCOJ.js} +1 -2
- package/dist/{mcp-WTQJJZAO.js → mcp-JSIUJJZV.js} +1 -2
- package/dist/{mcp-discovery-WPAQFL6S.js → mcp-discovery-DG3RQYLM.js} +1 -2
- package/dist/{mcp-discovery-WPAQFL6S.js.map → mcp-discovery-DG3RQYLM.js.map} +1 -1
- package/dist/{mcp-installer-KV3XZRRF.js → mcp-installer-X2TJ2S2G.js} +1 -2
- package/dist/{mcp-installer-KV3XZRRF.js.map → mcp-installer-X2TJ2S2G.js.map} +1 -1
- package/dist/{metrics-KXGNFAAB.js → metrics-2MNINXNQ.js} +1 -2
- package/dist/{primitive-registry-HOJMUFBT.js → primitive-registry-ZMGGXSO5.js} +1 -2
- package/dist/{primitive-registry-HOJMUFBT.js.map → primitive-registry-ZMGGXSO5.js.map} +1 -1
- package/dist/{project-discovery-C4UMD7JI.js → project-discovery-FQLAZKEM.js} +1 -2
- package/dist/project-discovery-FQLAZKEM.js.map +1 -0
- package/dist/{provider-SXPQZ74H.js → provider-HQY6SPZI.js} +1 -2
- package/dist/{rate-limiter-RLRVM325.js → rate-limiter-PH5DCVU4.js} +1 -2
- package/dist/{rule-engine-I4AFQSSR.js → rule-engine-DM26S77N.js} +1 -2
- package/dist/{rule-engine-I4AFQSSR.js.map → rule-engine-DM26S77N.js.map} +1 -1
- package/dist/{scaffold-ZY4XWINP.js → scaffold-2F36YVW6.js} +3 -4
- package/dist/{scaffold-ZY4XWINP.js.map → scaffold-2F36YVW6.js.map} +1 -1
- package/dist/{scheduler-TYOQKO4C.js → scheduler-Q7GB2KCW.js} +6 -7
- package/dist/{scheduler-TYOQKO4C.js.map → scheduler-Q7GB2KCW.js.map} +1 -1
- package/dist/{search-4IYM525O.js → search-6Y6NCOLQ.js} +1 -2
- package/dist/search-6Y6NCOLQ.js.map +1 -0
- package/dist/{semantic-search-G624D6CI.js → semantic-search-FN6FZIXI.js} +1 -2
- package/dist/semantic-search-FN6FZIXI.js.map +1 -0
- package/dist/{serve-QFUZWOU3.js → serve-MXRTP2HE.js} +3 -4
- package/dist/serve-MXRTP2HE.js.map +1 -0
- package/dist/{sessions-CZGVXKQE.js → sessions-G6SZZXWS.js} +1 -2
- package/dist/{sources-RW5DT56F.js → sources-7LDYO5GK.js} +1 -2
- package/dist/{starter-packs-76YUVHEU.js → starter-packs-OR7NI5NA.js} +1 -2
- package/dist/{starter-packs-76YUVHEU.js.map → starter-packs-OR7NI5NA.js.map} +1 -1
- package/dist/{state-GMXILIHW.js → state-25IQEC5C.js} +1 -2
- package/dist/{state-merge-NKO5FRBA.js → state-merge-E333OEIQ.js} +1 -2
- package/dist/{state-merge-NKO5FRBA.js.map → state-merge-E333OEIQ.js.map} +1 -1
- package/dist/{telemetry-MVDNGJEC.js → telemetry-RS2JZUZP.js} +1 -2
- package/dist/{tool-executor-KEYQLO4M.js → tool-executor-6I5PHQDY.js} +3 -4
- package/dist/{tools-EB3BHRRF.js → tools-NDFJNVHK.js} +2 -3
- package/dist/{types-NYKB2DN3.js → types-NPJZAI72.js} +1 -2
- package/dist/{universal-installer-7MFCJUW7.js → universal-installer-LCAZHFZR.js} +2 -3
- package/dist/universal-installer-LCAZHFZR.js.map +1 -0
- package/dist/{validator-LZXBFEPV.js → validator-LM7RZWSH.js} +1 -2
- package/dist/{verification-gate-ALSJVKSW.js → verification-gate-2O6DF2B7.js} +1 -2
- package/dist/verification-gate-2O6DF2B7.js.map +1 -0
- package/dist/{versioning-Z3XNE2Q2.js → versioning-WEGF6KJG.js} +1 -2
- package/dist/versioning-WEGF6KJG.js.map +1 -0
- package/dist/{watcher-CSHVDOCM.js → watcher-GZWQSWZ6.js} +1 -2
- package/dist/{watcher-CSHVDOCM.js.map → watcher-GZWQSWZ6.js.map} +1 -1
- package/dist/{web-server-7NGOTK7J.js → web-server-2Y4CHD2W.js} +1 -2
- package/package.json +1 -9
- package/dist/agent-framework-CMFC3VJM.js +0 -344
- package/dist/agent-framework-CMFC3VJM.js.map +0 -1
- package/dist/chunk-2ENYRENZ.js.map +0 -1
- package/dist/chunk-DGUM43GV.js +0 -11
- package/dist/chunk-FD55B3IO.js +0 -204
- package/dist/chunk-FD55B3IO.js.map +0 -1
- package/dist/chunk-GX2RCSFJ.js.map +0 -1
- package/dist/chunk-MSO7DKBK.js +0 -2123
- package/dist/chunk-MSO7DKBK.js.map +0 -1
- package/dist/chunk-NBEAK63K.js.map +0 -1
- package/dist/chunk-NOJW5KG2.js.map +0 -1
- package/dist/chunk-P74KXHA4.js.map +0 -1
- package/dist/chunk-PTQ37NRI.js.map +0 -1
- package/dist/chunk-RPBC2QOA.js +0 -235
- package/dist/chunk-RPBC2QOA.js.map +0 -1
- package/dist/chunk-XVFVTDE6.js +0 -98
- package/dist/chunk-XVFVTDE6.js.map +0 -1
- package/dist/chunk-ZZJOFKAT.js +0 -13
- package/dist/config-LLQZYN2Q.js +0 -11
- package/dist/harness-ABKZWP47.js +0 -11
- package/dist/index.d.ts +0 -3634
- package/dist/index.js +0 -13797
- package/dist/index.js.map +0 -1
- package/dist/intelligence-UW4TCOC7.js.map +0 -1
- package/dist/project-discovery-C4UMD7JI.js.map +0 -1
- package/dist/provider-LQHQX7Z7.js +0 -26
- package/dist/search-4IYM525O.js.map +0 -1
- package/dist/semantic-search-G624D6CI.js.map +0 -1
- package/dist/serve-QFUZWOU3.js.map +0 -1
- package/dist/tool-executor-KEYQLO4M.js.map +0 -1
- package/dist/tools-EB3BHRRF.js.map +0 -1
- package/dist/types-NYKB2DN3.js.map +0 -1
- package/dist/types-VRSXU4AM.js +0 -16
- package/dist/types-VRSXU4AM.js.map +0 -1
- package/dist/universal-installer-7MFCJUW7.js.map +0 -1
- package/dist/validator-LZXBFEPV.js.map +0 -1
- package/dist/verification-gate-ALSJVKSW.js.map +0 -1
- package/dist/versioning-Z3XNE2Q2.js.map +0 -1
- package/dist/web-server-7NGOTK7J.js.map +0 -1
- /package/dist/{analytics-RPT73WNM.js.map → analytics-L24W3B7U.js.map} +0 -0
- /package/dist/{auto-processor-SDAJF67T.js.map → auto-processor-QIRUOGEI.js.map} +0 -0
- /package/dist/{chunk-DGUM43GV.js.map → config-PYSS3QY6.js.map} +0 -0
- /package/dist/{chunk-ZZJOFKAT.js.map → context-loader-RSXXFW5R.js.map} +0 -0
- /package/dist/{config-2O6S2YJO.js.map → conversation-TBTFIJVU.js.map} +0 -0
- /package/dist/{config-LLQZYN2Q.js.map → cost-tracker-NZRZEHVA.js.map} +0 -0
- /package/dist/{context-loader-XCZ5EXNG.js.map → delegate-3KJAL4NZ.js.map} +0 -0
- /package/dist/{conversation-OPLE23IM.js.map → graph-LEEO37L3.js.map} +0 -0
- /package/dist/{cost-tracker-RS3W7SVY.js.map → harness-R5FKRICG.js.map} +0 -0
- /package/dist/{delegate-ZJCIADNN.js.map → health-HL2JYHIY.js.map} +0 -0
- /package/dist/{graph-5MKRTC3J.js.map → indexer-L5UC6J2V.js.map} +0 -0
- /package/dist/{harness-ABKZWP47.js.map → instinct-learner-QGAMIS3X.js.map} +0 -0
- /package/dist/{harness-XSBQBY7T.js.map → intake-SVJKFHTL.js.map} +0 -0
- /package/dist/{health-NZ6WNIMV.js.map → journal-ITUMKT6U.js.map} +0 -0
- /package/dist/{indexer-YKSGUVYT.js.map → loader-27PLDCOJ.js.map} +0 -0
- /package/dist/{instinct-learner-CWVMLUWX.js.map → mcp-JSIUJJZV.js.map} +0 -0
- /package/dist/{intake-M5NRR6QR.js.map → metrics-2MNINXNQ.js.map} +0 -0
- /package/dist/{journal-KN265YLU.js.map → provider-HQY6SPZI.js.map} +0 -0
- /package/dist/{loader-BOCVXVCH.js.map → rate-limiter-PH5DCVU4.js.map} +0 -0
- /package/dist/{mcp-WTQJJZAO.js.map → sessions-G6SZZXWS.js.map} +0 -0
- /package/dist/{metrics-KXGNFAAB.js.map → sources-7LDYO5GK.js.map} +0 -0
- /package/dist/{provider-LQHQX7Z7.js.map → state-25IQEC5C.js.map} +0 -0
- /package/dist/{provider-SXPQZ74H.js.map → telemetry-RS2JZUZP.js.map} +0 -0
- /package/dist/{rate-limiter-RLRVM325.js.map → tool-executor-6I5PHQDY.js.map} +0 -0
- /package/dist/{sessions-CZGVXKQE.js.map → tools-NDFJNVHK.js.map} +0 -0
- /package/dist/{sources-RW5DT56F.js.map → types-NPJZAI72.js.map} +0 -0
- /package/dist/{state-GMXILIHW.js.map → validator-LM7RZWSH.js.map} +0 -0
- /package/dist/{telemetry-MVDNGJEC.js.map → web-server-2Y4CHD2W.js.map} +0 -0
|
@@ -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/graph.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join, relative, dirname, basename } from 'path';\nimport { loadDirectoryWithErrors } from '../primitives/loader.js';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig, HarnessDocument } from '../core/types.js';\n\nexport interface GraphNode {\n id: string;\n directory: string;\n path: string;\n tags: string[];\n status: string;\n l0: string;\n}\n\nexport interface GraphEdge {\n from: string;\n to: string;\n type: 'related' | 'with';\n}\n\nexport interface DependencyGraph {\n nodes: GraphNode[];\n edges: GraphEdge[];\n orphans: string[];\n clusters: string[][];\n}\n\nexport interface GraphStats {\n totalNodes: number;\n totalEdges: number;\n orphanCount: number;\n clusterCount: number;\n mostConnected: Array<{ id: string; connections: number }>;\n brokenRefs: Array<{ from: string; ref: string }>;\n}\n\n/**\n * Build a dependency graph from all primitives in the harness.\n * Analyzes `related:` and `with:` frontmatter fields to create edges.\n */\nexport function buildDependencyGraph(harnessDir: string, config?: HarnessConfig): DependencyGraph {\n const dirs = getPrimitiveDirs(config);\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const nodeIds = new Set<string>();\n\n // Load all primitives\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n const id = doc.frontmatter.id;\n nodeIds.add(id);\n nodes.push({\n id,\n directory: dir,\n path: relative(harnessDir, doc.path),\n tags: doc.frontmatter.tags,\n status: doc.frontmatter.status,\n l0: doc.l0,\n });\n }\n }\n\n // Build edges from related: and with: fields\n for (const dir of dirs) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n const fromId = doc.frontmatter.id;\n\n // related: field edges\n for (const ref of doc.frontmatter.related) {\n const targetId = resolveRef(ref, nodeIds, harnessDir);\n if (targetId) {\n edges.push({ from: fromId, to: targetId, type: 'related' });\n }\n }\n\n // with: field edges (agent delegation reference)\n if (doc.frontmatter.with) {\n const withRef = doc.frontmatter.with;\n const targetId = resolveRef(withRef, nodeIds, harnessDir);\n if (targetId) {\n edges.push({ from: fromId, to: targetId, type: 'with' });\n }\n }\n }\n }\n\n // Find orphans (nodes with no edges in or out)\n const connected = new Set<string>();\n for (const edge of edges) {\n connected.add(edge.from);\n connected.add(edge.to);\n }\n const orphans = nodes\n .filter((n) => !connected.has(n.id))\n .map((n) => n.id);\n\n // Find clusters (connected components)\n const clusters = findClusters(nodes, edges);\n\n return { nodes, edges, orphans, clusters };\n}\n\n/**\n * Resolve a reference to a node ID. Handles:\n * - Direct ID match (e.g., \"tool-github\")\n * - Path-style refs (e.g., \"skills/code-review\" or \"agents/reviewer\")\n */\nfunction resolveRef(ref: string, knownIds: Set<string>, harnessDir: string): string | null {\n // Direct ID match\n if (knownIds.has(ref)) return ref;\n\n // Path-style ref: extract the filename part as potential ID\n if (ref.includes('/')) {\n const parts = ref.split('/');\n const filename = parts[parts.length - 1].replace(/\\.md$/, '');\n if (knownIds.has(filename)) return filename;\n\n // Try with directory prefix as part of ID\n const withDir = parts.join('-');\n if (knownIds.has(withDir)) return withDir;\n }\n\n return null;\n}\n\n/**\n * Find connected components using union-find.\n */\nfunction findClusters(nodes: GraphNode[], edges: GraphEdge[]): string[][] {\n const parent = new Map<string, string>();\n\n for (const node of nodes) {\n parent.set(node.id, node.id);\n }\n\n function find(id: string): string {\n let root = id;\n while (parent.get(root) !== root) {\n root = parent.get(root)!;\n }\n // Path compression\n let current = id;\n while (current !== root) {\n const next = parent.get(current)!;\n parent.set(current, root);\n current = next;\n }\n return root;\n }\n\n function union(a: string, b: string): void {\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) {\n parent.set(rootA, rootB);\n }\n }\n\n for (const edge of edges) {\n if (parent.has(edge.from) && parent.has(edge.to)) {\n union(edge.from, edge.to);\n }\n }\n\n // Group by root\n const groups = new Map<string, string[]>();\n for (const node of nodes) {\n const root = find(node.id);\n if (!groups.has(root)) {\n groups.set(root, []);\n }\n groups.get(root)!.push(node.id);\n }\n\n // Return only clusters with more than 1 member (singletons are orphans)\n return Array.from(groups.values())\n .filter((g) => g.length > 1)\n .sort((a, b) => b.length - a.length);\n}\n\n/**\n * Get statistics about the dependency graph.\n */\nexport function getGraphStats(harnessDir: string, config?: HarnessConfig): GraphStats {\n const graph = buildDependencyGraph(harnessDir, config);\n\n // Count connections per node\n const connectionCount = new Map<string, number>();\n for (const node of graph.nodes) {\n connectionCount.set(node.id, 0);\n }\n for (const edge of graph.edges) {\n connectionCount.set(edge.from, (connectionCount.get(edge.from) ?? 0) + 1);\n connectionCount.set(edge.to, (connectionCount.get(edge.to) ?? 0) + 1);\n }\n\n const mostConnected = Array.from(connectionCount.entries())\n .filter(([, count]) => count > 0)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([id, connections]) => ({ id, connections }));\n\n // Find broken references (references that didn't resolve to known IDs)\n const brokenRefs: Array<{ from: string; ref: string }> = [];\n const nodeIds = new Set(graph.nodes.map((n) => n.id));\n\n for (const dir of getPrimitiveDirs(config)) {\n const fullPath = join(harnessDir, dir);\n if (!existsSync(fullPath)) continue;\n\n const { docs } = loadDirectoryWithErrors(fullPath);\n for (const doc of docs) {\n for (const ref of doc.frontmatter.related) {\n const resolved = resolveRef(ref, nodeIds, harnessDir);\n if (!resolved) {\n brokenRefs.push({ from: doc.frontmatter.id, ref });\n }\n }\n if (doc.frontmatter.with) {\n const resolved = resolveRef(doc.frontmatter.with, nodeIds, harnessDir);\n if (!resolved) {\n brokenRefs.push({ from: doc.frontmatter.id, ref: doc.frontmatter.with });\n }\n }\n }\n }\n\n return {\n totalNodes: graph.nodes.length,\n totalEdges: graph.edges.length,\n orphanCount: graph.orphans.length,\n clusterCount: graph.clusters.length,\n mostConnected,\n brokenRefs,\n };\n}\n"],"mappings":"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","names":[]}
|