#!/usr/bin/env node /** Inspect both public product-provider compositions without invoking them. */ import { boot, resolveConfigPath } from '@deepseek-ai/dsh-app-boot' import type {} from '@deepseek-ai/dsh-subagent' import type {} from '@deepseek-ai/dsh-tools' const configPath = process.argv[2] if (configPath === undefined) { throw new Error('product-provider Loader composition driver requires a config path') } let starts = 0 const ctx = await boot( 'product-provider-loader-composition', resolveConfigPath(configPath, undefined), undefined, (hostCtx) => { hostCtx.on('subagent/start', () => { starts += 1 }) }, ) try { const providerNames = ['codex', 'claude-code'] as const const toolNames = ['subagent_codex', 'subagent_claude_code'] as const const providers = providerNames.map((providerName) => { const provider = ctx.subagents.getProvider(providerName) if (provider === undefined) { throw new Error(`${providerName} provider was not registered`) } return { name: provider.name, capabilities: provider.capabilities, inheritsParentContext: provider.inheritsParentContext, } }) const tools = toolNames.map((toolName) => { const tool = ctx.tools.schemas().find(schema => schema.name === toolName) if (tool === undefined) throw new Error(`${toolName} tool was not registered`) const properties = tool.parameters.properties if ( typeof properties !== 'object' || properties === null || Array.isArray(properties) ) { throw new Error(`${toolName} has invalid parameter properties`) } return { name: tool.name, parameterNames: Object.keys(properties).sort(), required: tool.parameters.required, } }) process.stdout.write(`${JSON.stringify({ registeredProviders: ctx.subagents.list(), providers, tools, starts, })}\n`) } finally { await ctx.fiber.dispose() }