@skaile/workspaces 4.8.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/{asset-feeds-YDCXFTJ7.js → asset-feeds-23UCAOLX.js} +7 -7
  3. package/dist/{asset-feeds-YDCXFTJ7.js.map → asset-feeds-23UCAOLX.js.map} +1 -1
  4. package/dist/asset-manager/catalog-deployer.js +3 -3
  5. package/dist/asset-manager/index.js +6 -6
  6. package/dist/asset-manager/installer.js +4 -4
  7. package/dist/bridge/codex-app-server.js +4 -4
  8. package/dist/bridge/drivers/claude-sdk.js +5 -5
  9. package/dist/bridge/drivers/codex.js +6 -6
  10. package/dist/bridge/drivers/continue.js +6 -6
  11. package/dist/bridge/drivers/echo.js +1 -1
  12. package/dist/bridge/drivers/gemini.js +4 -4
  13. package/dist/bridge/drivers/goose.js +6 -6
  14. package/dist/bridge/drivers/omp.js +1 -1
  15. package/dist/bridge/drivers/opencode.js +6 -6
  16. package/dist/bridge/drivers/qwen.js +4 -4
  17. package/dist/bridge/index.js +6 -6
  18. package/dist/{chunk-TCANYRAF.js → chunk-2DGIAWKU.js} +185 -31
  19. package/dist/chunk-2DGIAWKU.js.map +1 -0
  20. package/dist/{chunk-VRBEMXEM.js → chunk-2LT4CWA5.js} +3 -3
  21. package/dist/{chunk-VRBEMXEM.js.map → chunk-2LT4CWA5.js.map} +1 -1
  22. package/dist/{chunk-J2NEKEZK.js → chunk-2PGVW3FL.js} +3 -3
  23. package/dist/{chunk-J2NEKEZK.js.map → chunk-2PGVW3FL.js.map} +1 -1
  24. package/dist/{chunk-GKP22MGV.js → chunk-5DHAVCKW.js} +2 -2
  25. package/dist/{chunk-GKP22MGV.js.map → chunk-5DHAVCKW.js.map} +1 -1
  26. package/dist/{chunk-Q5WGUPC5.js → chunk-5PF5OIQK.js} +3 -3
  27. package/dist/{chunk-Q5WGUPC5.js.map → chunk-5PF5OIQK.js.map} +1 -1
  28. package/dist/{chunk-BCXZ74DM.js → chunk-5WNQPXEG.js} +4 -4
  29. package/dist/{chunk-BCXZ74DM.js.map → chunk-5WNQPXEG.js.map} +1 -1
  30. package/dist/{chunk-GKX3QDPN.js → chunk-6BUJARLT.js} +3 -3
  31. package/dist/{chunk-GKX3QDPN.js.map → chunk-6BUJARLT.js.map} +1 -1
  32. package/dist/{chunk-TKHJXUG3.js → chunk-6J3L2CZ7.js} +4 -4
  33. package/dist/{chunk-TKHJXUG3.js.map → chunk-6J3L2CZ7.js.map} +1 -1
  34. package/dist/{chunk-NV6R6HJR.js → chunk-ERYOLF7V.js} +5 -5
  35. package/dist/{chunk-NV6R6HJR.js.map → chunk-ERYOLF7V.js.map} +1 -1
  36. package/dist/{chunk-DS7B54NF.js → chunk-F4PCBWPB.js} +3 -3
  37. package/dist/{chunk-DS7B54NF.js.map → chunk-F4PCBWPB.js.map} +1 -1
  38. package/dist/{chunk-IUVPPJ4T.js → chunk-FSRWPLIQ.js} +3 -3
  39. package/dist/{chunk-IUVPPJ4T.js.map → chunk-FSRWPLIQ.js.map} +1 -1
  40. package/dist/{chunk-U4LC6PLI.js → chunk-HA3XJN65.js} +3 -3
  41. package/dist/{chunk-U4LC6PLI.js.map → chunk-HA3XJN65.js.map} +1 -1
  42. package/dist/{chunk-HR2AGPLJ.js → chunk-HUF4ON2C.js} +4 -4
  43. package/dist/{chunk-HR2AGPLJ.js.map → chunk-HUF4ON2C.js.map} +1 -1
  44. package/dist/{chunk-IECSLI55.js → chunk-I7IWIVXY.js} +3 -3
  45. package/dist/{chunk-IECSLI55.js.map → chunk-I7IWIVXY.js.map} +1 -1
  46. package/dist/{chunk-UKFLK6V2.js → chunk-I7SQIWYX.js} +3 -3
  47. package/dist/{chunk-UKFLK6V2.js.map → chunk-I7SQIWYX.js.map} +1 -1
  48. package/dist/{chunk-RRX33TOZ.js → chunk-JBKXLCMG.js} +119 -14
  49. package/dist/chunk-JBKXLCMG.js.map +1 -0
  50. package/dist/{chunk-DYT3AQBM.js → chunk-JUZJUKWM.js} +3 -3
  51. package/dist/{chunk-DYT3AQBM.js.map → chunk-JUZJUKWM.js.map} +1 -1
  52. package/dist/{chunk-HKOC273F.js → chunk-P2G6XSJ3.js} +82 -8
  53. package/dist/chunk-P2G6XSJ3.js.map +1 -0
  54. package/dist/{chunk-DN2V47ER.js → chunk-PAYS6YCK.js} +9 -9
  55. package/dist/{chunk-DN2V47ER.js.map → chunk-PAYS6YCK.js.map} +1 -1
  56. package/dist/{chunk-NMSHQUBY.js → chunk-Q3AK4IQG.js} +5 -5
  57. package/dist/{chunk-NMSHQUBY.js.map → chunk-Q3AK4IQG.js.map} +1 -1
  58. package/dist/{chunk-EYH5ADRU.js → chunk-QJDVOKQO.js} +4 -4
  59. package/dist/{chunk-EYH5ADRU.js.map → chunk-QJDVOKQO.js.map} +1 -1
  60. package/dist/{chunk-AZSRDONR.js → chunk-SJYOKKYO.js} +3 -3
  61. package/dist/{chunk-AZSRDONR.js.map → chunk-SJYOKKYO.js.map} +1 -1
  62. package/dist/{chunk-74QHEAUT.js → chunk-T4IXZOG2.js} +6 -6
  63. package/dist/{chunk-74QHEAUT.js.map → chunk-T4IXZOG2.js.map} +1 -1
  64. package/dist/{chunk-FVYRWGUC.js → chunk-UJ5O5KQB.js} +7 -7
  65. package/dist/{chunk-FVYRWGUC.js.map → chunk-UJ5O5KQB.js.map} +1 -1
  66. package/dist/{chunk-SU5LVG6T.js → chunk-UM4LDXV5.js} +3 -3
  67. package/dist/{chunk-SU5LVG6T.js.map → chunk-UM4LDXV5.js.map} +1 -1
  68. package/dist/{chunk-2GCUBS2W.js → chunk-WLPL7CRM.js} +2 -2
  69. package/dist/{chunk-2GCUBS2W.js.map → chunk-WLPL7CRM.js.map} +1 -1
  70. package/dist/{chunk-5GYFYGVW.js → chunk-WQ5BCHQS.js} +2 -2
  71. package/dist/{chunk-5GYFYGVW.js.map → chunk-WQ5BCHQS.js.map} +1 -1
  72. package/dist/{chunk-2BLQJDYI.js → chunk-XHKM7OMR.js} +7 -7
  73. package/dist/{chunk-2BLQJDYI.js.map → chunk-XHKM7OMR.js.map} +1 -1
  74. package/dist/{chunk-4P352BUX.js → chunk-ZYAVNMKA.js} +5 -5
  75. package/dist/{chunk-4P352BUX.js.map → chunk-ZYAVNMKA.js.map} +1 -1
  76. package/dist/cli/index.js +49 -49
  77. package/dist/connectors/config.js +4 -4
  78. package/dist/connectors/index.js +9 -9
  79. package/dist/core/index.js +3 -3
  80. package/dist/core/runtime-assets.js +2 -2
  81. package/dist/core/src/index.d.ts +1 -1
  82. package/dist/core/src/index.d.ts.map +1 -1
  83. package/dist/core/src/workspace-config.d.ts +47 -3
  84. package/dist/core/src/workspace-config.d.ts.map +1 -1
  85. package/dist/core/workspace-config.js +1 -1
  86. package/dist/deploy/index.js +3 -3
  87. package/dist/{ensure-sources-65WPFIET.js → ensure-sources-AGDLO3RW.js} +9 -9
  88. package/dist/{ensure-sources-65WPFIET.js.map → ensure-sources-AGDLO3RW.js.map} +1 -1
  89. package/dist/factory-assets/connectors/box.js +9 -9
  90. package/dist/factory-assets/connectors/deploy.js +9 -9
  91. package/dist/factory-assets/connectors/devserver.js +9 -9
  92. package/dist/factory-assets/connectors/flow/adapter.js +9 -9
  93. package/dist/factory-assets/connectors/flow/engine.js +4 -4
  94. package/dist/factory-assets/connectors/flow/run-flow.js +10 -10
  95. package/dist/factory-assets/connectors/flow.js +9 -9
  96. package/dist/factory-assets/connectors/git/CONNECTOR.md +2 -1
  97. package/dist/factory-assets/connectors/git/driver.d.ts +25 -0
  98. package/dist/factory-assets/connectors/git/driver.d.ts.map +1 -1
  99. package/dist/factory-assets/connectors/git.js +9 -9
  100. package/dist/factory-assets/connectors/gmail.js +9 -9
  101. package/dist/factory-assets/connectors/googledrive.js +9 -9
  102. package/dist/factory-assets/connectors/local.js +9 -9
  103. package/dist/factory-assets/connectors/mattermost.js +9 -9
  104. package/dist/factory-assets/connectors/memory.js +9 -9
  105. package/dist/factory-assets/connectors/minio.js +9 -9
  106. package/dist/factory-assets/connectors/postgres.js +9 -9
  107. package/dist/factory-assets/connectors/s3.js +9 -9
  108. package/dist/factory-assets/connectors/sharepoint.js +9 -9
  109. package/dist/factory-assets/connectors/sqlite.js +9 -9
  110. package/dist/factory-assets/connectors/static-server.js +9 -9
  111. package/dist/factory-assets/connectors/tunnel.js +9 -9
  112. package/dist/factory-assets/connectors/webdav.js +9 -9
  113. package/dist/factory-assets/connectors/xstate-store.js +9 -9
  114. package/dist/factory-assets/connectors/xstate.js +9 -9
  115. package/dist/{flows-JRWDV3MG.js → flows-EO5CO3A3.js} +6 -6
  116. package/dist/{flows-JRWDV3MG.js.map → flows-EO5CO3A3.js.map} +1 -1
  117. package/dist/{helpers-3BHWBCBI.js → helpers-4H73P3WO.js} +9 -9
  118. package/dist/{helpers-3BHWBCBI.js.map → helpers-4H73P3WO.js.map} +1 -1
  119. package/dist/library/index.js +4 -4
  120. package/dist/library/install.js +3 -3
  121. package/dist/{library-publish-VKBT4JEX.js → library-publish-WTVCH5UI.js} +13 -13
  122. package/dist/{library-publish-VKBT4JEX.js.map → library-publish-WTVCH5UI.js.map} +1 -1
  123. package/dist/{open-library-PSLL6ULI.js → open-library-KS4IT4C7.js} +11 -11
  124. package/dist/{open-library-PSLL6ULI.js.map → open-library-KS4IT4C7.js.map} +1 -1
  125. package/dist/{paths-LH7LD4CC.js → paths-HWWTOYUY.js} +6 -6
  126. package/dist/{paths-LH7LD4CC.js.map → paths-HWWTOYUY.js.map} +1 -1
  127. package/dist/{plugin-store-A6VLQHCT.js → plugin-store-VJYXFXP5.js} +5 -5
  128. package/dist/{plugin-store-A6VLQHCT.js.map → plugin-store-VJYXFXP5.js.map} +1 -1
  129. package/dist/{project-KVTNJKED.js → project-DWCNGU56.js} +10 -10
  130. package/dist/{project-KVTNJKED.js.map → project-DWCNGU56.js.map} +1 -1
  131. package/dist/resolver/index.js +3 -3
  132. package/dist/runner/index.js +14 -14
  133. package/dist/runner/src/serve-credentials.d.ts +66 -0
  134. package/dist/runner/src/serve-credentials.d.ts.map +1 -1
  135. package/dist/runner/src/serve.d.ts.map +1 -1
  136. package/dist/runner/src/skill-staging.d.ts +17 -0
  137. package/dist/runner/src/skill-staging.d.ts.map +1 -1
  138. package/dist/sdk/asset-manager.js +6 -6
  139. package/dist/sdk/bridge.js +6 -6
  140. package/dist/sdk/core.js +3 -3
  141. package/dist/sdk/flow.js +4 -4
  142. package/dist/sdk/index.js +14 -14
  143. package/dist/sdk/resolver.js +3 -3
  144. package/dist/sdk/runner.js +14 -14
  145. package/dist/{setup-47UHZ7EG.js → setup-EPDRYWWI.js} +13 -13
  146. package/dist/{setup-47UHZ7EG.js.map → setup-EPDRYWWI.js.map} +1 -1
  147. package/dist/{skills-ZO66BL2Y.js → skills-DNCI6ITW.js} +5 -5
  148. package/dist/{skills-ZO66BL2Y.js.map → skills-DNCI6ITW.js.map} +1 -1
  149. package/dist/{source-5Q33HOPF.js → source-7TLL7GO7.js} +12 -12
  150. package/dist/{source-5Q33HOPF.js.map → source-7TLL7GO7.js.map} +1 -1
  151. package/dist/{source-manifest-publish-XHEAWRMG.js → source-manifest-publish-NX3JBMUT.js} +14 -14
  152. package/dist/{source-manifest-publish-XHEAWRMG.js.map → source-manifest-publish-NX3JBMUT.js.map} +1 -1
  153. package/dist/tui/index.js +14 -14
  154. package/dist/workspace-plugin/adapters/mcp.js +5 -5
  155. package/dist/workspace-plugin/adapters/omp.js +7 -7
  156. package/dist/workspace-plugin/index.js +1 -1
  157. package/package.json +1 -1
  158. package/dist/chunk-HKOC273F.js.map +0 -1
  159. package/dist/chunk-RRX33TOZ.js.map +0 -1
  160. package/dist/chunk-TCANYRAF.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { resolveFragments, loadPromptExtensions } from './chunk-CGYEHQOX.js';
