@skaile/workspaces 0.48.1 → 0.48.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/{asset-feeds-DLRQWELS.js → asset-feeds-O6R6J4RI.js} +7 -7
  3. package/dist/{asset-feeds-DLRQWELS.js.map → asset-feeds-O6R6J4RI.js.map} +1 -1
  4. package/dist/asset-manager/index.js +5 -5
  5. package/dist/asset-manager/installer.js +4 -4
  6. package/dist/asset-manager/src/index.d.ts.map +1 -1
  7. package/dist/asset-manager/src/installer.d.ts.map +1 -1
  8. package/dist/bridge/drivers/claude-sdk.js +91 -1
  9. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  10. package/dist/bridge/drivers/codex.js +1 -1
  11. package/dist/bridge/drivers/continue.js +2 -2
  12. package/dist/bridge/drivers/echo.js +1 -1
  13. package/dist/bridge/drivers/gemini.js +3 -3
  14. package/dist/bridge/drivers/goose.js +2 -2
  15. package/dist/bridge/drivers/omp.js +1 -1
  16. package/dist/bridge/drivers/opencode.js +2 -2
  17. package/dist/bridge/drivers/qwen.js +3 -3
  18. package/dist/bridge/index.js +2 -2
  19. package/dist/bridge/src/drivers/claude-sdk.d.ts +30 -0
  20. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  21. package/dist/bridge/src/types.d.ts +21 -0
  22. package/dist/bridge/src/types.d.ts.map +1 -1
  23. package/dist/{chunk-HOEP5CJQ.js → chunk-33WB7VFV.js} +3 -3
  24. package/dist/{chunk-HOEP5CJQ.js.map → chunk-33WB7VFV.js.map} +1 -1
  25. package/dist/{chunk-P6HRQPXC.js → chunk-3A3OACI2.js} +2 -2
  26. package/dist/{chunk-P6HRQPXC.js.map → chunk-3A3OACI2.js.map} +1 -1
  27. package/dist/{chunk-Z3ZRI2AE.js → chunk-4IGNQG6E.js} +3 -3
  28. package/dist/{chunk-Z3ZRI2AE.js.map → chunk-4IGNQG6E.js.map} +1 -1
  29. package/dist/{chunk-Z3GAAIJK.js → chunk-6AD3NS7R.js} +4 -4
  30. package/dist/{chunk-Z3GAAIJK.js.map → chunk-6AD3NS7R.js.map} +1 -1
  31. package/dist/{chunk-RSK6FDMV.js → chunk-6VUP6XHK.js} +3 -3
  32. package/dist/{chunk-RSK6FDMV.js.map → chunk-6VUP6XHK.js.map} +1 -1
  33. package/dist/{chunk-SALVPTK3.js → chunk-BWCGSGAC.js} +7 -7
  34. package/dist/{chunk-SALVPTK3.js.map → chunk-BWCGSGAC.js.map} +1 -1
  35. package/dist/{chunk-BDM5UVU3.js → chunk-CK3O5BCT.js} +11 -10
  36. package/dist/chunk-CK3O5BCT.js.map +1 -0
  37. package/dist/{chunk-KC7V5XCO.js → chunk-EBSIZYM6.js} +4 -4
  38. package/dist/{chunk-KC7V5XCO.js.map → chunk-EBSIZYM6.js.map} +1 -1
  39. package/dist/{chunk-FAALG3QN.js → chunk-HNORRENR.js} +3 -3
  40. package/dist/{chunk-FAALG3QN.js.map → chunk-HNORRENR.js.map} +1 -1
  41. package/dist/{chunk-4VPRAG35.js → chunk-LTUTK2Q3.js} +14 -12
  42. package/dist/chunk-LTUTK2Q3.js.map +1 -0
  43. package/dist/{chunk-OCAQH66V.js → chunk-N5AE5SOC.js} +28 -2
  44. package/dist/chunk-N5AE5SOC.js.map +1 -0
  45. package/dist/{chunk-5C3QJSOD.js → chunk-OYMSCV7T.js} +3 -3
  46. package/dist/{chunk-5C3QJSOD.js.map → chunk-OYMSCV7T.js.map} +1 -1
  47. package/dist/{chunk-LLOXWWB6.js → chunk-P4BDTJMI.js} +85 -4
  48. package/dist/chunk-P4BDTJMI.js.map +1 -0
  49. package/dist/{chunk-WTFJFW7F.js → chunk-PBO6SCT2.js} +2 -2
  50. package/dist/{chunk-WTFJFW7F.js.map → chunk-PBO6SCT2.js.map} +1 -1
  51. package/dist/{chunk-G3GODNHM.js → chunk-SDAKQCOB.js} +3 -3
  52. package/dist/{chunk-G3GODNHM.js.map → chunk-SDAKQCOB.js.map} +1 -1
  53. package/dist/{chunk-XHDPCL4O.js → chunk-SXT6BAQJ.js} +2 -2
  54. package/dist/{chunk-XHDPCL4O.js.map → chunk-SXT6BAQJ.js.map} +1 -1
  55. package/dist/{chunk-3VBQJZYL.js → chunk-WBF7JLTY.js} +3 -3
  56. package/dist/{chunk-3VBQJZYL.js.map → chunk-WBF7JLTY.js.map} +1 -1
  57. package/dist/{chunk-ILMBTQSB.js → chunk-YERSEKB2.js} +5 -5
  58. package/dist/{chunk-ILMBTQSB.js.map → chunk-YERSEKB2.js.map} +1 -1
  59. package/dist/{chunk-T2CIVTTC.js → chunk-ZJ3VRPOI.js} +7 -3
  60. package/dist/chunk-ZJ3VRPOI.js.map +1 -0
  61. package/dist/cli/index.js +88 -36
  62. package/dist/cli/index.js.map +1 -1
  63. package/dist/cli/src/commands/source.d.ts +18 -0
  64. package/dist/cli/src/commands/source.d.ts.map +1 -1
  65. package/dist/connectors/config.js +4 -4
  66. package/dist/connectors/index.js +5 -5
  67. package/dist/connectors/src/config.d.ts.map +1 -1
  68. package/dist/connectors/src/materialized-connectors.d.ts.map +1 -1
  69. package/dist/core/index.js +3 -3
  70. package/dist/core/runtime-assets.js +2 -2
  71. package/dist/core/src/workspace-config.d.ts +7 -0
  72. package/dist/core/src/workspace-config.d.ts.map +1 -1
  73. package/dist/core/workspace-config.js +1 -1
  74. package/dist/deploy/index.js +3 -3
  75. package/dist/{ensure-sources-KLCGXVE6.js → ensure-sources-EE7Z2HKS.js} +5 -5
  76. package/dist/{ensure-sources-KLCGXVE6.js.map → ensure-sources-EE7Z2HKS.js.map} +1 -1
  77. package/dist/factory-assets/connectors/deploy.js +5 -5
  78. package/dist/factory-assets/connectors/devserver.js +5 -5
  79. package/dist/factory-assets/connectors/flow/adapter.js +5 -5
  80. package/dist/factory-assets/connectors/flow/engine.js +3 -3
  81. package/dist/factory-assets/connectors/flow/run-flow.js +6 -6
  82. package/dist/factory-assets/connectors/flow.js +5 -5
  83. package/dist/factory-assets/connectors/git.js +5 -5
  84. package/dist/factory-assets/connectors/gmail.js +5 -5
  85. package/dist/factory-assets/connectors/googledrive.js +5 -5
  86. package/dist/factory-assets/connectors/local.js +5 -5
  87. package/dist/factory-assets/connectors/mattermost.js +5 -5
  88. package/dist/factory-assets/connectors/memory.js +5 -5
  89. package/dist/factory-assets/connectors/minio.js +5 -5
  90. package/dist/factory-assets/connectors/postgres.js +5 -5
  91. package/dist/factory-assets/connectors/s3.js +5 -5
  92. package/dist/factory-assets/connectors/sharepoint.js +5 -5
  93. package/dist/factory-assets/connectors/sqlite.js +5 -5
  94. package/dist/factory-assets/connectors/static-server.js +5 -5
  95. package/dist/factory-assets/connectors/tunnel.js +5 -5
  96. package/dist/factory-assets/connectors/webdav.js +5 -5
  97. package/dist/factory-assets/connectors/xstate-store.js +5 -5
  98. package/dist/factory-assets/connectors/xstate.js +5 -5
  99. package/dist/{flows-PNDUCOJR.js → flows-AAHXXXCH.js} +3 -3
  100. package/dist/{flows-PNDUCOJR.js.map → flows-AAHXXXCH.js.map} +1 -1
  101. package/dist/library/index.js +4 -4
  102. package/dist/library/install.js +3 -3
  103. package/dist/library/src/local/db.d.ts.map +1 -1
  104. package/dist/library/src/local/local-catalog-source.d.ts +12 -0
  105. package/dist/library/src/local/local-catalog-source.d.ts.map +1 -1
  106. package/dist/{open-library-COHFCT4N.js → open-library-TXJMFG34.js} +7 -7
  107. package/dist/{open-library-COHFCT4N.js.map → open-library-TXJMFG34.js.map} +1 -1
  108. package/dist/{paths-2SYXGTZJ.js → paths-OMVC4UWY.js} +6 -6
  109. package/dist/{paths-2SYXGTZJ.js.map → paths-OMVC4UWY.js.map} +1 -1
  110. package/dist/{plugin-store-UNENLB56.js → plugin-store-JWJHIPUT.js} +5 -5
  111. package/dist/{plugin-store-UNENLB56.js.map → plugin-store-JWJHIPUT.js.map} +1 -1
  112. package/dist/runner/index.js +9 -9
  113. package/dist/runner/src/serve.d.ts.map +1 -1
  114. package/dist/sdk/asset-manager.js +5 -5
  115. package/dist/sdk/bridge.js +2 -2
  116. package/dist/sdk/core.js +3 -3
  117. package/dist/sdk/flow.js +3 -3
  118. package/dist/sdk/index.js +9 -9
  119. package/dist/sdk/runner.js +9 -9
  120. package/dist/{setup-AYH6SR4U.js → setup-ETNBVZQA.js} +7 -7
  121. package/dist/{setup-AYH6SR4U.js.map → setup-ETNBVZQA.js.map} +1 -1
  122. package/dist/{store-client-U4FMAIWX.js → store-client-SLFAAKSV.js} +6 -6
  123. package/dist/{store-client-U4FMAIWX.js.map → store-client-SLFAAKSV.js.map} +1 -1
  124. package/dist/tui/index.js +9 -9
  125. package/dist/workspace-plugin/adapters/mcp.js +1 -1
  126. package/dist/workspace-plugin/adapters/omp.js +3 -3
  127. package/dist/workspace-plugin/index.js +1 -1
  128. package/package.json +1 -1
  129. package/dist/chunk-4VPRAG35.js.map +0 -1
  130. package/dist/chunk-BDM5UVU3.js.map +0 -1
  131. package/dist/chunk-LLOXWWB6.js.map +0 -1
  132. package/dist/chunk-OCAQH66V.js.map +0 -1
  133. package/dist/chunk-T2CIVTTC.js.map +0 -1
@@ -1,5 +1,5 @@
1
- export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, MarkdownStreamer, PreInitRingSink, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, builtinCapabilities, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, connectorRefreshKind, createAgentSession, createSessionStimulusBus, defineCapability, deleteSession, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureGitConfigInclude, extractClaudeAiOauthExpiresAt, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, installPreInitRingSink, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadSession, loadSessionById, mcpAuthSecretKey, newSession, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveMixin, runAgentChat, saveSession, setCurrentSession, startAgentServer, touchSession, writeClaudeCodeCredentialsFile } from '../chunk-BDM5UVU3.js';
2
- import '../chunk-XHDPCL4O.js';
1
+ export { CLAUDE_CODE_CREDENTIALS_KEY, COMPILE_MANIFEST_FILENAME, CapabilityRegistry, DEFAULT_CAPABILITY_CALL_TIMEOUT_MS, DEFAULT_COALESCE_MS, MarkdownStreamer, PreInitRingSink, agentDefinitionExists, bootstrapCapabilityRegistry, bootstrapRunnerLogStore, buildAgentResources, buildClientCapabilityHandler, buildConnectorTokenMediator, buildContextSection, buildEnvironmentSection, buildResourcesAvailablePayload, builtinCapabilities, clearPreInitRingSink, clearSession, compileComposition, computeCapabilitySignature, connectorRefreshKind, createAgentSession, createSessionStimulusBus, defineCapability, deleteSession, dispatchRunnerCapabilityInvocation, emitSystemPromptComposed, ensureGitConfigInclude, extractClaudeAiOauthExpiresAt, getPreInitRingSink, handleMountResourceRequest, handleResourceRequest, installPreInitRingSink, listSessions, loadAgentManifest, loadCompileManifest, loadCompileManifestFromDir, loadSession, loadSessionById, mcpAuthSecretKey, newSession, registerCompositionCapabilities, rejectCapabilityOnApprovalDeny, resetRunnerLogStore, resolveAgentComposition, resolveAgentMixins, resolveBinding, resolveCapabilityCallTimeoutMs, resolveCapabilityResult, resolveComposition, resolveMixin, runAgentChat, saveSession, setCurrentSession, startAgentServer, touchSession, writeClaudeCodeCredentialsFile } from '../chunk-CK3O5BCT.js';
2
+ import '../chunk-SXT6BAQJ.js';
3
3
  import '../chunk-X5YPJV4N.js';
4
4
  import '../chunk-O7SG5PC2.js';
5
5
  import '../chunk-7QBNJTTQ.js';
@@ -8,24 +8,24 @@ import '../chunk-WQ7DE5UC.js';
8
8
  import '../chunk-32NA4TVC.js';
