@skaile/workspaces 0.9.1 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +2 -2
  3. package/dist/asset-manager/index.js +2 -2
  4. package/dist/asset-manager/scaffold.js +1 -1
  5. package/dist/base-assets/connectors/deploy.js +1 -1
  6. package/dist/base-assets/connectors/devserver.js +1 -1
  7. package/dist/base-assets/connectors/flow/adapter.js +1 -1
  8. package/dist/base-assets/connectors/flow/run-flow.js +2 -2
  9. package/dist/base-assets/connectors/flow.js +1 -1
  10. package/dist/base-assets/connectors/git.js +1 -1
  11. package/dist/base-assets/connectors/gmail.js +1 -1
  12. package/dist/base-assets/connectors/local.js +1 -1
  13. package/dist/base-assets/connectors/mattermost.js +1 -1
  14. package/dist/base-assets/connectors/memory.js +1 -1
  15. package/dist/base-assets/connectors/minio.js +1 -1
  16. package/dist/base-assets/connectors/postgres.js +1 -1
  17. package/dist/base-assets/connectors/redis.js +1 -1
  18. package/dist/base-assets/connectors/s3.js +1 -1
  19. package/dist/base-assets/connectors/sharepoint.js +1 -1
  20. package/dist/base-assets/connectors/sqlite.js +1 -1
  21. package/dist/base-assets/connectors/static-server.js +1 -1
  22. package/dist/base-assets/connectors/tunnel.js +1 -1
  23. package/dist/base-assets/connectors/webdav.js +1 -1
  24. package/dist/base-assets/connectors/xstate-store.js +1 -1
  25. package/dist/base-assets/connectors/xstate.js +1 -1
  26. package/dist/base-assets/connectors/yjs.js +1 -1
  27. package/dist/bridge/drivers/claude-sdk.js +53 -3
  28. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  29. package/dist/bridge/drivers/codex.js +1 -1
  30. package/dist/bridge/drivers/echo.js +1 -1
  31. package/dist/bridge/drivers/omp.js +1 -1
  32. package/dist/bridge/index.js +2 -2
  33. package/dist/bridge/src/drivers/claude-sdk.d.ts +23 -0
  34. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  35. package/dist/{chunk-5IC6CJL4.js → chunk-BTKNSMLK.js} +2 -2
  36. package/dist/{chunk-5IC6CJL4.js.map → chunk-BTKNSMLK.js.map} +1 -1
  37. package/dist/{chunk-TODD4VNR.js → chunk-D3VO6WNC.js} +85 -3
  38. package/dist/chunk-D3VO6WNC.js.map +1 -0
  39. package/dist/{chunk-I3S4BAAR.js → chunk-FEBLE7QX.js} +2 -2
  40. package/dist/{chunk-I3S4BAAR.js.map → chunk-FEBLE7QX.js.map} +1 -1
  41. package/dist/{chunk-DTL7S57T.js → chunk-IFRUVHOQ.js} +3 -3
  42. package/dist/{chunk-DTL7S57T.js.map → chunk-IFRUVHOQ.js.map} +1 -1
  43. package/dist/{chunk-XIVOEUAF.js → chunk-OQIBHB4F.js} +2 -2
  44. package/dist/{chunk-XIVOEUAF.js.map → chunk-OQIBHB4F.js.map} +1 -1
  45. package/dist/{chunk-K3TMZI6D.js → chunk-OSJH4SPO.js} +3 -3
  46. package/dist/{chunk-K3TMZI6D.js.map → chunk-OSJH4SPO.js.map} +1 -1
  47. package/dist/{chunk-QZ6PY73K.js → chunk-OVM36NYF.js} +18 -23
  48. package/dist/chunk-OVM36NYF.js.map +1 -0
  49. package/dist/{chunk-AE6GCXGL.js → chunk-S7RACIZI.js} +2 -2
  50. package/dist/{chunk-AE6GCXGL.js.map → chunk-S7RACIZI.js.map} +1 -1
  51. package/dist/{chunk-O5AE4QDX.js → chunk-TDSRLMDB.js} +4 -4
  52. package/dist/chunk-TDSRLMDB.js.map +1 -0
  53. package/dist/{chunk-EPGHAOEU.js → chunk-UHSC75L7.js} +19 -3
  54. package/dist/chunk-UHSC75L7.js.map +1 -0
  55. package/dist/chunk-W3UDISS2.js +31 -0
  56. package/dist/chunk-W3UDISS2.js.map +1 -0
  57. package/dist/cli/index.js +11 -10
  58. package/dist/cli/index.js.map +1 -1
  59. package/dist/connectors/index.js +1 -1
  60. package/dist/connectors/src/connector-manager.d.ts +7 -0
  61. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  62. package/dist/runner/index.js +7 -6
  63. package/dist/runner/prompt-assembly.js +4 -0
  64. package/dist/runner/prompt-assembly.js.map +1 -0
  65. package/dist/runner/src/capability-registry.d.ts.map +1 -1
  66. package/dist/runner/src/capability-roundtrip.d.ts +18 -0
  67. package/dist/runner/src/capability-roundtrip.d.ts.map +1 -1
  68. package/dist/runner/src/define-capability.d.ts +7 -0
  69. package/dist/runner/src/define-capability.d.ts.map +1 -1
  70. package/dist/runner/src/prompt-assembly.d.ts +39 -0
  71. package/dist/runner/src/prompt-assembly.d.ts.map +1 -1
  72. package/dist/runner/src/serve.d.ts.map +1 -1
  73. package/dist/sdk/asset-manager.js +2 -2
  74. package/dist/sdk/bridge.js +2 -2
  75. package/dist/sdk/index.js +7 -6
  76. package/dist/sdk/index.js.map +1 -1
  77. package/dist/sdk/runner.js +7 -6
  78. package/dist/sdk/session.js +2 -2
  79. package/dist/sdk/types.js +1 -1
  80. package/dist/session/index.js +2 -2
  81. package/dist/session/src/dispatcher.d.ts +57 -0
  82. package/dist/session/src/dispatcher.d.ts.map +1 -1
  83. package/dist/{setup-PHFPBDBI.js → setup-QIEPIYH2.js} +4 -4
  84. package/dist/{setup-PHFPBDBI.js.map → setup-QIEPIYH2.js.map} +1 -1
  85. package/dist/tui/index.js +7 -6
  86. package/dist/tui/index.js.map +1 -1
  87. package/dist/types/index.js +1 -1
  88. package/dist/types/src/capabilities.d.ts +13 -0
  89. package/dist/types/src/capabilities.d.ts.map +1 -1
  90. package/dist/types/src/events.d.ts +29 -1
  91. package/dist/types/src/events.d.ts.map +1 -1
  92. package/dist/types/src/index.d.ts +1 -1
  93. package/dist/types/src/index.d.ts.map +1 -1
  94. package/dist/types/src/version.d.ts +19 -1
  95. package/dist/types/src/version.d.ts.map +1 -1
  96. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  97. package/dist/workspace-plugin/index.js +1 -1
  98. package/package.json +7 -1
  99. package/dist/chunk-EPGHAOEU.js.map +0 -1
  100. package/dist/chunk-O5AE4QDX.js.map +0 -1
  101. package/dist/chunk-QZ6PY73K.js.map +0 -1
  102. package/dist/chunk-TODD4VNR.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../asset-manager/src/scaffold/layers/base.ts","../asset-manager/src/scaffold/layers/container.ts","../asset-manager/src/scaffold/layers/driver-target.ts","../asset-manager/src/scaffold/layers/hooks.ts","../asset-manager/src/scaffold/layers/connectors.ts","../asset-manager/src/scaffold/layers/skills.ts","../asset-manager/src/scaffold/layers/template.ts","../asset-manager/src/scaffold/scaffolder.ts"],"names":["basename","join","existsSync","writeFileSync","mkdirSync","dirname","readFileSync","readdirSync"],"mappings":"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","file":"chunk-XIVOEUAF.js","sourcesContent":["/**\n * Base layer — creates .skaile/ directory, settings.json, and skaile.yaml.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { AiResourcesLayerConfig, ScaffoldOptions } from \"../types.js\";\n\n/**\n * Apply the base scaffold layer — creates `.skaile/`, `settings.json`, and `skaile.yaml`.\n *\n * @param dest - Absolute path to the workspace root to create.\n * @param aiResources - AI resource config from the template manifest (sources, requires).\n * @param templateSettings - Template-default settings merged under user overrides.\n * @param framework - Default agent framework written to `skaile.yaml` `agent-config`.\n * @param opts - Full scaffold options (provides name, settings, resources, requires overrides).\n * @returns Array of created file/directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyBaseLayer(\n dest: string,\n aiResources: AiResourcesLayerConfig | undefined,\n templateSettings: Record<string, unknown> | undefined,\n framework: string,\n opts: ScaffoldOptions,\n): string[] {\n const created: string[] = [];\n\n // Create workspace root\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n created.push(\".\");\n }\n\n // Create .skaile/ directory\n const skaileDir = join(dest, \".skaile\");\n if (!existsSync(skaileDir)) {\n mkdirSync(skaileDir, { recursive: true });\n created.push(\".skaile/\");\n }\n\n // Create .skaile/sessions/ directory\n const sessionsDir = join(skaileDir, \"sessions\");\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n created.push(\".skaile/sessions/\");\n }\n\n // Write settings.json (merge template defaults + user overrides)\n const settingsPath = join(skaileDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n const settings = {\n ...(templateSettings ?? {}),\n ...(opts.settings ?? {}),\n };\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n created.push(\".skaile/settings.json\");\n }\n\n // Write skaile.yaml (unified workspace config)\n const sources = opts.resources ?? aiResources?.resources ?? [];\n const requires = opts.requires ?? aiResources?.requires ?? [];\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n const projectName = opts.name ?? basename(dest);\n\n // Build ai_resources as array with dependencies on first source\n const aiResourceEntries = sources.map((r, i) => {\n const entry: Record<string, unknown> = { name: r.name, path: r.path };\n if (r.branch) entry.branch = r.branch;\n if (i === 0 && requires.length > 0) entry.dependencies = requires;\n return entry;\n });\n\n const wsConfig: Record<string, unknown> = {\n name: projectName,\n description: `${projectName} AI skill dependencies`,\n \"agent-config\": {\n default: {\n agent: framework,\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n driver: \"claude-sdk\",\n max_turns: 200,\n },\n },\n ai_resources: aiResourceEntries,\n };\n writeFileSync(wsConfigPath, stringify(wsConfig));\n created.push(\"skaile.yaml\");\n }\n\n return created;\n}\n","/**\n * Container layer — generates Dockerfile and docker-compose.yml for\n * containerized agent workspaces.\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { ContainerLayerConfig } from \"../types.js\";\n\n/**\n * Apply the container scaffold layer — generates `Dockerfile`, `docker-compose.yml`, and `.dockerignore`.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Container layer configuration from the template manifest or `ScaffoldOptions.docker`.\n * @param projectName - Project name used as the docker-compose service name.\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyContainerLayer(\n dest: string,\n config: ContainerLayerConfig | undefined,\n projectName?: string,\n): string[] {\n const created: string[] = [];\n if (!config?.enabled) return created;\n\n const name = projectName ?? basename(dest);\n const baseImage = config.baseImage ?? \"node:22-alpine\";\n const wsPort = config.wsPort ?? 3100;\n\n // Generate Dockerfile\n const dockerfilePath = join(dest, \"Dockerfile\");\n if (!existsSync(dockerfilePath)) {\n const dockerfile = generateDockerfile(baseImage, config, wsPort);\n writeFileSync(dockerfilePath, dockerfile);\n created.push(\"Dockerfile\");\n }\n\n // Generate docker-compose.yml\n const composePath = join(dest, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n const compose = generateCompose(name, config, wsPort);\n writeFileSync(composePath, compose);\n created.push(\"docker-compose.yml\");\n }\n\n // Generate .dockerignore\n const dockerignorePath = join(dest, \".dockerignore\");\n if (!existsSync(dockerignorePath)) {\n writeFileSync(\n dockerignorePath,\n [\"node_modules\", \".git\", \".skaile/sessions\", \"*.log\", \".env.local\", \"\"].join(\"\\n\"),\n );\n created.push(\".dockerignore\");\n }\n\n return created;\n}\n\nfunction generateDockerfile(\n baseImage: string,\n config: ContainerLayerConfig,\n wsPort: number,\n): string {\n const lines: string[] = [`FROM ${baseImage}`, \"\", \"# System packages\"];\n\n // System packages\n const packages = [\"git\", \"curl\", ...(config.packages ?? [])];\n if (baseImage.includes(\"alpine\")) {\n lines.push(`RUN apk add --no-cache ${packages.join(\" \")}`);\n } else {\n lines.push(\n `RUN apt-get update && apt-get install -y ${packages.join(\" \")} && rm -rf /var/lib/apt/lists/*`,\n );\n }\n lines.push(\"\");\n\n // Agent CLIs\n if (config.agents && config.agents.length > 0) {\n lines.push(\"# Agent CLIs\");\n for (const agent of config.agents) {\n lines.push(`RUN npm install -g ${agent}`);\n }\n lines.push(\"\");\n }\n\n // Working directory\n lines.push(\"WORKDIR /workspace\");\n lines.push(\"\");\n\n // Copy workspace files\n lines.push(\"# Copy workspace configuration\");\n lines.push(\"COPY skaile.yaml ./\");\n lines.push(\"COPY .skaile/ ./.skaile/\");\n lines.push(\"\");\n\n // Ports\n const ports = [String(wsPort), ...(config.ports ?? [])];\n for (const port of ports) {\n lines.push(`EXPOSE ${port}`);\n }\n lines.push(\"\");\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\"# Environment\");\n for (const envVar of config.env) {\n lines.push(`ENV ${envVar}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"# Default entrypoint — override in compose or at runtime\");\n lines.push('ENTRYPOINT [\"sh\", \"-c\"]');\n lines.push('CMD [\"echo Agent workspace ready && exec sh\"]');\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateCompose(name: string, config: ContainerLayerConfig, wsPort: number): string {\n const serviceName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];\n\n const lines: string[] = [\n \"services:\",\n ` ${serviceName}:`,\n \" build: .\",\n ` container_name: ${serviceName}`,\n ];\n\n // Ports\n if (ports.length > 0) {\n lines.push(\" ports:\");\n for (const port of ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n // Volumes / mounts\n if (config.mounts && config.mounts.length > 0) {\n lines.push(\" volumes:\");\n for (const mount of config.mounts) {\n if (mount.type === \"bind\") {\n lines.push(` - ${mount.source}:${mount.target}`);\n } else {\n lines.push(` - ${mount.source}:${mount.target}`);\n }\n }\n }\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\" environment:\");\n for (const envVar of config.env) {\n if (envVar.includes(\"=\")) {\n lines.push(` - ${envVar}`);\n } else {\n lines.push(` - ${envVar}`);\n }\n }\n }\n\n lines.push(\" restart: unless-stopped\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Driver target layer — creates agent-specific directories (.claude/, .omp/, etc.)\n * based on the DRIVER_TARGETS configuration.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { DriverTargetLayerConfig } from \"../types.js\";\n\n/**\n * Apply the driver-target scaffold layer — creates framework-specific directories (`.claude/`, `.omp/`, etc.).\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Driver target layer configuration from the template manifest.\n * @param driverTargetOverride - Overrides `config[\"default-target\"]` when provided.\n * @returns Array of created directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyDriverTargetLayer(\n dest: string,\n config: DriverTargetLayerConfig | undefined,\n driverTargetOverride?: DriverTarget,\n): string[] {\n const created: string[] = [];\n const driverTarget = (driverTargetOverride ??\n config?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n\n const targetMap = DRIVER_TARGETS[driverTarget];\n if (!targetMap) return created;\n\n // Create all local deploy target directories\n const dirsToCreate = new Set<string>();\n for (const dir of Object.values(targetMap.local)) {\n dirsToCreate.add(dir);\n }\n\n // Add extras from template\n if (config?.extras) {\n for (const extra of config.extras) {\n dirsToCreate.add(extra);\n }\n }\n\n for (const dir of dirsToCreate) {\n const fullPath = join(dest, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(`${dir}/`);\n }\n }\n\n return created;\n}\n","/**\n * Hooks layer — git init, .gitignore generation, and post-scaffold setup scripts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { HooksLayerConfig } from \"../types.js\";\n\n/** Result of the hooks scaffold layer. */\nexport interface HooksResult {\n /** Paths to files and directories created by this layer, relative to the workspace root. */\n created: string[];\n /** Non-fatal warnings collected during hook execution (e.g. failed setup scripts). */\n warnings: string[];\n}\n\n/**\n * Apply the hooks scaffold layer — runs `git init`, appends `.gitignore` entries, and executes setup scripts.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Hooks layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link HooksResult} with created file paths and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyHooksLayer(\n dest: string,\n config: HooksLayerConfig | undefined,\n log?: (msg: string) => void,\n): HooksResult {\n const result: HooksResult = { created: [], warnings: [] };\n if (!config) return result;\n\n // Git init\n if (config.gitInit) {\n const gitDir = join(dest, \".git\");\n if (!existsSync(gitDir)) {\n try {\n execSync(\"git init\", { cwd: dest, stdio: \"pipe\" });\n result.created.push(\".git/\");\n log?.(\"Initialized git repository\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`git init failed: ${msg}`);\n }\n }\n }\n\n // .gitignore\n if (config.gitignore && config.gitignore.length > 0) {\n const gitignorePath = join(dest, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = readFileSync(gitignorePath, \"utf-8\");\n }\n\n const existingLines = new Set(existing.split(\"\\n\").map((l) => l.trim()));\n const newEntries = config.gitignore.filter((e) => !existingLines.has(e));\n\n if (newEntries.length > 0) {\n const append = `${(existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + newEntries.join(\"\\n\")}\\n`;\n writeFileSync(gitignorePath, existing + append);\n if (!existingLines.size) {\n result.created.push(\".gitignore\");\n }\n }\n }\n\n // Setup scripts\n if (config.setupScripts) {\n for (const script of config.setupScripts) {\n try {\n log?.(`Running setup script: ${script.name}`);\n const cwd = script.cwd ? join(dest, script.cwd) : dest;\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true });\n }\n execSync(script.run, {\n cwd,\n stdio: \"pipe\",\n timeout: 60_000,\n env: { ...process.env, WORKSPACE_DIR: dest },\n });\n log?.(`Setup script \"${script.name}\" completed`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Setup script \"${script.name}\" failed: ${msg}`);\n }\n }\n }\n\n return result;\n}\n","/**\n * Connectors layer — writes connector declarations to skaile.yaml\n * and creates mount directories for mountable connectors.\n *\n * Actual sync/connect happens at runtime (in the runner), not at scaffold time.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { WorkspaceYamlEditor } from \"@skaile/workspaces/core\";\nimport type { ConnectorEntry } from \"../types.js\";\n\n/**\n * Apply the connectors scaffold layer — writes connector declarations to `skaile.yaml` and creates mount directories.\n *\n * @param dest - Absolute path to the workspace root.\n * @param connectors - Connector entries from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of created mount directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyConnectorsLayer(\n dest: string,\n connectors: ConnectorEntry[] | undefined | null,\n log?: (msg: string) => void,\n): string[] {\n const created: string[] = [];\n const entries: ConnectorEntry[] = Array.isArray(connectors) ? connectors : [];\n if (!entries.length) return created;\n\n // Write connectors to skaile.yaml\n const yamlPath = join(dest, \"skaile.yaml\");\n if (existsSync(yamlPath)) {\n const editor = WorkspaceYamlEditor.load(yamlPath);\n for (const r of entries) {\n editor.setConnector({\n id: r.id,\n driver: r.driver,\n access: r.access ?? \"read-only\",\n auth: r.auth,\n options: r.options,\n });\n }\n editor.save();\n log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);\n } else {\n log?.(\"Skipping connector write: skaile.yaml not found (base layer should create it first)\");\n }\n\n // Create mount directories for connectors that have autoMount or mountPath\n for (const connector of entries) {\n if (connector.autoMount === false) continue;\n const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;\n const absMount = join(dest, mountPath);\n if (!existsSync(absMount)) {\n mkdirSync(absMount, { recursive: true });\n created.push(`${mountPath}/`);\n log?.(`Created mount dir: ${mountPath}`);\n }\n }\n\n return created;\n}\n","/**\n * Skills layer — installs AI resources into the workspace using the asset manager.\n *\n * Now that this layer lives inside @skaile/asset-manager, the AssetManager class\n * is loaded via a lazy import from the parent package index (no more dynamic\n * external dependency hack).\n *\n * When a scopeDir is specified, the asset manager operates against that directory\n * instead of the default project directory.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillsLayerConfig } from \"../types.js\";\n\n/** Result of the skills scaffold layer. */\nexport interface SkillsInstallResult {\n /** Asset refs (`kind:name`) installed by `skaile install` during scaffolding. */\n installed: string[];\n /** Non-fatal warnings (e.g. `skaile.yaml` not found, install failure). */\n warnings: string[];\n}\n\n/**\n * Lazy-load AssetManager from the parent package index.\n * Returns null if not available (should not happen in normal operation).\n */\nasync function loadAssetManager(): Promise<any | null> {\n try {\n const mod = await import(\"../../index.js\");\n return mod.AssetManager ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply the skills scaffold layer — runs `skaile install` to deploy all declared asset dependencies.\n *\n * Only runs when `config.autoInstall` is `true`. Skips silently when `skaile.yaml` is absent.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Skills layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link SkillsInstallResult} with installed refs and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport async function applySkillsLayer(\n dest: string,\n config: SkillsLayerConfig | undefined,\n log?: (msg: string) => void,\n): Promise<SkillsInstallResult> {\n const result: SkillsInstallResult = { installed: [], warnings: [] };\n if (!config?.autoInstall) return result;\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n result.warnings.push(\"Skipping skill install: skaile.yaml not found\");\n return result;\n }\n\n const AssetManager = await loadAssetManager();\n if (!AssetManager) {\n result.warnings.push(\n \"Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually.\",\n );\n return result;\n }\n\n try {\n log?.(\"Installing AI resources...\");\n\n const am = new AssetManager({ projectDir: dest });\n const installResult = await am.install();\n\n if (Array.isArray(installResult)) {\n result.installed = installResult;\n } else if (installResult?.deployed) {\n result.installed = installResult.deployed;\n }\n\n log?.(`Installed ${result.installed.length} skill(s)`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Skill install failed: ${msg}`);\n }\n\n return result;\n}\n","/**\n * Template layer — applies agent definition files (SOUL.md, RULES.md, knowledge/)\n * and any additional template files.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { TemplateLayerConfig } from \"../types.js\";\n\n/** Recursively copy a directory, skipping files that already exist at dest. */\nfunction copyDirSkipExisting(src: string, dest: string, created: string[], baseDest: string): void {\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n for (const entry of readdirSync(src, { withFileTypes: true })) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, baseDest);\n } else if (!existsSync(destPath)) {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(relative(baseDest, destPath));\n }\n }\n}\n\n/**\n * Apply the template overlay layer — copies agent definition files (`SOUL.md`, `RULES.md`, `knowledge/`) and additional static template files into the workspace.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Template layer configuration from the template manifest.\n * @param templateDir - Absolute path to the template directory (used to resolve relative `files[].src` paths).\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyTemplateLayer(\n dest: string,\n config: TemplateLayerConfig | undefined,\n templateDir?: string,\n): string[] {\n const created: string[] = [];\n if (!config) return created;\n\n // Apply agent definition from agentDir\n if (config.agentDir) {\n const agentDir = config.agentDir;\n if (existsSync(agentDir)) {\n // Copy SOUL.md, RULES.md, DUTIES.md\n for (const file of [\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]) {\n const src = join(agentDir, file);\n const destFile = join(dest, \".skaile\", \"agent\", file);\n if (existsSync(src) && !existsSync(destFile)) {\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(src, destFile);\n created.push(relative(dest, destFile));\n }\n }\n\n // Copy knowledge/ directory\n const knowledgeSrc = join(agentDir, \"knowledge\");\n if (existsSync(knowledgeSrc)) {\n const knowledgeDest = join(dest, \".skaile\", \"agent\", \"knowledge\");\n copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);\n }\n\n // Copy skills/ directory from agent def\n const skillsSrc = join(agentDir, \"skills\");\n if (existsSync(skillsSrc)) {\n const skillsDest = join(dest, \".skaile\", \"agent\", \"skills\");\n copyDirSkipExisting(skillsSrc, skillsDest, created, dest);\n }\n }\n }\n\n // Write inline soul/rules content\n if (config.soul) {\n const soulPath = join(dest, \".skaile\", \"agent\", \"SOUL.md\");\n if (!existsSync(soulPath)) {\n mkdirSync(dirname(soulPath), { recursive: true });\n writeFileSync(soulPath, config.soul);\n created.push(\".skaile/agent/SOUL.md\");\n }\n }\n if (config.rules) {\n const rulesPath = join(dest, \".skaile\", \"agent\", \"RULES.md\");\n if (!existsSync(rulesPath)) {\n mkdirSync(dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, config.rules);\n created.push(\".skaile/agent/RULES.md\");\n }\n }\n\n // Copy additional template files\n if (config.files && templateDir) {\n for (const file of config.files) {\n const srcPath = join(templateDir, file.src);\n const destPath = join(dest, file.dest);\n if (!existsSync(srcPath)) continue;\n if (existsSync(destPath)) continue;\n\n if (statSync(srcPath).isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, dest);\n } else {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(file.dest);\n }\n }\n }\n\n return created;\n}\n","/**\n * Main scaffolder — loads a workspace template (workspace.yaml) and applies\n * all configured layers in order: base → framework → template → skills → hooks → container.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { applyAgentsLayer } from \"./layers/agents.js\";\nimport { applyBaseLayer } from \"./layers/base.js\";\nimport { applyContainerLayer } from \"./layers/container.js\";\nimport { applyDriverTargetLayer } from \"./layers/driver-target.js\";\nimport { applyHooksLayer } from \"./layers/hooks.js\";\nimport { applyConnectorsLayer } from \"./layers/connectors.js\";\nimport { applySkillsLayer } from \"./layers/skills.js\";\nimport { applyTemplateLayer } from \"./layers/template.js\";\nimport { loadSkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { ScaffoldOptions, ScaffoldResult, TemplateManifest } from \"./types.js\";\n\n// ── Built-in template directory ────────────────────────────────────────────\n\nlet _builtinTemplatesDir: string | null = null;\n\n/**\n * Get the built-in templates directory. Uses import.meta.url by default,\n * but can be overridden via setTemplatesDir() for bundled environments\n * (e.g. Nitro) where import.meta.url resolves to the bundle output.\n */\nfunction getBuiltinTemplatesDir(): string {\n if (_builtinTemplatesDir) return _builtinTemplatesDir;\n return join(dirname(new URL(import.meta.url).pathname), \"..\", \"..\", \"templates\");\n}\n\n/**\n * Override the built-in templates directory. Call this from apps that bundle\n * skaile-agent-workspace (e.g. Nitro/Nuxt) where `import.meta.url` doesn't\n * resolve to the source package.\n *\n * @param dir - Absolute path to the custom templates directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function setTemplatesDir(dir: string): void {\n _builtinTemplatesDir = resolve(dir);\n}\n\n// ── Template loading ───────────────────────────────────────────────────────\n\n/**\n * Resolve a template name or path to an absolute path to `workspace.yaml`.\n *\n * Lookup order:\n * 1. Absolute or relative path to a `workspace.yaml` file.\n * 2. Directory containing `workspace.yaml`.\n * 3. Built-in template name matching `templates/<name>/workspace.yaml`.\n *\n * @param template - Template name (e.g. `\"minimal\"`) or path to a `workspace.yaml` / directory.\n * @returns Absolute path to `workspace.yaml`, or `null` when the template cannot be found.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function resolveTemplatePath(template: string): string | null {\n // Direct path to a file\n if (template.endsWith(\".yaml\") || template.endsWith(\".yml\")) {\n const abs = resolve(template);\n return existsSync(abs) ? abs : null;\n }\n\n // Directory containing workspace.yaml\n const dirPath = resolve(template);\n const inDir = join(dirPath, \"workspace.yaml\");\n if (existsSync(inDir)) return inDir;\n\n // Built-in template name\n const builtin = join(getBuiltinTemplatesDir(), template, \"workspace.yaml\");\n if (existsSync(builtin)) return builtin;\n\n return null;\n}\n\n/**\n * Load and merge a template manifest, following `extends` chains.\n *\n * @param templatePath - Absolute path to a `workspace.yaml` template file.\n * @returns Merged `TemplateManifest` with parent sections folded in, and the template directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function loadTemplate(templatePath: string): { manifest: TemplateManifest; dir: string } {\n const raw = readFileSync(templatePath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n const dir = dirname(templatePath);\n\n if (manifest.extends) {\n const parentPath =\n resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));\n if (parentPath) {\n const parent = loadTemplate(parentPath);\n // Shallow merge: child sections override parent sections per-key\n const { extends: _ext, name, description, version, ...childSections } = manifest;\n Object.assign(manifest, {\n ...parent.manifest,\n name,\n description,\n version,\n extends: _ext,\n ...childSections,\n });\n }\n }\n\n return { manifest, dir };\n}\n\n/**\n * List all available built-in templates.\n *\n * @returns Array of objects with `name`, `description`, and `path` for each available template.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function listTemplates(): Array<{ name: string; description: string; path: string }> {\n const templates: Array<{ name: string; description: string; path: string }> = [];\n const templatesDir = getBuiltinTemplatesDir();\n if (!existsSync(templatesDir)) return templates;\n\n const { readdirSync } = require(\"node:fs\");\n for (const entry of readdirSync(templatesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const wsPath = join(templatesDir, entry.name, \"workspace.yaml\");\n if (!existsSync(wsPath)) continue;\n try {\n const raw = readFileSync(wsPath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n templates.push({\n name: manifest.name ?? entry.name,\n description: manifest.description ?? \"\",\n path: wsPath,\n });\n } catch {\n // Skip unparseable templates\n }\n }\n\n return templates;\n}\n\n// ── Main scaffold function ────────────────────────────────────────────────\n\n/**\n * Scaffold a new Skaile workspace from a template, applying layers in order.\n *\n * Layer application order:\n * 1. **Base** — creates `.skaile/`, `settings.json`, and `skaile.yaml`\n * 2. **Connectors** — writes connector declarations to `skaile.yaml`\n * 3. **Driver target** — creates framework-specific directories (`.claude/`, `.omp/`, etc.)\n * 4. **Template** — copies agent definition files and static template overlays\n * 5. **Agents** — renders and installs GitAgent packages\n * 6. **Skills** — runs `skaile install` (unless `opts.skipInstall` is `true`)\n * 7. **Hooks** — runs `git init`, writes `.gitignore`, executes setup scripts\n * 8. **Container** — generates `Dockerfile` and `docker-compose.yml` (when enabled)\n *\n * @param opts - Scaffold options including destination, template, and layer overrides.\n * @returns {@link ScaffoldResult} with created paths, installed skills, and warnings.\n * @example\n * ```ts\n * const result = await scaffoldWorkspace({\n * dest: \"./my-workspace\",\n * template: \"minimal\",\n * driverTarget: \"claude-code\",\n * });\n * console.log(`Created ${result.created.length} files`);\n * ```\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport async function scaffoldWorkspace(opts: ScaffoldOptions): Promise<ScaffoldResult> {\n const log = opts.log ?? (() => {});\n const dest = resolve(opts.dest);\n const result: ScaffoldResult = {\n path: dest,\n created: [],\n installed: [],\n warnings: [],\n };\n\n // 1. Load template\n const templatePath = resolveTemplatePath(opts.template);\n if (!templatePath) {\n result.warnings.push(`Template not found: ${opts.template}`);\n return result;\n }\n\n const { manifest, dir: templateDir } = loadTemplate(templatePath);\n log(`Scaffolding workspace from template: ${manifest.name}`);\n\n // 2. Apply layers in order\n\n // Base layer: .skaile/, settings.json, skaile.yaml\n log(\"Applying base layer...\");\n const driverTarget = (opts.driverTarget ??\n manifest.framework?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n const baseCreated = applyBaseLayer(\n dest,\n manifest[\"ai-assets\"],\n manifest.settings,\n driverTarget,\n opts,\n );\n result.created.push(...baseCreated);\n\n // Connectors layer: connector declarations → skaile.yaml + mount directories\n const connectorEntries = manifest.connectors;\n if (connectorEntries?.length) {\n log(\"Applying connectors layer...\");\n const resCreated = applyConnectorsLayer(dest, connectorEntries, log);\n result.created.push(...resCreated);\n }\n\n // Driver target layer: agent-specific directories\n log(\"Applying driver target layer...\");\n const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);\n result.created.push(...fwCreated);\n\n // Template layer: agent definition, template files\n log(\"Applying template layer...\");\n // Resolve agentDir relative to template directory\n const templateConfig = manifest.template;\n if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith(\"/\")) {\n templateConfig.agentDir = join(templateDir, templateConfig.agentDir);\n }\n const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);\n result.created.push(...tmplCreated);\n\n // Agents layer: install GitAgent packages into framework deploy target\n log(\"Applying agents layer...\");\n const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;\n const wsConfig = loadSkWorkspaceConfig(dest)?.config;\n const agentsResult = await applyAgentsLayer(\n dest,\n agentsConfig,\n driverTarget,\n templateDir,\n wsConfig,\n log,\n );\n result.created.push(...agentsResult.created);\n result.warnings.push(...agentsResult.warnings);\n\n // Skills layer: asset manager-based resource installation\n if (!opts.skipInstall) {\n log(\"Applying skills layer...\");\n const skillsResult = await applySkillsLayer(dest, manifest.skills, log);\n result.installed.push(...skillsResult.installed);\n result.warnings.push(...skillsResult.warnings);\n }\n\n // Hooks layer: git init, .gitignore, setup scripts\n log(\"Applying hooks layer...\");\n const hooksResult = applyHooksLayer(dest, manifest.hooks, log);\n result.created.push(...hooksResult.created);\n result.warnings.push(...hooksResult.warnings);\n\n // Container layer: Dockerfile, docker-compose.yml\n const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;\n if (enableDocker) {\n log(\"Applying container layer...\");\n const containerCreated = applyContainerLayer(\n dest,\n { ...manifest.container, enabled: true },\n opts.name,\n );\n result.created.push(...containerCreated);\n }\n\n log(`Workspace scaffolded: ${result.created.length} files/dirs created`);\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../asset-manager/src/scaffold/layers/base.ts","../asset-manager/src/scaffold/layers/container.ts","../asset-manager/src/scaffold/layers/driver-target.ts","../asset-manager/src/scaffold/layers/hooks.ts","../asset-manager/src/scaffold/layers/connectors.ts","../asset-manager/src/scaffold/layers/skills.ts","../asset-manager/src/scaffold/layers/template.ts","../asset-manager/src/scaffold/scaffolder.ts"],"names":["basename","join","existsSync","writeFileSync","mkdirSync","dirname","readFileSync","readdirSync"],"mappings":"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","file":"chunk-OQIBHB4F.js","sourcesContent":["/**\n * Base layer — creates .skaile/ directory, settings.json, and skaile.yaml.\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport type { AiResourcesLayerConfig, ScaffoldOptions } from \"../types.js\";\n\n/**\n * Apply the base scaffold layer — creates `.skaile/`, `settings.json`, and `skaile.yaml`.\n *\n * @param dest - Absolute path to the workspace root to create.\n * @param aiResources - AI resource config from the template manifest (sources, requires).\n * @param templateSettings - Template-default settings merged under user overrides.\n * @param framework - Default agent framework written to `skaile.yaml` `agent-config`.\n * @param opts - Full scaffold options (provides name, settings, resources, requires overrides).\n * @returns Array of created file/directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyBaseLayer(\n dest: string,\n aiResources: AiResourcesLayerConfig | undefined,\n templateSettings: Record<string, unknown> | undefined,\n framework: string,\n opts: ScaffoldOptions,\n): string[] {\n const created: string[] = [];\n\n // Create workspace root\n if (!existsSync(dest)) {\n mkdirSync(dest, { recursive: true });\n created.push(\".\");\n }\n\n // Create .skaile/ directory\n const skaileDir = join(dest, \".skaile\");\n if (!existsSync(skaileDir)) {\n mkdirSync(skaileDir, { recursive: true });\n created.push(\".skaile/\");\n }\n\n // Create .skaile/sessions/ directory\n const sessionsDir = join(skaileDir, \"sessions\");\n if (!existsSync(sessionsDir)) {\n mkdirSync(sessionsDir, { recursive: true });\n created.push(\".skaile/sessions/\");\n }\n\n // Write settings.json (merge template defaults + user overrides)\n const settingsPath = join(skaileDir, \"settings.json\");\n if (!existsSync(settingsPath)) {\n const settings = {\n ...(templateSettings ?? {}),\n ...(opts.settings ?? {}),\n };\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`);\n created.push(\".skaile/settings.json\");\n }\n\n // Write skaile.yaml (unified workspace config)\n const sources = opts.resources ?? aiResources?.resources ?? [];\n const requires = opts.requires ?? aiResources?.requires ?? [];\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n const projectName = opts.name ?? basename(dest);\n\n // Build ai_resources as array with dependencies on first source\n const aiResourceEntries = sources.map((r, i) => {\n const entry: Record<string, unknown> = { name: r.name, path: r.path };\n if (r.branch) entry.branch = r.branch;\n if (i === 0 && requires.length > 0) entry.dependencies = requires;\n return entry;\n });\n\n const wsConfig: Record<string, unknown> = {\n name: projectName,\n description: `${projectName} AI skill dependencies`,\n \"agent-config\": {\n default: {\n agent: framework,\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n driver: \"claude-sdk\",\n max_turns: 200,\n },\n },\n ai_resources: aiResourceEntries,\n };\n writeFileSync(wsConfigPath, stringify(wsConfig));\n created.push(\"skaile.yaml\");\n }\n\n return created;\n}\n","/**\n * Container layer — generates Dockerfile and docker-compose.yml for\n * containerized agent workspaces.\n */\n\nimport { existsSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport type { ContainerLayerConfig } from \"../types.js\";\n\n/**\n * Apply the container scaffold layer — generates `Dockerfile`, `docker-compose.yml`, and `.dockerignore`.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Container layer configuration from the template manifest or `ScaffoldOptions.docker`.\n * @param projectName - Project name used as the docker-compose service name.\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyContainerLayer(\n dest: string,\n config: ContainerLayerConfig | undefined,\n projectName?: string,\n): string[] {\n const created: string[] = [];\n if (!config?.enabled) return created;\n\n const name = projectName ?? basename(dest);\n const baseImage = config.baseImage ?? \"node:22-alpine\";\n const wsPort = config.wsPort ?? 3100;\n\n // Generate Dockerfile\n const dockerfilePath = join(dest, \"Dockerfile\");\n if (!existsSync(dockerfilePath)) {\n const dockerfile = generateDockerfile(baseImage, config, wsPort);\n writeFileSync(dockerfilePath, dockerfile);\n created.push(\"Dockerfile\");\n }\n\n // Generate docker-compose.yml\n const composePath = join(dest, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n const compose = generateCompose(name, config, wsPort);\n writeFileSync(composePath, compose);\n created.push(\"docker-compose.yml\");\n }\n\n // Generate .dockerignore\n const dockerignorePath = join(dest, \".dockerignore\");\n if (!existsSync(dockerignorePath)) {\n writeFileSync(\n dockerignorePath,\n [\"node_modules\", \".git\", \".skaile/sessions\", \"*.log\", \".env.local\", \"\"].join(\"\\n\"),\n );\n created.push(\".dockerignore\");\n }\n\n return created;\n}\n\nfunction generateDockerfile(\n baseImage: string,\n config: ContainerLayerConfig,\n wsPort: number,\n): string {\n const lines: string[] = [`FROM ${baseImage}`, \"\", \"# System packages\"];\n\n // System packages\n const packages = [\"git\", \"curl\", ...(config.packages ?? [])];\n if (baseImage.includes(\"alpine\")) {\n lines.push(`RUN apk add --no-cache ${packages.join(\" \")}`);\n } else {\n lines.push(\n `RUN apt-get update && apt-get install -y ${packages.join(\" \")} && rm -rf /var/lib/apt/lists/*`,\n );\n }\n lines.push(\"\");\n\n // Agent CLIs\n if (config.agents && config.agents.length > 0) {\n lines.push(\"# Agent CLIs\");\n for (const agent of config.agents) {\n lines.push(`RUN npm install -g ${agent}`);\n }\n lines.push(\"\");\n }\n\n // Working directory\n lines.push(\"WORKDIR /workspace\");\n lines.push(\"\");\n\n // Copy workspace files\n lines.push(\"# Copy workspace configuration\");\n lines.push(\"COPY skaile.yaml ./\");\n lines.push(\"COPY .skaile/ ./.skaile/\");\n lines.push(\"\");\n\n // Ports\n const ports = [String(wsPort), ...(config.ports ?? [])];\n for (const port of ports) {\n lines.push(`EXPOSE ${port}`);\n }\n lines.push(\"\");\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\"# Environment\");\n for (const envVar of config.env) {\n lines.push(`ENV ${envVar}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"# Default entrypoint — override in compose or at runtime\");\n lines.push('ENTRYPOINT [\"sh\", \"-c\"]');\n lines.push('CMD [\"echo Agent workspace ready && exec sh\"]');\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateCompose(name: string, config: ContainerLayerConfig, wsPort: number): string {\n const serviceName = name.replace(/[^a-z0-9-]/gi, \"-\").toLowerCase();\n const ports = [`${wsPort}:${wsPort}`, ...(config.ports ?? []).map((p) => `${p}:${p}`)];\n\n const lines: string[] = [\n \"services:\",\n ` ${serviceName}:`,\n \" build: .\",\n ` container_name: ${serviceName}`,\n ];\n\n // Ports\n if (ports.length > 0) {\n lines.push(\" ports:\");\n for (const port of ports) {\n lines.push(` - \"${port}\"`);\n }\n }\n\n // Volumes / mounts\n if (config.mounts && config.mounts.length > 0) {\n lines.push(\" volumes:\");\n for (const mount of config.mounts) {\n if (mount.type === \"bind\") {\n lines.push(` - ${mount.source}:${mount.target}`);\n } else {\n lines.push(` - ${mount.source}:${mount.target}`);\n }\n }\n }\n\n // Environment\n if (config.env && config.env.length > 0) {\n lines.push(\" environment:\");\n for (const envVar of config.env) {\n if (envVar.includes(\"=\")) {\n lines.push(` - ${envVar}`);\n } else {\n lines.push(` - ${envVar}`);\n }\n }\n }\n\n lines.push(\" restart: unless-stopped\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Driver target layer — creates agent-specific directories (.claude/, .omp/, etc.)\n * based on the DRIVER_TARGETS configuration.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { DriverTargetLayerConfig } from \"../types.js\";\n\n/**\n * Apply the driver-target scaffold layer — creates framework-specific directories (`.claude/`, `.omp/`, etc.).\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Driver target layer configuration from the template manifest.\n * @param driverTargetOverride - Overrides `config[\"default-target\"]` when provided.\n * @returns Array of created directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyDriverTargetLayer(\n dest: string,\n config: DriverTargetLayerConfig | undefined,\n driverTargetOverride?: DriverTarget,\n): string[] {\n const created: string[] = [];\n const driverTarget = (driverTargetOverride ??\n config?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n\n const targetMap = DRIVER_TARGETS[driverTarget];\n if (!targetMap) return created;\n\n // Create all local deploy target directories\n const dirsToCreate = new Set<string>();\n for (const dir of Object.values(targetMap.local)) {\n dirsToCreate.add(dir);\n }\n\n // Add extras from template\n if (config?.extras) {\n for (const extra of config.extras) {\n dirsToCreate.add(extra);\n }\n }\n\n for (const dir of dirsToCreate) {\n const fullPath = join(dest, dir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n created.push(`${dir}/`);\n }\n }\n\n return created;\n}\n","/**\n * Hooks layer — git init, .gitignore generation, and post-scaffold setup scripts.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { HooksLayerConfig } from \"../types.js\";\n\n/** Result of the hooks scaffold layer. */\nexport interface HooksResult {\n /** Paths to files and directories created by this layer, relative to the workspace root. */\n created: string[];\n /** Non-fatal warnings collected during hook execution (e.g. failed setup scripts). */\n warnings: string[];\n}\n\n/**\n * Apply the hooks scaffold layer — runs `git init`, appends `.gitignore` entries, and executes setup scripts.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Hooks layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link HooksResult} with created file paths and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyHooksLayer(\n dest: string,\n config: HooksLayerConfig | undefined,\n log?: (msg: string) => void,\n): HooksResult {\n const result: HooksResult = { created: [], warnings: [] };\n if (!config) return result;\n\n // Git init\n if (config.gitInit) {\n const gitDir = join(dest, \".git\");\n if (!existsSync(gitDir)) {\n try {\n execSync(\"git init\", { cwd: dest, stdio: \"pipe\" });\n result.created.push(\".git/\");\n log?.(\"Initialized git repository\");\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`git init failed: ${msg}`);\n }\n }\n }\n\n // .gitignore\n if (config.gitignore && config.gitignore.length > 0) {\n const gitignorePath = join(dest, \".gitignore\");\n let existing = \"\";\n if (existsSync(gitignorePath)) {\n existing = readFileSync(gitignorePath, \"utf-8\");\n }\n\n const existingLines = new Set(existing.split(\"\\n\").map((l) => l.trim()));\n const newEntries = config.gitignore.filter((e) => !existingLines.has(e));\n\n if (newEntries.length > 0) {\n const append = `${(existing && !existing.endsWith(\"\\n\") ? \"\\n\" : \"\") + newEntries.join(\"\\n\")}\\n`;\n writeFileSync(gitignorePath, existing + append);\n if (!existingLines.size) {\n result.created.push(\".gitignore\");\n }\n }\n }\n\n // Setup scripts\n if (config.setupScripts) {\n for (const script of config.setupScripts) {\n try {\n log?.(`Running setup script: ${script.name}`);\n const cwd = script.cwd ? join(dest, script.cwd) : dest;\n if (!existsSync(cwd)) {\n mkdirSync(cwd, { recursive: true });\n }\n execSync(script.run, {\n cwd,\n stdio: \"pipe\",\n timeout: 60_000,\n env: { ...process.env, WORKSPACE_DIR: dest },\n });\n log?.(`Setup script \"${script.name}\" completed`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Setup script \"${script.name}\" failed: ${msg}`);\n }\n }\n }\n\n return result;\n}\n","/**\n * Connectors layer — writes connector declarations to skaile.yaml\n * and creates mount directories for mountable connectors.\n *\n * Actual sync/connect happens at runtime (in the runner), not at scaffold time.\n */\n\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { WorkspaceYamlEditor } from \"@skaile/workspaces/core\";\nimport type { ConnectorEntry } from \"../types.js\";\n\n/**\n * Apply the connectors scaffold layer — writes connector declarations to `skaile.yaml` and creates mount directories.\n *\n * @param dest - Absolute path to the workspace root.\n * @param connectors - Connector entries from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of created mount directory paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyConnectorsLayer(\n dest: string,\n connectors: ConnectorEntry[] | undefined | null,\n log?: (msg: string) => void,\n): string[] {\n const created: string[] = [];\n const entries: ConnectorEntry[] = Array.isArray(connectors) ? connectors : [];\n if (!entries.length) return created;\n\n // Write connectors to skaile.yaml\n const yamlPath = join(dest, \"skaile.yaml\");\n if (existsSync(yamlPath)) {\n const editor = WorkspaceYamlEditor.load(yamlPath);\n for (const r of entries) {\n editor.setConnector({\n id: r.id,\n driver: r.driver,\n access: r.access ?? \"read-only\",\n auth: r.auth,\n options: r.options,\n });\n }\n editor.save();\n log?.(`Wrote ${entries.length} connector(s) to skaile.yaml`);\n } else {\n log?.(\"Skipping connector write: skaile.yaml not found (base layer should create it first)\");\n }\n\n // Create mount directories for connectors that have autoMount or mountPath\n for (const connector of entries) {\n if (connector.autoMount === false) continue;\n const mountPath = connector.mountPath ?? `.connectors/${connector.id}`;\n const absMount = join(dest, mountPath);\n if (!existsSync(absMount)) {\n mkdirSync(absMount, { recursive: true });\n created.push(`${mountPath}/`);\n log?.(`Created mount dir: ${mountPath}`);\n }\n }\n\n return created;\n}\n","/**\n * Skills layer — installs AI resources into the workspace using the asset manager.\n *\n * Now that this layer lives inside @skaile/asset-manager, the AssetManager class\n * is loaded via a lazy import from the parent package index (no more dynamic\n * external dependency hack).\n *\n * When a scopeDir is specified, the asset manager operates against that directory\n * instead of the default project directory.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SkillsLayerConfig } from \"../types.js\";\n\n/** Result of the skills scaffold layer. */\nexport interface SkillsInstallResult {\n /** Asset refs (`kind:name`) installed by `skaile install` during scaffolding. */\n installed: string[];\n /** Non-fatal warnings (e.g. `skaile.yaml` not found, install failure). */\n warnings: string[];\n}\n\n/**\n * Lazy-load AssetManager from the parent package index.\n * Returns null if not available (should not happen in normal operation).\n */\nasync function loadAssetManager(): Promise<any | null> {\n try {\n const mod = await import(\"../../index.js\");\n return mod.AssetManager ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Apply the skills scaffold layer — runs `skaile install` to deploy all declared asset dependencies.\n *\n * Only runs when `config.autoInstall` is `true`. Skips silently when `skaile.yaml` is absent.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Skills layer configuration from the template manifest.\n * @param log - Optional logger callback for progress messages.\n * @returns {@link SkillsInstallResult} with installed refs and warnings.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport async function applySkillsLayer(\n dest: string,\n config: SkillsLayerConfig | undefined,\n log?: (msg: string) => void,\n): Promise<SkillsInstallResult> {\n const result: SkillsInstallResult = { installed: [], warnings: [] };\n if (!config?.autoInstall) return result;\n\n const wsConfigPath = join(dest, \"skaile.yaml\");\n if (!existsSync(wsConfigPath)) {\n result.warnings.push(\"Skipping skill install: skaile.yaml not found\");\n return result;\n }\n\n const AssetManager = await loadAssetManager();\n if (!AssetManager) {\n result.warnings.push(\n \"Skipping skill install: AssetManager could not be loaded. Run `skaile install` manually.\",\n );\n return result;\n }\n\n try {\n log?.(\"Installing AI resources...\");\n\n const am = new AssetManager({ projectDir: dest });\n const installResult = await am.install();\n\n if (Array.isArray(installResult)) {\n result.installed = installResult;\n } else if (installResult?.deployed) {\n result.installed = installResult.deployed;\n }\n\n log?.(`Installed ${result.installed.length} skill(s)`);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n result.warnings.push(`Skill install failed: ${msg}`);\n }\n\n return result;\n}\n","/**\n * Template layer — applies agent definition files (SOUL.md, RULES.md, knowledge/)\n * and any additional template files.\n */\n\nimport { copyFileSync, existsSync, mkdirSync, readdirSync, statSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative } from \"node:path\";\nimport type { TemplateLayerConfig } from \"../types.js\";\n\n/** Recursively copy a directory, skipping files that already exist at dest. */\nfunction copyDirSkipExisting(src: string, dest: string, created: string[], baseDest: string): void {\n if (!existsSync(dest)) mkdirSync(dest, { recursive: true });\n for (const entry of readdirSync(src, { withFileTypes: true })) {\n const srcPath = join(src, entry.name);\n const destPath = join(dest, entry.name);\n if (entry.isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, baseDest);\n } else if (!existsSync(destPath)) {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(relative(baseDest, destPath));\n }\n }\n}\n\n/**\n * Apply the template overlay layer — copies agent definition files (`SOUL.md`, `RULES.md`, `knowledge/`) and additional static template files into the workspace.\n *\n * @param dest - Absolute path to the workspace root.\n * @param config - Template layer configuration from the template manifest.\n * @param templateDir - Absolute path to the template directory (used to resolve relative `files[].src` paths).\n * @returns Array of created file paths relative to `dest`.\n * @docLink packages/asset-manager/concepts#scaffold-layers\n */\nexport function applyTemplateLayer(\n dest: string,\n config: TemplateLayerConfig | undefined,\n templateDir?: string,\n): string[] {\n const created: string[] = [];\n if (!config) return created;\n\n // Apply agent definition from agentDir\n if (config.agentDir) {\n const agentDir = config.agentDir;\n if (existsSync(agentDir)) {\n // Copy SOUL.md, RULES.md, DUTIES.md\n for (const file of [\"SOUL.md\", \"RULES.md\", \"DUTIES.md\"]) {\n const src = join(agentDir, file);\n const destFile = join(dest, \".skaile\", \"agent\", file);\n if (existsSync(src) && !existsSync(destFile)) {\n mkdirSync(dirname(destFile), { recursive: true });\n copyFileSync(src, destFile);\n created.push(relative(dest, destFile));\n }\n }\n\n // Copy knowledge/ directory\n const knowledgeSrc = join(agentDir, \"knowledge\");\n if (existsSync(knowledgeSrc)) {\n const knowledgeDest = join(dest, \".skaile\", \"agent\", \"knowledge\");\n copyDirSkipExisting(knowledgeSrc, knowledgeDest, created, dest);\n }\n\n // Copy skills/ directory from agent def\n const skillsSrc = join(agentDir, \"skills\");\n if (existsSync(skillsSrc)) {\n const skillsDest = join(dest, \".skaile\", \"agent\", \"skills\");\n copyDirSkipExisting(skillsSrc, skillsDest, created, dest);\n }\n }\n }\n\n // Write inline soul/rules content\n if (config.soul) {\n const soulPath = join(dest, \".skaile\", \"agent\", \"SOUL.md\");\n if (!existsSync(soulPath)) {\n mkdirSync(dirname(soulPath), { recursive: true });\n writeFileSync(soulPath, config.soul);\n created.push(\".skaile/agent/SOUL.md\");\n }\n }\n if (config.rules) {\n const rulesPath = join(dest, \".skaile\", \"agent\", \"RULES.md\");\n if (!existsSync(rulesPath)) {\n mkdirSync(dirname(rulesPath), { recursive: true });\n writeFileSync(rulesPath, config.rules);\n created.push(\".skaile/agent/RULES.md\");\n }\n }\n\n // Copy additional template files\n if (config.files && templateDir) {\n for (const file of config.files) {\n const srcPath = join(templateDir, file.src);\n const destPath = join(dest, file.dest);\n if (!existsSync(srcPath)) continue;\n if (existsSync(destPath)) continue;\n\n if (statSync(srcPath).isDirectory()) {\n copyDirSkipExisting(srcPath, destPath, created, dest);\n } else {\n mkdirSync(dirname(destPath), { recursive: true });\n copyFileSync(srcPath, destPath);\n created.push(file.dest);\n }\n }\n }\n\n return created;\n}\n","/**\n * Main scaffolder — loads a workspace template (workspace.yaml) and applies\n * all configured layers in order: base → framework → template → skills → hooks → container.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { parse } from \"yaml\";\nimport { applyAgentsLayer } from \"./layers/agents.js\";\nimport { applyBaseLayer } from \"./layers/base.js\";\nimport { applyContainerLayer } from \"./layers/container.js\";\nimport { applyDriverTargetLayer } from \"./layers/driver-target.js\";\nimport { applyHooksLayer } from \"./layers/hooks.js\";\nimport { applyConnectorsLayer } from \"./layers/connectors.js\";\nimport { applySkillsLayer } from \"./layers/skills.js\";\nimport { applyTemplateLayer } from \"./layers/template.js\";\nimport { loadSkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport type { DriverTarget } from \"@skaile/workspaces/core\";\nimport type { ScaffoldOptions, ScaffoldResult, TemplateManifest } from \"./types.js\";\n\n// ── Built-in template directory ────────────────────────────────────────────\n\nlet _builtinTemplatesDir: string | null = null;\n\n/**\n * Get the built-in templates directory. Uses import.meta.url by default,\n * but can be overridden via setTemplatesDir() for bundled environments\n * (e.g. Nitro) where import.meta.url resolves to the bundle output.\n */\nfunction getBuiltinTemplatesDir(): string {\n if (_builtinTemplatesDir) return _builtinTemplatesDir;\n return join(dirname(new URL(import.meta.url).pathname), \"..\", \"..\", \"templates\");\n}\n\n/**\n * Override the built-in templates directory. Call this from apps that bundle\n * skaile-agent-workspace (e.g. Nitro/Nuxt) where `import.meta.url` doesn't\n * resolve to the source package.\n *\n * @param dir - Absolute path to the custom templates directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function setTemplatesDir(dir: string): void {\n _builtinTemplatesDir = resolve(dir);\n}\n\n// ── Template loading ───────────────────────────────────────────────────────\n\n/**\n * Resolve a template name or path to an absolute path to `workspace.yaml`.\n *\n * Lookup order:\n * 1. Absolute or relative path to a `workspace.yaml` file.\n * 2. Directory containing `workspace.yaml`.\n * 3. Built-in template name matching `templates/<name>/workspace.yaml`.\n *\n * @param template - Template name (e.g. `\"minimal\"`) or path to a `workspace.yaml` / directory.\n * @returns Absolute path to `workspace.yaml`, or `null` when the template cannot be found.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function resolveTemplatePath(template: string): string | null {\n // Direct path to a file\n if (template.endsWith(\".yaml\") || template.endsWith(\".yml\")) {\n const abs = resolve(template);\n return existsSync(abs) ? abs : null;\n }\n\n // Directory containing workspace.yaml\n const dirPath = resolve(template);\n const inDir = join(dirPath, \"workspace.yaml\");\n if (existsSync(inDir)) return inDir;\n\n // Built-in template name\n const builtin = join(getBuiltinTemplatesDir(), template, \"workspace.yaml\");\n if (existsSync(builtin)) return builtin;\n\n return null;\n}\n\n/**\n * Load and merge a template manifest, following `extends` chains.\n *\n * @param templatePath - Absolute path to a `workspace.yaml` template file.\n * @returns Merged `TemplateManifest` with parent sections folded in, and the template directory.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function loadTemplate(templatePath: string): { manifest: TemplateManifest; dir: string } {\n const raw = readFileSync(templatePath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n const dir = dirname(templatePath);\n\n if (manifest.extends) {\n const parentPath =\n resolveTemplatePath(manifest.extends) ?? resolveTemplatePath(join(dir, manifest.extends));\n if (parentPath) {\n const parent = loadTemplate(parentPath);\n // Shallow merge: child sections override parent sections per-key\n const { extends: _ext, name, description, version, ...childSections } = manifest;\n Object.assign(manifest, {\n ...parent.manifest,\n name,\n description,\n version,\n extends: _ext,\n ...childSections,\n });\n }\n }\n\n return { manifest, dir };\n}\n\n/**\n * List all available built-in templates.\n *\n * @returns Array of objects with `name`, `description`, and `path` for each available template.\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport function listTemplates(): Array<{ name: string; description: string; path: string }> {\n const templates: Array<{ name: string; description: string; path: string }> = [];\n const templatesDir = getBuiltinTemplatesDir();\n if (!existsSync(templatesDir)) return templates;\n\n const { readdirSync } = require(\"node:fs\");\n for (const entry of readdirSync(templatesDir, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n const wsPath = join(templatesDir, entry.name, \"workspace.yaml\");\n if (!existsSync(wsPath)) continue;\n try {\n const raw = readFileSync(wsPath, \"utf-8\");\n const manifest = parse(raw) as TemplateManifest;\n templates.push({\n name: manifest.name ?? entry.name,\n description: manifest.description ?? \"\",\n path: wsPath,\n });\n } catch {\n // Skip unparseable templates\n }\n }\n\n return templates;\n}\n\n// ── Main scaffold function ────────────────────────────────────────────────\n\n/**\n * Scaffold a new Skaile workspace from a template, applying layers in order.\n *\n * Layer application order:\n * 1. **Base** — creates `.skaile/`, `settings.json`, and `skaile.yaml`\n * 2. **Connectors** — writes connector declarations to `skaile.yaml`\n * 3. **Driver target** — creates framework-specific directories (`.claude/`, `.omp/`, etc.)\n * 4. **Template** — copies agent definition files and static template overlays\n * 5. **Agents** — renders and installs GitAgent packages\n * 6. **Skills** — runs `skaile install` (unless `opts.skipInstall` is `true`)\n * 7. **Hooks** — runs `git init`, writes `.gitignore`, executes setup scripts\n * 8. **Container** — generates `Dockerfile` and `docker-compose.yml` (when enabled)\n *\n * @param opts - Scaffold options including destination, template, and layer overrides.\n * @returns {@link ScaffoldResult} with created paths, installed skills, and warnings.\n * @example\n * ```ts\n * const result = await scaffoldWorkspace({\n * dest: \"./my-workspace\",\n * template: \"minimal\",\n * driverTarget: \"claude-code\",\n * });\n * console.log(`Created ${result.created.length} files`);\n * ```\n * @docLink packages/asset-manager/concepts#scaffolder\n */\nexport async function scaffoldWorkspace(opts: ScaffoldOptions): Promise<ScaffoldResult> {\n const log = opts.log ?? (() => {});\n const dest = resolve(opts.dest);\n const result: ScaffoldResult = {\n path: dest,\n created: [],\n installed: [],\n warnings: [],\n };\n\n // 1. Load template\n const templatePath = resolveTemplatePath(opts.template);\n if (!templatePath) {\n result.warnings.push(`Template not found: ${opts.template}`);\n return result;\n }\n\n const { manifest, dir: templateDir } = loadTemplate(templatePath);\n log(`Scaffolding workspace from template: ${manifest.name}`);\n\n // 2. Apply layers in order\n\n // Base layer: .skaile/, settings.json, skaile.yaml\n log(\"Applying base layer...\");\n const driverTarget = (opts.driverTarget ??\n manifest.framework?.[\"default-target\"] ??\n \"claude-code\") as DriverTarget;\n const baseCreated = applyBaseLayer(\n dest,\n manifest[\"ai-assets\"],\n manifest.settings,\n driverTarget,\n opts,\n );\n result.created.push(...baseCreated);\n\n // Connectors layer: connector declarations → skaile.yaml + mount directories\n const connectorEntries = manifest.connectors;\n if (connectorEntries?.length) {\n log(\"Applying connectors layer...\");\n const resCreated = applyConnectorsLayer(dest, connectorEntries, log);\n result.created.push(...resCreated);\n }\n\n // Driver target layer: agent-specific directories\n log(\"Applying driver target layer...\");\n const fwCreated = applyDriverTargetLayer(dest, manifest.framework, opts.driverTarget);\n result.created.push(...fwCreated);\n\n // Template layer: agent definition, template files\n log(\"Applying template layer...\");\n // Resolve agentDir relative to template directory\n const templateConfig = manifest.template;\n if (templateConfig?.agentDir && !templateConfig.agentDir.startsWith(\"/\")) {\n templateConfig.agentDir = join(templateDir, templateConfig.agentDir);\n }\n const tmplCreated = applyTemplateLayer(dest, templateConfig, templateDir);\n result.created.push(...tmplCreated);\n\n // Agents layer: install GitAgent packages into framework deploy target\n log(\"Applying agents layer...\");\n const agentsConfig = opts.agentInstall ? { install: opts.agentInstall } : manifest.agents;\n const wsConfig = loadSkWorkspaceConfig(dest)?.config;\n const agentsResult = await applyAgentsLayer(\n dest,\n agentsConfig,\n driverTarget,\n templateDir,\n wsConfig,\n log,\n );\n result.created.push(...agentsResult.created);\n result.warnings.push(...agentsResult.warnings);\n\n // Skills layer: asset manager-based resource installation\n if (!opts.skipInstall) {\n log(\"Applying skills layer...\");\n const skillsResult = await applySkillsLayer(dest, manifest.skills, log);\n result.installed.push(...skillsResult.installed);\n result.warnings.push(...skillsResult.warnings);\n }\n\n // Hooks layer: git init, .gitignore, setup scripts\n log(\"Applying hooks layer...\");\n const hooksResult = applyHooksLayer(dest, manifest.hooks, log);\n result.created.push(...hooksResult.created);\n result.warnings.push(...hooksResult.warnings);\n\n // Container layer: Dockerfile, docker-compose.yml\n const enableDocker = opts.docker ?? manifest.container?.enabled ?? false;\n if (enableDocker) {\n log(\"Applying container layer...\");\n const containerCreated = applyContainerLayer(\n dest,\n { ...manifest.container, enabled: true },\n opts.name,\n );\n result.created.push(...containerCreated);\n }\n\n log(`Workspace scaffolded: ${result.created.length} files/dirs created`);\n return result;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { classifyClaudeSdkError } from './chunk-EWP5HZBV.js';
2
- import { createDriver } from './chunk-AE6GCXGL.js';
2
+ import { createDriver } from './chunk-S7RACIZI.js';
3
3
 
4
4
  // bridge/src/normalizer.ts
5
5
  var EventNormalizer = class {
@@ -477,5 +477,5 @@ async function validateApiKey(provider, key) {
477
477
  }
478
478
 
479
479
  export { BridgeRuntime, EventNormalizer, createRuntime, detectFileChange, detectFileChanges, summarizeToolCall, summarizeToolResult, validateApiKey };
480
- //# sourceMappingURL=chunk-K3TMZI6D.js.map
481
- //# sourceMappingURL=chunk-K3TMZI6D.js.map
480
+ //# sourceMappingURL=chunk-OSJH4SPO.js.map
481
+ //# sourceMappingURL=chunk-OSJH4SPO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":[],"mappings":"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","file":"chunk-K3TMZI6D.js","sourcesContent":["/**\n * EventNormalizer — converts bridge-level AgentEvent (raw driver events) to\n * skaile-agent-types AgentEvent (normalized, human-readable events).\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call reset() between sessions.\n */\n\nimport type { AgentEvent as NormalizedEvent } from \"@skaile/workspaces/types\";\nimport { classifyClaudeSdkError } from \"./error-classifier.js\";\nimport type { AgentMessage, AgentEvent as BridgeEvent, ContentBlock } from \"./types.js\";\n\n/**\n * Converts raw bridge-level {@link BridgeEvent} payloads into normalized\n * `@skaile/workspaces/types` `AgentEvent` payloads consumed by the runner and transport.\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call {@link EventNormalizer.reset} between sessions to clear accumulated state.\n *\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport class EventNormalizer {\n private activeSubagents = new Map<string, string>();\n private devServerStartingEmitted = false;\n private devServerReadyEmitted = false;\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n\n /**\n * Convert a single bridge event into zero or more normalized events.\n * One bridge event can produce multiple normalized events (e.g., a message_start\n * with text + tool_use blocks produces both text and tool_call events).\n */\n normalize(event: BridgeEvent): NormalizedEvent[] {\n switch (event.type) {\n case \"message_start\":\n return this.handleMessageStart(event.message);\n\n case \"message_update\":\n return this.handleMessageUpdate(event);\n\n case \"message_end\":\n return [];\n\n case \"turn_end\":\n return this.handleTurnEnd(event.toolResults);\n\n case \"result\":\n return this.handleResult(event);\n\n case \"error\":\n return [\n {\n type: \"error\",\n message: event.error,\n fatal: event.fatal ?? true,\n category: event.detail?.category,\n ...(event.detail?.hint ? { hint: event.detail.hint } : {}),\n },\n ];\n\n case \"tool_call\":\n // Already handled in message_start — emit status only\n return [{ type: \"status\", phase: \"working\" }];\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n return [{ type: \"status\", phase: \"idle\" }];\n\n case \"commands_available\":\n // Pass through to transport — the gateway caches this event\n return [event as unknown as NormalizedEvent];\n\n case \"session_info\":\n // Pass through to transport — the forge layer stores the OMP session ID\n return [event as unknown as NormalizedEvent];\n\n case \"ui_render\":\n case \"ui_render_update\":\n case \"ui_clear\":\n // Pass through verbatim — drivers that implement the Agent UI Protocol emit these directly\n return [event as unknown as NormalizedEvent];\n\n default:\n return [];\n }\n }\n\n /** Clear all stateful tracking between sessions. */\n reset(): void {\n this.activeSubagents.clear();\n this.devServerStartingEmitted = false;\n this.devServerReadyEmitted = false;\n this.hasStreamedText = false;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Drivers (e.g. omp) may echo the user's\n // message as a message_start with role:\"user\" before streaming the response.\n // Emitting a text event for that echo would prepend the user's input to the\n // assistant bubble on the frontend.\n if (message.role !== \"assistant\") return [];\n\n const events: NormalizedEvent[] = [];\n const blocks = this.getContentBlocks(message);\n\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n // Skip full text if we already streamed it via message_update deltas\n if (!this.hasStreamedText) {\n events.push({ type: \"text\", content: block.text });\n }\n } else if (block.type === \"tool_use\" && block.name) {\n events.push(...this.handleToolUse(block));\n }\n }\n\n this.hasStreamedText = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock): NormalizedEvent[] {\n const name = block.name!;\n const input = (block.input ?? {}) as Record<string, unknown>;\n const events: NormalizedEvent[] = [];\n\n if (name === \"AskUserQuestion\") {\n // Claude SDK sends { questions: [{ question, header, options: [{ label, description }] }] }\n // Legacy/simple format sends { question: string, options?: string[] }\n const questions = input.questions;\n if (Array.isArray(questions)) {\n for (const q of questions) {\n const qObj = q as Record<string, unknown>;\n const question = String(qObj.question ?? \"\");\n const rawOpts = qObj.options;\n const options = Array.isArray(rawOpts)\n ? rawOpts.map((o: any) => (typeof o === \"string\" ? o : String(o.label ?? o)))\n : undefined;\n events.push({ type: \"question\", question, options });\n }\n } else {\n const question = String(input.question ?? input.text ?? \"\");\n const rawOptions = input.options;\n const options = Array.isArray(rawOptions) ? rawOptions.map(String) : undefined;\n events.push({ type: \"question\", question, options });\n }\n } else if (name === \"Agent\") {\n const agentName = String(input.subagent_type ?? input.description ?? \"unknown\");\n const description = String(input.description ?? input.prompt ?? \"\").slice(0, 200);\n if (block.id) {\n this.activeSubagents.set(block.id, agentName);\n }\n events.push({ type: \"subagent\", name: agentName, status: \"started\", description });\n events.push({ type: \"status\", phase: \"working\" });\n } else {\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n summary: summarizeToolCall(name, input),\n });\n events.push({ type: \"status\", phase: \"working\" });\n\n if (name === \"Bash\" && typeof input.command === \"string\") {\n const devEvent = this.detectDevServerStarting(input.command);\n if (devEvent) events.push(devEvent);\n }\n }\n\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // message_update → streaming text\n // ---------------------------------------------------------------------------\n\n private handleMessageUpdate(event: BridgeEvent): NormalizedEvent[] {\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n return [{ type: \"text\", content: delta }];\n }\n return [];\n }\n\n // ---------------------------------------------------------------------------\n // turn_end → tool_result, subagent finished, file_changed, dev_server\n // ---------------------------------------------------------------------------\n\n private handleTurnEnd(toolResults?: AgentMessage[]): NormalizedEvent[] {\n if (!toolResults?.length) return [];\n\n const events: NormalizedEvent[] = [];\n\n for (const result of toolResults) {\n const toolName = result.toolName ?? \"unknown\";\n const outputData = result.data ?? result.content;\n const output = typeof outputData === \"string\" ? outputData : JSON.stringify(outputData);\n\n // Check if this is a subagent result\n if (toolName === \"Agent\" || this.isSubagentResult(result)) {\n const agentName = this.resolveSubagentName(result);\n const description = output.slice(0, 200);\n events.push({ type: \"subagent\", name: agentName, status: \"finished\", description });\n\n if (agentName === \"dev-server\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n } else {\n events.push({\n type: \"tool_result\",\n tool: toolName,\n output: outputData,\n summary: summarizeToolResult(toolName, outputData),\n });\n\n // Detect file changes from Write/Edit results\n const fileEvents = detectFileChanges(toolName, outputData);\n if (fileEvents.length > 0) events.push(...fileEvents);\n\n // Detect dev server from Bash output\n if (toolName === \"Bash\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n }\n }\n\n return events;\n }\n\n private isSubagentResult(result: AgentMessage): boolean {\n // Check if the tool result's id maps to a tracked subagent\n if (result.toolName && this.activeSubagents.has(result.toolName)) return true;\n return false;\n }\n\n private resolveSubagentName(result: AgentMessage): string {\n // toolName on bridge AgentMessage is resolved from toolIdToName in the driver\n const name = result.toolName ? this.activeSubagents.get(result.toolName) : undefined;\n if (name) {\n this.activeSubagents.delete(result.toolName!);\n return name;\n }\n return result.toolName ?? \"unknown\";\n }\n\n // ---------------------------------------------------------------------------\n // result → finished or error\n // ---------------------------------------------------------------------------\n\n private handleResult(event: BridgeEvent & { type: \"result\" }): NormalizedEvent[] {\n if (event.subtype === \"success\") {\n return [\n {\n type: \"finished\",\n summary: event.summary ?? \"Task completed\",\n costUsd: event.costUsd ?? 0,\n ...(event.tokens ? { tokens: event.tokens } : {}),\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk driver uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (drivers other than claude-sdk emit `result` without a paired\n // `error`, so this is the only place they get classified).\n const detail = classifyClaudeSdkError({ errors, subtype: event.subtype });\n return [\n {\n type: \"error\",\n message: `Agent stopped: ${event.subtype}${errors.length ? ` — ${errors.join(\"; \")}` : \"\"}`,\n fatal: event.subtype === \"error_during_execution\",\n category: detail.category,\n ...(detail.hint ? { hint: detail.hint } : {}),\n },\n ];\n }\n\n // ---------------------------------------------------------------------------\n // Dev server detection\n // ---------------------------------------------------------------------------\n\n private detectDevServerStarting(command: string): NormalizedEvent | null {\n if (this.devServerStartingEmitted) return null;\n const cmd = command.toLowerCase();\n const isFrontendStart =\n (cmd.includes(\"pnpm run dev\") || cmd.includes(\"pnpm dev\") || cmd.includes(\"vite\")) &&\n (cmd.includes(\"frontend\") || cmd.includes(\"dev:preview\"));\n if (isFrontendStart) {\n this.devServerStartingEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"starting\" };\n }\n return null;\n }\n\n private detectDevServerReady(text: string): NormalizedEvent | null {\n if (this.devServerReadyEmitted) return null;\n\n const explicitMatch = text.match(/DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/);\n if (explicitMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: explicitMatch[1]!, status: \"ready\" };\n }\n\n const viteMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+)/);\n if (viteMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: viteMatch[1]!, status: \"ready\" };\n }\n\n if (text.includes(\"FRONTEND_READY\")) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"ready\" };\n }\n\n return null;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private getContentBlocks(message: AgentMessage): ContentBlock[] {\n if (Array.isArray(message.content)) return message.content;\n if (typeof message.content === \"string\" && message.content) {\n return [{ type: \"text\", text: message.content }];\n }\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable one-line summary of a tool call for the activity log.\n *\n * Returns a string like `$ git status` for Bash, `Read src/index.ts` for Read, etc.\n * Falls back to `ToolName({...input...})` for unrecognised tools.\n *\n * @param tool - Tool name (e.g. `\"Bash\"`, `\"Write\"`, `\"Grep\"`).\n * @param input - Tool input record passed to the call.\n * @returns A short display string suitable for the activity feed.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolCall(tool: string, input: Record<string, unknown>): string {\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${String(input.file_path)}`;\n case \"Edit\":\n return `Edit ${String(input.file_path)}`;\n case \"Read\":\n return `Read ${String(input.file_path)}`;\n case \"Glob\":\n return `Find ${String(input.pattern)}`;\n case \"Grep\":\n return `Search for ${String(input.pattern)}`;\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/** Extract plain text from an Anthropic content-block array (e.g. tool results returned by Claude SDK). */\nfunction extractContentBlockText(blocks: unknown[]): string | null {\n const textBlocks = blocks.filter(\n (b): b is { type: \"text\"; text: string } =>\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\" &&\n typeof (b as Record<string, unknown>).text === \"string\",\n );\n if (textBlocks.length === 0) return null;\n return textBlocks.map((b) => b.text).join(\"\\n\");\n}\n\n/**\n * Produce a human-readable one-line summary of a tool result for the activity log.\n *\n * Handles Bash stdout/stderr, Write/Edit file paths, ApplyPatch change counts, and\n * Anthropic content-block arrays. Falls back to `JSON.stringify` for unknown shapes.\n *\n * @param tool - Tool name.\n * @param result - Raw tool result payload.\n * @returns A short display string, truncated to 200 characters.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolResult(tool: string, result: unknown): string {\n // Handle Anthropic content-block arrays: [{ type: \"text\", text: \"...\" }, ...]\n if (Array.isArray(result)) {\n const text = extractContentBlockText(result);\n return (text ?? JSON.stringify(result)).slice(0, 200);\n }\n if (typeof result !== \"object\" || !result) {\n return String(result).slice(0, 200);\n }\n const r = result as Record<string, unknown>;\n switch (tool) {\n case \"Bash\": {\n const stderr = String(r.stderr ?? \"\").trim();\n if (stderr) return `stderr: ${stderr.slice(0, 200)}`;\n return (\n String(r.stdout ?? \"\")\n .trim()\n .slice(0, 200) || \"(no output)\"\n );\n }\n case \"Write\":\n return `${String(r.type)}: ${String(r.filePath)}`;\n case \"Edit\":\n return `Edited ${String(r.filePath)}`;\n case \"ApplyPatch\":\n return `${Array.isArray(r.changes) ? r.changes.length : 0} file changes`;\n default:\n return JSON.stringify(result).slice(0, 200);\n }\n}\n\n/**\n * Detect file-change events from a tool result, returning zero or more `file_changed` events.\n *\n * Handles `Write` (single create/edit), `Edit` (single edit), and `ApplyPatch` (multi-file\n * patch with per-change `kind` classification). Returns an empty array for all other tools.\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns Array of `file_changed` normalized events.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChanges(toolName: string, result: unknown): NormalizedEvent[] {\n if (typeof result !== \"object\" || !result) return [];\n const r = result as Record<string, unknown>;\n\n if (toolName === \"Write\" && r.filePath) {\n return [\n {\n type: \"file_changed\",\n path: String(r.filePath),\n action: r.type === \"create\" ? \"create\" : \"edit\",\n },\n ];\n }\n if (toolName === \"Edit\" && r.filePath) {\n return [{ type: \"file_changed\", path: String(r.filePath), action: \"edit\" }];\n }\n if (toolName === \"ApplyPatch\" && Array.isArray(r.changes)) {\n return r.changes\n .filter(\n (change): change is { path: string; kind: \"add\" | \"delete\" | \"update\" } =>\n typeof change === \"object\" &&\n change !== null &&\n typeof (change as Record<string, unknown>).path === \"string\" &&\n typeof (change as Record<string, unknown>).kind === \"string\",\n )\n .map((change) => ({\n type: \"file_changed\" as const,\n path: change.path,\n action: change.kind === \"add\" ? \"create\" : change.kind === \"delete\" ? \"delete\" : \"edit\",\n }));\n }\n\n return [];\n}\n\n/**\n * Backward-compatible single-event helper; returns the first `file_changed` event or `null`.\n *\n * Prefer {@link detectFileChanges} for multi-file patches (e.g. `ApplyPatch`).\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns First detected `file_changed` event, or `null`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChange(toolName: string, result: unknown): NormalizedEvent | null {\n return detectFileChanges(toolName, result)[0] ?? null;\n}\n","/**\n * BridgeRuntime — implements IAgentRuntime from @skaile/workspaces/types by wrapping\n * an AgentDriver + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any driver.\n */\n\nimport type {\n AgentEvent,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { createDriver } from \"./registry.js\";\nimport type { AgentConfig, AgentDriver } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentDriver}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any driver without managing the driver lifecycle directly. Create via\n * {@link createRuntime} to avoid coupling to `BridgeRuntime` directly.\n *\n * @docLink packages/bridge/api-reference#runtime\n */\nexport class BridgeRuntime implements IAgentRuntime {\n private driver: AgentDriver | null = null;\n private normalizer = new EventNormalizer();\n private handlers = new Set<(event: AgentEvent) => void>();\n private boundEventHandler: ((event: any) => void) | null = null;\n private driverId: string;\n\n constructor(driverId: string = \"claude-sdk\") {\n this.driverId = driverId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous driver if any\n if (this.driver) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n provider: config.provider,\n model: config.model,\n systemPrompt: config.systemPrompt,\n apiKeys: config.apiKeys,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n };\n\n this.driver = await createDriver(this.driverId, bridgeConfig);\n\n // Wire bridge events through normalizer to handlers\n this.boundEventHandler = (bridgeEvent: any) => {\n const normalized = this.normalizer.normalize(bridgeEvent);\n for (const event of normalized) {\n for (const handler of this.handlers) {\n handler(event);\n }\n }\n };\n this.driver.on(\"agent-event\", this.boundEventHandler);\n\n await this.driver.start();\n }\n\n async configure(_config: AgentReconfigureOptions): Promise<void> {\n // Runtime reconfiguration for BridgeRuntime is a no-op for now.\n // Future: reconnect connectors, reload ai-assets, update subagents.\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.driver) throw new Error(\"Runtime not started — call start() first\");\n await this.driver.prompt(message);\n }\n\n async reply(answer: string): Promise<void> {\n // Claude SDK treats replies the same as prompts (multi-turn via streamInput)\n await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.driver) {\n await this.driver.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.driver) {\n if (this.boundEventHandler) {\n this.driver.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.driver.kill();\n this.driver = null;\n }\n this.normalizer.reset();\n }\n\n onEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.add(handler);\n }\n\n offEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.delete(handler);\n }\n\n get isRunning(): boolean {\n return this.driver?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified driver.\n *\n * @param driverId - Registered driver id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected driver with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(driverId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(driverId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\n/**\n * Result of an API key validation check performed by {@link validateApiKey}.\n *\n * @docLink packages/bridge/api-reference#validation\n */\nexport interface ValidationResult {\n /** `true` when the API key was accepted by the provider's models endpoint. */\n ok: boolean;\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n}\n\ninterface ProviderValidationConfig {\n url: string;\n headers: (key: string) => Record<string, string>;\n queryParam?: string;\n}\n\nconst PROVIDER_CONFIGS: Record<string, ProviderValidationConfig> = {\n anthropic: {\n url: \"https://api.anthropic.com/v1/models\",\n headers: (key) => ({ \"x-api-key\": key, \"anthropic-version\": \"2023-06-01\" }),\n },\n openai: {\n url: \"https://api.openai.com/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n openrouter: {\n url: \"https://openrouter.ai/api/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n mistral: {\n url: \"https://api.mistral.ai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n groq: {\n url: \"https://api.groq.com/openai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n deepseek: {\n url: \"https://api.deepseek.com/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n xai: {\n url: \"https://api.x.ai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n together: {\n url: \"https://api.together.xyz/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n fireworks: {\n url: \"https://api.fireworks.ai/inference/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n google: {\n url: \"https://generativelanguage.googleapis.com/v1beta/models\",\n headers: () => ({}),\n queryParam: \"key\",\n },\n};\n\n/**\n * Validate an API key by sending a lightweight GET request to the provider's models endpoint.\n *\n * Returns `{ ok: true }` when the provider accepts the key (HTTP 2xx). Returns\n * `{ ok: false, error }` on 401/403 (invalid key), other HTTP errors, network failures,\n * or unsupported providers. Requests time out after 8 seconds.\n *\n * @param provider - Provider name matching a key in the internal `PROVIDER_CONFIGS` map\n * (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param key - API key to validate.\n * @returns Validation result with optional error description.\n * @docLink packages/bridge/api-reference#validation\n */\nexport async function validateApiKey(provider: string, key: string): Promise<ValidationResult> {\n const config = PROVIDER_CONFIGS[provider];\n if (!config) return { ok: false, error: `Unknown provider: ${provider}` };\n\n let url = config.url;\n if (config.queryParam) url += `?${config.queryParam}=${encodeURIComponent(key)}`;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: config.headers(key),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) return { ok: true };\n\n const status = response.status;\n if (status === 401 || status === 403) {\n return { ok: false, error: \"Invalid API key (authentication failed)\" };\n }\n return { ok: false, error: `API returned HTTP ${status}` };\n } catch (err: any) {\n if (err.name === \"AbortError\") return { ok: false, error: \"Request timed out (8s)\" };\n return { ok: false, error: err.message ?? \"Network error\" };\n }\n}\n"]}
1
+ {"version":3,"sources":["../bridge/src/normalizer.ts","../bridge/src/runtime.ts","../bridge/src/validation.ts"],"names":[],"mappings":"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","file":"chunk-OSJH4SPO.js","sourcesContent":["/**\n * EventNormalizer — converts bridge-level AgentEvent (raw driver events) to\n * skaile-agent-types AgentEvent (normalized, human-readable events).\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call reset() between sessions.\n */\n\nimport type { AgentEvent as NormalizedEvent } from \"@skaile/workspaces/types\";\nimport { classifyClaudeSdkError } from \"./error-classifier.js\";\nimport type { AgentMessage, AgentEvent as BridgeEvent, ContentBlock } from \"./types.js\";\n\n/**\n * Converts raw bridge-level {@link BridgeEvent} payloads into normalized\n * `@skaile/workspaces/types` `AgentEvent` payloads consumed by the runner and transport.\n *\n * Stateful: tracks active subagents and dev-server detection across a session.\n * Call {@link EventNormalizer.reset} between sessions to clear accumulated state.\n *\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport class EventNormalizer {\n private activeSubagents = new Map<string, string>();\n private devServerStartingEmitted = false;\n private devServerReadyEmitted = false;\n /** True when message_update deltas have been emitted for the current message. */\n private hasStreamedText = false;\n\n /**\n * Convert a single bridge event into zero or more normalized events.\n * One bridge event can produce multiple normalized events (e.g., a message_start\n * with text + tool_use blocks produces both text and tool_call events).\n */\n normalize(event: BridgeEvent): NormalizedEvent[] {\n switch (event.type) {\n case \"message_start\":\n return this.handleMessageStart(event.message);\n\n case \"message_update\":\n return this.handleMessageUpdate(event);\n\n case \"message_end\":\n return [];\n\n case \"turn_end\":\n return this.handleTurnEnd(event.toolResults);\n\n case \"result\":\n return this.handleResult(event);\n\n case \"error\":\n return [\n {\n type: \"error\",\n message: event.error,\n fatal: event.fatal ?? true,\n category: event.detail?.category,\n ...(event.detail?.hint ? { hint: event.detail.hint } : {}),\n },\n ];\n\n case \"tool_call\":\n // Already handled in message_start — emit status only\n return [{ type: \"status\", phase: \"working\" }];\n\n case \"tool_execution_end\":\n return [];\n\n case \"agent_end\":\n return [{ type: \"status\", phase: \"idle\" }];\n\n case \"commands_available\":\n // Pass through to transport — the gateway caches this event\n return [event as unknown as NormalizedEvent];\n\n case \"session_info\":\n // Pass through to transport — the forge layer stores the OMP session ID\n return [event as unknown as NormalizedEvent];\n\n case \"ui_render\":\n case \"ui_render_update\":\n case \"ui_clear\":\n // Pass through verbatim — drivers that implement the Agent UI Protocol emit these directly\n return [event as unknown as NormalizedEvent];\n\n default:\n return [];\n }\n }\n\n /** Clear all stateful tracking between sessions. */\n reset(): void {\n this.activeSubagents.clear();\n this.devServerStartingEmitted = false;\n this.devServerReadyEmitted = false;\n this.hasStreamedText = false;\n }\n\n // ---------------------------------------------------------------------------\n // message_start → text, tool_call, question, subagent\n // ---------------------------------------------------------------------------\n\n private handleMessageStart(message: AgentMessage): NormalizedEvent[] {\n // Only process assistant messages. Drivers (e.g. omp) may echo the user's\n // message as a message_start with role:\"user\" before streaming the response.\n // Emitting a text event for that echo would prepend the user's input to the\n // assistant bubble on the frontend.\n if (message.role !== \"assistant\") return [];\n\n const events: NormalizedEvent[] = [];\n const blocks = this.getContentBlocks(message);\n\n for (const block of blocks) {\n if (block.type === \"text\" && block.text) {\n // Skip full text if we already streamed it via message_update deltas\n if (!this.hasStreamedText) {\n events.push({ type: \"text\", content: block.text });\n }\n } else if (block.type === \"tool_use\" && block.name) {\n events.push(...this.handleToolUse(block));\n }\n }\n\n this.hasStreamedText = false;\n return events;\n }\n\n private handleToolUse(block: ContentBlock): NormalizedEvent[] {\n const name = block.name!;\n const input = (block.input ?? {}) as Record<string, unknown>;\n const events: NormalizedEvent[] = [];\n\n if (name === \"AskUserQuestion\") {\n // Claude SDK sends { questions: [{ question, header, options: [{ label, description }] }] }\n // Legacy/simple format sends { question: string, options?: string[] }\n const questions = input.questions;\n if (Array.isArray(questions)) {\n for (const q of questions) {\n const qObj = q as Record<string, unknown>;\n const question = String(qObj.question ?? \"\");\n const rawOpts = qObj.options;\n const options = Array.isArray(rawOpts)\n ? rawOpts.map((o: any) => (typeof o === \"string\" ? o : String(o.label ?? o)))\n : undefined;\n events.push({ type: \"question\", question, options });\n }\n } else {\n const question = String(input.question ?? input.text ?? \"\");\n const rawOptions = input.options;\n const options = Array.isArray(rawOptions) ? rawOptions.map(String) : undefined;\n events.push({ type: \"question\", question, options });\n }\n } else if (name === \"Agent\") {\n const agentName = String(input.subagent_type ?? input.description ?? \"unknown\");\n const description = String(input.description ?? input.prompt ?? \"\").slice(0, 200);\n if (block.id) {\n this.activeSubagents.set(block.id, agentName);\n }\n events.push({ type: \"subagent\", name: agentName, status: \"started\", description });\n events.push({ type: \"status\", phase: \"working\" });\n } else {\n events.push({\n type: \"tool_call\",\n tool: name,\n input,\n summary: summarizeToolCall(name, input),\n });\n events.push({ type: \"status\", phase: \"working\" });\n\n if (name === \"Bash\" && typeof input.command === \"string\") {\n const devEvent = this.detectDevServerStarting(input.command);\n if (devEvent) events.push(devEvent);\n }\n }\n\n return events;\n }\n\n // ---------------------------------------------------------------------------\n // message_update → streaming text\n // ---------------------------------------------------------------------------\n\n private handleMessageUpdate(event: BridgeEvent): NormalizedEvent[] {\n const delta = (event as any)._textDelta as string | undefined;\n if (delta) {\n this.hasStreamedText = true;\n return [{ type: \"text\", content: delta }];\n }\n return [];\n }\n\n // ---------------------------------------------------------------------------\n // turn_end → tool_result, subagent finished, file_changed, dev_server\n // ---------------------------------------------------------------------------\n\n private handleTurnEnd(toolResults?: AgentMessage[]): NormalizedEvent[] {\n if (!toolResults?.length) return [];\n\n const events: NormalizedEvent[] = [];\n\n for (const result of toolResults) {\n const toolName = result.toolName ?? \"unknown\";\n const outputData = result.data ?? result.content;\n const output = typeof outputData === \"string\" ? outputData : JSON.stringify(outputData);\n\n // Check if this is a subagent result\n if (toolName === \"Agent\" || this.isSubagentResult(result)) {\n const agentName = this.resolveSubagentName(result);\n const description = output.slice(0, 200);\n events.push({ type: \"subagent\", name: agentName, status: \"finished\", description });\n\n if (agentName === \"dev-server\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n } else {\n events.push({\n type: \"tool_result\",\n tool: toolName,\n output: outputData,\n summary: summarizeToolResult(toolName, outputData),\n });\n\n // Detect file changes from Write/Edit results\n const fileEvents = detectFileChanges(toolName, outputData);\n if (fileEvents.length > 0) events.push(...fileEvents);\n\n // Detect dev server from Bash output\n if (toolName === \"Bash\") {\n const devEvent = this.detectDevServerReady(output);\n if (devEvent) events.push(devEvent);\n }\n }\n }\n\n return events;\n }\n\n private isSubagentResult(result: AgentMessage): boolean {\n // Check if the tool result's id maps to a tracked subagent\n if (result.toolName && this.activeSubagents.has(result.toolName)) return true;\n return false;\n }\n\n private resolveSubagentName(result: AgentMessage): string {\n // toolName on bridge AgentMessage is resolved from toolIdToName in the driver\n const name = result.toolName ? this.activeSubagents.get(result.toolName) : undefined;\n if (name) {\n this.activeSubagents.delete(result.toolName!);\n return name;\n }\n return result.toolName ?? \"unknown\";\n }\n\n // ---------------------------------------------------------------------------\n // result → finished or error\n // ---------------------------------------------------------------------------\n\n private handleResult(event: BridgeEvent & { type: \"result\" }): NormalizedEvent[] {\n if (event.subtype === \"success\") {\n return [\n {\n type: \"finished\",\n summary: event.summary ?? \"Task completed\",\n costUsd: event.costUsd ?? 0,\n ...(event.tokens ? { tokens: event.tokens } : {}),\n },\n ];\n }\n\n const errors = event.errors ?? [];\n // Run the same classifier the claude-sdk driver uses on its `error`\n // event so the result-error path also surfaces a category and hint\n // (drivers other than claude-sdk emit `result` without a paired\n // `error`, so this is the only place they get classified).\n const detail = classifyClaudeSdkError({ errors, subtype: event.subtype });\n return [\n {\n type: \"error\",\n message: `Agent stopped: ${event.subtype}${errors.length ? ` — ${errors.join(\"; \")}` : \"\"}`,\n fatal: event.subtype === \"error_during_execution\",\n category: detail.category,\n ...(detail.hint ? { hint: detail.hint } : {}),\n },\n ];\n }\n\n // ---------------------------------------------------------------------------\n // Dev server detection\n // ---------------------------------------------------------------------------\n\n private detectDevServerStarting(command: string): NormalizedEvent | null {\n if (this.devServerStartingEmitted) return null;\n const cmd = command.toLowerCase();\n const isFrontendStart =\n (cmd.includes(\"pnpm run dev\") || cmd.includes(\"pnpm dev\") || cmd.includes(\"vite\")) &&\n (cmd.includes(\"frontend\") || cmd.includes(\"dev:preview\"));\n if (isFrontendStart) {\n this.devServerStartingEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"starting\" };\n }\n return null;\n }\n\n private detectDevServerReady(text: string): NormalizedEvent | null {\n if (this.devServerReadyEmitted) return null;\n\n const explicitMatch = text.match(/DEVSERVER_READY:(https?:\\/\\/[^\\s\"\\\\]+)/);\n if (explicitMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: explicitMatch[1]!, status: \"ready\" };\n }\n\n const viteMatch = text.match(/Local:\\s+(https?:\\/\\/localhost:\\d+)/);\n if (viteMatch) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: viteMatch[1]!, status: \"ready\" };\n }\n\n if (text.includes(\"FRONTEND_READY\")) {\n this.devServerReadyEmitted = true;\n return { type: \"dev_server\", url: \"http://localhost:3000\", status: \"ready\" };\n }\n\n return null;\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n private getContentBlocks(message: AgentMessage): ContentBlock[] {\n if (Array.isArray(message.content)) return message.content;\n if (typeof message.content === \"string\" && message.content) {\n return [{ type: \"text\", text: message.content }];\n }\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Pure helper functions (exported for reuse)\n// ---------------------------------------------------------------------------\n\n/**\n * Produce a human-readable one-line summary of a tool call for the activity log.\n *\n * Returns a string like `$ git status` for Bash, `Read src/index.ts` for Read, etc.\n * Falls back to `ToolName({...input...})` for unrecognised tools.\n *\n * @param tool - Tool name (e.g. `\"Bash\"`, `\"Write\"`, `\"Grep\"`).\n * @param input - Tool input record passed to the call.\n * @returns A short display string suitable for the activity feed.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolCall(tool: string, input: Record<string, unknown>): string {\n switch (tool) {\n case \"Bash\":\n return `$ ${String(input.command ?? \"\").slice(0, 200)}`;\n case \"Write\":\n return `Create ${String(input.file_path)}`;\n case \"Edit\":\n return `Edit ${String(input.file_path)}`;\n case \"Read\":\n return `Read ${String(input.file_path)}`;\n case \"Glob\":\n return `Find ${String(input.pattern)}`;\n case \"Grep\":\n return `Search for ${String(input.pattern)}`;\n default:\n return `${tool}(${JSON.stringify(input).slice(0, 100)})`;\n }\n}\n\n/** Extract plain text from an Anthropic content-block array (e.g. tool results returned by Claude SDK). */\nfunction extractContentBlockText(blocks: unknown[]): string | null {\n const textBlocks = blocks.filter(\n (b): b is { type: \"text\"; text: string } =>\n typeof b === \"object\" &&\n b !== null &&\n (b as Record<string, unknown>).type === \"text\" &&\n typeof (b as Record<string, unknown>).text === \"string\",\n );\n if (textBlocks.length === 0) return null;\n return textBlocks.map((b) => b.text).join(\"\\n\");\n}\n\n/**\n * Produce a human-readable one-line summary of a tool result for the activity log.\n *\n * Handles Bash stdout/stderr, Write/Edit file paths, ApplyPatch change counts, and\n * Anthropic content-block arrays. Falls back to `JSON.stringify` for unknown shapes.\n *\n * @param tool - Tool name.\n * @param result - Raw tool result payload.\n * @returns A short display string, truncated to 200 characters.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function summarizeToolResult(tool: string, result: unknown): string {\n // Handle Anthropic content-block arrays: [{ type: \"text\", text: \"...\" }, ...]\n if (Array.isArray(result)) {\n const text = extractContentBlockText(result);\n return (text ?? JSON.stringify(result)).slice(0, 200);\n }\n if (typeof result !== \"object\" || !result) {\n return String(result).slice(0, 200);\n }\n const r = result as Record<string, unknown>;\n switch (tool) {\n case \"Bash\": {\n const stderr = String(r.stderr ?? \"\").trim();\n if (stderr) return `stderr: ${stderr.slice(0, 200)}`;\n return (\n String(r.stdout ?? \"\")\n .trim()\n .slice(0, 200) || \"(no output)\"\n );\n }\n case \"Write\":\n return `${String(r.type)}: ${String(r.filePath)}`;\n case \"Edit\":\n return `Edited ${String(r.filePath)}`;\n case \"ApplyPatch\":\n return `${Array.isArray(r.changes) ? r.changes.length : 0} file changes`;\n default:\n return JSON.stringify(result).slice(0, 200);\n }\n}\n\n/**\n * Detect file-change events from a tool result, returning zero or more `file_changed` events.\n *\n * Handles `Write` (single create/edit), `Edit` (single edit), and `ApplyPatch` (multi-file\n * patch with per-change `kind` classification). Returns an empty array for all other tools.\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns Array of `file_changed` normalized events.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChanges(toolName: string, result: unknown): NormalizedEvent[] {\n if (typeof result !== \"object\" || !result) return [];\n const r = result as Record<string, unknown>;\n\n if (toolName === \"Write\" && r.filePath) {\n return [\n {\n type: \"file_changed\",\n path: String(r.filePath),\n action: r.type === \"create\" ? \"create\" : \"edit\",\n },\n ];\n }\n if (toolName === \"Edit\" && r.filePath) {\n return [{ type: \"file_changed\", path: String(r.filePath), action: \"edit\" }];\n }\n if (toolName === \"ApplyPatch\" && Array.isArray(r.changes)) {\n return r.changes\n .filter(\n (change): change is { path: string; kind: \"add\" | \"delete\" | \"update\" } =>\n typeof change === \"object\" &&\n change !== null &&\n typeof (change as Record<string, unknown>).path === \"string\" &&\n typeof (change as Record<string, unknown>).kind === \"string\",\n )\n .map((change) => ({\n type: \"file_changed\" as const,\n path: change.path,\n action: change.kind === \"add\" ? \"create\" : change.kind === \"delete\" ? \"delete\" : \"edit\",\n }));\n }\n\n return [];\n}\n\n/**\n * Backward-compatible single-event helper; returns the first `file_changed` event or `null`.\n *\n * Prefer {@link detectFileChanges} for multi-file patches (e.g. `ApplyPatch`).\n *\n * @param toolName - Name of the tool that produced the result.\n * @param result - Raw tool result payload.\n * @returns First detected `file_changed` event, or `null`.\n * @docLink packages/bridge/api-reference#normalizer\n */\nexport function detectFileChange(toolName: string, result: unknown): NormalizedEvent | null {\n return detectFileChanges(toolName, result)[0] ?? null;\n}\n","/**\n * BridgeRuntime — implements IAgentRuntime from @skaile/workspaces/types by wrapping\n * an AgentDriver + EventNormalizer. This is the primary integration point for\n * consumers that want normalized events from any driver.\n */\n\nimport type {\n AgentEvent,\n AgentReconfigureOptions,\n AgentRuntimeConfig,\n IAgentRuntime,\n} from \"@skaile/workspaces/types\";\n\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { createDriver } from \"./registry.js\";\nimport type { AgentConfig, AgentDriver } from \"./types.js\";\n\n/**\n * Implements `IAgentRuntime` from `@skaile/workspaces/types` by wrapping an {@link AgentDriver}\n * and an {@link EventNormalizer}.\n *\n * This is the primary integration point for consumers that want normalized `AgentEvent`\n * payloads from any driver without managing the driver lifecycle directly. Create via\n * {@link createRuntime} to avoid coupling to `BridgeRuntime` directly.\n *\n * @docLink packages/bridge/api-reference#runtime\n */\nexport class BridgeRuntime implements IAgentRuntime {\n private driver: AgentDriver | null = null;\n private normalizer = new EventNormalizer();\n private handlers = new Set<(event: AgentEvent) => void>();\n private boundEventHandler: ((event: any) => void) | null = null;\n private driverId: string;\n\n constructor(driverId: string = \"claude-sdk\") {\n this.driverId = driverId;\n }\n\n async start(config: AgentRuntimeConfig): Promise<void> {\n // Dispose previous driver if any\n if (this.driver) {\n await this.dispose();\n }\n\n this.normalizer.reset();\n\n const bridgeConfig: AgentConfig = {\n cwd: config.cwd,\n provider: config.provider,\n model: config.model,\n systemPrompt: config.systemPrompt,\n apiKeys: config.apiKeys,\n env: config.env,\n agentDir: config.agentDir,\n sessionId: config.sessionId,\n resumeSessionId: config.resumeSessionId,\n maxTurns: config.maxTurns,\n };\n\n this.driver = await createDriver(this.driverId, bridgeConfig);\n\n // Wire bridge events through normalizer to handlers\n this.boundEventHandler = (bridgeEvent: any) => {\n const normalized = this.normalizer.normalize(bridgeEvent);\n for (const event of normalized) {\n for (const handler of this.handlers) {\n handler(event);\n }\n }\n };\n this.driver.on(\"agent-event\", this.boundEventHandler);\n\n await this.driver.start();\n }\n\n async configure(_config: AgentReconfigureOptions): Promise<void> {\n // Runtime reconfiguration for BridgeRuntime is a no-op for now.\n // Future: reconnect connectors, reload ai-assets, update subagents.\n }\n\n async prompt(message: string): Promise<void> {\n if (!this.driver) throw new Error(\"Runtime not started — call start() first\");\n await this.driver.prompt(message);\n }\n\n async reply(answer: string): Promise<void> {\n // Claude SDK treats replies the same as prompts (multi-turn via streamInput)\n await this.prompt(answer);\n }\n\n async abort(): Promise<void> {\n if (this.driver) {\n await this.driver.abort();\n }\n }\n\n async dispose(): Promise<void> {\n if (this.driver) {\n if (this.boundEventHandler) {\n this.driver.off(\"agent-event\", this.boundEventHandler);\n this.boundEventHandler = null;\n }\n this.driver.kill();\n this.driver = null;\n }\n this.normalizer.reset();\n }\n\n onEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.add(handler);\n }\n\n offEvent(handler: (event: AgentEvent) => void): void {\n this.handlers.delete(handler);\n }\n\n get isRunning(): boolean {\n return this.driver?.isRunning ?? false;\n }\n}\n\n/**\n * Factory function to create a {@link BridgeRuntime} with the specified driver.\n *\n * @param driverId - Registered driver id (default: `\"claude-sdk\"`).\n * @returns A new `IAgentRuntime` wrapping the selected driver with event normalization.\n * @docLink packages/bridge/api-reference#runtime\n */\nexport function createRuntime(driverId: string = \"claude-sdk\"): IAgentRuntime {\n return new BridgeRuntime(driverId);\n}\n","/** Provider API key validation — hits each provider's models endpoint to verify the key works. */\n\n/**\n * Result of an API key validation check performed by {@link validateApiKey}.\n *\n * @docLink packages/bridge/api-reference#validation\n */\nexport interface ValidationResult {\n /** `true` when the API key was accepted by the provider's models endpoint. */\n ok: boolean;\n /** Human-readable error description when `ok` is `false`. */\n error?: string;\n}\n\ninterface ProviderValidationConfig {\n url: string;\n headers: (key: string) => Record<string, string>;\n queryParam?: string;\n}\n\nconst PROVIDER_CONFIGS: Record<string, ProviderValidationConfig> = {\n anthropic: {\n url: \"https://api.anthropic.com/v1/models\",\n headers: (key) => ({ \"x-api-key\": key, \"anthropic-version\": \"2023-06-01\" }),\n },\n openai: {\n url: \"https://api.openai.com/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n openrouter: {\n url: \"https://openrouter.ai/api/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n mistral: {\n url: \"https://api.mistral.ai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n groq: {\n url: \"https://api.groq.com/openai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n deepseek: {\n url: \"https://api.deepseek.com/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n xai: {\n url: \"https://api.x.ai/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n together: {\n url: \"https://api.together.xyz/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n fireworks: {\n url: \"https://api.fireworks.ai/inference/v1/models\",\n headers: (key) => ({ Authorization: `Bearer ${key}` }),\n },\n google: {\n url: \"https://generativelanguage.googleapis.com/v1beta/models\",\n headers: () => ({}),\n queryParam: \"key\",\n },\n};\n\n/**\n * Validate an API key by sending a lightweight GET request to the provider's models endpoint.\n *\n * Returns `{ ok: true }` when the provider accepts the key (HTTP 2xx). Returns\n * `{ ok: false, error }` on 401/403 (invalid key), other HTTP errors, network failures,\n * or unsupported providers. Requests time out after 8 seconds.\n *\n * @param provider - Provider name matching a key in the internal `PROVIDER_CONFIGS` map\n * (e.g. `\"anthropic\"`, `\"openai\"`, `\"google\"`).\n * @param key - API key to validate.\n * @returns Validation result with optional error description.\n * @docLink packages/bridge/api-reference#validation\n */\nexport async function validateApiKey(provider: string, key: string): Promise<ValidationResult> {\n const config = PROVIDER_CONFIGS[provider];\n if (!config) return { ok: false, error: `Unknown provider: ${provider}` };\n\n let url = config.url;\n if (config.queryParam) url += `?${config.queryParam}=${encodeURIComponent(key)}`;\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 8000);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: config.headers(key),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (response.ok) return { ok: true };\n\n const status = response.status;\n if (status === 401 || status === 403) {\n return { ok: false, error: \"Invalid API key (authentication failed)\" };\n }\n return { ok: false, error: `API returned HTTP ${status}` };\n } catch (err: any) {\n if (err.name === \"AbortError\") return { ok: false, error: \"Request timed out (8s)\" };\n return { ok: false, error: err.message ?? \"Network error\" };\n }\n}\n"]}
@@ -1,11 +1,12 @@
1
- import { WorkspacePlugin } from './chunk-5IC6CJL4.js';
2
- import { PROTOCOL_VERSION } from './chunk-O5AE4QDX.js';
1
+ import { WorkspacePlugin } from './chunk-BTKNSMLK.js';
3
2
  import { WebSocketServerTransport } from './chunk-PBWMV5GM.js';
4
- import { EventNormalizer } from './chunk-K3TMZI6D.js';
3
+ import { assembleSystemPrompt, buildCapabilitiesPromptSection } from './chunk-W3UDISS2.js';
4
+ import { PROTOCOL_VERSION } from './chunk-TDSRLMDB.js';
5
+ import { EventNormalizer } from './chunk-OSJH4SPO.js';
5
6
  import { classifyClaudeSdkError } from './chunk-EWP5HZBV.js';
6
- import { createDriver } from './chunk-AE6GCXGL.js';
7
+ import { createDriver } from './chunk-S7RACIZI.js';
7
8
  import { deployCatalogEntry, undeployCatalogEntry } from './chunk-LV2HPH3C.js';
8
- import { registerBuiltinConnectors, findMissingPackages, installNpmPackages, ConnectorManager, ConnectorStartupError, buildConnectorPromptSection, buildSdkConnectorTools } from './chunk-EPGHAOEU.js';
9
+ import { registerBuiltinConnectors, findMissingPackages, installNpmPackages, ConnectorManager, ConnectorStartupError, buildConnectorPromptSection, buildSdkConnectorTools } from './chunk-UHSC75L7.js';
9
10
  import { loadConnectorDeclarations, PreMintedSecretProvider, InMemorySecretProvider } from './chunk-W75ASXH4.js';
10
11
  import { renderStimulusPrompt, buildOrchestratorPrompt } from './chunk-GZWJGNNN.js';
11
12
  import { resolveSettings, resolveApiKey, providerEnvKey } from './chunk-4RUVG5GX.js';
@@ -242,6 +243,7 @@ function defineCapability(args) {
242
243
  userInvokable: args.userInvokable,
243
244
  audience: args.audience,
244
245
  promptFragment: args.promptFragment,
246
+ callTimeoutMs: args.callTimeoutMs,
245
247
  render: args.render,
246
248
  inputZod: args.input,
247
249
  outputZod: args.output,
@@ -705,20 +707,6 @@ async function loadAgentManifest(agentDir) {
705
707
  return void 0;
706
708
  }
707
709
  }
708
-
709
- // runner/src/prompt-assembly.ts
710
- function assembleSystemPrompt(parts) {
711
- const filtered = parts.filter((p) => !!p);
712
- if (filtered.length === 0) return void 0;
713
- return filtered.join("\n\n---\n\n");
714
- }
715
- function buildCapabilitiesPromptSection(registry) {
716
- const body = registry.composePromptSection();
717
- if (!body) return void 0;
718
- return `<CAPABILITIES>
719
- ${body}
720
- </CAPABILITIES>`;
721
- }
722
710
  var RecipeUnavailableError = class extends Error {
723
711
  constructor(flakeRef, attr, cause) {
724
712
  super(
@@ -1885,6 +1873,7 @@ var CapabilityRegistry = class {
1885
1873
  userInvokable: cap.userInvokable,
1886
1874
  audience: cap.audience,
1887
1875
  promptFragment: cap.promptFragment,
1876
+ callTimeoutMs: cap.callTimeoutMs,
1888
1877
  render: cap.render
1889
1878
  };
1890
1879
  }
@@ -1914,6 +1903,11 @@ var HYDRATED_REJECT_HANDLER = async () => {
1914
1903
 
1915
1904
  // runner/src/capability-roundtrip.ts
1916
1905
  var DEFAULT_CAPABILITY_CALL_TIMEOUT_MS = 6e4;
1906
+ function resolveCapabilityCallTimeoutMs(cap, approvalTimeoutMs) {
1907
+ if (typeof cap.callTimeoutMs === "number") return cap.callTimeoutMs;
1908
+ if (cap.requiresApproval) return approvalTimeoutMs;
1909
+ return DEFAULT_CAPABILITY_CALL_TIMEOUT_MS;
1910
+ }
1917
1911
  function buildClientCapabilityHandler(args) {
1918
1912
  const timeoutMs = args.timeoutMs ?? DEFAULT_CAPABILITY_CALL_TIMEOUT_MS;
1919
1913
  const gen = args.generateCallId ?? (() => `cap-${Date.now()}-${Math.floor(Math.random() * 1e9)}`);
@@ -2779,11 +2773,12 @@ async function startAgentServer(opts) {
2779
2773
  };
2780
2774
  const APPROVAL_REQUIRED_CAPABILITY_TIMEOUT_MS = 15 * 60 * 1e3;
2781
2775
  function buildClientCapabilityHandler2(wire) {
2776
+ const timeoutMs = resolveCapabilityCallTimeoutMs(wire, APPROVAL_REQUIRED_CAPABILITY_TIMEOUT_MS);
2782
2777
  return buildClientCapabilityHandler({
2783
2778
  wire,
2784
2779
  pending: pendingCapabilityCalls,
2785
2780
  emit: (event) => sendEvent(event),
2786
- timeoutMs: wire.requiresApproval ? APPROVAL_REQUIRED_CAPABILITY_TIMEOUT_MS : DEFAULT_CAPABILITY_CALL_TIMEOUT_MS
2781
+ timeoutMs
2787
2782
  });
2788
2783
  }
2789
2784
  function buildCapabilityHooks() {
@@ -4133,6 +4128,6 @@ function touchSession(state) {
4133
4128
  return { ...state, updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
4134
4129
  }
4135
4130
 
4136
- export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, MarkdownStreamer, PreInitRingSink, agentDefinitionExists, assembleSystemPrompt, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildCapabilitiesPromptSection, buildClientCapabilityHandler, buildContextSection, buildEnvironmentSection, builtinCapabilities, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, createAgentSession, createSessionStimulusBus, defineCapability, deleteSession, emitSystemPromptComposed, ensureGitConfigInclude, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, installPreInitRingSink, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadSession, loadSessionById, newSession, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityResult, resolveComposition, resolveMixin, runAgentChat, saveSession, setCurrentSession, startAgentServer, touchSession, writeClaudeCodeCredentialsFile };
4137
- //# sourceMappingURL=chunk-QZ6PY73K.js.map
4138
- //# sourceMappingURL=chunk-QZ6PY73K.js.map
4131
+ export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, MarkdownStreamer, PreInitRingSink, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildContextSection, buildEnvironmentSection, builtinCapabilities, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, createAgentSession, createSessionStimulusBus, defineCapability, deleteSession, emitSystemPromptComposed, ensureGitConfigInclude, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, installPreInitRingSink, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadSession, loadSessionById, newSession, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveMixin, runAgentChat, saveSession, setCurrentSession, startAgentServer, touchSession, writeClaudeCodeCredentialsFile };
4132
+ //# sourceMappingURL=chunk-OVM36NYF.js.map
4133
+ //# sourceMappingURL=chunk-OVM36NYF.js.map