2
- import { computeHash, applyPatch } from './chunk-BCXZ74DM.js';
2
+ import { computeHash, applyPatch } from './chunk-5WNQPXEG.js';
3
3
  import { deployedBase, deployedDir, isDeployed } from './chunk-F3HNW354.js';
4
- import { resolveSkWorkspaceConfig } from './chunk-HKOC273F.js';
4
+ import { resolveSkWorkspaceConfig } from './chunk-P2G6XSJ3.js';
5
5
  import { DRIVER_TARGETS } from './chunk-MENCWIHW.js';
6
6
  import { renderAgentToFramework } from './chunk-DKCFWSVW.js';
7
7
  import { existsSync, mkdirSync, lstatSync, unlinkSync, rmSync, writeFileSync, readFileSync, statSync, symlinkSync, cpSync } from 'fs';
@@ -415,5 +415,5 @@ function createScaffold(name, kind, destDir) {
415
415
  }
416
416
 
417
417
  export { createScaffold, deployAll, deployAsset, installAgent, removeAsset };
418
- //# sourceMappingURL=chunk-TKHJXUG3.js.map
419
- //# sourceMappingURL=chunk-TKHJXUG3.js.map
418
+ //# sourceMappingURL=chunk-6J3L2CZ7.js.map
419
+ //# sourceMappingURL=chunk-6J3L2CZ7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["parseYaml","basename","join","resolve","existsSync"],"mappings":"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","file":"chunk-TKHJXUG3.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 — copies assets into framework dirs by default (self-contained,\n * cache-safe, portable); `--link` opts into a symlink for the local-path dev loop.\n */\n\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n statSync,\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 // Source resolved to a directory itself (not a manifest file) — copy it whole;\n // a plain cpSync without `recursive` throws on a directory.\n if (statSync(manifestPath).isDirectory()) {\n cpSync(manifestPath, dest, { recursive: true });\n } else 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 (statSync(manifestPath).isDirectory()) {\n symlinkSync(resolve(manifestPath), dest);\n } else 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 * Opt into a symlink (the author dev-loop) instead of a copy — honoured only\n * when the source has a real local path. Machine-local / not for committing;\n * for store/factory sources (no stable local path) it is a no-op (still copy).\n */\n link?: boolean;\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Copies by default — self-contained, cache-safe, and portable, so a deployed\n * asset survives a `cache clean` of its source and a committed `.claude/` stays\n * machine-independent. `opts.link` opts into a symlink (the live dev-loop), but\n * only when the source has a real local path; store/factory sources (no stable\n * local path) ignore it and still copy. Agents are rendered via the enriched\n * `installAgent` path which resolves abilities, contracts, and framework\n * 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 // Symlink only on explicit opt-in AND when the source has a real local path.\n // Factory sources have a `path` (the bundled dir under node_modules, replaced\n // on every upgrade) but no stable dev-loop, so they always copy. Default copy\n // keeps deploys cache-safe and portable.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const hasLocalPath = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (opts.link === true && hasLocalPath) {\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 that have gone stale after a source update.\n * In copy mode (the default, `!opts.link`) an existing **symlink** dest is healed:\n * it is removed and re-deployed as a real copy, so an old/legacy symlink deploy is\n * silently upgraded. With `opts.link` an existing symlink is left alone.\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 // Heal: in copy mode an existing symlink dest is left to fall through to a\n // real copy below (cache-safe + portable) — bypass the hash skip entirely.\n // With --link a symlink dest is intentional, so it takes the normal skip path.\n let destIsSymlink = false;\n try {\n destIsSymlink = lstatSync(dest).isSymbolicLink();\n } catch {}\n const healSymlink = destIsSymlink && opts.link !== true;\n // Surface the one-time symlink→copy migration so an author who relied on a\n // live symlink dev-loop knows why edits stopped reflecting.\n if (healSymlink) log(` healed symlink → copy: ${ref} (use --link for the dev-loop)`);\n\n if (!healSymlink) {\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n // isDeployed() only lstats the dir, so a present-but-empty dir (manifest\n // file deleted) reads as deployed. A missing manifest must never count as\n // \"already deployed\" — fall through to re-deploy instead of skipping.\n // (existsSync follows symlinks, so for symlinked installs the manifest\n // resolves through to the live source and the hash check below still\n // skips them.)\n if (existsSync(deployedManifest)) {\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 }\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"]}
1
+ {"version":3,"sources":["../asset-manager/src/install-agent.ts","../asset-manager/src/installer.ts"],"names":["parseYaml","basename","join","resolve","existsSync"],"mappings":"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","file":"chunk-6J3L2CZ7.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 — copies assets into framework dirs by default (self-contained,\n * cache-safe, portable); `--link` opts into a symlink for the local-path dev loop.\n */\n\nimport {\n cpSync,\n existsSync,\n lstatSync,\n mkdirSync,\n rmSync,\n statSync,\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 // Source resolved to a directory itself (not a manifest file) — copy it whole;\n // a plain cpSync without `recursive` throws on a directory.\n if (statSync(manifestPath).isDirectory()) {\n cpSync(manifestPath, dest, { recursive: true });\n } else 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 (statSync(manifestPath).isDirectory()) {\n symlinkSync(resolve(manifestPath), dest);\n } else 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 * Opt into a symlink (the author dev-loop) instead of a copy — honoured only\n * when the source has a real local path. Machine-local / not for committing;\n * for store/factory sources (no stable local path) it is a no-op (still copy).\n */\n link?: boolean;\n}\n\n// ── Deploy / remove ──────────────────────────────────────────────────────────\n\n/**\n * Deploy a single asset to the framework-specific directory.\n *\n * Copies by default — self-contained, cache-safe, and portable, so a deployed\n * asset survives a `cache clean` of its source and a committed `.claude/` stays\n * machine-independent. `opts.link` opts into a symlink (the live dev-loop), but\n * only when the source has a real local path; store/factory sources (no stable\n * local path) ignore it and still copy. Agents are rendered via the enriched\n * `installAgent` path which resolves abilities, contracts, and framework\n * 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 // Symlink only on explicit opt-in AND when the source has a real local path.\n // Factory sources have a `path` (the bundled dir under node_modules, replaced\n // on every upgrade) but no stable dev-loop, so they always copy. Default copy\n // keeps deploys cache-safe and portable.\n const repoDecl = entry.publisher ? repositories[entry.publisher] : undefined;\n const hasLocalPath = repoDecl?.path != null && repoDecl.factory !== true;\n\n if (opts.link === true && hasLocalPath) {\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 that have gone stale after a source update.\n * In copy mode (the default, `!opts.link`) an existing **symlink** dest is healed:\n * it is removed and re-deployed as a real copy, so an old/legacy symlink deploy is\n * silently upgraded. With `opts.link` an existing symlink is left alone.\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 // Heal: in copy mode an existing symlink dest is left to fall through to a\n // real copy below (cache-safe + portable) — bypass the hash skip entirely.\n // With --link a symlink dest is intentional, so it takes the normal skip path.\n let destIsSymlink = false;\n try {\n destIsSymlink = lstatSync(dest).isSymbolicLink();\n } catch {}\n const healSymlink = destIsSymlink && opts.link !== true;\n // Surface the one-time symlink→copy migration so an author who relied on a\n // live symlink dev-loop knows why edits stopped reflecting.\n if (healSymlink) log(` healed symlink → copy: ${ref} (use --link for the dev-loop)`);\n\n if (!healSymlink) {\n const manifestName = basename(entry.source);\n const deployedManifest = join(dest, manifestName);\n // isDeployed() only lstats the dir, so a present-but-empty dir (manifest\n // file deleted) reads as deployed. A missing manifest must never count as\n // \"already deployed\" — fall through to re-deploy instead of skipping.\n // (existsSync follows symlinks, so for symlinked installs the manifest\n // resolves through to the live source and the hash check below still\n // skips them.)\n if (existsSync(deployedManifest)) {\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 }\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"]}
@@ -1,6 +1,6 @@
1
- import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-Q5WGUPC5.js';
2
- import { getStaticModels, fetchProviderModels } from './chunk-IUVPPJ4T.js';
3
- import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-5GYFYGVW.js';
1
+ import { SubprocessCliDriver, extractText, extractCost, extractTokens, resolveEnvDriverSession, bindSingleProviderEntry, resolveRegistryBinding } from './chunk-5PF5OIQK.js';
2
+ import { getStaticModels, fetchProviderModels } from './chunk-FSRWPLIQ.js';
3
+ import { getProviderPreset, BUILTIN_DRIVER_CATALOG, getBridgeLogger, entryCredentialValue, registryDriverConfig } from './chunk-WQ5BCHQS.js';
4
4
  import * as z from 'zod';
