@skaile/workspaces 0.26.0 → 0.28.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 (177) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/dist/{asset-feeds-WMVTI7KW.js → asset-feeds-2V7LZIG7.js} +17 -10
  3. package/dist/asset-feeds-2V7LZIG7.js.map +1 -0
  4. package/dist/asset-manager/index.js +7 -7
  5. package/dist/asset-manager/installer.js +6 -6
  6. package/dist/bridge/drivers/claude-sdk.js +2 -2
  7. package/dist/bridge/drivers/codex.js +1 -1
  8. package/dist/bridge/drivers/continue.d.ts +2 -0
  9. package/dist/bridge/drivers/continue.js +103 -0
  10. package/dist/bridge/drivers/continue.js.map +1 -0
  11. package/dist/bridge/drivers/echo.js +1 -1
  12. package/dist/bridge/drivers/gemini.d.ts +2 -0
  13. package/dist/bridge/drivers/gemini.js +10 -0
  14. package/dist/bridge/drivers/gemini.js.map +1 -0
  15. package/dist/bridge/drivers/goose.d.ts +2 -0
  16. package/dist/bridge/drivers/goose.js +88 -0
  17. package/dist/bridge/drivers/goose.js.map +1 -0
  18. package/dist/bridge/drivers/omp.js +1 -1
  19. package/dist/bridge/drivers/opencode.d.ts +2 -0
  20. package/dist/bridge/drivers/opencode.js +99 -0
  21. package/dist/bridge/drivers/opencode.js.map +1 -0
  22. package/dist/bridge/drivers/qwen.d.ts +2 -0
  23. package/dist/bridge/drivers/qwen.js +57 -0
  24. package/dist/bridge/drivers/qwen.js.map +1 -0
  25. package/dist/bridge/index.js +3 -3
  26. package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
  27. package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
  28. package/dist/bridge/src/drivers/continue.d.ts +43 -0
  29. package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
  30. package/dist/bridge/src/drivers/gemini.d.ts +55 -0
  31. package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
  32. package/dist/bridge/src/drivers/goose.d.ts +42 -0
  33. package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
  34. package/dist/bridge/src/drivers/opencode.d.ts +43 -0
  35. package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
  36. package/dist/bridge/src/drivers/qwen.d.ts +39 -0
  37. package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
  38. package/dist/bridge/src/registry.d.ts.map +1 -1
  39. package/dist/{chunk-XGLGS5B4.js → chunk-2NOE4AGD.js} +3 -3
  40. package/dist/{chunk-XGLGS5B4.js.map → chunk-2NOE4AGD.js.map} +1 -1
  41. package/dist/{chunk-Z5DI7PDG.js → chunk-3QQSSRYN.js} +29 -5
  42. package/dist/chunk-3QQSSRYN.js.map +1 -0
  43. package/dist/chunk-5RBPPBEK.js +110 -0
  44. package/dist/chunk-5RBPPBEK.js.map +1 -0
  45. package/dist/chunk-5V5KZQIC.js +445 -0
  46. package/dist/chunk-5V5KZQIC.js.map +1 -0
  47. package/dist/{chunk-23M4XZQW.js → chunk-AKSR434V.js} +3 -3
  48. package/dist/{chunk-23M4XZQW.js.map → chunk-AKSR434V.js.map} +1 -1
  49. package/dist/{chunk-WD4LP66U.js → chunk-BSVLAHHH.js} +34 -17
  50. package/dist/chunk-BSVLAHHH.js.map +1 -0
  51. package/dist/{chunk-7OBGSR7O.js → chunk-BZ2JU7IP.js} +4 -4
  52. package/dist/{chunk-7OBGSR7O.js.map → chunk-BZ2JU7IP.js.map} +1 -1
  53. package/dist/{chunk-ZYDE52WE.js → chunk-DGM74UP4.js} +3 -3
  54. package/dist/{chunk-ZYDE52WE.js.map → chunk-DGM74UP4.js.map} +1 -1
  55. package/dist/{chunk-QHXS3YDV.js → chunk-FBVUGRTU.js} +5 -5
  56. package/dist/{chunk-QHXS3YDV.js.map → chunk-FBVUGRTU.js.map} +1 -1
  57. package/dist/{chunk-C32BRO2W.js → chunk-FWHOU3CX.js} +3 -3
  58. package/dist/{chunk-C32BRO2W.js.map → chunk-FWHOU3CX.js.map} +1 -1
  59. package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
  60. package/dist/chunk-GYPA2Q7F.js.map +1 -0
  61. package/dist/{chunk-KL2MQ6WI.js → chunk-M4KLIEIJ.js} +3 -3
  62. package/dist/{chunk-KL2MQ6WI.js.map → chunk-M4KLIEIJ.js.map} +1 -1
  63. package/dist/{chunk-RTAIGPTF.js → chunk-MIH45XPY.js} +100 -147
  64. package/dist/chunk-MIH45XPY.js.map +1 -0
  65. package/dist/{chunk-BKF3UFF4.js → chunk-SF4GWVR5.js} +4 -4
  66. package/dist/{chunk-BKF3UFF4.js.map → chunk-SF4GWVR5.js.map} +1 -1
  67. package/dist/{chunk-PY7AQRGH.js → chunk-U5L6F5NZ.js} +6 -6
  68. package/dist/{chunk-PY7AQRGH.js.map → chunk-U5L6F5NZ.js.map} +1 -1
  69. package/dist/{chunk-BQRRBGDE.js → chunk-UAW7VRAL.js} +2 -2
  70. package/dist/{chunk-BQRRBGDE.js.map → chunk-UAW7VRAL.js.map} +1 -1
  71. package/dist/{chunk-4SQ6Y6U7.js → chunk-UBCZVONU.js} +3 -3
  72. package/dist/{chunk-4SQ6Y6U7.js.map → chunk-UBCZVONU.js.map} +1 -1
  73. package/dist/{chunk-YRU4WB6Y.js → chunk-UIZKIUC6.js} +3 -3
  74. package/dist/{chunk-YRU4WB6Y.js.map → chunk-UIZKIUC6.js.map} +1 -1
  75. package/dist/{chunk-YDTW4GT6.js → chunk-XHBPQ7QP.js} +5 -5
  76. package/dist/{chunk-YDTW4GT6.js.map → chunk-XHBPQ7QP.js.map} +1 -1
  77. package/dist/chunk-Z3XXKR5E.js +88 -0
  78. package/dist/chunk-Z3XXKR5E.js.map +1 -0
  79. package/dist/{chunk-45H3UO2R.js → chunk-ZEKWHJBB.js} +52 -2
  80. package/dist/chunk-ZEKWHJBB.js.map +1 -0
  81. package/dist/cli/index.js +220 -117
  82. package/dist/cli/index.js.map +1 -1
  83. package/dist/cli/src/asset-feeds.d.ts +14 -1
  84. package/dist/cli/src/asset-feeds.d.ts.map +1 -1
  85. package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
  86. package/dist/cli/src/commands/manage.d.ts +46 -23
  87. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  88. package/dist/cli/src/helpers.d.ts +10 -1
  89. package/dist/cli/src/helpers.d.ts.map +1 -1
  90. package/dist/connectors/config.js +6 -6
  91. package/dist/connectors/index.js +8 -8
  92. package/dist/core/index.js +5 -5
  93. package/dist/core/runtime-assets.js +2 -2
  94. package/dist/core/src/workspace-config.d.ts +10 -1
  95. package/dist/core/src/workspace-config.d.ts.map +1 -1
  96. package/dist/core/workspace-config.js +1 -1
  97. package/dist/deploy/index.js +5 -5
  98. package/dist/{ensure-sources-CVULUVH4.js → ensure-sources-BNSRO5G7.js} +11 -10
  99. package/dist/ensure-sources-BNSRO5G7.js.map +1 -0
  100. package/dist/factory-assets/connectors/deploy.js +8 -8
  101. package/dist/factory-assets/connectors/devserver.js +8 -8
  102. package/dist/factory-assets/connectors/flow/adapter.js +8 -8
  103. package/dist/factory-assets/connectors/flow/engine.js +5 -5
  104. package/dist/factory-assets/connectors/flow/run-flow.js +9 -9
  105. package/dist/factory-assets/connectors/flow.js +8 -8
  106. package/dist/factory-assets/connectors/git.js +8 -8
  107. package/dist/factory-assets/connectors/gmail.js +8 -8
  108. package/dist/factory-assets/connectors/googledrive.js +8 -8
  109. package/dist/factory-assets/connectors/local.js +8 -8
  110. package/dist/factory-assets/connectors/mattermost.js +8 -8
  111. package/dist/factory-assets/connectors/memory.js +8 -8
  112. package/dist/factory-assets/connectors/minio.js +8 -8
  113. package/dist/factory-assets/connectors/postgres.js +8 -8
  114. package/dist/factory-assets/connectors/s3.js +8 -8
  115. package/dist/factory-assets/connectors/sharepoint.js +8 -8
  116. package/dist/factory-assets/connectors/sqlite.js +8 -8
  117. package/dist/factory-assets/connectors/static-server.js +8 -8
  118. package/dist/factory-assets/connectors/tunnel.js +8 -8
  119. package/dist/factory-assets/connectors/webdav.js +8 -8
  120. package/dist/factory-assets/connectors/xstate-store.js +8 -8
  121. package/dist/factory-assets/connectors/xstate.js +8 -8
  122. package/dist/{flows-JZFJD5IN.js → flows-L3GHQD7F.js} +4 -4
  123. package/dist/{flows-JZFJD5IN.js.map → flows-L3GHQD7F.js.map} +1 -1
  124. package/dist/helpers-F4NZ66VD.js +4 -0
  125. package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
  126. package/dist/library/index.js +8 -7
  127. package/dist/library/install.d.ts +2 -0
  128. package/dist/library/install.js +16 -0
  129. package/dist/library/install.js.map +1 -0
  130. package/dist/library/src/index.d.ts +2 -2
  131. package/dist/library/src/index.d.ts.map +1 -1
  132. package/dist/library/src/install/index.d.ts +3 -0
  133. package/dist/library/src/install/index.d.ts.map +1 -0
  134. package/dist/library/src/library.d.ts +20 -20
  135. package/dist/library/src/library.d.ts.map +1 -1
  136. package/dist/library/src/local/db.d.ts.map +1 -1
  137. package/dist/library/src/local/library.d.ts +6 -6
  138. package/dist/library/src/local/library.d.ts.map +1 -1
  139. package/dist/library/src/local/local-catalog-source.d.ts +1 -1
  140. package/dist/library/src/local/schema.d.ts +9 -9
  141. package/dist/library/src/local/schema.d.ts.map +1 -1
  142. package/dist/library/src/preset/apply.d.ts +9 -9
  143. package/dist/library/src/preset/apply.d.ts.map +1 -1
  144. package/dist/library/src/preset/resolve-item.d.ts +1 -1
  145. package/dist/library/src/workspace-config.d.ts +11 -8
  146. package/dist/library/src/workspace-config.d.ts.map +1 -1
  147. package/dist/{open-library-WYASW4BH.js → open-library-3VJY74LQ.js} +12 -11
  148. package/dist/{open-library-WYASW4BH.js.map → open-library-3VJY74LQ.js.map} +1 -1
  149. package/dist/{paths-BMW6JYW6.js → paths-CE66L3AL.js} +8 -8
  150. package/dist/{paths-BMW6JYW6.js.map → paths-CE66L3AL.js.map} +1 -1
  151. package/dist/{plugin-store-O5VR45CA.js → plugin-store-GL5VKYUA.js} +7 -7
  152. package/dist/{plugin-store-O5VR45CA.js.map → plugin-store-GL5VKYUA.js.map} +1 -1
  153. package/dist/runner/index.js +14 -14
  154. package/dist/runner/src/serve.d.ts.map +1 -1
  155. package/dist/sdk/asset-manager.js +7 -7
  156. package/dist/sdk/bridge.js +3 -3
  157. package/dist/sdk/core.js +5 -5
  158. package/dist/sdk/flow.js +5 -5
  159. package/dist/sdk/index.js +14 -14
  160. package/dist/sdk/runner.js +14 -14
  161. package/dist/{setup-YNLFR5GB.js → setup-4YMN2BDU.js} +10 -10
  162. package/dist/{setup-YNLFR5GB.js.map → setup-4YMN2BDU.js.map} +1 -1
  163. package/dist/{store-client-CENBEASX.js → store-client-BCP5LCAZ.js} +8 -8
  164. package/dist/{store-client-CENBEASX.js.map → store-client-BCP5LCAZ.js.map} +1 -1
  165. package/dist/tui/index.js +14 -14
  166. package/dist/workspace-plugin/adapters/mcp.js +3 -3
  167. package/dist/workspace-plugin/adapters/omp.js +3 -3
  168. package/dist/workspace-plugin/index.js +1 -1
  169. package/package.json +37 -1
  170. package/dist/asset-feeds-WMVTI7KW.js.map +0 -1
  171. package/dist/chunk-45H3UO2R.js.map +0 -1
  172. package/dist/chunk-RTAIGPTF.js.map +0 -1
  173. package/dist/chunk-WD4LP66U.js.map +0 -1
  174. package/dist/chunk-WSZAFRQL.js.map +0 -1
  175. package/dist/chunk-Z5DI7PDG.js.map +0 -1
  176. package/dist/ensure-sources-CVULUVH4.js.map +0 -1
  177. package/dist/helpers-LTN3HMD3.js +0 -4
