@skaile/workspaces 0.20.0 → 0.22.0-beta.0

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 (212) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/{asset-feeds-JSHWTTJC.js → asset-feeds-PJDJ3QYI.js} +11 -11
  3. package/dist/{asset-feeds-JSHWTTJC.js.map → asset-feeds-PJDJ3QYI.js.map} +1 -1
  4. package/dist/asset-manager/index.js +9 -9
  5. package/dist/asset-manager/installer.js +8 -8
  6. package/dist/base-assets/connectors/deploy.js +10 -9
  7. package/dist/base-assets/connectors/devserver.js +10 -9
  8. package/dist/base-assets/connectors/flow/adapter.js +10 -9
  9. package/dist/base-assets/connectors/flow/run-flow.js +11 -10
  10. package/dist/base-assets/connectors/flow.js +10 -9
  11. package/dist/base-assets/connectors/git.js +10 -9
  12. package/dist/base-assets/connectors/gmail.js +10 -9
  13. package/dist/base-assets/connectors/googledrive.js +10 -9
  14. package/dist/base-assets/connectors/local.js +10 -9
  15. package/dist/base-assets/connectors/mattermost.js +10 -9
  16. package/dist/base-assets/connectors/memory.js +10 -9
  17. package/dist/base-assets/connectors/minio.js +10 -9
  18. package/dist/base-assets/connectors/postgres.js +10 -9
  19. package/dist/base-assets/connectors/s3.js +10 -9
  20. package/dist/base-assets/connectors/sharepoint.js +10 -9
  21. package/dist/base-assets/connectors/sqlite.js +10 -9
  22. package/dist/base-assets/connectors/static-server.js +10 -9
  23. package/dist/base-assets/connectors/tunnel.js +10 -9
  24. package/dist/base-assets/connectors/webdav.js +10 -9
  25. package/dist/base-assets/connectors/xstate-store.js +10 -9
  26. package/dist/base-assets/connectors/xstate.js +10 -9
  27. package/dist/bridge/drivers/claude-sdk.js +13 -3
  28. package/dist/bridge/drivers/claude-sdk.js.map +1 -1
  29. package/dist/bridge/drivers/codex.js +13 -3
  30. package/dist/bridge/drivers/codex.js.map +1 -1
  31. package/dist/bridge/drivers/echo.js +13 -4
  32. package/dist/bridge/drivers/echo.js.map +1 -1
  33. package/dist/bridge/drivers/omp.js +13 -3
  34. package/dist/bridge/drivers/omp.js.map +1 -1
  35. package/dist/bridge/index.js +3 -2
  36. package/dist/bridge/src/drivers/claude-sdk.d.ts +7 -0
  37. package/dist/bridge/src/drivers/claude-sdk.d.ts.map +1 -1
  38. package/dist/bridge/src/drivers/codex.d.ts +7 -0
  39. package/dist/bridge/src/drivers/codex.d.ts.map +1 -1
  40. package/dist/bridge/src/drivers/echo.d.ts +6 -0
  41. package/dist/bridge/src/drivers/echo.d.ts.map +1 -1
  42. package/dist/bridge/src/drivers/omp.d.ts +6 -0
  43. package/dist/bridge/src/drivers/omp.d.ts.map +1 -1
  44. package/dist/bridge/src/registry.d.ts +32 -34
  45. package/dist/bridge/src/registry.d.ts.map +1 -1
  46. package/dist/{chunk-4YG2AAFV.js → chunk-2DNSSQ22.js} +7 -7
  47. package/dist/{chunk-4YG2AAFV.js.map → chunk-2DNSSQ22.js.map} +1 -1
  48. package/dist/{chunk-ZWIG55ZX.js → chunk-2XY6732A.js} +3 -3
  49. package/dist/{chunk-ZWIG55ZX.js.map → chunk-2XY6732A.js.map} +1 -1
  50. package/dist/{chunk-2DKWQLFS.js → chunk-CSDQBWE6.js} +5 -5
  51. package/dist/{chunk-2DKWQLFS.js.map → chunk-CSDQBWE6.js.map} +1 -1
  52. package/dist/{chunk-KYYMP5PT.js → chunk-F3MGZ5E6.js} +3 -3
  53. package/dist/{chunk-KYYMP5PT.js.map → chunk-F3MGZ5E6.js.map} +1 -1
  54. package/dist/{chunk-IQYWI5OG.js → chunk-G6GKWGOW.js} +114 -619
  55. package/dist/chunk-G6GKWGOW.js.map +1 -0
  56. package/dist/{chunk-LMDRMZ4F.js → chunk-GKM6MDUC.js} +3 -3
  57. package/dist/{chunk-LMDRMZ4F.js.map → chunk-GKM6MDUC.js.map} +1 -1
  58. package/dist/{chunk-4ACWI5YT.js → chunk-IGQEXBBG.js} +44 -36
  59. package/dist/chunk-IGQEXBBG.js.map +1 -0
  60. package/dist/{chunk-BZGDESAG.js → chunk-J2FCO6TM.js} +2 -2
  61. package/dist/{chunk-BZGDESAG.js.map → chunk-J2FCO6TM.js.map} +1 -1
  62. package/dist/{chunk-BSY56QS7.js → chunk-KA46DUM4.js} +3 -3
  63. package/dist/{chunk-BSY56QS7.js.map → chunk-KA46DUM4.js.map} +1 -1
  64. package/dist/{chunk-RCPFXP3Y.js → chunk-MO4JPTRD.js} +4 -4
  65. package/dist/{chunk-RCPFXP3Y.js.map → chunk-MO4JPTRD.js.map} +1 -1
  66. package/dist/{chunk-FNP4OGGY.js → chunk-NGC7ZQI4.js} +10 -10
  67. package/dist/{chunk-FNP4OGGY.js.map → chunk-NGC7ZQI4.js.map} +1 -1
  68. package/dist/{chunk-2ACJB6JF.js → chunk-RENHNO4J.js} +81 -4
  69. package/dist/chunk-RENHNO4J.js.map +1 -0
  70. package/dist/{chunk-4S4TZDCD.js → chunk-SL6JVGRD.js} +3 -3
  71. package/dist/{chunk-4S4TZDCD.js.map → chunk-SL6JVGRD.js.map} +1 -1
  72. package/dist/{chunk-VVS7MACX.js → chunk-TKOLD2O7.js} +213 -20
  73. package/dist/chunk-TKOLD2O7.js.map +1 -0
  74. package/dist/{chunk-R4FRSB47.js → chunk-TTY56FQQ.js} +4 -4
  75. package/dist/{chunk-R4FRSB47.js.map → chunk-TTY56FQQ.js.map} +1 -1
  76. package/dist/chunk-UZRY5UI2.js +96 -0
  77. package/dist/chunk-UZRY5UI2.js.map +1 -0
  78. package/dist/{chunk-NCUTHLRV.js → chunk-UZVHJ7LX.js} +4 -4
  79. package/dist/{chunk-NCUTHLRV.js.map → chunk-UZVHJ7LX.js.map} +1 -1
  80. package/dist/{chunk-FRPKLIEZ.js → chunk-WIR34WMU.js} +3 -3
  81. package/dist/{chunk-FRPKLIEZ.js.map → chunk-WIR34WMU.js.map} +1 -1
  82. package/dist/{chunk-37JKX6D7.js → chunk-X5Y4EGZB.js} +2 -2
  83. package/dist/{chunk-37JKX6D7.js.map → chunk-X5Y4EGZB.js.map} +1 -1
  84. package/dist/{chunk-S2OVTCAL.js → chunk-XHFMUGDD.js} +3 -3
  85. package/dist/{chunk-S2OVTCAL.js.map → chunk-XHFMUGDD.js.map} +1 -1
  86. package/dist/cli/index.js +701 -413
  87. package/dist/cli/index.js.map +1 -1
  88. package/dist/cli/src/commands/deploy.d.ts +24 -0
  89. package/dist/cli/src/commands/deploy.d.ts.map +1 -0
  90. package/dist/cli/src/commands/integration.d.ts +19 -0
  91. package/dist/cli/src/commands/integration.d.ts.map +1 -0
  92. package/dist/cli/src/commands/plugin-registry-cmd.d.ts +22 -0
  93. package/dist/cli/src/commands/plugin-registry-cmd.d.ts.map +1 -0
  94. package/dist/cli/src/commands/serve.d.ts.map +1 -1
  95. package/dist/cli/src/plugin-store/index.d.ts +37 -0
  96. package/dist/cli/src/plugin-store/index.d.ts.map +1 -0
  97. package/dist/cli/src/plugin-store/load.d.ts +35 -0
  98. package/dist/cli/src/plugin-store/load.d.ts.map +1 -0
  99. package/dist/cli/src/plugin-store/paths.d.ts +23 -0
  100. package/dist/cli/src/plugin-store/paths.d.ts.map +1 -0
  101. package/dist/cli/src/plugin-store/reconcile.d.ts +50 -0
  102. package/dist/cli/src/plugin-store/reconcile.d.ts.map +1 -0
  103. package/dist/cli/src/plugin-store/spec.d.ts +25 -0
  104. package/dist/cli/src/plugin-store/spec.d.ts.map +1 -0
  105. package/dist/connectors/config.js +8 -8
  106. package/dist/connectors/index.js +10 -9
  107. package/dist/connectors/src/connector-manager.d.ts.map +1 -1
  108. package/dist/connectors/src/connector-registry.d.ts +42 -22
  109. package/dist/connectors/src/connector-registry.d.ts.map +1 -1
  110. package/dist/connectors/src/index.d.ts +2 -3
  111. package/dist/connectors/src/index.d.ts.map +1 -1
  112. package/dist/connectors-shared/index.js +8 -0
  113. package/dist/connectors-shared/index.js.map +1 -0
  114. package/dist/connectors-shared/src/index.d.ts +11 -0
  115. package/dist/connectors-shared/src/index.d.ts.map +1 -0
  116. package/dist/connectors-shared/src/schemas.d.ts +10 -0
  117. package/dist/connectors-shared/src/schemas.d.ts.map +1 -0
  118. package/dist/connectors-shared/src/types.d.ts +11 -0
  119. package/dist/connectors-shared/src/types.d.ts.map +1 -0
  120. package/dist/core/index.js +7 -7
  121. package/dist/core/manifest.js +2 -2
  122. package/dist/core/models.js +1 -1
  123. package/dist/core/runtime-assets.js +4 -4
  124. package/dist/core/src/index.d.ts +4 -4
  125. package/dist/core/src/index.d.ts.map +1 -1
  126. package/dist/core/src/lock.d.ts +20 -1
  127. package/dist/core/src/lock.d.ts.map +1 -1
  128. package/dist/core/src/models.d.ts +13 -0
  129. package/dist/core/src/models.d.ts.map +1 -1
  130. package/dist/core/src/workspace-config.d.ts +68 -3
  131. package/dist/core/src/workspace-config.d.ts.map +1 -1
  132. package/dist/core/src/workspace-yaml-editor.d.ts +20 -0
  133. package/dist/core/src/workspace-yaml-editor.d.ts.map +1 -1
  134. package/dist/core/workspace-config.js +3 -3
  135. package/dist/deploy/index.js +454 -0
  136. package/dist/deploy/index.js.map +1 -0
  137. package/dist/deploy/src/handle-store.d.ts +22 -0
  138. package/dist/deploy/src/handle-store.d.ts.map +1 -0
  139. package/dist/deploy/src/index.d.ts +21 -0
  140. package/dist/deploy/src/index.d.ts.map +1 -0
  141. package/dist/deploy/src/targets/container-runtime.d.ts +38 -0
  142. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -0
  143. package/dist/deploy/src/targets/docker.d.ts +18 -0
  144. package/dist/deploy/src/targets/docker.d.ts.map +1 -0
  145. package/dist/deploy/src/targets/local.d.ts +30 -0
  146. package/dist/deploy/src/targets/local.d.ts.map +1 -0
  147. package/dist/deploy/src/targets/podman.d.ts +18 -0
  148. package/dist/deploy/src/targets/podman.d.ts.map +1 -0
  149. package/dist/deploy/src/targets/port.d.ts +10 -0
  150. package/dist/deploy/src/targets/port.d.ts.map +1 -0
  151. package/dist/deploy/src/targets/stream-lines.d.ts +44 -0
  152. package/dist/deploy/src/targets/stream-lines.d.ts.map +1 -0
  153. package/dist/discovery/index.js +3 -3
  154. package/dist/{ensure-sources-LRT3TIWI.js → ensure-sources-COGVKY44.js} +11 -11
  155. package/dist/{ensure-sources-LRT3TIWI.js.map → ensure-sources-COGVKY44.js.map} +1 -1
  156. package/dist/{flows-6BNO4GKK.js → flows-DYFTPCPM.js} +4 -4
  157. package/dist/{flows-6BNO4GKK.js.map → flows-DYFTPCPM.js.map} +1 -1
  158. package/dist/library/index.js +4 -4
  159. package/dist/open-library-DWAQFUSQ.js +13 -0
  160. package/dist/{open-library-IOYWFK7M.js.map → open-library-DWAQFUSQ.js.map} +1 -1
  161. package/dist/plugin-registry/index.js +4 -0
  162. package/dist/plugin-registry/index.js.map +1 -0
  163. package/dist/plugin-registry/src/context.d.ts +29 -0
  164. package/dist/plugin-registry/src/context.d.ts.map +1 -0
  165. package/dist/plugin-registry/src/deploy-handle.d.ts +60 -0
  166. package/dist/plugin-registry/src/deploy-handle.d.ts.map +1 -0
  167. package/dist/plugin-registry/src/errors.d.ts +23 -0
  168. package/dist/plugin-registry/src/errors.d.ts.map +1 -0
  169. package/dist/plugin-registry/src/index.d.ts +16 -0
  170. package/dist/plugin-registry/src/index.d.ts.map +1 -0
  171. package/dist/plugin-registry/src/internal.d.ts +13 -0
  172. package/dist/plugin-registry/src/internal.d.ts.map +1 -0
  173. package/dist/plugin-registry/src/registry.d.ts +25 -0
  174. package/dist/plugin-registry/src/registry.d.ts.map +1 -0
  175. package/dist/plugin-registry/src/targets.d.ts +42 -0
  176. package/dist/plugin-registry/src/targets.d.ts.map +1 -0
  177. package/dist/plugin-store-6OENKNFW.js +144 -0
  178. package/dist/plugin-store-6OENKNFW.js.map +1 -0
  179. package/dist/runner/index.js +14 -13
  180. package/dist/sdk/asset-manager.js +9 -9
  181. package/dist/sdk/bridge.js +3 -2
  182. package/dist/sdk/core.js +7 -7
  183. package/dist/sdk/index.js +15 -14
  184. package/dist/sdk/index.js.map +1 -1
  185. package/dist/sdk/runner.js +14 -13
  186. package/dist/{setup-CJWJWYEO.js → setup-ACMP3QZC.js} +12 -11
  187. package/dist/setup-ACMP3QZC.js.map +1 -0
  188. package/dist/store-client-ZSLNOOQG.js +14 -0
  189. package/dist/{store-client-H6BTDCA4.js.map → store-client-ZSLNOOQG.js.map} +1 -1
  190. package/dist/tui/index.js +14 -13
  191. package/dist/tui/index.js.map +1 -1
  192. package/dist/workspace-plugin/adapters/mcp.js +2 -2
  193. package/dist/workspace-plugin/adapters/omp.js +3 -3
  194. package/dist/workspace-plugin/index.js +1 -1
  195. package/package.json +20 -23
  196. package/dist/base-assets/connectors/redis/adapter.d.ts +0 -39
  197. package/dist/base-assets/connectors/redis/adapter.d.ts.map +0 -1
  198. package/dist/base-assets/connectors/redis.js +0 -20
  199. package/dist/base-assets/connectors/redis.js.map +0 -1
  200. package/dist/base-assets/connectors/yjs/adapter.d.ts +0 -50
  201. package/dist/base-assets/connectors/yjs/adapter.d.ts.map +0 -1
  202. package/dist/base-assets/connectors/yjs.js +0 -20
  203. package/dist/base-assets/connectors/yjs.js.map +0 -1
  204. package/dist/chunk-2ACJB6JF.js.map +0 -1
  205. package/dist/chunk-4ACWI5YT.js.map +0 -1
  206. package/dist/chunk-IQYWI5OG.js.map +0 -1
  207. package/dist/chunk-VVS7MACX.js.map +0 -1
  208. package/dist/cli/src/commands/plugin.d.ts +0 -14
  209. package/dist/cli/src/commands/plugin.d.ts.map +0 -1
  210. package/dist/open-library-IOYWFK7M.js +0 -13
  211. package/dist/setup-CJWJWYEO.js.map +0 -1
  212. package/dist/store-client-H6BTDCA4.js +0 -14