9
9
  export { assembleSystemPrompt, buildCapabilitiesPromptSection, buildLinkedPeersPromptSection } from '../chunk-W3UDISS2.js';
10
10
  import '../chunk-EVZKWY5J.js';
11
- import '../chunk-5C3QJSOD.js';
11
+ import '../chunk-OYMSCV7T.js';
12
12
  import '../chunk-RRVQAE5D.js';
13
13
  import '../chunk-BMQKMOQY.js';
14
14
  import '../chunk-GAH4YRCI.js';
15
- import '../chunk-OCAQH66V.js';
15
+ import '../chunk-N5AE5SOC.js';
16
16
  import '../chunk-LV2HPH3C.js';
17
- import '../chunk-KC7V5XCO.js';
17
+ import '../chunk-EBSIZYM6.js';
18
18
  import '../chunk-OVRSNIKJ.js';
19
- import '../chunk-T2CIVTTC.js';
19
+ import '../chunk-ZJ3VRPOI.js';
20
20
  import '../chunk-RAIRWFAN.js';
21
21
  import '../chunk-6E6PKKAD.js';
22
22
  import '../chunk-X46FY45B.js';
23
23
  import '../chunk-DEYYRFQU.js';
24
24
  import '../chunk-IFGTRL2I.js';
25
- export { globalSettingsPath, loadSettings, mapLegacyFields, projectSettingsPath, resolveSettings, saveSettings } from '../chunk-G3GODNHM.js';
25
+ export { globalSettingsPath, loadSettings, mapLegacyFields, projectSettingsPath, resolveSettings, saveSettings } from '../chunk-SDAKQCOB.js';
26
26
  import '../chunk-ZAP2BDHG.js';
27
- import '../chunk-3VBQJZYL.js';
28
- import '../chunk-WTFJFW7F.js';
27
+ import '../chunk-WBF7JLTY.js';
28
+ import '../chunk-PBO6SCT2.js';
29
29
  import '../chunk-DZCK7GRW.js';
30
30
  import '../chunk-6IDBWPK2.js';
31
31
  import '../chunk-GEEW6SY2.js';
@@ -1,13 +1,13 @@
1
- import { validateApiKey } from './chunk-5C3QJSOD.js';
1
+ import { validateApiKey } from './chunk-OYMSCV7T.js';
2
2
  import './chunk-RRVQAE5D.js';
3
3
  import { getModels } from './chunk-BMQKMOQY.js';
4
4
  import './chunk-GAH4YRCI.js';
5
- import './chunk-OCAQH66V.js';
5
+ import './chunk-N5AE5SOC.js';
6
6
  import './chunk-6E6PKKAD.js';
7
- import { ALL_PROVIDERS, detectEnvApiKeys, resolveSettings, maskApiKey, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, providerEnvKey } from './chunk-G3GODNHM.js';
7
+ import { ALL_PROVIDERS, detectEnvApiKeys, resolveSettings, maskApiKey, projectSettingsPath, loadSettings, saveSettings, WorkspaceYamlEditor, providerEnvKey } from './chunk-SDAKQCOB.js';
8
8
  import './chunk-ZAP2BDHG.js';
9
- import './chunk-3VBQJZYL.js';
10
- import './chunk-WTFJFW7F.js';
9
+ import './chunk-WBF7JLTY.js';
10
+ import './chunk-PBO6SCT2.js';
11
11
  import './chunk-DZCK7GRW.js';
12
12
  import './chunk-6IDBWPK2.js';
13
13
  import './chunk-GEEW6SY2.js';
@@ -509,5 +509,5 @@ async function cmdSetup(_args, opts) {
509
509
  }
510
510
 
511
511
  export { cmdSetup };