package/dist/cli/index.js CHANGED
@@ -1,52 +1,53 @@
1
1
  #!/usr/bin/env node
2
- import { AI_RESOURCES, aiResourceRoots } from '../chunk-4SQ6Y6U7.js';
3
- import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-7OBGSR7O.js';
4
- import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-WSZAFRQL.js';
5
- import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-XGLGS5B4.js';
2
+ import { openCatalogSource, openLibraryManager, createFullRegistry, openLibrary } from '../chunk-BZ2JU7IP.js';
3
+ import { logErr, S, logOk, colorRef, logInfo, logWarn, kindColorPad, kindColor, formatRelativeTime, fitWidth } from '../chunk-GYPA2Q7F.js';
4
+ import { getStoreConfig, storeFetch, saveStoreTokens, clearStoreTokens, isStoreAuthenticated } from '../chunk-2NOE4AGD.js';
5
+ import { AI_RESOURCES, aiResourceRoots } from '../chunk-UBCZVONU.js';
6
6
  import { LocalSecretsProvider } from '../chunk-7GWYRVAX.js';
7
- import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-RTAIGPTF.js';
8
- import '../chunk-R7FOF242.js';
7
+ import { resolveLibraryDir, LocalCatalogSource, skaileHomeDir } from '../chunk-MIH45XPY.js';
9
8
  import '../chunk-JIQLLZ65.js';