@@ -1,5 +1,5 @@
1
- import { scanDirectory, fromMcpServerMd } from './chunk-FRPKLIEZ.js';
2
- import { parseAssetRef } from './chunk-37JKX6D7.js';
1
+ import { scanDirectory, fromMcpServerMd } from './chunk-WIR34WMU.js';
2
+ import { parseAssetRef } from './chunk-X5Y4EGZB.js';
3
3
  import { mkdirSync, existsSync, readFileSync, writeFileSync, lstatSync, symlinkSync, rmSync, readdirSync } from 'fs';
4
4
  import { homedir } from 'os';
5
5
  import { join, resolve, parse as parse$1, dirname } from 'path';
@@ -379,7 +379,7 @@ function saveSkWorkspaceConfig(dir, config, name) {
379
379
  if (!existsSync(resolvedDir)) {
380
380
  mkdirSync(resolvedDir, { recursive: true });
381
381
  }
382
- writeFileSync(filePath, stringify(config, { lineWidth: 120 }));
382
+ writeFileSync(filePath, encodeSkaileYaml(config));
383
383
  return filePath;
384
384
  }
385
385
  function listSkWorkspaceConfigs(dir) {
@@ -518,9 +518,29 @@ function mergeSkWorkspaceConfigs(base, overlay) {
518
518
  // dependencies: concatenate and dedupe
519
519
  dependencies: dedupe([...base.dependencies ?? [], ...overlay.dependencies ?? []]),
520
520
  // sources: dedupe by name — overlay entry wins for the same name
521
- sources: dedupeByKey([...base.sources ?? [], ...overlay.sources ?? []], "name")
521
+ sources: dedupeByKey([...base.sources ?? [], ...overlay.sources ?? []], "name"),
522
+ // plugins: concatenate + dedupe (like dependencies)
523
+ plugins: dedupe([...base.plugins ?? [], ...overlay.plugins ?? []]),
524
+ // deploy: overlay wins entirely (scalar-like selection)
525
+ deploy: overlay.deploy ?? base.deploy
522
526
  };
523
527
  }