5
5
 
6
6
  var GOOGLE_DEFAULT_BASE_URL = getProviderPreset("google")?.base_url;
@@ -183,5 +183,5 @@ var geminiDriverTarget = {
183
183
  };
184
184
 
185
185
  export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget };
186
- //# sourceMappingURL=chunk-NV6R6HJR.js.map
187
- //# sourceMappingURL=chunk-NV6R6HJR.js.map
186
+ //# sourceMappingURL=chunk-ERYOLF7V.js.map
187
+ //# sourceMappingURL=chunk-ERYOLF7V.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-NV6R6HJR.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
1
+ {"version":3,"sources":["../bridge/src/drivers/gemini.ts"],"names":[],"mappings":"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","file":"chunk-ERYOLF7V.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport { fetchProviderModels, getStaticModels, type ModelEntry } from \"../models.js\";\nimport { getProviderPreset } from \"../provider-catalog.js\";\nimport { entryCredentialValue } from \"../provider-materialize/credential-env.js\";\nimport {\n bindSingleProviderEntry,\n type EnvDriverSession,\n type RegistryModelBinding,\n resolveEnvDriverSession,\n resolveRegistryBinding,\n} from \"../provider-materialize/env-drivers.js\";\nimport { registryDriverConfig } from \"../provider-registry-derive.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport { extractCost, extractText, extractTokens, SubprocessCliDriver } from \"./_subprocess-cli.js\";\n\n/**\n * The Gemini API host the CLI talks to unless told otherwise — the catalog's\n * `google` preset, so the two can never drift apart.\n */\nconst GOOGLE_DEFAULT_BASE_URL = getProviderPreset(\"google\")?.base_url;\n\n/**\n * Shared base for the Gemini-CLI event family. Gemini CLI and Qwen Code (a fork\n * of Gemini CLI) emit the same `stream-json` event shape, so both dispatch the\n * same {@link handleJson}: `init`/`system` → session capture, `message`/\n * `assistant` → streamed assistant text, `tool_use` / `tool_result` → tool\n * events, `result` → tokens + cost.\n *\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport abstract class GeminiFamilyDriver extends SubprocessCliDriver {\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"system\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true || json.finished === true) {\n this.pushAssistantEnd(text);\n } else {\n this.pushAssistantDelta(text);\n }\n break;\n }\n\n case \"tool_use\":\n case \"tool_call\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.isError ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n // ── Registry binding ──────────────────────────────────────────────────────\n\n private providers?: EnvDriverSession;\n private boundEntry?: RegistryModelBinding;\n private bindingResolved = false;\n\n /** This session's AI providers, resolved once from the config. */\n protected providerSession(): EnvDriverSession {\n this.providers ??= resolveEnvDriverSession(this.config);\n return this.providers;\n }\n\n /**\n * The AI provider entry this session's model selector names, memoized until\n * the model changes.\n *\n * Gemini CLI and Qwen Code are `single`-plurality backends (§2.3): they\n * address one endpoint, so the bound entry supplies both the credential and\n * the base URL. Resolving through {@link bindSingleProviderEntry} is what\n * puts the surface check — which throws — on the start path.\n */\n protected registryBinding(): RegistryModelBinding | undefined {\n if (this.bindingResolved) return this.boundEntry;\n const binding = bindSingleProviderEntry(\n this.driverInfo.id,\n this.productName,\n this.providerSession(),\n );\n for (const warning of binding?.warnings ?? []) this.log.warn(warning);\n this.boundEntry = binding;\n this.bindingResolved = true;\n return binding;\n }\n\n /**\n * Fail before the first spawn when the bound entry speaks a surface this\n * backend cannot — the error names the surface.\n */\n override async start(): Promise<void> {\n this.registryBinding();\n await super.start();\n }\n\n override reconfigure(patch: Partial<Pick<AgentConfig, \"model\" | \"thinking\" | \"effort\">>): void {\n super.reconfigure(patch);\n if (patch.model !== undefined) {\n this.providers = undefined;\n this.bindingResolved = false;\n }\n }\n\n /** The provider-side model id the backend is actually run with. */\n override getModel(): string | undefined {\n return resolveRegistryBinding(this.providerSession())?.providerModelId ?? this.config.model;\n }\n}\n\n/**\n * Agent driver for the Google **Gemini CLI** (`gemini`).\n *\n * Spawns `gemini -p \"<prompt>\" --output-format stream-json` per turn and maps\n * the stream-json events to the unified {@link AgentEvent} stream. Google\n * models only (`surface: google-generative-ai`): the AI provider entry the\n * session's model selector names supplies `GEMINI_API_KEY`, the `-m` model id\n * and — for a non-default endpoint — `GOOGLE_GEMINI_BASE_URL`.\n *\n * @remarks\n * - **Requires Gemini CLI ≥ v0.6.1** — earlier versions reject\n * `--output-format`. A too-old CLI surfaces as a `process`-category exit error.\n * - **Session resume is not available in headless (`-p`) mode** — the CLI errors\n * if asked to resume non-interactively, so this driver runs single-turn per\n * process and logs a warning when a resume id is present.\n * - Exit codes: `42` → input/validation error, `53` → turn-limit (treated as a\n * completed turn).\n *\n * @see https://github.com/google-gemini/gemini-cli\n * @docLink packages/bridge/drivers#gemini-driver\n */\nexport class GeminiDriver extends GeminiFamilyDriver {\n readonly driverInfo: DriverInfo = {\n id: \"gemini\",\n name: \"Gemini CLI\",\n modelAgnostic: false,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"gemini\");\n protected readonly defaultBin = \"gemini\";\n protected readonly productName = \"Gemini CLI\";\n protected readonly envPrefix = \"GEMINI\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n if (resumeId) {\n this.log.warn(\"Gemini CLI cannot resume in headless mode; starting a fresh turn\", {\n resumeId,\n });\n }\n const args = [\"-p\", message, \"--output-format\", \"stream-json\"];\n const model = this.registryBinding()?.providerModelId ?? this.config.model;\n if (model) args.push(\"-m\", model);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\", \"GOOGLE_GEMINI_BASE_URL\"]);\n const binding = this.registryBinding();\n if (!binding) return env;\n\n // The entry is the authority: inherited Google carriers are dropped so an\n // ambient key cannot authenticate a session pointed somewhere else.\n delete env.GEMINI_API_KEY;\n delete env.GOOGLE_API_KEY;\n delete env.GOOGLE_GEMINI_BASE_URL;\n const key = entryCredentialValue(binding.providerId, binding.entry, {\n env: this.providerSession().lookupEnv,\n });\n if (key) env.GEMINI_API_KEY = key;\n // Only a non-default endpoint is worth naming: Gemini CLI reads\n // GOOGLE_GEMINI_BASE_URL as an override of its own default host.\n if (binding.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL) {\n env.GOOGLE_GEMINI_BASE_URL = binding.baseUrl;\n }\n return env;\n }\n\n protected installHint(): string {\n return \"Gemini CLI is not installed or not on your PATH. Install it with `npm i -g @google/gemini-cli` (≥ v0.6.1).\";\n }\n\n protected override classifyExit(code: number | null, signal: NodeJS.Signals | null) {\n if (code === 42) {\n return {\n message: \"Gemini CLI reported an input error (exit 42)\",\n category: \"validation\" as const,\n retryable: false,\n hint: \"The prompt or flags were rejected by Gemini CLI. Check the model name and arguments.\",\n };\n }\n if (code === 53) return null; // turn-limit — the result was already emitted.\n return super.classifyExit(code, signal);\n }\n\n /**\n * Discovery runs against the bound entry: its credential and, for a\n * non-default endpoint, its base URL. Without an entry the ambient\n * `GEMINI_API_KEY` is the last resort, and an unreachable API falls back to\n * the static Google catalog.\n */\n override async listModels(): Promise<ModelEntry[]> {\n const session = this.providerSession();\n const binding = resolveRegistryBinding(session);\n const key = binding\n ? entryCredentialValue(binding.providerId, binding.entry, { env: session.lookupEnv })\n : session.lookupEnv.GEMINI_API_KEY;\n if (!key) return getStaticModels(\"google\");\n const result = await fetchProviderModels(\n \"google\",\n key,\n binding?.baseUrl && binding.baseUrl !== GOOGLE_DEFAULT_BASE_URL\n ? { baseUrl: binding.baseUrl }\n : {},\n );\n return result.ok && result.models.length > 0 ? result.models : getStaticModels(\"google\");\n }\n}\n\n/**\n * `DriverTarget` wrapper for the gemini driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const geminiDriverTarget: DriverTarget<AgentConfig> = {\n id: \"gemini\",\n displayName: BUILTIN_DRIVER_CATALOG.gemini?.name ?? \"Gemini CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GeminiDriver(config),\n listModels: async (registry, options) =>\n new GeminiDriver({\n cwd: process.cwd(),\n sessionId: \"model-list\",\n ...registryDriverConfig(registry, options),\n }).listModels(),\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { factoryAssetRoots } from './chunk-SU5LVG6T.js';
1
+ import { factoryAssetRoots } from './chunk-UM4LDXV5.js';
2
2
  import fs from 'fs';