9
+ import '../chunk-Z3XXKR5E.js';
10
+ import '../chunk-R7FOF242.js';
10
11
  import '../chunk-OKRUTSG7.js';
11
- import { runFlow, resumeFlow } from '../chunk-QHXS3YDV.js';
12
+ import { runFlow, resumeFlow } from '../chunk-FBVUGRTU.js';
12
13
  import '../chunk-ZONCCO5N.js';
13
14
  import { validateFlowVersions, parseSkillFrontmatter } from '../chunk-TV72ZJYN.js';
14
- import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-WD4LP66U.js';
15
- import { buildClaudePluginFiles } from '../chunk-BQRRBGDE.js';
15
+ import { runAgentChat, loadSessionById, loadSession, listSessions, setCurrentSession, deleteSession, clearSession, loadAgentManifest, compileComposition, MarkdownStreamer, resolveMixin } from '../chunk-BSVLAHHH.js';
16
+ import { buildClaudePluginFiles } from '../chunk-UAW7VRAL.js';
16
17
  import '../chunk-X5YPJV4N.js';
17
- import '../chunk-TDSRLMDB.js';
18
18
  import '../chunk-O7SG5PC2.js';
19
19
  import '../chunk-7QBNJTTQ.js';
20
20
  import '../chunk-GTS2FODO.js';
21
21
  import '../chunk-WQ7DE5UC.js';
22
22
  import '../chunk-32NA4TVC.js';
23
23
  import '../chunk-W3UDISS2.js';
24
- import '../chunk-23M4XZQW.js';
24
+ import '../chunk-TDSRLMDB.js';
25
+ import '../chunk-AKSR434V.js';
26
+ import '../chunk-RRVQAE5D.js';
25
27
  import '../chunk-BMQKMOQY.js';
26
28
  import '../chunk-PAYAFNXG.js';
27
- import '../chunk-RRVQAE5D.js';
28
- import '../chunk-45H3UO2R.js';
29
+ import '../chunk-ZEKWHJBB.js';
29
30
  import '../chunk-LV2HPH3C.js';
30
- import '../chunk-YDTW4GT6.js';
31
- import '../chunk-ZYDE52WE.js';
32
- import '../chunk-QMONOHXT.js';
31
+ import '../chunk-XHBPQ7QP.js';
33
32
  import '../chunk-OVRSNIKJ.js';
33
+ import '../chunk-DGM74UP4.js';
34
+ import '../chunk-QMONOHXT.js';
34
35
  import '../chunk-6E6PKKAD.js';
35
36
  import { loadFlow, loadAllFlows } from '../chunk-W7W66MDZ.js';
36
37
  import '../chunk-DEYYRFQU.js';
37
38
  import '../chunk-IFGTRL2I.js';
38
- import { AssetManager } from '../chunk-PY7AQRGH.js';
39
- import '../chunk-BKF3UFF4.js';
40
- import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-KL2MQ6WI.js';
41
- import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
42
- import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
43
- import '../chunk-C32BRO2W.js';
44
- import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-Z5DI7PDG.js';
39
+ import { AssetManager } from '../chunk-U5L6F5NZ.js';
40
+ import '../chunk-SF4GWVR5.js';
41
+ import { readLock, resolveSettings, globalSettingsPath, projectSettingsPath, loadSettings, saveSettings, portableSpawn, portableSpawnSync, WorkspaceYamlEditor } from '../chunk-M4KLIEIJ.js';
42
+ import '../chunk-FWHOU3CX.js';
43
+ import { resolveAgentDir, resolveSkWorkspaceConfig, findWorkspaceRoot, workspaceConfigFilename } from '../chunk-3QQSSRYN.js';
45
44
  import { SKAILE_MANIFEST_FILENAME, decodeSkaileManifest } from '../chunk-IERB3UXJ.js';
46
45
  import { parseFrontmatter } from '../chunk-2FS4FPZ7.js';
47
46
  import { ASSET_KINDS, parseAssetRef, isValidAssetName, ASSET_NAME_HINT, assetRefToStr } from '../chunk-IEJ5IOC3.js';
48
47
  import '../chunk-JKNWJ64A.js';
49
48
  import { SUPPORTED_DRIVER_TARGETS } from '../chunk-O4JH3KUE.js';
49
+ import { DRIVER_DEFAULTS } from '../chunk-K5GBV4SA.js';
50
+ import { assetSearchDirs, detectDomains } from '../chunk-ZAP2BDHG.js';
50
51
  import { openSqlite } from '../chunk-24UIWON4.js';
51
52
  import '../chunk-KTBKW2FI.js';
52
53
  import '../chunk-UQ6LFBPZ.js';
@@ -311,7 +312,7 @@ function makeSearchCommand() {
311
312
  }