528
+ var KNOWN_DRIVERS = ["omp", "claude-sdk", "codex"];
529
+ var KNOWN_PROVIDERS = [
530
+ "anthropic",
531
+ "openai",
532
+ "google",
533
+ "mistral",
534
+ "groq",
535
+ "openrouter",
536
+ "deepseek",
537
+ "xai",
538
+ "together",
539
+ "fireworks",
540
+ "deepgram",
541
+ "elevenlabs"
542
+ ];
543
+ var KNOWN_ACCESS = ["read-only", "read-write"];
524
544
  var AGENT_PROFILE_FIELDS = [
525
545
  "driver",
526
546
  "provider",
@@ -533,23 +553,79 @@ var AGENT_PROFILE_FIELDS = [
533
553
  ];
534
554
  function normalizeAgentConfig(raw) {
535
555
  const looksFlat = AGENT_PROFILE_FIELDS.some((f) => typeof raw[f] === "string");
536
- return looksFlat ? { default: raw } : raw;
556
+ return looksFlat ? { profiles: { default: raw }, wrappedFlat: true } : { profiles: raw, wrappedFlat: false };
537
557
  }
538
558
  function normalizeConfig(raw) {
559
+ return normalizeConfigInternal(raw).config;
560
+ }
561
+ function normalizeConfigInternal(raw) {
539
562
  const config = {};
563
+ const diagnostics = [];
540
564
  if (raw.name) config.name = String(raw.name);
541
565
  if (raw.description) config.description = String(raw.description);
542
- const agentConfigRaw = raw["agent-config"] ?? raw.agent_config ?? raw.agentConfig;
566
+ let agentConfigRaw;
567
+ let agentConfigKey;
568
+ if (raw["agent-config"] !== void 0) {
569
+ agentConfigRaw = raw["agent-config"];
570
+ agentConfigKey = "agent-config";
571
+ } else if (raw.agent_config !== void 0) {
572
+ agentConfigRaw = raw.agent_config;
573
+ agentConfigKey = "agent_config";
574
+ } else if (raw.agentConfig !== void 0) {
575
+ agentConfigRaw = raw.agentConfig;
576
+ agentConfigKey = "agentConfig";
577
+ }
543
578
  if (agentConfigRaw && typeof agentConfigRaw === "object" && !Array.isArray(agentConfigRaw)) {
544
- config.agent_config = normalizeAgentConfig(agentConfigRaw);
579
+ if (agentConfigKey === "agentConfig") {
580
+ diagnostics.push({
581
+ code: "legacy_key_camelcase",
582
+ severity: "warning",
583
+ message: 'Non-canonical key "agentConfig" \u2014 use "agent-config".',
584
+ path: "agentConfig"
585
+ });
586
+ }
587
+ const { profiles, wrappedFlat } = normalizeAgentConfig(
588
+ agentConfigRaw
589
+ );
590
+ if (wrappedFlat) {
591
+ diagnostics.push({
592
+ code: "legacy_agent_config_flat",
593
+ severity: "warning",
594
+ message: 'Flat agent-config block wrapped as the "default" profile \u2014 nest fields under "default:".',
595
+ path: agentConfigKey
596
+ });
597
+ }
598
+ config.agent_config = profiles;
545
599
  }
546
600
  if (Array.isArray(raw.startup)) {
547
601
  config.startup = raw.startup;
548
602
  }
549
- const aiResRaw = raw.ai_resources ?? raw.aiResources;
603
+ let aiResRaw;
604
+ let aiResKey;
605
+ if (raw.ai_resources !== void 0) {
606
+ aiResRaw = raw.ai_resources;
607
+ aiResKey = "ai_resources";
608
+ } else if (raw.aiResources !== void 0) {
609
+ aiResRaw = raw.aiResources;
610
+ aiResKey = "aiResources";
611
+ }
612
+ if (aiResKey === "aiResources") {
613
+ diagnostics.push({
614
+ code: "legacy_key_camelcase",
615
+ severity: "warning",
616
+ message: 'Non-canonical key "aiResources" \u2014 use "ai_resources".',
617
+ path: "aiResources"
618
+ });
619
+ }
550
620
  if (Array.isArray(aiResRaw)) {
551
621
  config.ai_resources = aiResRaw;
552
622
  } else if (aiResRaw && typeof aiResRaw === "object") {
623
+ diagnostics.push({
624
+ code: "legacy_ai_resources_object",
625
+ severity: "warning",
626
+ message: "Legacy ai_resources object form ({sources, requires}) \u2014 use an array of {name, path, dependencies}.",
627
+ path: aiResKey
628
+ });
553
629
  const old = aiResRaw;
554
630
  const sources = Array.isArray(old.sources) ? old.sources : [];
555
631
  const requires = Array.isArray(old.requires) ? old.requires.filter(Boolean) : [];
@@ -574,11 +650,28 @@ function normalizeConfig(raw) {
574
650
  if (Array.isArray(raw.mcp_servers)) {
575
651
  config.mcp_servers = raw.mcp_servers;
576
652
  }
653
+ if (Array.isArray(raw.plugins)) {
654
+ const specs = raw.plugins.filter((p) => typeof p === "string" && p.length > 0);
655
+ if (specs.length > 0) config.plugins = specs;
656
+ }
657
+ if (raw.deploy && typeof raw.deploy === "object" && !Array.isArray(raw.deploy)) {
658
+ const d = raw.deploy;
659
+ if (typeof d.target === "string" && d.target.length > 0) {
660
+ config.deploy = { target: d.target };
661
+ if (d.config !== void 0) config.deploy.config = d.config;
662
+ }
663
+ }
577
664
  if (raw.agent) config.agent = raw.agent;
578
665
  if (raw.workspace) config.workspace = raw.workspace;
579
666
  if (raw.secrets && typeof raw.secrets === "object") {
580
667
  config.secrets = raw.secrets;
581
668
  }
669
+ if (raw.compaction && typeof raw.compaction === "object" && !Array.isArray(raw.compaction)) {
670
+ config.compaction = raw.compaction;
671
+ }
672
+ if (raw.patches && typeof raw.patches === "object" && !Array.isArray(raw.patches)) {
673
+ config.patches = raw.patches;
674
+ }
582
675
  if (Array.isArray(raw.dependencies)) {
583
676
  config.dependencies = raw.dependencies.filter((d) => typeof d === "string");
584
677
  }
@@ -599,7 +692,112 @@ function normalizeConfig(raw) {
599
692
  if (raw.telemetry && typeof raw.telemetry === "object" && !Array.isArray(raw.telemetry)) {
600
693
  config.telemetry = raw.telemetry;
601
694
  }
602
- return config;
695
+ return { config, diagnostics };
696
+ }
697
+ function decodeSkaileYaml(text) {
698
+ let parsed;
699
+ try {
700
+ parsed = parse(text) ?? {};
701
+ } catch (err) {
702
+ return {
703
+ config: {},
704
+ diagnostics: [
705
+ {
706
+ code: "yaml_syntax",
707
+ severity: "error",
708
+ message: `Invalid YAML: ${err instanceof Error ? err.message : String(err)}`
709
+ }
710
+ ]
711
+ };
712
+ }
713
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
714
+ return {
715
+ config: {},
716
+ diagnostics: [
717
+ {
718
+ code: "non_object_root",
719
+ severity: "error",
720
+ message: "skaile.yaml must be a mapping at the top level."
721
+ }
722
+ ]
723
+ };
724
+ }
725
+ const result = normalizeConfigInternal(parsed);
726
+ validateConfigValues(result.config, result.diagnostics);
727
+ return result;
728
+ }
729
+ function encodeSkaileYaml(config) {
730
+ return stringify(toCanonicalObject(config), { lineWidth: 120 });
731
+ }
732
+ function validateConfigValues(config, diagnostics) {
733
+ for (const [profile, p] of Object.entries(config.agent_config ?? {})) {
734
+ if (p?.driver && !KNOWN_DRIVERS.includes(p.driver)) {
735
+ diagnostics.push({
736
+ code: "unknown_driver",
737
+ severity: "warning",
738
+ message: `Unknown driver "${p.driver}" \u2014 expected one of: ${KNOWN_DRIVERS.join(", ")}.`,
739
+ path: `agent-config.${profile}.driver`
740
+ });
741
+ }
742
+ if (p?.provider && !KNOWN_PROVIDERS.includes(p.provider)) {
743
+ diagnostics.push({
744
+ code: "unknown_provider",
745
+ severity: "warning",
746
+ message: `Unknown provider "${p.provider}" \u2014 expected one of: ${KNOWN_PROVIDERS.join(", ")}.`,
747
+ path: `agent-config.${profile}.provider`
748
+ });
749
+ }
750
+ }
751
+ const checkAccess = (access, path) => {
752
+ if (access && !KNOWN_ACCESS.includes(access)) {
753
+ diagnostics.push({
754
+ code: "unknown_access",
755
+ severity: "warning",
756
+ message: `Unknown access "${access}" \u2014 expected "read-only" or "read-write".`,
757
+ path
758
+ });
759
+ }
760
+ };
761
+ for (const c of config.connectors ?? []) checkAccess(c.access, `connectors.${c.id}.access`);
762
+ for (const m of config.mounts ?? []) checkAccess(m.access, `mounts.${m.id}.access`);
763
+ }
764
+ var CANONICAL_KEY_ORDER = [
765
+ "name",
766
+ "description",
767
+ "agent_config",
768
+ "dependencies",
769
+ "plugins",
770
+ "sources",
771
+ "startup",
772
+ "ai_resources",
773
+ "connectors",
774
+ "mcp_servers",
775
+ "deploy",
776
+ "mounts",
777
+ "agent",
778
+ "workspace",
779
+ "secrets",
780
+ "telemetry",
781
+ "compaction",
782
+ "patches",
783
+ "repositories"
784
+ ];
785
+ var CONFIG_KEY_TO_YAML = {
786
+ agent_config: "agent-config"
787
+ };
788
+ function toCanonicalObject(config) {
789
+ const out = {};
790
+ const emit = (key) => {
791
+ const value = config[key];
792
+ if (value === void 0) return;
793
+ out[CONFIG_KEY_TO_YAML[key] ?? key] = value;
794
+ };
795
+ for (const key of CANONICAL_KEY_ORDER) emit(key);
796
+ for (const key of Object.keys(config)) {
797
+ if (CANONICAL_KEY_ORDER.includes(key)) continue;
798
+ emit(key);
799
+ }
800
+ return out;
603
801
  }
604
802
  function parseConfigFile(filePath, name) {
605
803
  let raw;
@@ -608,14 +806,9 @@ function parseConfigFile(filePath, name) {
608
806
  } catch {
609
807
  return null;
610
808
  }
611
- let parsed;
612
- try {
613
- parsed = parse(raw) ?? {};
614
- } catch {
615
- return null;
616
- }
617
- const config = normalizeConfig(parsed);
618
- return { path: filePath, name, config };
809
+ const { config, diagnostics } = decodeSkaileYaml(raw);
810
+ if (diagnostics.some((d) => d.code === "yaml_syntax")) return null;
811
+ return { path: filePath, name, config, diagnostics };
619
812
  }
620
813
  function dedupe(arr) {
621
814
  return [...new Set(arr)];
@@ -828,6 +1021,6 @@ function resolveAgentDir(projectDir) {
828
1021
  return resolve(projectDir, definition);
829
1022
  }
830
1023
 
831
- export { COMPACTION_DEFAULTS, SKAILE_YAML_DEFAULT, SKAILE_YAML_SUFFIX, SK_WORKSPACE_DEFAULT_NAME, SK_WORKSPACE_SUFFIX, checkRepoStatus, checkoutPin, cloneRepo, ensureRepo, findWorkspaceRoot, getGlobalCacheDir, getRepoCommit, isWorkspaceConfigFilename, linkRepo, listSkWorkspaceConfigs, loadMcpServerDeclarations, loadSkWorkspaceConfig, mergeSkWorkspaceConfigs, normalizeConfig, pullRepo, readLinks, resolveAgentDir, resolveAll, resolveAsset, resolveSkWorkspaceConfig, saveSkWorkspaceConfig, scanRepo, unlinkRepo, validateAssetRecipeAttr, workspaceConfigFilename, workspaceNameFromFilename, writeLinks };
832
- //# sourceMappingURL=chunk-VVS7MACX.js.map
833
- //# sourceMappingURL=chunk-VVS7MACX.js.map
1024
+ export { COMPACTION_DEFAULTS, SKAILE_YAML_DEFAULT, SKAILE_YAML_SUFFIX, SK_WORKSPACE_DEFAULT_NAME, SK_WORKSPACE_SUFFIX, checkRepoStatus, checkoutPin, cloneRepo, decodeSkaileYaml, encodeSkaileYaml, ensureRepo, findWorkspaceRoot, getGlobalCacheDir, getRepoCommit, isWorkspaceConfigFilename, linkRepo, listSkWorkspaceConfigs, loadMcpServerDeclarations, loadSkWorkspaceConfig, mergeSkWorkspaceConfigs, normalizeConfig, pullRepo, readLinks, resolveAgentDir, resolveAll, resolveAsset, resolveSkWorkspaceConfig, saveSkWorkspaceConfig, scanRepo, unlinkRepo, validateAssetRecipeAttr, workspaceConfigFilename, workspaceNameFromFilename, writeLinks };
1025
+ //# sourceMappingURL=chunk-TKOLD2O7.js.map
1026
+ //# sourceMappingURL=chunk-TKOLD2O7.js.map