512
- //# sourceMappingURL=setup-AYH6SR4U.js.map
513
- //# sourceMappingURL=setup-AYH6SR4U.js.map
512
+ //# sourceMappingURL=setup-ETNBVZQA.js.map
513
+ //# sourceMappingURL=setup-ETNBVZQA.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/setup.ts"],"names":["p","isCancel","result"],"mappings":"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","file":"setup-AYH6SR4U.js","sourcesContent":["/**\n * skaile setup — Interactive provider setup wizard\n *\n * Discovers existing config, lets the user pick providers, enter/validate API keys,\n * choose where to store them, and set defaults.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { getModels, validateApiKey } from \"@skaile/workspaces/bridge\";\nimport {\n ALL_PROVIDERS,\n detectEnvApiKeys,\n loadSettings,\n maskApiKey,\n projectSettingsPath,\n providerEnvKey,\n resolveSettings,\n type SkaileSettings,\n saveSettings,\n WorkspaceYamlEditor,\n} from \"@skaile/workspaces/core\";\n\n// ---------------------------------------------------------------------------\n// Provider metadata\n// ---------------------------------------------------------------------------\n\n/** LLM providers only (excludes voice providers) */\nconst LLM_PROVIDERS = ALL_PROVIDERS.filter((p) => p !== \"deepgram\" && p !== \"elevenlabs\");\n\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: \"Anthropic (Claude)\",\n openai: \"OpenAI (GPT)\",\n google: \"Google (Gemini)\",\n mistral: \"Mistral AI\",\n groq: \"Groq (fast inference)\",\n openrouter: \"OpenRouter (multi-provider gateway)\",\n deepseek: \"DeepSeek\",\n xai: \"xAI (Grok)\",\n together: \"Together AI\",\n fireworks: \"Fireworks AI\",\n};\n\nconst PROVIDER_KEY_URLS: Record<string, string> = {\n anthropic: \"https://console.anthropic.com/settings/keys\",\n openai: \"https://platform.openai.com/api-keys\",\n google: \"https://aistudio.google.com/apikey\",\n mistral: \"https://console.mistral.ai/api-keys\",\n groq: \"https://console.groq.com/keys\",\n openrouter: \"https://openrouter.ai/settings/keys\",\n deepseek: \"https://platform.deepseek.com/api_keys\",\n xai: \"https://console.x.ai/\",\n together: \"https://api.together.ai/settings/api-keys\",\n fireworks: \"https://fireworks.ai/api-keys\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype StorageTarget = \"settings\" | \"env-project\" | \"env-global\" | \"skip\";\ntype DefaultsTarget = \"project\" | \"personal\";\n\ninterface SetupPlan {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultsTarget: DefaultsTarget;\n defaultProvider: string;\n defaultModel: string;\n defaultDriver: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCancel(value: unknown): value is symbol {\n return p.isCancel(value);\n}\n\nfunction exitOnCancel<T>(value: T): asserts value is Exclude<T, symbol> {\n if (isCancel(value)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n}\n\n/** Load .env files from common locations and parse key=value pairs */\nfunction loadDotenvKeys(): Record<string, string> {\n const locations = [path.join(process.cwd(), \".env\"), path.join(os.homedir(), \".env\")];\n const result: Record<string, string> = {};\n for (const loc of locations) {\n try {\n const content = fs.readFileSync(loc, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let val = trimmed.slice(eq + 1).trim();\n // Strip surrounding quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n } catch {\n // file doesn't exist, skip\n }\n }\n return result;\n}\n\n/** Append key=value entries to a .env file without overwriting existing keys */\nfunction appendEnvFile(filePath: string, entries: Record<string, string>): void {\n let existing = \"\";\n try {\n existing = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n\n const existingKeys = new Set<string>();\n for (const line of existing.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq !== -1) existingKeys.add(trimmed.slice(0, eq).trim());\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(entries)) {\n if (existingKeys.has(key)) {\n p.log.warn(` ${key} already exists in ${filePath} — skipping`);\n continue;\n }\n lines.push(`${key}=${value}`);\n }\n\n if (lines.length === 0) return;\n\n const separator = existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\";\n const content = `${separator + lines.join(\"\\n\")}\\n`;\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.appendFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Wizard steps\n// ---------------------------------------------------------------------------\n\nasync function showCurrentState(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n): Promise<void> {\n const apiKeys = settings.apiKeys ?? {};\n const lines: string[] = [\"Provider keys:\"];\n for (const provider of LLM_PROVIDERS) {\n const envVal = envKeys[provider];\n const storedVal = apiKeys[provider];\n if (envVal) {\n lines.push(` ${provider.padEnd(12)} [env] ${maskApiKey(envVal)}`);\n } else if (storedVal) {\n lines.push(` ${provider.padEnd(12)} [stored] ${maskApiKey(storedVal)}`);\n } else {\n lines.push(` ${provider.padEnd(12)} (not configured)`);\n }\n }\n lines.push(\"\");\n lines.push(\"Current defaults:\");\n lines.push(` Provider: ${settings.provider ?? \"(not set)\"}`);\n lines.push(` Model: ${settings.model ?? \"(not set)\"}`);\n lines.push(` Driver: ${settings.driver ?? \"(not set)\"}`);\n\n p.note(lines.join(\"\\n\"), \"Current configuration\");\n}\n\nasync function selectProviders(\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string[]> {\n const result = await p.multiselect({\n message: \"Which providers do you want to configure?\",\n options: LLM_PROVIDERS.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n hint: envKeys[id]\n ? `env: ${maskApiKey(envKeys[id])}`\n : storedKeys[id]\n ? `stored: ${maskApiKey(storedKeys[id])}`\n : undefined,\n })),\n initialValues: LLM_PROVIDERS.filter((id) => envKeys[id] || storedKeys[id]),\n required: true,\n });\n exitOnCancel(result);\n return result as string[];\n}\n\n/**\n * Run the optional validation step for a freshly entered key.\n * Returns true if the key should be kept (valid, or user opted to keep anyway),\n * false if it should be discarded.\n */\nasync function confirmKeyAfterValidation(provider: string, key: string): Promise<boolean> {\n const shouldValidate = await p.confirm({\n message: \"Validate this key?\",\n initialValue: true,\n });\n exitOnCancel(shouldValidate);\n\n if (!shouldValidate) return true;\n\n const s = p.spinner();\n s.start(`Validating ${provider} key...`);\n const result = await validateApiKey(provider, key);\n if (result.ok) {\n s.stop(`${provider} key is valid`);\n return true;\n }\n s.stop(`${provider} validation failed: ${result.error}`);\n const retry = await p.confirm({\n message: \"Use this key anyway?\",\n initialValue: false,\n });\n exitOnCancel(retry);\n return retry;\n}\n\n/**\n * Collect (or skip) the API key for a single provider.\n * Returns the entered key, or undefined when the provider is already configured,\n * the user declines to update, leaves it blank, or rejects a failed validation.\n */\nasync function collectProviderKey(\n provider: string,\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string | undefined> {\n const envVar = providerEnvKey(provider);\n\n if (envKeys[provider]) {\n p.log.info(`${PROVIDER_LABELS[provider] ?? provider}: already set via ${envVar}`);\n return undefined;\n }\n\n if (storedKeys[provider]) {\n const update = await p.confirm({\n message: `${PROVIDER_LABELS[provider] ?? provider}: key already stored (${maskApiKey(storedKeys[provider])}). Update it?`,\n initialValue: false,\n });\n exitOnCancel(update);\n if (!update) return undefined;\n }\n\n const keyUrl = PROVIDER_KEY_URLS[provider];\n const key = await p.password({\n message: `${PROVIDER_LABELS[provider] ?? provider} API key${keyUrl ? ` (get one at ${keyUrl})` : \"\"}:`,\n });\n exitOnCancel(key);\n\n if (!key) return undefined;\n\n const keep = await confirmKeyAfterValidation(provider, key);\n if (!keep) return undefined;\n\n return key;\n}\n\nasync function collectApiKeys(\n providers: string[],\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<Record<string, string>> {\n const newKeys: Record<string, string> = {};\n\n for (const provider of providers) {\n const key = await collectProviderKey(provider, envKeys, storedKeys);\n if (key !== undefined) newKeys[provider] = key;\n }\n\n return newKeys;\n}\n\nasync function selectStorageTarget(): Promise<StorageTarget> {\n const result = await p.select({\n message: \"Where should API keys be stored?\",\n options: [\n { value: \"settings\" as const, label: \".skaile/settings.json (project-local, gitignored)\" },\n { value: \"env-project\" as const, label: `${process.cwd()}/.env (project-level)` },\n { value: \"env-global\" as const, label: `${os.homedir()}/.env (global)` },\n { value: \"skip\" as const, label: \"Skip — I'll set env vars myself\" },\n ],\n });\n exitOnCancel(result);\n return result as StorageTarget;\n}\n\nasync function selectDefaultProvider(providers: string[], current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default LLM provider:\",\n options: providers.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n })),\n initialValue: current && providers.includes(current) ? current : providers[0],\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultModel(\n provider: string,\n current?: string,\n apiKey?: string,\n): Promise<string> {\n // Try live model list from provider API, fall back to static catalog\n const s = apiKey ? p.spinner() : undefined;\n if (s) s.start(`Fetching models from ${provider}...`);\n\n const fetchResult = await getModels(provider, apiKey);\n\n if (s) {\n if (fetchResult.source === \"api\") {\n s.stop(`Loaded ${fetchResult.models.length} models from ${provider} API`);\n } else if (fetchResult.error) {\n s.stop(`Could not fetch live models (${fetchResult.error}) — using built-in catalog`);\n } else {\n s.stop(`Using built-in model catalog`);\n }\n }\n\n const models = fetchResult.models;\n if (models.length === 0) {\n p.log.warn(`No models found for ${provider} — enter a model ID manually`);\n const result = await p.text({\n message: \"Model ID:\",\n initialValue: current ?? \"\",\n });\n exitOnCancel(result);\n return result as string;\n }\n\n const result = await p.select({\n message: `Default model (${provider}):`,\n options: models.map((m) => ({\n value: m.id,\n label: `${m.name} (${m.id})`,\n })),\n initialValue: current && models.some((m) => m.id === current) ? current : models[0].id,\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDriver(current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default agent driver:\",\n options: [\n { value: \"omp\", label: \"omp (oh-my-pi — multi-provider, recommended)\" },\n { value: \"claude-sdk\", label: \"claude-sdk (Anthropic Agent SDK, Claude only)\" },\n { value: \"codex\", label: \"codex (OpenAI Codex SDK, OpenAI only)\" },\n ],\n initialValue: current ?? \"omp\",\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultsTarget(projectDir: string): Promise<DefaultsTarget> {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const hasYaml = fs.existsSync(yamlPath);\n\n if (!hasYaml) {\n // No skaile.yaml — can only save personally\n return \"personal\";\n }\n\n const result = await p.select({\n message: \"Where should driver, provider, and model defaults be saved?\",\n options: [\n {\n value: \"project\" as const,\n label: \"skaile.yaml (project-wide, shared with team)\",\n hint: \"recommended\",\n },\n {\n value: \"personal\" as const,\n label: \".skaile/settings.json (personal only, gitignored)\",\n },\n ],\n initialValue: \"project\" as const,\n });\n exitOnCancel(result);\n return result as DefaultsTarget;\n}\n\n/** Build the human-readable summary shown before applying the plan. */\nfunction buildSummaryLines(plan: SetupPlan, settingsFile: string): string[] {\n const lines: string[] = [];\n\n if (Object.keys(plan.newKeys).length > 0) {\n lines.push(\"New API keys:\");\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n lines.push(` ${provider.padEnd(12)} ${maskApiKey(key)}`);\n }\n const targetLabels: Record<StorageTarget, string> = {\n settings: `.skaile/settings.json (${settingsFile})`,\n \"env-project\": `${process.cwd()}/.env`,\n \"env-global\": `${os.homedir()}/.env`,\n skip: \"not saved (set env vars manually)\",\n };\n lines.push(` Storage: ${targetLabels[plan.storageTarget]}`);\n lines.push(\"\");\n }\n\n const defaultsLabel =\n plan.defaultsTarget === \"project\"\n ? \"skaile.yaml (project-wide)\"\n : \".skaile/settings.json (personal)\";\n lines.push(\"Defaults:\");\n lines.push(` Provider: ${plan.defaultProvider}`);\n lines.push(` Model: ${plan.defaultModel}`);\n lines.push(` Driver: ${plan.defaultDriver}`);\n lines.push(` Saved to: ${defaultsLabel}`);\n\n return lines;\n}\n\n/**\n * Write the new API keys to the chosen storage target.\n * For the `settings` target the keys are merged into `merged.apiKeys` (mutated\n * in place); for the env targets they are appended to the relevant `.env` file.\n */\nfunction persistApiKeys(plan: SetupPlan, merged: SkaileSettings): void {\n const hasNewKeys = Object.keys(plan.newKeys).length > 0;\n\n if (hasNewKeys && plan.storageTarget === \"settings\") {\n const apiKeys = { ...(merged.apiKeys ?? {}) };\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n apiKeys[provider] = key;\n }\n merged.apiKeys = apiKeys;\n } else if (hasNewKeys && plan.storageTarget === \"env-project\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(process.cwd(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${process.cwd()}/.env`);\n } else if (hasNewKeys && plan.storageTarget === \"env-global\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(os.homedir(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${os.homedir()}/.env`);\n }\n}\n\n/**\n * Apply the plan's defaults: write them to skaile.yaml when saving project-wide,\n * and set/strip the corresponding personal settings fields on `merged` (mutated\n * in place) so they don't shadow project-wide values.\n */\nfunction applyDefaults(plan: SetupPlan, projectDir: string, merged: SkaileSettings): void {\n // Save defaults to skaile.yaml or settings.json depending on user choice\n if (plan.defaultsTarget === \"project\") {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const editor = WorkspaceYamlEditor.load(yamlPath);\n editor.setAgentConfig(\"default\", {\n provider: plan.defaultProvider,\n model: plan.defaultModel,\n driver: plan.defaultDriver,\n });\n editor.save();\n p.log.success(`Saved defaults to ${yamlPath}`);\n }\n\n // Personal settings: only include defaults if saving personally, always include API keys.\n // When saving to project (skaile.yaml), strip driver/provider/model from settings.json\n // so they don't shadow the project-wide values.\n if (plan.defaultsTarget === \"personal\") {\n merged.provider = plan.defaultProvider;\n merged.model = plan.defaultModel;\n merged.driver = plan.defaultDriver;\n } else {\n delete merged.provider;\n delete merged.model;\n delete merged.driver;\n }\n}\n\nasync function reviewAndSave(plan: SetupPlan, projectDir: string): Promise<void> {\n const settingsFile = projectSettingsPath(projectDir);\n\n p.note(buildSummaryLines(plan, settingsFile).join(\"\\n\"), \"Summary\");\n\n const confirmed = await p.confirm({\n message: \"Apply these settings?\",\n initialValue: true,\n });\n exitOnCancel(confirmed);\n\n if (!confirmed) {\n p.cancel(\"Setup cancelled — no changes were made.\");\n process.exit(0);\n }\n\n // Load existing project settings (or empty)\n const existing = await loadSettings(settingsFile);\n\n const merged: SkaileSettings = { ...existing };\n applyDefaults(plan, projectDir, merged);\n persistApiKeys(plan, merged);\n\n // Write unified settings file\n await saveSettings(merged, settingsFile);\n p.log.success(`Saved settings to ${settingsFile}`);\n}\n\n// ---------------------------------------------------------------------------\n// Main entry\n// ---------------------------------------------------------------------------\n\n/** Check whether Claude Code OAuth credentials exist on disk */\nfunction hasClaudeCodeCredentials(): boolean {\n const credPath = path.join(os.homedir(), \".claude\", \".credentials.json\");\n try {\n const content = fs.readFileSync(credPath, \"utf-8\");\n const parsed = JSON.parse(content);\n // Check that it has at least one non-empty field\n return parsed && (parsed.accessToken || parsed.refreshToken || parsed.oauthToken);\n } catch {\n return false;\n }\n}\n\n/** The provider/key/model portion of a SetupPlan produced by a per-driver flow. */\ninterface DriverSetupResult {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultProvider: string;\n defaultModel: string;\n}\n\n/**\n * Claude SDK path: Anthropic only. Honours an existing API key (env or stored)\n * or Claude Code OAuth credentials, otherwise offers to enter a key.\n */\nasync function runClaudeSdkSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"anthropic\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n // Check for existing auth: API key or Claude Code OAuth credentials\n const hasEnvKey = !!envKeys.anthropic;\n const hasStoredKey = !!apiKeys.anthropic;\n const hasOAuth = hasClaudeCodeCredentials();\n\n if (hasEnvKey) {\n p.log.info(`Anthropic API key found in environment (${maskApiKey(envKeys.anthropic)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`Anthropic API key found in settings (${maskApiKey(apiKeys.anthropic)})`);\n newKeys = {};\n } else if (hasOAuth) {\n p.log.info(\"Claude Code subscription detected (OAuth credentials found)\");\n p.log.info(\"The Claude SDK will use your Claude Code login — no API key needed.\");\n newKeys = {};\n } else {\n // No auth found — prompt for Anthropic API key\n p.log.warn(\"No Anthropic API key or Claude Code subscription found.\");\n p.log.info(\"You can either:\");\n p.log.info(\" 1. Enter an Anthropic API key now\");\n p.log.info(\" 2. Run `claude login` to authenticate with Claude Code\");\n\n const wantsKey = await p.confirm({\n message: \"Enter an Anthropic API key?\",\n initialValue: true,\n });\n exitOnCancel(wantsKey);\n\n if (wantsKey) {\n newKeys = await collectApiKeys([\"anthropic\"], envKeys, apiKeys);\n } else {\n newKeys = {};\n }\n }\n\n // Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // Model selection — only Anthropic models (try live fetch with available key)\n const anthropicKey = newKeys.anthropic ?? envKeys.anthropic ?? apiKeys.anthropic;\n const defaultModel = await selectDefaultModel(\"anthropic\", settings.model, anthropicKey);\n\n return { providers: [\"anthropic\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** Codex path: OpenAI only. Honours an existing key, otherwise prompts for one. */\nasync function runCodexSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"openai\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n const hasEnvKey = !!envKeys.openai;\n const hasStoredKey = !!apiKeys.openai;\n\n if (hasEnvKey) {\n p.log.info(`OpenAI API key found in environment (${maskApiKey(envKeys.openai)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`OpenAI API key found in settings (${maskApiKey(apiKeys.openai)})`);\n newKeys = {};\n } else {\n p.log.warn(\"No OpenAI API key found.\");\n newKeys = await collectApiKeys([\"openai\"], envKeys, apiKeys);\n }\n\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n const openaiKey = newKeys.openai ?? envKeys.openai ?? apiKeys.openai;\n const defaultModel = await selectDefaultModel(\"openai\", settings.model, openaiKey);\n\n return { providers: [\"openai\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** omp / pi path: multi-provider flow (existing behavior). */\nasync function runMultiProviderSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n let storageTarget: StorageTarget = \"skip\";\n\n // 4. Select providers\n const providers = await selectProviders(envKeys, apiKeys);\n\n // 5. Collect API keys\n const newKeys = await collectApiKeys(providers, envKeys, apiKeys);\n\n // 6. Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // 7. Default provider (from selected providers + any already configured)\n const allConfigured = [\n ...new Set([\n ...providers,\n ...Object.keys(envKeys),\n ...Object.keys(apiKeys).filter((k) => apiKeys[k]),\n ]),\n ].filter((p) => LLM_PROVIDERS.includes(p as any));\n const defaultProvider = await selectDefaultProvider(\n allConfigured.length > 0 ? allConfigured : providers,\n settings.provider,\n );\n\n // 8. Default model (try live fetch with available key)\n const providerKey =\n newKeys[defaultProvider] ?? envKeys[defaultProvider] ?? apiKeys[defaultProvider];\n const defaultModel = await selectDefaultModel(defaultProvider, settings.model, providerKey);\n\n return { providers, newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/**\n * Interactive provider setup wizard: discovers existing config, prompts for\n * provider/model/driver preferences and API keys, then writes the results to\n * `skaile.yaml` or `.skaile/settings.json` depending on the user's choice.\n *\n * @param _args - Unused positional args (reserved for future use).\n * @param opts - Options including an optional `projectDir` override.\n * @docLink cli/dev-guide#setup\n */\nexport async function cmdSetup(_args: string[], opts: { projectDir?: string }): Promise<void> {\n p.intro(\"skaile setup\");\n\n const projectDir = opts.projectDir ?? process.cwd();\n\n // 1. Detect existing state via layered resolution\n const dotenvKeys = loadDotenvKeys();\n const envKeys = detectEnvApiKeys(dotenvKeys);\n const settings = await resolveSettings(projectDir);\n\n // 2. Show current state\n await showCurrentState(settings, envKeys);\n\n // 3. Select driver FIRST — it determines which providers/models are relevant\n const defaultDriver = await selectDriver(settings.driver);\n\n const apiKeys = settings.apiKeys ?? {};\n\n // Per-driver provider/key/model flow\n let result: DriverSetupResult;\n if (defaultDriver === \"claude-sdk\") {\n result = await runClaudeSdkSetup(settings, envKeys, apiKeys);\n } else if (defaultDriver === \"codex\") {\n result = await runCodexSetup(settings, envKeys, apiKeys);\n } else {\n result = await runMultiProviderSetup(settings, envKeys, apiKeys);\n }\n\n // 9. Choose where to save defaults (project-wide vs personal)\n const defaultsTarget = await selectDefaultsTarget(projectDir);\n\n // 10. Review and save\n await reviewAndSave(\n {\n providers: result.providers,\n newKeys: result.newKeys,\n storageTarget: result.storageTarget,\n defaultsTarget,\n defaultProvider: result.defaultProvider,\n defaultModel: result.defaultModel,\n defaultDriver,\n },\n projectDir,\n );\n\n p.outro(\"Setup complete!\");\n}\n"]}
1
+ {"version":3,"sources":["../cli/src/setup.ts"],"names":["p","isCancel","result"],"mappings":"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","file":"setup-ETNBVZQA.js","sourcesContent":["/**\n * skaile setup — Interactive provider setup wizard\n *\n * Discovers existing config, lets the user pick providers, enter/validate API keys,\n * choose where to store them, and set defaults.\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport * as p from \"@clack/prompts\";\nimport { getModels, validateApiKey } from \"@skaile/workspaces/bridge\";\nimport {\n ALL_PROVIDERS,\n detectEnvApiKeys,\n loadSettings,\n maskApiKey,\n projectSettingsPath,\n providerEnvKey,\n resolveSettings,\n type SkaileSettings,\n saveSettings,\n WorkspaceYamlEditor,\n} from \"@skaile/workspaces/core\";\n\n// ---------------------------------------------------------------------------\n// Provider metadata\n// ---------------------------------------------------------------------------\n\n/** LLM providers only (excludes voice providers) */\nconst LLM_PROVIDERS = ALL_PROVIDERS.filter((p) => p !== \"deepgram\" && p !== \"elevenlabs\");\n\nconst PROVIDER_LABELS: Record<string, string> = {\n anthropic: \"Anthropic (Claude)\",\n openai: \"OpenAI (GPT)\",\n google: \"Google (Gemini)\",\n mistral: \"Mistral AI\",\n groq: \"Groq (fast inference)\",\n openrouter: \"OpenRouter (multi-provider gateway)\",\n deepseek: \"DeepSeek\",\n xai: \"xAI (Grok)\",\n together: \"Together AI\",\n fireworks: \"Fireworks AI\",\n};\n\nconst PROVIDER_KEY_URLS: Record<string, string> = {\n anthropic: \"https://console.anthropic.com/settings/keys\",\n openai: \"https://platform.openai.com/api-keys\",\n google: \"https://aistudio.google.com/apikey\",\n mistral: \"https://console.mistral.ai/api-keys\",\n groq: \"https://console.groq.com/keys\",\n openrouter: \"https://openrouter.ai/settings/keys\",\n deepseek: \"https://platform.deepseek.com/api_keys\",\n xai: \"https://console.x.ai/\",\n together: \"https://api.together.ai/settings/api-keys\",\n fireworks: \"https://fireworks.ai/api-keys\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype StorageTarget = \"settings\" | \"env-project\" | \"env-global\" | \"skip\";\ntype DefaultsTarget = \"project\" | \"personal\";\n\ninterface SetupPlan {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultsTarget: DefaultsTarget;\n defaultProvider: string;\n defaultModel: string;\n defaultDriver: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isCancel(value: unknown): value is symbol {\n return p.isCancel(value);\n}\n\nfunction exitOnCancel<T>(value: T): asserts value is Exclude<T, symbol> {\n if (isCancel(value)) {\n p.cancel(\"Setup cancelled.\");\n process.exit(0);\n }\n}\n\n/** Load .env files from common locations and parse key=value pairs */\nfunction loadDotenvKeys(): Record<string, string> {\n const locations = [path.join(process.cwd(), \".env\"), path.join(os.homedir(), \".env\")];\n const result: Record<string, string> = {};\n for (const loc of locations) {\n try {\n const content = fs.readFileSync(loc, \"utf-8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq === -1) continue;\n const key = trimmed.slice(0, eq).trim();\n let val = trimmed.slice(eq + 1).trim();\n // Strip surrounding quotes\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n result[key] = val;\n }\n } catch {\n // file doesn't exist, skip\n }\n }\n return result;\n}\n\n/** Append key=value entries to a .env file without overwriting existing keys */\nfunction appendEnvFile(filePath: string, entries: Record<string, string>): void {\n let existing = \"\";\n try {\n existing = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n // file doesn't exist yet\n }\n\n const existingKeys = new Set<string>();\n for (const line of existing.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eq = trimmed.indexOf(\"=\");\n if (eq !== -1) existingKeys.add(trimmed.slice(0, eq).trim());\n }\n\n const lines: string[] = [];\n for (const [key, value] of Object.entries(entries)) {\n if (existingKeys.has(key)) {\n p.log.warn(` ${key} already exists in ${filePath} — skipping`);\n continue;\n }\n lines.push(`${key}=${value}`);\n }\n\n if (lines.length === 0) return;\n\n const separator = existing.endsWith(\"\\n\") || existing === \"\" ? \"\" : \"\\n\";\n const content = `${separator + lines.join(\"\\n\")}\\n`;\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.appendFileSync(filePath, content, \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// Wizard steps\n// ---------------------------------------------------------------------------\n\nasync function showCurrentState(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n): Promise<void> {\n const apiKeys = settings.apiKeys ?? {};\n const lines: string[] = [\"Provider keys:\"];\n for (const provider of LLM_PROVIDERS) {\n const envVal = envKeys[provider];\n const storedVal = apiKeys[provider];\n if (envVal) {\n lines.push(` ${provider.padEnd(12)} [env] ${maskApiKey(envVal)}`);\n } else if (storedVal) {\n lines.push(` ${provider.padEnd(12)} [stored] ${maskApiKey(storedVal)}`);\n } else {\n lines.push(` ${provider.padEnd(12)} (not configured)`);\n }\n }\n lines.push(\"\");\n lines.push(\"Current defaults:\");\n lines.push(` Provider: ${settings.provider ?? \"(not set)\"}`);\n lines.push(` Model: ${settings.model ?? \"(not set)\"}`);\n lines.push(` Driver: ${settings.driver ?? \"(not set)\"}`);\n\n p.note(lines.join(\"\\n\"), \"Current configuration\");\n}\n\nasync function selectProviders(\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string[]> {\n const result = await p.multiselect({\n message: \"Which providers do you want to configure?\",\n options: LLM_PROVIDERS.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n hint: envKeys[id]\n ? `env: ${maskApiKey(envKeys[id])}`\n : storedKeys[id]\n ? `stored: ${maskApiKey(storedKeys[id])}`\n : undefined,\n })),\n initialValues: LLM_PROVIDERS.filter((id) => envKeys[id] || storedKeys[id]),\n required: true,\n });\n exitOnCancel(result);\n return result as string[];\n}\n\n/**\n * Run the optional validation step for a freshly entered key.\n * Returns true if the key should be kept (valid, or user opted to keep anyway),\n * false if it should be discarded.\n */\nasync function confirmKeyAfterValidation(provider: string, key: string): Promise<boolean> {\n const shouldValidate = await p.confirm({\n message: \"Validate this key?\",\n initialValue: true,\n });\n exitOnCancel(shouldValidate);\n\n if (!shouldValidate) return true;\n\n const s = p.spinner();\n s.start(`Validating ${provider} key...`);\n const result = await validateApiKey(provider, key);\n if (result.ok) {\n s.stop(`${provider} key is valid`);\n return true;\n }\n s.stop(`${provider} validation failed: ${result.error}`);\n const retry = await p.confirm({\n message: \"Use this key anyway?\",\n initialValue: false,\n });\n exitOnCancel(retry);\n return retry;\n}\n\n/**\n * Collect (or skip) the API key for a single provider.\n * Returns the entered key, or undefined when the provider is already configured,\n * the user declines to update, leaves it blank, or rejects a failed validation.\n */\nasync function collectProviderKey(\n provider: string,\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<string | undefined> {\n const envVar = providerEnvKey(provider);\n\n if (envKeys[provider]) {\n p.log.info(`${PROVIDER_LABELS[provider] ?? provider}: already set via ${envVar}`);\n return undefined;\n }\n\n if (storedKeys[provider]) {\n const update = await p.confirm({\n message: `${PROVIDER_LABELS[provider] ?? provider}: key already stored (${maskApiKey(storedKeys[provider])}). Update it?`,\n initialValue: false,\n });\n exitOnCancel(update);\n if (!update) return undefined;\n }\n\n const keyUrl = PROVIDER_KEY_URLS[provider];\n const key = await p.password({\n message: `${PROVIDER_LABELS[provider] ?? provider} API key${keyUrl ? ` (get one at ${keyUrl})` : \"\"}:`,\n });\n exitOnCancel(key);\n\n if (!key) return undefined;\n\n const keep = await confirmKeyAfterValidation(provider, key);\n if (!keep) return undefined;\n\n return key;\n}\n\nasync function collectApiKeys(\n providers: string[],\n envKeys: Record<string, string>,\n storedKeys: Record<string, string>,\n): Promise<Record<string, string>> {\n const newKeys: Record<string, string> = {};\n\n for (const provider of providers) {\n const key = await collectProviderKey(provider, envKeys, storedKeys);\n if (key !== undefined) newKeys[provider] = key;\n }\n\n return newKeys;\n}\n\nasync function selectStorageTarget(): Promise<StorageTarget> {\n const result = await p.select({\n message: \"Where should API keys be stored?\",\n options: [\n { value: \"settings\" as const, label: \".skaile/settings.json (project-local, gitignored)\" },\n { value: \"env-project\" as const, label: `${process.cwd()}/.env (project-level)` },\n { value: \"env-global\" as const, label: `${os.homedir()}/.env (global)` },\n { value: \"skip\" as const, label: \"Skip — I'll set env vars myself\" },\n ],\n });\n exitOnCancel(result);\n return result as StorageTarget;\n}\n\nasync function selectDefaultProvider(providers: string[], current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default LLM provider:\",\n options: providers.map((id) => ({\n value: id,\n label: PROVIDER_LABELS[id] ?? id,\n })),\n initialValue: current && providers.includes(current) ? current : providers[0],\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultModel(\n provider: string,\n current?: string,\n apiKey?: string,\n): Promise<string> {\n // Try live model list from provider API, fall back to static catalog\n const s = apiKey ? p.spinner() : undefined;\n if (s) s.start(`Fetching models from ${provider}...`);\n\n const fetchResult = await getModels(provider, apiKey);\n\n if (s) {\n if (fetchResult.source === \"api\") {\n s.stop(`Loaded ${fetchResult.models.length} models from ${provider} API`);\n } else if (fetchResult.error) {\n s.stop(`Could not fetch live models (${fetchResult.error}) — using built-in catalog`);\n } else {\n s.stop(`Using built-in model catalog`);\n }\n }\n\n const models = fetchResult.models;\n if (models.length === 0) {\n p.log.warn(`No models found for ${provider} — enter a model ID manually`);\n const result = await p.text({\n message: \"Model ID:\",\n initialValue: current ?? \"\",\n });\n exitOnCancel(result);\n return result as string;\n }\n\n const result = await p.select({\n message: `Default model (${provider}):`,\n options: models.map((m) => ({\n value: m.id,\n label: `${m.name} (${m.id})`,\n })),\n initialValue: current && models.some((m) => m.id === current) ? current : models[0].id,\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDriver(current?: string): Promise<string> {\n const result = await p.select({\n message: \"Default agent driver:\",\n options: [\n { value: \"omp\", label: \"omp (oh-my-pi — multi-provider, recommended)\" },\n { value: \"claude-sdk\", label: \"claude-sdk (Anthropic Agent SDK, Claude only)\" },\n { value: \"codex\", label: \"codex (OpenAI Codex SDK, OpenAI only)\" },\n ],\n initialValue: current ?? \"omp\",\n });\n exitOnCancel(result);\n return result as string;\n}\n\nasync function selectDefaultsTarget(projectDir: string): Promise<DefaultsTarget> {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const hasYaml = fs.existsSync(yamlPath);\n\n if (!hasYaml) {\n // No skaile.yaml — can only save personally\n return \"personal\";\n }\n\n const result = await p.select({\n message: \"Where should driver, provider, and model defaults be saved?\",\n options: [\n {\n value: \"project\" as const,\n label: \"skaile.yaml (project-wide, shared with team)\",\n hint: \"recommended\",\n },\n {\n value: \"personal\" as const,\n label: \".skaile/settings.json (personal only, gitignored)\",\n },\n ],\n initialValue: \"project\" as const,\n });\n exitOnCancel(result);\n return result as DefaultsTarget;\n}\n\n/** Build the human-readable summary shown before applying the plan. */\nfunction buildSummaryLines(plan: SetupPlan, settingsFile: string): string[] {\n const lines: string[] = [];\n\n if (Object.keys(plan.newKeys).length > 0) {\n lines.push(\"New API keys:\");\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n lines.push(` ${provider.padEnd(12)} ${maskApiKey(key)}`);\n }\n const targetLabels: Record<StorageTarget, string> = {\n settings: `.skaile/settings.json (${settingsFile})`,\n \"env-project\": `${process.cwd()}/.env`,\n \"env-global\": `${os.homedir()}/.env`,\n skip: \"not saved (set env vars manually)\",\n };\n lines.push(` Storage: ${targetLabels[plan.storageTarget]}`);\n lines.push(\"\");\n }\n\n const defaultsLabel =\n plan.defaultsTarget === \"project\"\n ? \"skaile.yaml (project-wide)\"\n : \".skaile/settings.json (personal)\";\n lines.push(\"Defaults:\");\n lines.push(` Provider: ${plan.defaultProvider}`);\n lines.push(` Model: ${plan.defaultModel}`);\n lines.push(` Driver: ${plan.defaultDriver}`);\n lines.push(` Saved to: ${defaultsLabel}`);\n\n return lines;\n}\n\n/**\n * Write the new API keys to the chosen storage target.\n * For the `settings` target the keys are merged into `merged.apiKeys` (mutated\n * in place); for the env targets they are appended to the relevant `.env` file.\n */\nfunction persistApiKeys(plan: SetupPlan, merged: SkaileSettings): void {\n const hasNewKeys = Object.keys(plan.newKeys).length > 0;\n\n if (hasNewKeys && plan.storageTarget === \"settings\") {\n const apiKeys = { ...(merged.apiKeys ?? {}) };\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n apiKeys[provider] = key;\n }\n merged.apiKeys = apiKeys;\n } else if (hasNewKeys && plan.storageTarget === \"env-project\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(process.cwd(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${process.cwd()}/.env`);\n } else if (hasNewKeys && plan.storageTarget === \"env-global\") {\n const envEntries: Record<string, string> = {};\n for (const [provider, key] of Object.entries(plan.newKeys)) {\n envEntries[providerEnvKey(provider)] = key;\n }\n appendEnvFile(path.join(os.homedir(), \".env\"), envEntries);\n p.log.success(`Appended keys to ${os.homedir()}/.env`);\n }\n}\n\n/**\n * Apply the plan's defaults: write them to skaile.yaml when saving project-wide,\n * and set/strip the corresponding personal settings fields on `merged` (mutated\n * in place) so they don't shadow project-wide values.\n */\nfunction applyDefaults(plan: SetupPlan, projectDir: string, merged: SkaileSettings): void {\n // Save defaults to skaile.yaml or settings.json depending on user choice\n if (plan.defaultsTarget === \"project\") {\n const yamlPath = path.join(projectDir, \"skaile.yaml\");\n const editor = WorkspaceYamlEditor.load(yamlPath);\n editor.setAgentConfig(\"default\", {\n provider: plan.defaultProvider,\n model: plan.defaultModel,\n driver: plan.defaultDriver,\n });\n editor.save();\n p.log.success(`Saved defaults to ${yamlPath}`);\n }\n\n // Personal settings: only include defaults if saving personally, always include API keys.\n // When saving to project (skaile.yaml), strip driver/provider/model from settings.json\n // so they don't shadow the project-wide values.\n if (plan.defaultsTarget === \"personal\") {\n merged.provider = plan.defaultProvider;\n merged.model = plan.defaultModel;\n merged.driver = plan.defaultDriver;\n } else {\n delete merged.provider;\n delete merged.model;\n delete merged.driver;\n }\n}\n\nasync function reviewAndSave(plan: SetupPlan, projectDir: string): Promise<void> {\n const settingsFile = projectSettingsPath(projectDir);\n\n p.note(buildSummaryLines(plan, settingsFile).join(\"\\n\"), \"Summary\");\n\n const confirmed = await p.confirm({\n message: \"Apply these settings?\",\n initialValue: true,\n });\n exitOnCancel(confirmed);\n\n if (!confirmed) {\n p.cancel(\"Setup cancelled — no changes were made.\");\n process.exit(0);\n }\n\n // Load existing project settings (or empty)\n const existing = await loadSettings(settingsFile);\n\n const merged: SkaileSettings = { ...existing };\n applyDefaults(plan, projectDir, merged);\n persistApiKeys(plan, merged);\n\n // Write unified settings file\n await saveSettings(merged, settingsFile);\n p.log.success(`Saved settings to ${settingsFile}`);\n}\n\n// ---------------------------------------------------------------------------\n// Main entry\n// ---------------------------------------------------------------------------\n\n/** Check whether Claude Code OAuth credentials exist on disk */\nfunction hasClaudeCodeCredentials(): boolean {\n const credPath = path.join(os.homedir(), \".claude\", \".credentials.json\");\n try {\n const content = fs.readFileSync(credPath, \"utf-8\");\n const parsed = JSON.parse(content);\n // Check that it has at least one non-empty field\n return parsed && (parsed.accessToken || parsed.refreshToken || parsed.oauthToken);\n } catch {\n return false;\n }\n}\n\n/** The provider/key/model portion of a SetupPlan produced by a per-driver flow. */\ninterface DriverSetupResult {\n providers: string[];\n newKeys: Record<string, string>;\n storageTarget: StorageTarget;\n defaultProvider: string;\n defaultModel: string;\n}\n\n/**\n * Claude SDK path: Anthropic only. Honours an existing API key (env or stored)\n * or Claude Code OAuth credentials, otherwise offers to enter a key.\n */\nasync function runClaudeSdkSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"anthropic\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n // Check for existing auth: API key or Claude Code OAuth credentials\n const hasEnvKey = !!envKeys.anthropic;\n const hasStoredKey = !!apiKeys.anthropic;\n const hasOAuth = hasClaudeCodeCredentials();\n\n if (hasEnvKey) {\n p.log.info(`Anthropic API key found in environment (${maskApiKey(envKeys.anthropic)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`Anthropic API key found in settings (${maskApiKey(apiKeys.anthropic)})`);\n newKeys = {};\n } else if (hasOAuth) {\n p.log.info(\"Claude Code subscription detected (OAuth credentials found)\");\n p.log.info(\"The Claude SDK will use your Claude Code login — no API key needed.\");\n newKeys = {};\n } else {\n // No auth found — prompt for Anthropic API key\n p.log.warn(\"No Anthropic API key or Claude Code subscription found.\");\n p.log.info(\"You can either:\");\n p.log.info(\" 1. Enter an Anthropic API key now\");\n p.log.info(\" 2. Run `claude login` to authenticate with Claude Code\");\n\n const wantsKey = await p.confirm({\n message: \"Enter an Anthropic API key?\",\n initialValue: true,\n });\n exitOnCancel(wantsKey);\n\n if (wantsKey) {\n newKeys = await collectApiKeys([\"anthropic\"], envKeys, apiKeys);\n } else {\n newKeys = {};\n }\n }\n\n // Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // Model selection — only Anthropic models (try live fetch with available key)\n const anthropicKey = newKeys.anthropic ?? envKeys.anthropic ?? apiKeys.anthropic;\n const defaultModel = await selectDefaultModel(\"anthropic\", settings.model, anthropicKey);\n\n return { providers: [\"anthropic\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** Codex path: OpenAI only. Honours an existing key, otherwise prompts for one. */\nasync function runCodexSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n const defaultProvider = \"openai\";\n let newKeys: Record<string, string>;\n let storageTarget: StorageTarget = \"skip\";\n\n const hasEnvKey = !!envKeys.openai;\n const hasStoredKey = !!apiKeys.openai;\n\n if (hasEnvKey) {\n p.log.info(`OpenAI API key found in environment (${maskApiKey(envKeys.openai)})`);\n newKeys = {};\n } else if (hasStoredKey) {\n p.log.info(`OpenAI API key found in settings (${maskApiKey(apiKeys.openai)})`);\n newKeys = {};\n } else {\n p.log.warn(\"No OpenAI API key found.\");\n newKeys = await collectApiKeys([\"openai\"], envKeys, apiKeys);\n }\n\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n const openaiKey = newKeys.openai ?? envKeys.openai ?? apiKeys.openai;\n const defaultModel = await selectDefaultModel(\"openai\", settings.model, openaiKey);\n\n return { providers: [\"openai\"], newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/** omp / pi path: multi-provider flow (existing behavior). */\nasync function runMultiProviderSetup(\n settings: SkaileSettings,\n envKeys: Record<string, string>,\n apiKeys: Record<string, string>,\n): Promise<DriverSetupResult> {\n let storageTarget: StorageTarget = \"skip\";\n\n // 4. Select providers\n const providers = await selectProviders(envKeys, apiKeys);\n\n // 5. Collect API keys\n const newKeys = await collectApiKeys(providers, envKeys, apiKeys);\n\n // 6. Storage target (only ask if there are new keys)\n if (Object.keys(newKeys).length > 0) {\n storageTarget = await selectStorageTarget();\n }\n\n // 7. Default provider (from selected providers + any already configured)\n const allConfigured = [\n ...new Set([\n ...providers,\n ...Object.keys(envKeys),\n ...Object.keys(apiKeys).filter((k) => apiKeys[k]),\n ]),\n ].filter((p) => LLM_PROVIDERS.includes(p as any));\n const defaultProvider = await selectDefaultProvider(\n allConfigured.length > 0 ? allConfigured : providers,\n settings.provider,\n );\n\n // 8. Default model (try live fetch with available key)\n const providerKey =\n newKeys[defaultProvider] ?? envKeys[defaultProvider] ?? apiKeys[defaultProvider];\n const defaultModel = await selectDefaultModel(defaultProvider, settings.model, providerKey);\n\n return { providers, newKeys, storageTarget, defaultProvider, defaultModel };\n}\n\n/**\n * Interactive provider setup wizard: discovers existing config, prompts for\n * provider/model/driver preferences and API keys, then writes the results to\n * `skaile.yaml` or `.skaile/settings.json` depending on the user's choice.\n *\n * @param _args - Unused positional args (reserved for future use).\n * @param opts - Options including an optional `projectDir` override.\n * @docLink cli/dev-guide#setup\n */\nexport async function cmdSetup(_args: string[], opts: { projectDir?: string }): Promise<void> {\n p.intro(\"skaile setup\");\n\n const projectDir = opts.projectDir ?? process.cwd();\n\n // 1. Detect existing state via layered resolution\n const dotenvKeys = loadDotenvKeys();\n const envKeys = detectEnvApiKeys(dotenvKeys);\n const settings = await resolveSettings(projectDir);\n\n // 2. Show current state\n await showCurrentState(settings, envKeys);\n\n // 3. Select driver FIRST — it determines which providers/models are relevant\n const defaultDriver = await selectDriver(settings.driver);\n\n const apiKeys = settings.apiKeys ?? {};\n\n // Per-driver provider/key/model flow\n let result: DriverSetupResult;\n if (defaultDriver === \"claude-sdk\") {\n result = await runClaudeSdkSetup(settings, envKeys, apiKeys);\n } else if (defaultDriver === \"codex\") {\n result = await runCodexSetup(settings, envKeys, apiKeys);\n } else {\n result = await runMultiProviderSetup(settings, envKeys, apiKeys);\n }\n\n // 9. Choose where to save defaults (project-wide vs personal)\n const defaultsTarget = await selectDefaultsTarget(projectDir);\n\n // 10. Review and save\n await reviewAndSave(\n {\n providers: result.providers,\n newKeys: result.newKeys,\n storageTarget: result.storageTarget,\n defaultsTarget,\n defaultProvider: result.defaultProvider,\n defaultModel: result.defaultModel,\n defaultDriver,\n },\n projectDir,\n );\n\n p.outro(\"Setup complete!\");\n}\n"]}
@@ -1,8 +1,8 @@
1
- export { clearStoreTokens, getStoreConfig, isStoreAuthenticated, saveStoreTokens, storeFetch } from './chunk-Z3ZRI2AE.js';
2
- import './chunk-G3GODNHM.js';
1
+ export { clearStoreTokens, getStoreConfig, isStoreAuthenticated, saveStoreTokens, storeFetch } from './chunk-4IGNQG6E.js';
2
+ import './chunk-SDAKQCOB.js';
3
3
  import './chunk-ZAP2BDHG.js';
4
- import './chunk-3VBQJZYL.js';
5
- import './chunk-WTFJFW7F.js';
4
+ import './chunk-WBF7JLTY.js';
5
+ import './chunk-PBO6SCT2.js';
6
6
  import './chunk-DZCK7GRW.js';
7
7
  import './chunk-6IDBWPK2.js';
8
8
  import './chunk-GEEW6SY2.js';
@@ -11,5 +11,5 @@ import './chunk-O4JH3KUE.js';
11
11
  import './chunk-K5GBV4SA.js';
12
12
  import './chunk-JB35MVBN.js';
13
13
  import './chunk-NSBPE2FW.js';
14
- //# sourceMappingURL=store-client-U4FMAIWX.js.map
15
- //# sourceMappingURL=store-client-U4FMAIWX.js.map
14
+ //# sourceMappingURL=store-client-SLFAAKSV.js.map
15
+ //# sourceMappingURL=store-client-SLFAAKSV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"store-client-U4FMAIWX.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"store-client-SLFAAKSV.js"}
package/dist/tui/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { createAgentSession } from '../chunk-BDM5UVU3.js';
2
- import '../chunk-XHDPCL4O.js';
1
+ import { createAgentSession } from '../chunk-CK3O5BCT.js';
2
+ import '../chunk-SXT6BAQJ.js';
3
3
  import '../chunk-X5YPJV4N.js';
4
4
  import '../chunk-O7SG5PC2.js';
5
5
  import '../chunk-7QBNJTTQ.js';
@@ -8,24 +8,24 @@ import '../chunk-WQ7DE5UC.js';
8
8
  import '../chunk-32NA4TVC.js';
9
9
  import '../chunk-W3UDISS2.js';
10
10
  import '../chunk-EVZKWY5J.js';
11
- import '../chunk-5C3QJSOD.js';
11
+ import '../chunk-OYMSCV7T.js';
12
12
  import '../chunk-RRVQAE5D.js';
13
13
  import '../chunk-BMQKMOQY.js';
14
14
  import '../chunk-GAH4YRCI.js';
15
- import '../chunk-OCAQH66V.js';
15
+ import '../chunk-N5AE5SOC.js';
16
16
  import '../chunk-LV2HPH3C.js';
17
- import '../chunk-KC7V5XCO.js';
17
+ import '../chunk-EBSIZYM6.js';
18
18
  import '../chunk-OVRSNIKJ.js';
19
- import { loadConnectorDeclarations } from '../chunk-T2CIVTTC.js';
19
+ import { loadConnectorDeclarations } from '../chunk-ZJ3VRPOI.js';
20
20
  import '../chunk-RAIRWFAN.js';
21
21
  import '../chunk-6E6PKKAD.js';
22
22
  import '../chunk-X46FY45B.js';
23
23
  import '../chunk-DEYYRFQU.js';
24
24
  import '../chunk-IFGTRL2I.js';
25
- import { resolveSettings } from '../chunk-G3GODNHM.js';
25
+ import { resolveSettings } from '../chunk-SDAKQCOB.js';
26
26
  import '../chunk-ZAP2BDHG.js';
27
- import '../chunk-3VBQJZYL.js';
28
- import { resolveAgentDir } from '../chunk-WTFJFW7F.js';
27
+ import '../chunk-WBF7JLTY.js';
28
+ import { resolveAgentDir } from '../chunk-PBO6SCT2.js';
29
29
  import '../chunk-DZCK7GRW.js';
30
30
  import '../chunk-6IDBWPK2.js';
31
31
  import '../chunk-GEEW6SY2.js';
@@ -1,4 +1,4 @@
1
- import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-P6HRQPXC.js';
1
+ import { flowList, flowShow, flowListSessions, flowGetSession, flowFindFlowForSession } from '../../chunk-3A3OACI2.js';
2
2
  import { sessionList, sessionGet } from '../../chunk-R6O6YWU7.js';
3
3
  import { skillList, skillListDomains, skillShow, skillSearch, skillCheckRequirements, skillGetPreamble } from '../../chunk-KY5NY7LB.js';
4
4
  import '../../chunk-XCBG2KDC.js';
@@ -74,7 +74,7 @@ function buildOmpToolSet(plugin) {
74
74
  description: "List all available flow definitions from ai-assets.",
75
75
  parameters: {},
76
76
  handler: async () => {
77
- const { flowList } = await import('../../flows-PNDUCOJR.js');
77
+ const { flowList } = await import('../../flows-AAHXXXCH.js');
78
78
  return (await flowList(plugin.projectDir)).content[0].text;
79
79
  }
80
80
  },
@@ -83,7 +83,7 @@ function buildOmpToolSet(plugin) {
83
83
  description: "List past flow run sessions for this workspace.",
84
84
  parameters: {},
85
85
  handler: async () => {
86
- const { flowListSessions } = await import('../../flows-PNDUCOJR.js');
86
+ const { flowListSessions } = await import('../../flows-AAHXXXCH.js');
87
87
  return (await flowListSessions(plugin.projectDir)).content[0].text;
88
88
  }
89
89
  },
@@ -201,7 +201,7 @@ async function handleSlashCommand(plugin, group, args) {
201
201
  }
202
202
  }
203
203
  async function handleFlowCommand(plugin, sub, rest) {
204
- const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-PNDUCOJR.js');
204
+ const { flowList, flowShow, flowListSessions, flowGetSession } = await import('../../flows-AAHXXXCH.js');
205
205
  if (!sub || sub === "list") return (await flowList(plugin.projectDir)).content[0].text;
206
206
  if (sub === "show" && rest[0])
207
207
  return (await flowShow(plugin.projectDir, rest[0])).content[0].text;
@@ -1,4 +1,4 @@
1
- export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-XHDPCL4O.js';
1
+ export { PluginStore, WorkspacePlugin, buildClaudePluginFiles, resolveProjectDir } from '../chunk-SXT6BAQJ.js';
2
2
  export { err, ok, okJson } from '../chunk-X5YPJV4N.js';
3
3
  import '../chunk-JB35MVBN.js';
4
4
  import '../chunk-NSBPE2FW.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skaile/workspaces",
3
- "version": "0.48.1",
3
+ "version": "0.48.2",
4
4
  "description": "Skaile workspaces runtime — types, core, bridge, runner, store, connectors, and supporting layers as one publishable package",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.9",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["parseYaml","basename","join","resolve","existsSync"],"mappings":";;;;;;;;;;AAmCA,SAAS,aAAa,QAAA,EAAwC;AAC5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,YAAY,CAAA;AAC5C,EAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,IAAI;AACF,IAAA,OAAOA,KAAA,CAAU,YAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,QAAA,CAAS,UAAkB,IAAA,EAA6B;AAC/D,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,IAAI;AACF,IAAA,OAAO,YAAA,CAAa,GAAG,OAAO,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,SAAS,iBAAiB,OAAA,EAA0C;AAClE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,uBAAuB,CAAA;AACnD,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,IAAI;AACF,IAAA,OAAQA,KAAA,CAAU,KAAA,CAAM,CAAC,CAAE,KAAiC,EAAC;AAAA,EAC/D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAMA,SAAS,cAAA,CAAe,QAAuB,KAAA,EAAqC;AAClF,EAAA,MAAM,MAAA,GAAwB,EAAE,GAAG,MAAA,EAAO;AAC1C,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAuC;AAChF,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,SAAA,GAAY,OAAO,CAAwB,CAAA;AACjD,IAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAClD,MAAC,MAAA,CAAmC,CAAC,CAAA,GAAI,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,SAAA,EAAW,GAAG,GAAG,CAAC,CAAC,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAC,MAAA,CAAmC,CAAC,CAAA,GAAI,GAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,iBAAA,CACP,QAAA,EACA,MAAA,EACA,QAAA,EACe;AACf,EAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,OAAO,QAAA;AAC9B,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,aAAa,SAAS,CAAA;AAC7C,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAO,cAAA,CAAe,gBAAgB,QAAQ,CAAA;AAAA,EAChD;AACA,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,CAAA,oCAAA,EAAuC,QAAA,CAAS,OAAO,CAAA,QAAA,EAAW,MAAM,CAAA,6BAAA;AAAA,GAC1E;AACA,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,kBAAA,CACP,QAAA,EACA,aAAA,EACA,YAAA,EACc;AACd,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,EAAe,YAAA,EAAc,MAAM,UAAU,CAAA;AACtE,IAAA,IAAI,CAAC,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,gBAAA,CAAiB,YAAA,CAAa,WAAA,EAAa,OAAO,CAAC,CAAA;AAC9D,MAAA,MAAM,OAAO,OAAO,EAAA,CAAG,WAAA,KAAgB,QAAA,GAAW,GAAG,WAAA,GAAc,KAAA,CAAA;AACnE,MAAA,IAAI,MAAM,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,WAAA;AACT;AAGA,SAAS,mBAAA,CACP,QAAA,EACA,aAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,eAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG;AAC3C,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,aAAA,EAAe,YAAA,EAAc,MAAM,aAAa,CAAA;AAC7E,IAAA,IAAI,CAAC,UAAA,CAAW,eAAe,CAAA,EAAG;AAClC,IAAA,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,SAAS,aAAA,EAAe,eAAe,GAAG,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,YAAA;AACT;AAGA,SAAS,qBACP,QAAA,EACA,YAAA,EACA,YAAA,EACA,QAAA,EACA,aACA,YAAA,EACiB;AACjB,EAAA,MAAM,aAAA,GAAA,CAAiB,QAAA,CAAS,QAAA,IAAY,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAEvF,EAAA,MAAM,cAA8B,QAAA,EAAU,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC1E,IAAI,CAAA,CAAE,EAAA;AAAA,IACN,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,MAAA,EAAQ,EAAE,MAAA,IAAU;AAAA,GACtB,CAAE,CAAA;AAEF,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,YAA4B,CAAA,EAAG,MAAM,KAAA,IAAS,EAAA;AAElF,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,YAAA;AAAA,IACX,SAAA,EAAW,YAAA;AAAA,IACX,SAAA,EAAW,YAAA;AAAA,IACX,SAAA,EAAW,aAAA;AAAA,IACX,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAwBO,SAAS,YAAA,CACd,MAAA,EACA,cAAA,EACA,aAAA,EACA,YAAA,EAEA,cACA,YAAA,EACA,gBAAA,EACA,OAAA,EACA,QAAA,EACA,GAAA,EAC2C;AAC3C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,OAAA,GAAU,QAAQ,MAAM,CAAA;AAC9B,EAAA,IAAI,QAAQ,GAAA,CAAI,OAAO,GAAG,OAAO,EAAE,SAAS,QAAA,EAAS;AACrD,EAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AAEnB,EAAA,MAAM,eAAA,GAAkB,aAAa,MAAM,CAAA;AAC3C,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,iEAAA,CAA8D,CAAA;AACrF,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAGA,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,eAAA,EAAiB,MAAA,EAAQ,QAAQ,CAAA;AAEpE,EAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,QAAA,CAAS,IAAA,IAAQ,SAAS,MAAM,CAAA;AAElE,EAAA,GAAA,GAAM,CAAA,sBAAA,EAAyB,SAAS,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAG,CAAA;AAG5D,EAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,QAAA,EAAU,aAAA,EAAe,YAAY,CAAA;AAG5E,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,QAAA,EAAU,aAAA,EAAe,YAAY,CAAA;AAG9E,EAAA,MAAM,WAAA,GAAc,oBAAA;AAAA,IAClB,QAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,gBAAA;AAAA,IACzB,WAAA;AAAA,IACA,UAAU,KAAA,EAAO,SAAA;AAAA,IACjB;AAAA,GACF;AACA,EAAA,MAAM,gBAAA,GAAmB,oBAAA;AAAA,IACvB,QAAA,EAAU,QAAQ,mBAAmB,CAAA;AAAA,IACrC;AAAA,GACF;AAEA,EAAA,MAAM,KAAA,GAA0B;AAAA,IAC9B,QAAA;AAAA,IACA,IAAA,EAAM,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,IAChC,KAAA,EAAO,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAA;AAAA,IAClC,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,WAAW,CAAA;AAAA,IACpC,SAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,KAAA,EAAO,YAAA,EAAc,GAAG,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAA,CAAO,OAAO,CAAA;AAC9B,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAGhC,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,gBAAA,CAAiB,QAAA,EAAU,SAAA,EAAW,MAAA,EAAQ,cAAA,EAAgB,eAAe,YAAA,EAAc;AAAA,MACzF,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAC7B;AAOA,SAAS,iBACP,QAAA,EACA,SAAA,EACA,QACA,cAAA,EACA,aAAA,EACA,cACA,GAAA,EASM;AACN,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,QAAA,IAAY,EAAC,EAAG;AACzC,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,CAAC,IAAI,IAAA,EAAM;AAE9B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA,GAAI,IAAI,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA;AAE/E,IAAA,IAAI,CAAC,UAAA,CAAW,MAAM,CAAA,EAAG;AACvB,MAAA,GAAA,CAAI,SAAS,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,MAAM,CAAA,OAAA,EAAU,SAAS,CAAA,CAAA,CAAG,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,YAAA;AAAA,MACV,MAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA,CAAI,YAAA;AAAA,MACJ,MAAA;AAAA;AAAA,MACA,GAAA,CAAI,gBAAA;AAAA,MACJ,GAAA,CAAI,OAAA;AAAA,MACJ,GAAA,CAAI,QAAA;AAAA,MACJ,GAAA,CAAI;AAAA,KACN;AACA,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,GAAA,CAAI,OAAO,CAAA;AAC/B,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,GAAG,GAAA,CAAI,QAAQ,CAAA;AAAA,EACnC;AACF;;;AC1SA,IAAM,OAAY,MAAM;AAAC,CAAA;AAIzB,IAAM,mBAAA,uBAA0B,GAAA,CAAI,CAAC,YAAY,UAAA,EAAY,YAAA,EAAc,aAAa,CAAC,CAAA;AAEzF,SAAS,UAAU,IAAA,EAAoB;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAU,IAAI,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,cAAA,EAAe,EAAG,UAAA,CAAW,IAAI,CAAA;AAAA,gBAC3B,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AAAA,EAAC;AACX;AAEA,SAAS,gBAAA,CAAiB,cAAsB,IAAA,EAAoB;AAClE,EAAA,MAAM,IAAA,GAAOC,SAAS,YAAY,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,QAAQ,YAAY,CAAA;AACtC,EAAA,SAAA,CAAU,IAAI,CAAA;AAEd,EAAA,IAAI,mBAAA,CAAoB,IAAI,IAAI,CAAA,IAAKA,SAAS,SAAS,CAAA,KAAMA,QAAAA,CAAS,IAAI,CAAA,EAAG;AAC3E,IAAA,MAAA,CAAO,SAAA,EAAW,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACnC,IAAA,MAAA,CAAO,YAAA,EAAcC,IAAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EACvC;AACF;AAEA,SAAS,mBAAA,CAAoB,cAAsB,IAAA,EAAoB;AACrE,EAAA,MAAM,IAAA,GAAOD,SAAS,YAAY,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,QAAQ,YAAY,CAAA;AACtC,EAAA,SAAA,CAAU,IAAI,CAAA;AACd,EAAA,SAAA,CAAU,QAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAE5C,EAAA,IAAI,mBAAA,CAAoB,IAAI,IAAI,CAAA,IAAKA,SAAS,SAAS,CAAA,KAAMA,QAAAA,CAAS,IAAI,CAAA,EAAG;AAC3E,IAAA,WAAA,CAAYE,OAAAA,CAAQ,SAAS,CAAA,EAAG,IAAI,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACnC,IAAA,WAAA,CAAYA,QAAQ,YAAY,CAAA,EAAGD,IAAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,EACrD;AACF;AAoCO,SAAS,YACd,KAAA,EACA,YAAA,EACA,OAAsB,EAAC,EACvB,MAAW,IAAA,EACF;AACT,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,aAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,KAAA;AACrC,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAIjB,EAAA,IAAI,MAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,cAAc,OAAO,IAAA;AAGnE,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,MAAM,aAAA,GAAgB,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACzC,IAAA,MAAM,cAAA,GAAiB,YAAA;AAAA,MACrB,OAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,SAAA,GAAY,eAAe,YAA4B,CAAA;AAC7D,IAAA,MAAM,YAAA,GAAe,SAAA,EAAW,KAAA,CAAM,KAAA,IAAS,EAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,yBAAyB,aAAa,CAAA;AACvD,IAAA,MAAM,IAAA,GAAOD,QAAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,oBAAoB,GAAA,CAAI,IAAI,IAAI,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA;AAC7E,IAAA,MAAM,MAAA,GAAS,YAAA;AAAA,MACb,MAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA,CAAM,IAAA;AAAA;AAAA,MACiB,IAAA;AAAA,0BACnB,GAAA,EAAY;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,KAAK,MAAA,CAAO,QAAA,EAAU,GAAA,CAAI,CAAA,QAAA,EAAW,CAAC,CAAA,CAAE,CAAA;AACnD,IAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAAA,EAExC;AAEA,EAAA,MAAM,IAAA,GAAO,YAAY,KAAA,CAAM,IAAA,EAAqB,MAAM,IAAA,EAAM,YAAA,EAAc,eAAe,GAAG,CAAA;AAChG,EAAA,SAAA,CAAU,QAAQ,IAAI,CAAA,EAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAK5C,EAAA,MAAM,WAAW,KAAA,CAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA;AACnE,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,IAAA,IAAQ,IAAA,IAAQ,SAAS,OAAA,KAAY,IAAA;AAE/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,mBAAA,CAAoB,KAAA,CAAM,QAAQ,IAAI,CAAA;AACtC,IAAA,GAAA,CAAI,aAAa,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,gBAAA,CAAiB,KAAA,CAAM,QAAQ,IAAI,CAAA;AACnC,IAAA,GAAA,CAAI,UAAU,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAkBO,SAAS,SAAA,CACd,UACA,YAAA,EACA,OAAA,EACA,OAAsB,EAAC,EACvB,MAAW,IAAA,EACD;AACV,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,aAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,KAAA;AACrC,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAEjB,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAI5B,IAAA,IACE,KAAA,CAAM,IAAA,KAAS,QAAA,IACf,KAAA,CAAM,IAAA,KAAS,YAAA,IACf,KAAA,CAAM,IAAA,KAAS,SAAA,IACf,KAAA,CAAM,IAAA,KAAS,SAAA,IACf,MAAM,IAAA,KAAS,WAAA;AAEf,MAAA;AAEF,IAAA,MAAM,MAAM,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAEvC,IAAA,IAAI,UAAA,CAAW,MAAM,IAAA,EAAqB,KAAA,CAAM,MAAM,YAAA,EAAc,aAAA,EAAe,GAAG,CAAA,EAAG;AAIvF,MAAA,MAAM,IAAA,GAAO,WAAA;AAAA,QACX,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM,IAAA;AAAA,QACN,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,YAAA,GAAeA,QAAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAC1C,MAAA,MAAM,gBAAA,GAAmBC,IAAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAChD,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA;AACxC,QAAA,MAAM,OAAA,GAAU,YAAY,gBAAgB,CAAA;AAC5C,QAAA,IAAI,YAAY,OAAA,EAAS;AACvB,UAAA,GAAA,CAAI,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAChC,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,CAAA,YAAA,EAAe,GAAG,CAAA,kBAAA,CAAoB,CAAA;AAAA,MAE5C,CAAA,CAAA,MAAQ;AAEN,QAAA,GAAA,CAAI,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAChC,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,GAAG,CAAA;AAC1C,IAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAGjB,IAAA,MAAM,SAAA,GAAY,QAAQ,GAAG,CAAA;AAC7B,IAAA,IAAI,SAAA,IAAaE,UAAAA,CAAW,SAAS,CAAA,EAAG;AACtC,MAAA,MAAM,IAAA,GAAO,WAAA;AAAA,QACX,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM,IAAA;AAAA,QACN,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,UAAA,CAAW,IAAA,EAAM,SAAS,CAAA,EAAG;AAC/B,QAAA,GAAA,CAAI,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,CAAA,mBAAA,EAAsB,GAAG,CAAA,CAAE,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAaO,SAAS,WAAA,CAAY,IAAA,EAAc,IAAA,EAAc,IAAA,GAAsB,EAAC,EAAY;AACzF,EAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,aAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,IAAU,KAAA;AACrC,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAEjB,EAAA,MAAM,OAAO,WAAA,CAAY,IAAA,EAAqB,IAAA,EAAM,YAAA,EAAc,eAAe,GAAG,CAAA;AACpF,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAU,IAAI,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,cAAA,EAAe,EAAG,UAAA,CAAW,IAAI,CAAA;AAAA,gBAC3B,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAIA,IAAM,cAAA,GAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAYvB,IAAM,eAAA,GAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOxB,IAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA,CAAA;AAyBf,SAAS,cAAA,CACd,IAAA,EACA,IAAA,EACA,OAAA,EAC+B;AAC/B,EAAA,MAAM,IAAA,GAAOF,IAAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC/B,EAAA,IAAIE,UAAAA,CAAW,IAAI,CAAA,EAAG;AACpB,IAAA,OAAO,EAAE,IAAI,KAAA,EAAO,IAAA,EAAM,cAAc,IAAI,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,EAAG;AAAA,EAC/E;AACA,EAAA,SAAA,CAAU,IAAA,EAAM,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAEnC,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,aAAA;AAAA,MACEF,IAAAA,CAAK,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAc,CAAA;AAAA,MAChC,eAAA,CAAgB,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,MACzC;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,aAAA;AAAA,MACEA,IAAAA,CAAK,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC9B,aAAA,CAAc,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,MACvC;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,aAAA;AAAA,MACEA,IAAAA,CAAK,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,MAC9B,cAAA,CAAe,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AAAA,MACxC;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,aAAA,CAAcA,IAAAA,CAAK,MAAM,UAAU,CAAA,EAAG,eAAe,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA,EAAG,MAAM,CAAA;AAAA,EACzF,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,aAAA,CAAcA,IAAAA,CAAK,MAAM,aAAa,CAAA,EAAG,eAAe,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA,EAAG,MAAM,CAAA;AAAA,EAC5F,CAAA,MAAO;AAEL,IAAA,aAAA,CAAcA,IAAAA,CAAK,MAAM,UAAU,CAAA,EAAG,eAAe,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA,EAAG,MAAM,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK;AAChC","file":"chunk-4VPRAG35.js","sourcesContent":["/**\n * Agent installation — renders a GitAgent package (agent.yaml + SOUL.md + RULES.md)\n * into the framework-native format (`.claude/agents/<name>.md`, `.omp/agents/<name>/`,\n * `.codex/agents/<name>.toml`) and resolves abilities, contracts, fragments, and\n * prompt extensions from the workspace config along the way.\n *\n * System prompt phases (per agent):\n * 1. extends merge — inherit from parent agent.yaml if manifest.extends is set\n * 2. ability refs — read SKILL.md frontmatter from installed skills dir\n * 3. contract refs — locate CONTRACT.md files in the installed skills dir\n * 4. fragments — resolve framework fragments (agent-mode, handoff, etc.)\n * 5. prompt-extensions — load per-project markdown extensions from skaile.yaml\n *\n * Used by `installer.ts` (the asset-install path) and `skaile install`. Sub-agents\n * declared in `agent.yaml#requires` are installed flat (no nesting) in the same\n * deploy directory.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, isAbsolute, join, relative, resolve } from \"node:path\";\nimport type { DriverTarget, SkWorkspaceConfig } from \"@skaile/workspaces/core\";\nimport { DRIVER_TARGETS } from \"@skaile/workspaces/core\";\nimport { parse as parseYaml } from \"yaml\";\nimport {\n type AbilityRef,\n type ConnectorRef,\n type ContractRef,\n type FragmentContext,\n loadPromptExtensions,\n resolveFragments,\n} from \"./fragments.js\";\nimport { type AgentManifest, type AgentRenderInput, renderAgentToFramework } from \"./renderers.js\";\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction readManifest(agentDir: string): AgentManifest | null {\n const yamlPath = join(agentDir, \"agent.yaml\");\n if (!existsSync(yamlPath)) return null;\n try {\n return parseYaml(readFileSync(yamlPath, \"utf-8\")) as AgentManifest;\n } catch {\n return null;\n }\n}\n\nfunction readFile(agentDir: string, name: string): string | null {\n const p = join(agentDir, name);\n if (!existsSync(p)) return null;\n try {\n return readFileSync(p, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n/** Extract YAML frontmatter from a markdown file (content between first two --- delimiters). */\nfunction parseFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n try {\n return (parseYaml(match[1]!) as Record<string, unknown>) ?? {};\n } catch {\n return {};\n }\n}\n\n/**\n * Merge parent and child agent manifests.\n * Scalars: child wins. Arrays: parent + child, deduplicated.\n */\nfunction mergeManifests(parent: AgentManifest, child: AgentManifest): AgentManifest {\n const result: AgentManifest = { ...parent };\n for (const [k, val] of Object.entries(child) as [keyof AgentManifest, unknown][]) {\n if (val === undefined) continue;\n const parentVal = result[k as keyof AgentManifest];\n if (Array.isArray(val) && Array.isArray(parentVal)) {\n (result as Record<string, unknown>)[k] = [...new Set([...parentVal, ...val])];\n } else {\n (result as Record<string, unknown>)[k] = val;\n }\n }\n return result;\n}\n\n/**\n * Phase 1: inherit scalars/arrays from a parent agent when `manifest.extends` is set.\n * Returns the (possibly merged) manifest; pushes a warning when the parent is missing.\n */\nfunction applyExtendsMerge(\n manifest: AgentManifest,\n srcDir: string,\n warnings: string[],\n): AgentManifest {\n if (!manifest.extends) return manifest;\n const parentDir = resolve(srcDir, manifest.extends);\n const parentManifest = readManifest(parentDir);\n if (parentManifest) {\n return mergeManifests(parentManifest, manifest);\n }\n warnings.push(\n `extends: parent agent not found at \"${manifest.extends}\" (from ${srcDir}) — skipping inheritance`,\n );\n return manifest;\n}\n\n/** Phase 2: resolve ability refs — read description from installed SKILL.md files. */\nfunction resolveAbilityRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): AbilityRef[] {\n const abilityRefs: AbilityRef[] = [];\n for (const name of manifest.abilities ?? []) {\n const skillMdPath = join(workspaceRoot, skillsRelDir, name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n const fm = parseFrontmatter(readFileSync(skillMdPath, \"utf-8\"));\n const desc = typeof fm.description === \"string\" ? fm.description : undefined;\n if (desc) abilityRefs.push({ name, description: desc });\n } catch {\n // skip unreadable SKILL.md\n }\n }\n return abilityRefs;\n}\n\n/** Phase 3: resolve contract refs — locate CONTRACT.md files in the skills dir. */\nfunction resolveContractRefs(\n manifest: AgentManifest,\n workspaceRoot: string,\n skillsRelDir: string,\n): ContractRef[] {\n const contractRefs: ContractRef[] = [];\n for (const name of manifest.contracts ?? []) {\n const contractAbsPath = join(workspaceRoot, skillsRelDir, name, \"CONTRACT.md\");\n if (!existsSync(contractAbsPath)) continue;\n contractRefs.push({ name, relativePath: relative(workspaceRoot, contractAbsPath) });\n }\n return contractRefs;\n}\n\n/** Phase 4: assemble the fragment context from the manifest, workspace config, and resolved refs. */\nfunction buildFragmentContext(\n manifest: AgentManifest,\n driverTarget: string,\n skillsRelDir: string,\n wsConfig: SkWorkspaceConfig | undefined,\n abilityRefs: AbilityRef[],\n contractRefs: ContractRef[],\n): FragmentContext {\n const subAgentNames = (manifest.requires ?? []).filter((r) => r.name).map((r) => r.name);\n\n const connectors: ConnectorRef[] = (wsConfig?.connectors ?? []).map((c) => ({\n id: c.id,\n driver: c.driver,\n access: c.access ?? \"read-write\",\n }));\n\n const agentsRelDir = DRIVER_TARGETS[driverTarget as DriverTarget]?.local.agent ?? \"\";\n\n return {\n framework: driverTarget,\n skillsDir: skillsRelDir,\n agentsDir: agentsRelDir,\n subAgents: subAgentNames,\n connectors,\n abilityRefs,\n contractRefs,\n };\n}\n\n// ── Core installation ─────────────────────────────────────────────────────────\n\n/**\n * Install a single GitAgent source directory using the appropriate renderer.\n *\n * When `includeSubAgents` is `true`, recursively installs `requires[]` entries as\n * separate flat agents in the same deploy directory (no nesting). Tracks visited\n * directories to prevent infinite loops in `requires[]` cycles.\n *\n * @param srcDir - Absolute path to the GitAgent source directory (contains `agent.yaml`).\n * @param agentDeployDir - Absolute path to the framework's agent deploy directory.\n * @param workspaceRoot - Absolute path to the workspace root.\n * @param driverTarget - Agent framework ID used to select the renderer.\n * @param skillsRelDir - Relative path to the installed skills dir (e.g. `\".claude/skills\"`).\n * @param nameOverride - Override name for the installed agent. Defaults to `manifest.name`.\n * @param includeSubAgents - When `true`, recursively install `requires[]` sub-agents.\n * @param visited - Set of resolved source paths already processed (cycle guard).\n * @param wsConfig - Workspace config from `skaile.yaml` (fragments, connectors, extensions).\n * @param log - Optional logger callback for progress messages.\n * @returns Object with `created` file paths and `warnings` list.\n * @docLink packages/asset-manager/concepts#install-agent\n */\nexport function installAgent(\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n driverTarget: string,\n /** Relative path to the installed skills dir (e.g. \".claude/skills\") */\n skillsRelDir: string,\n nameOverride: string | undefined,\n includeSubAgents: boolean,\n visited: Set<string>,\n wsConfig: SkWorkspaceConfig | undefined,\n log?: (msg: string) => void,\n): { created: string[]; warnings: string[] } {\n const created: string[] = [];\n const warnings: string[] = [];\n\n const realSrc = resolve(srcDir);\n if (visited.has(realSrc)) return { created, warnings };\n visited.add(realSrc);\n\n const initialManifest = readManifest(srcDir);\n if (!initialManifest) {\n warnings.push(`${srcDir} has no agent.yaml — skipping (not a valid GitAgent package)`);\n return { created, warnings };\n }\n\n // Phase 1: extends merge — inherit scalars/arrays from parent agent\n const manifest = applyExtendsMerge(initialManifest, srcDir, warnings);\n\n const agentName = nameOverride ?? manifest.name ?? basename(srcDir);\n\n log?.(`Installing git-agent: ${agentName} (${driverTarget})`);\n\n // Phase 2: resolve ability refs — read description from installed SKILL.md files\n const abilityRefs = resolveAbilityRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 3: resolve contract refs — locate CONTRACT.md files in the skills dir\n const contractRefs = resolveContractRefs(manifest, workspaceRoot, skillsRelDir);\n\n // Phase 4: build fragment context and resolve framework fragments + prompt extensions\n const fragmentCtx = buildFragmentContext(\n manifest,\n driverTarget,\n skillsRelDir,\n wsConfig,\n abilityRefs,\n contractRefs,\n );\n\n const frameworkFragments = resolveFragments(\n fragmentCtx,\n wsConfig?.agent?.fragments,\n workspaceRoot,\n );\n const promptExtensions = loadPromptExtensions(\n wsConfig?.agent?.[\"prompt-extensions\"],\n workspaceRoot,\n );\n\n const input: AgentRenderInput = {\n manifest,\n soul: readFile(srcDir, \"SOUL.md\"),\n rules: readFile(srcDir, \"RULES.md\"),\n duties: readFile(srcDir, \"DUTIES.md\"),\n agentName,\n agentDeployDir,\n workspaceRoot,\n abilityRefs,\n contractRefs,\n frameworkFragments,\n promptExtensions,\n };\n\n const result = renderAgentToFramework(input, driverTarget, log);\n created.push(...result.created);\n warnings.push(...result.warnings);\n\n // Recursively install sub-agents from requires[] as flat top-level agents\n if (includeSubAgents) {\n installSubAgents(manifest, agentName, srcDir, agentDeployDir, workspaceRoot, driverTarget, {\n skillsRelDir,\n includeSubAgents,\n visited,\n wsConfig,\n log,\n created,\n warnings,\n });\n }\n\n return { created, warnings };\n}\n\n/**\n * Recursively install `requires[]` entries as separate flat agents in the same deploy\n * directory. Appends rendered file paths and warnings into the shared `created`/`warnings`\n * arrays carried on `ctx`.\n */\nfunction installSubAgents(\n manifest: AgentManifest,\n agentName: string,\n srcDir: string,\n agentDeployDir: string,\n workspaceRoot: string,\n driverTarget: string,\n ctx: {\n skillsRelDir: string;\n includeSubAgents: boolean;\n visited: Set<string>;\n wsConfig: SkWorkspaceConfig | undefined;\n log?: (msg: string) => void;\n created: string[];\n warnings: string[];\n },\n): void {\n for (const req of manifest.requires ?? []) {\n if (!req.source || !req.name) continue;\n\n const subSrc = isAbsolute(req.source) ? req.source : resolve(srcDir, req.source);\n\n if (!existsSync(subSrc)) {\n ctx.warnings.push(`Sub-agent source not found: ${req.source} (from ${agentName})`);\n continue;\n }\n\n const sub = installAgent(\n subSrc,\n agentDeployDir,\n workspaceRoot,\n driverTarget,\n ctx.skillsRelDir,\n undefined, // use sub-agent's own name from its agent.yaml\n ctx.includeSubAgents,\n ctx.visited,\n ctx.wsConfig,\n ctx.log,\n );\n ctx.created.push(...sub.created);\n ctx.warnings.push(...sub.warnings);\n }\n}\n","/**\n * Asset deployment — symlink (local repos) or copy (remote repos) to framework dirs.\n */\n\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n symlinkSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type {\n AiComponent,\n CatalogEntry,\n DriverTarget,\n SourceDeclaration,\n} from \"@skaile/workspaces/core\";\nimport {\n applyPatch,\n computeHash,\n DRIVER_TARGETS,\n deployedBase,\n deployedDir,\n isDeployed,\n resolveSkWorkspaceConfig,\n} from \"@skaile/workspaces/core\";\nimport { installAgent } from \"./install-agent.js\";\nimport type { Log } from \"./renderers.js\";\n\nexport type { Log } from \"./renderers.js\";\n\nconst noop: Log = () => {};\n\n// ── Filesystem helpers ────────────────────────────────────────────────────────\n\nconst DIRECTORY_MANIFESTS = new Set([\"SKILL.md\", \"AGENT.md\", \"agent.yaml\", \"CONTRACT.md\"]);\n\nfunction clearDest(dest: string): void {\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n } catch {}\n}\n\nfunction copyFromManifest(manifestPath: string, dest: string): void {\n const name = basename(manifestPath);\n const parentDir = dirname(manifestPath);\n clearDest(dest);\n\n if (DIRECTORY_MANIFESTS.has(name) || basename(parentDir) === basename(dest)) {\n cpSync(parentDir, dest, { recursive: true });\n } else {\n mkdirSync(dest, { recursive: true });\n cpSync(manifestPath, join(dest, name));\n }\n}\n\nfunction symlinkFromManifest(manifestPath: string, dest: string): void {\n const name = basename(manifestPath);\n const parentDir = dirname(manifestPath);\n clearDest(dest);\n mkdirSync(dirname(dest), { recursive: true });\n\n if (DIRECTORY_MANIFESTS.has(name) || basename(parentDir) === basename(dest)) {\n symlinkSync(resolve(parentDir), dest);\n } else {\n mkdirSync(dest, { recursive: true });\n symlinkSync(resolve(manifestPath), join(dest, name));\n }\n}\n\n// ── Deploy options ───────────────────────────────────────────────────────────\n\n/**\n * Options controlling where and how assets are deployed.\n *\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport interface DeployOptions {\n /** Agent framework to target (determines framework-specific directory layout). Defaults to `\"claude-code\"`. */\n driverTarget?: DriverTarget;\n /** When `true`, deploy into the global Skaile cache rather than a project workspace. */\n global?: boolean;\n /** Absolute path to the workspace root. Defaults to `process.cwd()`. */\n cwd?: string;\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Uses symlinks for local-path repositories (fast, live-updating) and copies\n * for remote repositories (persists after repo wipes). Agents are rendered\n * via the enriched `installAgent` path which resolves abilities, contracts,\n * and framework fragments before writing the native agent file.\n *\n * @param entry - Catalog entry describing the asset to deploy.\n * @param repositories - Repository declarations from `skaile.yaml` (used to\n * determine whether the source is a local path or a remote clone).\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns `true` when the asset was deployed successfully.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAsset(\n entry: CatalogEntry,\n repositories: Record<string, SourceDeclaration>,\n opts: DeployOptions = {},\n log: Log = noop,\n): boolean {\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n // Bundles are not deployed directly — their dependencies are.\n // MCP servers are configured in skaile.yaml, not deployed to driver target dirs.\n if (entry.kind === \"bundle\" || entry.kind === \"mcp-server\") return true;\n\n // Agents need framework-specific rendering via the enriched installAgent path\n if (entry.kind === \"agent\") {\n const workspaceRoot = cwd ?? process.cwd();\n const agentDeployDir = deployedBase(\n \"agent\" as AiComponent,\n driverTarget as DriverTarget,\n globalInstall,\n cwd,\n );\n const targetMap = DRIVER_TARGETS[driverTarget as DriverTarget];\n const skillsRelDir = targetMap?.local.skill ?? \"\";\n const wsConfig = resolveSkWorkspaceConfig(workspaceRoot);\n const name = basename(entry.source);\n const srcDir = DIRECTORY_MANIFESTS.has(name) ? dirname(entry.source) : entry.source;\n const result = installAgent(\n srcDir,\n agentDeployDir,\n workspaceRoot,\n driverTarget,\n skillsRelDir,\n entry.name,\n /* includeSubAgents */ true,\n new Set<string>(),\n wsConfig,\n log,\n );\n for (const w of result.warnings) log(` warn: ${w}`);\n if (result.created.length > 0) return true;\n // Fall through to raw deploy if renderer produces no files (unsupported framework, etc.)\n }\n\n const dest = deployedDir(entry.kind as AiComponent, entry.name, driverTarget, globalInstall, cwd);\n mkdirSync(dirname(dest), { recursive: true });\n\n // Determine if local or remote. Factory sources have a `path` (the bundled\n // dir under node_modules) but must be COPIED, not symlinked — the dir is\n // replaced on every package upgrade, so a symlink into it would dangle.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const isLocal = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (isLocal) {\n symlinkFromManifest(entry.source, dest);\n log(` symlink ${entry.kind}:${entry.name}`);\n return true;\n } else {\n copyFromManifest(entry.source, dest);\n log(` copy ${entry.kind}:${entry.name}`);\n return true;\n }\n}\n\n/**\n * Deploy all resolved assets, applying patches where configured.\n *\n * Already-deployed assets are skipped unless their deployed manifest content differs\n * from the source. This handles copies (remote repos) that have gone stale after a\n * source update. Symlinked (local) repos always resolve to the live source, so their\n * hashes always match and they are never needlessly re-linked.\n *\n * @param resolved - Catalog entries to deploy (output of `resolveAll`).\n * @param repositories - Repository declarations from `skaile.yaml`.\n * @param patches - Map of `kind:name` → patch file path for patch application.\n * @param opts - Deployment target options.\n * @param log - Optional logger callback for progress messages.\n * @returns Array of asset refs (`kind:name`) that were newly deployed in this call.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function deployAll(\n resolved: CatalogEntry[],\n repositories: Record<string, SourceDeclaration>,\n patches: Record<string, string>,\n opts: DeployOptions = {},\n log: Log = noop,\n): string[] {\n const deployed: string[] = [];\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n for (const entry of resolved) {\n // Skip non-deployable asset kinds — bundles are resolved to their contents,\n // mcp-servers are wired at session startup, and mixin kinds (persona, ruleset,\n // knowledge) are resolved by the mixin-resolver at session creation time.\n if (\n entry.kind === \"bundle\" ||\n entry.kind === \"mcp-server\" ||\n entry.kind === \"persona\" ||\n entry.kind === \"ruleset\" ||\n entry.kind === \"knowledge\"\n )\n continue;\n\n const ref = `${entry.kind}:${entry.name}`;\n\n if (isDeployed(entry.kind as AiComponent, entry.name, driverTarget, globalInstall, cwd)) {\n // Compare the deployed manifest file against the source to detect stale copies.\n // For symlinks the deployed path resolves through to the source file, so hashes\n // always match — symlinked installs are never needlessly re-linked.\n const dest = deployedDir(\n entry.kind as AiComponent,\n entry.name,\n driverTarget,\n globalInstall,\n cwd,\n );\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n try {\n const srcHash = computeHash(entry.source);\n const depHash = computeHash(deployedManifest);\n if (srcHash === depHash) {\n log(` already deployed: ${ref}`);\n continue;\n }\n log(` updating: ${ref} (content changed)`);\n // fall through to redeploy\n } catch {\n // Deployed manifest unreadable (e.g. agent rendered to a different path) — skip\n log(` already deployed: ${ref}`);\n continue;\n }\n }\n\n deployAsset(entry, repositories, opts, log);\n deployed.push(ref);\n\n // Apply patch if configured\n const patchFile = patches[ref];\n if (patchFile && existsSync(patchFile)) {\n const dest = deployedDir(\n entry.kind as AiComponent,\n entry.name,\n driverTarget,\n globalInstall,\n cwd,\n );\n if (applyPatch(dest, patchFile)) {\n log(` patched ${ref}`);\n } else {\n log(` patch failed for ${ref}`);\n }\n }\n }\n\n return deployed;\n}\n\n/**\n * Remove a deployed asset from the framework directory.\n *\n * Removes symlinks with `unlink`; removes copied directories with `rm -rf`.\n *\n * @param kind - Asset kind (`skill`, `agent`, `prompt`, `flow`, `contract`).\n * @param name - Asset name as registered in the catalog.\n * @param opts - Deployment target options (must match the options used at install time).\n * @returns `true` if the asset existed and was removed; `false` if it was not deployed.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function removeAsset(kind: string, name: string, opts: DeployOptions = {}): boolean {\n const driverTarget = opts.driverTarget ?? \"claude-code\";\n const globalInstall = opts.global ?? false;\n const cwd = opts.cwd;\n\n const dest = deployedDir(kind as AiComponent, name, driverTarget, globalInstall, cwd);\n try {\n const s = lstatSync(dest);\n if (s.isSymbolicLink()) unlinkSync(dest);\n else rmSync(dest, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\n// ── Scaffold ─────────────────────────────────────────────────────────────────\n\nconst SKILL_TEMPLATE = `---\nname: \"{name}\"\ndescription: \"\"\nmetadata:\n version: \"0.1.0\"\n---\n\n# {name}\n\nSkill prompt goes here.\n`;\n\nconst BUNDLE_TEMPLATE = `name: {name}\ndescription: A curated set of assets\nversion: 0.1.0\ndependencies:\n - skill:example-skill\n`;\n\nconst FLOW_TEMPLATE = `id: \"{name}\"\nversion: \"0.1.0\"\nname: \"{name}\"\ndescription: Flow description\n\nglobals:\n approval_mode: checkpoint\n\nnodes: []\n`;\n\n/**\n * Create a minimal scaffold directory for a new asset.\n *\n * Writes the appropriate manifest file (`SKILL.md`, `AGENT.md`, `CONTRACT.md`,\n * `<name>.bundle.yaml`, `<name>.flow.yaml`, or `<name>.prompt.md`) inside a\n * new `<destDir>/<name>/` directory.\n *\n * @param name - Asset name (also used as the directory name).\n * @param kind - Asset kind: `skill` | `agent` | `bundle` | `flow` | `prompt` | `contract`.\n * @param destDir - Parent directory to create the asset in.\n * @returns `{ ok: true, path }` on success, `{ ok: false, path: errorMessage }` if the\n * directory already exists.\n * @docLink packages/asset-manager/api-reference#installer\n */\nexport function createScaffold(\n name: string,\n kind: string,\n destDir: string,\n): { ok: boolean; path: string } {\n const dest = join(destDir, name);\n if (existsSync(dest)) {\n return { ok: false, path: `Directory '${name}' already exists in ${destDir}` };\n }\n mkdirSync(dest, { recursive: true });\n\n if (kind === \"bundle\") {\n writeFileSync(\n join(dest, `${name}.bundle.yaml`),\n BUNDLE_TEMPLATE.replace(/\\{name\\}/g, name),\n \"utf8\",\n );\n } else if (kind === \"flow\") {\n writeFileSync(\n join(dest, `${name}.flow.yaml`),\n FLOW_TEMPLATE.replace(/\\{name\\}/g, name),\n \"utf8\",\n );\n } else if (kind === \"prompt\") {\n writeFileSync(\n join(dest, `${name}.prompt.md`),\n SKILL_TEMPLATE.replace(/\\{name\\}/g, name),\n \"utf8\",\n );\n } else if (kind === \"agent\") {\n writeFileSync(join(dest, \"AGENT.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else if (kind === \"contract\") {\n writeFileSync(join(dest, \"CONTRACT.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n } else {\n // Default: skill\n writeFileSync(join(dest, \"SKILL.md\"), SKILL_TEMPLATE.replace(/\\{name\\}/g, name), \"utf8\");\n }\n\n return { ok: true, path: dest };\n}\n"]}