3
3
  import os from 'os';
4
4
  import path from 'path';
@@ -19,5 +19,5 @@ var MONOREPO_ROOT = findMonorepoRoot(__ownDir);
19
19
  var AI_RESOURCES = factoryAssetRoots()[0] ?? path.join(os.homedir(), ".skaile", "libraries");
20
20
 
21
21
  export { AI_RESOURCES, MONOREPO_ROOT };
22
- //# sourceMappingURL=chunk-DS7B54NF.js.map
23
- //# sourceMappingURL=chunk-DS7B54NF.js.map
22
+ //# sourceMappingURL=chunk-F4PCBWPB.js.map
23
+ //# sourceMappingURL=chunk-F4PCBWPB.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../cli/src/paths.ts"],"names":[],"mappings":";;;;;;AAgBA,IAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAW5D,SAAS,iBAAiB,IAAA,EAA6B;AACrD,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,YAAY,CAAC,GAAG,OAAO,GAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,aAAA,GAA+B,iBAAiB,QAAQ;AAc9D,IAAM,YAAA,GACX,iBAAA,EAAkB,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,WAAW","file":"chunk-DS7B54NF.js","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { factoryAssetRoots } from \"@skaile/workspaces/core\";\n\n/**\n * The content-root policy lives in `@skaile/workspaces/core` so the flow\n * connector's resolution surfaces can reach it too — `factory-assets → cli`\n * would be a module cycle. Re-exported here because this module is the CLI's\n * documented path surface and every CLI caller imports it from here.\n *\n * @docLink cli/dev-guide#paths\n */\nexport { aiResourceRoots } from \"@skaile/workspaces/core\";\n\nconst __ownDir = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Walk up from `from` looking for the monorepo marker (`biome.json`, the\n * repo-root shared tooling config). Returns the matching directory or `null`\n * when none is found within eight levels — the latter is the typical case when\n * `@skaile/workspaces` has been installed via `npm i` without a skaile-dev\n * workspace context. Used only to gate dev-only commands (e.g.\n * `serve --compile-test`); first-party content is located via\n * {@link aiResourceRoots}, not this.\n */\nfunction findMonorepoRoot(from: string): string | null {\n let dir = from;\n for (let i = 0; i < 8; i++) {\n if (fs.existsSync(path.join(dir, \"biome.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Absolute path to the monorepo root, or `null` when the CLI is running\n * outside the skaile-dev workspace (typical for `npm i -g` installs).\n *\n * Consumers that only make sense inside the workspace (e.g.\n * `skaile serve --compile-test`) MUST check for `null` and report a\n * \"monorepo-only feature\" error before proceeding.\n *\n * @docLink cli/dev-guide#paths\n */\nexport const MONOREPO_ROOT: string | null = findMonorepoRoot(__ownDir);\n\n/**\n * Default content root used by path display and the `validate` command.\n *\n * The primary first-party `factory-assets/` root resolved through the shared\n * `factoryAssetRoots()` helper — the `SKAILE_FACTORY_ASSETS_DIR` override when\n * set, else the in-repo source during dev / bundled `dist/factory-assets/` after\n * `npm i`. Falls back to `~/.skaile/libraries/` — the user-library directory\n * managed by `skaile library add` — when the package cannot be located.\n * Consumers `fs.existsSync` first and degrade to \"no skills / flows discovered\".\n *\n * @docLink cli/dev-guide#paths\n */\nexport const AI_RESOURCES: string =\n factoryAssetRoots()[0] ?? path.join(os.homedir(), \".skaile\", \"libraries\");\n"]}
1
+ {"version":3,"sources":["../cli/src/paths.ts"],"names":[],"mappings":";;;;;;AAgBA,IAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAW5D,SAAS,iBAAiB,IAAA,EAA6B;AACrD,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,EAAA,CAAG,WAAW,IAAA,CAAK,IAAA,CAAK,KAAK,YAAY,CAAC,GAAG,OAAO,GAAA;AACxD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,IAAA;AACT;AAYO,IAAM,aAAA,GAA+B,iBAAiB,QAAQ;AAc9D,IAAM,YAAA,GACX,iBAAA,EAAkB,CAAE,CAAC,CAAA,IAAK,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,OAAA,EAAQ,EAAG,SAAA,EAAW,WAAW","file":"chunk-F4PCBWPB.js","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { factoryAssetRoots } from \"@skaile/workspaces/core\";\n\n/**\n * The content-root policy lives in `@skaile/workspaces/core` so the flow\n * connector's resolution surfaces can reach it too — `factory-assets → cli`\n * would be a module cycle. Re-exported here because this module is the CLI's\n * documented path surface and every CLI caller imports it from here.\n *\n * @docLink cli/dev-guide#paths\n */\nexport { aiResourceRoots } from \"@skaile/workspaces/core\";\n\nconst __ownDir = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Walk up from `from` looking for the monorepo marker (`biome.json`, the\n * repo-root shared tooling config). Returns the matching directory or `null`\n * when none is found within eight levels — the latter is the typical case when\n * `@skaile/workspaces` has been installed via `npm i` without a skaile-dev\n * workspace context. Used only to gate dev-only commands (e.g.\n * `serve --compile-test`); first-party content is located via\n * {@link aiResourceRoots}, not this.\n */\nfunction findMonorepoRoot(from: string): string | null {\n let dir = from;\n for (let i = 0; i < 8; i++) {\n if (fs.existsSync(path.join(dir, \"biome.json\"))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\n\n/**\n * Absolute path to the monorepo root, or `null` when the CLI is running\n * outside the skaile-dev workspace (typical for `npm i -g` installs).\n *\n * Consumers that only make sense inside the workspace (e.g.\n * `skaile serve --compile-test`) MUST check for `null` and report a\n * \"monorepo-only feature\" error before proceeding.\n *\n * @docLink cli/dev-guide#paths\n */\nexport const MONOREPO_ROOT: string | null = findMonorepoRoot(__ownDir);\n\n/**\n * Default content root used by path display and the `validate` command.\n *\n * The primary first-party `factory-assets/` root resolved through the shared\n * `factoryAssetRoots()` helper — the `SKAILE_FACTORY_ASSETS_DIR` override when\n * set, else the in-repo source during dev / bundled `dist/factory-assets/` after\n * `npm i`. Falls back to `~/.skaile/libraries/` — the user-library directory\n * managed by `skaile library add` — when the package cannot be located.\n * Consumers `fs.existsSync` first and degrade to \"no skills / flows discovered\".\n *\n * @docLink cli/dev-guide#paths\n */\nexport const AI_RESOURCES: string =\n factoryAssetRoots()[0] ?? path.join(os.homedir(), \".skaile\", \"libraries\");\n"]}
@@ -1,4 +1,4 @@
1
- import { getProviderPreset, resolvePresetBaseUrl, expandPreset, resolveProbeUrl, buildCredentialHeaders, presetBaseUrl } from './chunk-5GYFYGVW.js';
1
+ import { getProviderPreset, resolvePresetBaseUrl, expandPreset, resolveProbeUrl, buildCredentialHeaders, presetBaseUrl } from './chunk-WQ5BCHQS.js';
2
2
  import { resolveEntryBaseUrl, entryTransport, parseModelRef, registryEntries } from './chunk-ILG4BXYE.js';
3
3
  import { modelIdSchemaForTarget } from './chunk-N7B3LZ7V.js';
4
4
 
@@ -323,5 +323,5 @@ function resolveModelTier(tier, sessionModel, options = {}) {
323
323
  }
324
324
 
325
325
  export { ModelTierResolutionError, PROVIDER_MODEL_TIERS, STATIC_MODELS, fetchProviderModels, getModels, getStaticModels, modelIdTargetForEntry, resolveManifestModel, resolveModelCapabilities, resolveModelTier };
326
- //# sourceMappingURL=chunk-IUVPPJ4T.js.map
327
- //# sourceMappingURL=chunk-IUVPPJ4T.js.map
326
+ //# sourceMappingURL=chunk-FSRWPLIQ.js.map
327
+ //# sourceMappingURL=chunk-FSRWPLIQ.js.map