@kortyx/cli 0.11.0 → 0.11.2

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/connections-command.ts","../src/connections.ts","../src/studio/read-client.ts","../src/studio/state.ts","../src/studio/compose.ts","../src/studio/command.ts","../src/studio/local-stack.ts","../src/studio/read-command.ts","../src/studio/read-analysis.ts","../src/studio/read-output.ts","../src/studio/runtime.ts","../src/workflow-calls.ts"],"sourcesContent":["import {\n access,\n mkdir,\n mkdtemp,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport Module from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { delimiter, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n type Agent,\n type AgentProjectTopologyOptions,\n projectWorkflowTopology,\n} from \"@kortyx/agent\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport { KortyxError, serializeFailure } from \"@kortyx/core/errors\";\nimport {\n type EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyRequestSchema,\n type EnsureWorkflowTopologyResponse,\n EnsureWorkflowTopologyResponseSchema,\n} from \"@kortyx/telemetry-contracts\";\nimport { Command, CommanderError } from \"commander\";\nimport { require as tsxRequire } from \"tsx/cjs/api\";\nimport { createConnectionsCommand } from \"./connections-command\";\nimport { createStudioCommand } from \"./studio/command\";\nimport { StudioReadError } from \"./studio/read-client\";\nimport { discoverWorkflowCalls } from \"./workflow-calls\";\n\ntype CliOptions = {\n entry?: string | undefined;\n exportName?: string | undefined;\n apiUrl?: string | undefined;\n apiKey?: string | undefined;\n environment?: string | undefined;\n serviceName?: string | undefined;\n deploymentRef?: string | undefined;\n dryRun: boolean;\n json: boolean;\n cwd: string;\n};\n\ntype PushResult = {\n snapshot: EnsureWorkflowTopologyRequest;\n response?: EnsureWorkflowTopologyResponse;\n};\n\ntype TopologyPushCommandOptions = {\n entry: string;\n export?: string;\n apiUrl?: string;\n apiKey?: string;\n environment?: string;\n serviceName?: string;\n deploymentRef?: string;\n dryRun?: boolean;\n json?: boolean;\n};\n\ntype ModuleResolveFilename = (\n request: string,\n parent: NodeJS.Module | undefined,\n isMain: boolean,\n options?: unknown,\n) => string;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isWorkflowDefinition = (value: unknown): value is WorkflowDefinition =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n isRecord(value.nodes) &&\n Array.isArray(value.edges);\n\nconst isAgent = (value: unknown): value is Agent =>\n isRecord(value) && typeof value.projectTopology === \"function\";\n\nconst readPackageName = async (cwd: string): Promise<string | undefined> => {\n let current = cwd;\n for (;;) {\n try {\n const raw = await readFile(join(current, \"package.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (isRecord(parsed) && typeof parsed.name === \"string\") {\n return parsed.name;\n }\n } catch {\n // Keep walking up until filesystem root.\n }\n\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n};\n\nconst loadEnvFiles = async (cwd: string): Promise<void> => {\n for (const filename of [\".env\", \".env.local\"]) {\n const path = join(cwd, filename);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n continue;\n }\n\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const separator = trimmed.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = trimmed.slice(0, separator).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue;\n if (process.env[key] !== undefined) continue;\n process.env[key] = unquoteEnvValue(trimmed.slice(separator + 1).trim());\n }\n }\n};\n\nconst unquoteEnvValue = (value: string): string => {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n};\n\nconst resolveOptions = async (\n options: CliOptions,\n): Promise<\n CliOptions & {\n entry: string;\n environment: string;\n serviceName: string;\n apiUrl?: string | undefined;\n apiKey?: string | undefined;\n }\n> => {\n if (!options.entry) {\n throw new Error(\"Missing required option: --entry <path>.\");\n }\n\n const entry = isAbsolute(options.entry)\n ? options.entry\n : resolve(options.cwd, options.entry);\n const environment =\n options.environment ??\n process.env.KORTYX_TELEMETRY_ENVIRONMENT ??\n process.env.NODE_ENV ??\n \"development\";\n const serviceName =\n options.serviceName ??\n process.env.KORTYX_TELEMETRY_SERVICE_NAME ??\n (await readPackageName(options.cwd)) ??\n \"kortyx-app\";\n\n return {\n ...options,\n entry,\n environment,\n serviceName,\n apiUrl:\n options.apiUrl ??\n process.env.KORTYX_TELEMETRY_API_URL ??\n process.env.KORTYX_API_URL,\n apiKey: options.apiKey ?? process.env.KORTYX_TELEMETRY_API_KEY,\n deploymentRef:\n options.deploymentRef ??\n process.env.KORTYX_TELEMETRY_DEPLOYMENT_REF ??\n process.env.GITHUB_SHA ??\n process.env.VERCEL_GIT_COMMIT_SHA,\n };\n};\n\nconst createFrameworkMarkerStubs = async (): Promise<{\n cleanup: () => Promise<void>;\n}> => {\n const root = await mkdtemp(join(tmpdir(), \"kortyx-cli-stubs-\"));\n for (const moduleName of [\"server-only\", \"client-only\"]) {\n const directory = join(root, moduleName);\n await mkdir(directory, { recursive: true });\n await writeFile(join(directory, \"index.js\"), \"\", \"utf8\");\n await writeFile(\n join(directory, \"package.json\"),\n JSON.stringify({ name: moduleName, version: \"0.0.0\", main: \"index.js\" }),\n \"utf8\",\n );\n }\n\n const previousNodePath = process.env.NODE_PATH;\n process.env.NODE_PATH = previousNodePath\n ? `${root}${delimiter}${previousNodePath}`\n : root;\n const moduleWithPrivateInit = Module as typeof Module & {\n _initPaths?: () => void;\n };\n moduleWithPrivateInit._initPaths?.();\n\n return {\n cleanup: async () => {\n if (previousNodePath === undefined) delete process.env.NODE_PATH;\n else process.env.NODE_PATH = previousNodePath;\n moduleWithPrivateInit._initPaths?.();\n await rm(root, { recursive: true, force: true });\n },\n };\n};\n\nconst importEntry = async (entry: string): Promise<Record<string, unknown>> => {\n const stubs = await createFrameworkMarkerStubs();\n let unregisterPaths: (() => void) | undefined;\n try {\n const tsconfig = await findNearestFile(dirname(entry), \"tsconfig.json\");\n unregisterPaths = tsconfig\n ? await registerTsconfigPaths(tsconfig)\n : undefined;\n const module = tsxRequire(entry, join(dirname(entry), \"kortyx-cli.cjs\"));\n if (!isRecord(module)) {\n throw new Error(`Entry module did not export an object: ${entry}`);\n }\n return module;\n } finally {\n unregisterPaths?.();\n await stubs.cleanup();\n }\n};\n\nconst findNearestFile = async (\n startDirectory: string,\n filename: string,\n): Promise<string | undefined> => {\n let current = startDirectory;\n for (;;) {\n const candidate = join(current, filename);\n try {\n await access(candidate);\n return candidate;\n } catch {\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n }\n};\n\nconst registerTsconfigPaths = async (\n tsconfigPath: string,\n): Promise<() => void> => {\n const raw = JSON.parse(await readFile(tsconfigPath, \"utf8\")) as unknown;\n if (!isRecord(raw)) return () => undefined;\n const compilerOptions = isRecord(raw.compilerOptions)\n ? raw.compilerOptions\n : undefined;\n const paths = isRecord(compilerOptions?.paths)\n ? compilerOptions.paths\n : undefined;\n if (!paths) return () => undefined;\n\n const tsconfigDirectory = dirname(tsconfigPath);\n const baseUrl =\n typeof compilerOptions?.baseUrl === \"string\"\n ? resolve(tsconfigDirectory, compilerOptions.baseUrl)\n : tsconfigDirectory;\n const mappings = Object.entries(paths)\n .flatMap(([pattern, rawTargets]) => {\n if (!Array.isArray(rawTargets)) return [];\n return rawTargets\n .filter((target): target is string => typeof target === \"string\")\n .map((target) => ({ pattern, target }));\n })\n .map(({ pattern, target }) => {\n const [patternPrefix, patternSuffix = \"\"] = pattern.split(\"*\");\n const [targetPrefix, targetSuffix = \"\"] = target.split(\"*\");\n return {\n pattern,\n target,\n patternPrefix,\n patternSuffix,\n targetPrefix,\n targetSuffix,\n wildcard: pattern.includes(\"*\"),\n };\n });\n\n if (mappings.length === 0) return () => undefined;\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: ModuleResolveFilename;\n };\n const originalResolve = moduleWithResolver._resolveFilename;\n moduleWithResolver._resolveFilename = function resolveWithTsconfigPaths(\n request,\n parent,\n isMain,\n options,\n ) {\n for (const mapping of mappings) {\n const matched = mapping.wildcard\n ? request.startsWith(mapping.patternPrefix ?? \"\") &&\n request.endsWith(mapping.patternSuffix)\n : request === mapping.pattern;\n if (!matched) continue;\n\n const wildcardValue = mapping.wildcard\n ? request.slice(\n mapping.patternPrefix?.length ?? 0,\n request.length - mapping.patternSuffix.length,\n )\n : \"\";\n const mapped = mapping.wildcard\n ? `${mapping.targetPrefix}${wildcardValue}${mapping.targetSuffix}`\n : mapping.target;\n for (const candidate of candidateModulePaths(resolve(baseUrl, mapped))) {\n try {\n return originalResolve.call(this, candidate, parent, isMain, options);\n } catch {\n // Try the next extension/index candidate.\n }\n }\n }\n\n return originalResolve.call(this, request, parent, isMain, options);\n };\n\n return () => {\n moduleWithResolver._resolveFilename = originalResolve;\n };\n};\n\nconst candidateModulePaths = (basePath: string): string[] => [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.mts`,\n `${basePath}.cts`,\n `${basePath}.js`,\n `${basePath}.jsx`,\n join(basePath, \"index.ts\"),\n join(basePath, \"index.tsx\"),\n join(basePath, \"index.js\"),\n join(basePath, \"index.jsx\"),\n];\n\nconst valueFromModule = (\n module: Record<string, unknown>,\n exportName: string | undefined,\n): unknown => {\n if (exportName) {\n if (!(exportName in module)) {\n throw new Error(`Entry module does not export \"${exportName}\".`);\n }\n return module[exportName];\n }\n\n if (isAgent(module.agent)) return module.agent;\n if (Array.isArray(module.workflows)) return module.workflows;\n if (isAgent(module.default)) return module.default;\n if (Array.isArray(module.default)) return module.default;\n\n const workflowExports = Object.values(module).filter(isWorkflowDefinition);\n if (workflowExports.length > 0) return workflowExports;\n\n throw new Error(\n \"Entry must export an agent with projectTopology(), a workflows array, or named workflow definitions. Use --export when needed.\",\n );\n};\n\nconst projectSnapshots = async (\n value: unknown,\n options: AgentProjectTopologyOptions,\n): Promise<EnsureWorkflowTopologyRequest[]> => {\n if (isAgent(value)) {\n const snapshots = await value.projectTopology?.(options);\n return snapshots ?? [];\n }\n\n const workflows = Array.isArray(value)\n ? value.filter(isWorkflowDefinition)\n : isWorkflowDefinition(value)\n ? [value]\n : [];\n\n if (workflows.length === 0) {\n throw new Error(\"No workflow definitions found in the selected export.\");\n }\n\n const knownWorkflowIds = workflows.map((workflow) => workflow.id);\n return workflows.map((workflow) =>\n projectWorkflowTopology({\n workflow,\n environment: options.environment,\n service: options.service,\n knownWorkflowIds,\n }),\n );\n};\n\nconst endpointFor = (apiUrl: string, path: string): string =>\n `${apiUrl.replace(/\\/$/, \"\")}${path}`;\n\nconst pushSnapshot = async (\n apiUrl: string,\n apiKey: string,\n snapshot: EnsureWorkflowTopologyRequest,\n): Promise<EnsureWorkflowTopologyResponse> => {\n const response = await fetch(\n endpointFor(apiUrl, \"/v1/telemetry/workflow-revisions:ensure\"),\n {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(snapshot),\n },\n );\n\n if (!response.ok) {\n throw new KortyxError(\n \"TOPOLOGY_HTTP_ERROR\",\n `Kortyx API rejected topology ${snapshot.workflow.id} (${response.status}).`,\n {\n category: \"transport\",\n status: response.status,\n safeMessage: `Topology request failed (HTTP ${response.status}). Check the API URL, credentials and server logs.`,\n },\n );\n }\n\n return EnsureWorkflowTopologyResponseSchema.parse(await response.json());\n};\n\nconst printResults = (results: PushResult[], options: CliOptions): void => {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n workflows: results.map(({ snapshot, response }) => ({\n workflowId: snapshot.workflow.id,\n declaredVersion: snapshot.workflow.declaredVersion,\n topologyHash: snapshot.workflow.topologyHash,\n transitionCount: snapshot.workflow.transitions?.length ?? 0,\n calls: snapshot.workflow.calls ?? [],\n tools: snapshot.workflow.nodes.map((node) => ({\n nodeId: node.id,\n tools: node.tools ?? [],\n discovery: node.toolDiscovery,\n })),\n workflowRevisionId: response?.workflowRevisionId,\n created: response?.created,\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const verb = options.dryRun ? \"Projected\" : \"Pushed\";\n console.log(`${verb} ${results.length} workflow topology snapshot(s).`);\n for (const { snapshot, response } of results) {\n const revision = response\n ? ` revision=${response.workflowRevisionId} created=${response.created}`\n : \"\";\n console.log(\n `- ${snapshot.workflow.id}@${snapshot.workflow.declaredVersion} hash=${snapshot.workflow.topologyHash.slice(\n 0,\n 12,\n )} transitions=${snapshot.workflow.transitions?.length ?? 0} calls=${snapshot.workflow.calls?.length ?? 0} tools=${snapshot.workflow.nodes.reduce((sum, node) => sum + (node.tools?.length ?? 0), 0)}${revision}`,\n );\n }\n};\n\nconst runTopologyPush = async (rawOptions: CliOptions): Promise<void> => {\n const options = await resolveOptions(rawOptions);\n if (!options.dryRun && !options.apiUrl) {\n throw new Error(\n \"Missing Kortyx API URL. Pass --api-url or set KORTYX_TELEMETRY_API_URL.\",\n );\n }\n if (!options.dryRun && !options.apiKey) {\n throw new Error(\n \"Missing telemetry API key. Pass --api-key or set KORTYX_TELEMETRY_API_KEY.\",\n );\n }\n\n const module = await importEntry(options.entry);\n const selected = valueFromModule(module, options.exportName);\n const service = {\n name: options.serviceName,\n ...(options.deploymentRef ? { deploymentRef: options.deploymentRef } : {}),\n };\n const snapshots = await projectSnapshots(selected, {\n environment: options.environment,\n service,\n });\n const discovered = discoverWorkflowCalls(options.entry, snapshots);\n for (const warning of discovered.warnings)\n console.error(`Topology: ${warning}`);\n for (const snapshot of snapshots) {\n const calls = discovered.calls.get(snapshot.workflow.id);\n if (calls) snapshot.workflow.calls = calls;\n for (const node of snapshot.workflow.nodes) {\n const discoveredTools = discovered.tools\n .get(snapshot.workflow.id)\n ?.get(node.id);\n if (discoveredTools)\n Object.assign(node, discoveredTools, {\n toolDiscovery: {\n ...discoveredTools.toolDiscovery,\n publishedAt: new Date().toISOString(),\n },\n });\n }\n }\n const parsedSnapshots = snapshots.map((snapshot) =>\n EnsureWorkflowTopologyRequestSchema.parse(snapshot),\n );\n\n const results: PushResult[] = [];\n for (const snapshot of parsedSnapshots) {\n let response: EnsureWorkflowTopologyResponse | undefined;\n if (!options.dryRun) {\n if (!options.apiUrl || !options.apiKey) {\n throw new Error(\"Missing Kortyx API URL or telemetry API key.\");\n }\n response = await pushSnapshot(options.apiUrl, options.apiKey, snapshot);\n }\n results.push({ snapshot, ...(response ? { response } : {}) });\n }\n\n printResults(results, options);\n};\n\nconst createCliProgram = (): Command => {\n const program = new Command()\n .name(\"kortyx\")\n .description(\"Build, observe, and operate Kortyx projects.\")\n .showHelpAfterError()\n .addHelpText(\n \"after\",\n '\\nRun \"kortyx <command> --help\" for detailed command options.',\n );\n\n program.addCommand(createStudioCommand());\n program.addCommand(createConnectionsCommand());\n\n const topology = program\n .command(\"topology\")\n .description(\"Publish deterministic workflow topology to Studio.\");\n topology\n .command(\"push\")\n .description(\"Project and publish workflow topology.\")\n .requiredOption(\n \"--entry <path>\",\n \"Module exporting an agent or workflows array.\",\n )\n .option(\"--export <name>\", \"Named export to load from the entry module.\")\n .option(\n \"--api-url <url>\",\n \"Kortyx API URL. Defaults to KORTYX_TELEMETRY_API_URL.\",\n )\n .option(\n \"--api-key <key>\",\n \"Telemetry API key. Defaults to KORTYX_TELEMETRY_API_KEY.\",\n )\n .option(\"--environment <name>\", \"Telemetry environment.\")\n .option(\"--service-name <name>\", \"Telemetry service name.\")\n .option(\"--deployment-ref <ref>\", \"Deployment reference.\")\n .option(\"--dry-run\", \"Print topology without publishing.\", false)\n .option(\"--json\", \"Print machine-readable JSON.\", false)\n .action(async (options: TopologyPushCommandOptions) => {\n const cliOptions: CliOptions = {\n entry: options.entry,\n exportName: options.export,\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n environment: options.environment,\n serviceName: options.serviceName,\n deploymentRef: options.deploymentRef,\n dryRun: options.dryRun ?? false,\n json: options.json ?? false,\n cwd: process.cwd(),\n };\n await loadEnvFiles(cliOptions.cwd);\n await runTopologyPush(cliOptions);\n });\n\n return program;\n};\n\nconst main = async (): Promise<void> => {\n const program = createCliProgram().exitOverride();\n if (process.argv.length === 2) {\n program.outputHelp();\n return;\n }\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n if (error instanceof StudioReadError) {\n console.error(\n process.argv.includes(\"--json\")\n ? JSON.stringify(error.toJSON())\n : `[${error.code}] ${error.message}`,\n );\n process.exitCode = 1;\n return;\n }\n const failure = serializeFailure(error);\n console.error(\n error instanceof KortyxError\n ? `[${failure.code}] ${failure.message}`\n : error instanceof Error\n ? error.message.slice(0, 1024)\n : failure.message,\n );\n process.exitCode = 1;\n }\n};\n\nvoid main();\n","import { StudioContextResponseSchema } from \"@kortyx/telemetry-contracts\";\nimport { Command } from \"commander\";\nimport {\n type ConnectionProfile,\n defaultConnectionsHome,\n readConnections,\n readKeyEnv,\n saveConnections,\n} from \"./connections\";\nimport {\n normalizeConnectionUrl,\n StudioReadClient,\n StudioReadError,\n} from \"./studio/read-client\";\nimport { defaultStudioHome, readStudioConfig } from \"./studio/state\";\n\ntype Options = {\n configHome: string;\n home: string;\n json?: boolean;\n apiUrl?: string;\n studioUrl?: string;\n apiKeyEnv?: string;\n environment?: string;\n replace?: boolean;\n};\nexport const createConnectionsCommand = (\n log: (message: string) => void = console.log,\n request: typeof fetch = fetch,\n) => {\n const command = new Command(\"connections\").description(\n \"Manage Studio connection profiles (no remote mutations or stored secrets).\",\n );\n const common = (child: Command) =>\n child\n .option(\n \"--config-home <path>\",\n \"Connection configuration directory.\",\n defaultConnectionsHome(),\n )\n .option(\n \"--home <path>\",\n \"Managed local Studio directory.\",\n defaultStudioHome(),\n )\n .option(\"--json\", \"Print machine-readable JSON.\");\n const print = (value: unknown, options: Options) =>\n log(JSON.stringify(value, null, options.json ? 0 : 2));\n common(\n command\n .command(\"list\")\n .description(\"List profiles without reading or displaying their keys.\"),\n ).action(async (options: Options) => {\n const config = await readConnections(options.configHome);\n const local = await readStudioConfig(options.home);\n print(\n {\n current: config.current ?? \"local\",\n connections: [\n ...(local\n ? [\n {\n name: \"local\",\n apiUrl: `http://localhost:${local.apiPort}`,\n studioUrl: `http://localhost:${local.studioPort}`,\n credential: \"managed-local\",\n },\n ]\n : []),\n ...config.profiles,\n ],\n },\n options,\n );\n });\n common(\n command\n .command(\"add <name>\")\n .description(\n \"Validate a read key and save URL locators plus an environment-variable reference.\",\n )\n .requiredOption(\n \"--api-url <url>\",\n \"Studio API base URL (not the browser URL).\",\n )\n .requiredOption(\n \"--api-key-env <name>\",\n \"Environment variable containing the project-scoped read key.\",\n )\n .option(\n \"--studio-url <url>\",\n \"Studio browser base URL, used to resolve pasted links.\",\n )\n .option(\"--environment <name>\", \"Default environment filter for lists.\")\n .option(\"--replace\", \"Explicitly replace an existing named connection.\"),\n ).action(\n async (\n name: string,\n options: Options & { apiUrl: string; apiKeyEnv: string },\n ) => {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(name) || name === \"local\") {\n throw new StudioReadError(\n \"invalid_name\",\n \"Use a connection name of 1–64 letters, digits, hyphens or underscores; local is reserved.\",\n );\n }\n const config = await readConnections(options.configHome);\n if (\n config.profiles.some((profile) => profile.name === name) &&\n !options.replace\n ) {\n throw new StudioReadError(\n \"connection_exists\",\n \"Connection already exists. Use --replace to update it.\",\n );\n }\n const apiUrl = normalizeConnectionUrl(options.apiUrl);\n const studioUrl = options.studioUrl\n ? normalizeConnectionUrl(options.studioUrl)\n : undefined;\n const client = new StudioReadClient(\n apiUrl,\n readKeyEnv(options.apiKeyEnv),\n request,\n );\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n if (!context.apiKey.scopes.includes(\"studio:read\"))\n throw new StudioReadError(\n \"missing_scope\",\n \"The API key lacks studio:read permission.\",\n );\n const profile: ConnectionProfile = {\n name,\n apiUrl,\n apiKeyEnv: options.apiKeyEnv,\n project: context.project.name,\n organization: context.organization.name,\n ...(studioUrl ? { studioUrl } : {}),\n ...(options.environment ? { environment: options.environment } : {}),\n };\n config.profiles = [\n ...config.profiles.filter((item) => item.name !== name),\n profile,\n ];\n await saveConnections(config, options.configHome);\n print({ connection: profile, verified: true }, options);\n },\n );\n common(\n command\n .command(\"use <name>\")\n .description(\n \"Select the default connection; agents should prefer per-command --connection.\",\n ),\n ).action(async (name: string, options: Options) => {\n const config = await readConnections(options.configHome);\n if (\n name === \"local\"\n ? !(await readStudioConfig(options.home))\n : !config.profiles.some((profile) => profile.name === name)\n ) {\n throw new StudioReadError(\n \"unknown_connection\",\n \"Connection not found. Run kortyx connections list.\",\n );\n }\n config.current = name;\n await saveConnections(config, options.configHome);\n print({ current: name }, options);\n });\n common(\n command\n .command(\"remove <name>\")\n .description(\n \"Remove a saved locator, not its credential or remote project.\",\n ),\n ).action(async (name: string, options: Options) => {\n const config = await readConnections(options.configHome);\n if (!config.profiles.some((profile) => profile.name === name))\n throw new StudioReadError(\n \"unknown_connection\",\n \"Saved connection not found; managed local cannot be removed.\",\n );\n config.profiles = config.profiles.filter(\n (profile) => profile.name !== name,\n );\n if (config.current === name) delete config.current;\n await saveConnections(config, options.configHome);\n print({ removed: name }, options);\n });\n return command;\n};\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { normalizeConnectionUrl, StudioReadError } from \"./studio/read-client\";\nimport {\n defaultStudioHome,\n readStudioConfig,\n readStudioEnvironment,\n} from \"./studio/state\";\n\nconst ProfileSchema = z\n .object({\n name: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/),\n apiUrl: z.string(),\n studioUrl: z.string().optional(),\n apiKeyEnv: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),\n environment: z.string().min(1).optional(),\n project: z.string(),\n organization: z.string(),\n })\n .strict();\nconst ConfigSchema = z\n .object({\n version: z.literal(1),\n current: z.string().optional(),\n profiles: z.array(ProfileSchema),\n })\n .strict()\n .superRefine((config, ctx) => {\n const names = config.profiles.map((profile) => profile.name);\n if (\n names.includes(\"local\") ||\n new Set(names).size !== names.length ||\n (config.current &&\n config.current !== \"local\" &&\n !names.includes(config.current))\n ) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid connection names or selection.\",\n });\n }\n });\nexport type ConnectionProfile = z.infer<typeof ProfileSchema>;\nexport type ConnectionConfig = z.infer<typeof ConfigSchema>;\nexport type ConnectionOptions = {\n connection?: string | undefined;\n apiUrl?: string | undefined;\n apiKeyEnv?: string | undefined;\n configHome?: string | undefined;\n home?: string | undefined;\n};\nexport type ResolvedConnection = {\n name: string;\n apiUrl: string;\n studioUrl?: string | undefined;\n environment?: string | undefined;\n apiKey: string;\n};\n\nexport const defaultConnectionsHome = () =>\n resolve(process.env.KORTYX_CONFIG_HOME ?? join(homedir(), \".kortyx\"));\nexport const readConnections = async (\n home = defaultConnectionsHome(),\n): Promise<ConnectionConfig> => {\n try {\n const result = ConfigSchema.safeParse(\n JSON.parse(await readFile(join(home, \"connections.json\"), \"utf8\")),\n );\n if (!result.success) throw new Error(\"invalid\");\n for (const profile of result.data.profiles) {\n normalizeConnectionUrl(profile.apiUrl);\n if (profile.studioUrl) normalizeConnectionUrl(profile.studioUrl);\n }\n return result.data;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n return { version: 1, profiles: [] };\n throw new StudioReadError(\n \"invalid_config\",\n \"Invalid or unreadable connections.json. Fix the configuration; it will not be overwritten.\",\n );\n }\n};\n\nexport const saveConnections = async (\n config: ConnectionConfig,\n home = defaultConnectionsHome(),\n) => {\n const result = ConfigSchema.safeParse(config);\n if (!result.success)\n throw new StudioReadError(\n \"invalid_config\",\n \"Invalid connection name or configuration.\",\n );\n await mkdir(home, { recursive: true, mode: 0o700 });\n const temporary = join(home, `.connections-${randomUUID()}.tmp`);\n try {\n await writeFile(temporary, `${JSON.stringify(result.data, null, 2)}\\n`, {\n mode: 0o600,\n flag: \"wx\",\n });\n await rename(temporary, join(home, \"connections.json\"));\n } finally {\n await unlink(temporary).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== \"ENOENT\") throw error;\n });\n }\n};\n\nconst urlMatches = (target: URL, base: string) => {\n const url = new URL(base);\n const prefix = url.pathname.replace(/\\/+$/, \"\");\n return (\n target.origin === url.origin &&\n (target.pathname === prefix || target.pathname.startsWith(`${prefix}/`))\n );\n};\n\nexport const resolveConnection = async (\n options: ConnectionOptions,\n targetUrl?: string,\n): Promise<ResolvedConnection> => {\n const config = await readConnections(options.configHome);\n const local = await readStudioConfig(options.home ?? defaultStudioHome());\n const localLocator = local\n ? {\n name: \"local\",\n apiUrl: `http://localhost:${local.apiPort}`,\n studioUrl: `http://localhost:${local.studioPort}`,\n }\n : undefined;\n let selected =\n options.connection ?? (process.env.KORTYX_CONNECTION || undefined);\n if (options.apiUrl || options.apiKeyEnv) {\n if (selected || !options.apiUrl || !options.apiKeyEnv) {\n throw new StudioReadError(\n \"invalid_connection\",\n \"Direct connections require both --api-url and --api-key-env, without --connection/KORTYX_CONNECTION. Keys are never reused for URL overrides.\",\n );\n }\n if (targetUrl)\n throw new StudioReadError(\n \"unmapped_url\",\n \"Register a connection with --studio-url before inspecting a URL. Direct connections accept entity IDs only.\",\n );\n return {\n name: \"direct\",\n apiUrl: normalizeConnectionUrl(options.apiUrl),\n apiKey: readKeyEnv(options.apiKeyEnv),\n };\n }\n const locators = [\n ...config.profiles,\n ...(localLocator ? [localLocator] : []),\n ];\n if (targetUrl) {\n const target = new URL(targetUrl);\n const matches = locators.filter(\n (profile) =>\n urlMatches(target, profile.apiUrl) ||\n (profile.studioUrl && urlMatches(target, profile.studioUrl)),\n );\n if (selected) {\n if (!matches.some((profile) => profile.name === selected)) {\n throw new StudioReadError(\n \"connection_mismatch\",\n \"The supplied URL does not match the selected connection's API or Studio URL.\",\n );\n }\n } else if (matches.length === 1) selected = matches[0]?.name;\n else\n throw new StudioReadError(\n \"unmapped_url\",\n matches.length\n ? \"URL matches multiple projects. Specify --connection explicitly.\"\n : \"URL does not match a configured connection. Add one with the correct --studio-url.\",\n );\n }\n selected ??= config.current ?? \"local\";\n if (selected === \"local\") {\n if (!localLocator)\n throw new StudioReadError(\n \"not_configured\",\n \"Local Studio is not configured. Run kortyx studio start or select a remote connection.\",\n );\n const environment = await readStudioEnvironment(\n options.home ?? defaultStudioHome(),\n );\n return { ...localLocator, apiKey: environment.KORTYX_STUDIO_API_KEY };\n }\n const profile = config.profiles.find((item) => item.name === selected);\n if (!profile)\n throw new StudioReadError(\n \"unknown_connection\",\n \"Connection not found. Run kortyx connections list.\",\n );\n return {\n name: profile.name,\n apiUrl: profile.apiUrl,\n studioUrl: profile.studioUrl,\n environment: profile.environment,\n apiKey: readKeyEnv(profile.apiKeyEnv),\n };\n};\n\nexport const readKeyEnv = (name: string): string => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n throw new StudioReadError(\n \"invalid_key_env\",\n \"Provide a valid environment variable name.\",\n );\n const value = process.env[name];\n if (!value)\n throw new StudioReadError(\n \"missing_key\",\n `Set ${name} to a project-scoped Studio read key. Do not use the telemetry write key.`,\n );\n return value;\n};\n","import type { z } from \"zod\";\n\nexport class StudioReadError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly status?: number,\n public readonly requestId?: string,\n ) {\n super(message);\n this.name = \"StudioReadError\";\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n status: this.status,\n requestId: this.requestId,\n },\n };\n }\n}\n\nexport const normalizeConnectionUrl = (input: string): string => {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new StudioReadError(\n \"invalid_url\",\n \"Provide an absolute HTTP(S) connection URL.\",\n );\n }\n const loopback = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n !(url.protocol === \"https:\" || (url.protocol === \"http:\" && loopback))\n ) {\n throw new StudioReadError(\n \"invalid_url\",\n \"Connection URLs require HTTPS (HTTP is allowed on loopback), without credentials, query, or fragment.\",\n );\n }\n return url.toString().replace(/\\/+$/, \"\");\n};\n\n/** Intentionally restricted to the Studio read API: no arbitrary requests or writes. */\nexport class StudioReadClient {\n readonly apiUrl: string;\n constructor(\n apiUrl: string,\n private readonly apiKey: string,\n private readonly request: typeof fetch = fetch,\n ) {\n this.apiUrl = normalizeConnectionUrl(apiUrl);\n if (!/^ktyx_(?:test|live)_[^_]+_\\S+$/.test(apiKey)) {\n throw new StudioReadError(\n \"invalid_key\",\n \"Expected a Kortyx API key with studio:read permission.\",\n );\n }\n }\n\n async get<T>(\n path: string,\n schema: z.ZodType<T>,\n query: Record<string, string> = {},\n ): Promise<T> {\n if (\n !/^\\/v1\\/studio\\/(?:context|catalogs|workflows|(?:runs|sessions|interrupts)(?:\\/[^/?#]+)?)$/.test(\n path,\n ) ||\n /(?:^|\\/)(?:\\.|\\.\\.|%2e(?:%2e)?)(?:\\/|$)/i.test(path)\n ) {\n throw new StudioReadError(\n \"invalid_endpoint\",\n \"Only supported Studio read endpoints are allowed.\",\n );\n }\n const url = new URL(`${this.apiUrl}${path}`);\n for (const [key, value] of Object.entries(query))\n url.searchParams.set(key, value);\n let response: Response;\n try {\n response = await this.request(url, {\n method: \"GET\",\n headers: {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n },\n redirect: \"error\",\n signal: AbortSignal.timeout(15_000),\n });\n } catch {\n throw new StudioReadError(\n \"connection_failed\",\n \"Studio API request failed or timed out. Check the URL, network/VPN, and TLS. Redirects are not followed.\",\n );\n }\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n if (!response.ok) {\n await response.body?.cancel();\n const message =\n response.status === 401\n ? \"Invalid, expired, or revoked Studio read key.\"\n : response.status === 403\n ? \"The API key lacks studio:read permission.\"\n : response.status === 404\n ? \"Entity not found in this connection's project. Check the URL and selected connection.\"\n : `Studio API returned HTTP ${response.status}.`;\n // Never echo arbitrary server error bodies: they can contain credentials/content.\n throw new StudioReadError(\n \"api_error\",\n message,\n response.status,\n requestId,\n );\n }\n let value: unknown;\n const reader = response.body?.getReader();\n if (!reader)\n throw new StudioReadError(\n \"invalid_response\",\n \"Studio returned an empty response.\",\n );\n try {\n const decoder = new TextDecoder();\n let body = \"\";\n let bytes = 0;\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 20 * 1024 * 1024) {\n await reader.cancel();\n throw new StudioReadError(\n \"response_too_large\",\n \"Studio response exceeded the 20 MiB safety limit. Use a smaller query or inspect an individual run.\",\n );\n }\n body += decoder.decode(chunk.value, { stream: true });\n }\n body += decoder.decode();\n value = JSON.parse(body);\n } catch (error) {\n if (error instanceof StudioReadError) throw error;\n throw new StudioReadError(\n \"invalid_response\",\n \"Could not read Studio JSON response.\",\n response.status,\n requestId,\n );\n } finally {\n reader.releaseLock();\n }\n const result = schema.safeParse(value);\n if (!result.success) {\n throw new StudioReadError(\n \"schema_mismatch\",\n \"Studio response does not match this CLI's contracts. Check API/CLI version compatibility.\",\n response.status,\n requestId,\n );\n }\n return result.data;\n }\n}\n","import {\n access,\n chmod,\n mkdir,\n readFile,\n rename,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { STUDIO_COMPOSE_FILE } from \"./compose\";\nimport type { StudioRuntime, StudioStartOptions } from \"./types\";\n\nconst CONFIG_VERSION = 1;\nconst DEFAULT_API_PORT = 6400;\nconst DEFAULT_STUDIO_PORT = 6300;\nconst DEFAULT_IMAGE_TAG = \"latest\";\nconst DEFAULT_USERNAME = \"admin\";\nconst DEFAULT_PROJECT_NAME = \"kortyx-studio\";\n\nconst PortSchema = z.number().int().min(1).max(65_535);\n\nconst StudioConfigSchema = z\n .object({\n version: z.literal(CONFIG_VERSION),\n apiPort: PortSchema,\n studioPort: PortSchema,\n imageTag: z\n .string()\n .regex(\n /^[A-Za-z0-9][A-Za-z0-9._-]*$/,\n \"Image tag contains unsupported characters.\",\n ),\n username: z\n .string()\n .regex(/^[A-Za-z0-9._@-]+$/, \"Username contains unsupported characters.\"),\n projectName: z\n .string()\n .regex(\n /^[a-z0-9][a-z0-9_-]*$/,\n \"Docker Compose project name contains unsupported characters.\",\n ),\n createdAt: z.iso.datetime(),\n })\n .refine((config) => config.apiPort !== config.studioPort, {\n message: \"Studio and API ports must be different.\",\n path: [\"apiPort\"],\n });\n\nconst ApiKeySchema = z\n .string()\n .regex(/^ktyx_(?:test|live)_[^_]+_.+$/, \"Invalid Kortyx API key.\");\n\nconst StudioEnvironmentSchema = z\n .object({\n KORTYX_COMPOSE_PROJECT_NAME: z.string().min(1),\n KORTYX_STUDIO_IMAGE_TAG: z.string().min(1),\n API_PORT: z.string().regex(/^\\d+$/),\n STUDIO_PORT: z.string().regex(/^\\d+$/),\n POSTGRES_PASSWORD: z.string().min(16),\n KORTYX_API_KEY_PEPPER: z.string().min(16),\n KORTYX_TELEMETRY_API_KEY: ApiKeySchema,\n KORTYX_STUDIO_API_KEY: ApiKeySchema,\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: z.string().min(1),\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: z.string().min(12),\n })\n .passthrough();\n\nexport type StudioConfig = z.infer<typeof StudioConfigSchema>;\nexport type StudioEnvironment = z.infer<typeof StudioEnvironmentSchema>;\nexport type StudioDeploymentCredentials = Pick<\n StudioEnvironment,\n | \"KORTYX_API_KEY_PEPPER\"\n | \"KORTYX_TELEMETRY_API_KEY\"\n | \"KORTYX_STUDIO_API_KEY\"\n | \"KORTYX_STUDIO_BASIC_AUTH_USERNAME\"\n | \"KORTYX_STUDIO_BASIC_AUTH_PASSWORD\"\n>;\n\nexport const defaultStudioHome = (): string =>\n resolve(\n process.env.KORTYX_STUDIO_HOME ?? join(homedir(), \".kortyx\", \"studio\"),\n );\n\nexport const studioConfigPath = (home: string): string =>\n join(home, \"config.json\");\nexport const studioEnvPath = (home: string): string => join(home, \".env\");\nexport const studioComposePath = (home: string): string =>\n join(home, \"compose.yml\");\n\nconst isMissingFile = (error: unknown): boolean =>\n error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n\nconst invalidStateError = (\n label: string,\n path: string,\n error: z.ZodError,\n): Error =>\n new Error(\n `Unsupported or invalid Studio ${label} at ${path}.\\n${z.prettifyError(error)}`,\n );\n\nexport const readStudioConfig = async (\n home: string,\n): Promise<StudioConfig | undefined> => {\n try {\n const parsed = JSON.parse(\n await readFile(studioConfigPath(home), \"utf8\"),\n ) as unknown;\n const result = StudioConfigSchema.safeParse(parsed);\n if (!result.success) {\n throw invalidStateError(\"config\", studioConfigPath(home), result.error);\n }\n return result.data;\n } catch (error) {\n if (isMissingFile(error)) return undefined;\n throw error;\n }\n};\n\nconst resolveConfig = (\n existing: StudioConfig | undefined,\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): StudioConfig => {\n const result = StudioConfigSchema.safeParse({\n version: CONFIG_VERSION,\n apiPort: options.apiPort ?? existing?.apiPort ?? DEFAULT_API_PORT,\n studioPort:\n options.studioPort ?? existing?.studioPort ?? DEFAULT_STUDIO_PORT,\n imageTag: options.imageTag ?? existing?.imageTag ?? DEFAULT_IMAGE_TAG,\n username: options.username ?? existing?.username ?? DEFAULT_USERNAME,\n projectName:\n options.projectName ?? existing?.projectName ?? DEFAULT_PROJECT_NAME,\n createdAt: existing?.createdAt ?? runtime.now(),\n });\n if (!result.success) {\n throw new Error(\n `Invalid Studio configuration.\\n${z.prettifyError(result.error)}`,\n );\n }\n return result.data;\n};\n\nconst createApiKey = (purpose: string, runtime: StudioRuntime): string =>\n `ktyx_live_${purpose}${runtime.random(6).toLowerCase()}_${runtime.random(32)}`;\n\nexport const createStudioDeploymentCredentials = (\n runtime: StudioRuntime,\n username = DEFAULT_USERNAME,\n): StudioDeploymentCredentials => ({\n KORTYX_API_KEY_PEPPER: runtime.random(48),\n KORTYX_TELEMETRY_API_KEY: createApiKey(\"telemetry\", runtime),\n KORTYX_STUDIO_API_KEY: createApiKey(\"studio\", runtime),\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: username,\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: runtime.random(24),\n});\n\nconst createEnvironment = (\n config: StudioConfig,\n runtime: StudioRuntime,\n): StudioEnvironment =>\n StudioEnvironmentSchema.parse({\n KORTYX_COMPOSE_PROJECT_NAME: config.projectName,\n KORTYX_STUDIO_IMAGE_TAG: config.imageTag,\n API_PORT: String(config.apiPort),\n STUDIO_PORT: String(config.studioPort),\n POSTGRES_PASSWORD: runtime.random(32),\n ...createStudioDeploymentCredentials(runtime, config.username),\n });\n\nconst parseEnvironmentFile = (raw: string, path: string): StudioEnvironment => {\n const values: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n if (!line || line.startsWith(\"#\")) continue;\n const separator = line.indexOf(\"=\");\n if (separator <= 0) {\n throw new Error(`Invalid environment entry in ${path}: ${line}`);\n }\n values[line.slice(0, separator)] = line.slice(separator + 1);\n }\n\n const result = StudioEnvironmentSchema.safeParse(values);\n if (!result.success) {\n throw invalidStateError(\"environment\", path, result.error);\n }\n return result.data;\n};\n\nconst serializeEnvironment = (environment: StudioEnvironment): string =>\n `${Object.entries(environment)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\")}\\n`;\n\nconst writePrivateFileAtomically = async (\n path: string,\n contents: string,\n): Promise<void> => {\n const temporaryPath = `${path}.tmp-${process.pid}`;\n let renamed = false;\n try {\n await writeFile(temporaryPath, contents, { mode: 0o600 });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, path);\n renamed = true;\n await chmod(path, 0o600);\n } finally {\n if (!renamed) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n }\n};\n\nexport const readStudioEnvironment = async (\n home: string,\n): Promise<StudioEnvironment> => {\n const path = studioEnvPath(home);\n return parseEnvironmentFile(await readFile(path, \"utf8\"), path);\n};\n\nexport const writeStudioEnvironment = async (\n home: string,\n environment: StudioEnvironment,\n): Promise<void> => {\n const parsed = StudioEnvironmentSchema.parse(environment);\n await writePrivateFileAtomically(\n studioEnvPath(home),\n serializeEnvironment(parsed),\n );\n};\n\nconst rotateApiKeySecret = (apiKey: string, runtime: StudioRuntime): string => {\n const match = /^(ktyx_(?:test|live)_[^_]+_).+$/.exec(apiKey);\n const prefix = match?.[1];\n if (!prefix) throw new Error(\"Stored Kortyx API key has an invalid format.\");\n return `${prefix}${runtime.random(32)}`;\n};\n\nexport const createRotatedStudioEnvironment = (\n environment: StudioEnvironment,\n runtime: StudioRuntime,\n): StudioEnvironment =>\n StudioEnvironmentSchema.parse({\n ...environment,\n KORTYX_TELEMETRY_API_KEY: rotateApiKeySecret(\n environment.KORTYX_TELEMETRY_API_KEY,\n runtime,\n ),\n KORTYX_STUDIO_API_KEY: rotateApiKeySecret(\n environment.KORTYX_STUDIO_API_KEY,\n runtime,\n ),\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: runtime.random(24),\n });\n\nexport const ensureStudioState = async (\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): Promise<StudioConfig> => {\n try {\n await access(join(options.home, \".updates\", \"lock\"));\n throw new Error(\n \"A Studio update is in progress. Wait for it to finish before changing the installation.\",\n );\n } catch (error) {\n if (!isMissingFile(error)) throw error;\n }\n await mkdir(options.home, { recursive: true, mode: 0o700 });\n await chmod(options.home, 0o700);\n await mkdir(join(options.home, \".updates\"), { recursive: true, mode: 0o700 });\n const existing = await readStudioConfig(options.home);\n const config = resolveConfig(existing, options, runtime);\n\n await writeFile(\n studioConfigPath(options.home),\n `${JSON.stringify(config, null, 2)}\\n`,\n { mode: 0o600 },\n );\n await chmod(studioConfigPath(options.home), 0o600);\n await writeFile(studioComposePath(options.home), STUDIO_COMPOSE_FILE, {\n mode: 0o600,\n });\n await chmod(studioComposePath(options.home), 0o600);\n\n let environment: StudioEnvironment;\n try {\n environment = await readStudioEnvironment(options.home);\n } catch (error) {\n if (!isMissingFile(error)) throw error;\n environment = createEnvironment(config, runtime);\n }\n\n if (options.imageTag && options.imageTag !== existing?.imageTag) {\n delete environment.KORTYX_API_IMAGE_REF;\n delete environment.KORTYX_STUDIO_IMAGE_REF;\n }\n const updatedEnvironment = StudioEnvironmentSchema.parse({\n ...environment,\n KORTYX_COMPOSE_PROJECT_NAME: config.projectName,\n KORTYX_STUDIO_IMAGE_TAG: config.imageTag,\n API_PORT: String(config.apiPort),\n STUDIO_PORT: String(config.studioPort),\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: config.username,\n KORTYX_STUDIO_STATE_DIR: resolve(options.home),\n KORTYX_STUDIO_UPDATE_TOKEN:\n environment.KORTYX_STUDIO_UPDATE_TOKEN ?? runtime.random(48),\n });\n await writeStudioEnvironment(options.home, updatedEnvironment);\n return config;\n};\n\nexport const requireStudioConfig = async (\n home: string,\n): Promise<StudioConfig> => {\n const config = await readStudioConfig(home);\n if (!config) {\n throw new Error(\n `Kortyx Studio is not initialized at ${home}. Run \"kortyx studio start\" first.`,\n );\n }\n return config;\n};\n","export const STUDIO_COMPOSE_FILE = `name: \\${KORTYX_COMPOSE_PROJECT_NAME:-kortyx-studio}\n\nx-api-env: &api-env\n DATABASE_URL: postgres://kortyx:\\${POSTGRES_PASSWORD}@postgres:5432/kortyx\n KORTYX_API_KEY_PEPPER: \\${KORTYX_API_KEY_PEPPER}\n\nx-bootstrap-keys: &bootstrap-keys\n KORTYX_TELEMETRY_API_KEY: \\${KORTYX_TELEMETRY_API_KEY}\n KORTYX_STUDIO_API_KEY: \\${KORTYX_STUDIO_API_KEY}\n KORTYX_STUDIO_ENABLE_REVIEWS: \\${KORTYX_STUDIO_ENABLE_REVIEWS:-0}\n\nservices:\n postgres:\n image: postgres:17-alpine\n environment:\n POSTGRES_USER: kortyx\n POSTGRES_PASSWORD: \\${POSTGRES_PASSWORD}\n POSTGRES_DB: kortyx\n volumes:\n - postgres-data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U kortyx -d kortyx\"]\n interval: 2s\n timeout: 5s\n retries: 30\n\n db-init:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n <<: [*api-env, *bootstrap-keys]\n command: >\n sh -lc \"pnpm --filter @kortyx/telemetry-db db:migrate &&\n pnpm --filter @kortyx/telemetry-db db:bootstrap\"\n depends_on:\n postgres:\n condition: service_healthy\n restart: \"no\"\n\n api:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n <<: *api-env\n NODE_ENV: production\n API_HOST: 0.0.0.0\n API_PORT: 6400\n ports:\n - \"127.0.0.1:\\${API_PORT:-6400}:6400\"\n depends_on:\n db-init:\n condition: service_completed_successfully\n healthcheck:\n test:\n [\n \"CMD-SHELL\",\n \"node -e \\\\\"fetch('http://localhost:6400/ready').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\\\\\"\",\n ]\n interval: 5s\n timeout: 5s\n retries: 30\n\n studio:\n image: \\${KORTYX_STUDIO_IMAGE_REF:-\\${KORTYX_STUDIO_IMAGE:-ghcr.io/kortyx-io/kortyx-studio}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n NODE_ENV: production\n PORT: 6300\n KORTYX_API_URL: http://api:6400\n KORTYX_STUDIO_API_KEY: \\${KORTYX_STUDIO_API_KEY}\n KORTYX_STUDIO_UPDATER_URL: http://updater:6410\n KORTYX_STUDIO_UPDATE_TOKEN: \\${KORTYX_STUDIO_UPDATE_TOKEN}\n KORTYX_STUDIO_AUTH_MODE: basic\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: \\${KORTYX_STUDIO_BASIC_AUTH_USERNAME}\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: \\${KORTYX_STUDIO_BASIC_AUTH_PASSWORD}\n ports:\n - \"127.0.0.1:\\${STUDIO_PORT:-6300}:6300\"\n depends_on:\n api:\n condition: service_healthy\n healthcheck:\n test:\n [\n \"CMD-SHELL\",\n \"node -e \\\\\"fetch('http://localhost:6300').then((r)=>process.exit(r.status<500?0:1)).catch(()=>process.exit(1))\\\\\"\",\n ]\n interval: 5s\n timeout: 5s\n retries: 30\n\n updater:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n restart: unless-stopped\n command: [\"node\", \"apps/api/dist/updater.js\", \"serve\", \"\\${KORTYX_STUDIO_STATE_DIR}\"]\n volumes:\n - type: bind\n source: \\${KORTYX_STUDIO_STATE_DIR}\n target: \\${KORTYX_STUDIO_STATE_DIR}\n - /var/run/docker.sock:/var/run/docker.sock\n healthcheck:\n test: [\"CMD\", \"node\", \"-e\", \"fetch('http://localhost:6410/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n interval: 5s\n timeout: 5s\n retries: 30\n\nvolumes:\n postgres-data:\n`;\n\nexport function studioComposeFile(updater: boolean): string {\n if (updater) return STUDIO_COMPOSE_FILE;\n return STUDIO_COMPOSE_FILE.replace(\n /\\n {2}updater:[\\s\\S]*?\\nvolumes:/,\n \"\\nvolumes:\",\n )\n .replace(/ {6}KORTYX_STUDIO_UPDATER_URL:.*\\n/, \"\")\n .replace(/ {6}KORTYX_STUDIO_UPDATE_TOKEN:.*\\n/, \"\");\n}\n","import {\n Command,\n CommanderError,\n InvalidArgumentError,\n Option,\n} from \"commander\";\nimport {\n printGeneratedDeploymentCredentials,\n printStudioConnection,\n printStudioSdkEnvironment,\n resetStudio,\n restartStudio,\n rotateStudioCredentials,\n showStudioLogs,\n showStudioStatus,\n startStudio,\n stopStudio,\n} from \"./local-stack\";\nimport { registerStudioReadCommands } from \"./read-command\";\nimport { defaultStudioRuntime } from \"./runtime\";\nimport { defaultStudioHome, requireStudioConfig } from \"./state\";\nimport type { StudioRuntime } from \"./types\";\n\ntype HomeOptions = {\n home: string;\n};\n\ntype StartOptions = HomeOptions & {\n apiPort?: number;\n studioPort?: number;\n imageTag?: string;\n username?: string;\n projectName?: string;\n};\n\ntype LogsOptions = HomeOptions & {\n follow: boolean;\n};\n\ntype ResetOptions = HomeOptions & {\n confirm: boolean;\n};\n\ntype CredentialsOptions = HomeOptions & {\n format: \"human\" | \"dotenv\";\n generate: boolean;\n rotate: boolean;\n serviceName: string;\n};\n\nconst portParser = (value: string): number => {\n const port = Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new InvalidArgumentError(\n \"Port must be an integer between 1 and 65535.\",\n );\n }\n return port;\n};\n\nconst withHome = (command: Command): Command =>\n command.addOption(\n new Option(\"--home <path>\", \"Local Studio state directory.\").default(\n defaultStudioHome(),\n ),\n );\n\nconst configureOutput = (command: Command, runtime: StudioRuntime): Command =>\n command.configureOutput({\n writeOut: (output) => runtime.log(output.trimEnd()),\n writeErr: (output) => (runtime.error ?? runtime.log)(output.trimEnd()),\n });\n\nexport const createStudioCommand = (\n runtime: StudioRuntime = defaultStudioRuntime,\n): Command => {\n const studio = configureOutput(\n new Command(\"studio\")\n .description(\"Run and manage Kortyx Studio.\")\n .showHelpAfterError()\n .addHelpText(\n \"after\",\n \"\\nLocal state and generated credentials are stored in ~/.kortyx/studio by default.\",\n ),\n runtime,\n );\n\n withHome(\n studio\n .command(\"start\")\n .description(\n \"Create or update the local stack and wait until it is healthy.\",\n )\n .option(\"--studio-port <port>\", \"Studio host port.\", portParser)\n .option(\"--api-port <port>\", \"Telemetry API host port.\", portParser)\n .option(\"--image-tag <tag>\", \"Published Studio image tag.\")\n .option(\"--username <name>\", \"Local Studio username.\")\n .option(\"--project-name <name>\", \"Docker Compose project name.\"),\n ).action(async (options: StartOptions) => {\n await startStudio(options, runtime);\n });\n\n withHome(\n studio\n .command(\"stop\")\n .description(\"Stop containers while preserving local data.\"),\n ).action(async ({ home }: HomeOptions) => {\n await stopStudio(home, runtime);\n });\n\n withHome(\n studio\n .command(\"restart\")\n .description(\"Recreate the stack and wait until it is healthy.\"),\n ).action(async ({ home }: HomeOptions) => {\n await restartStudio(home, runtime);\n });\n\n withHome(\n studio\n .command(\"status\")\n .description(\"Show container health and local endpoints.\"),\n ).action(async ({ home }: HomeOptions) => {\n await showStudioStatus(home, runtime);\n });\n\n withHome(\n studio\n .command(\"logs\")\n .description(\"Show API, Studio, bootstrap, and database logs.\")\n .option(\"--no-follow\", \"Print recent logs without following.\"),\n ).action(async ({ home, follow }: LogsOptions) => {\n await showStudioLogs(home, follow, runtime);\n });\n\n withHome(\n studio\n .command(\"credentials\")\n .description(\"Print or rotate Studio and SDK credentials.\")\n .option(\n \"--rotate\",\n \"Replace the browser password and application API-key secrets.\",\n false,\n )\n .option(\n \"--generate\",\n \"Generate unpersisted credentials for a self-hosted deployment.\",\n false,\n )\n .addOption(\n new Option(\"--format <format>\", \"Credential output format.\")\n .choices([\"human\", \"dotenv\"])\n .default(\"human\"),\n )\n .option(\n \"--service-name <name>\",\n \"SDK service name used by dotenv output.\",\n \"my-agent\",\n ),\n ).action(async (options: CredentialsOptions) => {\n const { format, generate, home, rotate, serviceName } = options;\n if (generate && rotate) {\n throw new Error(\"Use either --generate or --rotate, not both.\");\n }\n if (format === \"dotenv\" && (generate || rotate)) {\n throw new Error(\n \"--format dotenv prints persisted SDK credentials and cannot be combined with --generate or --rotate.\",\n );\n }\n if (format === \"human\" && serviceName !== \"my-agent\") {\n throw new Error(\"--service-name requires --format dotenv.\");\n }\n if (!/^[A-Za-z0-9@][A-Za-z0-9@._/-]*$/.test(serviceName)) {\n throw new Error(\"Service name contains unsupported characters.\");\n }\n if (generate) {\n printGeneratedDeploymentCredentials(runtime);\n return;\n }\n if (rotate) {\n await rotateStudioCredentials(home, runtime);\n return;\n }\n const config = await requireStudioConfig(home);\n if (format === \"dotenv\") {\n await printStudioSdkEnvironment(home, config, serviceName, runtime);\n return;\n }\n await printStudioConnection(home, config, runtime);\n });\n\n withHome(\n studio\n .command(\"reset\")\n .description(\"Delete the local Studio database volume.\")\n .option(\"--confirm\", \"Confirm permanent deletion.\", false),\n ).action(async ({ home, confirm }: ResetOptions) => {\n await resetStudio(home, confirm, runtime);\n });\n\n registerStudioReadCommands(studio, (message) => runtime.log(message));\n return studio;\n};\n\nconst overrideExitTree = (command: Command): void => {\n command.exitOverride();\n for (const child of command.commands) overrideExitTree(child);\n};\n\nexport const runStudioCommand = async (\n argv: string[],\n runtime: StudioRuntime = defaultStudioRuntime,\n): Promise<void> => {\n const command = createStudioCommand(runtime);\n overrideExitTree(command);\n if (argv.length === 0) {\n command.outputHelp();\n return;\n }\n try {\n await command.parseAsync(argv, { from: \"user\" });\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n throw error;\n }\n};\n\nexport { defaultStudioRuntime };\nexport type { StudioRuntime };\n","import { writeFile } from \"node:fs/promises\";\nimport { studioComposeFile } from \"./compose\";\nimport {\n createRotatedStudioEnvironment,\n createStudioDeploymentCredentials,\n ensureStudioState,\n readStudioEnvironment,\n requireStudioConfig,\n type StudioConfig,\n studioComposePath,\n studioEnvPath,\n writeStudioEnvironment,\n} from \"./state\";\nimport type { CommandResult, StudioRuntime, StudioStartOptions } from \"./types\";\n\nconst composeArgs = (home: string, args: string[]): string[] => [\n \"compose\",\n \"--env-file\",\n studioEnvPath(home),\n \"-f\",\n studioComposePath(home),\n ...args,\n];\n\nconst runCompose = async (\n home: string,\n args: string[],\n runtime: StudioRuntime,\n inherit = true,\n): Promise<CommandResult> =>\n await runtime.run(\"docker\", composeArgs(home, args), {\n cwd: home,\n inherit,\n });\n\nconst preflightDocker = async (runtime: StudioRuntime): Promise<void> => {\n await runtime.run(\"docker\", [\"version\", \"--format\", \"{{.Server.Version}}\"], {\n inherit: false,\n });\n await runtime.run(\"docker\", [\"compose\", \"version\", \"--short\"], {\n inherit: false,\n });\n};\n\nconst hasRunningServices = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<boolean> => {\n const result = await runCompose(\n home,\n [\"ps\", \"--status\", \"running\", \"--services\"],\n runtime,\n false,\n );\n return result.stdout.trim().length > 0;\n};\n\nconst assertPortsAvailable = async (\n config: StudioConfig,\n runtime: StudioRuntime,\n): Promise<void> => {\n for (const [label, port] of [\n [\"Studio\", config.studioPort],\n [\"API\", config.apiPort],\n ] as const) {\n if (!(await runtime.portAvailable(port))) {\n throw new Error(\n `${label} port ${port} is already in use. Choose another with --${label.toLowerCase()}-port ${port + 1}.`,\n );\n }\n }\n};\n\nexport const printStudioConnection = async (\n home: string,\n config: StudioConfig,\n runtime: StudioRuntime,\n): Promise<void> => {\n const environment = await readStudioEnvironment(home);\n runtime.log();\n runtime.log(\"Kortyx Studio connection\");\n runtime.log(` Studio: http://localhost:${config.studioPort}`);\n runtime.log(` API: http://localhost:${config.apiPort}`);\n runtime.log(` Username: ${environment.KORTYX_STUDIO_BASIC_AUTH_USERNAME}`);\n runtime.log(` Password: ${environment.KORTYX_STUDIO_BASIC_AUTH_PASSWORD}`);\n runtime.log();\n runtime.log(\"Add these server-side variables to your Kortyx SDK project:\");\n runtime.log(` KORTYX_TELEMETRY_API_URL=http://localhost:${config.apiPort}`);\n runtime.log(\n ` KORTYX_TELEMETRY_API_KEY=${environment.KORTYX_TELEMETRY_API_KEY}`,\n );\n runtime.log(\" KORTYX_TELEMETRY_ENVIRONMENT=development\");\n runtime.log(\" KORTYX_TELEMETRY_SERVICE_NAME=my-agent\");\n runtime.log();\n runtime.log(\"Next steps:\");\n runtime.log(\" 1. Add the server-side variables above to your SDK project.\");\n runtime.log(\n \" 2. Publish its workflow catalog with: npx kortyx topology push --entry <agent-entry>\",\n );\n runtime.log(\" 3. Restart your app, trigger a run, and open Studio.\");\n runtime.log();\n runtime.log(\n \"For copyable SDK variables only, run: npx kortyx studio credentials --format dotenv\",\n );\n runtime.log();\n runtime.log(`Local state: ${home}`);\n};\n\nexport const printStudioSdkEnvironment = async (\n home: string,\n config: StudioConfig,\n serviceName: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n const environment = await readStudioEnvironment(home);\n runtime.log(`KORTYX_TELEMETRY_API_URL=http://localhost:${config.apiPort}`);\n runtime.log(\n `KORTYX_TELEMETRY_API_KEY=${environment.KORTYX_TELEMETRY_API_KEY}`,\n );\n runtime.log(\"KORTYX_TELEMETRY_ENVIRONMENT=development\");\n runtime.log(`KORTYX_TELEMETRY_SERVICE_NAME=${serviceName}`);\n};\n\nexport const printGeneratedDeploymentCredentials = (\n runtime: StudioRuntime,\n): void => {\n const credentials = createStudioDeploymentCredentials(runtime);\n runtime.log(\"Kortyx Studio deployment credentials\");\n for (const [key, value] of Object.entries(credentials)) {\n runtime.log(`${key}=${value}`);\n }\n runtime.log();\n runtime.log(\n \"These values were not persisted. Store them in your deployment secret manager now; Kortyx cannot recover them later.\",\n );\n};\n\nconst applyStudioEnvironment = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await runCompose(home, [\"run\", \"--rm\", \"db-init\"], runtime);\n await runCompose(\n home,\n [\n \"up\",\n \"-d\",\n \"--force-recreate\",\n \"--wait\",\n \"--wait-timeout\",\n \"180\",\n \"api\",\n \"studio\",\n ],\n runtime,\n );\n};\n\nexport const rotateStudioCredentials = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n const previousEnvironment = await readStudioEnvironment(home);\n const rotatedEnvironment = createRotatedStudioEnvironment(\n previousEnvironment,\n runtime,\n );\n\n await writeStudioEnvironment(home, rotatedEnvironment);\n try {\n await applyStudioEnvironment(home, runtime);\n } catch (rotationError) {\n runtime.log(\n \"Credential rotation failed. Restoring the previous credentials.\",\n );\n await writeStudioEnvironment(home, previousEnvironment);\n try {\n await applyStudioEnvironment(home, runtime);\n } catch (rollbackError) {\n throw new AggregateError(\n [rotationError, rollbackError],\n `Credential rotation and automatic rollback both failed. Inspect \"${home}\" and run \"kortyx studio logs --home ${home} --no-follow\".`,\n );\n }\n throw rotationError;\n }\n\n runtime.log(\"Kortyx Studio application credentials were rotated.\");\n runtime.log(\n \"The previous browser password and API keys are no longer valid. Update every SDK producer before sending more telemetry.\",\n );\n await printStudioConnection(home, config, runtime);\n};\n\nexport const startStudio = async (\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await ensureStudioState(options, runtime);\n const environment = await readStudioEnvironment(options.home);\n const apiImage = String(\n environment.KORTYX_API_IMAGE_REF ??\n `${environment.KORTYX_API_IMAGE ?? \"ghcr.io/kortyx-io/kortyx-api\"}:${config.imageTag}`,\n );\n await runtime.run(\"docker\", [\"pull\", apiImage], { inherit: true });\n const capability = await runtime.run(\n \"docker\",\n [\n \"run\",\n \"--rm\",\n \"--entrypoint\",\n \"node\",\n apiImage,\n \"-e\",\n 'if (require(\"node:fs\").existsSync(\"/app/apps/api/dist/updater.js\")) console.log(\"supported\")',\n ],\n { inherit: false },\n );\n await writeFile(\n studioComposePath(options.home),\n studioComposeFile(\n process.platform !== \"win32\" && capability.stdout.trim() === \"supported\",\n ),\n { mode: 0o600 },\n );\n if (!(await hasRunningServices(options.home, runtime))) {\n await assertPortsAvailable(config, runtime);\n }\n runtime.log(\n \"Starting Kortyx Studio. The first image pull can take a few minutes.\",\n );\n await runCompose(\n options.home,\n [\"up\", \"-d\", \"--remove-orphans\", \"--wait\", \"--wait-timeout\", \"180\"],\n runtime,\n );\n runtime.log(\"Kortyx Studio is ready.\");\n await printStudioConnection(options.home, config, runtime);\n};\n\nexport const stopStudio = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(home, [\"stop\"], runtime);\n runtime.log(\n \"Kortyx Studio stopped. Local data and credentials were preserved.\",\n );\n};\n\nexport const restartStudio = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n await runCompose(\n home,\n [\"up\", \"-d\", \"--force-recreate\", \"--wait\", \"--wait-timeout\", \"180\"],\n runtime,\n );\n runtime.log(\"Kortyx Studio restarted.\");\n await printStudioConnection(home, config, runtime);\n};\n\nexport const showStudioStatus = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n await runCompose(home, [\"ps\"], runtime);\n runtime.log();\n runtime.log(`Studio: http://localhost:${config.studioPort}`);\n runtime.log(`API: http://localhost:${config.apiPort}`);\n runtime.log(`State: ${home}`);\n};\n\nexport const showStudioLogs = async (\n home: string,\n follow: boolean,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(\n home,\n [\"logs\", ...(follow ? [\"--follow\"] : []), \"--tail\", \"200\"],\n runtime,\n );\n};\n\nexport const resetStudio = async (\n home: string,\n confirm: boolean,\n runtime: StudioRuntime,\n): Promise<void> => {\n if (!confirm) {\n throw new Error(\n 'Reset permanently deletes the local Studio database. Re-run with \"kortyx studio reset --confirm\".',\n );\n }\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(home, [\"down\", \"--volumes\", \"--remove-orphans\"], runtime);\n runtime.log(\n 'Kortyx Studio data was deleted. Credentials were preserved; run \"kortyx studio start\" to create a fresh database.',\n );\n};\n","import {\n projectWorkflowCalls,\n resolveStudioTimeRange,\n StudioCatalogsResponseSchema,\n StudioContextResponseSchema,\n StudioInterruptDetailResponseSchema,\n StudioInterruptsResponseSchema,\n StudioRunDetailResponseSchema,\n StudioRunsResponseSchema,\n StudioSessionDetailResponseSchema,\n StudioSessionsResponseSchema,\n StudioTimeRangeSchema,\n StudioWorkflowsResponseSchema,\n} from \"@kortyx/telemetry-contracts\";\nimport { type Command, InvalidArgumentError, Option } from \"commander\";\nimport {\n type ConnectionOptions,\n defaultConnectionsHome,\n resolveConnection,\n} from \"../connections\";\nimport {\n analyzeStudioDiagnostics,\n buildStudioTimeline,\n type CatalogDrift,\n compareCatalogRuntime,\n compareRunAnalysis,\n focusStudioEvents,\n} from \"./read-analysis\";\nimport { StudioReadClient, StudioReadError } from \"./read-client\";\nimport {\n formatReadOutput,\n parseStudioTarget,\n type StudioEntity,\n sanitizeStudioData,\n summarizeEvidence,\n} from \"./read-output\";\nimport { defaultStudioHome } from \"./state\";\n\ntype ReadOptions = ConnectionOptions & {\n json?: boolean;\n includeContent?: boolean;\n eventLimit?: number;\n limit?: number;\n cursor?: number;\n environment?: string;\n range?: string;\n startedAfter?: string;\n startedBefore?: string;\n status?: string;\n workflow?: string;\n session?: string;\n user?: string;\n tenant?: string;\n model?: string;\n node?: string;\n tool?: string;\n toolOutcome?: string;\n q?: string;\n includeChildren?: boolean;\n focusSelection?: boolean;\n};\ntype DetailOptions = ReadOptions & { eventLimit: number };\ntype CohortOptions = ReadOptions & { range: string };\ntype ListOptions = CohortOptions & { limit: number; cursor: number };\nconst integer = (min: number, max: number) => (value: string) => {\n if (\n !/^\\d+$/.test(value) ||\n !Number.isSafeInteger(Number(value)) ||\n Number(value) < min ||\n Number(value) > max\n ) {\n throw new InvalidArgumentError(\n `Expected an integer between ${min} and ${max}.`,\n );\n }\n return Number(value);\n};\nconst rangeAliases: Record<string, string> = {\n \"1h\": \"Last hour\",\n \"24h\": \"24 hours\",\n \"7d\": \"7 days\",\n \"30d\": \"30 days\",\n all: \"All time\",\n};\nexport const registerStudioReadCommands = (\n studio: Command,\n log: (message: string) => void,\n request: typeof fetch = fetch,\n) => {\n const common = (command: Command) =>\n command\n .option(\n \"--connection <name>\",\n \"Named project/URL connection (or KORTYX_CONNECTION).\",\n )\n .option(\n \"--config-home <path>\",\n \"Connection configuration directory.\",\n defaultConnectionsHome(),\n )\n .option(\n \"--home <path>\",\n \"Managed local Studio directory.\",\n defaultStudioHome(),\n )\n .option(\n \"--api-url <url>\",\n \"Direct API URL; requires --api-key-env. Never reuses a profile key.\",\n )\n .option(\n \"--api-key-env <name>\",\n \"Environment variable holding a direct connection read key.\",\n )\n .option(\"--json\", \"Print stable machine-readable JSON.\")\n .option(\n \"--include-content\",\n \"Include captured input/output and prompts (may contain sensitive data).\",\n );\n const print = (value: unknown, options: ReadOptions) =>\n log(\n formatReadOutput(\n sanitizeStudioData(value, options.includeContent ?? false),\n options.json ?? false,\n ),\n );\n const clientFor = async (options: ReadOptions, targetUrl?: string) => {\n const connection = await resolveConnection(options, targetUrl);\n return {\n connection,\n client: new StudioReadClient(\n connection.apiUrl,\n connection.apiKey,\n request,\n ),\n };\n };\n const inspect = async (\n input: string,\n options: DetailOptions,\n entity?: StudioEntity,\n ) => {\n const target = parseStudioTarget(input, entity);\n const { connection, client } = await clientFor(options, target.url);\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n // Branch types have separate schemas; avoid relaxing validation to generic JSON.\n const path = `/v1/studio/${target.entity}/${encodeURIComponent(target.id)}`;\n const detail =\n target.entity === \"runs\"\n ? await client.get(path, StudioRunDetailResponseSchema)\n : target.entity === \"sessions\"\n ? await client.get(path, StudioSessionDetailResponseSchema)\n : await client.get(path, StudioInterruptDetailResponseSchema);\n const limit = options.eventLimit;\n const events = [...detail.events].sort(\n (a, b) =>\n Date.parse(a.occurredAt) - Date.parse(b.occurredAt) ||\n Date.parse(a.receivedAt) - Date.parse(b.receivedAt) ||\n a.id.localeCompare(b.id),\n );\n const focus = options.focusSelection\n ? focusStudioEvents(events, target)\n : { events, applied: {} };\n const selectedEvents = focus.events;\n const evidence = summarizeEvidence(selectedEvents);\n const run = \"run\" in detail ? detail.run : null;\n const interrupts =\n \"interrupts\" in detail\n ? detail.interrupts\n : \"interrupt\" in detail\n ? [detail.interrupt]\n : [];\n const analyzedFindings = analyzeStudioDiagnostics(\n selectedEvents,\n run,\n interrupts,\n );\n const supersededEventIds = new Set(\n analyzedFindings.flatMap((finding) => finding.eventIds),\n );\n const findings = [\n ...evidence.findings.filter(\n (finding) => !supersededEventIds.has(finding.eventId),\n ),\n ...analyzedFindings,\n ];\n const calls = projectWorkflowCalls(selectedEvents);\n let catalog: CatalogDrift | undefined;\n if (target.entity === \"runs\" && run) {\n try {\n const workflows = await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n { range: \"All time\", workflow: run.workflowId },\n );\n catalog = compareCatalogRuntime(run, workflows.workflows);\n } catch (error) {\n catalog = {\n status: \"unavailable\",\n workflows: [],\n reason:\n error instanceof StudioReadError\n ? error.code\n : \"catalog_comparison_failed\",\n };\n }\n }\n const catalogFinding =\n catalog?.status === \"drift\"\n ? [\n {\n code: \"catalog_runtime_drift\",\n severity: \"warning\" as const,\n message:\n \"The executed workflow revision differs from the currently active catalog revision.\",\n eventIds: [],\n evidence: catalog.workflows,\n },\n ]\n : [];\n const allFindings = [...findings, ...catalogFinding];\n print(\n {\n schemaVersion: 1,\n connection: {\n name: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n target,\n detail: { ...detail, events: selectedEvents.slice(-limit) },\n timeline: buildStudioTimeline(selectedEvents, interrupts).slice(-limit),\n calls: calls.slice(-limit).map(({ events: callEvents, ...call }) => ({\n ...call,\n eventIds: callEvents.map((event) => event.id),\n })),\n diagnostics: {\n ...evidence,\n findings: allFindings.slice(-limit),\n findingCount: allFindings.length,\n findingsOmitted: Math.max(0, allFindings.length - limit),\n },\n ...(catalog ? { catalog } : {}),\n coverage: {\n returnedEvents: Math.min(selectedEvents.length, limit),\n availableEvents: selectedEvents.length,\n omittedEvents: Math.max(0, selectedEvents.length - limit),\n eventWindow: \"latest\",\n selectionFocus: options.focusSelection\n ? {\n applied: focus.applied,\n matchedEvents: selectedEvents.length,\n totalEvents: events.length,\n }\n : null,\n contentIncluded: options.includeContent ?? false,\n availableCalls: calls.length,\n omittedCalls: Math.max(0, calls.length - limit),\n note: \"Available events are those returned by Studio, not a guarantee of complete runtime history. Content capture is opt-in; secrets are redacted on a best-effort basis even with --include-content.\",\n },\n },\n options,\n );\n };\n const detailOptions = (command: Command) =>\n common(command)\n .option(\n \"--event-limit <count>\",\n \"Maximum latest events and diagnostic findings (1–10000).\",\n integer(1, 10_000),\n 100,\n )\n .option(\n \"--focus-selection\",\n \"Focus events using call/event/branch/node/trace selectors from the URL.\",\n );\n detailOptions(\n studio\n .command(\"inspect <url>\")\n .description(\n \"Inspect a pasted run/session/interrupt URL using a matching configured connection.\",\n ),\n ).action((input: string, options: DetailOptions) => inspect(input, options));\n common(\n studio\n .command(\"doctor\")\n .description(\n \"Verify the read credential, project, environments, and API compatibility.\",\n ),\n ).action(async (options: ReadOptions) => {\n const { connection, client } = await clientFor(options);\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n options,\n );\n });\n common(\n studio\n .command(\"catalogs\")\n .description(\n \"Read available environment/provider/model/workflow/tag filters.\",\n ),\n ).action(async (options: ReadOptions) => {\n const { connection, client } = await clientFor(options);\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data: await client.get(\n \"/v1/studio/catalogs\",\n StudioCatalogsResponseSchema,\n ),\n },\n options,\n );\n });\n const filters = (command: Command) =>\n common(command)\n .option(\n \"--environment <name>\",\n \"Environment filter; overrides the connection default.\",\n )\n .addOption(\n new Option(\n \"--range <range>\",\n \"Studio time range: 1h, 24h, 7d, 30d, all (or Studio preset name).\",\n )\n .choices([\n ...Object.keys(rangeAliases),\n ...StudioTimeRangeSchema.options,\n ])\n .default(\"24h\"),\n )\n .option(\n \"--started-after <iso>\",\n \"Explicit start boundary (requires --started-before).\",\n )\n .option(\n \"--started-before <iso>\",\n \"Explicit end boundary (requires --started-after).\",\n )\n .option(\"--workflow <id>\", \"Workflow filter.\");\n const timeQuery = (options: CohortOptions): Record<string, string> => {\n const custom = Boolean(options.startedAfter || options.startedBefore);\n const range = custom\n ? \"Custom range\"\n : (rangeAliases[options.range] ?? options.range);\n const resolution = resolveStudioTimeRange({\n range,\n startedAfter: options.startedAfter,\n startedBefore: options.startedBefore,\n });\n if (\"error\" in resolution)\n throw new StudioReadError(\"invalid_time_range\", resolution.error);\n return custom\n ? {\n range,\n startedAfter: String(resolution.value.startedAfter),\n startedBefore: String(resolution.value.startedBefore),\n }\n : { range };\n };\n for (const entity of [\"runs\", \"sessions\", \"interrupts\"] as const) {\n const group = studio.command(entity).description(`Read Studio ${entity}.`);\n detailOptions(\n group\n .command(\"get <id-or-url>\")\n .description(\"Read detail, events, and diagnostic evidence.\"),\n ).action((input: string, options: DetailOptions) =>\n inspect(input, options, entity),\n );\n if (entity === \"runs\") {\n common(\n group\n .command(\"compare <left-id-or-url> <right-id-or-url>\")\n .description(\n \"Compare two runs' versions, outcomes, and compact execution timelines.\",\n ),\n )\n .option(\n \"--event-limit <count>\",\n \"Maximum timeline steps returned per run (1–10000).\",\n integer(1, 10_000),\n 100,\n )\n .action(\n async (\n leftInput: string,\n rightInput: string,\n options: DetailOptions,\n ) => {\n const leftTarget = parseStudioTarget(leftInput, \"runs\");\n const rightTarget = parseStudioTarget(rightInput, \"runs\");\n const { connection, client } = await clientFor(\n options,\n leftTarget.url,\n );\n // Resolve again against the selected profile so a second pasted URL\n // cannot silently send this project's credential to another locator.\n await resolveConnection(\n { ...options, connection: connection.name },\n rightTarget.url,\n );\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n const [leftDetail, rightDetail] = await Promise.all([\n client.get(\n `/v1/studio/runs/${encodeURIComponent(leftTarget.id)}`,\n StudioRunDetailResponseSchema,\n ),\n client.get(\n `/v1/studio/runs/${encodeURIComponent(rightTarget.id)}`,\n StudioRunDetailResponseSchema,\n ),\n ]);\n const catalogFor = async (\n detail: typeof leftDetail,\n ): Promise<CatalogDrift> => {\n try {\n const response = await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n { range: \"All time\", workflow: detail.run.workflowId },\n );\n return compareCatalogRuntime(detail.run, response.workflows);\n } catch (error) {\n return {\n status: \"unavailable\",\n workflows: [],\n reason:\n error instanceof StudioReadError\n ? error.code\n : \"catalog_comparison_failed\",\n };\n }\n };\n const [leftCatalog, rightCatalog] = await Promise.all([\n catalogFor(leftDetail),\n catalogFor(rightDetail),\n ]);\n const side = (\n target: ReturnType<typeof parseStudioTarget>,\n detail: typeof leftDetail,\n catalog: CatalogDrift,\n ) => {\n const ordered = [...detail.events].sort(\n (a, b) =>\n Date.parse(a.occurredAt) - Date.parse(b.occurredAt) ||\n Date.parse(a.receivedAt) - Date.parse(b.receivedAt) ||\n a.id.localeCompare(b.id),\n );\n const timeline = buildStudioTimeline(\n ordered,\n detail.interrupts,\n ).slice(-options.eventLimit);\n return {\n target,\n run: detail.run,\n timeline,\n catalog,\n deploymentRefs: [\n ...new Set(\n ordered\n .map((event) => event.deploymentRef)\n .filter((value): value is string => Boolean(value)),\n ),\n ],\n diagnostics: analyzeStudioDiagnostics(\n ordered,\n detail.run,\n detail.interrupts,\n ),\n coverage: {\n returnedTimelineSteps: timeline.length,\n availableEvents: ordered.length,\n contentIncluded: options.includeContent ?? false,\n },\n };\n };\n const left = side(leftTarget, leftDetail, leftCatalog);\n const right = side(rightTarget, rightDetail, rightCatalog);\n print(\n {\n schemaVersion: 1,\n connection: {\n name: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n left,\n right,\n comparison: compareRunAnalysis(left, right),\n note: \"Comparison reports observed differences, not an automated root-cause verdict. Missing or omitted content cannot prove equivalence.\",\n },\n options,\n );\n },\n );\n }\n const list = filters(\n group.command(\"list\").description(\"Read a bounded, filtered page.\"),\n )\n .option(\"--limit <count>\", \"Page size (1–100).\", integer(1, 100), 25)\n .option(\n \"--cursor <offset>\",\n \"Numeric offset returned as nextCursor.\",\n integer(0, Number.MAX_SAFE_INTEGER),\n 0,\n )\n .option(\"--status <status>\", \"Entity status filter.\")\n .option(\"--session <id>\", \"Session filter.\")\n .option(\"--user <id>\", \"User filter.\")\n .option(\"--tenant <id>\", \"Tenant filter.\")\n .option(\"--model <name>\", \"Model filter.\")\n .option(\"--node <id>\", \"Node filter.\")\n .option(\"--tool <name>\", \"Tool name filter.\")\n .addOption(\n new Option(\"--tool-outcome <outcome>\", \"Tool outcome filter.\").choices([\n \"success\",\n \"denied\",\n \"fault\",\n \"cancelled\",\n \"reused\",\n ]),\n )\n .option(\"--q <text>\", \"Search filter.\")\n .option(\"--include-children\", \"Include child workflow runs.\");\n list.action(async (options: ListOptions) => {\n const query: Record<string, string> = timeQuery(options);\n const { connection, client } = await clientFor(options);\n const environment = options.environment ?? connection.environment;\n if (environment) query.env = environment;\n for (const key of [\n \"status\",\n \"workflow\",\n \"session\",\n \"user\",\n \"tenant\",\n \"model\",\n \"node\",\n \"tool\",\n \"toolOutcome\",\n \"q\",\n ] as const) {\n const value = options[key];\n if (value) query[key] = value;\n }\n query.pageSize = String(options.limit);\n query.cursor = String(options.cursor);\n if (options.includeChildren) query.includeChildren = \"true\";\n const path = `/v1/studio/${entity}`;\n const data =\n entity === \"runs\"\n ? await client.get(path, StudioRunsResponseSchema, query)\n : entity === \"sessions\"\n ? await client.get(path, StudioSessionsResponseSchema, query)\n : await client.get(path, StudioInterruptsResponseSchema, query);\n const items =\n \"runs\" in data\n ? data.runs\n : \"sessions\" in data\n ? data.sessions\n : data.interrupts;\n const next = options.cursor + items.length;\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data,\n page: {\n cursor: options.cursor,\n limit: options.limit,\n nextCursor: items.length && next < data.totalCount ? next : null,\n },\n },\n options,\n );\n });\n }\n const workflows = studio\n .command(\"workflows\")\n .description(\"Read declared topology and observed workflow metrics.\");\n filters(\n workflows\n .command(\"list\")\n .description(\"Read workflow topology in a time cohort.\"),\n )\n .option(\"--version <version>\", \"Declared version filter.\")\n .action(async (options: CohortOptions & { version?: string }) => {\n if (options.environment)\n throw new StudioReadError(\n \"unsupported_filter\",\n \"The workflow API does not currently support environment filtering.\",\n );\n const query: Record<string, string> = timeQuery(options);\n if (options.workflow) query.workflow = options.workflow;\n if (options.version) query.version = options.version;\n const { connection, client } = await clientFor(options);\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data: await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n query,\n ),\n note: \"Workflow metrics span environments; connection environment defaults are not applied by this API.\",\n },\n options,\n );\n });\n};\n","import {\n projectWorkflowCalls,\n type StudioDetailEvent,\n type StudioInterrupt,\n type StudioRun,\n type StudioWorkflow,\n} from \"@kortyx/telemetry-contracts\";\nimport { StudioReadError } from \"./read-client\";\nimport type { StudioTarget } from \"./read-output\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\nconst numberValue = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\nconst recordValue = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nexport type StudioTimelineItem = {\n step: number;\n eventId: string;\n at: string;\n kind: \"model\" | \"tool\" | \"interrupt\" | \"resume\" | \"limit\";\n nodeId: string | null;\n workflowId: string;\n durationMs?: number | undefined;\n provider?: string | undefined;\n model?: string | undefined;\n finishReason?: unknown;\n toolName?: string | undefined;\n toolOutcome?: string | undefined;\n toolCallId?: string | undefined;\n input?: unknown;\n output?: unknown;\n interruptId?: string | undefined;\n interruptType?: string | undefined;\n interactionMode?: string | undefined;\n contract?: string | undefined;\n schemaId?: string | undefined;\n schemaVersion?: string | undefined;\n request?: unknown;\n response?: unknown;\n resumeOutcome?: string | undefined;\n limit?: string | undefined;\n consumed?: unknown;\n maximum?: unknown;\n question?: unknown;\n};\n\nconst toolTerminalTypes = new Set([\n \"tool.completed\",\n \"tool.failed\",\n \"tool.denied\",\n \"tool.cancelled\",\n \"tool.reused\",\n]);\n\n/** A compact, non-duplicative execution story derived only from persisted facts. */\nexport const buildStudioTimeline = (\n events: StudioDetailEvent[],\n interrupts: StudioInterrupt[] = [],\n): StudioTimelineItem[] => {\n const interruptById = new Map(interrupts.map((item) => [item.id, item]));\n const items: Omit<StudioTimelineItem, \"step\">[] = [];\n const ordered = [...events].sort(\n (left, right) =>\n Date.parse(left.occurredAt) - Date.parse(right.occurredAt) ||\n Date.parse(left.receivedAt) - Date.parse(right.receivedAt) ||\n left.id.localeCompare(right.id),\n );\n for (const event of ordered) {\n const payload = event.payload;\n const base = {\n eventId: event.id,\n at: event.occurredAt,\n nodeId: event.nodeId,\n workflowId: event.workflowId,\n };\n if (event.type === \"generation.completed\") {\n items.push({\n ...base,\n kind: \"model\",\n ...(numberValue(payload.durationMs) !== undefined\n ? { durationMs: numberValue(payload.durationMs) }\n : {}),\n ...(stringValue(payload.provider)\n ? { provider: stringValue(payload.provider) }\n : {}),\n ...(stringValue(payload.model)\n ? { model: stringValue(payload.model) }\n : {}),\n ...(payload.finishReason !== undefined\n ? { finishReason: payload.finishReason }\n : {}),\n });\n continue;\n }\n if (toolTerminalTypes.has(event.type)) {\n const fallbackOutcome = event.type.slice(\"tool.\".length);\n items.push({\n ...base,\n kind: \"tool\",\n ...(numberValue(payload.durationMs) !== undefined\n ? { durationMs: numberValue(payload.durationMs) }\n : {}),\n ...(stringValue(payload.name) || stringValue(payload.tool)\n ? { toolName: stringValue(payload.name) ?? stringValue(payload.tool) }\n : {}),\n toolOutcome:\n stringValue(payload.outcome) ??\n (fallbackOutcome === \"completed\" ? \"success\" : fallbackOutcome),\n ...(stringValue(payload.toolCallId)\n ? { toolCallId: stringValue(payload.toolCallId) }\n : {}),\n ...(payload.input !== undefined ? { input: payload.input } : {}),\n ...(payload.output !== undefined ? { output: payload.output } : {}),\n });\n continue;\n }\n if (event.type === \"interrupt.created\") {\n const id = stringValue(payload.interruptId);\n const interrupt = id ? interruptById.get(id) : undefined;\n items.push({\n ...base,\n kind: \"interrupt\",\n ...(id ? { interruptId: id } : {}),\n ...(interrupt?.type || stringValue(payload.kind)\n ? { interruptType: interrupt?.type ?? stringValue(payload.kind) }\n : {}),\n ...(interrupt?.interactionMode || stringValue(payload.interactionMode)\n ? {\n interactionMode:\n interrupt?.interactionMode ??\n stringValue(payload.interactionMode),\n }\n : {}),\n ...(interrupt?.contract || stringValue(payload.contract)\n ? { contract: interrupt?.contract ?? stringValue(payload.contract) }\n : {}),\n ...(interrupt?.schemaId || stringValue(payload.schemaId)\n ? { schemaId: interrupt?.schemaId ?? stringValue(payload.schemaId) }\n : {}),\n ...(interrupt?.schemaVersion || stringValue(payload.schemaVersion)\n ? {\n schemaVersion:\n interrupt?.schemaVersion ?? stringValue(payload.schemaVersion),\n }\n : {}),\n ...(payload.request !== undefined ? { request: payload.request } : {}),\n ...(interrupt?.question !== undefined && interrupt.question !== null\n ? { question: interrupt.question }\n : payload.question !== undefined\n ? { question: payload.question }\n : {}),\n });\n continue;\n }\n if (event.type === \"interrupt.resolved\") {\n items.push({\n ...base,\n kind: \"resume\",\n ...(stringValue(payload.interruptId)\n ? { interruptId: stringValue(payload.interruptId) }\n : {}),\n ...(stringValue(payload.resumeOutcome)\n ? { resumeOutcome: stringValue(payload.resumeOutcome) }\n : {}),\n ...(stringValue(payload.contract)\n ? { contract: stringValue(payload.contract) }\n : {}),\n ...(payload.responseValue !== undefined\n ? { response: payload.responseValue }\n : payload.response !== undefined\n ? { response: payload.response }\n : {}),\n });\n continue;\n }\n if (event.type === \"run.limit_reached\") {\n items.push({\n ...base,\n kind: \"limit\",\n ...(stringValue(payload.limit)\n ? { limit: stringValue(payload.limit) }\n : {}),\n ...(payload.consumed !== undefined\n ? { consumed: payload.consumed }\n : {}),\n ...(payload.maximum !== undefined ? { maximum: payload.maximum } : {}),\n });\n }\n }\n return items.map((item, index) => ({ step: index + 1, ...item }));\n};\n\nconst selectedValue = (\n event: StudioDetailEvent,\n key: \"branch\" | \"call\",\n): string[] => {\n const payload = event.payload;\n if (key === \"branch\")\n return [stringValue(payload.branchId)].filter((value): value is string =>\n Boolean(value),\n );\n return [\n stringValue(payload.callId),\n stringValue(payload.invocationId),\n ].filter((value): value is string => Boolean(value));\n};\n\n/** Applies only selectors with execution semantics; UI layout selectors stay contextual. */\nexport const focusStudioEvents = (\n events: StudioDetailEvent[],\n target: StudioTarget,\n): { events: StudioDetailEvent[]; applied: Record<string, string> } => {\n const selection = target.selection ?? {};\n const applied = Object.fromEntries(\n [\"event\", \"trace\", \"node\", \"branch\", \"call\"]\n .filter((key) => Boolean(selection[key]))\n .map((key) => [key, selection[key] as string]),\n );\n if (Object.keys(applied).length === 0)\n throw new StudioReadError(\n \"selection_not_focusable\",\n \"The URL has no event, trace, node, branch, or call selector to focus.\",\n );\n const callEventIds = new Set(\n selection.call\n ? projectWorkflowCalls(events)\n .filter(\n (call) =>\n call.id === selection.call ||\n call.callId === selection.call ||\n call.invocationId === selection.call,\n )\n .flatMap((call) => call.events.map((event) => event.id))\n : [],\n );\n const focused = events.filter((event) =>\n Object.entries(applied).every(([key, value]) => {\n if (key === \"event\") return event.id === value;\n if (key === \"trace\") return event.traceId === value;\n if (key === \"node\") return event.nodeId === value;\n if (key === \"branch\")\n return selectedValue(event, \"branch\").includes(value);\n return (\n callEventIds.has(event.id) ||\n selectedValue(event, \"call\").includes(value)\n );\n }),\n );\n if (focused.length === 0)\n throw new StudioReadError(\n \"selection_not_found\",\n \"The pasted URL selector did not match any returned Studio events.\",\n );\n return { events: focused, applied };\n};\n\nexport type StudioDiagnosticFinding = {\n code: string;\n severity: \"error\" | \"warning\" | \"context\";\n message: string;\n eventIds: string[];\n evidence?: unknown;\n};\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, stableValue(item)]),\n );\n return value;\n};\n\nexport const analyzeStudioDiagnostics = (\n events: StudioDetailEvent[],\n run?: StudioRun | null,\n interrupts: StudioInterrupt[] = [],\n): StudioDiagnosticFinding[] => {\n const findings: StudioDiagnosticFinding[] = [];\n const terminalTools = events.filter((event) =>\n toolTerminalTypes.has(event.type),\n );\n for (let index = 1; index < terminalTools.length; index++) {\n const previous = terminalTools[index - 1];\n const current = terminalTools[index];\n if (!previous || !current) continue;\n const previousName =\n stringValue(previous.payload.name) ?? stringValue(previous.payload.tool);\n const currentName =\n stringValue(current.payload.name) ?? stringValue(current.payload.tool);\n if (\n previousName &&\n previousName === currentName &&\n previous.payload.input !== undefined &&\n current.payload.input !== undefined &&\n JSON.stringify(stableValue(previous.payload.input)) ===\n JSON.stringify(stableValue(current.payload.input))\n ) {\n findings.push({\n code: \"repeated_tool_input\",\n severity: \"warning\",\n message: `Tool ${currentName} was called consecutively with the same captured input.`,\n eventIds: [previous.id, current.id],\n evidence: { toolName: currentName, input: current.payload.input },\n });\n }\n }\n\n let lastInterrupt: StudioDetailEvent | undefined;\n for (const event of events) {\n if (toolTerminalTypes.has(event.type)) lastInterrupt = undefined;\n if (event.type !== \"interrupt.created\") continue;\n if (lastInterrupt)\n findings.push({\n code: \"consecutive_human_interrupts\",\n severity: \"warning\",\n message:\n \"Human input was requested again without an intervening terminal tool event.\",\n eventIds: [lastInterrupt.id, event.id],\n });\n lastInterrupt = event;\n }\n\n for (const event of events.filter(\n (item) => item.type === \"run.limit_reached\",\n ))\n findings.push({\n code: \"tool_step_limit_reached\",\n severity: \"warning\",\n message: \"The runtime reported that an execution limit was reached.\",\n eventIds: [event.id],\n evidence: event.payload,\n });\n\n const schemaFailures = events.filter((event) => {\n if (event.type !== \"span.failed\") return false;\n const error = recordValue(event.payload.error);\n const failure = recordValue(event.payload.failure);\n const haystack = [\n error.code,\n error.message,\n failure.code,\n failure.message,\n event.payload.code,\n event.payload.message,\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\" \");\n return /MODEL_OUTPUT_SCHEMA|INVALID_OUTPUT|output (?:schema|validation)|schema validation/i.test(\n haystack,\n );\n });\n for (const failure of schemaFailures) {\n const laterGeneration = events.find(\n (event) =>\n event.type === \"generation.completed\" &&\n Date.parse(event.occurredAt) > Date.parse(failure.occurredAt),\n );\n findings.push({\n code: laterGeneration ? \"output_schema_retry\" : \"output_schema_failure\",\n severity: laterGeneration ? \"warning\" : \"error\",\n message: laterGeneration\n ? \"An output-schema failure was followed by another model generation.\"\n : \"The runtime reported an output-schema validation failure.\",\n eventIds: [failure.id, ...(laterGeneration ? [laterGeneration.id] : [])],\n evidence: failure.payload,\n });\n }\n\n const pending = interrupts.filter((item) => item.status === \"pending\");\n if (run?.status === \"interrupted\" && pending.length > 0)\n findings.push({\n code: \"unresolved_interrupt\",\n severity: \"warning\",\n message: \"The workflow is suspended with unresolved human input.\",\n eventIds: events\n .filter(\n (event) =>\n event.type === \"interrupt.created\" &&\n pending.some((item) => item.id === event.payload.interruptId),\n )\n .map((event) => event.id),\n evidence: { interruptIds: pending.map((item) => item.id) },\n });\n return findings;\n};\n\nexport type CatalogDrift = {\n status: \"current\" | \"drift\" | \"not-published\" | \"unavailable\";\n workflows: Array<{\n workflowId: string;\n executedRevisionId: string | null;\n executedVersion: string | null;\n activeRevisionId: string | null;\n activeVersion: string | null;\n drift: boolean;\n }>;\n reason?: string;\n};\n\nexport const compareCatalogRuntime = (\n run: StudioRun,\n workflows: StudioWorkflow[],\n): CatalogDrift => {\n const rootReferences = run.workflowRefs.filter(\n (reference) => reference.workflowId === run.workflowId,\n );\n const rows = rootReferences.length\n ? rootReferences\n : [\n {\n workflowId: run.workflowId,\n workflowRevisionId: run.workflowRevisionId,\n declaredVersion: run.declaredVersion,\n },\n ];\n const compared = rows.map((reference) => {\n const workflow = workflows.find((item) => item.id === reference.workflowId);\n return {\n workflowId: reference.workflowId,\n executedRevisionId: reference.workflowRevisionId,\n executedVersion: reference.declaredVersion,\n activeRevisionId: workflow?.activeRevisionId ?? null,\n activeVersion: workflow?.activeVersion ?? null,\n drift: Boolean(\n (workflow?.activeRevisionId &&\n reference.workflowRevisionId &&\n workflow.activeRevisionId !== reference.workflowRevisionId) ||\n (!reference.workflowRevisionId &&\n workflow?.activeVersion &&\n reference.declaredVersion &&\n workflow.activeVersion !== reference.declaredVersion),\n ),\n };\n });\n const published = compared.some((item) => item.activeRevisionId);\n return {\n status: !published\n ? \"not-published\"\n : compared.some((item) => item.drift)\n ? \"drift\"\n : \"current\",\n workflows: compared,\n };\n};\n\nexport const compareRunAnalysis = (\n left: {\n run: StudioRun;\n timeline: StudioTimelineItem[];\n catalog: CatalogDrift;\n deploymentRefs?: string[];\n },\n right: {\n run: StudioRun;\n timeline: StudioTimelineItem[];\n catalog: CatalogDrift;\n deploymentRefs?: string[];\n },\n) => {\n const metadataFields = [\n \"workflowId\",\n \"workflowRevisionId\",\n \"declaredVersion\",\n \"environment\",\n \"provider\",\n \"model\",\n \"status\",\n \"result\",\n ] as const;\n const metadata: Array<{ field: string; left: unknown; right: unknown }> =\n metadataFields.flatMap((field) =>\n JSON.stringify(left.run[field]) === JSON.stringify(right.run[field])\n ? []\n : [{ field, left: left.run[field], right: right.run[field] }],\n );\n if (\n JSON.stringify(left.deploymentRefs ?? []) !==\n JSON.stringify(right.deploymentRefs ?? [])\n )\n metadata.push({\n field: \"deploymentRefs\",\n left: left.deploymentRefs ?? [],\n right: right.deploymentRefs ?? [],\n });\n const signature = (item: StudioTimelineItem) =>\n `${item.kind}:${item.toolName ?? item.interruptType ?? item.limit ?? \"\"}`;\n const length = Math.max(left.timeline.length, right.timeline.length);\n const comparable = (item: StudioTimelineItem) => {\n const { step: _step, eventId: _eventId, at: _at, ...rest } = item;\n return rest;\n };\n const timeline = Array.from({ length }, (_, index) => {\n const leftItem = left.timeline[index] ?? null;\n const rightItem = right.timeline[index] ?? null;\n return {\n index: index + 1,\n status:\n leftItem && rightItem\n ? JSON.stringify(comparable(leftItem)) ===\n JSON.stringify(comparable(rightItem))\n ? \"same\"\n : signature(leftItem) === signature(rightItem)\n ? \"changed\"\n : \"diverged\"\n : leftItem\n ? \"removed\"\n : \"added\",\n left: leftItem,\n right: rightItem,\n };\n });\n return {\n metadata,\n timeline,\n firstDivergence:\n timeline.find((item) => item.status !== \"same\")?.index ?? null,\n different:\n metadata.length > 0 || timeline.some((item) => item.status !== \"same\"),\n };\n};\n","import type { StudioDetailEvent } from \"@kortyx/telemetry-contracts\";\nimport { StudioReadError } from \"./read-client\";\n\nexport type StudioEntity = \"runs\" | \"sessions\" | \"interrupts\";\nexport type StudioTarget = {\n entity: StudioEntity;\n id: string;\n url?: string;\n selection?: Record<string, string>;\n};\nexport const parseStudioTarget = (\n input: string,\n entity?: StudioEntity,\n): StudioTarget => {\n if (/^[a-z][a-z0-9+.-]*:/i.test(input)) {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new StudioReadError(\"invalid_target\", \"Invalid Studio URL.\");\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password\n ) {\n throw new StudioReadError(\n \"invalid_target\",\n \"Use an HTTP(S) Studio entity URL without embedded credentials.\",\n );\n }\n const match = url.pathname.match(\n /\\/(runs|sessions|interrupts)\\/([^/]+)\\/?$/,\n );\n if (!match)\n throw new StudioReadError(\n \"invalid_target\",\n \"Expected a Studio /runs/<id>, /sessions/<id>, or /interrupts/<id> URL.\",\n );\n if (entity && match[1] !== entity)\n throw new StudioReadError(\n \"invalid_target\",\n \"URL entity type does not match the command.\",\n );\n let id: string;\n try {\n id = decodeURIComponent(match[2] ?? \"\");\n } catch {\n throw new StudioReadError(\n \"invalid_target\",\n \"Invalid entity ID encoding.\",\n );\n }\n validateId(id);\n // Preserve navigation context, but never turn URL query parameters into API filters.\n const selection: Record<string, string> = {};\n for (const key of [\n \"tab\",\n \"sessionTab\",\n \"call\",\n \"branch\",\n \"node\",\n \"event\",\n \"trace\",\n \"detailView\",\n ]) {\n const value = url.searchParams.get(key);\n if (value) selection[key] = value;\n }\n // Query strings may contain credentials or arbitrary content. Only retain known UI selectors.\n url.search = \"\";\n url.hash = \"\";\n return {\n entity: match[1] as StudioEntity,\n id,\n url: url.toString(),\n selection,\n };\n }\n if (!entity)\n throw new StudioReadError(\n \"invalid_target\",\n \"inspect requires a Studio entity URL. Use runs/sessions/interrupts get for a bare ID.\",\n );\n validateId(input);\n return { entity, id: input };\n};\nconst validateId = (id: string) => {\n if (\n !id ||\n id.length > 512 ||\n id === \".\" ||\n id === \"..\" ||\n /[\\s/?#\\\\]/.test(id) ||\n [...id].some(\n (char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127,\n )\n ) {\n throw new StudioReadError(\"invalid_target\", \"Invalid Studio entity ID.\");\n }\n};\n\nconst secretKey =\n /(?:password|secret|authorization|cookie|apikey|credential|resumetoken|accesstoken|refreshtoken|bearertoken|sessiontoken|authtoken)/i;\nconst contentKey =\n /^(?:input|output|inputs|outputs|inputmessages|outputmessages|messages|prompt|systemprompt|question|response|result|latestresult|arguments|args|content|text|options)$/i;\nexport const sanitizeStudioData = (\n value: unknown,\n includeContent: boolean,\n key = \"\",\n): unknown => {\n const normalized = key.replace(/[^a-z0-9]/gi, \"\");\n const keyPolicy =\n normalized.toLowerCase() === \"apikey\" &&\n value &&\n typeof value === \"object\" &&\n \"scopes\" in value &&\n \"mode\" in value;\n if (secretKey.test(normalized) && !keyPolicy) return \"[REDACTED]\";\n if (!includeContent && contentKey.test(normalized))\n return \"[CONTENT OMITTED: use --include-content]\";\n if (typeof value === \"string\")\n return value\n .replace(/ktyx_(?:test|live)_[^\\s\"'<>]+/g, \"[REDACTED]\")\n .replace(/Bearer\\s+[A-Za-z0-9._~+/-]+=*/gi, \"Bearer [REDACTED]\");\n if (Array.isArray(value))\n return value.map((item) => sanitizeStudioData(item, includeContent));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value).map(([name, item]) => [\n name,\n sanitizeStudioData(item, includeContent, name),\n ]),\n );\n return value;\n};\n\nexport const summarizeEvidence = (events: StudioDetailEvent[]) => {\n const findings = events.flatMap((event) => {\n const payload = event.payload;\n const failed =\n /(?:failed|error|fault)/i.test(event.type) ||\n payload.outcome === \"fault\" ||\n payload.status === \"failed\";\n const warning =\n /(?:retry|cancel|interrupt|limit_reached|denied|suspended|waiting)/i.test(\n event.type,\n ) || [\"denied\", \"cancelled\"].includes(String(payload.outcome));\n if (!failed && !warning) return [];\n return [\n {\n eventId: event.id,\n runId: event.runId,\n nodeId: event.nodeId,\n type: event.type,\n occurredAt: event.occurredAt,\n severity: failed ? \"error\" : \"context\",\n evidence: payload,\n },\n ];\n });\n return {\n findings,\n note: \"Evidence, not an automated root-cause verdict. Interrupts, cancellations, and retries can be expected; correlate with the final run outcome. Missing telemetry does not prove an action did not occur.\",\n };\n};\n\nexport const formatReadOutput = (value: unknown, json: boolean) => {\n if (json) return JSON.stringify(value);\n // Human mode is deliberately unambiguous and pipeable, without terminal UI/spinners.\n return JSON.stringify(value, null, 2);\n};\n","import { randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:net\";\nimport type { CommandResult, StudioRuntime } from \"./types\";\n\nconst stringOutput = (value: unknown): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst isCommandNotFound = (error: unknown): boolean =>\n error instanceof Error &&\n ((\"code\" in error && error.code === \"ENOENT\") ||\n error.message.includes(\"ENOENT\"));\n\nconst run = async (\n command: string,\n args: string[],\n options: { cwd?: string; inherit?: boolean },\n): Promise<CommandResult> => {\n try {\n const { execa } = await import(\"execa\");\n const result = await execa(command, args, {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n stdin: \"inherit\",\n stdout: options.inherit ? \"inherit\" : \"pipe\",\n stderr: options.inherit ? \"inherit\" : \"pipe\",\n });\n return {\n stdout: stringOutput(result.stdout),\n stderr: stringOutput(result.stderr),\n };\n } catch (error) {\n if (isCommandNotFound(error)) {\n throw new Error(\n `Could not run ${command}. Install and start Docker Desktop, then try again.`,\n { cause: error },\n );\n }\n throw error;\n }\n};\n\nconst portAvailable = async (port: number): Promise<boolean> =>\n await new Promise<boolean>((resolvePromise) => {\n const server = createServer();\n server.unref();\n server.once(\"error\", () => resolvePromise(false));\n server.listen({ host: \"127.0.0.1\", port }, () => {\n server.close(() => resolvePromise(true));\n });\n });\n\nexport const defaultStudioRuntime: StudioRuntime = {\n run,\n portAvailable,\n now: () => new Date().toISOString(),\n random: (bytes) => randomBytes(bytes).toString(\"base64url\"),\n log: (message = \"\") => console.log(message),\n error: (message = \"\") => console.error(message),\n};\n","import { dirname } from \"node:path\";\nimport type {\n EnsureWorkflowTopologyRequest,\n WorkflowTool,\n} from \"@kortyx/telemetry-contracts\";\nimport ts from \"typescript\";\n\ntype Call = { sourceNodeId: string; targetWorkflowId: string };\ntype NodeTools = {\n tools: WorkflowTool[];\n toolDiscovery: { status: \"complete\" | \"unresolved\"; warnings: string[] };\n};\ntype Bindings = Map<ts.Symbol, ts.Expression>;\n\n/** Source-only discovery: never executes a node, hook, or workflow. */\nexport function discoverWorkflowCalls(\n entry: string,\n snapshots: EnsureWorkflowTopologyRequest[],\n): {\n calls: Map<string, Call[]>;\n tools: Map<string, Map<string, NodeTools>>;\n warnings: string[];\n} {\n const configPath = ts.findConfigFile(dirname(entry), ts.sys.fileExists);\n const config = configPath\n ? ts.readConfigFile(configPath, ts.sys.readFile).config\n : {};\n const parsed = ts.parseJsonConfigFileContent(\n config ?? {},\n ts.sys,\n configPath ? dirname(configPath) : dirname(entry),\n );\n const program = ts.createProgram([entry], {\n ...parsed.options,\n allowJs: true,\n noEmit: true,\n });\n const checker = program.getTypeChecker();\n const known = new Map(\n snapshots.map((s) => [\n s.workflow.id,\n new Set(s.workflow.nodes.map((n) => n.id)),\n ]),\n );\n const calls = new Map<string, Call[]>();\n const warnings = new Set<string>();\n const attachedTools = new Map<string, Map<string, NodeTools>>();\n const definitions = new Map<string, ts.ObjectLiteralExpression[]>();\n const local = (n: ts.Node) =>\n !n.getSourceFile().isDeclarationFile &&\n !n.getSourceFile().fileName.includes(\"node_modules\");\n const symbol = (n: ts.Node): ts.Symbol | undefined => {\n let s = checker.getSymbolAtLocation(n);\n if (\n s?.valueDeclaration &&\n ts.isShorthandPropertyAssignment(s.valueDeclaration)\n )\n s = checker.getShorthandAssignmentValueSymbol(s.valueDeclaration);\n return s && s.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(s)\n : s;\n };\n const unwrap = (e: ts.Expression): ts.Expression => {\n while (\n ts.isParenthesizedExpression(e) ||\n ts.isAsExpression(e) ||\n ts.isSatisfiesExpression(e) ||\n ts.isNonNullExpression(e) ||\n ts.isTypeAssertionExpression(e)\n )\n e = e.expression;\n return e;\n };\n const api = (e: ts.Expression, name: string): boolean => {\n e = unwrap(e);\n const s = symbol(ts.isPropertyAccessExpression(e) ? e.name : e);\n if (s?.name !== name) return false;\n return (s.declarations ?? []).some((d) =>\n /(?:node_modules\\/(?:kortyx|@kortyx\\/)|packages\\/(?:core|hooks|sdk)\\/)/.test(\n d.getSourceFile().fileName,\n ),\n );\n };\n const factoryBindings = new WeakMap<ts.Expression, Bindings>();\n function resolve(\n e: ts.Expression | undefined,\n bindings: Bindings,\n seen = new Set<ts.Node>(),\n ): ts.Expression | undefined {\n if (!e) return;\n e = unwrap(e);\n if (seen.has(e)) return;\n seen.add(e);\n if (ts.isIdentifier(e)) {\n const s = symbol(e);\n const bound = s && bindings.get(s);\n if (bound) return resolve(bound, bindings, seen);\n const d = s?.valueDeclaration;\n if (\n d &&\n (ts.isVariableDeclaration(d) || ts.isPropertyAssignment(d)) &&\n d.initializer &&\n (!ts.isVariableDeclaration(d) ||\n (ts.isVariableDeclarationList(d.parent) &&\n (d.parent.flags & ts.NodeFlags.Const) !== 0))\n )\n return resolve(d.initializer, bindings, seen);\n }\n if (ts.isPropertyAccessExpression(e)) {\n const found = property(e.expression, e.name.text, bindings, seen);\n if (found) return resolve(found, bindings, seen);\n const owner = symbol(e.expression);\n const declaration = symbol(e.name)?.valueDeclaration;\n if (\n owner &&\n owner.flags & ts.SymbolFlags.Module &&\n declaration &&\n ts.isVariableDeclaration(declaration)\n )\n return resolve(declaration.initializer, bindings, seen);\n return e;\n }\n if (\n ts.isElementAccessExpression(e) &&\n e.argumentExpression &&\n ts.isStringLiteralLike(e.argumentExpression)\n ) {\n const found = property(\n e.expression,\n e.argumentExpression.text,\n bindings,\n seen,\n );\n return found ? resolve(found, bindings, seen) : e;\n }\n if (ts.isCallExpression(e)) {\n const d = symbol(\n ts.isPropertyAccessExpression(e.expression)\n ? e.expression.name\n : e.expression,\n )?.valueDeclaration;\n const fn =\n d && ts.isFunctionDeclaration(d)\n ? d\n : d &&\n ts.isVariableDeclaration(d) &&\n d.initializer &&\n (ts.isArrowFunction(d.initializer) ||\n ts.isFunctionExpression(d.initializer))\n ? d.initializer\n : undefined;\n if (fn?.body && local(fn)) {\n const bound = new Map(bindings);\n fn.parameters.forEach((p, i) => {\n if (ts.isIdentifier(p.name)) {\n const key = symbol(p.name);\n const arg = e.arguments[i] ?? p.initializer;\n if (key && arg)\n bound.set(key, resolve(arg, bindings, new Set(seen)) ?? arg);\n }\n });\n const returned = ts.isBlock(fn.body)\n ? fn.body.statements\n .filter(ts.isReturnStatement)\n .map((r) => r.expression)\n : [fn.body];\n if (returned.length === 1 && returned[0]) {\n const value = resolve(returned[0], bound, seen);\n if (value) factoryBindings.set(value, bound);\n return value;\n }\n }\n }\n return e;\n }\n function property(\n e: ts.Expression | undefined,\n key: string,\n bindings: Bindings,\n seen = new Set<ts.Node>(),\n ): ts.Expression | undefined {\n const obj = resolve(e, bindings, seen);\n if (!obj || !ts.isObjectLiteralExpression(obj)) return;\n const scoped = factoryBindings.get(obj) ?? bindings;\n // Later properties override earlier spreads/properties.\n for (const p of [...obj.properties].reverse()) {\n if (ts.isSpreadAssignment(p)) {\n const spread = resolve(p.expression, scoped, new Set(seen));\n if (!spread || !ts.isObjectLiteralExpression(spread)) return undefined;\n const found = property(p.expression, key, scoped, new Set(seen));\n if (found) return found;\n } else if (\n p.name &&\n (ts.isIdentifier(p.name) || ts.isStringLiteralLike(p.name)) &&\n p.name.text === key\n ) {\n if (ts.isPropertyAssignment(p))\n return resolve(p.initializer, scoped, new Set(seen));\n if (ts.isShorthandPropertyAssignment(p))\n return resolve(p.name, scoped, new Set(seen));\n }\n }\n return undefined;\n }\n function literal(\n e: ts.Expression | undefined,\n bindings: Bindings,\n ): string | undefined {\n const value = resolve(e, bindings);\n return value && ts.isStringLiteralLike(value) ? value.text : undefined;\n }\n function workflowId(\n e: ts.Expression | undefined,\n bindings: Bindings,\n ): string | undefined {\n const value = resolve(e, bindings);\n if (!value) return;\n if (ts.isStringLiteralLike(value)) return value.text;\n if (ts.isCallExpression(value) && api(value.expression, \"defineWorkflow\"))\n return literal(property(value.arguments[0], \"id\", bindings), bindings);\n return undefined;\n }\n function isHook(e: ts.Expression): boolean {\n if (api(e, \"useWorkflow\")) return true;\n e = unwrap(e);\n const d = symbol(\n ts.isPropertyAccessExpression(e) ? e.name : e,\n )?.valueDeclaration;\n if (\n d &&\n ts.isBindingElement(d) &&\n (d.propertyName?.getText() ?? d.name.getText()) === \"useWorkflow\"\n ) {\n const decl = d.parent.parent;\n if (ts.isVariableDeclaration(decl) && decl.initializer) {\n const value = resolve(decl.initializer, new Map());\n return (\n !!value &&\n ts.isCallExpression(value) &&\n api(value.expression, \"createWorkflowHooks\")\n );\n }\n }\n if (ts.isPropertyAccessExpression(e) && e.name.text === \"useWorkflow\") {\n const value = resolve(e.expression, new Map());\n return (\n !!value &&\n ts.isCallExpression(value) &&\n api(value.expression, \"createWorkflowHooks\")\n );\n }\n const value = resolve(e, new Map());\n return !!value && value !== e && api(value, \"useWorkflow\");\n }\n function functionFor(\n e: ts.Expression,\n ): ts.FunctionLikeDeclaration | undefined {\n const value = resolve(e, new Map());\n if (value && (ts.isArrowFunction(value) || ts.isFunctionExpression(value)))\n return value;\n const d = symbol(\n ts.isPropertyAccessExpression(e) ? e.name : e,\n )?.valueDeclaration;\n return d && (ts.isFunctionDeclaration(d) || ts.isMethodDeclaration(d))\n ? d\n : undefined;\n }\n function recordTools(\n expression: ts.Expression | undefined,\n mode: \"direct\" | \"model\",\n bindings: Bindings,\n workflow: string,\n node: string,\n list = false,\n seen = new Set<ts.Node>(),\n ) {\n const byNode = attachedTools.get(workflow) ?? new Map<string, NodeTools>();\n attachedTools.set(workflow, byNode);\n const target = byNode.get(node) ?? {\n tools: [],\n toolDiscovery: { status: \"complete\" as const, warnings: [] },\n };\n byNode.set(node, target);\n const unresolved = () => {\n target.toolDiscovery.status = \"unresolved\";\n const warning = `${workflow}/${node}: tool attachment is not statically resolved; real execution supplies observed tools.`;\n if (!target.toolDiscovery.warnings.includes(warning))\n target.toolDiscovery.warnings.push(warning);\n warnings.add(warning);\n };\n const value = resolve(expression, bindings);\n if (!value || seen.has(value)) {\n unresolved();\n return;\n }\n seen.add(value);\n if (list && ts.isArrayLiteralExpression(value)) {\n for (const item of value.elements) {\n if (ts.isSpreadElement(item))\n recordTools(\n item.expression,\n mode,\n bindings,\n workflow,\n node,\n true,\n new Set(seen),\n );\n else\n recordTools(\n item,\n mode,\n bindings,\n workflow,\n node,\n false,\n new Set(seen),\n );\n }\n return;\n }\n if (list) {\n unresolved();\n return;\n }\n const name = literal(property(value, \"name\", bindings), bindings);\n if (!name) {\n unresolved();\n return;\n }\n const description = literal(\n property(value, \"description\", bindings),\n bindings,\n );\n const schema = property(value, \"inputSchema\", bindings);\n const fields = resolve(property(schema, \"properties\", bindings), bindings);\n const requiredValue = resolve(\n property(schema, \"required\", bindings),\n bindings,\n );\n const required =\n requiredValue && ts.isArrayLiteralExpression(requiredValue)\n ? requiredValue.elements.map((entry) => literal(entry, bindings))\n : [];\n const inputFields =\n fields && ts.isObjectLiteralExpression(fields)\n ? fields.properties.flatMap((field) => {\n if (\n !ts.isPropertyAssignment(field) ||\n !(\n ts.isIdentifier(field.name) ||\n ts.isStringLiteralLike(field.name)\n )\n )\n return [];\n return [\n {\n name: field.name.text,\n type:\n literal(\n property(field.initializer, \"type\", bindings),\n bindings,\n ) ?? \"unknown\",\n required: required.includes(field.name.text),\n },\n ];\n })\n : [];\n if (\n !target.tools.some(\n (tool) => tool.name === name && tool.callingMode === mode,\n )\n )\n target.tools.push({\n name,\n callingMode: mode,\n provenance: \"source\",\n ...(description ? { description } : {}),\n ...(inputFields.length ? { inputFields } : {}),\n });\n }\n function scanFunction(\n fn: ts.FunctionLikeDeclaration,\n bindings: Bindings,\n workflow: string,\n node: string,\n stack: Set<ts.Node>,\n ) {\n if (!fn.body || !local(fn) || stack.has(fn)) return;\n if (stack.size >= 32) {\n warnings.add(\n `${workflow}/${node}: custom-hook discovery depth exceeded.`,\n );\n const attached = attachedTools.get(workflow)?.get(node);\n if (attached) {\n attached.toolDiscovery.status = \"unresolved\";\n attached.toolDiscovery.warnings.push(\n \"Custom-hook discovery depth exceeded.\",\n );\n }\n return;\n }\n const next = new Set(stack).add(fn);\n const walk = (n: ts.Node) => {\n if (ts.isFunctionDeclaration(n)) return; // Follow helpers at their call sites.\n if (\n ts.isVariableDeclaration(n) &&\n n.initializer &&\n (ts.isArrowFunction(n.initializer) ||\n ts.isFunctionExpression(n.initializer))\n )\n return;\n if (ts.isCallExpression(n)) {\n if (api(n.expression, \"useTool\")) {\n recordTools(\n property(n.arguments[0], \"tool\", bindings),\n \"direct\",\n bindings,\n workflow,\n node,\n );\n } else if (api(n.expression, \"useReason\")) {\n const list = property(n.arguments[0], \"tools\", bindings);\n if (list) recordTools(list, \"model\", bindings, workflow, node, true);\n } else if (isHook(n.expression)) {\n const target = workflowId(\n property(n.arguments[0], \"workflow\", bindings),\n bindings,\n );\n if (target && known.has(target)) {\n const list = calls.get(workflow) ?? [];\n if (\n !list.some(\n (c) => c.sourceNodeId === node && c.targetWorkflowId === target,\n )\n )\n list.push({ sourceNodeId: node, targetWorkflowId: target });\n calls.set(workflow, list);\n } else {\n const pos = n\n .getSourceFile()\n .getLineAndCharacterOfPosition(n.getStart());\n warnings.add(\n `${workflow}/${node}: unresolved or unregistered child target at ${n.getSourceFile().fileName}:${pos.line + 1}; runtime observations will supply dynamic targets.`,\n );\n }\n } else {\n const helper = functionFor(n.expression);\n if (helper && local(helper)) {\n const bound = new Map(bindings);\n helper.parameters.forEach((p, i) => {\n const arg = n.arguments[i];\n if (!arg) return;\n if (ts.isIdentifier(p.name)) {\n const s = symbol(p.name);\n if (s) bound.set(s, resolve(arg, bindings) ?? arg);\n } else if (ts.isObjectBindingPattern(p.name)) {\n for (const b of p.name.elements) {\n const value = property(\n arg,\n b.propertyName?.getText() ?? b.name.getText(),\n bindings,\n );\n const s = symbol(b.name);\n if (s && value)\n bound.set(s, resolve(value, bindings) ?? value);\n }\n }\n });\n scanFunction(helper, bound, workflow, node, next);\n }\n }\n }\n ts.forEachChild(n, walk);\n };\n walk(fn.body);\n }\n for (const source of program.getSourceFiles().filter(local)) {\n const walk = (n: ts.Node) => {\n if (ts.isCallExpression(n) && api(n.expression, \"defineWorkflow\")) {\n const obj = resolve(n.arguments[0], new Map());\n const id = obj && literal(property(obj, \"id\", new Map()), new Map());\n if (id && known.has(id) && obj && ts.isObjectLiteralExpression(obj))\n definitions.set(id, [...(definitions.get(id) ?? []), obj]);\n }\n ts.forEachChild(n, walk);\n };\n walk(source);\n }\n for (const [id, nodes] of known) {\n attachedTools.set(\n id,\n new Map(\n [...nodes].map((node) => [\n node,\n { tools: [], toolDiscovery: { status: \"complete\", warnings: [] } },\n ]),\n ),\n );\n const defs = definitions.get(id) ?? [];\n if (defs.length !== 1) {\n warnings.add(\n `${id}: ${defs.length ? \"ambiguous\" : \"unavailable\"} workflow source; child-call discovery skipped.`,\n );\n for (const node of attachedTools.get(id)?.values() ?? []) {\n node.toolDiscovery.status = \"unresolved\";\n node.toolDiscovery.warnings.push(\n \"Workflow source unavailable or ambiguous.\",\n );\n }\n continue;\n }\n calls.set(id, []);\n const bindings = new Map<ts.Symbol, ts.Expression>();\n const obj = property(defs[0], \"nodes\", bindings);\n for (const node of nodes) {\n const run = property(property(obj, node, bindings), \"run\", bindings);\n const fn = run && functionFor(run);\n if (fn) scanFunction(fn, bindings, id, node, new Set());\n else {\n const tools = attachedTools.get(id)?.get(node);\n if (tools) {\n tools.toolDiscovery.status = \"unresolved\";\n tools.toolDiscovery.warnings.push(\"Node source unavailable.\");\n }\n warnings.add(\n `${id}/${node}: node source unavailable; child-call discovery skipped.`,\n );\n }\n }\n calls\n .get(id)\n ?.sort(\n (a, b) =>\n a.sourceNodeId.localeCompare(b.sourceNodeId) ||\n a.targetWorkflowId.localeCompare(b.targetWorkflowId),\n );\n }\n for (const nodes of attachedTools.values())\n for (const node of nodes.values())\n node.tools.sort(\n (a, b) =>\n a.name.localeCompare(b.name) ||\n a.callingMode.localeCompare(b.callingMode),\n );\n return { calls, tools: attachedTools, warnings: [...warnings].sort() };\n}\n"],"mappings":"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","names":["import_promises","import_node_os","import_node_path","import_telemetry_contracts","import_commander","import_promises","import_node_os","import_node_path","import_zod","value","profile","profile","import_commander","import_promises","import_telemetry_contracts","import_commander","import_telemetry_contracts","run","run","workflows","import_node_crypto","import_node_path","ts","resolve","value","entry","run","Module","module","tsxRequire"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/connections-command.ts","../src/connections.ts","../src/studio/read-client.ts","../src/studio/state.ts","../src/studio/compose.ts","../src/studio/command.ts","../src/studio/local-stack.ts","../src/studio/read-command.ts","../src/studio/read-analysis.ts","../src/studio/read-output.ts","../src/studio/runtime.ts","../src/workflow-calls.ts"],"sourcesContent":["import {\n access,\n mkdir,\n mkdtemp,\n readFile,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport Module from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { delimiter, dirname, isAbsolute, join, resolve } from \"node:path\";\nimport {\n type Agent,\n type AgentProjectTopologyOptions,\n projectWorkflowTopology,\n} from \"@kortyx/agent\";\nimport type { WorkflowDefinition } from \"@kortyx/core\";\nimport { KortyxError, serializeFailure } from \"@kortyx/core/errors\";\nimport {\n type EnsureWorkflowTopologyRequest,\n EnsureWorkflowTopologyRequestSchema,\n type EnsureWorkflowTopologyResponse,\n EnsureWorkflowTopologyResponseSchema,\n} from \"@kortyx/telemetry-contracts\";\nimport { Command, CommanderError } from \"commander\";\nimport { require as tsxRequire } from \"tsx/cjs/api\";\nimport { createConnectionsCommand } from \"./connections-command\";\nimport { createStudioCommand } from \"./studio/command\";\nimport { StudioReadError } from \"./studio/read-client\";\nimport { discoverWorkflowCalls } from \"./workflow-calls\";\n\ntype CliOptions = {\n entry?: string | undefined;\n exportName?: string | undefined;\n apiUrl?: string | undefined;\n apiKey?: string | undefined;\n environment?: string | undefined;\n serviceName?: string | undefined;\n deploymentRef?: string | undefined;\n dryRun: boolean;\n json: boolean;\n cwd: string;\n};\n\ntype PushResult = {\n snapshot: EnsureWorkflowTopologyRequest;\n response?: EnsureWorkflowTopologyResponse;\n};\n\ntype TopologyPushCommandOptions = {\n entry: string;\n export?: string;\n apiUrl?: string;\n apiKey?: string;\n environment?: string;\n serviceName?: string;\n deploymentRef?: string;\n dryRun?: boolean;\n json?: boolean;\n};\n\ntype ModuleResolveFilename = (\n request: string,\n parent: NodeJS.Module | undefined,\n isMain: boolean,\n options?: unknown,\n) => string;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isWorkflowDefinition = (value: unknown): value is WorkflowDefinition =>\n isRecord(value) &&\n typeof value.id === \"string\" &&\n isRecord(value.nodes) &&\n Array.isArray(value.edges);\n\nconst isAgent = (value: unknown): value is Agent =>\n isRecord(value) && typeof value.projectTopology === \"function\";\n\nconst readPackageName = async (cwd: string): Promise<string | undefined> => {\n let current = cwd;\n for (;;) {\n try {\n const raw = await readFile(join(current, \"package.json\"), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (isRecord(parsed) && typeof parsed.name === \"string\") {\n return parsed.name;\n }\n } catch {\n // Keep walking up until filesystem root.\n }\n\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n};\n\nconst loadEnvFiles = async (cwd: string): Promise<void> => {\n for (const filename of [\".env\", \".env.local\"]) {\n const path = join(cwd, filename);\n let raw: string;\n try {\n raw = await readFile(path, \"utf8\");\n } catch {\n continue;\n }\n\n for (const line of raw.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const separator = trimmed.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = trimmed.slice(0, separator).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) continue;\n if (process.env[key] !== undefined) continue;\n process.env[key] = unquoteEnvValue(trimmed.slice(separator + 1).trim());\n }\n }\n};\n\nconst unquoteEnvValue = (value: string): string => {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n};\n\nconst resolveOptions = async (\n options: CliOptions,\n): Promise<\n CliOptions & {\n entry: string;\n environment: string;\n serviceName: string;\n apiUrl?: string | undefined;\n apiKey?: string | undefined;\n }\n> => {\n if (!options.entry) {\n throw new Error(\"Missing required option: --entry <path>.\");\n }\n\n const entry = isAbsolute(options.entry)\n ? options.entry\n : resolve(options.cwd, options.entry);\n const environment =\n options.environment ??\n process.env.KORTYX_TELEMETRY_ENVIRONMENT ??\n process.env.NODE_ENV ??\n \"development\";\n const serviceName =\n options.serviceName ??\n process.env.KORTYX_TELEMETRY_SERVICE_NAME ??\n (await readPackageName(options.cwd)) ??\n \"kortyx-app\";\n\n return {\n ...options,\n entry,\n environment,\n serviceName,\n apiUrl:\n options.apiUrl ??\n process.env.KORTYX_TELEMETRY_API_URL ??\n process.env.KORTYX_API_URL,\n apiKey: options.apiKey ?? process.env.KORTYX_TELEMETRY_API_KEY,\n deploymentRef:\n options.deploymentRef ??\n process.env.KORTYX_TELEMETRY_DEPLOYMENT_REF ??\n process.env.GITHUB_SHA ??\n process.env.VERCEL_GIT_COMMIT_SHA,\n };\n};\n\nconst createFrameworkMarkerStubs = async (): Promise<{\n cleanup: () => Promise<void>;\n}> => {\n const root = await mkdtemp(join(tmpdir(), \"kortyx-cli-stubs-\"));\n for (const moduleName of [\"server-only\", \"client-only\"]) {\n const directory = join(root, moduleName);\n await mkdir(directory, { recursive: true });\n await writeFile(join(directory, \"index.js\"), \"\", \"utf8\");\n await writeFile(\n join(directory, \"package.json\"),\n JSON.stringify({ name: moduleName, version: \"0.0.0\", main: \"index.js\" }),\n \"utf8\",\n );\n }\n\n const previousNodePath = process.env.NODE_PATH;\n process.env.NODE_PATH = previousNodePath\n ? `${root}${delimiter}${previousNodePath}`\n : root;\n const moduleWithPrivateInit = Module as typeof Module & {\n _initPaths?: () => void;\n };\n moduleWithPrivateInit._initPaths?.();\n\n return {\n cleanup: async () => {\n if (previousNodePath === undefined) delete process.env.NODE_PATH;\n else process.env.NODE_PATH = previousNodePath;\n moduleWithPrivateInit._initPaths?.();\n await rm(root, { recursive: true, force: true });\n },\n };\n};\n\nconst importEntry = async (entry: string): Promise<Record<string, unknown>> => {\n const stubs = await createFrameworkMarkerStubs();\n let unregisterPaths: (() => void) | undefined;\n try {\n const tsconfig = await findNearestFile(dirname(entry), \"tsconfig.json\");\n unregisterPaths = tsconfig\n ? await registerTsconfigPaths(tsconfig)\n : undefined;\n const module = tsxRequire(entry, join(dirname(entry), \"kortyx-cli.cjs\"));\n if (!isRecord(module)) {\n throw new Error(`Entry module did not export an object: ${entry}`);\n }\n return module;\n } finally {\n unregisterPaths?.();\n await stubs.cleanup();\n }\n};\n\nconst findNearestFile = async (\n startDirectory: string,\n filename: string,\n): Promise<string | undefined> => {\n let current = startDirectory;\n for (;;) {\n const candidate = join(current, filename);\n try {\n await access(candidate);\n return candidate;\n } catch {\n const parent = dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n }\n};\n\nconst registerTsconfigPaths = async (\n tsconfigPath: string,\n): Promise<() => void> => {\n const raw = JSON.parse(await readFile(tsconfigPath, \"utf8\")) as unknown;\n if (!isRecord(raw)) return () => undefined;\n const compilerOptions = isRecord(raw.compilerOptions)\n ? raw.compilerOptions\n : undefined;\n const paths = isRecord(compilerOptions?.paths)\n ? compilerOptions.paths\n : undefined;\n if (!paths) return () => undefined;\n\n const tsconfigDirectory = dirname(tsconfigPath);\n const baseUrl =\n typeof compilerOptions?.baseUrl === \"string\"\n ? resolve(tsconfigDirectory, compilerOptions.baseUrl)\n : tsconfigDirectory;\n const mappings = Object.entries(paths)\n .flatMap(([pattern, rawTargets]) => {\n if (!Array.isArray(rawTargets)) return [];\n return rawTargets\n .filter((target): target is string => typeof target === \"string\")\n .map((target) => ({ pattern, target }));\n })\n .map(({ pattern, target }) => {\n const [patternPrefix, patternSuffix = \"\"] = pattern.split(\"*\");\n const [targetPrefix, targetSuffix = \"\"] = target.split(\"*\");\n return {\n pattern,\n target,\n patternPrefix,\n patternSuffix,\n targetPrefix,\n targetSuffix,\n wildcard: pattern.includes(\"*\"),\n };\n });\n\n if (mappings.length === 0) return () => undefined;\n\n const moduleWithResolver = Module as typeof Module & {\n _resolveFilename: ModuleResolveFilename;\n };\n const originalResolve = moduleWithResolver._resolveFilename;\n moduleWithResolver._resolveFilename = function resolveWithTsconfigPaths(\n request,\n parent,\n isMain,\n options,\n ) {\n for (const mapping of mappings) {\n const matched = mapping.wildcard\n ? request.startsWith(mapping.patternPrefix ?? \"\") &&\n request.endsWith(mapping.patternSuffix)\n : request === mapping.pattern;\n if (!matched) continue;\n\n const wildcardValue = mapping.wildcard\n ? request.slice(\n mapping.patternPrefix?.length ?? 0,\n request.length - mapping.patternSuffix.length,\n )\n : \"\";\n const mapped = mapping.wildcard\n ? `${mapping.targetPrefix}${wildcardValue}${mapping.targetSuffix}`\n : mapping.target;\n for (const candidate of candidateModulePaths(resolve(baseUrl, mapped))) {\n try {\n return originalResolve.call(this, candidate, parent, isMain, options);\n } catch {\n // Try the next extension/index candidate.\n }\n }\n }\n\n return originalResolve.call(this, request, parent, isMain, options);\n };\n\n return () => {\n moduleWithResolver._resolveFilename = originalResolve;\n };\n};\n\nconst candidateModulePaths = (basePath: string): string[] => [\n basePath,\n `${basePath}.ts`,\n `${basePath}.tsx`,\n `${basePath}.mts`,\n `${basePath}.cts`,\n `${basePath}.js`,\n `${basePath}.jsx`,\n join(basePath, \"index.ts\"),\n join(basePath, \"index.tsx\"),\n join(basePath, \"index.js\"),\n join(basePath, \"index.jsx\"),\n];\n\nconst valueFromModule = (\n module: Record<string, unknown>,\n exportName: string | undefined,\n): unknown => {\n if (exportName) {\n if (!(exportName in module)) {\n throw new Error(`Entry module does not export \"${exportName}\".`);\n }\n return module[exportName];\n }\n\n if (isAgent(module.agent)) return module.agent;\n if (Array.isArray(module.workflows)) return module.workflows;\n if (isAgent(module.default)) return module.default;\n if (Array.isArray(module.default)) return module.default;\n\n const workflowExports = Object.values(module).filter(isWorkflowDefinition);\n if (workflowExports.length > 0) return workflowExports;\n\n throw new Error(\n \"Entry must export an agent with projectTopology(), a workflows array, or named workflow definitions. Use --export when needed.\",\n );\n};\n\nconst projectSnapshots = async (\n value: unknown,\n options: AgentProjectTopologyOptions,\n): Promise<EnsureWorkflowTopologyRequest[]> => {\n if (isAgent(value)) {\n const snapshots = await value.projectTopology?.(options);\n return snapshots ?? [];\n }\n\n const workflows = Array.isArray(value)\n ? value.filter(isWorkflowDefinition)\n : isWorkflowDefinition(value)\n ? [value]\n : [];\n\n if (workflows.length === 0) {\n throw new Error(\"No workflow definitions found in the selected export.\");\n }\n\n const knownWorkflowIds = workflows.map((workflow) => workflow.id);\n return workflows.map((workflow) =>\n projectWorkflowTopology({\n workflow,\n environment: options.environment,\n service: options.service,\n knownWorkflowIds,\n }),\n );\n};\n\nconst endpointFor = (apiUrl: string, path: string): string =>\n `${apiUrl.replace(/\\/$/, \"\")}${path}`;\n\nconst pushSnapshot = async (\n apiUrl: string,\n apiKey: string,\n snapshot: EnsureWorkflowTopologyRequest,\n): Promise<EnsureWorkflowTopologyResponse> => {\n const response = await fetch(\n endpointFor(apiUrl, \"/v1/telemetry/workflow-revisions:ensure\"),\n {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${apiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify(snapshot),\n },\n );\n\n if (!response.ok) {\n throw new KortyxError(\n \"TOPOLOGY_HTTP_ERROR\",\n `Kortyx API rejected topology ${snapshot.workflow.id} (${response.status}).`,\n {\n category: \"transport\",\n status: response.status,\n safeMessage: `Topology request failed (HTTP ${response.status}). Check the API URL, credentials and server logs.`,\n },\n );\n }\n\n return EnsureWorkflowTopologyResponseSchema.parse(await response.json());\n};\n\nconst printResults = (results: PushResult[], options: CliOptions): void => {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n workflows: results.map(({ snapshot, response }) => ({\n workflowId: snapshot.workflow.id,\n declaredVersion: snapshot.workflow.declaredVersion,\n topologyHash: snapshot.workflow.topologyHash,\n transitionCount: snapshot.workflow.transitions?.length ?? 0,\n calls: snapshot.workflow.calls ?? [],\n tools: snapshot.workflow.nodes.map((node) => ({\n nodeId: node.id,\n tools: node.tools ?? [],\n discovery: node.toolDiscovery,\n })),\n workflowRevisionId: response?.workflowRevisionId,\n created: response?.created,\n })),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const verb = options.dryRun ? \"Projected\" : \"Pushed\";\n console.log(`${verb} ${results.length} workflow topology snapshot(s).`);\n for (const { snapshot, response } of results) {\n const revision = response\n ? ` revision=${response.workflowRevisionId} created=${response.created}`\n : \"\";\n console.log(\n `- ${snapshot.workflow.id}@${snapshot.workflow.declaredVersion} hash=${snapshot.workflow.topologyHash.slice(\n 0,\n 12,\n )} transitions=${snapshot.workflow.transitions?.length ?? 0} calls=${snapshot.workflow.calls?.length ?? 0} tools=${snapshot.workflow.nodes.reduce((sum, node) => sum + (node.tools?.length ?? 0), 0)}${revision}`,\n );\n }\n};\n\nconst runTopologyPush = async (rawOptions: CliOptions): Promise<void> => {\n const options = await resolveOptions(rawOptions);\n if (!options.dryRun && !options.apiUrl) {\n throw new Error(\n \"Missing Kortyx API URL. Pass --api-url or set KORTYX_TELEMETRY_API_URL.\",\n );\n }\n if (!options.dryRun && !options.apiKey) {\n throw new Error(\n \"Missing telemetry API key. Pass --api-key or set KORTYX_TELEMETRY_API_KEY.\",\n );\n }\n\n const module = await importEntry(options.entry);\n const selected = valueFromModule(module, options.exportName);\n const service = {\n name: options.serviceName,\n ...(options.deploymentRef ? { deploymentRef: options.deploymentRef } : {}),\n };\n const snapshots = await projectSnapshots(selected, {\n environment: options.environment,\n service,\n });\n const discovered = discoverWorkflowCalls(options.entry, snapshots);\n for (const warning of discovered.warnings)\n console.error(`Topology: ${warning}`);\n for (const snapshot of snapshots) {\n const calls = discovered.calls.get(snapshot.workflow.id);\n if (calls) snapshot.workflow.calls = calls;\n for (const node of snapshot.workflow.nodes) {\n const discoveredTools = discovered.tools\n .get(snapshot.workflow.id)\n ?.get(node.id);\n if (discoveredTools)\n Object.assign(node, discoveredTools, {\n toolDiscovery: {\n ...discoveredTools.toolDiscovery,\n publishedAt: new Date().toISOString(),\n },\n });\n }\n }\n const parsedSnapshots = snapshots.map((snapshot) =>\n EnsureWorkflowTopologyRequestSchema.parse(snapshot),\n );\n\n const results: PushResult[] = [];\n for (const snapshot of parsedSnapshots) {\n let response: EnsureWorkflowTopologyResponse | undefined;\n if (!options.dryRun) {\n if (!options.apiUrl || !options.apiKey) {\n throw new Error(\"Missing Kortyx API URL or telemetry API key.\");\n }\n response = await pushSnapshot(options.apiUrl, options.apiKey, snapshot);\n }\n results.push({ snapshot, ...(response ? { response } : {}) });\n }\n\n printResults(results, options);\n};\n\nconst createCliProgram = (): Command => {\n const program = new Command()\n .name(\"kortyx\")\n .description(\"Build, observe, and operate Kortyx projects.\")\n .showHelpAfterError()\n .addHelpText(\n \"after\",\n '\\nRun \"kortyx <command> --help\" for detailed command options.',\n );\n\n program.addCommand(createStudioCommand());\n program.addCommand(createConnectionsCommand());\n\n const topology = program\n .command(\"topology\")\n .description(\"Publish deterministic workflow topology to Studio.\");\n topology\n .command(\"push\")\n .description(\"Project and publish workflow topology.\")\n .requiredOption(\n \"--entry <path>\",\n \"Module exporting an agent or workflows array.\",\n )\n .option(\"--export <name>\", \"Named export to load from the entry module.\")\n .option(\n \"--api-url <url>\",\n \"Kortyx API URL. Defaults to KORTYX_TELEMETRY_API_URL.\",\n )\n .option(\n \"--api-key <key>\",\n \"Telemetry API key. Defaults to KORTYX_TELEMETRY_API_KEY.\",\n )\n .option(\"--environment <name>\", \"Telemetry environment.\")\n .option(\"--service-name <name>\", \"Telemetry service name.\")\n .option(\"--deployment-ref <ref>\", \"Deployment reference.\")\n .option(\"--dry-run\", \"Print topology without publishing.\", false)\n .option(\"--json\", \"Print machine-readable JSON.\", false)\n .action(async (options: TopologyPushCommandOptions) => {\n const cliOptions: CliOptions = {\n entry: options.entry,\n exportName: options.export,\n apiUrl: options.apiUrl,\n apiKey: options.apiKey,\n environment: options.environment,\n serviceName: options.serviceName,\n deploymentRef: options.deploymentRef,\n dryRun: options.dryRun ?? false,\n json: options.json ?? false,\n cwd: process.cwd(),\n };\n await loadEnvFiles(cliOptions.cwd);\n await runTopologyPush(cliOptions);\n });\n\n return program;\n};\n\nconst main = async (): Promise<void> => {\n const program = createCliProgram().exitOverride();\n if (process.argv.length === 2) {\n program.outputHelp();\n return;\n }\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n if (error instanceof StudioReadError) {\n console.error(\n process.argv.includes(\"--json\")\n ? JSON.stringify(error.toJSON())\n : `[${error.code}] ${error.message}`,\n );\n process.exitCode = 1;\n return;\n }\n const failure = serializeFailure(error);\n console.error(\n error instanceof KortyxError\n ? `[${failure.code}] ${failure.message}`\n : error instanceof Error\n ? error.message.slice(0, 1024)\n : failure.message,\n );\n process.exitCode = 1;\n }\n};\n\nvoid main();\n","import { StudioContextResponseSchema } from \"@kortyx/telemetry-contracts\";\nimport { Command } from \"commander\";\nimport {\n type ConnectionProfile,\n defaultConnectionsHome,\n readConnections,\n readKeyEnv,\n saveConnections,\n} from \"./connections\";\nimport {\n normalizeConnectionUrl,\n StudioReadClient,\n StudioReadError,\n} from \"./studio/read-client\";\nimport { defaultStudioHome, readStudioConfig } from \"./studio/state\";\n\ntype Options = {\n configHome: string;\n home: string;\n json?: boolean;\n apiUrl?: string;\n studioUrl?: string;\n apiKeyEnv?: string;\n environment?: string;\n replace?: boolean;\n};\nexport const createConnectionsCommand = (\n log: (message: string) => void = console.log,\n request: typeof fetch = fetch,\n) => {\n const command = new Command(\"connections\").description(\n \"Manage Studio connection profiles (no remote mutations or stored secrets).\",\n );\n const common = (child: Command) =>\n child\n .option(\n \"--config-home <path>\",\n \"Connection configuration directory.\",\n defaultConnectionsHome(),\n )\n .option(\n \"--home <path>\",\n \"Managed local Studio directory.\",\n defaultStudioHome(),\n )\n .option(\"--json\", \"Print machine-readable JSON.\");\n const print = (value: unknown, options: Options) =>\n log(JSON.stringify(value, null, options.json ? 0 : 2));\n common(\n command\n .command(\"list\")\n .description(\"List profiles without reading or displaying their keys.\"),\n ).action(async (options: Options) => {\n const config = await readConnections(options.configHome);\n const local = await readStudioConfig(options.home);\n print(\n {\n current: config.current ?? \"local\",\n connections: [\n ...(local\n ? [\n {\n name: \"local\",\n apiUrl: `http://localhost:${local.apiPort}`,\n studioUrl: `http://localhost:${local.studioPort}`,\n credential: \"managed-local\",\n },\n ]\n : []),\n ...config.profiles,\n ],\n },\n options,\n );\n });\n common(\n command\n .command(\"add <name>\")\n .description(\n \"Validate a read key and save URL locators plus an environment-variable reference.\",\n )\n .requiredOption(\n \"--api-url <url>\",\n \"Studio API base URL (not the browser URL).\",\n )\n .requiredOption(\n \"--api-key-env <name>\",\n \"Environment variable containing the project-scoped read key.\",\n )\n .option(\n \"--studio-url <url>\",\n \"Studio browser base URL, used to resolve pasted links.\",\n )\n .option(\"--environment <name>\", \"Default environment filter for lists.\")\n .option(\"--replace\", \"Explicitly replace an existing named connection.\"),\n ).action(\n async (\n name: string,\n options: Options & { apiUrl: string; apiKeyEnv: string },\n ) => {\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/.test(name) || name === \"local\") {\n throw new StudioReadError(\n \"invalid_name\",\n \"Use a connection name of 1–64 letters, digits, hyphens or underscores; local is reserved.\",\n );\n }\n const config = await readConnections(options.configHome);\n if (\n config.profiles.some((profile) => profile.name === name) &&\n !options.replace\n ) {\n throw new StudioReadError(\n \"connection_exists\",\n \"Connection already exists. Use --replace to update it.\",\n );\n }\n const apiUrl = normalizeConnectionUrl(options.apiUrl);\n const studioUrl = options.studioUrl\n ? normalizeConnectionUrl(options.studioUrl)\n : undefined;\n const client = new StudioReadClient(\n apiUrl,\n readKeyEnv(options.apiKeyEnv),\n request,\n );\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n if (!context.apiKey.scopes.includes(\"studio:read\"))\n throw new StudioReadError(\n \"missing_scope\",\n \"The API key lacks studio:read permission.\",\n );\n const profile: ConnectionProfile = {\n name,\n apiUrl,\n apiKeyEnv: options.apiKeyEnv,\n project: context.project.name,\n organization: context.organization.name,\n ...(studioUrl ? { studioUrl } : {}),\n ...(options.environment ? { environment: options.environment } : {}),\n };\n config.profiles = [\n ...config.profiles.filter((item) => item.name !== name),\n profile,\n ];\n await saveConnections(config, options.configHome);\n print({ connection: profile, verified: true }, options);\n },\n );\n common(\n command\n .command(\"use <name>\")\n .description(\n \"Select the default connection; agents should prefer per-command --connection.\",\n ),\n ).action(async (name: string, options: Options) => {\n const config = await readConnections(options.configHome);\n if (\n name === \"local\"\n ? !(await readStudioConfig(options.home))\n : !config.profiles.some((profile) => profile.name === name)\n ) {\n throw new StudioReadError(\n \"unknown_connection\",\n \"Connection not found. Run kortyx connections list.\",\n );\n }\n config.current = name;\n await saveConnections(config, options.configHome);\n print({ current: name }, options);\n });\n common(\n command\n .command(\"remove <name>\")\n .description(\n \"Remove a saved locator, not its credential or remote project.\",\n ),\n ).action(async (name: string, options: Options) => {\n const config = await readConnections(options.configHome);\n if (!config.profiles.some((profile) => profile.name === name))\n throw new StudioReadError(\n \"unknown_connection\",\n \"Saved connection not found; managed local cannot be removed.\",\n );\n config.profiles = config.profiles.filter(\n (profile) => profile.name !== name,\n );\n if (config.current === name) delete config.current;\n await saveConnections(config, options.configHome);\n print({ removed: name }, options);\n });\n return command;\n};\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { normalizeConnectionUrl, StudioReadError } from \"./studio/read-client\";\nimport {\n defaultStudioHome,\n readStudioConfig,\n readStudioEnvironment,\n} from \"./studio/state\";\n\nconst ProfileSchema = z\n .object({\n name: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/),\n apiUrl: z.string(),\n studioUrl: z.string().optional(),\n apiKeyEnv: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/),\n environment: z.string().min(1).optional(),\n project: z.string(),\n organization: z.string(),\n })\n .strict();\nconst ConfigSchema = z\n .object({\n version: z.literal(1),\n current: z.string().optional(),\n profiles: z.array(ProfileSchema),\n })\n .strict()\n .superRefine((config, ctx) => {\n const names = config.profiles.map((profile) => profile.name);\n if (\n names.includes(\"local\") ||\n new Set(names).size !== names.length ||\n (config.current &&\n config.current !== \"local\" &&\n !names.includes(config.current))\n ) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Invalid connection names or selection.\",\n });\n }\n });\nexport type ConnectionProfile = z.infer<typeof ProfileSchema>;\nexport type ConnectionConfig = z.infer<typeof ConfigSchema>;\nexport type ConnectionOptions = {\n connection?: string | undefined;\n apiUrl?: string | undefined;\n apiKeyEnv?: string | undefined;\n configHome?: string | undefined;\n home?: string | undefined;\n};\nexport type ResolvedConnection = {\n name: string;\n apiUrl: string;\n studioUrl?: string | undefined;\n environment?: string | undefined;\n apiKey: string;\n};\n\nexport const defaultConnectionsHome = () =>\n resolve(process.env.KORTYX_CONFIG_HOME ?? join(homedir(), \".kortyx\"));\nexport const readConnections = async (\n home = defaultConnectionsHome(),\n): Promise<ConnectionConfig> => {\n try {\n const result = ConfigSchema.safeParse(\n JSON.parse(await readFile(join(home, \"connections.json\"), \"utf8\")),\n );\n if (!result.success) throw new Error(\"invalid\");\n for (const profile of result.data.profiles) {\n normalizeConnectionUrl(profile.apiUrl);\n if (profile.studioUrl) normalizeConnectionUrl(profile.studioUrl);\n }\n return result.data;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\")\n return { version: 1, profiles: [] };\n throw new StudioReadError(\n \"invalid_config\",\n \"Invalid or unreadable connections.json. Fix the configuration; it will not be overwritten.\",\n );\n }\n};\n\nexport const saveConnections = async (\n config: ConnectionConfig,\n home = defaultConnectionsHome(),\n) => {\n const result = ConfigSchema.safeParse(config);\n if (!result.success)\n throw new StudioReadError(\n \"invalid_config\",\n \"Invalid connection name or configuration.\",\n );\n await mkdir(home, { recursive: true, mode: 0o700 });\n const temporary = join(home, `.connections-${randomUUID()}.tmp`);\n try {\n await writeFile(temporary, `${JSON.stringify(result.data, null, 2)}\\n`, {\n mode: 0o600,\n flag: \"wx\",\n });\n await rename(temporary, join(home, \"connections.json\"));\n } finally {\n await unlink(temporary).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== \"ENOENT\") throw error;\n });\n }\n};\n\nconst urlMatches = (target: URL, base: string) => {\n const url = new URL(base);\n const prefix = url.pathname.replace(/\\/+$/, \"\");\n return (\n target.origin === url.origin &&\n (target.pathname === prefix || target.pathname.startsWith(`${prefix}/`))\n );\n};\n\nexport const resolveConnection = async (\n options: ConnectionOptions,\n targetUrl?: string,\n): Promise<ResolvedConnection> => {\n const config = await readConnections(options.configHome);\n const local = await readStudioConfig(options.home ?? defaultStudioHome());\n const localLocator = local\n ? {\n name: \"local\",\n apiUrl: `http://localhost:${local.apiPort}`,\n studioUrl: `http://localhost:${local.studioPort}`,\n }\n : undefined;\n let selected =\n options.connection ?? (process.env.KORTYX_CONNECTION || undefined);\n if (options.apiUrl || options.apiKeyEnv) {\n if (selected || !options.apiUrl || !options.apiKeyEnv) {\n throw new StudioReadError(\n \"invalid_connection\",\n \"Direct connections require both --api-url and --api-key-env, without --connection/KORTYX_CONNECTION. Keys are never reused for URL overrides.\",\n );\n }\n if (targetUrl)\n throw new StudioReadError(\n \"unmapped_url\",\n \"Register a connection with --studio-url before inspecting a URL. Direct connections accept entity IDs only.\",\n );\n return {\n name: \"direct\",\n apiUrl: normalizeConnectionUrl(options.apiUrl),\n apiKey: readKeyEnv(options.apiKeyEnv),\n };\n }\n const locators = [\n ...config.profiles,\n ...(localLocator ? [localLocator] : []),\n ];\n if (targetUrl) {\n const target = new URL(targetUrl);\n const matches = locators.filter(\n (profile) =>\n urlMatches(target, profile.apiUrl) ||\n (profile.studioUrl && urlMatches(target, profile.studioUrl)),\n );\n if (selected) {\n if (!matches.some((profile) => profile.name === selected)) {\n throw new StudioReadError(\n \"connection_mismatch\",\n \"The supplied URL does not match the selected connection's API or Studio URL.\",\n );\n }\n } else if (matches.length === 1) selected = matches[0]?.name;\n else\n throw new StudioReadError(\n \"unmapped_url\",\n matches.length\n ? \"URL matches multiple projects. Specify --connection explicitly.\"\n : \"URL does not match a configured connection. Add one with the correct --studio-url.\",\n );\n }\n selected ??= config.current ?? \"local\";\n if (selected === \"local\") {\n if (!localLocator)\n throw new StudioReadError(\n \"not_configured\",\n \"Local Studio is not configured. Run kortyx studio start or select a remote connection.\",\n );\n const environment = await readStudioEnvironment(\n options.home ?? defaultStudioHome(),\n );\n return { ...localLocator, apiKey: environment.KORTYX_STUDIO_API_KEY };\n }\n const profile = config.profiles.find((item) => item.name === selected);\n if (!profile)\n throw new StudioReadError(\n \"unknown_connection\",\n \"Connection not found. Run kortyx connections list.\",\n );\n return {\n name: profile.name,\n apiUrl: profile.apiUrl,\n studioUrl: profile.studioUrl,\n environment: profile.environment,\n apiKey: readKeyEnv(profile.apiKeyEnv),\n };\n};\n\nexport const readKeyEnv = (name: string): string => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n throw new StudioReadError(\n \"invalid_key_env\",\n \"Provide a valid environment variable name.\",\n );\n const value = process.env[name];\n if (!value)\n throw new StudioReadError(\n \"missing_key\",\n `Set ${name} to a project-scoped Studio read key. Do not use the telemetry write key.`,\n );\n return value;\n};\n","import { STUDIO_API_PROTOCOL_VERSION } from \"@kortyx/telemetry-contracts\";\nimport type { z } from \"zod\";\n\nexport type StudioCompatibility = {\n protocolVersion: string | null;\n release: string | null;\n};\n\nexport class StudioReadError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly status?: number,\n public readonly requestId?: string,\n ) {\n super(message);\n this.name = \"StudioReadError\";\n }\n\n toJSON() {\n return {\n error: {\n code: this.code,\n message: this.message,\n status: this.status,\n requestId: this.requestId,\n },\n };\n }\n}\n\nexport const normalizeConnectionUrl = (input: string): string => {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new StudioReadError(\n \"invalid_url\",\n \"Provide an absolute HTTP(S) connection URL.\",\n );\n }\n const loopback = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname);\n if (\n url.username ||\n url.password ||\n url.search ||\n url.hash ||\n !(url.protocol === \"https:\" || (url.protocol === \"http:\" && loopback))\n ) {\n throw new StudioReadError(\n \"invalid_url\",\n \"Connection URLs require HTTPS (HTTP is allowed on loopback), without credentials, query, or fragment.\",\n );\n }\n return url.toString().replace(/\\/+$/, \"\");\n};\n\n/** Intentionally restricted to the Studio read API: no arbitrary requests or writes. */\nexport class StudioReadClient {\n readonly apiUrl: string;\n compatibility: StudioCompatibility = {\n protocolVersion: null,\n release: null,\n };\n constructor(\n apiUrl: string,\n private readonly apiKey: string,\n private readonly request: typeof fetch = fetch,\n ) {\n this.apiUrl = normalizeConnectionUrl(apiUrl);\n if (!/^ktyx_(?:test|live)_[^_]+_\\S+$/.test(apiKey)) {\n throw new StudioReadError(\n \"invalid_key\",\n \"Expected a Kortyx API key with studio:read permission.\",\n );\n }\n }\n\n async get<T>(\n path: string,\n schema: z.ZodType<T>,\n query: Record<string, string> = {},\n ): Promise<T> {\n if (\n !/^\\/v1\\/studio\\/(?:context|catalogs|workflows|(?:runs|sessions|interrupts)(?:\\/[^/?#]+)?)$/.test(\n path,\n ) ||\n /(?:^|\\/)(?:\\.|\\.\\.|%2e(?:%2e)?)(?:\\/|$)/i.test(path)\n ) {\n throw new StudioReadError(\n \"invalid_endpoint\",\n \"Only supported Studio read endpoints are allowed.\",\n );\n }\n const url = new URL(`${this.apiUrl}${path}`);\n for (const [key, value] of Object.entries(query))\n url.searchParams.set(key, value);\n let response: Response;\n try {\n response = await this.request(url, {\n method: \"GET\",\n headers: {\n authorization: `Bearer ${this.apiKey}`,\n accept: \"application/json\",\n \"x-kortyx-studio-api-version\": STUDIO_API_PROTOCOL_VERSION,\n },\n redirect: \"error\",\n signal: AbortSignal.timeout(15_000),\n });\n } catch {\n throw new StudioReadError(\n \"connection_failed\",\n \"Studio API request failed or timed out. Check the URL, network/VPN, and TLS. Redirects are not followed.\",\n );\n }\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n this.compatibility = {\n protocolVersion: response.headers.get(\"x-kortyx-studio-api-version\"),\n release: response.headers.get(\"x-kortyx-studio-release\"),\n };\n if (\n this.compatibility.protocolVersion &&\n this.compatibility.protocolVersion !== STUDIO_API_PROTOCOL_VERSION\n ) {\n await response.body?.cancel();\n throw new StudioReadError(\n \"incompatible_studio_api\",\n `This CLI supports Studio API v${STUDIO_API_PROTOCOL_VERSION}, but the server reports v${this.compatibility.protocolVersion}${this.compatibility.release ? ` (${this.compatibility.release})` : \"\"}. Install a CLI and Studio release that use the same Studio API major.`,\n response.status,\n requestId,\n );\n }\n if (!response.ok) {\n await response.body?.cancel();\n const message =\n response.status === 401\n ? \"Invalid, expired, or revoked Studio read key.\"\n : response.status === 403\n ? \"The API key lacks studio:read permission.\"\n : response.status === 404\n ? \"Entity not found in this connection's project. Check the URL and selected connection.\"\n : `Studio API returned HTTP ${response.status}.`;\n // Never echo arbitrary server error bodies: they can contain credentials/content.\n throw new StudioReadError(\n \"api_error\",\n message,\n response.status,\n requestId,\n );\n }\n let value: unknown;\n const reader = response.body?.getReader();\n if (!reader)\n throw new StudioReadError(\n \"invalid_response\",\n \"Studio returned an empty response.\",\n );\n try {\n const decoder = new TextDecoder();\n let body = \"\";\n let bytes = 0;\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 20 * 1024 * 1024) {\n await reader.cancel();\n throw new StudioReadError(\n \"response_too_large\",\n \"Studio response exceeded the 20 MiB safety limit. Use a smaller query or inspect an individual run.\",\n );\n }\n body += decoder.decode(chunk.value, { stream: true });\n }\n body += decoder.decode();\n value = JSON.parse(body);\n } catch (error) {\n if (error instanceof StudioReadError) throw error;\n throw new StudioReadError(\n \"invalid_response\",\n \"Could not read Studio JSON response.\",\n response.status,\n requestId,\n );\n } finally {\n reader.releaseLock();\n }\n const result = schema.safeParse(value);\n if (!result.success) {\n const server = this.compatibility.protocolVersion\n ? `Studio API v${this.compatibility.protocolVersion}${this.compatibility.release ? ` (${this.compatibility.release})` : \"\"}`\n : \"a server that did not report its Studio API version\";\n throw new StudioReadError(\n \"schema_mismatch\",\n `Studio response does not match this CLI's Studio API v${STUDIO_API_PROTOCOL_VERSION} contracts. The response came from ${server}. Upgrade both components if this server predates protocol negotiation; otherwise report this as an API compatibility regression.`,\n response.status,\n requestId,\n );\n }\n return result.data;\n }\n}\n","import {\n access,\n chmod,\n mkdir,\n readFile,\n rename,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { STUDIO_COMPOSE_FILE } from \"./compose\";\nimport type { StudioRuntime, StudioStartOptions } from \"./types\";\n\nconst CONFIG_VERSION = 1;\nconst DEFAULT_API_PORT = 6400;\nconst DEFAULT_STUDIO_PORT = 6300;\nconst DEFAULT_IMAGE_TAG = \"latest\";\nconst DEFAULT_USERNAME = \"admin\";\nconst DEFAULT_PROJECT_NAME = \"kortyx-studio\";\n\nconst PortSchema = z.number().int().min(1).max(65_535);\n\nconst StudioConfigSchema = z\n .object({\n version: z.literal(CONFIG_VERSION),\n apiPort: PortSchema,\n studioPort: PortSchema,\n imageTag: z\n .string()\n .regex(\n /^[A-Za-z0-9][A-Za-z0-9._-]*$/,\n \"Image tag contains unsupported characters.\",\n ),\n username: z\n .string()\n .regex(/^[A-Za-z0-9._@-]+$/, \"Username contains unsupported characters.\"),\n projectName: z\n .string()\n .regex(\n /^[a-z0-9][a-z0-9_-]*$/,\n \"Docker Compose project name contains unsupported characters.\",\n ),\n createdAt: z.iso.datetime(),\n })\n .refine((config) => config.apiPort !== config.studioPort, {\n message: \"Studio and API ports must be different.\",\n path: [\"apiPort\"],\n });\n\nconst ApiKeySchema = z\n .string()\n .regex(/^ktyx_(?:test|live)_[^_]+_.+$/, \"Invalid Kortyx API key.\");\n\nconst StudioEnvironmentSchema = z\n .object({\n KORTYX_COMPOSE_PROJECT_NAME: z.string().min(1),\n KORTYX_STUDIO_IMAGE_TAG: z.string().min(1),\n API_PORT: z.string().regex(/^\\d+$/),\n STUDIO_PORT: z.string().regex(/^\\d+$/),\n POSTGRES_PASSWORD: z.string().min(16),\n KORTYX_API_KEY_PEPPER: z.string().min(16),\n KORTYX_TELEMETRY_API_KEY: ApiKeySchema,\n KORTYX_STUDIO_API_KEY: ApiKeySchema,\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: z.string().min(1),\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: z.string().min(12),\n })\n .passthrough();\n\nexport type StudioConfig = z.infer<typeof StudioConfigSchema>;\nexport type StudioEnvironment = z.infer<typeof StudioEnvironmentSchema>;\nexport type StudioDeploymentCredentials = Pick<\n StudioEnvironment,\n | \"KORTYX_API_KEY_PEPPER\"\n | \"KORTYX_TELEMETRY_API_KEY\"\n | \"KORTYX_STUDIO_API_KEY\"\n | \"KORTYX_STUDIO_BASIC_AUTH_USERNAME\"\n | \"KORTYX_STUDIO_BASIC_AUTH_PASSWORD\"\n>;\n\nexport type StudioStateSnapshot = {\n config: string | null;\n environment: string | null;\n compose: string | null;\n};\n\nexport const defaultStudioHome = (): string =>\n resolve(\n process.env.KORTYX_STUDIO_HOME ?? join(homedir(), \".kortyx\", \"studio\"),\n );\n\nexport const studioConfigPath = (home: string): string =>\n join(home, \"config.json\");\nexport const studioEnvPath = (home: string): string => join(home, \".env\");\nexport const studioComposePath = (home: string): string =>\n join(home, \"compose.yml\");\n\nconst isMissingFile = (error: unknown): boolean =>\n error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n\nconst invalidStateError = (\n label: string,\n path: string,\n error: z.ZodError,\n): Error =>\n new Error(\n `Unsupported or invalid Studio ${label} at ${path}.\\n${z.prettifyError(error)}`,\n );\n\nexport const readStudioConfig = async (\n home: string,\n): Promise<StudioConfig | undefined> => {\n try {\n const parsed = JSON.parse(\n await readFile(studioConfigPath(home), \"utf8\"),\n ) as unknown;\n const result = StudioConfigSchema.safeParse(parsed);\n if (!result.success) {\n throw invalidStateError(\"config\", studioConfigPath(home), result.error);\n }\n return result.data;\n } catch (error) {\n if (isMissingFile(error)) return undefined;\n throw error;\n }\n};\n\nconst resolveConfig = (\n existing: StudioConfig | undefined,\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): StudioConfig => {\n const result = StudioConfigSchema.safeParse({\n version: CONFIG_VERSION,\n apiPort: options.apiPort ?? existing?.apiPort ?? DEFAULT_API_PORT,\n studioPort:\n options.studioPort ?? existing?.studioPort ?? DEFAULT_STUDIO_PORT,\n imageTag: options.imageTag ?? existing?.imageTag ?? DEFAULT_IMAGE_TAG,\n username: options.username ?? existing?.username ?? DEFAULT_USERNAME,\n projectName:\n options.projectName ?? existing?.projectName ?? DEFAULT_PROJECT_NAME,\n createdAt: existing?.createdAt ?? runtime.now(),\n });\n if (!result.success) {\n throw new Error(\n `Invalid Studio configuration.\\n${z.prettifyError(result.error)}`,\n );\n }\n return result.data;\n};\n\nconst createApiKey = (purpose: string, runtime: StudioRuntime): string =>\n `ktyx_live_${purpose}${runtime.random(6).toLowerCase()}_${runtime.random(32)}`;\n\nexport const createStudioDeploymentCredentials = (\n runtime: StudioRuntime,\n username = DEFAULT_USERNAME,\n): StudioDeploymentCredentials => ({\n KORTYX_API_KEY_PEPPER: runtime.random(48),\n KORTYX_TELEMETRY_API_KEY: createApiKey(\"telemetry\", runtime),\n KORTYX_STUDIO_API_KEY: createApiKey(\"studio\", runtime),\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: username,\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: runtime.random(24),\n});\n\nconst createEnvironment = (\n config: StudioConfig,\n runtime: StudioRuntime,\n): StudioEnvironment =>\n StudioEnvironmentSchema.parse({\n KORTYX_COMPOSE_PROJECT_NAME: config.projectName,\n KORTYX_STUDIO_IMAGE_TAG: config.imageTag,\n API_PORT: String(config.apiPort),\n STUDIO_PORT: String(config.studioPort),\n POSTGRES_PASSWORD: runtime.random(32),\n ...createStudioDeploymentCredentials(runtime, config.username),\n });\n\nconst parseEnvironmentFile = (raw: string, path: string): StudioEnvironment => {\n const values: Record<string, string> = {};\n for (const line of raw.split(/\\r?\\n/)) {\n if (!line || line.startsWith(\"#\")) continue;\n const separator = line.indexOf(\"=\");\n if (separator <= 0) {\n throw new Error(`Invalid environment entry in ${path}: ${line}`);\n }\n values[line.slice(0, separator)] = line.slice(separator + 1);\n }\n\n const result = StudioEnvironmentSchema.safeParse(values);\n if (!result.success) {\n throw invalidStateError(\"environment\", path, result.error);\n }\n return result.data;\n};\n\nconst serializeEnvironment = (environment: StudioEnvironment): string =>\n `${Object.entries(environment)\n .map(([key, value]) => `${key}=${value}`)\n .join(\"\\n\")}\\n`;\n\nconst writePrivateFileAtomically = async (\n path: string,\n contents: string,\n): Promise<void> => {\n const temporaryPath = `${path}.tmp-${process.pid}`;\n let renamed = false;\n try {\n await writeFile(temporaryPath, contents, { mode: 0o600 });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, path);\n renamed = true;\n await chmod(path, 0o600);\n } finally {\n if (!renamed) {\n await unlink(temporaryPath).catch(() => undefined);\n }\n }\n};\n\nconst readOptionalFile = async (path: string): Promise<string | null> => {\n try {\n return await readFile(path, \"utf8\");\n } catch (error) {\n if (isMissingFile(error)) return null;\n throw error;\n }\n};\n\nexport const captureStudioState = async (\n home: string,\n): Promise<StudioStateSnapshot> => ({\n config: await readOptionalFile(studioConfigPath(home)),\n environment: await readOptionalFile(studioEnvPath(home)),\n compose: await readOptionalFile(studioComposePath(home)),\n});\n\nexport const restoreStudioState = async (\n home: string,\n snapshot: StudioStateSnapshot,\n): Promise<void> => {\n for (const [path, contents] of [\n [studioConfigPath(home), snapshot.config],\n [studioEnvPath(home), snapshot.environment],\n [studioComposePath(home), snapshot.compose],\n ] as const) {\n if (contents === null) await unlink(path).catch(() => undefined);\n else await writePrivateFileAtomically(path, contents);\n }\n};\n\nexport const readStudioEnvironment = async (\n home: string,\n): Promise<StudioEnvironment> => {\n const path = studioEnvPath(home);\n return parseEnvironmentFile(await readFile(path, \"utf8\"), path);\n};\n\nexport const writeStudioEnvironment = async (\n home: string,\n environment: StudioEnvironment,\n): Promise<void> => {\n const parsed = StudioEnvironmentSchema.parse(environment);\n await writePrivateFileAtomically(\n studioEnvPath(home),\n serializeEnvironment(parsed),\n );\n};\n\nconst rotateApiKeySecret = (apiKey: string, runtime: StudioRuntime): string => {\n const match = /^(ktyx_(?:test|live)_[^_]+_).+$/.exec(apiKey);\n const prefix = match?.[1];\n if (!prefix) throw new Error(\"Stored Kortyx API key has an invalid format.\");\n return `${prefix}${runtime.random(32)}`;\n};\n\nexport const createRotatedStudioEnvironment = (\n environment: StudioEnvironment,\n runtime: StudioRuntime,\n): StudioEnvironment =>\n StudioEnvironmentSchema.parse({\n ...environment,\n KORTYX_TELEMETRY_API_KEY: rotateApiKeySecret(\n environment.KORTYX_TELEMETRY_API_KEY,\n runtime,\n ),\n KORTYX_STUDIO_API_KEY: rotateApiKeySecret(\n environment.KORTYX_STUDIO_API_KEY,\n runtime,\n ),\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: runtime.random(24),\n });\n\nexport const ensureStudioState = async (\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): Promise<StudioConfig> => {\n try {\n await access(join(options.home, \".updates\", \"lock\"));\n throw new Error(\n \"A Studio update is in progress. Wait for it to finish before changing the installation.\",\n );\n } catch (error) {\n if (!isMissingFile(error)) throw error;\n }\n await mkdir(options.home, { recursive: true, mode: 0o700 });\n await chmod(options.home, 0o700);\n await mkdir(join(options.home, \".updates\"), { recursive: true, mode: 0o700 });\n const existing = await readStudioConfig(options.home);\n const config = resolveConfig(existing, options, runtime);\n\n await writePrivateFileAtomically(\n studioConfigPath(options.home),\n `${JSON.stringify(config, null, 2)}\\n`,\n );\n await writePrivateFileAtomically(\n studioComposePath(options.home),\n STUDIO_COMPOSE_FILE,\n );\n\n let environment: StudioEnvironment;\n try {\n environment = await readStudioEnvironment(options.home);\n } catch (error) {\n if (!isMissingFile(error)) throw error;\n environment = createEnvironment(config, runtime);\n }\n\n if (options.imageTag && options.imageTag !== existing?.imageTag) {\n delete environment.KORTYX_API_IMAGE_REF;\n delete environment.KORTYX_STUDIO_IMAGE_REF;\n }\n const updatedEnvironment = StudioEnvironmentSchema.parse({\n ...environment,\n KORTYX_COMPOSE_PROJECT_NAME: config.projectName,\n KORTYX_STUDIO_IMAGE_TAG: config.imageTag,\n API_PORT: String(config.apiPort),\n STUDIO_PORT: String(config.studioPort),\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: config.username,\n KORTYX_STUDIO_STATE_DIR: resolve(options.home),\n KORTYX_STUDIO_UPDATE_TOKEN:\n environment.KORTYX_STUDIO_UPDATE_TOKEN ?? runtime.random(48),\n });\n await writeStudioEnvironment(options.home, updatedEnvironment);\n return config;\n};\n\nexport const requireStudioConfig = async (\n home: string,\n): Promise<StudioConfig> => {\n const config = await readStudioConfig(home);\n if (!config) {\n throw new Error(\n `Kortyx Studio is not initialized at ${home}. Run \"kortyx studio start\" first.`,\n );\n }\n return config;\n};\n","export const STUDIO_COMPOSE_FILE = `name: \\${KORTYX_COMPOSE_PROJECT_NAME:-kortyx-studio}\n\nx-api-env: &api-env\n DATABASE_URL: postgres://kortyx:\\${POSTGRES_PASSWORD}@postgres:5432/kortyx\n KORTYX_API_KEY_PEPPER: \\${KORTYX_API_KEY_PEPPER}\n\nx-bootstrap-keys: &bootstrap-keys\n KORTYX_TELEMETRY_API_KEY: \\${KORTYX_TELEMETRY_API_KEY}\n KORTYX_STUDIO_API_KEY: \\${KORTYX_STUDIO_API_KEY}\n KORTYX_STUDIO_ENABLE_REVIEWS: \\${KORTYX_STUDIO_ENABLE_REVIEWS:-0}\n\nservices:\n postgres:\n image: postgres:17-alpine\n environment:\n POSTGRES_USER: kortyx\n POSTGRES_PASSWORD: \\${POSTGRES_PASSWORD}\n POSTGRES_DB: kortyx\n volumes:\n - postgres-data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U kortyx -d kortyx\"]\n interval: 2s\n timeout: 5s\n retries: 30\n\n db-init:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n <<: [*api-env, *bootstrap-keys]\n command: >\n sh -lc \"pnpm --filter @kortyx/telemetry-db db:migrate &&\n pnpm --filter @kortyx/telemetry-db db:bootstrap\"\n depends_on:\n postgres:\n condition: service_healthy\n restart: \"no\"\n\n api:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n <<: *api-env\n NODE_ENV: production\n API_HOST: 0.0.0.0\n API_PORT: 6400\n KORTYX_STUDIO_RELEASE: \\${KORTYX_STUDIO_IMAGE_TAG:-latest}\n ports:\n - \"127.0.0.1:\\${API_PORT:-6400}:6400\"\n depends_on:\n db-init:\n condition: service_completed_successfully\n healthcheck:\n test:\n [\n \"CMD-SHELL\",\n \"node -e \\\\\"fetch('http://localhost:6400/ready').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\\\\\"\",\n ]\n interval: 5s\n timeout: 5s\n retries: 30\n\n studio:\n image: \\${KORTYX_STUDIO_IMAGE_REF:-\\${KORTYX_STUDIO_IMAGE:-ghcr.io/kortyx-io/kortyx-studio}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n environment:\n NODE_ENV: production\n PORT: 6300\n KORTYX_API_URL: http://api:6400\n KORTYX_STUDIO_API_KEY: \\${KORTYX_STUDIO_API_KEY}\n KORTYX_STUDIO_UPDATER_URL: http://updater:6410\n KORTYX_STUDIO_UPDATE_TOKEN: \\${KORTYX_STUDIO_UPDATE_TOKEN}\n KORTYX_STUDIO_AUTH_MODE: basic\n KORTYX_STUDIO_BASIC_AUTH_USERNAME: \\${KORTYX_STUDIO_BASIC_AUTH_USERNAME}\n KORTYX_STUDIO_BASIC_AUTH_PASSWORD: \\${KORTYX_STUDIO_BASIC_AUTH_PASSWORD}\n ports:\n - \"127.0.0.1:\\${STUDIO_PORT:-6300}:6300\"\n depends_on:\n api:\n condition: service_healthy\n healthcheck:\n test:\n [\n \"CMD-SHELL\",\n \"node -e \\\\\"fetch('http://localhost:6300').then((r)=>process.exit(r.status<500?0:1)).catch(()=>process.exit(1))\\\\\"\",\n ]\n interval: 5s\n timeout: 5s\n retries: 30\n\n updater:\n image: \\${KORTYX_API_IMAGE_REF:-\\${KORTYX_API_IMAGE:-ghcr.io/kortyx-io/kortyx-api}:\\${KORTYX_STUDIO_IMAGE_TAG:-latest}}\n pull_policy: \\${KORTYX_STUDIO_PULL_POLICY:-always}\n restart: unless-stopped\n command: [\"node\", \"apps/api/dist/updater.js\", \"serve\", \"\\${KORTYX_STUDIO_STATE_DIR}\"]\n volumes:\n - type: bind\n source: \\${KORTYX_STUDIO_STATE_DIR}\n target: \\${KORTYX_STUDIO_STATE_DIR}\n - /var/run/docker.sock:/var/run/docker.sock\n healthcheck:\n test: [\"CMD\", \"node\", \"-e\", \"fetch('http://localhost:6410/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"]\n interval: 5s\n timeout: 5s\n retries: 30\n\nvolumes:\n postgres-data:\n`;\n\nexport function studioComposeFile(updater: boolean): string {\n if (updater) return STUDIO_COMPOSE_FILE;\n return STUDIO_COMPOSE_FILE.replace(\n /\\n {2}updater:[\\s\\S]*?\\nvolumes:/,\n \"\\nvolumes:\",\n )\n .replace(/ {6}KORTYX_STUDIO_UPDATER_URL:.*\\n/, \"\")\n .replace(/ {6}KORTYX_STUDIO_UPDATE_TOKEN:.*\\n/, \"\");\n}\n","import {\n Command,\n CommanderError,\n InvalidArgumentError,\n Option,\n} from \"commander\";\nimport {\n printGeneratedDeploymentCredentials,\n printStudioConnection,\n printStudioSdkEnvironment,\n resetStudio,\n restartStudio,\n rotateStudioCredentials,\n showStudioLogs,\n showStudioStatus,\n startStudio,\n stopStudio,\n} from \"./local-stack\";\nimport { registerStudioReadCommands } from \"./read-command\";\nimport { defaultStudioRuntime } from \"./runtime\";\nimport { defaultStudioHome, requireStudioConfig } from \"./state\";\nimport type { StudioRuntime } from \"./types\";\n\ntype HomeOptions = {\n home: string;\n};\n\ntype StartOptions = HomeOptions & {\n apiPort?: number;\n studioPort?: number;\n imageTag?: string;\n username?: string;\n projectName?: string;\n};\n\ntype LogsOptions = HomeOptions & {\n follow: boolean;\n};\n\ntype ResetOptions = HomeOptions & {\n confirm: boolean;\n};\n\ntype CredentialsOptions = HomeOptions & {\n format: \"human\" | \"dotenv\";\n generate: boolean;\n rotate: boolean;\n serviceName: string;\n};\n\nconst portParser = (value: string): number => {\n const port = Number(value);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new InvalidArgumentError(\n \"Port must be an integer between 1 and 65535.\",\n );\n }\n return port;\n};\n\nconst withHome = (command: Command): Command =>\n command.addOption(\n new Option(\"--home <path>\", \"Local Studio state directory.\").default(\n defaultStudioHome(),\n ),\n );\n\nconst configureOutput = (command: Command, runtime: StudioRuntime): Command =>\n command.configureOutput({\n writeOut: (output) => runtime.log(output.trimEnd()),\n writeErr: (output) => (runtime.error ?? runtime.log)(output.trimEnd()),\n });\n\nexport const createStudioCommand = (\n runtime: StudioRuntime = defaultStudioRuntime,\n): Command => {\n const studio = configureOutput(\n new Command(\"studio\")\n .description(\"Run and manage Kortyx Studio.\")\n .showHelpAfterError()\n .addHelpText(\n \"after\",\n \"\\nLocal state and generated credentials are stored in ~/.kortyx/studio by default.\",\n ),\n runtime,\n );\n\n withHome(\n studio\n .command(\"start\")\n .description(\n \"Create or update the local stack and wait until it is healthy.\",\n )\n .option(\"--studio-port <port>\", \"Studio host port.\", portParser)\n .option(\"--api-port <port>\", \"Telemetry API host port.\", portParser)\n .option(\"--image-tag <tag>\", \"Published Studio image tag.\")\n .option(\"--username <name>\", \"Local Studio username.\")\n .option(\"--project-name <name>\", \"Docker Compose project name.\"),\n ).action(async (options: StartOptions) => {\n await startStudio(options, runtime);\n });\n\n withHome(\n studio\n .command(\"stop\")\n .description(\"Stop containers while preserving local data.\"),\n ).action(async ({ home }: HomeOptions) => {\n await stopStudio(home, runtime);\n });\n\n withHome(\n studio\n .command(\"restart\")\n .description(\"Recreate the stack and wait until it is healthy.\"),\n ).action(async ({ home }: HomeOptions) => {\n await restartStudio(home, runtime);\n });\n\n withHome(\n studio\n .command(\"status\")\n .description(\"Show container health and local endpoints.\"),\n ).action(async ({ home }: HomeOptions) => {\n await showStudioStatus(home, runtime);\n });\n\n withHome(\n studio\n .command(\"logs\")\n .description(\"Show API, Studio, bootstrap, and database logs.\")\n .option(\"--no-follow\", \"Print recent logs without following.\"),\n ).action(async ({ home, follow }: LogsOptions) => {\n await showStudioLogs(home, follow, runtime);\n });\n\n withHome(\n studio\n .command(\"credentials\")\n .description(\"Print or rotate Studio and SDK credentials.\")\n .option(\n \"--rotate\",\n \"Replace the browser password and application API-key secrets.\",\n false,\n )\n .option(\n \"--generate\",\n \"Generate unpersisted credentials for a self-hosted deployment.\",\n false,\n )\n .addOption(\n new Option(\"--format <format>\", \"Credential output format.\")\n .choices([\"human\", \"dotenv\"])\n .default(\"human\"),\n )\n .option(\n \"--service-name <name>\",\n \"SDK service name used by dotenv output.\",\n \"my-agent\",\n ),\n ).action(async (options: CredentialsOptions) => {\n const { format, generate, home, rotate, serviceName } = options;\n if (generate && rotate) {\n throw new Error(\"Use either --generate or --rotate, not both.\");\n }\n if (format === \"dotenv\" && (generate || rotate)) {\n throw new Error(\n \"--format dotenv prints persisted SDK credentials and cannot be combined with --generate or --rotate.\",\n );\n }\n if (format === \"human\" && serviceName !== \"my-agent\") {\n throw new Error(\"--service-name requires --format dotenv.\");\n }\n if (!/^[A-Za-z0-9@][A-Za-z0-9@._/-]*$/.test(serviceName)) {\n throw new Error(\"Service name contains unsupported characters.\");\n }\n if (generate) {\n printGeneratedDeploymentCredentials(runtime);\n return;\n }\n if (rotate) {\n await rotateStudioCredentials(home, runtime);\n return;\n }\n const config = await requireStudioConfig(home);\n if (format === \"dotenv\") {\n await printStudioSdkEnvironment(home, config, serviceName, runtime);\n return;\n }\n await printStudioConnection(home, config, runtime);\n });\n\n withHome(\n studio\n .command(\"reset\")\n .description(\"Delete the local Studio database volume.\")\n .option(\"--confirm\", \"Confirm permanent deletion.\", false),\n ).action(async ({ home, confirm }: ResetOptions) => {\n await resetStudio(home, confirm, runtime);\n });\n\n registerStudioReadCommands(studio, (message) => runtime.log(message));\n return studio;\n};\n\nconst overrideExitTree = (command: Command): void => {\n command.exitOverride();\n for (const child of command.commands) overrideExitTree(child);\n};\n\nexport const runStudioCommand = async (\n argv: string[],\n runtime: StudioRuntime = defaultStudioRuntime,\n): Promise<void> => {\n const command = createStudioCommand(runtime);\n overrideExitTree(command);\n if (argv.length === 0) {\n command.outputHelp();\n return;\n }\n try {\n await command.parseAsync(argv, { from: \"user\" });\n } catch (error) {\n if (error instanceof CommanderError && error.exitCode === 0) return;\n throw error;\n }\n};\n\nexport { defaultStudioRuntime };\nexport type { StudioRuntime };\n","import { writeFile } from \"node:fs/promises\";\nimport {\n STUDIO_API_PROTOCOL_VERSION,\n StudioContextResponseSchema,\n} from \"@kortyx/telemetry-contracts\";\nimport { studioComposeFile } from \"./compose\";\nimport { StudioReadClient, StudioReadError } from \"./read-client\";\nimport {\n captureStudioState,\n createRotatedStudioEnvironment,\n createStudioDeploymentCredentials,\n ensureStudioState,\n readStudioEnvironment,\n requireStudioConfig,\n restoreStudioState,\n type StudioConfig,\n studioComposePath,\n studioEnvPath,\n writeStudioEnvironment,\n} from \"./state\";\nimport type { CommandResult, StudioRuntime, StudioStartOptions } from \"./types\";\n\nconst composeArgs = (home: string, args: string[]): string[] => [\n \"compose\",\n \"--env-file\",\n studioEnvPath(home),\n \"-f\",\n studioComposePath(home),\n ...args,\n];\n\nconst runCompose = async (\n home: string,\n args: string[],\n runtime: StudioRuntime,\n inherit = true,\n): Promise<CommandResult> =>\n await runtime.run(\"docker\", composeArgs(home, args), {\n cwd: home,\n inherit,\n });\n\nconst preflightDocker = async (runtime: StudioRuntime): Promise<void> => {\n await runtime.run(\"docker\", [\"version\", \"--format\", \"{{.Server.Version}}\"], {\n inherit: false,\n });\n await runtime.run(\"docker\", [\"compose\", \"version\", \"--short\"], {\n inherit: false,\n });\n};\n\nconst hasRunningServices = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<boolean> => {\n const result = await runCompose(\n home,\n [\"ps\", \"--status\", \"running\", \"--services\"],\n runtime,\n false,\n );\n return result.stdout.trim().length > 0;\n};\n\nconst assertPortsAvailable = async (\n config: StudioConfig,\n runtime: StudioRuntime,\n): Promise<void> => {\n for (const [label, port] of [\n [\"Studio\", config.studioPort],\n [\"API\", config.apiPort],\n ] as const) {\n if (!(await runtime.portAvailable(port))) {\n throw new Error(\n `${label} port ${port} is already in use. Choose another with --${label.toLowerCase()}-port ${port + 1}.`,\n );\n }\n }\n};\n\nexport const printStudioConnection = async (\n home: string,\n config: StudioConfig,\n runtime: StudioRuntime,\n): Promise<void> => {\n const environment = await readStudioEnvironment(home);\n runtime.log();\n runtime.log(\"Kortyx Studio connection\");\n runtime.log(` Studio: http://localhost:${config.studioPort}`);\n runtime.log(` API: http://localhost:${config.apiPort}`);\n runtime.log(` Username: ${environment.KORTYX_STUDIO_BASIC_AUTH_USERNAME}`);\n runtime.log(` Password: ${environment.KORTYX_STUDIO_BASIC_AUTH_PASSWORD}`);\n runtime.log();\n runtime.log(\"Add these server-side variables to your Kortyx SDK project:\");\n runtime.log(` KORTYX_TELEMETRY_API_URL=http://localhost:${config.apiPort}`);\n runtime.log(\n ` KORTYX_TELEMETRY_API_KEY=${environment.KORTYX_TELEMETRY_API_KEY}`,\n );\n runtime.log(\" KORTYX_TELEMETRY_ENVIRONMENT=development\");\n runtime.log(\" KORTYX_TELEMETRY_SERVICE_NAME=my-agent\");\n runtime.log();\n runtime.log(\"Next steps:\");\n runtime.log(\" 1. Add the server-side variables above to your SDK project.\");\n runtime.log(\n \" 2. Publish its workflow catalog with: npx kortyx topology push --entry <agent-entry>\",\n );\n runtime.log(\" 3. Restart your app, trigger a run, and open Studio.\");\n runtime.log();\n runtime.log(\n \"For copyable SDK variables only, run: npx kortyx studio credentials --format dotenv\",\n );\n runtime.log();\n runtime.log(`Local state: ${home}`);\n};\n\nexport const printStudioSdkEnvironment = async (\n home: string,\n config: StudioConfig,\n serviceName: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n const environment = await readStudioEnvironment(home);\n runtime.log(`KORTYX_TELEMETRY_API_URL=http://localhost:${config.apiPort}`);\n runtime.log(\n `KORTYX_TELEMETRY_API_KEY=${environment.KORTYX_TELEMETRY_API_KEY}`,\n );\n runtime.log(\"KORTYX_TELEMETRY_ENVIRONMENT=development\");\n runtime.log(`KORTYX_TELEMETRY_SERVICE_NAME=${serviceName}`);\n};\n\nexport const printGeneratedDeploymentCredentials = (\n runtime: StudioRuntime,\n): void => {\n const credentials = createStudioDeploymentCredentials(runtime);\n runtime.log(\"Kortyx Studio deployment credentials\");\n for (const [key, value] of Object.entries(credentials)) {\n runtime.log(`${key}=${value}`);\n }\n runtime.log();\n runtime.log(\n \"These values were not persisted. Store them in your deployment secret manager now; Kortyx cannot recover them later.\",\n );\n};\n\nconst applyStudioEnvironment = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await runCompose(home, [\"run\", \"--rm\", \"db-init\"], runtime);\n await runCompose(\n home,\n [\n \"up\",\n \"-d\",\n \"--force-recreate\",\n \"--wait\",\n \"--wait-timeout\",\n \"180\",\n \"api\",\n \"studio\",\n ],\n runtime,\n );\n};\n\nexport const rotateStudioCredentials = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n const previousEnvironment = await readStudioEnvironment(home);\n const rotatedEnvironment = createRotatedStudioEnvironment(\n previousEnvironment,\n runtime,\n );\n\n await writeStudioEnvironment(home, rotatedEnvironment);\n try {\n await applyStudioEnvironment(home, runtime);\n } catch (rotationError) {\n runtime.log(\n \"Credential rotation failed. Restoring the previous credentials.\",\n );\n await writeStudioEnvironment(home, previousEnvironment);\n try {\n await applyStudioEnvironment(home, runtime);\n } catch (rollbackError) {\n throw new AggregateError(\n [rotationError, rollbackError],\n `Credential rotation and automatic rollback both failed. Inspect \"${home}\" and run \"kortyx studio logs --home ${home} --no-follow\".`,\n );\n }\n throw rotationError;\n }\n\n runtime.log(\"Kortyx Studio application credentials were rotated.\");\n runtime.log(\n \"The previous browser password and API keys are no longer valid. Update every SDK producer before sending more telemetry.\",\n );\n await printStudioConnection(home, config, runtime);\n};\n\nexport const startStudio = async (\n options: StudioStartOptions,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const snapshot = await captureStudioState(options.home);\n try {\n const config = await ensureStudioState(options, runtime);\n const environment = await readStudioEnvironment(options.home);\n const apiImage = String(\n environment.KORTYX_API_IMAGE_REF ??\n `${environment.KORTYX_API_IMAGE ?? \"ghcr.io/kortyx-io/kortyx-api\"}:${config.imageTag}`,\n );\n const studioImage = String(\n environment.KORTYX_STUDIO_IMAGE_REF ??\n `${environment.KORTYX_STUDIO_IMAGE ?? \"ghcr.io/kortyx-io/kortyx-studio\"}:${config.imageTag}`,\n );\n await runtime.run(\"docker\", [\"pull\", apiImage], { inherit: true });\n if (studioImage !== apiImage)\n await runtime.run(\"docker\", [\"pull\", studioImage], { inherit: true });\n const capability = await runtime.run(\n \"docker\",\n [\n \"run\",\n \"--rm\",\n \"--entrypoint\",\n \"node\",\n apiImage,\n \"-e\",\n 'if (require(\"node:fs\").existsSync(\"/app/apps/api/dist/updater.js\")) console.log(\"supported\")',\n ],\n { inherit: false },\n );\n await writeFile(\n studioComposePath(options.home),\n studioComposeFile(\n process.platform !== \"win32\" &&\n capability.stdout.trim() === \"supported\",\n ),\n { mode: 0o600 },\n );\n if (!(await hasRunningServices(options.home, runtime))) {\n await assertPortsAvailable(config, runtime);\n }\n runtime.log(\n \"Starting Kortyx Studio. The first image pull can take a few minutes.\",\n );\n await runCompose(\n options.home,\n [\"up\", \"-d\", \"--remove-orphans\", \"--wait\", \"--wait-timeout\", \"180\"],\n runtime,\n );\n runtime.log(\"Kortyx Studio is ready.\");\n await printStudioConnection(options.home, config, runtime);\n } catch (error) {\n try {\n await restoreStudioState(options.home, snapshot);\n } catch (rollbackError) {\n throw new AggregateError(\n [error, rollbackError],\n `Studio startup failed and the previous configuration could not be restored. Inspect \"${options.home}\" before retrying.`,\n );\n }\n throw error;\n }\n};\n\nexport const stopStudio = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(home, [\"stop\"], runtime);\n runtime.log(\n \"Kortyx Studio stopped. Local data and credentials were preserved.\",\n );\n};\n\nexport const restartStudio = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n await runCompose(\n home,\n [\"up\", \"-d\", \"--force-recreate\", \"--wait\", \"--wait-timeout\", \"180\"],\n runtime,\n );\n runtime.log(\"Kortyx Studio restarted.\");\n await printStudioConnection(home, config, runtime);\n};\n\nexport const showStudioStatus = async (\n home: string,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n const config = await requireStudioConfig(home);\n await runCompose(home, [\"ps\"], runtime);\n runtime.log();\n runtime.log(`Studio: http://localhost:${config.studioPort}`);\n runtime.log(`API: http://localhost:${config.apiPort}`);\n if (runtime.request) {\n const environment = await readStudioEnvironment(home);\n const client = new StudioReadClient(\n `http://localhost:${config.apiPort}`,\n environment.KORTYX_STUDIO_API_KEY,\n runtime.request,\n );\n try {\n await client.get(\"/v1/studio/context\", StudioContextResponseSchema);\n runtime.log(\n client.compatibility.protocolVersion\n ? `Compatibility: Studio API v${client.compatibility.protocolVersion} (${client.compatibility.release ?? config.imageTag}) is compatible with CLI API v${STUDIO_API_PROTOCOL_VERSION}.`\n : `Compatibility: response is compatible with CLI API v${STUDIO_API_PROTOCOL_VERSION}; this older server does not report its protocol version.`,\n );\n } catch (error) {\n runtime.log(\n `Compatibility: ${error instanceof StudioReadError ? error.message : \"could not query the Studio API.\"}`,\n );\n }\n }\n runtime.log(`State: ${home}`);\n};\n\nexport const showStudioLogs = async (\n home: string,\n follow: boolean,\n runtime: StudioRuntime,\n): Promise<void> => {\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(\n home,\n [\"logs\", ...(follow ? [\"--follow\"] : []), \"--tail\", \"200\"],\n runtime,\n );\n};\n\nexport const resetStudio = async (\n home: string,\n confirm: boolean,\n runtime: StudioRuntime,\n): Promise<void> => {\n if (!confirm) {\n throw new Error(\n 'Reset permanently deletes the local Studio database. Re-run with \"kortyx studio reset --confirm\".',\n );\n }\n await preflightDocker(runtime);\n await requireStudioConfig(home);\n await runCompose(home, [\"down\", \"--volumes\", \"--remove-orphans\"], runtime);\n runtime.log(\n 'Kortyx Studio data was deleted. Credentials were preserved; run \"kortyx studio start\" to create a fresh database.',\n );\n};\n","import {\n projectWorkflowCalls,\n resolveStudioTimeRange,\n StudioCatalogsResponseSchema,\n StudioContextResponseSchema,\n StudioInterruptDetailResponseSchema,\n StudioInterruptsResponseSchema,\n StudioRunDetailResponseSchema,\n StudioRunsResponseSchema,\n StudioSessionDetailResponseSchema,\n StudioSessionsResponseSchema,\n StudioTimeRangeSchema,\n StudioWorkflowsResponseSchema,\n} from \"@kortyx/telemetry-contracts\";\nimport { type Command, InvalidArgumentError, Option } from \"commander\";\nimport {\n type ConnectionOptions,\n defaultConnectionsHome,\n resolveConnection,\n} from \"../connections\";\nimport {\n analyzeStudioDiagnostics,\n buildStudioTimeline,\n type CatalogDrift,\n compareCatalogRuntime,\n compareRunAnalysis,\n focusStudioEvents,\n} from \"./read-analysis\";\nimport { StudioReadClient, StudioReadError } from \"./read-client\";\nimport {\n formatReadOutput,\n parseStudioTarget,\n type StudioEntity,\n sanitizeStudioData,\n summarizeEvidence,\n} from \"./read-output\";\nimport { defaultStudioHome } from \"./state\";\n\ntype ReadOptions = ConnectionOptions & {\n json?: boolean;\n includeContent?: boolean;\n eventLimit?: number;\n limit?: number;\n cursor?: number;\n environment?: string;\n range?: string;\n startedAfter?: string;\n startedBefore?: string;\n status?: string;\n workflow?: string;\n session?: string;\n user?: string;\n tenant?: string;\n model?: string;\n node?: string;\n tool?: string;\n toolOutcome?: string;\n q?: string;\n includeChildren?: boolean;\n focusSelection?: boolean;\n};\ntype DetailOptions = ReadOptions & { eventLimit: number };\ntype CohortOptions = ReadOptions & { range: string };\ntype ListOptions = CohortOptions & { limit: number; cursor: number };\nconst integer = (min: number, max: number) => (value: string) => {\n if (\n !/^\\d+$/.test(value) ||\n !Number.isSafeInteger(Number(value)) ||\n Number(value) < min ||\n Number(value) > max\n ) {\n throw new InvalidArgumentError(\n `Expected an integer between ${min} and ${max}.`,\n );\n }\n return Number(value);\n};\nconst rangeAliases: Record<string, string> = {\n \"1h\": \"Last hour\",\n \"24h\": \"24 hours\",\n \"7d\": \"7 days\",\n \"30d\": \"30 days\",\n all: \"All time\",\n};\nexport const registerStudioReadCommands = (\n studio: Command,\n log: (message: string) => void,\n request: typeof fetch = fetch,\n) => {\n const common = (command: Command) =>\n command\n .option(\n \"--connection <name>\",\n \"Named project/URL connection (or KORTYX_CONNECTION).\",\n )\n .option(\n \"--config-home <path>\",\n \"Connection configuration directory.\",\n defaultConnectionsHome(),\n )\n .option(\n \"--home <path>\",\n \"Managed local Studio directory.\",\n defaultStudioHome(),\n )\n .option(\n \"--api-url <url>\",\n \"Direct API URL; requires --api-key-env. Never reuses a profile key.\",\n )\n .option(\n \"--api-key-env <name>\",\n \"Environment variable holding a direct connection read key.\",\n )\n .option(\"--json\", \"Print stable machine-readable JSON.\")\n .option(\n \"--include-content\",\n \"Include captured input/output and prompts (may contain sensitive data).\",\n );\n const print = (value: unknown, options: ReadOptions) =>\n log(\n formatReadOutput(\n sanitizeStudioData(value, options.includeContent ?? false),\n options.json ?? false,\n ),\n );\n const clientFor = async (options: ReadOptions, targetUrl?: string) => {\n const connection = await resolveConnection(options, targetUrl);\n return {\n connection,\n client: new StudioReadClient(\n connection.apiUrl,\n connection.apiKey,\n request,\n ),\n };\n };\n const inspect = async (\n input: string,\n options: DetailOptions,\n entity?: StudioEntity,\n ) => {\n const target = parseStudioTarget(input, entity);\n const { connection, client } = await clientFor(options, target.url);\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n // Branch types have separate schemas; avoid relaxing validation to generic JSON.\n const path = `/v1/studio/${target.entity}/${encodeURIComponent(target.id)}`;\n const detail =\n target.entity === \"runs\"\n ? await client.get(path, StudioRunDetailResponseSchema)\n : target.entity === \"sessions\"\n ? await client.get(path, StudioSessionDetailResponseSchema)\n : await client.get(path, StudioInterruptDetailResponseSchema);\n const limit = options.eventLimit;\n const events = [...detail.events].sort(\n (a, b) =>\n Date.parse(a.occurredAt) - Date.parse(b.occurredAt) ||\n Date.parse(a.receivedAt) - Date.parse(b.receivedAt) ||\n a.id.localeCompare(b.id),\n );\n const focus = options.focusSelection\n ? focusStudioEvents(events, target)\n : { events, applied: {} };\n const selectedEvents = focus.events;\n const evidence = summarizeEvidence(selectedEvents);\n const run = \"run\" in detail ? detail.run : null;\n const interrupts =\n \"interrupts\" in detail\n ? detail.interrupts\n : \"interrupt\" in detail\n ? [detail.interrupt]\n : [];\n const analyzedFindings = analyzeStudioDiagnostics(\n selectedEvents,\n run,\n interrupts,\n );\n const supersededEventIds = new Set(\n analyzedFindings.flatMap((finding) => finding.eventIds),\n );\n const findings = [\n ...evidence.findings.filter(\n (finding) => !supersededEventIds.has(finding.eventId),\n ),\n ...analyzedFindings,\n ];\n const calls = projectWorkflowCalls(selectedEvents);\n let catalog: CatalogDrift | undefined;\n if (target.entity === \"runs\" && run) {\n try {\n const workflows = await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n { range: \"All time\", workflow: run.workflowId },\n );\n catalog = compareCatalogRuntime(run, workflows.workflows);\n } catch (error) {\n catalog = {\n status: \"unavailable\",\n workflows: [],\n reason:\n error instanceof StudioReadError\n ? error.code\n : \"catalog_comparison_failed\",\n };\n }\n }\n const catalogFinding =\n catalog?.status === \"drift\"\n ? [\n {\n code: \"catalog_runtime_drift\",\n severity: \"warning\" as const,\n message:\n \"The executed workflow revision differs from the currently active catalog revision.\",\n eventIds: [],\n evidence: catalog.workflows,\n },\n ]\n : [];\n const allFindings = [...findings, ...catalogFinding];\n print(\n {\n schemaVersion: 1,\n connection: {\n name: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n target,\n detail: { ...detail, events: selectedEvents.slice(-limit) },\n timeline: buildStudioTimeline(selectedEvents, interrupts).slice(-limit),\n calls: calls.slice(-limit).map(({ events: callEvents, ...call }) => ({\n ...call,\n eventIds: callEvents.map((event) => event.id),\n })),\n diagnostics: {\n ...evidence,\n findings: allFindings.slice(-limit),\n findingCount: allFindings.length,\n findingsOmitted: Math.max(0, allFindings.length - limit),\n },\n ...(catalog ? { catalog } : {}),\n coverage: {\n returnedEvents: Math.min(selectedEvents.length, limit),\n availableEvents: selectedEvents.length,\n omittedEvents: Math.max(0, selectedEvents.length - limit),\n eventWindow: \"latest\",\n selectionFocus: options.focusSelection\n ? {\n applied: focus.applied,\n matchedEvents: selectedEvents.length,\n totalEvents: events.length,\n }\n : null,\n contentIncluded: options.includeContent ?? false,\n availableCalls: calls.length,\n omittedCalls: Math.max(0, calls.length - limit),\n note: \"Available events are those returned by Studio, not a guarantee of complete runtime history. Content capture is opt-in; secrets are redacted on a best-effort basis even with --include-content.\",\n },\n },\n options,\n );\n };\n const detailOptions = (command: Command) =>\n common(command)\n .option(\n \"--event-limit <count>\",\n \"Maximum latest events and diagnostic findings (1–10000).\",\n integer(1, 10_000),\n 100,\n )\n .option(\n \"--focus-selection\",\n \"Focus events using call/event/branch/node/trace selectors from the URL.\",\n );\n detailOptions(\n studio\n .command(\"inspect <url>\")\n .description(\n \"Inspect a pasted run/session/interrupt URL using a matching configured connection.\",\n ),\n ).action((input: string, options: DetailOptions) => inspect(input, options));\n common(\n studio\n .command(\"doctor\")\n .description(\n \"Verify the read credential, project, environments, and API compatibility.\",\n ),\n ).action(async (options: ReadOptions) => {\n const { connection, client } = await clientFor(options);\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n options,\n );\n });\n common(\n studio\n .command(\"catalogs\")\n .description(\n \"Read available environment/provider/model/workflow/tag filters.\",\n ),\n ).action(async (options: ReadOptions) => {\n const { connection, client } = await clientFor(options);\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data: await client.get(\n \"/v1/studio/catalogs\",\n StudioCatalogsResponseSchema,\n ),\n },\n options,\n );\n });\n const filters = (command: Command) =>\n common(command)\n .option(\n \"--environment <name>\",\n \"Environment filter; overrides the connection default.\",\n )\n .addOption(\n new Option(\n \"--range <range>\",\n \"Studio time range: 1h, 24h, 7d, 30d, all (or Studio preset name).\",\n )\n .choices([\n ...Object.keys(rangeAliases),\n ...StudioTimeRangeSchema.options,\n ])\n .default(\"24h\"),\n )\n .option(\n \"--started-after <iso>\",\n \"Explicit start boundary (requires --started-before).\",\n )\n .option(\n \"--started-before <iso>\",\n \"Explicit end boundary (requires --started-after).\",\n )\n .option(\"--workflow <id>\", \"Workflow filter.\");\n const timeQuery = (options: CohortOptions): Record<string, string> => {\n const custom = Boolean(options.startedAfter || options.startedBefore);\n const range = custom\n ? \"Custom range\"\n : (rangeAliases[options.range] ?? options.range);\n const resolution = resolveStudioTimeRange({\n range,\n startedAfter: options.startedAfter,\n startedBefore: options.startedBefore,\n });\n if (\"error\" in resolution)\n throw new StudioReadError(\"invalid_time_range\", resolution.error);\n return custom\n ? {\n range,\n startedAfter: String(resolution.value.startedAfter),\n startedBefore: String(resolution.value.startedBefore),\n }\n : { range };\n };\n for (const entity of [\"runs\", \"sessions\", \"interrupts\"] as const) {\n const group = studio.command(entity).description(`Read Studio ${entity}.`);\n detailOptions(\n group\n .command(\"get <id-or-url>\")\n .description(\"Read detail, events, and diagnostic evidence.\"),\n ).action((input: string, options: DetailOptions) =>\n inspect(input, options, entity),\n );\n if (entity === \"runs\") {\n common(\n group\n .command(\"compare <left-id-or-url> <right-id-or-url>\")\n .description(\n \"Compare two runs' versions, outcomes, and compact execution timelines.\",\n ),\n )\n .option(\n \"--event-limit <count>\",\n \"Maximum timeline steps returned per run (1–10000).\",\n integer(1, 10_000),\n 100,\n )\n .action(\n async (\n leftInput: string,\n rightInput: string,\n options: DetailOptions,\n ) => {\n const leftTarget = parseStudioTarget(leftInput, \"runs\");\n const rightTarget = parseStudioTarget(rightInput, \"runs\");\n const { connection, client } = await clientFor(\n options,\n leftTarget.url,\n );\n // Resolve again against the selected profile so a second pasted URL\n // cannot silently send this project's credential to another locator.\n await resolveConnection(\n { ...options, connection: connection.name },\n rightTarget.url,\n );\n const context = await client.get(\n \"/v1/studio/context\",\n StudioContextResponseSchema,\n );\n const [leftDetail, rightDetail] = await Promise.all([\n client.get(\n `/v1/studio/runs/${encodeURIComponent(leftTarget.id)}`,\n StudioRunDetailResponseSchema,\n ),\n client.get(\n `/v1/studio/runs/${encodeURIComponent(rightTarget.id)}`,\n StudioRunDetailResponseSchema,\n ),\n ]);\n const catalogFor = async (\n detail: typeof leftDetail,\n ): Promise<CatalogDrift> => {\n try {\n const response = await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n { range: \"All time\", workflow: detail.run.workflowId },\n );\n return compareCatalogRuntime(detail.run, response.workflows);\n } catch (error) {\n return {\n status: \"unavailable\",\n workflows: [],\n reason:\n error instanceof StudioReadError\n ? error.code\n : \"catalog_comparison_failed\",\n };\n }\n };\n const [leftCatalog, rightCatalog] = await Promise.all([\n catalogFor(leftDetail),\n catalogFor(rightDetail),\n ]);\n const side = (\n target: ReturnType<typeof parseStudioTarget>,\n detail: typeof leftDetail,\n catalog: CatalogDrift,\n ) => {\n const ordered = [...detail.events].sort(\n (a, b) =>\n Date.parse(a.occurredAt) - Date.parse(b.occurredAt) ||\n Date.parse(a.receivedAt) - Date.parse(b.receivedAt) ||\n a.id.localeCompare(b.id),\n );\n const timeline = buildStudioTimeline(\n ordered,\n detail.interrupts,\n ).slice(-options.eventLimit);\n return {\n target,\n run: detail.run,\n timeline,\n catalog,\n deploymentRefs: [\n ...new Set(\n ordered\n .map((event) => event.deploymentRef)\n .filter((value): value is string => Boolean(value)),\n ),\n ],\n diagnostics: analyzeStudioDiagnostics(\n ordered,\n detail.run,\n detail.interrupts,\n ),\n coverage: {\n returnedTimelineSteps: timeline.length,\n availableEvents: ordered.length,\n contentIncluded: options.includeContent ?? false,\n },\n };\n };\n const left = side(leftTarget, leftDetail, leftCatalog);\n const right = side(rightTarget, rightDetail, rightCatalog);\n print(\n {\n schemaVersion: 1,\n connection: {\n name: connection.name,\n apiUrl: connection.apiUrl,\n context,\n },\n left,\n right,\n comparison: compareRunAnalysis(left, right),\n note: \"Comparison reports observed differences, not an automated root-cause verdict. Missing or omitted content cannot prove equivalence.\",\n },\n options,\n );\n },\n );\n }\n const list = filters(\n group.command(\"list\").description(\"Read a bounded, filtered page.\"),\n )\n .option(\"--limit <count>\", \"Page size (1–100).\", integer(1, 100), 25)\n .option(\n \"--cursor <offset>\",\n \"Numeric offset returned as nextCursor.\",\n integer(0, Number.MAX_SAFE_INTEGER),\n 0,\n )\n .option(\"--status <status>\", \"Entity status filter.\")\n .option(\"--session <id>\", \"Session filter.\")\n .option(\"--user <id>\", \"User filter.\")\n .option(\"--tenant <id>\", \"Tenant filter.\")\n .option(\"--model <name>\", \"Model filter.\")\n .option(\"--node <id>\", \"Node filter.\")\n .option(\"--tool <name>\", \"Tool name filter.\")\n .addOption(\n new Option(\"--tool-outcome <outcome>\", \"Tool outcome filter.\").choices([\n \"success\",\n \"denied\",\n \"fault\",\n \"cancelled\",\n \"reused\",\n ]),\n )\n .option(\"--q <text>\", \"Search filter.\")\n .option(\"--include-children\", \"Include child workflow runs.\");\n list.action(async (options: ListOptions) => {\n const query: Record<string, string> = timeQuery(options);\n const { connection, client } = await clientFor(options);\n const environment = options.environment ?? connection.environment;\n if (environment) query.env = environment;\n for (const key of [\n \"status\",\n \"workflow\",\n \"session\",\n \"user\",\n \"tenant\",\n \"model\",\n \"node\",\n \"tool\",\n \"toolOutcome\",\n \"q\",\n ] as const) {\n const value = options[key];\n if (value) query[key] = value;\n }\n query.pageSize = String(options.limit);\n query.cursor = String(options.cursor);\n if (options.includeChildren) query.includeChildren = \"true\";\n const path = `/v1/studio/${entity}`;\n const data =\n entity === \"runs\"\n ? await client.get(path, StudioRunsResponseSchema, query)\n : entity === \"sessions\"\n ? await client.get(path, StudioSessionsResponseSchema, query)\n : await client.get(path, StudioInterruptsResponseSchema, query);\n const items =\n \"runs\" in data\n ? data.runs\n : \"sessions\" in data\n ? data.sessions\n : data.interrupts;\n const next = options.cursor + items.length;\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data,\n page: {\n cursor: options.cursor,\n limit: options.limit,\n nextCursor: items.length && next < data.totalCount ? next : null,\n },\n },\n options,\n );\n });\n }\n const workflows = studio\n .command(\"workflows\")\n .description(\"Read declared topology and observed workflow metrics.\");\n filters(\n workflows\n .command(\"list\")\n .description(\"Read workflow topology in a time cohort.\"),\n )\n .option(\"--version <version>\", \"Declared version filter.\")\n .action(async (options: CohortOptions & { version?: string }) => {\n if (options.environment)\n throw new StudioReadError(\n \"unsupported_filter\",\n \"The workflow API does not currently support environment filtering.\",\n );\n const query: Record<string, string> = timeQuery(options);\n if (options.workflow) query.workflow = options.workflow;\n if (options.version) query.version = options.version;\n const { connection, client } = await clientFor(options);\n print(\n {\n schemaVersion: 1,\n connection: connection.name,\n data: await client.get(\n \"/v1/studio/workflows\",\n StudioWorkflowsResponseSchema,\n query,\n ),\n note: \"Workflow metrics span environments; connection environment defaults are not applied by this API.\",\n },\n options,\n );\n });\n};\n","import {\n projectWorkflowCalls,\n type StudioDetailEvent,\n type StudioInterrupt,\n type StudioRun,\n type StudioWorkflow,\n} from \"@kortyx/telemetry-contracts\";\nimport { StudioReadError } from \"./read-client\";\nimport type { StudioTarget } from \"./read-output\";\n\nconst stringValue = (value: unknown): string | undefined =>\n typeof value === \"string\" && value.length > 0 ? value : undefined;\nconst numberValue = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) && value >= 0\n ? value\n : undefined;\nconst recordValue = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n\nexport type StudioTimelineItem = {\n step: number;\n eventId: string;\n at: string;\n kind: \"model\" | \"tool\" | \"interrupt\" | \"resume\" | \"limit\";\n nodeId: string | null;\n workflowId: string;\n durationMs?: number | undefined;\n provider?: string | undefined;\n model?: string | undefined;\n finishReason?: unknown;\n toolName?: string | undefined;\n toolOutcome?: string | undefined;\n toolCallId?: string | undefined;\n input?: unknown;\n output?: unknown;\n interruptId?: string | undefined;\n interruptType?: string | undefined;\n interactionMode?: string | undefined;\n contract?: string | undefined;\n schemaId?: string | undefined;\n schemaVersion?: string | undefined;\n request?: unknown;\n response?: unknown;\n resumeOutcome?: string | undefined;\n limit?: string | undefined;\n consumed?: unknown;\n maximum?: unknown;\n question?: unknown;\n};\n\nconst toolTerminalTypes = new Set([\n \"tool.completed\",\n \"tool.failed\",\n \"tool.denied\",\n \"tool.cancelled\",\n \"tool.reused\",\n]);\n\n/** A compact, non-duplicative execution story derived only from persisted facts. */\nexport const buildStudioTimeline = (\n events: StudioDetailEvent[],\n interrupts: StudioInterrupt[] = [],\n): StudioTimelineItem[] => {\n const interruptById = new Map(interrupts.map((item) => [item.id, item]));\n const items: Omit<StudioTimelineItem, \"step\">[] = [];\n const ordered = [...events].sort(\n (left, right) =>\n Date.parse(left.occurredAt) - Date.parse(right.occurredAt) ||\n Date.parse(left.receivedAt) - Date.parse(right.receivedAt) ||\n left.id.localeCompare(right.id),\n );\n for (const event of ordered) {\n const payload = event.payload;\n const base = {\n eventId: event.id,\n at: event.occurredAt,\n nodeId: event.nodeId,\n workflowId: event.workflowId,\n };\n if (event.type === \"generation.completed\") {\n items.push({\n ...base,\n kind: \"model\",\n ...(numberValue(payload.durationMs) !== undefined\n ? { durationMs: numberValue(payload.durationMs) }\n : {}),\n ...(stringValue(payload.provider)\n ? { provider: stringValue(payload.provider) }\n : {}),\n ...(stringValue(payload.model)\n ? { model: stringValue(payload.model) }\n : {}),\n ...(payload.finishReason !== undefined\n ? { finishReason: payload.finishReason }\n : {}),\n });\n continue;\n }\n if (toolTerminalTypes.has(event.type)) {\n const fallbackOutcome = event.type.slice(\"tool.\".length);\n items.push({\n ...base,\n kind: \"tool\",\n ...(numberValue(payload.durationMs) !== undefined\n ? { durationMs: numberValue(payload.durationMs) }\n : {}),\n ...(stringValue(payload.name) || stringValue(payload.tool)\n ? { toolName: stringValue(payload.name) ?? stringValue(payload.tool) }\n : {}),\n toolOutcome:\n stringValue(payload.outcome) ??\n (fallbackOutcome === \"completed\" ? \"success\" : fallbackOutcome),\n ...(stringValue(payload.toolCallId)\n ? { toolCallId: stringValue(payload.toolCallId) }\n : {}),\n ...(payload.input !== undefined ? { input: payload.input } : {}),\n ...(payload.output !== undefined ? { output: payload.output } : {}),\n });\n continue;\n }\n if (event.type === \"interrupt.created\") {\n const id = stringValue(payload.interruptId);\n const interrupt = id ? interruptById.get(id) : undefined;\n items.push({\n ...base,\n kind: \"interrupt\",\n ...(id ? { interruptId: id } : {}),\n ...(interrupt?.type || stringValue(payload.kind)\n ? { interruptType: interrupt?.type ?? stringValue(payload.kind) }\n : {}),\n ...(interrupt?.interactionMode || stringValue(payload.interactionMode)\n ? {\n interactionMode:\n interrupt?.interactionMode ??\n stringValue(payload.interactionMode),\n }\n : {}),\n ...(interrupt?.contract || stringValue(payload.contract)\n ? { contract: interrupt?.contract ?? stringValue(payload.contract) }\n : {}),\n ...(interrupt?.schemaId || stringValue(payload.schemaId)\n ? { schemaId: interrupt?.schemaId ?? stringValue(payload.schemaId) }\n : {}),\n ...(interrupt?.schemaVersion || stringValue(payload.schemaVersion)\n ? {\n schemaVersion:\n interrupt?.schemaVersion ?? stringValue(payload.schemaVersion),\n }\n : {}),\n ...(payload.request !== undefined ? { request: payload.request } : {}),\n ...(interrupt?.question !== undefined && interrupt.question !== null\n ? { question: interrupt.question }\n : payload.question !== undefined\n ? { question: payload.question }\n : {}),\n });\n continue;\n }\n if (event.type === \"interrupt.resolved\") {\n items.push({\n ...base,\n kind: \"resume\",\n ...(stringValue(payload.interruptId)\n ? { interruptId: stringValue(payload.interruptId) }\n : {}),\n ...(stringValue(payload.resumeOutcome)\n ? { resumeOutcome: stringValue(payload.resumeOutcome) }\n : {}),\n ...(stringValue(payload.contract)\n ? { contract: stringValue(payload.contract) }\n : {}),\n ...(payload.responseValue !== undefined\n ? { response: payload.responseValue }\n : payload.response !== undefined\n ? { response: payload.response }\n : {}),\n });\n continue;\n }\n if (event.type === \"run.limit_reached\") {\n items.push({\n ...base,\n kind: \"limit\",\n ...(stringValue(payload.limit)\n ? { limit: stringValue(payload.limit) }\n : {}),\n ...(payload.consumed !== undefined\n ? { consumed: payload.consumed }\n : {}),\n ...(payload.maximum !== undefined ? { maximum: payload.maximum } : {}),\n });\n }\n }\n return items.map((item, index) => ({ step: index + 1, ...item }));\n};\n\nconst selectedValue = (\n event: StudioDetailEvent,\n key: \"branch\" | \"call\",\n): string[] => {\n const payload = event.payload;\n if (key === \"branch\")\n return [stringValue(payload.branchId)].filter((value): value is string =>\n Boolean(value),\n );\n return [\n stringValue(payload.callId),\n stringValue(payload.invocationId),\n ].filter((value): value is string => Boolean(value));\n};\n\n/** Applies only selectors with execution semantics; UI layout selectors stay contextual. */\nexport const focusStudioEvents = (\n events: StudioDetailEvent[],\n target: StudioTarget,\n): { events: StudioDetailEvent[]; applied: Record<string, string> } => {\n const selection = target.selection ?? {};\n const applied = Object.fromEntries(\n [\"event\", \"trace\", \"node\", \"branch\", \"call\"]\n .filter((key) => Boolean(selection[key]))\n .map((key) => [key, selection[key] as string]),\n );\n if (Object.keys(applied).length === 0)\n throw new StudioReadError(\n \"selection_not_focusable\",\n \"The URL has no event, trace, node, branch, or call selector to focus.\",\n );\n const callEventIds = new Set(\n selection.call\n ? projectWorkflowCalls(events)\n .filter(\n (call) =>\n call.id === selection.call ||\n call.callId === selection.call ||\n call.invocationId === selection.call,\n )\n .flatMap((call) => call.events.map((event) => event.id))\n : [],\n );\n const focused = events.filter((event) =>\n Object.entries(applied).every(([key, value]) => {\n if (key === \"event\") return event.id === value;\n if (key === \"trace\") return event.traceId === value;\n if (key === \"node\") return event.nodeId === value;\n if (key === \"branch\")\n return selectedValue(event, \"branch\").includes(value);\n return (\n callEventIds.has(event.id) ||\n selectedValue(event, \"call\").includes(value)\n );\n }),\n );\n if (focused.length === 0)\n throw new StudioReadError(\n \"selection_not_found\",\n \"The pasted URL selector did not match any returned Studio events.\",\n );\n return { events: focused, applied };\n};\n\nexport type StudioDiagnosticFinding = {\n code: string;\n severity: \"error\" | \"warning\" | \"context\";\n message: string;\n eventIds: string[];\n evidence?: unknown;\n};\n\nconst stableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(stableValue);\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, stableValue(item)]),\n );\n return value;\n};\n\nexport const analyzeStudioDiagnostics = (\n events: StudioDetailEvent[],\n run?: StudioRun | null,\n interrupts: StudioInterrupt[] = [],\n): StudioDiagnosticFinding[] => {\n const findings: StudioDiagnosticFinding[] = [];\n const terminalTools = events.filter((event) =>\n toolTerminalTypes.has(event.type),\n );\n for (let index = 1; index < terminalTools.length; index++) {\n const previous = terminalTools[index - 1];\n const current = terminalTools[index];\n if (!previous || !current) continue;\n const previousName =\n stringValue(previous.payload.name) ?? stringValue(previous.payload.tool);\n const currentName =\n stringValue(current.payload.name) ?? stringValue(current.payload.tool);\n if (\n previousName &&\n previousName === currentName &&\n previous.payload.input !== undefined &&\n current.payload.input !== undefined &&\n JSON.stringify(stableValue(previous.payload.input)) ===\n JSON.stringify(stableValue(current.payload.input))\n ) {\n findings.push({\n code: \"repeated_tool_input\",\n severity: \"warning\",\n message: `Tool ${currentName} was called consecutively with the same captured input.`,\n eventIds: [previous.id, current.id],\n evidence: { toolName: currentName, input: current.payload.input },\n });\n }\n }\n\n let lastInterrupt: StudioDetailEvent | undefined;\n for (const event of events) {\n if (toolTerminalTypes.has(event.type)) lastInterrupt = undefined;\n if (event.type !== \"interrupt.created\") continue;\n if (lastInterrupt)\n findings.push({\n code: \"consecutive_human_interrupts\",\n severity: \"warning\",\n message:\n \"Human input was requested again without an intervening terminal tool event.\",\n eventIds: [lastInterrupt.id, event.id],\n });\n lastInterrupt = event;\n }\n\n for (const event of events.filter(\n (item) => item.type === \"run.limit_reached\",\n ))\n findings.push({\n code: \"tool_step_limit_reached\",\n severity: \"warning\",\n message: \"The runtime reported that an execution limit was reached.\",\n eventIds: [event.id],\n evidence: event.payload,\n });\n\n const schemaFailures = events.filter((event) => {\n if (event.type !== \"span.failed\") return false;\n const error = recordValue(event.payload.error);\n const failure = recordValue(event.payload.failure);\n const haystack = [\n error.code,\n error.message,\n failure.code,\n failure.message,\n event.payload.code,\n event.payload.message,\n ]\n .filter((value): value is string => typeof value === \"string\")\n .join(\" \");\n return /MODEL_OUTPUT_SCHEMA|INVALID_OUTPUT|output (?:schema|validation)|schema validation/i.test(\n haystack,\n );\n });\n for (const failure of schemaFailures) {\n const laterGeneration = events.find(\n (event) =>\n event.type === \"generation.completed\" &&\n Date.parse(event.occurredAt) > Date.parse(failure.occurredAt),\n );\n findings.push({\n code: laterGeneration ? \"output_schema_retry\" : \"output_schema_failure\",\n severity: laterGeneration ? \"warning\" : \"error\",\n message: laterGeneration\n ? \"An output-schema failure was followed by another model generation.\"\n : \"The runtime reported an output-schema validation failure.\",\n eventIds: [failure.id, ...(laterGeneration ? [laterGeneration.id] : [])],\n evidence: failure.payload,\n });\n }\n\n const pending = interrupts.filter((item) => item.status === \"pending\");\n if (run?.status === \"interrupted\" && pending.length > 0)\n findings.push({\n code: \"unresolved_interrupt\",\n severity: \"warning\",\n message: \"The workflow is suspended with unresolved human input.\",\n eventIds: events\n .filter(\n (event) =>\n event.type === \"interrupt.created\" &&\n pending.some((item) => item.id === event.payload.interruptId),\n )\n .map((event) => event.id),\n evidence: { interruptIds: pending.map((item) => item.id) },\n });\n return findings;\n};\n\nexport type CatalogDrift = {\n status: \"current\" | \"drift\" | \"not-published\" | \"unavailable\";\n workflows: Array<{\n workflowId: string;\n executedRevisionId: string | null;\n executedVersion: string | null;\n activeRevisionId: string | null;\n activeVersion: string | null;\n drift: boolean;\n }>;\n reason?: string;\n};\n\nexport const compareCatalogRuntime = (\n run: StudioRun,\n workflows: StudioWorkflow[],\n): CatalogDrift => {\n const rootReferences = run.workflowRefs.filter(\n (reference) => reference.workflowId === run.workflowId,\n );\n const rows = rootReferences.length\n ? rootReferences\n : [\n {\n workflowId: run.workflowId,\n workflowRevisionId: run.workflowRevisionId,\n declaredVersion: run.declaredVersion,\n },\n ];\n const compared = rows.map((reference) => {\n const workflow = workflows.find((item) => item.id === reference.workflowId);\n return {\n workflowId: reference.workflowId,\n executedRevisionId: reference.workflowRevisionId,\n executedVersion: reference.declaredVersion,\n activeRevisionId: workflow?.activeRevisionId ?? null,\n activeVersion: workflow?.activeVersion ?? null,\n drift: Boolean(\n (workflow?.activeRevisionId &&\n reference.workflowRevisionId &&\n workflow.activeRevisionId !== reference.workflowRevisionId) ||\n (!reference.workflowRevisionId &&\n workflow?.activeVersion &&\n reference.declaredVersion &&\n workflow.activeVersion !== reference.declaredVersion),\n ),\n };\n });\n const published = compared.some((item) => item.activeRevisionId);\n return {\n status: !published\n ? \"not-published\"\n : compared.some((item) => item.drift)\n ? \"drift\"\n : \"current\",\n workflows: compared,\n };\n};\n\nexport const compareRunAnalysis = (\n left: {\n run: StudioRun;\n timeline: StudioTimelineItem[];\n catalog: CatalogDrift;\n deploymentRefs?: string[];\n },\n right: {\n run: StudioRun;\n timeline: StudioTimelineItem[];\n catalog: CatalogDrift;\n deploymentRefs?: string[];\n },\n) => {\n const metadataFields = [\n \"workflowId\",\n \"workflowRevisionId\",\n \"declaredVersion\",\n \"environment\",\n \"provider\",\n \"model\",\n \"status\",\n \"result\",\n ] as const;\n const metadata: Array<{ field: string; left: unknown; right: unknown }> =\n metadataFields.flatMap((field) =>\n JSON.stringify(left.run[field]) === JSON.stringify(right.run[field])\n ? []\n : [{ field, left: left.run[field], right: right.run[field] }],\n );\n if (\n JSON.stringify(left.deploymentRefs ?? []) !==\n JSON.stringify(right.deploymentRefs ?? [])\n )\n metadata.push({\n field: \"deploymentRefs\",\n left: left.deploymentRefs ?? [],\n right: right.deploymentRefs ?? [],\n });\n const signature = (item: StudioTimelineItem) =>\n `${item.kind}:${item.toolName ?? item.interruptType ?? item.limit ?? \"\"}`;\n const length = Math.max(left.timeline.length, right.timeline.length);\n const comparable = (item: StudioTimelineItem) => {\n const { step: _step, eventId: _eventId, at: _at, ...rest } = item;\n return rest;\n };\n const timeline = Array.from({ length }, (_, index) => {\n const leftItem = left.timeline[index] ?? null;\n const rightItem = right.timeline[index] ?? null;\n return {\n index: index + 1,\n status:\n leftItem && rightItem\n ? JSON.stringify(comparable(leftItem)) ===\n JSON.stringify(comparable(rightItem))\n ? \"same\"\n : signature(leftItem) === signature(rightItem)\n ? \"changed\"\n : \"diverged\"\n : leftItem\n ? \"removed\"\n : \"added\",\n left: leftItem,\n right: rightItem,\n };\n });\n return {\n metadata,\n timeline,\n firstDivergence:\n timeline.find((item) => item.status !== \"same\")?.index ?? null,\n different:\n metadata.length > 0 || timeline.some((item) => item.status !== \"same\"),\n };\n};\n","import type { StudioDetailEvent } from \"@kortyx/telemetry-contracts\";\nimport { StudioReadError } from \"./read-client\";\n\nexport type StudioEntity = \"runs\" | \"sessions\" | \"interrupts\";\nexport type StudioTarget = {\n entity: StudioEntity;\n id: string;\n url?: string;\n selection?: Record<string, string>;\n};\nexport const parseStudioTarget = (\n input: string,\n entity?: StudioEntity,\n): StudioTarget => {\n if (/^[a-z][a-z0-9+.-]*:/i.test(input)) {\n let url: URL;\n try {\n url = new URL(input);\n } catch {\n throw new StudioReadError(\"invalid_target\", \"Invalid Studio URL.\");\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password\n ) {\n throw new StudioReadError(\n \"invalid_target\",\n \"Use an HTTP(S) Studio entity URL without embedded credentials.\",\n );\n }\n const match = url.pathname.match(\n /\\/(runs|sessions|interrupts)\\/([^/]+)\\/?$/,\n );\n if (!match)\n throw new StudioReadError(\n \"invalid_target\",\n \"Expected a Studio /runs/<id>, /sessions/<id>, or /interrupts/<id> URL.\",\n );\n if (entity && match[1] !== entity)\n throw new StudioReadError(\n \"invalid_target\",\n \"URL entity type does not match the command.\",\n );\n let id: string;\n try {\n id = decodeURIComponent(match[2] ?? \"\");\n } catch {\n throw new StudioReadError(\n \"invalid_target\",\n \"Invalid entity ID encoding.\",\n );\n }\n validateId(id);\n // Preserve navigation context, but never turn URL query parameters into API filters.\n const selection: Record<string, string> = {};\n for (const key of [\n \"tab\",\n \"sessionTab\",\n \"call\",\n \"branch\",\n \"node\",\n \"event\",\n \"trace\",\n \"detailView\",\n ]) {\n const value = url.searchParams.get(key);\n if (value) selection[key] = value;\n }\n // Query strings may contain credentials or arbitrary content. Only retain known UI selectors.\n url.search = \"\";\n url.hash = \"\";\n return {\n entity: match[1] as StudioEntity,\n id,\n url: url.toString(),\n selection,\n };\n }\n if (!entity)\n throw new StudioReadError(\n \"invalid_target\",\n \"inspect requires a Studio entity URL. Use runs/sessions/interrupts get for a bare ID.\",\n );\n validateId(input);\n return { entity, id: input };\n};\nconst validateId = (id: string) => {\n if (\n !id ||\n id.length > 512 ||\n id === \".\" ||\n id === \"..\" ||\n /[\\s/?#\\\\]/.test(id) ||\n [...id].some(\n (char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127,\n )\n ) {\n throw new StudioReadError(\"invalid_target\", \"Invalid Studio entity ID.\");\n }\n};\n\nconst secretKey =\n /(?:password|secret|authorization|cookie|apikey|credential|resumetoken|accesstoken|refreshtoken|bearertoken|sessiontoken|authtoken)/i;\nconst contentKey =\n /^(?:input|output|inputs|outputs|inputmessages|outputmessages|messages|prompt|systemprompt|question|response|result|latestresult|arguments|args|content|text|options)$/i;\nexport const sanitizeStudioData = (\n value: unknown,\n includeContent: boolean,\n key = \"\",\n): unknown => {\n const normalized = key.replace(/[^a-z0-9]/gi, \"\");\n const keyPolicy =\n normalized.toLowerCase() === \"apikey\" &&\n value &&\n typeof value === \"object\" &&\n \"scopes\" in value &&\n \"mode\" in value;\n if (secretKey.test(normalized) && !keyPolicy) return \"[REDACTED]\";\n if (!includeContent && contentKey.test(normalized))\n return \"[CONTENT OMITTED: use --include-content]\";\n if (typeof value === \"string\")\n return value\n .replace(/ktyx_(?:test|live)_[^\\s\"'<>]+/g, \"[REDACTED]\")\n .replace(/Bearer\\s+[A-Za-z0-9._~+/-]+=*/gi, \"Bearer [REDACTED]\");\n if (Array.isArray(value))\n return value.map((item) => sanitizeStudioData(item, includeContent));\n if (value && typeof value === \"object\")\n return Object.fromEntries(\n Object.entries(value).map(([name, item]) => [\n name,\n sanitizeStudioData(item, includeContent, name),\n ]),\n );\n return value;\n};\n\nexport const summarizeEvidence = (events: StudioDetailEvent[]) => {\n const findings = events.flatMap((event) => {\n const payload = event.payload;\n const error =\n payload.error &&\n typeof payload.error === \"object\" &&\n !Array.isArray(payload.error)\n ? (payload.error as Record<string, unknown>)\n : {};\n const suspension =\n event.type === \"span.failed\" &&\n (error.controlFlow === true ||\n [\"GraphInterrupt\", \"NodeInterrupt\", \"ParallelChildWaiting\"].includes(\n String(error.name),\n ));\n const failed =\n !suspension &&\n (/(?:failed|error|fault)/i.test(event.type) ||\n payload.outcome === \"fault\" ||\n payload.status === \"failed\");\n const warning =\n suspension ||\n /(?:retry|cancel|interrupt|limit_reached|denied|suspended|waiting)/i.test(\n event.type,\n ) ||\n [\"denied\", \"cancelled\"].includes(String(payload.outcome));\n if (!failed && !warning) return [];\n return [\n {\n eventId: event.id,\n runId: event.runId,\n nodeId: event.nodeId,\n type: event.type,\n occurredAt: event.occurredAt,\n severity: failed ? \"error\" : \"context\",\n evidence: payload,\n },\n ];\n });\n return {\n findings,\n note: \"Evidence, not an automated root-cause verdict. Interrupts, cancellations, and retries can be expected; correlate with the final run outcome. Missing telemetry does not prove an action did not occur.\",\n };\n};\n\nexport const formatReadOutput = (value: unknown, json: boolean) => {\n if (json) return JSON.stringify(value);\n // Human mode is deliberately unambiguous and pipeable, without terminal UI/spinners.\n return JSON.stringify(value, null, 2);\n};\n","import { randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:net\";\nimport type { CommandResult, StudioRuntime } from \"./types\";\n\nconst stringOutput = (value: unknown): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst isCommandNotFound = (error: unknown): boolean =>\n error instanceof Error &&\n ((\"code\" in error && error.code === \"ENOENT\") ||\n error.message.includes(\"ENOENT\"));\n\nconst run = async (\n command: string,\n args: string[],\n options: { cwd?: string; inherit?: boolean },\n): Promise<CommandResult> => {\n try {\n const { execa } = await import(\"execa\");\n const result = await execa(command, args, {\n ...(options.cwd ? { cwd: options.cwd } : {}),\n stdin: \"inherit\",\n stdout: options.inherit ? \"inherit\" : \"pipe\",\n stderr: options.inherit ? \"inherit\" : \"pipe\",\n });\n return {\n stdout: stringOutput(result.stdout),\n stderr: stringOutput(result.stderr),\n };\n } catch (error) {\n if (isCommandNotFound(error)) {\n throw new Error(\n `Could not run ${command}. Install and start Docker Desktop, then try again.`,\n { cause: error },\n );\n }\n throw error;\n }\n};\n\nconst portAvailable = async (port: number): Promise<boolean> =>\n await new Promise<boolean>((resolvePromise) => {\n const server = createServer();\n server.unref();\n server.once(\"error\", () => resolvePromise(false));\n server.listen({ host: \"127.0.0.1\", port }, () => {\n server.close(() => resolvePromise(true));\n });\n });\n\nexport const defaultStudioRuntime: StudioRuntime = {\n run,\n portAvailable,\n now: () => new Date().toISOString(),\n random: (bytes) => randomBytes(bytes).toString(\"base64url\"),\n request: fetch,\n log: (message = \"\") => console.log(message),\n error: (message = \"\") => console.error(message),\n};\n","import { dirname } from \"node:path\";\nimport type {\n EnsureWorkflowTopologyRequest,\n WorkflowTool,\n} from \"@kortyx/telemetry-contracts\";\nimport ts from \"typescript\";\n\ntype Call = { sourceNodeId: string; targetWorkflowId: string };\ntype NodeTools = {\n tools: WorkflowTool[];\n toolDiscovery: { status: \"complete\" | \"unresolved\"; warnings: string[] };\n};\ntype Bindings = Map<ts.Symbol, ts.Expression>;\n\n/** Source-only discovery: never executes a node, hook, or workflow. */\nexport function discoverWorkflowCalls(\n entry: string,\n snapshots: EnsureWorkflowTopologyRequest[],\n): {\n calls: Map<string, Call[]>;\n tools: Map<string, Map<string, NodeTools>>;\n warnings: string[];\n} {\n const configPath = ts.findConfigFile(dirname(entry), ts.sys.fileExists);\n const config = configPath\n ? ts.readConfigFile(configPath, ts.sys.readFile).config\n : {};\n const parsed = ts.parseJsonConfigFileContent(\n config ?? {},\n ts.sys,\n configPath ? dirname(configPath) : dirname(entry),\n );\n const program = ts.createProgram([entry], {\n ...parsed.options,\n allowJs: true,\n noEmit: true,\n });\n const checker = program.getTypeChecker();\n const known = new Map(\n snapshots.map((s) => [\n s.workflow.id,\n new Set(s.workflow.nodes.map((n) => n.id)),\n ]),\n );\n const calls = new Map<string, Call[]>();\n const warnings = new Set<string>();\n const attachedTools = new Map<string, Map<string, NodeTools>>();\n const definitions = new Map<string, ts.ObjectLiteralExpression[]>();\n const local = (n: ts.Node) =>\n !n.getSourceFile().isDeclarationFile &&\n !n.getSourceFile().fileName.includes(\"node_modules\");\n const symbol = (n: ts.Node): ts.Symbol | undefined => {\n let s = checker.getSymbolAtLocation(n);\n if (\n s?.valueDeclaration &&\n ts.isShorthandPropertyAssignment(s.valueDeclaration)\n )\n s = checker.getShorthandAssignmentValueSymbol(s.valueDeclaration);\n return s && s.flags & ts.SymbolFlags.Alias\n ? checker.getAliasedSymbol(s)\n : s;\n };\n const unwrap = (e: ts.Expression): ts.Expression => {\n while (\n ts.isParenthesizedExpression(e) ||\n ts.isAsExpression(e) ||\n ts.isSatisfiesExpression(e) ||\n ts.isNonNullExpression(e) ||\n ts.isTypeAssertionExpression(e)\n )\n e = e.expression;\n return e;\n };\n const api = (e: ts.Expression, name: string): boolean => {\n e = unwrap(e);\n const s = symbol(ts.isPropertyAccessExpression(e) ? e.name : e);\n if (s?.name !== name) return false;\n return (s.declarations ?? []).some((d) =>\n /(?:node_modules\\/(?:kortyx|@kortyx\\/)|packages\\/(?:core|hooks|sdk)\\/)/.test(\n d.getSourceFile().fileName,\n ),\n );\n };\n const factoryBindings = new WeakMap<ts.Expression, Bindings>();\n function resolve(\n e: ts.Expression | undefined,\n bindings: Bindings,\n seen = new Set<ts.Node>(),\n ): ts.Expression | undefined {\n if (!e) return;\n e = unwrap(e);\n if (seen.has(e)) return;\n seen.add(e);\n if (ts.isIdentifier(e)) {\n const s = symbol(e);\n const bound = s && bindings.get(s);\n if (bound) return resolve(bound, bindings, seen);\n const d = s?.valueDeclaration;\n if (\n d &&\n (ts.isVariableDeclaration(d) || ts.isPropertyAssignment(d)) &&\n d.initializer &&\n (!ts.isVariableDeclaration(d) ||\n (ts.isVariableDeclarationList(d.parent) &&\n (d.parent.flags & ts.NodeFlags.Const) !== 0))\n )\n return resolve(d.initializer, bindings, seen);\n }\n if (ts.isPropertyAccessExpression(e)) {\n const found = property(e.expression, e.name.text, bindings, seen);\n if (found) return resolve(found, bindings, seen);\n const owner = symbol(e.expression);\n const declaration = symbol(e.name)?.valueDeclaration;\n if (\n owner &&\n owner.flags & ts.SymbolFlags.Module &&\n declaration &&\n ts.isVariableDeclaration(declaration)\n )\n return resolve(declaration.initializer, bindings, seen);\n return e;\n }\n if (\n ts.isElementAccessExpression(e) &&\n e.argumentExpression &&\n ts.isStringLiteralLike(e.argumentExpression)\n ) {\n const found = property(\n e.expression,\n e.argumentExpression.text,\n bindings,\n seen,\n );\n return found ? resolve(found, bindings, seen) : e;\n }\n if (ts.isCallExpression(e)) {\n const d = symbol(\n ts.isPropertyAccessExpression(e.expression)\n ? e.expression.name\n : e.expression,\n )?.valueDeclaration;\n const fn =\n d && ts.isFunctionDeclaration(d)\n ? d\n : d &&\n ts.isVariableDeclaration(d) &&\n d.initializer &&\n (ts.isArrowFunction(d.initializer) ||\n ts.isFunctionExpression(d.initializer))\n ? d.initializer\n : undefined;\n if (fn?.body && local(fn)) {\n const bound = new Map(bindings);\n fn.parameters.forEach((p, i) => {\n if (ts.isIdentifier(p.name)) {\n const key = symbol(p.name);\n const arg = e.arguments[i] ?? p.initializer;\n if (key && arg)\n bound.set(key, resolve(arg, bindings, new Set(seen)) ?? arg);\n }\n });\n const returned = ts.isBlock(fn.body)\n ? fn.body.statements\n .filter(ts.isReturnStatement)\n .map((r) => r.expression)\n : [fn.body];\n if (returned.length === 1 && returned[0]) {\n const value = resolve(returned[0], bound, seen);\n if (value) factoryBindings.set(value, bound);\n return value;\n }\n }\n }\n return e;\n }\n function property(\n e: ts.Expression | undefined,\n key: string,\n bindings: Bindings,\n seen = new Set<ts.Node>(),\n ): ts.Expression | undefined {\n const obj = resolve(e, bindings, seen);\n if (!obj || !ts.isObjectLiteralExpression(obj)) return;\n const scoped = factoryBindings.get(obj) ?? bindings;\n // Later properties override earlier spreads/properties.\n for (const p of [...obj.properties].reverse()) {\n if (ts.isSpreadAssignment(p)) {\n const spread = resolve(p.expression, scoped, new Set(seen));\n if (!spread || !ts.isObjectLiteralExpression(spread)) return undefined;\n const found = property(p.expression, key, scoped, new Set(seen));\n if (found) return found;\n } else if (\n p.name &&\n (ts.isIdentifier(p.name) || ts.isStringLiteralLike(p.name)) &&\n p.name.text === key\n ) {\n if (ts.isPropertyAssignment(p))\n return resolve(p.initializer, scoped, new Set(seen));\n if (ts.isShorthandPropertyAssignment(p))\n return resolve(p.name, scoped, new Set(seen));\n }\n }\n return undefined;\n }\n function literal(\n e: ts.Expression | undefined,\n bindings: Bindings,\n ): string | undefined {\n const value = resolve(e, bindings);\n return value && ts.isStringLiteralLike(value) ? value.text : undefined;\n }\n function workflowId(\n e: ts.Expression | undefined,\n bindings: Bindings,\n ): string | undefined {\n const value = resolve(e, bindings);\n if (!value) return;\n if (ts.isStringLiteralLike(value)) return value.text;\n if (ts.isCallExpression(value) && api(value.expression, \"defineWorkflow\"))\n return literal(property(value.arguments[0], \"id\", bindings), bindings);\n return undefined;\n }\n function isHook(e: ts.Expression): boolean {\n if (api(e, \"useWorkflow\")) return true;\n e = unwrap(e);\n const d = symbol(\n ts.isPropertyAccessExpression(e) ? e.name : e,\n )?.valueDeclaration;\n if (\n d &&\n ts.isBindingElement(d) &&\n (d.propertyName?.getText() ?? d.name.getText()) === \"useWorkflow\"\n ) {\n const decl = d.parent.parent;\n if (ts.isVariableDeclaration(decl) && decl.initializer) {\n const value = resolve(decl.initializer, new Map());\n return (\n !!value &&\n ts.isCallExpression(value) &&\n api(value.expression, \"createWorkflowHooks\")\n );\n }\n }\n if (ts.isPropertyAccessExpression(e) && e.name.text === \"useWorkflow\") {\n const value = resolve(e.expression, new Map());\n return (\n !!value &&\n ts.isCallExpression(value) &&\n api(value.expression, \"createWorkflowHooks\")\n );\n }\n const value = resolve(e, new Map());\n return !!value && value !== e && api(value, \"useWorkflow\");\n }\n function functionFor(\n e: ts.Expression,\n ): ts.FunctionLikeDeclaration | undefined {\n const value = resolve(e, new Map());\n if (value && (ts.isArrowFunction(value) || ts.isFunctionExpression(value)))\n return value;\n const d = symbol(\n ts.isPropertyAccessExpression(e) ? e.name : e,\n )?.valueDeclaration;\n return d && (ts.isFunctionDeclaration(d) || ts.isMethodDeclaration(d))\n ? d\n : undefined;\n }\n function recordTools(\n expression: ts.Expression | undefined,\n mode: \"direct\" | \"model\",\n bindings: Bindings,\n workflow: string,\n node: string,\n list = false,\n seen = new Set<ts.Node>(),\n ) {\n const byNode = attachedTools.get(workflow) ?? new Map<string, NodeTools>();\n attachedTools.set(workflow, byNode);\n const target = byNode.get(node) ?? {\n tools: [],\n toolDiscovery: { status: \"complete\" as const, warnings: [] },\n };\n byNode.set(node, target);\n const unresolved = () => {\n target.toolDiscovery.status = \"unresolved\";\n const warning = `${workflow}/${node}: tool attachment is not statically resolved; real execution supplies observed tools.`;\n if (!target.toolDiscovery.warnings.includes(warning))\n target.toolDiscovery.warnings.push(warning);\n warnings.add(warning);\n };\n const value = resolve(expression, bindings);\n if (!value || seen.has(value)) {\n unresolved();\n return;\n }\n seen.add(value);\n if (list && ts.isArrayLiteralExpression(value)) {\n for (const item of value.elements) {\n if (ts.isSpreadElement(item))\n recordTools(\n item.expression,\n mode,\n bindings,\n workflow,\n node,\n true,\n new Set(seen),\n );\n else\n recordTools(\n item,\n mode,\n bindings,\n workflow,\n node,\n false,\n new Set(seen),\n );\n }\n return;\n }\n if (list) {\n unresolved();\n return;\n }\n const name = literal(property(value, \"name\", bindings), bindings);\n if (!name) {\n unresolved();\n return;\n }\n const description = literal(\n property(value, \"description\", bindings),\n bindings,\n );\n const schema = property(value, \"inputSchema\", bindings);\n const fields = resolve(property(schema, \"properties\", bindings), bindings);\n const requiredValue = resolve(\n property(schema, \"required\", bindings),\n bindings,\n );\n const required =\n requiredValue && ts.isArrayLiteralExpression(requiredValue)\n ? requiredValue.elements.map((entry) => literal(entry, bindings))\n : [];\n const inputFields =\n fields && ts.isObjectLiteralExpression(fields)\n ? fields.properties.flatMap((field) => {\n if (\n !ts.isPropertyAssignment(field) ||\n !(\n ts.isIdentifier(field.name) ||\n ts.isStringLiteralLike(field.name)\n )\n )\n return [];\n return [\n {\n name: field.name.text,\n type:\n literal(\n property(field.initializer, \"type\", bindings),\n bindings,\n ) ?? \"unknown\",\n required: required.includes(field.name.text),\n },\n ];\n })\n : [];\n if (\n !target.tools.some(\n (tool) => tool.name === name && tool.callingMode === mode,\n )\n )\n target.tools.push({\n name,\n callingMode: mode,\n provenance: \"source\",\n ...(description ? { description } : {}),\n ...(inputFields.length ? { inputFields } : {}),\n });\n }\n function scanFunction(\n fn: ts.FunctionLikeDeclaration,\n bindings: Bindings,\n workflow: string,\n node: string,\n stack: Set<ts.Node>,\n ) {\n if (!fn.body || !local(fn) || stack.has(fn)) return;\n if (stack.size >= 32) {\n warnings.add(\n `${workflow}/${node}: custom-hook discovery depth exceeded.`,\n );\n const attached = attachedTools.get(workflow)?.get(node);\n if (attached) {\n attached.toolDiscovery.status = \"unresolved\";\n attached.toolDiscovery.warnings.push(\n \"Custom-hook discovery depth exceeded.\",\n );\n }\n return;\n }\n const next = new Set(stack).add(fn);\n const walk = (n: ts.Node) => {\n if (ts.isFunctionDeclaration(n)) return; // Follow helpers at their call sites.\n if (\n ts.isVariableDeclaration(n) &&\n n.initializer &&\n (ts.isArrowFunction(n.initializer) ||\n ts.isFunctionExpression(n.initializer))\n )\n return;\n if (ts.isCallExpression(n)) {\n if (api(n.expression, \"useTool\")) {\n recordTools(\n property(n.arguments[0], \"tool\", bindings),\n \"direct\",\n bindings,\n workflow,\n node,\n );\n } else if (api(n.expression, \"useReason\")) {\n const list = property(n.arguments[0], \"tools\", bindings);\n if (list) recordTools(list, \"model\", bindings, workflow, node, true);\n } else if (isHook(n.expression)) {\n const target = workflowId(\n property(n.arguments[0], \"workflow\", bindings),\n bindings,\n );\n if (target && known.has(target)) {\n const list = calls.get(workflow) ?? [];\n if (\n !list.some(\n (c) => c.sourceNodeId === node && c.targetWorkflowId === target,\n )\n )\n list.push({ sourceNodeId: node, targetWorkflowId: target });\n calls.set(workflow, list);\n } else {\n const pos = n\n .getSourceFile()\n .getLineAndCharacterOfPosition(n.getStart());\n warnings.add(\n `${workflow}/${node}: unresolved or unregistered child target at ${n.getSourceFile().fileName}:${pos.line + 1}; runtime observations will supply dynamic targets.`,\n );\n }\n } else {\n const helper = functionFor(n.expression);\n if (helper && local(helper)) {\n const bound = new Map(bindings);\n helper.parameters.forEach((p, i) => {\n const arg = n.arguments[i];\n if (!arg) return;\n if (ts.isIdentifier(p.name)) {\n const s = symbol(p.name);\n if (s) bound.set(s, resolve(arg, bindings) ?? arg);\n } else if (ts.isObjectBindingPattern(p.name)) {\n for (const b of p.name.elements) {\n const value = property(\n arg,\n b.propertyName?.getText() ?? b.name.getText(),\n bindings,\n );\n const s = symbol(b.name);\n if (s && value)\n bound.set(s, resolve(value, bindings) ?? value);\n }\n }\n });\n scanFunction(helper, bound, workflow, node, next);\n }\n }\n }\n ts.forEachChild(n, walk);\n };\n walk(fn.body);\n }\n for (const source of program.getSourceFiles().filter(local)) {\n const walk = (n: ts.Node) => {\n if (ts.isCallExpression(n) && api(n.expression, \"defineWorkflow\")) {\n const obj = resolve(n.arguments[0], new Map());\n const id = obj && literal(property(obj, \"id\", new Map()), new Map());\n if (id && known.has(id) && obj && ts.isObjectLiteralExpression(obj))\n definitions.set(id, [...(definitions.get(id) ?? []), obj]);\n }\n ts.forEachChild(n, walk);\n };\n walk(source);\n }\n for (const [id, nodes] of known) {\n attachedTools.set(\n id,\n new Map(\n [...nodes].map((node) => [\n node,\n { tools: [], toolDiscovery: { status: \"complete\", warnings: [] } },\n ]),\n ),\n );\n const defs = definitions.get(id) ?? [];\n if (defs.length !== 1) {\n warnings.add(\n `${id}: ${defs.length ? \"ambiguous\" : \"unavailable\"} workflow source; child-call discovery skipped.`,\n );\n for (const node of attachedTools.get(id)?.values() ?? []) {\n node.toolDiscovery.status = \"unresolved\";\n node.toolDiscovery.warnings.push(\n \"Workflow source unavailable or ambiguous.\",\n );\n }\n continue;\n }\n calls.set(id, []);\n const bindings = new Map<ts.Symbol, ts.Expression>();\n const obj = property(defs[0], \"nodes\", bindings);\n for (const node of nodes) {\n const run = property(property(obj, node, bindings), \"run\", bindings);\n const fn = run && functionFor(run);\n if (fn) scanFunction(fn, bindings, id, node, new Set());\n else {\n const tools = attachedTools.get(id)?.get(node);\n if (tools) {\n tools.toolDiscovery.status = \"unresolved\";\n tools.toolDiscovery.warnings.push(\"Node source unavailable.\");\n }\n warnings.add(\n `${id}/${node}: node source unavailable; child-call discovery skipped.`,\n );\n }\n }\n calls\n .get(id)\n ?.sort(\n (a, b) =>\n a.sourceNodeId.localeCompare(b.sourceNodeId) ||\n a.targetWorkflowId.localeCompare(b.targetWorkflowId),\n );\n }\n for (const nodes of attachedTools.values())\n for (const node of nodes.values())\n node.tools.sort(\n (a, b) =>\n a.name.localeCompare(b.name) ||\n a.callingMode.localeCompare(b.callingMode),\n );\n return { calls, tools: attachedTools, warnings: [...warnings].sort() };\n}\n"],"mappings":"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","names":["import_promises","import_node_os","import_node_path","import_telemetry_contracts","import_commander","import_telemetry_contracts","import_promises","import_node_os","import_node_path","import_zod","value","profile","profile","import_commander","import_promises","import_telemetry_contracts","import_telemetry_contracts","import_commander","import_telemetry_contracts","run","run","workflows","import_node_crypto","import_node_path","ts","resolve","value","entry","run","Module","module","tsxRequire"]}