312
313
  if (showStore) {
313
314
  try {
314
- const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-CENBEASX.js');
315
+ const { getStoreConfig: getStoreConfig2, storeFetch: storeFetch2 } = await import('../store-client-BCP5LCAZ.js');
315
316
  const config = getStoreConfig2();
316
317
  const params = {};
317
318
  if (query) params.q = query;
@@ -473,7 +474,7 @@ function makeCatalogCommand() {
473
474
  const cfg = resolveConfig({ projectDir });
474
475
  const baseUrl = opts.url ?? cfg.catalog.url;
475
476
  if (isLocalCatalogUrl(baseUrl)) {
476
- const { resolveCatalogSource } = await import('../open-library-WYASW4BH.js');
477
+ const { resolveCatalogSource } = await import('../open-library-3VJY74LQ.js');
477
478
  let resolved;
478
479
  try {
479
480
  resolved = await resolveCatalogSource({ projectDir: opts.projectDir });
@@ -1471,7 +1472,7 @@ async function ensureTargetsRegistered(projectDir) {
1471
1472
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
1472
1473
  const config = resolveSkWorkspaceConfig2(projectDir);
1473
1474
  if (config.plugins && config.plugins.length > 0) {
1474
- const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
1475
+ const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
1475
1476
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
1476
1477
  for (const f of result.failed) logWarn(f.error);
1477
1478
  }
@@ -1781,9 +1782,7 @@ function makeLibraryCommand() {
1781
1782
  close();
1782
1783
  }
1783
1784
  });
1784
- cmd.command("create <kind> <name>").description("Scaffold a new asset inside the default (or named) library").addOption(
1785
- new Option("--kind <kind>", "Asset kind override").choices([...ASSET_KINDS])
1786
- ).option("--library <name>", "Target library (default: the default-marked one)").option("--dir <dir>", "Target directory inside the library (default: library root)").action(
1785
+ cmd.command("create <kind> <name>").description("Scaffold a new asset inside the default (or named) library").addOption(new Option("--kind <kind>", "Asset kind override").choices([...ASSET_KINDS])).option("--library <name>", "Target library (default: the default-marked one)").option("--dir <dir>", "Target directory inside the library (default: library root)").action(
1787
1786
  async (kind, name, opts) => {
1788
1787
  if (!ASSET_KINDS.includes(kind)) {
1789
1788
  logErr(`Unknown asset kind "${kind}". Expected: ${ASSET_KINDS.join(", ")}.`);
@@ -1994,9 +1993,7 @@ async function printPerLibraryStatus(name, asJson) {
1994
1993
  ${S.heading(lib.name)}`);
1995
1994
  console.log(` reachable: ${status4.reachable ? S.ok("yes") : S.err("no")}`);
1996
1995
  if (status4.remoteChanges) {
1997
- console.log(
1998
- ` behind/ahead: ${status4.remoteChanges.behind}/${status4.remoteChanges.ahead}`
1999
- );
1996
+ console.log(` behind/ahead: ${status4.remoteChanges.behind}/${status4.remoteChanges.ahead}`);
2000
1997
  }
2001
1998
  const lc = status4.localChanges;
2002
1999
  if (lc.added.length + lc.modified.length + lc.deleted.length > 0) {
@@ -2027,10 +2024,10 @@ async function printOverallStatus(projectDir, asJson) {
2027
2024
  const resolvedProjectDir = path15.resolve(projectDir);
2028
2025
  const hasWorkspaceConfig = existsSync(path15.join(resolvedProjectDir, "skaile.yaml"));
2029
2026
  const hasLockFile = existsSync(path15.join(resolvedProjectDir, "skaile.lock.yaml"));
2030
- let subscriptions = [];
2027
+ let assignments = [];
2031
2028
  if (hasWorkspaceConfig) {
2032
2029
  try {
2033
- subscriptions = await library.listSubscriptions(resolvedProjectDir);
2030
+ assignments = await library.listAssignments(resolvedProjectDir);
2034
2031
  } catch {
2035
2032
  }
2036
2033
  }
@@ -2043,7 +2040,7 @@ async function printOverallStatus(projectDir, asJson) {
2043
2040
  libraries: libs.length,
2044
2041
  assetDefinitions: defs.length,
2045
2042
  instances: instances.length,
2046
- subscriptions: subscriptions.length,
2043
+ assignments: assignments.length,
2047
2044
  secretsStrategy,
2048
2045
  registeredKinds,
2049
2046
  workspace: {
@@ -2083,15 +2080,13 @@ async function printOverallStatus(projectDir, asJson) {
2083
2080
  const parts = [...byKind.entries()].sort((a, b) => b[1] - a[1]).map(([k, v]) => `${v} ${k}${v > 1 ? "s" : ""}`);
2084
2081
  console.log(` ${S.dim(parts.join(", "))}`);
2085
2082
  }
2086
- console.log(
2087
- ` ${S.label("Registered kinds")} ${pc5.green(String(registeredKinds.length))}`
2088
- );
2083
+ console.log(` ${S.label("Registered kinds")} ${pc5.green(String(registeredKinds.length))}`);
2089
2084
  console.log(` ${S.dim(registeredKinds.join(", "))}`);
2090
2085
  console.log(
2091
2086
  ` ${S.label("Instances")} ${instances.length === 0 ? S.dim("none") : pc5.green(String(instances.length))}`
2092
2087
  );
2093
2088
  console.log(
2094
- ` ${S.label("Subscriptions")} ${subscriptions.length === 0 ? S.dim("none (this workspace)") : pc5.green(String(subscriptions.length))}`
2089
+ ` ${S.label("Assignments")} ${assignments.length === 0 ? S.dim("none (this workspace)") : pc5.green(String(assignments.length))}`
2095
2090
  );
2096
2091
  const strategyColor = secretsStrategy === "unavailable" ? S.dim : pc5.green;
2097
2092
  console.log(` ${S.label("Secrets strategy")} ${strategyColor(secretsStrategy)}`);
@@ -2231,6 +2226,14 @@ function makeLogsCommand() {
2231
2226
  }
2232
2227
  );
2233
2228
  }
2229
+ var ORIGIN_META = {
2230
+ library: { icon: "\u{1F4DA}", label: "Library" },
2231
+ source: { icon: "\u{1F517}", label: "Sources" },
2232
+ store: { icon: "\u{1F4E6}", label: "Store" }
2233
+ };
2234
+ var ORIGIN_ORDER = ["library", "source", "store"];
2235
+ var srcKey = (origin, publisher) => `${origin}:${publisher}`;
2236
+ var repoKey = (origin, publisher, repo) => `${origin}:${publisher}:${repo}`;
2234
2237
  var am;
2235
2238
  var state = {
2236
2239
  tab: "assets",
@@ -2241,39 +2244,61 @@ var state = {
2241
2244
  visibleRows: [],
2242
2245
  pendingAdds: /* @__PURE__ */ new Set(),
2243
2246
  pendingRemoves: /* @__PURE__ */ new Set(),
2247
+ collapsedOrigins: /* @__PURE__ */ new Set(),
2244
2248
  collapsedSources: /* @__PURE__ */ new Set(),
2245
2249
  collapsedRepos: /* @__PURE__ */ new Set(),
2250
+ seenOrigins: /* @__PURE__ */ new Set(),
2251
+ originFilter: null,
2246
2252
  message: "",
2247
2253
  cols: 80,
2248
2254
  awaitingExitConfirm: false
2249
2255
  };
2250
- function buildVisibleRows(rows, collapsedSources, collapsedRepos) {
2256
+ function buildVisibleRows(rows, collapsedOrigins, collapsedSources, collapsedRepos, originFilter = null) {
2251
2257
  return rows.filter((row) => {
2258
+ const origin = rowOrigin(row);
2259
+ if (originFilter && origin !== originFilter) return false;
2260
+ if (row.type === "origin-header") return true;
2261
+ if (collapsedOrigins.has(origin)) return false;
2252
2262
  if (row.type === "publisher-header") return true;
2253
2263
  if (row.type === "repo-header") {
2254
- return !collapsedSources.has(row.source);
2264
+ return !collapsedSources.has(srcKey(origin, row.source));
2255
2265
  }
2256
- const publisher = row.entry?.publisher || "other";
2257
- if (collapsedSources.has(publisher)) return false;
2258
- const repo = row.entry?.repo || "";
2259
- return repo === "" || !collapsedRepos.has(`${publisher}:${repo}`);
2266
+ const publisher = rowPublisher(row);
2267
+ if (collapsedSources.has(srcKey(origin, publisher))) return false;
2268
+ const repo = rowRepo(row);
2269
+ return repo === "" || !collapsedRepos.has(repoKey(origin, publisher, repo));
2260
2270
  });
2261
2271
  }
2262
- function repoAssetRefs(rows, publisher, repo) {
2263
- return rows.filter((r) => isAsset(r) && inRepo(r, publisher, repo)).map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2272
+ function originAssetRefs(rows, origin) {
2273
+ return refsOf(rows.filter((r) => isAsset(r) && rowOrigin(r) === origin));
2264
2274
  }
2265
- function sourceAssetRefs(rows, source) {
2266
- return rows.filter((r) => isAsset(r) && inSource(r, source)).map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2275
+ function repoAssetRefs(rows, origin, publisher, repo) {
2276
+ return refsOf(rows.filter((r) => isAsset(r) && inRepo(r, origin, publisher, repo)));
2277
+ }
2278
+ function sourceAssetRefs(rows, origin, source) {
2279
+ return refsOf(rows.filter((r) => isAsset(r) && inSource(r, origin, source)));
2267
2280
  }
2268
2281
  function isAsset(r) {
2269
2282
  return r.type === "asset";
2270
2283
  }
2271
- function inSource(r, source) {
2272
- return (r.entry?.publisher || "other") === source;
2284
+ function rowOrigin(r) {
2285
+ return r.origin ?? "source";
2286
+ }
2287
+ function rowPublisher(r) {
2288
+ return r.entry?.publisher || "other";
2289
+ }
2290
+ function rowRepo(r) {
2291
+ return r.entry?.repo || "";
2292
+ }
2293
+ function refsOf(rows) {
2294
+ return rows.map((r) => assetRefOf(r)).filter((ref) => ref !== null);
2295
+ }
2296
+ function inSource(r, origin, source) {
2297
+ return rowOrigin(r) === origin && rowPublisher(r) === source;
2273
2298
  }
2274
- function inRepo(r, publisher, repo) {
2275
- if (!inSource(r, publisher)) return false;
2276
- return (r.entry?.repo || "") === repo;
2299
+ function inRepo(r, origin, publisher, repo) {
2300
+ if (!inSource(r, origin, publisher)) return false;
2301
+ return rowRepo(r) === repo;
2277
2302
  }
2278
2303
  function assetRefOf(r) {
2279
2304
  if (!isAsset(r) || !r.entry?.publisher) return null;
@@ -2319,62 +2344,84 @@ function bulkSelection(refs, action3) {
2319
2344
  for (const ref of refs) setSelection(ref, action3);
2320
2345
  }
2321
2346
  function actOnHeader(row, action3) {
2347
+ if (row.type === "origin-header") {
2348
+ bulkSelection(originAssetRefs(state.assetRows, rowOrigin(row)), action3);
2349
+ return true;
2350
+ }
2322
2351
  if (row.type === "publisher-header") {
2323
- bulkSelection(sourceAssetRefs(state.assetRows, row.source), action3);
2352
+ bulkSelection(sourceAssetRefs(state.assetRows, rowOrigin(row), row.source), action3);
2324
2353
  return true;
2325
2354
  }
2326
2355
  if (row.type === "repo-header") {
2327
- bulkSelection(repoAssetRefs(state.assetRows, row.source, row.repo), action3);
2356
+ bulkSelection(repoAssetRefs(state.assetRows, rowOrigin(row), row.source, row.repo), action3);
2328
2357
  return true;
2329
2358
  }
2330
2359
  return false;
2331
2360
  }
2332
2361
  async function loadAssets() {
2333
- const { gatherAssetFeeds } = await import('../asset-feeds-WMVTI7KW.js');
2362
+ const { gatherAssetFeeds } = await import('../asset-feeds-2V7LZIG7.js');
2334
2363
  const { entries, notes } = await gatherAssetFeeds(am, am.projectDir);
2335
2364
  if (notes.length > 0) {
2336
2365
  state.message = notes.map((n) => `[${n.feed}] ${n.message}`).join(" \u2022 ");
2337
2366
  }
2338
2367
  const installed = new Set(am.listDeployed().map((e) => `${e.kind}:${e.name}`));
2339
- const byPublisher = /* @__PURE__ */ new Map();
2340
- for (const e of entries) {
2341
- const publisher = e.publisher || "other";
2342
- const repo = e.repo || "";
2368
+ const byOrigin = /* @__PURE__ */ new Map();
2369
+ for (const { origin, entry } of entries) {
2370
+ const publisher = entry.publisher || "other";
2371
+ const repo = entry.repo || "";
2372
+ if (!byOrigin.has(origin)) byOrigin.set(origin, /* @__PURE__ */ new Map());
2373
+ const byPublisher = byOrigin.get(origin);
2343
2374
  if (!byPublisher.has(publisher)) byPublisher.set(publisher, /* @__PURE__ */ new Map());
2344
2375
  const byRepo = byPublisher.get(publisher);
2345
2376
  if (!byRepo.has(repo)) byRepo.set(repo, []);
2346
- byRepo.get(repo).push(e);
2377
+ byRepo.get(repo).push(entry);
2347
2378
  }
2348
2379
  const rows = [];
2349
- for (const [publisher, byRepo] of [...byPublisher.entries()].sort(
2350
- (a, b) => a[0].localeCompare(b[0])
2351
- )) {
2352
- rows.push({ type: "publisher-header", source: publisher });
2353
- const pushAssets = (items) => {
2354
- items.sort(
2355
- (a, b) => a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name)
2356
- );
2357
- for (const entry of items) {
2358
- const ref = `${entry.kind}:${entry.name}`;
2359
- rows.push({ type: "asset", entry, installed: installed.has(ref) });
2380
+ for (const origin of ORIGIN_ORDER) {
2381
+ const byPublisher = byOrigin.get(origin);
2382
+ if (!byPublisher || byPublisher.size === 0) continue;
2383
+ rows.push({ type: "origin-header", origin });
2384
+ for (const [publisher, byRepo] of [...byPublisher.entries()].sort(
2385
+ (a, b) => a[0].localeCompare(b[0])
2386
+ )) {
2387
+ rows.push({ type: "publisher-header", origin, source: publisher });
2388
+ const pushAssets = (items) => {
2389
+ items.sort(
2390
+ (a, b) => a.kind !== b.kind ? a.kind.localeCompare(b.kind) : a.name.localeCompare(b.name)
2391
+ );
2392
+ for (const entry of items) {
2393
+ const ref = `${entry.kind}:${entry.name}`;
2394
+ rows.push({ type: "asset", origin, entry, installed: installed.has(ref) });
2395
+ }
2396
+ };
2397
+ const noRepo = byRepo.get("");
2398
+ if (noRepo) pushAssets(noRepo);
2399
+ for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
2400
+ rows.push({ type: "repo-header", origin, source: publisher, repo });
2401
+ pushAssets(items);
2360
2402
  }
2361
- };
2362
- const noRepo = byRepo.get("");
2363
- if (noRepo) pushAssets(noRepo);
2364
- for (const [repo, items] of [...byRepo.entries()].filter(([r]) => r !== "").sort((a, b) => a[0].localeCompare(b[0]))) {
2365
- rows.push({ type: "repo-header", source: publisher, repo });
2366
- pushAssets(items);
2367
2403
  }
2368
2404
  }
2369
2405
  state.assetRows = rows;
2406
+ const presentOrigins = new Set(rows.filter((r) => r.type === "origin-header").map(rowOrigin));
2407
+ for (const o of presentOrigins) {
2408
+ if (!state.seenOrigins.has(o)) {
2409
+ if (o === "store") state.collapsedOrigins.add(o);
2410
+ state.seenOrigins.add(o);
2411
+ }
2412
+ }
2413
+ for (const o of state.collapsedOrigins) {
2414
+ if (!presentOrigins.has(o)) state.collapsedOrigins.delete(o);
2415
+ }
2416
+ if (state.originFilter && !presentOrigins.has(state.originFilter)) state.originFilter = null;
2370
2417
  const newSources = new Set(
2371
- rows.filter((r) => r.type === "publisher-header").map((r) => r.source)
2418
+ rows.filter((r) => r.type === "publisher-header").map((r) => srcKey(rowOrigin(r), r.source))
2372
2419
  );
2373
2420
  for (const s of state.collapsedSources) {
2374
2421
  if (!newSources.has(s)) state.collapsedSources.delete(s);
2375
2422
  }
2376
2423
  const newRepoKeys = new Set(
2377
- rows.filter((r) => r.type === "repo-header").map((r) => `${r.source}:${r.repo}`)
2424
+ rows.filter((r) => r.type === "repo-header").map((r) => repoKey(rowOrigin(r), r.source, r.repo))
2378
2425
  );
2379
2426
  for (const d of state.collapsedRepos) {
2380
2427
  if (!newRepoKeys.has(d)) state.collapsedRepos.delete(d);
@@ -2385,7 +2432,7 @@ async function loadAssets() {
2385
2432
  async function loadSourcesAndLibraries() {
2386
2433
  try {
2387
2434
  const [{ openLibraryManager: openLibraryManager2 }, { skaileHomeDir: skaileHomeDir2 }] = await Promise.all([
2388
- import('../open-library-WYASW4BH.js'),
2435
+ import('../open-library-3VJY74LQ.js'),
2389
2436
  import('../library/index.js')
2390
2437
  ]);
2391
2438
  const { manager, library, close } = await openLibraryManager2();
@@ -2423,8 +2470,10 @@ async function loadSourcesAndLibraries() {
2423
2470
  function rebuildVisible() {
2424
2471
  state.visibleRows = buildVisibleRows(
2425
2472
  state.assetRows,
2473
+ state.collapsedOrigins,
2426
2474
  state.collapsedSources,
2427
- state.collapsedRepos
2475
+ state.collapsedRepos,
2476
+ state.originFilter
2428
2477
  );
2429
2478
  clampCursor();
2430
2479
  }
@@ -2448,7 +2497,7 @@ var TABS = {
2448
2497
  rowCount: () => state.visibleRows.length,
2449
2498
  selectableCount: () => state.assetRows.filter(isAsset).length,
2450
2499
  renderRow: (i, sel) => renderAssetRow(state.visibleRows[i], sel),
2451
- footer: " \u2191\u2193/jk navigate \u2190/\u2192 collapse/expand [space/+/-] select [a/\u21B5] apply [i] info Tab switch [q/esc] quit"
2500
+ footer: " \u2191\u2193/jk nav \u2190/\u2192 collapse/expand [space/+/-] select [a/\u21B5] apply [i] info [1]lib [2]src [3]store [0]all Tab switch [q] quit"
2452
2501
  },
2453
2502
  sources: {
2454
2503
  label: "Sources",
@@ -2532,24 +2581,38 @@ function renderHeaderLine(opts) {
2532
2581
  return opts.selected ? pc5.bgWhite(pc5.black(`${line} `.padEnd(state.cols))) : line;
2533
2582
  }
2534
2583
  function renderAssetRow(row, selected) {
2535
- if (row.type === "publisher-header") {
2584
+ if (row.type === "origin-header") {
2585
+ const origin = rowOrigin(row);
2586
+ const meta = ORIGIN_META[origin];
2536
2587
  return renderHeaderLine({
2537
2588
  indent: " ",
2538
- collapsed: state.collapsedSources.has(row.source),
2539
- match: (r) => isAsset(r) && inSource(r, row.source),
2540
- refs: sourceAssetRefs(state.assetRows, row.source),
2589
+ collapsed: state.collapsedOrigins.has(origin),
2590
+ match: (r) => isAsset(r) && rowOrigin(r) === origin,
2591
+ refs: originAssetRefs(state.assetRows, origin),
2592
+ label: `${meta.icon} ${pc5.bold(pc5.cyan(meta.label))}`,
2593
+ selected
2594
+ });
2595
+ }
2596
+ if (row.type === "publisher-header") {
2597
+ const origin = rowOrigin(row);
2598
+ return renderHeaderLine({
2599
+ indent: " ".repeat(3),
2600
+ collapsed: state.collapsedSources.has(srcKey(origin, row.source)),
2601
+ match: (r) => isAsset(r) && inSource(r, origin, row.source),
2602
+ refs: sourceAssetRefs(state.assetRows, origin, row.source),
2541
2603
  label: pc5.bold(pc5.cyan(row.source)),
2542
2604
  selected
2543
2605
  });
2544
2606
  }
2545
2607
  if (row.type === "repo-header") {
2608
+ const origin = rowOrigin(row);
2546
2609
  const slug = row.repo;
2547
2610
  const bare = slug.includes("/") ? slug.slice(slug.indexOf("/") + 1) : slug;
2548
2611
  return renderHeaderLine({
2549
- indent: " ".repeat(3),
2550
- collapsed: state.collapsedRepos.has(`${row.source}:${slug}`),
2551
- match: (r) => isAsset(r) && inRepo(r, row.source, slug),
2552
- refs: repoAssetRefs(state.assetRows, row.source, slug),
2612
+ indent: " ".repeat(5),
2613
+ collapsed: state.collapsedRepos.has(repoKey(origin, row.source, slug)),
2614
+ match: (r) => isAsset(r) && inRepo(r, origin, row.source, slug),
2615
+ refs: repoAssetRefs(state.assetRows, origin, row.source, slug),
2553
2616
  label: pc5.bold(bare),
2554
2617
  selected
2555
2618
  });
@@ -2561,12 +2624,12 @@ function renderAssetRow(row, selected) {
2561
2624
  else if (state.pendingRemoves.has(ref)) status4 = pc5.red("- ");
2562
2625
  else if (row.installed) status4 = pc5.green("\u2713 ");
2563
2626
  else status4 = pc5.dim("\xB7 ");
2564
- const kind = kindColorPad(e.kind, 8);
2627
+ const kind = kindColorPad(e.kind);
2565
2628
  const name = fitWidth(e.name, 30);
2566
2629
  const badge = e.category ? `${pc5.dim("[")}${pc5.cyan(e.category)}${pc5.dim("]")} ` : "";
2567
2630
  const badgeWidth = e.category ? e.category.length + 3 : 0;
2568
- const desc = e.description?.slice(0, Math.max(0, state.cols - 52 - badgeWidth)) ?? "";
2569
- const indent = " ".repeat(e.repo ? 5 : 3);
2631
+ const desc = e.description?.slice(0, Math.max(0, state.cols - 56 - badgeWidth)) ?? "";
2632
+ const indent = " ".repeat(e.repo ? 7 : 5);
2570
2633
  const line = `${indent}${status4} ${kind} ${name} ${badge}${pc5.dim(desc)}`;
2571
2634
  return selected ? pc5.inverse(line.padEnd(state.cols)) : line;
2572
2635
  }
@@ -2587,7 +2650,8 @@ function render() {
2587
2650
  const overhead = 5 + pendingLines + msgLines;
2588
2651
  const maxRows = Math.max(5, (process.stdout.rows || 30) - overhead);
2589
2652
  console.log();
2590
- console.log(` ${pc5.bold("skaile manage")} ${renderTabs()}`);
2653
+ const filterTag = state.tab === "assets" && state.originFilter ? ` ${pc5.bgYellow(pc5.black(` filter: ${ORIGIN_META[state.originFilter].label} `))} ${pc5.dim("[0] clear")}` : "";
2654
+ console.log(` ${pc5.bold("skaile manage")} ${renderTabs()}${filterTag}`);
2591
2655
  console.log(` ${S.rule(state.cols - 4)}`);
2592
2656
  const spec = TABS[state.tab];
2593
2657
  const total = spec.rowCount();
@@ -2680,9 +2744,10 @@ async function showInfo() {
2680
2744
  console.log();
2681
2745
  console.log(` ${kindColor(e.kind)} ${pc5.bold(e.name)}`);
2682
2746
  console.log(` ${S.rule(50)}`);
2747
+ console.log(` origin: ${pc5.dim(ORIGIN_META[rowOrigin(row)].label)}`);
2683
2748
  if (e.version) console.log(` version: ${e.version}`);
2684
2749
  if (e.description) console.log(` description: ${e.description}`);
2685
- if (e.publisher) console.log(` source: ${pc5.dim(e.publisher)}`);
2750
+ if (e.publisher) console.log(` publisher: ${pc5.dim(e.publisher)}`);
2686
2751
  console.log(` manifest: ${pc5.dim(e.source)}`);
2687
2752
  console.log(` installed: ${row.installed ? pc5.green("yes") : pc5.red("no")}`);
2688
2753
  if (e.requires.length) {
@@ -2703,14 +2768,31 @@ async function showInfo() {
2703
2768
  process.stdin.once("data", onData);
2704
2769
  });
2705
2770
  }
2771
+ function setOriginFilter(origin) {
2772
+ if (origin === null || state.originFilter === origin) {
2773
+ state.originFilter = null;
2774
+ } else if (state.seenOrigins.has(origin)) {
2775
+ state.originFilter = origin;
2776
+ state.collapsedOrigins.delete(origin);
2777
+ } else {
2778
+ state.message = pc5.dim(`No ${ORIGIN_META[origin].label} assets to show.`);
2779
+ return;
2780
+ }
2781
+ state.cursor = 0;
2782
+ rebuildVisible();
2783
+ }
2706
2784
  function expandUnderCursor() {
2707
2785
  const row = state.visibleRows[state.cursor];
2708
2786
  if (!row) return;
2709
- if (row.type === "publisher-header" && state.collapsedSources.has(row.source)) {
2710
- state.collapsedSources.delete(row.source);
2787
+ const origin = rowOrigin(row);
2788
+ if (row.type === "origin-header" && state.collapsedOrigins.has(origin)) {
2789
+ state.collapsedOrigins.delete(origin);
2790
+ rebuildVisible();
2791
+ } else if (row.type === "publisher-header" && state.collapsedSources.has(srcKey(origin, row.source))) {
2792
+ state.collapsedSources.delete(srcKey(origin, row.source));
2711
2793
  rebuildVisible();
2712
2794
  } else if (row.type === "repo-header") {
2713
- const dk = `${row.source}:${row.repo}`;
2795
+ const dk = repoKey(origin, row.source, row.repo);
2714
2796
  if (state.collapsedRepos.has(dk)) {
2715
2797
  state.collapsedRepos.delete(dk);
2716
2798
  rebuildVisible();
@@ -2720,15 +2802,31 @@ function expandUnderCursor() {
2720
2802
  function collapseOrJumpUnderCursor() {
2721
2803
  const row = state.visibleRows[state.cursor];
2722
2804
  if (!row) return;
2805
+ const origin = rowOrigin(row);
2806
+ if (row.type === "origin-header") {
2807
+ if (!state.collapsedOrigins.has(origin)) {
2808
+ state.collapsedOrigins.add(origin);
2809
+ rebuildVisible();
2810
+ }
2811
+ return;
2812
+ }
2723
2813
  if (row.type === "publisher-header") {
2724
- if (!state.collapsedSources.has(row.source)) {
2725
- state.collapsedSources.add(row.source);
2814
+ const sk = srcKey(origin, row.source);
2815
+ if (!state.collapsedSources.has(sk)) {
2816
+ state.collapsedSources.add(sk);
2726
2817
  rebuildVisible();
2818
+ } else {
2819
+ const idx2 = findLastIndex(
2820
+ state.visibleRows,
2821
+ state.cursor,
2822
+ (r) => r.type === "origin-header"
2823
+ );
2824
+ if (idx2 >= 0) state.cursor = idx2;
2727
2825
  }
2728
2826
  return;
2729
2827
  }
2730
2828
  if (row.type === "repo-header") {
2731
- const dk = `${row.source}:${row.repo}`;
2829
+ const dk = repoKey(origin, row.source, row.repo);
2732
2830
  if (!state.collapsedRepos.has(dk)) {
2733
2831
  state.collapsedRepos.add(dk);
2734
2832
  rebuildVisible();
@@ -2745,7 +2843,7 @@ function collapseOrJumpUnderCursor() {
2745
2843
  const idx = findLastIndex(
2746
2844
  state.visibleRows,
2747
2845
  state.cursor,
2748
- (r) => r.type === "repo-header" || r.type === "publisher-header"
2846
+ (r) => r.type === "repo-header" || r.type === "publisher-header" || r.type === "origin-header"
2749
2847
  );
2750
2848
  if (idx >= 0) state.cursor = idx;
2751
2849
  }
@@ -2846,7 +2944,12 @@ var KEYMAP = [
2846
2944
  // Enter — apply on assets tab
2847
2945
  { keys: ["\r", "\n"], when: TAB_ASSETS, run: applyChanges },
2848
2946
  // Info — assets only
2849
- { keys: ["i"], when: TAB_ASSETS, run: showInfo }
2947
+ { keys: ["i"], when: TAB_ASSETS, run: showInfo },
2948
+ // Origin filter — assets only. 1/2/3 isolate one origin, 0 clears.
2949
+ { keys: ["1"], when: TAB_ASSETS, run: () => setOriginFilter("library") },
2950
+ { keys: ["2"], when: TAB_ASSETS, run: () => setOriginFilter("source") },
2951
+ { keys: ["3"], when: TAB_ASSETS, run: () => setOriginFilter("store") },
2952
+ { keys: ["0"], when: TAB_ASSETS, run: () => setOriginFilter(null) }
2850
2953
  ];
2851
2954
  async function dispatchKey(key) {
2852
2955
  for (const b of KEYMAP) {
@@ -3717,7 +3820,7 @@ function action2(fn) {
3717
3820
  };
3718
3821
  }
3719
3822
  async function reconcileAndReport(projectDir, plugins) {
3720
- const { reconcilePlugins } = await import('../plugin-store-O5VR45CA.js');
3823
+ const { reconcilePlugins } = await import('../plugin-store-GL5VKYUA.js');
3721
3824
  if (plugins.length === 0) {
3722
3825
  logInfo("No plugins declared \u2014 nothing to reconcile.");
3723
3826
  return;
@@ -3733,7 +3836,7 @@ async function reconcileAndReport(projectDir, plugins) {
3733
3836
  async function runInstall2(spec, opts) {
3734
3837
  const projectDir = path15__default.resolve(opts.projectDir);
3735
3838
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3736
- const { specName } = await import('../plugin-store-O5VR45CA.js');
3839
+ const { specName } = await import('../plugin-store-GL5VKYUA.js');
3737
3840
  const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3738
3841
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3739
3842
  const replaced = editor.addPlugin(spec, specName);
@@ -3745,7 +3848,7 @@ async function runInstall2(spec, opts) {
3745
3848
  async function runRemove(name, opts) {
3746
3849
  const projectDir = path15__default.resolve(opts.projectDir);
3747
3850
  const { WorkspaceYamlEditor: WorkspaceYamlEditor2 } = await import('../core/index.js');
3748
- const { specName } = await import('../plugin-store-O5VR45CA.js');
3851
+ const { specName } = await import('../plugin-store-GL5VKYUA.js');
3749
3852
  const yamlPath = path15__default.join(projectDir, "skaile.yaml");
3750
3853
  const editor = WorkspaceYamlEditor2.load(yamlPath);
3751
3854
  const removed = editor.removePlugin(name, specName);
@@ -3773,7 +3876,7 @@ async function runList(opts) {
3773
3876
  const registry = createPluginRegistry();
3774
3877
  if (declared.length > 0) {
3775
3878
  try {
3776
- const { loadPlugins } = await import('../plugin-store-O5VR45CA.js');
3879
+ const { loadPlugins } = await import('../plugin-store-GL5VKYUA.js');
3777
3880
  const result = await loadPlugins(projectDir, declared, registry);
3778
3881
  for (const f of result.failed) logWarn(f.error);
3779
3882
  } catch (err) {
@@ -3984,7 +4087,7 @@ function makeInstallCommand() {
3984
4087
  const spinner6 = p5.spinner();
3985
4088
  spinner6.start(`Installing ${ref}`);
3986
4089
  try {
3987
- const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-WYASW4BH.js');
4090
+ const { openCatalogSource: openCatalogSource2, openLibrary: openLibrary2 } = await import('../open-library-3VJY74LQ.js');
3988
4091
  const catalog = await openCatalogSource2({ projectDir: path15__default.resolve(opts.projectDir) });
3989
4092
  if (!supportsInstallManifest(catalog)) {
3990
4093
  throw new Error(
@@ -4016,7 +4119,7 @@ function makeInstallCommand() {
4016
4119
  }
4017
4120
  const projectDir = path15__default.resolve(opts.projectDir);
4018
4121
  try {
4019
- const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
4122
+ const { ensureSourcesCloned } = await import('../ensure-sources-BNSRO5G7.js');
4020
4123
  const hydrate = ensureSourcesCloned(projectDir, { quiet: true });
4021
4124
  if (hydrate.cloned.length > 0) {
4022
4125
  logOk(`Cloned source(s): ${hydrate.cloned.join(", ")}`);
@@ -4451,12 +4554,12 @@ function makeServeCommand() {
4451
4554
  );
4452
4555
  }
4453
4556
  async function ensurePluginsLoadedForServe(projectDir) {
4454
- const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-LTN3HMD3.js');
4557
+ const { logInfo: logInfo2, logWarn: logWarn2 } = await import('../helpers-F4NZ66VD.js');
4455
4558
  try {
4456
4559
  const { resolveSkWorkspaceConfig: resolveSkWorkspaceConfig2 } = await import('../core/index.js');
4457
4560
  const config = resolveSkWorkspaceConfig2(projectDir);
4458
4561
  if (!config.plugins || config.plugins.length === 0) return;
4459
- const { ensurePluginsLoaded } = await import('../plugin-store-O5VR45CA.js');
4562
+ const { ensurePluginsLoaded } = await import('../plugin-store-GL5VKYUA.js');
4460
4563
  const { pluginRegistry } = await import('../plugin-registry/index.js');
4461
4564
  const result = await ensurePluginsLoaded(projectDir, config.plugins, pluginRegistry);
4462
4565
  if (result.loaded.length > 0) {
@@ -4470,14 +4573,14 @@ async function ensurePluginsLoadedForServe(projectDir) {
4470
4573
  }
4471
4574
  }
4472
4575
  async function runCompileTest(opts) {
4473
- const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-LTN3HMD3.js');
4576
+ const { logOk: logOk2, logErr: logErr2, logInfo: logInfo2, S: S2 } = await import('../helpers-F4NZ66VD.js');
4474
4577
  const { tmpdir } = await import('os');
4475
4578
  const { dirname: dirname3, join: join5, resolve: resolve4 } = await import('path');
4476
4579
  const { fileURLToPath: fileURLToPath2 } = await import('url');
4477
4580
  const { unlinkSync, existsSync: existsSync12 } = await import('fs');
4478
4581
  const { spawn } = await import('child_process');
4479
4582
  const { portableSpawnSync: portableSpawnSync2 } = await import('../core/index.js');
4480
- const { MONOREPO_ROOT } = await import('../paths-BMW6JYW6.js');
4583
+ const { MONOREPO_ROOT } = await import('../paths-CE66L3AL.js');
4481
4584
  if (MONOREPO_ROOT === null) {
4482
4585
  logErr2("--compile-test is only available inside the skaile-dev workspace.");
4483
4586
  logInfo2("Run it from a checkout of skaile-ai/skaile-dev (the monorepo shell).");
@@ -6478,7 +6581,7 @@ program.command("init [project-dir]").description("Initialize a project director
6478
6581
  );
6479
6582
  }
6480
6583
  try {
6481
- const { ensureSourcesCloned } = await import('../ensure-sources-CVULUVH4.js');
6584
+ const { ensureSourcesCloned } = await import('../ensure-sources-BNSRO5G7.js');
6482
6585
  const hydrate = ensureSourcesCloned(resolved, { quiet: true });
6483
6586
  for (const n of hydrate.cloned) created.push(`~/.skaile/sources/${n}/`);
6484
6587
  if (hydrate.failed.length > 0) {
@@ -6504,7 +6607,7 @@ program.command("init [project-dir]").description("Initialize a project director
6504
6607
  console.log();
6505
6608
  });
6506
6609
  program.command("setup").description("Interactive provider setup wizard").action(async () => {
6507
- const { cmdSetup } = await import('../setup-YNLFR5GB.js');
6610
+ const { cmdSetup } = await import('../setup-4YMN2BDU.js');
6508
6611
  await cmdSetup([], { projectDir: process.cwd() });
6509
6612
  });
6510
6613
  program.addCommand(makeInstallCommand());