@skaile/workspaces 0.22.0-beta.1 → 0.22.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 (164) hide show
  1. package/CHANGELOG.md +380 -0
  2. package/dist/{asset-feeds-QXCSAJRN.js → asset-feeds-Y2CDCM3W.js} +13 -14
  3. package/dist/asset-feeds-Y2CDCM3W.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/asset-manager/src/index.d.ts.map +1 -1
  7. package/dist/base-assets/connectors/deploy.js +7 -7
  8. package/dist/base-assets/connectors/devserver.js +7 -7
  9. package/dist/base-assets/connectors/flow/adapter.js +7 -7
  10. package/dist/base-assets/connectors/flow/run-flow.js +8 -8
  11. package/dist/base-assets/connectors/flow.js +7 -7
  12. package/dist/base-assets/connectors/git/driver.d.ts.map +1 -1
  13. package/dist/base-assets/connectors/git.js +7 -7
  14. package/dist/base-assets/connectors/gmail.js +7 -7
  15. package/dist/base-assets/connectors/googledrive.js +7 -7
  16. package/dist/base-assets/connectors/local.js +7 -7
  17. package/dist/base-assets/connectors/mattermost.js +7 -7
  18. package/dist/base-assets/connectors/memory.js +7 -7
  19. package/dist/base-assets/connectors/minio.js +7 -7
  20. package/dist/base-assets/connectors/postgres.js +7 -7
  21. package/dist/base-assets/connectors/s3.js +7 -7
  22. package/dist/base-assets/connectors/sharepoint.js +7 -7
  23. package/dist/base-assets/connectors/sqlite.js +7 -7
  24. package/dist/base-assets/connectors/static-server.js +7 -7
  25. package/dist/base-assets/connectors/tunnel.js +7 -7
  26. package/dist/base-assets/connectors/webdav.js +7 -7
  27. package/dist/base-assets/connectors/xstate-store.js +7 -7
  28. package/dist/base-assets/connectors/xstate.js +7 -7
  29. package/dist/{chunk-PTIHB2TV.js → chunk-2RYQERIT.js} +4 -4
  30. package/dist/{chunk-PTIHB2TV.js.map → chunk-2RYQERIT.js.map} +1 -1
  31. package/dist/chunk-32NA4TVC.js +30 -0
  32. package/dist/chunk-32NA4TVC.js.map +1 -0
  33. package/dist/{chunk-DKGDOALM.js → chunk-53UNDY6K.js} +5 -5
  34. package/dist/{chunk-DKGDOALM.js.map → chunk-53UNDY6K.js.map} +1 -1
  35. package/dist/{chunk-VCYXVP2S.js → chunk-7HSXUKNB.js} +24 -13
  36. package/dist/chunk-7HSXUKNB.js.map +1 -0
  37. package/dist/chunk-7QBNJTTQ.js +3 -0
  38. package/dist/{chunk-W2O5LWYU.js.map → chunk-7QBNJTTQ.js.map} +1 -1
  39. package/dist/{chunk-UMOENHVH.js → chunk-ETMUGBHF.js} +3 -3
  40. package/dist/{chunk-UMOENHVH.js.map → chunk-ETMUGBHF.js.map} +1 -1
  41. package/dist/{chunk-7PTP3SQJ.js → chunk-GTS2FODO.js} +32 -7
  42. package/dist/chunk-GTS2FODO.js.map +1 -0
  43. package/dist/{chunk-D7K72XEY.js → chunk-JN2CUVSU.js} +3 -3
  44. package/dist/{chunk-D7K72XEY.js.map → chunk-JN2CUVSU.js.map} +1 -1
  45. package/dist/{chunk-3ECS5PFD.js → chunk-K2HDYSAM.js} +4 -4
  46. package/dist/{chunk-3ECS5PFD.js.map → chunk-K2HDYSAM.js.map} +1 -1
  47. package/dist/{chunk-4AZKT2BU.js → chunk-K7WPR77X.js} +33 -50
  48. package/dist/chunk-K7WPR77X.js.map +1 -0
  49. package/dist/{chunk-JHF66MCK.js → chunk-MNAHNDUI.js} +5 -3
  50. package/dist/chunk-MNAHNDUI.js.map +1 -0
  51. package/dist/{chunk-APAOQLPT.js → chunk-NBJ5TOEC.js} +3 -3
  52. package/dist/{chunk-APAOQLPT.js.map → chunk-NBJ5TOEC.js.map} +1 -1
  53. package/dist/{chunk-NJLHHZIW.js → chunk-NDD5VMN5.js} +2 -2
  54. package/dist/{chunk-NJLHHZIW.js.map → chunk-NDD5VMN5.js.map} +1 -1
  55. package/dist/{chunk-LT4DLEYE.js → chunk-OJN25VJO.js} +24 -8
  56. package/dist/chunk-OJN25VJO.js.map +1 -0
  57. package/dist/{chunk-GFNW72LW.js → chunk-PFOXL4SH.js} +4 -4
  58. package/dist/{chunk-GFNW72LW.js.map → chunk-PFOXL4SH.js.map} +1 -1
  59. package/dist/{chunk-V3QMSM5I.js → chunk-SKXCTV55.js} +13 -14
  60. package/dist/chunk-SKXCTV55.js.map +1 -0
  61. package/dist/{chunk-J3VKAEQP.js → chunk-V5TBKO5Q.js} +64 -14
  62. package/dist/chunk-V5TBKO5Q.js.map +1 -0
  63. package/dist/{chunk-I3UEM3FX.js → chunk-VUCPJBAG.js} +9 -4
  64. package/dist/chunk-VUCPJBAG.js.map +1 -0
  65. package/dist/{chunk-XIHFJVOD.js → chunk-WH2EB2SF.js} +3 -3
  66. package/dist/{chunk-XIHFJVOD.js.map → chunk-WH2EB2SF.js.map} +1 -1
  67. package/dist/{chunk-PBWMV5GM.js → chunk-WQ7DE5UC.js} +18 -4
  68. package/dist/chunk-WQ7DE5UC.js.map +1 -0
  69. package/dist/cli/index.js +199 -200
  70. package/dist/cli/index.js.map +1 -1
  71. package/dist/cli/src/commands/manage.d.ts +23 -32
  72. package/dist/cli/src/commands/manage.d.ts.map +1 -1
  73. package/dist/cli/src/commands/npx.d.ts +5 -3
  74. package/dist/cli/src/commands/npx.d.ts.map +1 -1
  75. package/dist/cli/src/commands/source.d.ts +7 -0
  76. package/dist/cli/src/commands/source.d.ts.map +1 -1
  77. package/dist/connectors/config.js +6 -6
  78. package/dist/connectors/index.js +7 -7
  79. package/dist/core/index.js +5 -5
  80. package/dist/core/manifest.js +2 -2
  81. package/dist/core/models.js +1 -1
  82. package/dist/core/runtime-assets.js +4 -4
  83. package/dist/core/src/index.d.ts +2 -2
  84. package/dist/core/src/index.d.ts.map +1 -1
  85. package/dist/core/src/manifest.d.ts +16 -0
  86. package/dist/core/src/manifest.d.ts.map +1 -1
  87. package/dist/core/src/models.d.ts +8 -2
  88. package/dist/core/src/models.d.ts.map +1 -1
  89. package/dist/core/src/repo-manager.d.ts +17 -2
  90. package/dist/core/src/repo-manager.d.ts.map +1 -1
  91. package/dist/core/src/walker.d.ts +4 -0
  92. package/dist/core/src/walker.d.ts.map +1 -1
  93. package/dist/core/src/workspace-config.d.ts +14 -0
  94. package/dist/core/src/workspace-config.d.ts.map +1 -1
  95. package/dist/core/workspace-config.js +3 -3
  96. package/dist/deploy/index.js +138 -42
  97. package/dist/deploy/index.js.map +1 -1
  98. package/dist/deploy/src/index.d.ts +4 -3
  99. package/dist/deploy/src/index.d.ts.map +1 -1
  100. package/dist/deploy/src/targets/container-runtime.d.ts.map +1 -1
  101. package/dist/deploy/src/targets/local.d.ts.map +1 -1
  102. package/dist/deploy/src/targets/nix.d.ts +36 -0
  103. package/dist/deploy/src/targets/nix.d.ts.map +1 -0
  104. package/dist/deploy/src/targets/process-handle.d.ts +34 -0
  105. package/dist/deploy/src/targets/process-handle.d.ts.map +1 -0
  106. package/dist/discovery/index.js +3 -3
  107. package/dist/{ensure-sources-SL2S4UEX.js → ensure-sources-REWWBH2K.js} +9 -9
  108. package/dist/{ensure-sources-SL2S4UEX.js.map → ensure-sources-REWWBH2K.js.map} +1 -1
  109. package/dist/library/index.js +4 -4
  110. package/dist/open-library-CT4VVESU.js +13 -0
  111. package/dist/{open-library-M4DB3D3J.js.map → open-library-CT4VVESU.js.map} +1 -1
  112. package/dist/plugin-registry/src/context.d.ts +30 -1
  113. package/dist/plugin-registry/src/context.d.ts.map +1 -1
  114. package/dist/plugin-registry/src/index.d.ts +1 -1
  115. package/dist/plugin-registry/src/index.d.ts.map +1 -1
  116. package/dist/{plugin-store-AJ3FGXIC.js → plugin-store-QS7TC5HY.js} +7 -7
  117. package/dist/{plugin-store-AJ3FGXIC.js.map → plugin-store-QS7TC5HY.js.map} +1 -1
  118. package/dist/plugins/src/catalog-source.d.ts +5 -0
  119. package/dist/plugins/src/catalog-source.d.ts.map +1 -1
  120. package/dist/runner/index.js +13 -12
  121. package/dist/runner/src/serve.d.ts +7 -0
  122. package/dist/runner/src/serve.d.ts.map +1 -1
  123. package/dist/sdk/asset-manager.js +7 -7
  124. package/dist/sdk/core.js +5 -5
  125. package/dist/sdk/index.js +13 -12
  126. package/dist/sdk/index.js.map +1 -1
  127. package/dist/sdk/runner.js +13 -12
  128. package/dist/sdk/transport/ws/client.js +2 -1
  129. package/dist/sdk/transport/ws/server.js +2 -1
  130. package/dist/sdk/transport/ws.js +4 -3
  131. package/dist/sdk/transport.js +4 -3
  132. package/dist/{setup-GBSQX7JF.js → setup-F6DGKL7J.js} +7 -7
  133. package/dist/{setup-GBSQX7JF.js.map → setup-F6DGKL7J.js.map} +1 -1
  134. package/dist/store-client-JP642EEI.js +14 -0
  135. package/dist/{store-client-5WBRUC5U.js.map → store-client-JP642EEI.js.map} +1 -1
  136. package/dist/transport/index.js +4 -3
  137. package/dist/transport/src/ws/auth.d.ts +34 -0
  138. package/dist/transport/src/ws/auth.d.ts.map +1 -0
  139. package/dist/transport/src/ws/client.d.ts +4 -0
  140. package/dist/transport/src/ws/client.d.ts.map +1 -1
  141. package/dist/transport/src/ws/index.d.ts +3 -2
  142. package/dist/transport/src/ws/index.d.ts.map +1 -1
  143. package/dist/transport/src/ws/server.d.ts +5 -0
  144. package/dist/transport/src/ws/server.d.ts.map +1 -1
  145. package/dist/transport/ws/client.js +2 -1
  146. package/dist/transport/ws/server.js +2 -1
  147. package/dist/transport/ws.js +4 -3
  148. package/dist/tui/index.js +13 -12
  149. package/dist/tui/index.js.map +1 -1
  150. package/dist/workspace-plugin/index.js +1 -1
  151. package/package.json +1 -1
  152. package/dist/asset-feeds-QXCSAJRN.js.map +0 -1
  153. package/dist/chunk-4AZKT2BU.js.map +0 -1
  154. package/dist/chunk-7PTP3SQJ.js.map +0 -1
  155. package/dist/chunk-I3UEM3FX.js.map +0 -1
  156. package/dist/chunk-J3VKAEQP.js.map +0 -1
  157. package/dist/chunk-JHF66MCK.js.map +0 -1
  158. package/dist/chunk-LT4DLEYE.js.map +0 -1
  159. package/dist/chunk-PBWMV5GM.js.map +0 -1
  160. package/dist/chunk-V3QMSM5I.js.map +0 -1
  161. package/dist/chunk-VCYXVP2S.js.map +0 -1
  162. package/dist/chunk-W2O5LWYU.js +0 -3
  163. package/dist/open-library-M4DB3D3J.js +0 -13
  164. package/dist/store-client-5WBRUC5U.js +0 -14
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../library/src/library.ts","../library/src/config.ts","../library/src/local/schema.ts","../library/src/local/sidecar-paths.ts","../library/src/local/store-paths.ts","../library/src/local/db.ts","../library/src/install/install-from-manifest.ts","../library/src/local/library.ts","../library/src/user-library.ts","../library/src/sync/git-driver.ts","../library/src/sync/local-driver.ts","../library/src/local/library-manager.ts","../library/src/local/sidecar-git.ts","../library/src/workspace-config.ts","../library/src/sync/manifest-writeback.ts","../library/src/migration.ts","../library/src/pin-resolver.ts","../library/src/local/local-catalog-source.ts","../library/src/remote/cache.ts","../library/src/remote/remote-catalog-source.ts","../library/src/remote/rest-catalog-source.ts","../library/src/knowledge/knowledge-manifest.ts","../library/src/knowledge/knowledge-kind-provider.ts","../library/src/preset/parse.ts","../library/src/preset/resolve-item.ts","../library/src/preset/placeholders.ts","../library/src/preset/interpolate.ts","../library/src/preset/apply.ts","../library/src/preset/upgrade.ts"],"names":["z","path","fs","yamlParse","yamlStringify","path2","os2","fs2","path3","os3","fs3","slugify","fs4","os4","defaultIndexPath","join","dirname","path5","fs5","spawnSync","fetch","rowToLibrary","eq","crypto2","fs6","path6","fs7","path7","path8","fs8","path9","fs9","path10","fs10","path11","fs11","path12","os5","crypto3","stale","filterKey","actual","text","DEFAULT_TTL_MS","defaultFetch","pickString","CATALOG_REQUEST_TIMEOUT_MS","z3","path13","fs13","instances","subscriptions"],"mappings":"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","file":"chunk-JHF66MCK.js","sourcesContent":["/**\n * IAssetIndex — single-interface contract for the asset cache layer.\n *\n * Two implementations:\n * - LocalIndex (SQLite at ~/.skaile/index.db, Phase 1)\n * - PlatformIndex (Postgres, Phase 3)\n *\n * @docLink packages/library/concepts#i-asset-index\n */\n\n// ---------------------------------------------------------------------------\n// Asset kind\n//\n// Relaxed to `string` in Phase 1.7 to support pluggable extension kinds.\n// The KNOWN_ASSET_KINDS constant provides the set of kinds that shipped\n// as core + initial extensions. Third-party providers can register any\n// string as a kind at runtime.\n// ---------------------------------------------------------------------------\n\n/**\n * All known asset kinds shipped with the framework (9 core + 2 initial\n * extensions). Third-party providers can register any string as a kind at\n * runtime via the AssetKindRegistry.\n *\n * @docLink packages/library/concepts#asset-kind\n */\nexport const KNOWN_ASSET_KINDS = [\n \"skill\",\n \"agent\",\n \"connector\",\n \"mount\",\n \"flow\",\n \"contract\",\n \"prompt\",\n \"mcp-server\",\n \"knowledge\",\n \"persona\",\n \"ruleset\",\n] as const;\n\n/** Known asset kind (for type narrowing where the old enum was used). */\nexport type KnownAssetKind = (typeof KNOWN_ASSET_KINDS)[number];\n\n/**\n * Asset kind — any string. Pluggable kinds are registered at runtime via\n * `IAssetKindRegistry`. Use `KNOWN_ASSET_KINDS` for the built-in set.\n *\n * @docLink packages/library/concepts#asset-kind\n */\nexport type AssetKind = string;\n\n// ---------------------------------------------------------------------------\n// Pin policy — single source of truth for the three allowed values.\n// workspace-config.ts derives PinPolicySchema from this constant.\n// ---------------------------------------------------------------------------\n\n/**\n * Tuple of all allowed version-pin policy values.\n *\n * Used to derive the `PinPolicy` type and the `PinPolicySchema` zod enum in\n * `workspace-config.ts`.\n *\n * @docLink packages/library/concepts#pin-policy\n */\nexport const PIN_POLICIES = [\"exact\", \"minor-track\", \"latest\"] as const;\n\n/**\n * Version-pin strategy for an Instance or Subscription.\n *\n * - `exact` — pins to the exact version in `defRef`; never auto-upgrades.\n * - `minor-track` — allows compatible minor/patch updates (>=X.Y, <X+1).\n * - `latest` — always resolves to the highest available version.\n *\n * @docLink packages/library/concepts#pin-policy\n */\nexport type PinPolicy = (typeof PIN_POLICIES)[number];\n\n// ---------------------------------------------------------------------------\n// Sync result\n//\n// The `Source` interface (and its `SourceType` / `AddSourceInput` siblings)\n// were merged into `Library` in `user-library.ts` as part of the 2026-05-27\n// vocabulary cleanup. Use `Library` / `AddLibraryInput` from there.\n// ---------------------------------------------------------------------------\n\n/**\n * Result returned by {@link IAssetIndex.syncLibrary}.\n *\n * @docLink packages/library/concepts#library\n */\nexport interface SyncResult {\n /** The library ID that was synced. */\n libraryId: string;\n /** Total number of assets discovered in the tree. */\n assetsFound: number;\n /** Number of asset definitions created or updated in the cache. */\n assetsUpdated: number;\n /** Non-fatal per-asset errors encountered during sync. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// AssetDefinition (cached from Catalog)\n// ---------------------------------------------------------------------------\n\n/**\n * Cached asset metadata entry in the Library, sourced from a Catalog sync.\n *\n * The `id` field is the canonical ref (`<publisher>/<name>@<version>`).\n *\n * @docLink packages/library/concepts#asset-definition\n */\nexport interface AssetDefinition {\n /** Canonical ref: `<publisher>/<name>@<version>` */\n id: string;\n /** Asset kind (skill, agent, connector, etc.). */\n kind: AssetKind;\n /** Publisher identifier (namespace owner). */\n publisher: string;\n /** Asset name within the publisher namespace. */\n name: string;\n /** Semantic version string. */\n version: string;\n /** SHA-256 content hash for integrity verification. */\n sha256?: string;\n /** Human-readable asset description from the manifest. */\n description?: string;\n /** SPDX license identifier from the manifest. */\n license?: string;\n /** Category tag from the manifest. */\n category?: string;\n /** Full parsed manifest as JSON-safe object. */\n manifest: Record<string, unknown>;\n /** Library that provided this definition (null when library was removed). */\n libraryId?: string;\n /**\n * Version of the IAssetKindProvider that produced this cached entry.\n * Independent of the asset's own version — tracks schema/logic evolution.\n * Mismatch between stored and current provider version is informational\n * WARN, not blocking (design decision A6).\n */\n kindProviderVersion?: string;\n /** Timestamp when the definition was first cached. */\n cachedAt: Date;\n /** Timestamp of the last cache update. */\n updatedAt: Date;\n}\n\n/**\n * Filter options for {@link IAssetIndex.listAssetDefs}.\n *\n * @docLink packages/library/concepts#asset-definition\n */\nexport interface AssetFilter {\n /** Filter to a specific asset kind. */\n kind?: AssetKind;\n /** Filter to a specific publisher namespace. */\n publisher?: string;\n /** Prefix match on the full `<publisher>/<name>` ref. */\n prefix?: string;\n /** Filter to assets from a specific library. */\n libraryId?: string;\n /** Maximum number of results to return. */\n limit?: number;\n /** Number of results to skip (for pagination). */\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Instance (configured asset with credential ref)\n// ---------------------------------------------------------------------------\n\n/**\n * A configured asset Instance — an `AssetDefinition` bound with user config and\n * an optional opaque credential reference.\n *\n * Instances are workspace-agnostic; workspaces link to them via `Subscription`.\n *\n * @docLink packages/library/concepts#instance\n */\nexport interface Instance {\n /** UUID primary key. */\n id: string;\n /** Asset definition ref (may include version range: `@skaile/gmail@^1.4`). */\n defRef: string;\n /** Version-pin strategy for this instance. */\n defPin: PinPolicy;\n /** Instance-specific configuration merged with the asset defaults at runtime. */\n config: Record<string, unknown>;\n /** Opaque handle to SecretsRouter -- never a secret value. */\n credentialRef?: string;\n /** Timestamp when the instance was created. */\n createdAt: Date;\n /** Timestamp of the last config update. */\n updatedAt: Date;\n /** Identity that created the instance (e.g. `preset:<ref>`). */\n createdBy?: string;\n /**\n * Immutable upstream git commit SHA the asset bytes were installed from\n * (pointer-only install path). Absent for instances created via\n * {@link IAssetIndex.createInstance} or preset apply.\n */\n sourceCommitSha?: string;\n}\n\n/**\n * Input shape for {@link IAssetIndex.createInstance}.\n *\n * @docLink packages/library/concepts#instance\n */\nexport interface CreateInstanceInput {\n /** Canonical asset definition ref. */\n defRef: string;\n /** Version-pin policy; defaults to `minor-track`. */\n defPin?: PinPolicy;\n /** Initial configuration for the instance. */\n config?: Record<string, unknown>;\n /** Opaque credential reference from the SecretsRouter. */\n credentialRef?: string;\n /** Optional creator identity for audit trail. */\n createdBy?: string;\n}\n\n/**\n * Partial update shape for {@link IAssetIndex.updateInstance}.\n *\n * @docLink packages/library/concepts#instance\n */\nexport interface UpdateInstanceInput {\n /** New configuration (replaces existing config). */\n config?: Record<string, unknown>;\n /** Updated credential reference. */\n credentialRef?: string;\n /** Updated pin policy. */\n defPin?: PinPolicy;\n}\n\n/**\n * Filter options for {@link IAssetIndex.listInstances}.\n *\n * @docLink packages/library/concepts#instance\n */\nexport interface InstanceFilter {\n /** Filter by asset definition ref. */\n defRef?: string;\n /** Filter by pin policy. */\n defPin?: PinPolicy;\n /** Maximum number of results to return. */\n limit?: number;\n /** Number of results to skip (for pagination). */\n offset?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Subscription\n// ---------------------------------------------------------------------------\n\n/**\n * A Subscription links a workspace to an Instance, recording its pin policy.\n *\n * The unique constraint is `(workspaceId, instanceId)` — a workspace can only\n * subscribe to a given Instance once.\n *\n * @docLink packages/library/concepts#subscription\n */\nexport interface Subscription {\n /** UUID primary key. */\n id: string;\n /** Workspace path or identifier. */\n workspaceId: string;\n /** The Instance this subscription refers to. */\n instanceId: string;\n /** Pin policy recorded at subscription time. */\n pinPolicy: PinPolicy;\n /** Timestamp when the subscription was created. */\n subscribedAt: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\n/**\n * Base error class for all Library-layer errors.\n *\n * All subclasses carry a machine-readable `code` string that callers can\n * switch on without parsing the message.\n *\n * @docLink packages/library/concepts#errors\n */\nexport class LibraryError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = \"LibraryError\";\n }\n}\n\n/**\n * Thrown when a referenced library ID does not exist (e.g. by\n * {@link IAssetIndex.removeSource} / {@link IAssetIndex.syncSource}).\n *\n * @docLink packages/library/concepts#errors\n */\nexport class SourceNotFoundError extends LibraryError {\n constructor(id: string) {\n super(`Library not found: ${id}`, \"LIBRARY_NOT_FOUND\");\n this.name = \"SourceNotFoundError\";\n }\n}\n\n/**\n * Thrown by {@link IAssetIndex.getInstance}, {@link IAssetIndex.updateInstance},\n * and {@link IAssetIndex.deleteInstance} when the given instance ID does not exist.\n *\n * @docLink packages/library/concepts#errors\n */\nexport class InstanceNotFoundError extends LibraryError {\n constructor(id: string) {\n super(`Instance not found: ${id}`, \"INSTANCE_NOT_FOUND\");\n this.name = \"InstanceNotFoundError\";\n }\n}\n\n/**\n * Thrown by {@link IAssetIndex.unsubscribe} when the given subscription ID does not exist.\n *\n * @docLink packages/library/concepts#errors\n */\nexport class SubscriptionNotFoundError extends LibraryError {\n constructor(id: string) {\n super(`Subscription not found: ${id}`, \"SUBSCRIPTION_NOT_FOUND\");\n this.name = \"SubscriptionNotFoundError\";\n }\n}\n\n/**\n * Thrown by {@link IAssetIndex.subscribe} when the workspace already has an active\n * subscription to the same Instance.\n *\n * @docLink packages/library/concepts#errors\n */\nexport class DuplicateSubscriptionError extends LibraryError {\n constructor(workspaceId: string, instanceId: string) {\n super(\n `Workspace \"${workspaceId}\" already subscribes to instance \"${instanceId}\"`,\n \"DUPLICATE_SUBSCRIPTION\",\n );\n this.name = \"DuplicateSubscriptionError\";\n }\n}\n\n/**\n * Thrown by {@link IAssetIndex.deleteInstance} when the Instance has active\n * Subscriptions and `{ cascade: true }` was not passed.\n *\n * @docLink packages/library/concepts#errors\n */\nexport class InstanceHasConsumersError extends LibraryError {\n constructor(instanceId: string, count: number) {\n super(\n `Instance \"${instanceId}\" has ${count} active subscription(s). Use { cascade: true } to force delete.`,\n \"INSTANCE_HAS_CONSUMERS\",\n );\n this.name = \"InstanceHasConsumersError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// IAssetIndex interface (formerly ILibrary — renamed 2026-05-13 for the\n// Libraries redesign; the name \"library\" is now reserved for the user-facing\n// concept defined in user-library.ts).\n//\n// This interface exposes only the asset cache surface — definitions,\n// instances, and subscriptions. Library lifecycle (libraries CRUD) lives on\n// the concrete `LocalIndex` class plus the `LibraryManager`.\n// ---------------------------------------------------------------------------\n\n/**\n * Single-interface contract for the asset cache layer.\n *\n * @docLink packages/library/concepts#i-asset-index\n */\nexport interface IAssetIndex {\n /** Look up a cached AssetDefinition by its canonical ref. */\n getAssetDef(ref: string): Promise<AssetDefinition | null>;\n\n /** List cached AssetDefinitions, optionally filtered. */\n listAssetDefs(filter?: AssetFilter): Promise<AssetDefinition[]>;\n\n createInstance(input: CreateInstanceInput): Promise<Instance>;\n getInstance(id: string): Promise<Instance | null>;\n listInstances(filter?: InstanceFilter): Promise<Instance[]>;\n updateInstance(id: string, patch: UpdateInstanceInput): Promise<Instance>;\n deleteInstance(id: string, opts?: { cascade?: boolean }): Promise<void>;\n\n subscribe(workspaceId: string, instanceId: string, pin: PinPolicy): Promise<Subscription>;\n unsubscribe(subscriptionId: string): Promise<void>;\n listSubscriptions(workspaceId: string): Promise<Subscription[]>;\n getConsumptionGraph(instanceId: string): Promise<Subscription[]>;\n}\n","/**\n * Composable library + catalog configuration.\n *\n * Resolution order (later wins):\n * 1. Built-in defaults\n * 2. User-level: ~/.skaile/config.yaml\n * 3. Project-level: <projectDir>/.skaile/config.yaml\n * 4. Explicit overrides (API callers)\n *\n * This is separate from the workspace config (skaile.yaml) which describes\n * what assets are in a project. config.yaml configures library/catalog\n * behaviour globally or per-project.\n *\n * @docLink packages/library/api-reference#config\n */\n\nimport * as z from \"zod\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { parse as yamlParse, stringify as yamlStringify } from \"yaml\";\nimport { PIN_POLICIES } from \"./library.js\";\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\n/**\n * Sentinel value for `catalog.url` that disables the remote catalog entirely\n * and routes the CLI to use {@link LocalCatalogSource} bound to a source\n * registered via `skaile source add <path>`.\n *\n * Used by users who want to stay strictly on local sources (air-gapped repos,\n * private development without a hosted catalog). See Task 2.7 in\n * `_devlog/plans/2026-05-06-asset-store-phase-2-remote-anonymous.md`.\n *\n * @docLink packages/library/api-reference#config\n */\nexport const LOCAL_CATALOG_URL = \"local\" as const;\n\n/**\n * Type-narrowing predicate for the `local` sentinel value of `catalog.url`.\n *\n * Tolerates surrounding whitespace and any letter casing — a user-edited\n * config with `catalog.url: \" Local \"` is treated identically to `local`.\n * Anything else (including non-strings) returns `false`.\n *\n * @docLink packages/library/api-reference#config\n */\nexport function isLocalCatalogUrl(url: string): url is typeof LOCAL_CATALOG_URL {\n return typeof url === \"string\" && url.trim().toLowerCase() === LOCAL_CATALOG_URL;\n}\n\n/**\n * Zod schema for the `catalog:` section of config.yaml.\n *\n * `url` accepts either a valid http(s) URL or the literal sentinel\n * {@link LOCAL_CATALOG_URL} (\"local\", case-insensitive, whitespace-tolerant).\n * The sentinel branch normalises to lower-case \"local\" so downstream code\n * compares via strict equality. Remote-only consumers such as\n * `skaile update --catalog-only` reject the sentinel explicitly.\n *\n * @docLink packages/library/api-reference#config\n */\nexport const CatalogConfigSchema = z.object({\n /** Catalog base URL, or `\"local\"` (case-insensitive) to disable the remote catalog. Default: https://skaile.store */\n url: z\n .union([\n z.string().url(),\n // Accept any casing/whitespace variant of \"local\", normalise to canonical.\n z\n .string()\n .refine((s) => s.trim().toLowerCase() === LOCAL_CATALOG_URL, {\n message: `Expected a valid URL or \"${LOCAL_CATALOG_URL}\"`,\n })\n .transform(() => LOCAL_CATALOG_URL),\n ])\n .optional(),\n /** Cache TTL in seconds. 0 = air-gapped (manual `skaile update` only). */\n cache_ttl: z.number().int().min(0).optional(),\n /**\n * Wire framing to use when talking to a remote catalog.\n * `\"trpc\"` — skaile.store tRPC backend (default for `https://skaile.store`).\n * `\"rest\"` — forge-store REST backend (default for any other URL).\n */\n framing: z.enum([\"trpc\", \"rest\"]).optional(),\n});\n\n/**\n * Zod schema for the `library:` section of config.yaml.\n *\n * @docLink packages/library/api-reference#config\n */\nexport const LibraryConfigSchema = z.object({\n /** Library storage directory. Default: ~/.skaile/libraries */\n dir: z.string().optional(),\n /** Default pin policy for new instances/subscriptions. */\n pin_policy: z.enum(PIN_POLICIES).optional(),\n});\n\n/**\n * Zod schema for the full config.yaml document.\n *\n * @docLink packages/library/api-reference#config\n */\nexport const SkaileConfigSchema = z.object({\n catalog: CatalogConfigSchema.optional(),\n library: LibraryConfigSchema.optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Catalog configuration parsed from `catalog:` in config.yaml.\n *\n * @docLink packages/library/api-reference#config\n */\nexport type CatalogConfig = z.infer<typeof CatalogConfigSchema>;\n\n/**\n * Library configuration parsed from `library:` in config.yaml.\n *\n * @docLink packages/library/api-reference#config\n */\nexport type LibraryConfig = z.infer<typeof LibraryConfigSchema>;\n\n/**\n * Full config.yaml document type.\n *\n * @docLink packages/library/api-reference#config\n */\nexport type SkaileConfig = z.infer<typeof SkaileConfigSchema>;\n\n/**\n * Fully resolved config with all defaults applied.\n *\n * @docLink packages/library/api-reference#config\n */\nexport interface ResolvedSkaileConfig {\n catalog: { url: string; cache_ttl: number; framing: \"trpc\" | \"rest\" };\n library: { dir: string; pin_policy: \"exact\" | \"minor-track\" | \"latest\" };\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\n/** Root of the per-user skaile data directory (`~/.skaile`). */\nexport function skaileHomeDir(): string {\n return path.join(os.homedir(), \".skaile\");\n}\n\nfunction defaultLibraryDir(): string {\n return path.join(skaileHomeDir(), \"libraries\");\n}\n\nfunction defaultIndexPath(): string {\n return path.join(skaileHomeDir(), \"index.db\");\n}\n\n/**\n * Resolve the active library checkouts directory.\n *\n * `SKAILE_LIBRARIES_DIR` overrides the default `~/.skaile/libraries`.\n *\n * @docLink packages/library/api-reference#config\n */\nexport function resolveLibraryDir(): string {\n if (process.env.SKAILE_LIBRARIES_DIR) return process.env.SKAILE_LIBRARIES_DIR;\n return defaultLibraryDir();\n}\n\n/**\n * Resolve the absolute path to the local index SQLite file.\n *\n * `SKAILE_INDEX_PATH` overrides the default `~/.skaile/index.db`.\n *\n * @docLink packages/library/api-reference#config\n */\nexport function resolveIndexPath(): string {\n if (process.env.SKAILE_INDEX_PATH) return process.env.SKAILE_INDEX_PATH;\n return defaultIndexPath();\n}\n\n/**\n * Return the built-in default configuration values.\n *\n * @returns Default catalog URL (skaile.store), 24h TTL, and `~/.skaile/libraries` dir.\n * @docLink packages/library/api-reference#config\n */\nexport function getConfigDefaults(): ResolvedSkaileConfig {\n return {\n catalog: { url: \"https://skaile.store\", cache_ttl: 86400, framing: \"trpc\" },\n library: { dir: defaultLibraryDir(), pin_policy: \"minor-track\" },\n };\n}\n\n// ---------------------------------------------------------------------------\n// File paths\n// ---------------------------------------------------------------------------\n\nconst CONFIG_FILENAME = \"config.yaml\";\n\n/**\n * Return the absolute path to the user-level config file (`~/.skaile/config.yaml`).\n *\n * @docLink packages/library/api-reference#config\n */\nexport function userConfigPath(): string {\n return path.join(os.homedir(), \".skaile\", CONFIG_FILENAME);\n}\n\n/**\n * Return the absolute path to the project-level config file (`.skaile/config.yaml`).\n *\n * @param projectDir - Absolute path to the project root.\n * @docLink packages/library/api-reference#config\n */\nexport function projectConfigPath(projectDir: string): string {\n return path.join(projectDir, \".skaile\", CONFIG_FILENAME);\n}\n\n// ---------------------------------------------------------------------------\n// Load + merge\n// ---------------------------------------------------------------------------\n\nfunction loadConfigFile(filePath: string): Partial<SkaileConfig> | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = yamlParse(content);\n if (!raw || typeof raw !== \"object\") return null;\n return SkaileConfigSchema.partial().parse(raw);\n } catch (err) {\n process.stderr.write(\n `[skaile/config] Warning: ignoring invalid config at ${filePath}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return null;\n }\n}\n\nfunction deepMerge<T extends Record<string, unknown>>(base: T, overlay: Partial<T>): T {\n const result = { ...base };\n for (const key of Object.keys(overlay) as (keyof T)[]) {\n const val = overlay[key];\n if (val === undefined) continue;\n if (\n typeof val === \"object\" &&\n val !== null &&\n !Array.isArray(val) &&\n typeof result[key] === \"object\" &&\n result[key] !== null\n ) {\n result[key] = deepMerge(\n result[key] as Record<string, unknown>,\n val as Record<string, unknown>,\n ) as T[keyof T];\n } else {\n result[key] = val as T[keyof T];\n }\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Options for {@link resolveConfig}.\n *\n * @docLink packages/library/api-reference#config\n */\nexport interface ResolveConfigOptions {\n /** Project directory (loads .skaile/config.yaml from here). */\n projectDir?: string;\n /** Explicit overrides (highest priority). */\n overrides?: Partial<SkaileConfig>;\n /** Override the user config file path (testing). */\n userConfigFile?: string;\n}\n\n/**\n * Resolve the effective library/catalog configuration.\n *\n * Merge order: defaults < user < project < overrides.\n *\n * @docLink packages/library/api-reference#config\n */\nexport function resolveConfig(opts?: ResolveConfigOptions): ResolvedSkaileConfig {\n const defaults = getConfigDefaults();\n let config: Record<string, unknown> = { ...defaults };\n\n // User-level\n const userPath = opts?.userConfigFile ?? userConfigPath();\n const userCfg = loadConfigFile(userPath);\n if (userCfg) config = deepMerge(config, userCfg as Record<string, unknown>);\n\n // Project-level\n let projCfg: Partial<SkaileConfig> | null = null;\n if (opts?.projectDir) {\n projCfg = loadConfigFile(projectConfigPath(opts.projectDir));\n if (projCfg) config = deepMerge(config, projCfg as Record<string, unknown>);\n }\n\n // Explicit overrides\n if (opts?.overrides) config = deepMerge(config, opts.overrides as Record<string, unknown>);\n\n const resolved = config as unknown as ResolvedSkaileConfig;\n\n // Auto-select framing when the user has not explicitly configured it.\n // Rule: default is \"trpc\" for https://skaile.store, \"rest\" for any other URL.\n const explicitFraming =\n userCfg?.catalog?.framing !== undefined ||\n projCfg?.catalog?.framing !== undefined ||\n opts?.overrides?.catalog?.framing !== undefined;\n\n if (!explicitFraming && resolved.catalog.url !== \"https://skaile.store\") {\n (resolved.catalog as { framing: \"trpc\" | \"rest\" }).framing = \"rest\";\n }\n\n return resolved;\n}\n\n/**\n * Save a config file (user or project level).\n *\n * @param filePath - Absolute path to write (e.g. from {@link userConfigPath}).\n * @param config - Partial config to persist as YAML.\n * @docLink packages/library/api-reference#config\n */\nexport function saveConfig(filePath: string, config: Partial<SkaileConfig>): void {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, yamlStringify(config, { indent: 2 }), \"utf-8\");\n}\n","/**\n * Drizzle SQLite table definitions for the local library DB.\n *\n * DDL is in db.ts; this file drives the type-safe query builder only.\n *\n * @docLink packages/library/concepts#schema\n */\n\nimport { sqliteTable, text, integer } from \"drizzle-orm/sqlite-core\";\n\n// ---------------------------------------------------------------------------\n// Libraries (formerly `sources`)\n// ---------------------------------------------------------------------------\n\n/**\n * Drizzle table definition for the `libraries` table.\n *\n * Renamed from `sources` 2026-05-13. Adds: name, backend, backendConfig,\n * ownership, structure, isDefault, manifestGenerated, updatedAt.\n * Removes: type, url, ref, sidecarPath.\n */\nexport const libraries = sqliteTable(\"libraries\", {\n /** UUID primary key. */\n id: text(\"id\").primaryKey(),\n /** User-visible handle; unique. */\n name: text(\"name\").notNull(),\n /** Absolute on-disk root. */\n path: text(\"path\").notNull(),\n /** Backend kind: `local | git | store`. */\n backend: text(\"backend\").notNull(),\n /** Backend-specific JSON config; stored as text, parsed on read. */\n backendConfig: text(\"backend_config\").notNull().default(\"{}\"),\n /** Ownership: `owner | contributor | reader`. */\n ownership: text(\"ownership\").notNull(),\n /** Layout: `flat | domain` or null when not yet detected. */\n structure: text(\"structure\"),\n /** Boolean (0/1) — true iff this is the auto-target for `asset migrate`. */\n isDefault: integer(\"is_default\", { mode: \"boolean\" }).notNull().default(false),\n /** Boolean (0/1) — true iff the CLI generated the on-disk manifest. */\n manifestGenerated: integer(\"manifest_generated\", { mode: \"boolean\" }).notNull().default(false),\n /** Last sync ISO timestamp. */\n lastSyncAt: text(\"last_sync_at\"),\n /** Creation ISO timestamp. */\n createdAt: text(\"created_at\").notNull(),\n /** Last-update ISO timestamp. */\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// Asset definitions\n// ---------------------------------------------------------------------------\n\n/**\n * FK `library_id -> libraries(id) ON DELETE SET NULL` (renamed from source_id).\n */\nexport const assetDefinitions = sqliteTable(\"asset_definitions\", {\n id: text(\"id\").primaryKey(),\n kind: text(\"kind\").notNull(),\n publisher: text(\"publisher\").notNull(),\n name: text(\"name\").notNull(),\n version: text(\"version\").notNull(),\n sha256: text(\"sha256\"),\n description: text(\"description\"),\n license: text(\"license\"),\n category: text(\"category\"),\n manifest: text(\"manifest\").notNull(),\n /** FK to the library that provided this definition. */\n libraryId: text(\"library_id\"),\n kindProviderVersion: text(\"kind_provider_version\"),\n cachedAt: text(\"cached_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n});\n\n// ---------------------------------------------------------------------------\n// Instances (unchanged)\n// ---------------------------------------------------------------------------\n\nexport const instances = sqliteTable(\"instances\", {\n id: text(\"id\").primaryKey(),\n defRef: text(\"def_ref\").notNull(),\n defPin: text(\"def_pin\").notNull(),\n config: text(\"config\").notNull().default(\"{}\"),\n credentialRef: text(\"credential_ref\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n createdBy: text(\"created_by\"),\n sourceCommitSha: text(\"source_commit_sha\"),\n});\n\n// ---------------------------------------------------------------------------\n// Subscriptions (unchanged)\n// ---------------------------------------------------------------------------\n\nexport const subscriptions = sqliteTable(\"subscriptions\", {\n id: text(\"id\").primaryKey(),\n workspaceId: text(\"workspace_id\").notNull(),\n instanceId: text(\"instance_id\").notNull(),\n pinPolicy: text(\"pin_policy\").notNull(),\n subscribedAt: text(\"subscribed_at\").notNull(),\n});\n","/**\n * Sidecar path resolver — locations under `~/.skaile/sources/` (PR-3 § D.1).\n *\n * `~/.skaile/sources/` is a single git repo containing one subdirectory per\n * registered sidecar. Each subdirectory carries the local-overlay manifest\n * (`.skaile-source.yaml`), a provenance README, and a lock file.\n *\n * Path resolution honors the `SKAILE_HOME` env var (defaults to `~/.skaile`)\n * mirroring the style used by `SKAILE_LIBRARIES_DIR` (which already overrides\n * the library checkouts dir). Setting `SKAILE_HOME` is the recommended hook\n * for test isolation: a single env var moves the sidecar root, the libraries\n * dir (when not separately overridden), and the catalog cache together.\n *\n * @docLink packages/library/concepts#sidecar-paths\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nimport type { SourceConfig } from \"@skaile/workspaces/discovery\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Resolved sidecar paths for a given slug. All paths are absolute.\n *\n * @docLink packages/library/concepts#sidecar-paths\n */\nexport interface SidecarPaths {\n /** Root sidecar directory, `~/.skaile/sources` (or `$SKAILE_HOME/sources`). */\n rootDir: string;\n /** Per-source sidecar dir: `<rootDir>/<slug>`. */\n sidecarDir: string;\n /** Manifest file: `<sidecarDir>/.skaile-source.yaml`. */\n manifestFile: string;\n /** Provenance README: `<sidecarDir>/README.md`. */\n readmeFile: string;\n /** Lock file: `<sidecarDir>/.skaile-source.lock.json`. */\n lockFile: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SKAILE_HOME_ENV = \"SKAILE_HOME\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the absolute path to the sidecar root directory.\n *\n * Resolution order:\n * 1. `$SKAILE_HOME/sources` if `SKAILE_HOME` is set\n * 2. `~/.skaile/sources` (default)\n *\n * Does **not** create the directory — callers (e.g. `SidecarGit.ensureInitialized`)\n * are responsible for materialising it.\n *\n * @returns Absolute path to `~/.skaile/sources` (or env override)\n * @docLink packages/library/concepts#sidecar-paths\n */\nexport function getSidecarRoot(): string {\n const home = process.env[SKAILE_HOME_ENV] ?? path.join(os.homedir(), \".skaile\");\n return path.join(home, \"sources\");\n}\n\n/**\n * Resolve all sidecar paths for a given slug.\n *\n * @param slug - Sidecar slug (subdirectory name under `~/.skaile/sources/`)\n * @returns Bundle of all relevant absolute paths\n * @docLink packages/library/concepts#sidecar-paths\n */\nexport function resolveSidecarPaths(slug: string): SidecarPaths {\n const rootDir = getSidecarRoot();\n const sidecarDir = path.join(rootDir, slug);\n return {\n rootDir,\n sidecarDir,\n manifestFile: path.join(sidecarDir, \".skaile-source.yaml\"),\n readmeFile: path.join(sidecarDir, \"README.md\"),\n lockFile: path.join(sidecarDir, \".skaile-source.lock.json\"),\n };\n}\n\n/**\n * Derive a sidecar slug from a source config + source path, applying\n * collision resolution against the set of slugs already in use.\n *\n * Derivation order (per PR-3 § D.1):\n * 1. `name:` field of the upstream `.skaile-source.yaml` (if non-empty)\n * 2. `path.basename(sourcePath)` (fallback)\n *\n * Collision suffix: `-2`, `-3`, ... appended until unique against\n * `existingSlugs`.\n *\n * Empty/dot/segmented basenames fall through to `unnamed-source`.\n *\n * @param sourceConfig - Validated source config (may be `undefined`)\n * @param sourcePath - Filesystem path of the source repo\n * @param existingSlugs - Slugs already in use under the sidecar root\n * @returns A unique, slugified directory name\n * @docLink packages/library/concepts#derive-slug\n */\nexport function deriveSlug(\n sourceConfig: SourceConfig | undefined | null,\n sourcePath: string,\n existingSlugs: Iterable<string>,\n): string {\n // Step 1: pick the candidate from name: -> basename -> fallback.\n const fromConfig =\n sourceConfig && typeof (sourceConfig as { name?: unknown }).name === \"string\"\n ? ((sourceConfig as { name?: string }).name as string)\n : undefined;\n const base =\n fromConfig && fromConfig.length > 0\n ? slugify(fromConfig)\n : slugify(path.basename(sourcePath || \"\")) || \"unnamed-source\";\n\n // Step 2: collision suffix.\n const taken = new Set<string>(existingSlugs);\n if (!taken.has(base)) return base;\n for (let i = 2; i < 1_000; i++) {\n const candidate = `${base}-${i}`;\n if (!taken.has(candidate)) return candidate;\n }\n // Pathological fallback (1k+ collisions): random suffix.\n return `${base}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * List the slugs currently present on disk under {@link getSidecarRoot}.\n *\n * Returns an empty array when the root directory doesn't exist yet (first\n * sidecar). Non-directory entries (e.g. the root `README.md`,\n * `.gitattributes`) are filtered out.\n *\n * @returns Lexically sorted list of slug directory names\n * @docLink packages/library/concepts#sidecar-paths\n */\nexport function listSidecarSlugsOnDisk(): string[] {\n const root = getSidecarRoot();\n if (!fs.existsSync(root)) return [];\n const out: string[] = [];\n for (const entry of fs.readdirSync(root, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith(\".\")) continue; // skip .git / .gitattributes anomalies\n out.push(entry.name);\n }\n return out.sort();\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Conservative slugifier: lowercase, replace whitespace + non-(alnum/dash/dot)\n * with `-`, collapse repeated dashes, strip leading/trailing dashes.\n */\nfunction slugify(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-.]+|[-.]+$/g, \"\");\n}\n","/**\n * Store paths — manifest-only catalog living at `~/.skaile/store/`.\n *\n * The store is symmetric to a remote catalog (skaile.store) but lives on the\n * user's machine. It holds *manifests* (pointer triples) only — never bytes.\n * Bytes live under `~/.skaile/sources/` (third-party clones) or\n * `~/.skaile/libraries/<name>/` (user authoring).\n *\n * Layout:\n * ```\n * ~/.skaile/store/\n * ├── config.yaml mode: auto|local|remote, ttl, …\n * ├── favourites.yaml user pins\n * ├── manifests/ catalog entries (one yaml per ref)\n * ├── remote-cache/ TTL cache of remote-store responses (.gitignore'd)\n * └── .git/ store is a git repo (push to team remote)\n * ```\n *\n * @docLink packages/library/concepts#store-paths\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\nimport { getSidecarRoot } from \"./sidecar-paths.js\";\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the absolute path to the local store root (`~/.skaile/store/`).\n *\n * Honors `SKAILE_HOME` (test isolation hook), mirroring {@link getSidecarRoot}.\n */\nexport function getStoreRoot(): string {\n const home = process.env.SKAILE_HOME ?? path.join(os.homedir(), \".skaile\");\n return path.join(home, \"store\");\n}\n\n/** Manifests subdir: `<store>/manifests/`. */\nexport function getStoreManifestsDir(): string {\n return path.join(getStoreRoot(), \"manifests\");\n}\n\n/** Marker that signals the sidecar→store migration has run. */\nfunction migratedMarkerPath(): string {\n return path.join(getStoreRoot(), \".migrated\");\n}\n\n// ---------------------------------------------------------------------------\n// One-shot sidecar → store/manifests migration\n// ---------------------------------------------------------------------------\n\n/**\n * Move every `~/.skaile/sources/<slug>/.skaile-source.yaml` into\n * `~/.skaile/store/manifests/<slug>.yaml`, initialise the store as a git\n * repo, and write a marker so the migration is a no-op on subsequent runs.\n *\n * Idempotent. Cheap to call (single `existsSync` for the marker on the hot\n * path). Errors are swallowed and logged to stderr — a partial migration\n * leaves the marker absent so the next run retries.\n */\nexport function migrateSidecarsToStoreIfNeeded(): { migrated: number; storeRoot: string } {\n const storeRoot = getStoreRoot();\n const marker = migratedMarkerPath();\n if (fs.existsSync(marker)) return { migrated: 0, storeRoot };\n\n const sidecarRoot = getSidecarRoot();\n const manifestsDir = getStoreManifestsDir();\n\n // Build the candidate list before touching the filesystem.\n const candidates: { src: string; slug: string }[] = [];\n if (fs.existsSync(sidecarRoot)) {\n for (const entry of fs.readdirSync(sidecarRoot, { withFileTypes: true })) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith(\".\")) continue;\n const src = path.join(sidecarRoot, entry.name, \".skaile-source.yaml\");\n if (fs.existsSync(src)) candidates.push({ src, slug: entry.name });\n }\n }\n\n fs.mkdirSync(manifestsDir, { recursive: true });\n\n let migrated = 0;\n for (const { src, slug } of candidates) {\n const dest = path.join(manifestsDir, `${slug}.yaml`);\n if (fs.existsSync(dest)) continue; // already migrated by a prior partial run\n try {\n fs.renameSync(src, dest);\n migrated++;\n } catch (err) {\n process.stderr.write(\n `[skaile/store] Failed to migrate sidecar ${slug}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n }\n\n // Initialise the store as a git repo on first move so users can push it as\n // a team store. Failure is non-fatal — the marker still gets written so we\n // don't retry on every open.\n if (!fs.existsSync(path.join(storeRoot, \".git\"))) {\n try {\n spawnSync(\"git\", [\"init\", \"--quiet\"], { cwd: storeRoot, stdio: \"ignore\" });\n fs.writeFileSync(\n path.join(storeRoot, \".gitignore\"),\n \"# Remote-store cache — local to this machine.\\nremote-cache/\\n\",\n \"utf8\",\n );\n } catch {\n // Ignore — git may not be available; the directory is still usable.\n }\n }\n\n fs.writeFileSync(marker, new Date().toISOString(), \"utf8\");\n return { migrated, storeRoot };\n}\n","/**\n * Local library DB initialization.\n *\n * Opens an `@libsql/client` SQLite connection over a `file:` URL, sets WAL +\n * FK pragmas, applies the one-shot Libraries migration if the legacy\n * `sources` table is present, then runs the modern DDL (idempotent via\n * CREATE TABLE IF NOT EXISTS). `@libsql/client` runs on both Node and Bun\n * from a single driver — no runtime dispatch.\n *\n * @docLink packages/library/concepts#local-library\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { type Client, createClient, type InStatement } from \"@libsql/client\";\nimport { drizzle, type LibSQLDatabase } from \"drizzle-orm/libsql\";\nimport * as schema from \"./schema.js\";\nimport { migrateSidecarsToStoreIfNeeded } from \"./store-paths.js\";\n\n// ---------------------------------------------------------------------------\n// Modern DDL — runs after migration; safe to run unconditionally because of\n// CREATE TABLE IF NOT EXISTS semantics.\n// ---------------------------------------------------------------------------\n\nconst DDL = `\nCREATE TABLE IF NOT EXISTS libraries (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n backend TEXT NOT NULL,\n backend_config TEXT NOT NULL DEFAULT '{}',\n ownership TEXT NOT NULL,\n structure TEXT,\n is_default INTEGER NOT NULL DEFAULT 0,\n manifest_generated INTEGER NOT NULL DEFAULT 0,\n last_sync_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_libraries_name ON libraries(name);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_libraries_default\n ON libraries(is_default) WHERE is_default = 1;\n\nCREATE TABLE IF NOT EXISTS asset_definitions (\n id TEXT PRIMARY KEY,\n kind TEXT NOT NULL,\n publisher TEXT NOT NULL,\n name TEXT NOT NULL,\n version TEXT NOT NULL,\n sha256 TEXT,\n description TEXT,\n license TEXT,\n category TEXT,\n manifest TEXT NOT NULL,\n library_id TEXT REFERENCES libraries(id) ON DELETE SET NULL,\n kind_provider_version TEXT,\n cached_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\nCREATE INDEX IF NOT EXISTS idx_asset_defs_kind ON asset_definitions(kind);\nCREATE INDEX IF NOT EXISTS idx_asset_defs_publisher ON asset_definitions(publisher);\nCREATE INDEX IF NOT EXISTS idx_asset_defs_library_id ON asset_definitions(library_id);\n\nCREATE TABLE IF NOT EXISTS instances (\n id TEXT PRIMARY KEY,\n def_ref TEXT NOT NULL,\n def_pin TEXT NOT NULL,\n config TEXT NOT NULL DEFAULT '{}',\n credential_ref TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n created_by TEXT,\n source_commit_sha TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_instances_def_ref ON instances(def_ref);\n\nCREATE TABLE IF NOT EXISTS subscriptions (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL,\n instance_id TEXT NOT NULL REFERENCES instances(id) ON DELETE CASCADE,\n pin_policy TEXT NOT NULL,\n subscribed_at TEXT NOT NULL\n);\nCREATE UNIQUE INDEX IF NOT EXISTS idx_subs_ws_instance\n ON subscriptions(workspace_id, instance_id);\nCREATE INDEX IF NOT EXISTS idx_subs_instance_id ON subscriptions(instance_id);\n`;\n\n// ---------------------------------------------------------------------------\n// Migration — runs only if the legacy `sources` table is present and no\n// `libraries` table exists yet. Idempotent: subsequent opens skip it.\n// ---------------------------------------------------------------------------\n\nasync function legacySourcesPresent(client: Client): Promise<boolean> {\n const rs = await client.execute(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='sources'\",\n );\n return rs.rows.length > 0;\n}\n\nasync function librariesPresent(client: Client): Promise<boolean> {\n const rs = await client.execute(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name='libraries'\",\n );\n return rs.rows.length > 0;\n}\n\n/**\n * Convert an absolute path to a slug suitable for a unique library name.\n * \"/home/u/code/skills\" -> \"skills\"; collisions resolved at call site.\n */\nfunction slugify(p: string): string {\n const base = path.basename(p) || \"lib\";\n return (\n base\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"lib\"\n );\n}\n\ninterface OldSourceRow {\n id: string;\n type: string;\n url: string;\n path: string | null;\n ref: string | null;\n last_synced_at: string | null;\n created_at: string;\n}\n\n/**\n * One-shot `sources` → `libraries` migration. Builds the full statement set,\n * then applies it as a single transactional `client.batch` so a partial\n * failure rolls back cleanly.\n */\nasync function runLibrariesMigration(client: Client): Promise<void> {\n // Read the legacy rows first — the backfill statements depend on them.\n const oldRows = (\n await client.execute(\"SELECT id, type, url, path, ref, last_synced_at, created_at FROM sources\")\n ).rows as unknown as OldSourceRow[];\n\n const stmts: InStatement[] = [];\n\n // 1. Create the new libraries table (without the UNIQUE index yet — we set\n // the name during backfill, then add the index).\n stmts.push({\n sql: `\n CREATE TABLE libraries (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n path TEXT NOT NULL,\n backend TEXT NOT NULL,\n backend_config TEXT NOT NULL DEFAULT '{}',\n ownership TEXT NOT NULL,\n structure TEXT,\n is_default INTEGER NOT NULL DEFAULT 0,\n manifest_generated INTEGER NOT NULL DEFAULT 0,\n last_sync_at TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n `,\n });\n\n // 2. Backfill from sources. `type` was github|local|catalog; we map to\n // backend = git|local. The `catalog` (a.k.a. \"store\") backend was retired\n // in the 2026-05-27 vocabulary cleanup — those rows migrate to `git`\n // with the catalog URL kept as the git url, which is the closest\n // backwards-compatible mapping.\n const usedNames = new Set<string>();\n for (const row of oldRows) {\n const backend = row.type === \"github\" || row.type === \"catalog\" ? \"git\" : \"local\";\n const ownership = backend === \"local\" ? \"owner\" : \"reader\";\n const baseSlug = slugify(row.path ?? row.url);\n let name = baseSlug;\n let i = 2;\n while (usedNames.has(name)) name = `${baseSlug}-${i++}`;\n usedNames.add(name);\n const cfg: Record<string, unknown> =\n backend === \"git\" ? { url: row.url, branch: row.ref ?? \"main\", authHint: \"ssh\" } : {};\n const now = new Date().toISOString();\n stmts.push({\n sql: `INSERT INTO libraries\n (id, name, path, backend, backend_config, ownership, last_sync_at, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n args: [\n row.id,\n name,\n row.path ?? row.url,\n backend,\n JSON.stringify(cfg),\n ownership,\n row.last_synced_at,\n row.created_at,\n now,\n ],\n });\n }\n\n // 3. Add the two indexes now that names are unique.\n stmts.push({ sql: `CREATE UNIQUE INDEX idx_libraries_name ON libraries(name);` });\n stmts.push({\n sql: `CREATE UNIQUE INDEX idx_libraries_default\n ON libraries(is_default) WHERE is_default = 1;`,\n });\n\n // 4. Rename FK column on asset_definitions: source_id -> library_id.\n // SQLite supports ALTER TABLE ... RENAME COLUMN since 3.25.\n stmts.push({ sql: `ALTER TABLE asset_definitions RENAME COLUMN source_id TO library_id;` });\n stmts.push({\n sql: `CREATE INDEX IF NOT EXISTS idx_asset_defs_library_id\n ON asset_definitions(library_id);`,\n });\n\n // 5. Drop the legacy sources table.\n stmts.push({ sql: `DROP TABLE sources;` });\n\n // Apply atomically — libsql `batch` runs the whole set in a transaction.\n await client.batch(stmts);\n}\n\n// ---------------------------------------------------------------------------\n// Legacy path guard — the index db has lived at three different paths:\n// 1. `~/.skaile/library/lib.db` (pre-2026-05-13)\n// 2. `~/.skaile/libraries/lib.db` (2026-05-13 Libraries redesign)\n// 3. `~/.skaile/index.db` (2026-05-27 vocabulary cleanup)\n// The one-shot relocation from 1/2 → 3 ran for one release; this release hard-\n// fails with an actionable message instead of silently moving data.\n// ---------------------------------------------------------------------------\n\nfunction assertNoLegacyLibDb(newDbPath: string): void {\n if (fs.existsSync(newDbPath)) return;\n\n const parent = path.dirname(newDbPath);\n const skaileHome = path.join(os.homedir(), \".skaile\");\n const defaultIndexPath = path.join(skaileHome, \"index.db\");\n\n const candidates: string[] = [];\n if (path.basename(newDbPath) === \"index.db\") {\n candidates.push(path.join(parent, \"lib.db\"));\n }\n if (newDbPath === defaultIndexPath) {\n candidates.push(path.join(skaileHome, \"libraries\", \"lib.db\"));\n candidates.push(path.join(skaileHome, \"library\", \"lib.db\"));\n }\n if (path.basename(parent) === \"libraries\") {\n candidates.push(path.join(path.dirname(parent), \"library\", \"lib.db\"));\n }\n\n for (const legacy of candidates) {\n if (!fs.existsSync(legacy)) continue;\n throw new Error(\n `Found legacy index database at ${legacy}. The lib.db → index.db ` +\n `relocation ran for one release and has been removed. Move the file ` +\n `manually to ${newDbPath} (and any -wal / -shm siblings), then retry.`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport type LibraryDb = LibSQLDatabase<typeof schema>;\n\nexport interface LibraryDbHandle {\n db: LibraryDb;\n close(): void;\n}\n\n/**\n * Open (or create) the local library SQLite database.\n *\n * Async because `@libsql/client` is async-only. `LocalIndex` opens the DB\n * lazily on first use to keep its constructor synchronous.\n *\n * @param dbPath - Absolute path to the `index.db` file. Pre-2026-05-27\n * `lib.db` paths now hard-fail; see {@link assertNoLegacyLibDb}.\n * @returns A handle carrying the Drizzle DB and a synchronous `close()`.\n */\nexport async function createLibraryDb(dbPath: string): Promise<LibraryDbHandle> {\n assertNoLegacyLibDb(dbPath);\n // Idempotent one-shot: relocate any pre-2026-05-27 sidecars under\n // ~/.skaile/sources/<slug>/ into the new manifest catalog at\n // ~/.skaile/store/manifests/. Cheap on subsequent opens (single existsSync).\n try {\n migrateSidecarsToStoreIfNeeded();\n } catch (err) {\n process.stderr.write(\n `[skaile/store] sidecar migration skipped: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n const client = createClient({ url: `file:${dbPath}` });\n await client.execute(\"PRAGMA journal_mode = WAL\");\n await client.execute(\"PRAGMA foreign_keys = ON\");\n\n // Run the one-shot migration only when needed.\n if ((await legacySourcesPresent(client)) && !(await librariesPresent(client))) {\n await runLibrariesMigration(client);\n }\n\n await client.executeMultiple(DDL);\n\n // 2026-05-27 vocabulary cleanup: the `store` backend was retired. Refuse to\n // open if any leftover row still claims that backend — the user needs to\n // convert it to a git-backed library via `skaile library link <git-url>`\n // before continuing.\n if (await librariesPresent(client)) {\n const storeRows = await client.execute({\n sql: \"SELECT id, name FROM libraries WHERE backend = ?\",\n args: [\"store\"],\n });\n if (storeRows.rows.length > 0) {\n const names = storeRows.rows.map((r) => String((r as Record<string, unknown>).name)).join(\", \");\n client.close();\n throw new Error(\n `The 'store' library backend was removed in the 2026-05-27 vocabulary ` +\n `cleanup. Found rows still using it: ${names}. ` +\n `Run \\`skaile library link <git-url>\\` to convert each, or remove them ` +\n `with \\`skaile library remove <name>\\`.`,\n );\n }\n }\n\n // Idempotent column add for DBs created before the pointer-only pivot —\n // `CREATE TABLE IF NOT EXISTS` above is a no-op on an existing `instances`\n // table, so an older DB would miss `source_commit_sha`. Swallow the\n // \"duplicate column\" error so re-opens are clean.\n try {\n await client.execute(\"ALTER TABLE instances ADD COLUMN source_commit_sha TEXT\");\n } catch (err) {\n if (!/duplicate column/i.test(err instanceof Error ? err.message : String(err))) {\n throw err;\n }\n }\n\n const db = drizzle(client, { schema });\n return { db, close: () => client.close() };\n}\n","/**\n * Pointer-only install path.\n *\n * Given an {@link InstallManifest} (the Pointer Triple the Catalog hands\n * clients), this:\n *\n * 1. fetches the asset bytes directly from the upstream repo at the pinned\n * commit (via an injectable fetcher, default {@link fetchAssetFilesFromGitHub});\n * 2. verifies EVERY per-file SHA256 against `manifest.files[].sha256`;\n * 3. verifies the composite SHA256 rollup over the sorted\n * `<path>:<sha256>\\n` lines against `manifest.sha256`;\n * 4. writes the verified bytes under `<libraryRoot>/@<publisher>/<name>/<version>`.\n *\n * Any hash mismatch is a hard failure — bytes are not written if per-file\n * verification fails, and the composite check is the second gate.\n *\n * @docLink packages/library/concepts#install\n */\n\nimport { createHash } from \"node:crypto\";\nimport { mkdir, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\n\n/**\n * Validate a single manifest-supplied file path against path traversal.\n *\n * `manifest.files[].path` comes off the network — the attacker controls the\n * entire manifest (and therefore every hash in it), so hash verification can\n * NEVER mitigate a malicious *destination*. A path like\n * `../../../../home/user/.bashrc` or an absolute path would escape\n * `installPath` and yield an arbitrary file write. Every path is checked\n * BEFORE any fetch or write happens; the first bad path aborts the entire\n * install with a hard throw.\n *\n * A path is rejected if ANY of:\n * - it is empty;\n * - it is absolute (`path.isAbsolute`) or has a leading slash;\n * - it contains a `..` segment;\n * - `path.resolve(installPath, p)` is not `installPath` itself and does not\n * start with `installPath + path.sep` (escapes the install dir).\n *\n * @throws An error matching `/unsafe path in manifest/` on the first bad path.\n */\nexport function assertSafeManifestPath(installPath: string, p: string): void {\n const bad = (): never => {\n throw new Error(`unsafe path in manifest: ${p}`);\n };\n if (!p || p.length === 0) bad();\n if (isAbsolute(p) || p.startsWith(\"/\") || p.startsWith(\"\\\\\")) bad();\n const segments = p.split(/[/\\\\]/);\n if (segments.some((s) => s === \"..\")) bad();\n const resolved = resolve(installPath, p);\n if (resolved !== installPath && !resolved.startsWith(installPath + sep)) bad();\n}\n\n/**\n * Validate one component (publisher / name / version) of the attacker-controlled\n * `manifest.ref`.\n *\n * `installPath` is built by joining these components onto `libraryRoot`. A\n * component containing a path separator or a `..` / leading-dot segment would\n * let `installPath` itself escape `libraryRoot` — yielding an arbitrary file\n * write AND, via the pre-write `rm(installPath, { recursive })`, an arbitrary\n * recursive delete. The per-file `assertSafeManifestPath` guard cannot catch\n * this: it only validates each `f.path` *relative to* `installPath`, never\n * `installPath` itself. Components must be plain identifier-like strings.\n *\n * @throws An error matching `/unsafe ref/` on a bad component.\n */\nfunction assertSafeRefComponent(kind: string, value: string): void {\n // Reject empty, leading-dot (covers `.` and `..`), path separators, and\n // ASCII control characters (NUL et al.) — fails a malformed segment fast\n // with a domain-specific error rather than a raw EINVAL deeper in.\n const hasControlChar = [...value].some((c) => c.charCodeAt(0) < 0x20);\n if (!value || value.startsWith(\".\") || /[/\\\\]/.test(value) || hasControlChar) {\n throw new Error(`unsafe ref ${kind} component in manifest: '${value}'`);\n }\n}\n\n/**\n * Fetcher signature — fetches `{ path → Buffer }` for the requested paths at\n * a pinned upstream commit. {@link fetchAssetFilesFromGitHub} is the default\n * production implementation; tests inject a mock.\n */\nexport type AssetFetcher = (opts: {\n url: string;\n commitSha: string;\n paths: string[];\n}) => Promise<Record<string, Buffer>>;\n\n/**\n * Options for {@link installFromManifest}.\n */\nexport interface InstallOpts {\n /** The pointer-only install manifest from the Catalog. */\n manifest: InstallManifest;\n /** Filesystem root the asset is installed under. */\n libraryRoot: string;\n /**\n * Pluggable fetcher so tests can inject mock data. Defaults to\n * {@link fetchAssetFilesFromGitHub} in production.\n */\n fetcher?: AssetFetcher;\n}\n\n/**\n * Result of a successful {@link installFromManifest} call.\n */\nexport interface InstallResult {\n /** Absolute path the asset files were written to. */\n installPath: string;\n}\n\n/**\n * Fetch, verify, and write an asset's files per its {@link InstallManifest}.\n *\n * @throws An error matching `/hash mismatch/i` if any per-file SHA256 differs.\n * @throws An error matching `/composite hash mismatch/i` if the rollup differs.\n * @throws An error if the ref is malformed or the fetcher omits a file.\n */\nexport async function installFromManifest(opts: InstallOpts): Promise<InstallResult> {\n const { manifest, libraryRoot } = opts;\n const fetcher =\n opts.fetcher ?? (await import(\"./source-fetch-github.js\")).fetchAssetFilesFromGitHub;\n\n // 1. Parse ref into install path: `@x/git@1.0.0` → `<root>/@x/git/1.0.0`.\n // Done first so the C1 path-traversal guard can resolve against installPath\n // BEFORE any network fetch happens. The ref is attacker-controlled, so each\n // segment is constrained to a `/`,`@`,whitespace-free run and then further\n // validated as a safe path component (H1).\n const m = manifest.ref.match(/^@?([^/@\\s]+)\\/([^/@\\s]+)@([^/@\\s]+)$/);\n if (!m) throw new Error(`invalid ref: ${manifest.ref}`);\n const [, publisher, name, version] = m;\n assertSafeRefComponent(\"publisher\", publisher!);\n assertSafeRefComponent(\"name\", name!);\n assertSafeRefComponent(\"version\", version!);\n const root = resolve(libraryRoot);\n const installPath = resolve(join(root, `@${publisher}`, name!, version!));\n // Defense in depth: even with the segment guards above, assert the built\n // installPath stays strictly inside libraryRoot before any write or `rm`.\n if (installPath !== root && !installPath.startsWith(root + sep)) {\n throw new Error(\n `unsafe install path: ref '${manifest.ref}' resolves outside the library root`,\n );\n }\n\n // 2. [C1] Validate EVERY manifest path against traversal BEFORE fetching.\n // The attacker controls the manifest (and thus all hashes) — hashes verify\n // content, never destination. Reject the whole install on the first bad path.\n for (const f of manifest.files) {\n assertSafeManifestPath(installPath, f.path);\n }\n\n // 3. Fetch all files at the pinned commit.\n const paths = manifest.files.map((f) => f.path);\n const bytes = await fetcher({\n url: manifest.source.url,\n commitSha: manifest.source.commitSha,\n paths,\n });\n\n // 4. Verify per-file SHA256 — hard fail before writing anything. The path\n // key used to read from the fetcher result is re-guarded as defense in depth.\n for (const f of manifest.files) {\n assertSafeManifestPath(installPath, f.path);\n const buf = bytes[f.path];\n if (!buf) throw new Error(`fetcher returned no bytes for ${f.path}`);\n const actual = createHash(\"sha256\").update(buf).digest(\"hex\");\n if (actual !== f.sha256) {\n throw new Error(`hash mismatch for ${f.path}: expected ${f.sha256}, got ${actual}`);\n }\n }\n\n // 5. Verify composite SHA256 over the sorted `<path>:<sha256>\\n` lines.\n const sortedLines = manifest.files\n .slice()\n .sort((a, b) => a.path.localeCompare(b.path))\n .map((e) => `${e.path}:${e.sha256}\\n`)\n .join(\"\");\n const actualComposite = createHash(\"sha256\").update(sortedLines, \"utf-8\").digest(\"hex\");\n if (actualComposite !== manifest.sha256) {\n throw new Error(`composite hash mismatch: expected ${manifest.sha256}, got ${actualComposite}`);\n }\n\n // 6. [M1] Write all verified files. A failed install must leave NO partial\n // directory: any prior `installPath` is removed first (clean overwrite), and\n // a mid-loop write failure removes the partially-written tree before\n // rethrowing.\n await rm(installPath, { recursive: true, force: true });\n try {\n for (const f of manifest.files) {\n const target = join(installPath, f.path);\n await mkdir(dirname(target), { recursive: true });\n await writeFile(target, bytes[f.path]!);\n }\n } catch (e) {\n await rm(installPath, { recursive: true, force: true }).catch(() => {});\n throw e;\n }\n\n return { installPath };\n}\n","/**\n * LocalIndex — SQLite-backed IAssetIndex implementation.\n *\n * Storage: ~/.skaile/index.db by default; override with `SKAILE_INDEX_PATH`.\n * Library checkouts live separately under `~/.skaile/libraries/<name>/` and\n * are controlled by `SKAILE_LIBRARIES_DIR`.\n *\n * All four entity tables (libraries, asset_definitions, instances, subscriptions)\n * are created on first open. See db.ts for DDL.\n *\n * @docLink packages/library/concepts#local-index\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { IAssetKindRegistry } from \"@skaile/workspaces/plugins\";\nimport { and, eq, like } from \"drizzle-orm\";\nimport { resolveIndexPath, resolveLibraryDir } from \"../config.js\";\nimport type {\n AssetDefinition,\n AssetFilter,\n CreateInstanceInput,\n IAssetIndex,\n Instance,\n InstanceFilter,\n PinPolicy,\n Subscription,\n SyncResult,\n UpdateInstanceInput,\n} from \"../library.js\";\nimport {\n DuplicateSubscriptionError,\n InstanceHasConsumersError,\n InstanceNotFoundError,\n SourceNotFoundError,\n SubscriptionNotFoundError,\n} from \"../library.js\";\nimport type {\n AddLibraryInput,\n BackendConfig,\n Library,\n LibraryBackend,\n} from \"../user-library.js\";\nimport { createLibraryDb, type LibraryDb, type LibraryDbHandle } from \"./db.js\";\nimport * as schema from \"./schema.js\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\nimport { installFromManifest, type AssetFetcher } from \"../install/install-from-manifest.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Escape SQL LIKE wildcards so user-provided prefix is treated as literal. */\nfunction escapeLikePrefix(prefix: string): string {\n return prefix.replace(/[%_]/g, \"\\\\$&\");\n}\n\n// ---------------------------------------------------------------------------\n// Row mappers\n// ---------------------------------------------------------------------------\n\nfunction rowToLibrary(row: typeof schema.libraries.$inferSelect): Library {\n const cfg = (() => {\n try {\n return JSON.parse(row.backendConfig) as BackendConfig;\n } catch {\n return {} as BackendConfig;\n }\n })();\n return {\n id: row.id,\n name: row.name,\n path: row.path,\n backend: row.backend as LibraryBackend,\n backendConfig: cfg,\n ownership: row.ownership as Library[\"ownership\"],\n structure: (row.structure as Library[\"structure\"]) ?? undefined,\n isDefault: row.isDefault,\n manifestGenerated: row.manifestGenerated,\n lastSyncAt: row.lastSyncAt ? new Date(row.lastSyncAt) : undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToAssetDef(row: typeof schema.assetDefinitions.$inferSelect): AssetDefinition {\n return {\n id: row.id,\n kind: row.kind,\n publisher: row.publisher,\n name: row.name,\n version: row.version,\n sha256: row.sha256 ?? undefined,\n description: row.description ?? undefined,\n license: row.license ?? undefined,\n category: row.category ?? undefined,\n manifest: JSON.parse(row.manifest),\n libraryId: row.libraryId ?? undefined,\n kindProviderVersion: row.kindProviderVersion ?? undefined,\n cachedAt: new Date(row.cachedAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nfunction rowToInstance(row: typeof schema.instances.$inferSelect): Instance {\n return {\n id: row.id,\n defRef: row.defRef,\n defPin: row.defPin as PinPolicy,\n config: JSON.parse(row.config),\n credentialRef: row.credentialRef ?? undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n createdBy: row.createdBy ?? undefined,\n sourceCommitSha: row.sourceCommitSha ?? undefined,\n };\n}\n\nfunction rowToSubscription(row: typeof schema.subscriptions.$inferSelect): Subscription {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n instanceId: row.instanceId,\n pinPolicy: row.pinPolicy as PinPolicy,\n subscribedAt: new Date(row.subscribedAt),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Constructor options\n// ---------------------------------------------------------------------------\n\nexport interface LocalIndexOptions {\n /** Override the library checkouts directory (where `library init` places dirs). */\n libraryDir?: string;\n /** Override the absolute path to the index SQLite file (default: ~/.skaile/index.db). */\n indexPath?: string;\n /** Kind registry for provider-version tracking and kind validation. */\n kindRegistry?: IAssetKindRegistry;\n}\n\n// ---------------------------------------------------------------------------\n// LocalIndex\n// ---------------------------------------------------------------------------\n\n/**\n * SQLite-backed implementation of {@link IAssetIndex}.\n *\n * Backed by `@libsql/client`, so it runs on both Node and Bun. Stores data at\n * `~/.skaile/index.db` by default; override with `SKAILE_INDEX_PATH` (or via\n * the constructor `indexPath` option). Library checkouts live separately at\n * `resolveLibraryDir()` (default `~/.skaile/libraries/`).\n *\n * The constructor is synchronous — it only resolves the storage path. The\n * SQLite connection is opened lazily on first use (`@libsql/client` is\n * async-only). Always call {@link LocalIndex.close} in a `finally` block to\n * release the connection.\n *\n * @docLink packages/library/concepts#local-index\n */\nexport class LocalIndex implements IAssetIndex {\n private readonly dbPath: string;\n private dbHandleRef: LibraryDbHandle | null = null;\n private dbPromise: Promise<LibraryDbHandle> | null = null;\n private _kindRegistry: IAssetKindRegistry | undefined;\n /** Absolute path to the library checkouts directory. */\n private readonly libraryDir: string;\n\n /**\n * Construct a LocalIndex. Synchronous — does not open the DB.\n *\n * @param optionsOrDir - Either a `LocalIndexOptions` object or a string\n * path (legacy signature: treated as the libraryDir, with the index file\n * landing at `<dir>/index.db`).\n */\n constructor(optionsOrDir?: string | LocalIndexOptions) {\n let dir: string;\n let dbPath: string;\n if (typeof optionsOrDir === \"string\") {\n dir = optionsOrDir;\n dbPath = path.join(dir, \"index.db\");\n } else if (optionsOrDir?.indexPath) {\n dbPath = optionsOrDir.indexPath;\n dir = optionsOrDir.libraryDir ?? resolveLibraryDir();\n this._kindRegistry = optionsOrDir.kindRegistry;\n } else if (optionsOrDir?.libraryDir) {\n dir = optionsOrDir.libraryDir;\n dbPath = path.join(dir, \"index.db\");\n this._kindRegistry = optionsOrDir.kindRegistry;\n } else {\n dir = resolveLibraryDir();\n dbPath = resolveIndexPath();\n this._kindRegistry = optionsOrDir?.kindRegistry;\n }\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const dbParent = path.dirname(dbPath);\n if (!fs.existsSync(dbParent)) {\n fs.mkdirSync(dbParent, { recursive: true });\n }\n this.libraryDir = dir;\n this.dbPath = dbPath;\n }\n\n /**\n * Lazily open the SQLite DB on first use. The `??=` dedupes concurrent\n * first calls so the DB is opened exactly once, with no race.\n */\n private async ensureDb(): Promise<LibraryDb> {\n if (this.dbHandleRef) return this.dbHandleRef.db;\n this.dbPromise ??= createLibraryDb(this.dbPath);\n this.dbHandleRef = await this.dbPromise;\n return this.dbHandleRef.db;\n }\n\n /** The kind registry bound to this library (if any). */\n get kinds(): IAssetKindRegistry | undefined {\n return this._kindRegistry;\n }\n\n /** Close the underlying SQLite connection. Call in tests / cleanup. */\n close(): void {\n if (this.dbHandleRef) this.dbHandleRef.close();\n this.dbHandleRef = null;\n this.dbPromise = null;\n }\n\n /** Internal access for LibraryManager. Do not call from user code. */\n async dbHandle(): Promise<LibraryDb> {\n return this.ensureDb();\n }\n\n // -- Libraries (formerly \"Sources\") --------------------------------------\n\n async listSources(): Promise<Library[]> {\n const db = await this.ensureDb();\n const rows = await db.select().from(schema.libraries).all();\n return rows.map(rowToLibrary);\n }\n\n async addSource(input: AddLibraryInput): Promise<Library> {\n const db = await this.ensureDb();\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n await db\n .insert(schema.libraries)\n .values({\n id,\n name: input.name,\n path: input.path,\n backend: input.backend,\n backendConfig: JSON.stringify(input.backendConfig ?? {}),\n ownership: input.ownership ?? (input.backend === \"local\" ? \"owner\" : \"reader\"),\n isDefault: input.isDefault ?? false,\n manifestGenerated: input.manifestGenerated ?? false,\n structure: input.structure ?? null,\n createdAt: now,\n updatedAt: now,\n })\n .run();\n const row = (await db\n .select()\n .from(schema.libraries)\n .where(eq(schema.libraries.id, id))\n .get())!;\n return rowToLibrary(row);\n }\n\n async removeSource(id: string): Promise<void> {\n const db = await this.ensureDb();\n const existing = await db\n .select()\n .from(schema.libraries)\n .where(eq(schema.libraries.id, id))\n .get();\n if (!existing) throw new SourceNotFoundError(id);\n await db.delete(schema.libraries).where(eq(schema.libraries.id, id)).run();\n }\n\n async syncSource(id: string): Promise<SyncResult> {\n const db = await this.ensureDb();\n const existing = await db\n .select()\n .from(schema.libraries)\n .where(eq(schema.libraries.id, id))\n .get();\n if (!existing) throw new SourceNotFoundError(id);\n\n // Phase 1 stub: discovery infrastructure lands in Task 1.5.\n // Update last_sync_at + updated_at and return empty result.\n const now = new Date().toISOString();\n await db\n .update(schema.libraries)\n .set({ lastSyncAt: now, updatedAt: now })\n .where(eq(schema.libraries.id, id))\n .run();\n\n return { libraryId: id, assetsFound: 0, assetsUpdated: 0, errors: [] };\n }\n\n // -- Asset definitions ---------------------------------------------------\n\n /**\n * Insert or update a cached asset definition.\n *\n * Not on the IAssetIndex interface -- used by catalog sources (Task 1.5)\n * and tests. INSERT OR REPLACE semantics.\n */\n async upsertAssetDef(def: AssetDefinition): Promise<void> {\n const db = await this.ensureDb();\n const now = new Date().toISOString();\n // Resolve kindProviderVersion from registry if not explicitly set\n let providerVersion = def.kindProviderVersion ?? null;\n if (!providerVersion && this._kindRegistry) {\n const provider = this._kindRegistry.getProvider(def.kind);\n if (provider) {\n providerVersion = provider.providerVersion;\n }\n }\n\n await db\n .insert(schema.assetDefinitions)\n .values({\n id: def.id,\n kind: def.kind,\n publisher: def.publisher,\n name: def.name,\n version: def.version,\n sha256: def.sha256 ?? null,\n description: def.description ?? null,\n license: def.license ?? null,\n category: def.category ?? null,\n manifest: JSON.stringify(def.manifest),\n libraryId: def.libraryId ?? null,\n kindProviderVersion: providerVersion,\n cachedAt: def.cachedAt?.toISOString() ?? now,\n updatedAt: now,\n })\n .onConflictDoUpdate({\n target: schema.assetDefinitions.id,\n set: {\n kind: def.kind,\n publisher: def.publisher,\n name: def.name,\n version: def.version,\n sha256: def.sha256 ?? null,\n description: def.description ?? null,\n license: def.license ?? null,\n category: def.category ?? null,\n manifest: JSON.stringify(def.manifest),\n libraryId: def.libraryId ?? null,\n kindProviderVersion: providerVersion,\n updatedAt: now,\n },\n })\n .run();\n }\n\n async getAssetDef(ref: string): Promise<AssetDefinition | null> {\n const db = await this.ensureDb();\n const row = await db\n .select()\n .from(schema.assetDefinitions)\n .where(eq(schema.assetDefinitions.id, ref))\n .get();\n return row ? rowToAssetDef(row) : null;\n }\n\n async listAssetDefs(filter?: AssetFilter): Promise<AssetDefinition[]> {\n const db = await this.ensureDb();\n if (!filter) {\n return (await db.select().from(schema.assetDefinitions).all()).map(rowToAssetDef);\n }\n\n const conditions = [];\n if (filter.kind) conditions.push(eq(schema.assetDefinitions.kind, filter.kind));\n if (filter.publisher) conditions.push(eq(schema.assetDefinitions.publisher, filter.publisher));\n if (filter.prefix)\n conditions.push(like(schema.assetDefinitions.id, `${escapeLikePrefix(filter.prefix)}%`));\n if (filter.libraryId) conditions.push(eq(schema.assetDefinitions.libraryId, filter.libraryId));\n\n const where = conditions.length > 0 ? and(...conditions) : undefined;\n let rows = where\n ? await db.select().from(schema.assetDefinitions).where(where).all()\n : await db.select().from(schema.assetDefinitions).all();\n\n if (filter.offset) rows = rows.slice(filter.offset);\n if (filter.limit) rows = rows.slice(0, filter.limit);\n\n return rows.map(rowToAssetDef);\n }\n\n // -- Instances -----------------------------------------------------------\n\n async createInstance(input: CreateInstanceInput): Promise<Instance> {\n const db = await this.ensureDb();\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n const pin = input.defPin ?? \"minor-track\";\n const config = input.config ?? {};\n\n await db\n .insert(schema.instances)\n .values({\n id,\n defRef: input.defRef,\n defPin: pin,\n config: JSON.stringify(config),\n credentialRef: input.credentialRef ?? null,\n createdAt: now,\n updatedAt: now,\n createdBy: input.createdBy ?? null,\n sourceCommitSha: null,\n })\n .run();\n\n return {\n id,\n defRef: input.defRef,\n defPin: pin,\n config,\n credentialRef: input.credentialRef,\n createdAt: new Date(now),\n updatedAt: new Date(now),\n createdBy: input.createdBy,\n };\n }\n\n /**\n * Install an asset from a pointer-only {@link InstallManifest}.\n *\n * This is the pointer-only install path: the caller obtains the manifest\n * from a catalog source (`RemoteCatalogSource.getInstallManifest(ref)` —\n * a `RemoteCatalogSource`-only method, not on the `ICatalogSource`\n * contract), and `install` then:\n *\n * 1. fetches the asset bytes directly from the upstream repo at the\n * pinned commit and verifies every per-file + the composite SHA256\n * (via {@link installFromManifest});\n * 2. records an {@link Instance} row carrying `sourceCommitSha` so the\n * install is auditable and re-verifiable.\n *\n * Not part of the {@link IAssetIndex} interface — `LocalIndex`-only, since\n * the platform variant resolves install bytes differently.\n *\n * @param manifest - The pointer-only install manifest from the Catalog.\n * @param opts.libraryRoot - Filesystem root to install asset bytes under.\n * Defaults to an `installed/` subdirectory of the library storage dir.\n * @param opts.fetcher - Pluggable byte fetcher (tests inject a mock);\n * defaults to `fetchAssetFilesFromGitHub`.\n * @param opts.config - Initial Instance config. Defaults to `{}`.\n * @param opts.defPin - Pin policy for the Instance. Defaults to `exact`\n * (a pointer-only install is pinned to an immutable commit).\n * @returns The created Instance plus its on-disk install path.\n */\n async install(\n manifest: InstallManifest,\n opts?: {\n libraryRoot?: string;\n fetcher?: AssetFetcher;\n config?: Record<string, unknown>;\n defPin?: PinPolicy;\n createdBy?: string;\n },\n ): Promise<{ instance: Instance; installPath: string }> {\n const libraryRoot = opts?.libraryRoot ?? path.join(this.libraryDir, \"installed\");\n\n const { installPath } = await installFromManifest({\n manifest,\n libraryRoot,\n fetcher: opts?.fetcher,\n });\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n const pin: PinPolicy = opts?.defPin ?? \"exact\";\n const config = opts?.config ?? {};\n\n const db = await this.ensureDb();\n await db\n .insert(schema.instances)\n .values({\n id,\n defRef: manifest.ref,\n defPin: pin,\n config: JSON.stringify(config),\n credentialRef: null,\n createdAt: now,\n updatedAt: now,\n createdBy: opts?.createdBy ?? null,\n sourceCommitSha: manifest.source.commitSha,\n })\n .run();\n\n return {\n instance: {\n id,\n defRef: manifest.ref,\n defPin: pin,\n config,\n createdAt: new Date(now),\n updatedAt: new Date(now),\n createdBy: opts?.createdBy,\n sourceCommitSha: manifest.source.commitSha,\n },\n installPath,\n };\n }\n\n async getInstance(id: string): Promise<Instance | null> {\n const db = await this.ensureDb();\n const row = await db.select().from(schema.instances).where(eq(schema.instances.id, id)).get();\n return row ? rowToInstance(row) : null;\n }\n\n async listInstances(filter?: InstanceFilter): Promise<Instance[]> {\n const db = await this.ensureDb();\n if (!filter) {\n return (await db.select().from(schema.instances).all()).map(rowToInstance);\n }\n\n const conditions = [];\n if (filter.defRef) conditions.push(eq(schema.instances.defRef, filter.defRef));\n if (filter.defPin) conditions.push(eq(schema.instances.defPin, filter.defPin));\n\n const where = conditions.length > 0 ? and(...conditions) : undefined;\n let rows = where\n ? await db.select().from(schema.instances).where(where).all()\n : await db.select().from(schema.instances).all();\n\n if (filter.offset) rows = rows.slice(filter.offset);\n if (filter.limit) rows = rows.slice(0, filter.limit);\n\n return rows.map(rowToInstance);\n }\n\n async updateInstance(id: string, patch: UpdateInstanceInput): Promise<Instance> {\n const db = await this.ensureDb();\n const existing = await db\n .select()\n .from(schema.instances)\n .where(eq(schema.instances.id, id))\n .get();\n if (!existing) throw new InstanceNotFoundError(id);\n\n const now = new Date().toISOString();\n const updates: Record<string, unknown> = { updatedAt: now };\n if (patch.config !== undefined) updates.config = JSON.stringify(patch.config);\n if (patch.credentialRef !== undefined) updates.credentialRef = patch.credentialRef;\n if (patch.defPin !== undefined) updates.defPin = patch.defPin;\n\n await db.update(schema.instances).set(updates).where(eq(schema.instances.id, id)).run();\n\n const updated = (await db\n .select()\n .from(schema.instances)\n .where(eq(schema.instances.id, id))\n .get())!;\n return rowToInstance(updated);\n }\n\n async deleteInstance(id: string, opts?: { cascade?: boolean }): Promise<void> {\n const db = await this.ensureDb();\n const existing = await db\n .select()\n .from(schema.instances)\n .where(eq(schema.instances.id, id))\n .get();\n if (!existing) throw new InstanceNotFoundError(id);\n\n // Check for active consumers\n const consumers = await db\n .select()\n .from(schema.subscriptions)\n .where(eq(schema.subscriptions.instanceId, id))\n .all();\n\n if (consumers.length > 0 && !opts?.cascade) {\n throw new InstanceHasConsumersError(id, consumers.length);\n }\n\n // FK CASCADE handles subscription cleanup automatically.\n await db.delete(schema.instances).where(eq(schema.instances.id, id)).run();\n }\n\n // -- Subscriptions -------------------------------------------------------\n\n async subscribe(workspaceId: string, instanceId: string, pin: PinPolicy): Promise<Subscription> {\n const db = await this.ensureDb();\n // Verify instance exists\n const instance = await db\n .select()\n .from(schema.instances)\n .where(eq(schema.instances.id, instanceId))\n .get();\n if (!instance) throw new InstanceNotFoundError(instanceId);\n\n // Check for duplicate\n const existing = await db\n .select()\n .from(schema.subscriptions)\n .where(\n and(\n eq(schema.subscriptions.workspaceId, workspaceId),\n eq(schema.subscriptions.instanceId, instanceId),\n ),\n )\n .get();\n if (existing) throw new DuplicateSubscriptionError(workspaceId, instanceId);\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n await db\n .insert(schema.subscriptions)\n .values({ id, workspaceId, instanceId, pinPolicy: pin, subscribedAt: now })\n .run();\n\n return { id, workspaceId, instanceId, pinPolicy: pin, subscribedAt: new Date(now) };\n }\n\n async unsubscribe(subscriptionId: string): Promise<void> {\n const db = await this.ensureDb();\n const existing = await db\n .select()\n .from(schema.subscriptions)\n .where(eq(schema.subscriptions.id, subscriptionId))\n .get();\n if (!existing) throw new SubscriptionNotFoundError(subscriptionId);\n\n await db.delete(schema.subscriptions).where(eq(schema.subscriptions.id, subscriptionId)).run();\n }\n\n async listSubscriptions(workspaceId: string): Promise<Subscription[]> {\n const db = await this.ensureDb();\n return (\n await db\n .select()\n .from(schema.subscriptions)\n .where(eq(schema.subscriptions.workspaceId, workspaceId))\n .all()\n ).map(rowToSubscription);\n }\n\n async getConsumptionGraph(instanceId: string): Promise<Subscription[]> {\n const db = await this.ensureDb();\n return (\n await db\n .select()\n .from(schema.subscriptions)\n .where(eq(schema.subscriptions.instanceId, instanceId))\n .all()\n ).map(rowToSubscription);\n }\n}\n","/**\n * Library — user-facing concept for a named, writable-or-readable\n * collection of AI assets.\n *\n * Four orthogonal properties:\n * - backend: how content moves to/from a remote (local | git)\n * - ownership: which sync verbs are permitted (owner | contributor | reader)\n * - structure: how discovery walks the tree (flat | domain)\n * - isDefault: auto-target for `skaile asset migrate`\n *\n * See `_devlog/specs/2026-05-27-source-library-store-vocabulary.md`.\n *\n * @docLink packages/library/concepts#library\n */\n\n// ---------------------------------------------------------------------------\n// Enums\n// ---------------------------------------------------------------------------\n\n/** Literal tuple of supported backend kinds. */\nexport const LIBRARY_BACKENDS = [\"local\", \"git\"] as const;\n/** Backend kind for a library. */\nexport type LibraryBackend = (typeof LIBRARY_BACKENDS)[number];\n\n/** Literal tuple of supported ownership levels. */\nexport const LIBRARY_OWNERSHIPS = [\"owner\", \"contributor\", \"reader\"] as const;\n/** Ownership level on a library — gates sync verbs. */\nexport type LibraryOwnership = (typeof LIBRARY_OWNERSHIPS)[number];\n\n/** Literal tuple of supported discovery structures. */\nexport const LIBRARY_STRUCTURES = [\"flat\", \"domain\"] as const;\n/** Layout that discovery walks under the library root. */\nexport type LibraryStructure = (typeof LIBRARY_STRUCTURES)[number];\n\n// ---------------------------------------------------------------------------\n// Backend configs\n// ---------------------------------------------------------------------------\n\n/** Empty config for `backend: 'local'`. */\nexport type LocalBackendConfig = {};\n\n/** Config for `backend: 'git'`. */\nexport interface GitBackendConfig {\n url: string;\n branch: string;\n authHint: \"ssh\" | \"https\" | \"gh-cli\";\n forkUrl?: string;\n lastPr?: string;\n}\n\n/** Discriminated union of all backend configs. */\nexport type BackendConfig = LocalBackendConfig | GitBackendConfig;\n\n// ---------------------------------------------------------------------------\n// Library\n// ---------------------------------------------------------------------------\n\n/**\n * A registered library — one row of the `libraries` table.\n *\n * @docLink packages/library/concepts#library\n */\nexport interface Library {\n id: string;\n name: string;\n path: string;\n backend: LibraryBackend;\n backendConfig: BackendConfig;\n ownership: LibraryOwnership;\n structure?: LibraryStructure;\n isDefault: boolean;\n manifestGenerated: boolean;\n lastSyncAt?: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\n/** Input shape for `LibraryManager.addLibrary()`. */\nexport interface AddLibraryInput {\n name: string;\n path: string;\n backend: LibraryBackend;\n backendConfig?: BackendConfig;\n ownership: LibraryOwnership;\n structure?: LibraryStructure;\n isDefault?: boolean;\n manifestGenerated?: boolean;\n}\n\n/** Partial update for `LibraryManager.updateLibrary()`. */\nexport interface UpdateLibraryInput {\n name?: string;\n path?: string;\n backend?: LibraryBackend;\n backendConfig?: BackendConfig;\n ownership?: LibraryOwnership;\n structure?: LibraryStructure;\n isDefault?: boolean;\n manifestGenerated?: boolean;\n lastSyncAt?: Date;\n}\n\n// ---------------------------------------------------------------------------\n// Sync types\n// ---------------------------------------------------------------------------\n\nexport interface LocalChanges {\n added: string[];\n modified: string[];\n deleted: string[];\n}\n\nexport interface RemoteChanges {\n behind: number;\n ahead: number;\n}\n\nexport interface ConflictDescriptor {\n path: string;\n reason: string;\n}\n\nexport interface SyncStatus {\n reachable: boolean;\n localChanges: LocalChanges;\n remoteChanges?: RemoteChanges;\n conflicts?: ConflictDescriptor[];\n notes: string[];\n}\n\nexport interface PullResult {\n applied: number;\n conflicts: ConflictDescriptor[];\n}\nexport interface PushResult {\n pushed: number;\n}\nexport interface ProposeOpts {\n title?: string;\n body?: string;\n branch?: string;\n}\nexport interface ProposeResult {\n prUrl: string;\n branch: string;\n}\nexport interface PublishOpts {\n scope?: \"team\" | \"public\";\n}\nexport interface PublishResult {\n refs: string[];\n}\nexport interface PullOpts {\n rebase?: boolean;\n}\nexport interface PushOpts {\n force?: boolean;\n}\n\nexport type AssetRef = string;\n\n// ---------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------\n\nexport class LibrarySyncError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n ) {\n super(message);\n this.name = \"LibrarySyncError\";\n }\n}\n\nexport class OperationNotPermittedError extends LibrarySyncError {\n constructor(verb: string, reason: string) {\n super(`Operation not permitted: ${verb} — ${reason}`, \"operation_not_permitted\");\n this.name = \"OperationNotPermittedError\";\n }\n}\n\nexport class DuplicateLibraryNameError extends LibrarySyncError {\n constructor(name: string) {\n super(`A library named \"${name}\" already exists.`, \"duplicate_name\");\n this.name = \"DuplicateLibraryNameError\";\n }\n}\n\nexport class UserLibraryNotFoundError extends LibrarySyncError {\n constructor(ident: string) {\n super(`Library not found: ${ident}`, \"library_not_found\");\n this.name = \"UserLibraryNotFoundError\";\n }\n}\n","/**\n * GitSyncDriver — drives `backend: 'git'` libraries.\n *\n * status/pull are permitted for owner | contributor | reader.\n * push is permitted only for owner.\n * propose is permitted only for contributor (fork + branch + PR via `gh` CLI).\n * publish is never permitted.\n *\n * @docLink packages/library/concepts#sync-driver\n */\n\nimport { spawnSync, type SpawnSyncReturns } from \"node:child_process\";\nimport {\n OperationNotPermittedError,\n LibrarySyncError,\n type Library,\n type SyncStatus,\n type PullResult,\n type PushResult,\n type PullOpts,\n type PushOpts,\n type ProposeOpts,\n type ProposeResult,\n type PublishOpts,\n type PublishResult,\n type AssetRef,\n type GitBackendConfig,\n} from \"../user-library.js\";\nimport type { LibrarySyncDriver } from \"./driver.js\";\n\nfunction git(cwd: string, args: string[]): SpawnSyncReturns<string> {\n return spawnSync(\"git\", args, { cwd, encoding: \"utf-8\" });\n}\n\nfunction ok(r: SpawnSyncReturns<string>, action: string): string {\n if (r.status !== 0) {\n throw new LibrarySyncError(\n `git ${action} failed: ${r.stderr.trim() || r.stdout.trim()}`,\n \"remote_error\",\n );\n }\n return r.stdout.trim();\n}\n\nfunction gitCfg(lib: Library): GitBackendConfig {\n return lib.backendConfig as GitBackendConfig;\n}\n\nexport class GitSyncDriver implements LibrarySyncDriver {\n readonly backend = \"git\" as const;\n\n async status(lib: Library): Promise<SyncStatus> {\n const cfg = gitCfg(lib);\n const porcelain = git(lib.path, [\"status\", \"--porcelain\"]);\n if (porcelain.status !== 0) {\n return {\n reachable: false,\n localChanges: { added: [], modified: [], deleted: [] },\n notes: [`git not initialised at ${lib.path}`],\n };\n }\n const added: string[] = [];\n const modified: string[] = [];\n const deleted: string[] = [];\n for (const line of porcelain.stdout.split(\"\\n\").filter(Boolean)) {\n const xy = line.slice(0, 2);\n const file = line.slice(3);\n if (xy.includes(\"A\") || xy.startsWith(\"??\")) added.push(file);\n else if (xy.includes(\"D\")) deleted.push(file);\n else if (xy.includes(\"M\") || xy.includes(\"R\")) modified.push(file);\n }\n // Ahead/behind vs upstream.\n let remoteChanges: { behind: number; ahead: number } | undefined;\n const fetch = git(lib.path, [\"fetch\", \"--quiet\"]);\n const reachable = fetch.status === 0;\n if (reachable) {\n const counts = git(lib.path, [\n \"rev-list\",\n \"--left-right\",\n \"--count\",\n `${cfg.branch}...origin/${cfg.branch}`,\n ]);\n if (counts.status === 0) {\n const [ahead, behind] = counts.stdout.trim().split(/\\s+/).map(Number);\n remoteChanges = { ahead: ahead || 0, behind: behind || 0 };\n }\n }\n return {\n reachable,\n localChanges: { added, modified, deleted },\n remoteChanges,\n notes: reachable ? [] : [\"unable to reach origin\"],\n };\n }\n\n async pull(lib: Library, opts?: PullOpts): Promise<PullResult> {\n const cfg = gitCfg(lib);\n const args = [\"pull\", \"--ff-only\", \"origin\", cfg.branch];\n if (opts?.rebase) args.splice(1, 1, \"--rebase\");\n const r = git(lib.path, args);\n if (r.status !== 0) {\n if (/non-fast-forward|diverged|conflict/i.test(r.stderr)) {\n return { applied: 0, conflicts: [{ path: \"(branch)\", reason: r.stderr.trim() }] };\n }\n throw new LibrarySyncError(`git pull failed: ${r.stderr.trim()}`, \"remote_error\");\n }\n return { applied: 1, conflicts: [] };\n }\n\n async push(lib: Library, opts?: PushOpts): Promise<PushResult> {\n if (lib.ownership !== \"owner\") {\n throw new OperationNotPermittedError(\n \"push\",\n `library \"${lib.name}\" has ownership=${lib.ownership}; use \\`propose\\` instead`,\n );\n }\n const cfg = gitCfg(lib);\n const args = [\"push\", \"origin\", cfg.branch];\n if (opts?.force) args.push(\"--force-with-lease\");\n ok(git(lib.path, args), \"push\");\n return { pushed: 1 };\n }\n\n async propose(lib: Library, opts: ProposeOpts): Promise<ProposeResult> {\n if (lib.ownership !== \"contributor\") {\n throw new OperationNotPermittedError(\n \"propose\",\n `propose requires ownership=contributor; got ${lib.ownership}`,\n );\n }\n const cfg = gitCfg(lib);\n const branch =\n opts.branch ??\n `skaile/${new Date()\n .toISOString()\n .replace(/[-:.TZ]/g, \"\")\n .slice(0, 14)}`;\n // Ensure fork remote exists.\n const remotes = ok(git(lib.path, [\"remote\"]), \"remote-list\").split(\"\\n\");\n if (!remotes.includes(\"fork\")) {\n if (!cfg.forkUrl) {\n // Create fork via gh.\n const fork = spawnSync(\n \"gh\",\n [\"repo\", \"fork\", cfg.url, \"--remote\", \"--remote-name\", \"fork\"],\n {\n cwd: lib.path,\n encoding: \"utf-8\",\n },\n );\n if (fork.status !== 0) {\n throw new LibrarySyncError(\n `gh repo fork failed: ${fork.stderr.trim()}. Manual fallback: fork ${cfg.url} on github.com and run \\`skaile library set ${lib.name} backendConfig.forkUrl=<url>\\`.`,\n \"auth_required\",\n );\n }\n } else {\n ok(git(lib.path, [\"remote\", \"add\", \"fork\", cfg.forkUrl]), \"remote-add\");\n }\n }\n // Create / push branch.\n ok(git(lib.path, [\"checkout\", \"-B\", branch]), \"checkout\");\n ok(git(lib.path, [\"push\", \"fork\", branch]), \"push-fork\");\n\n // Open PR via gh.\n const ghArgs = [\"pr\", \"create\", \"--base\", cfg.branch, \"--head\", `fork:${branch}`];\n if (opts.title) ghArgs.push(\"--title\", opts.title);\n if (opts.body) ghArgs.push(\"--body\", opts.body);\n const pr = spawnSync(\"gh\", ghArgs, { cwd: lib.path, encoding: \"utf-8\" });\n if (pr.status !== 0) {\n const manualUrl = `${cfg.url.replace(/\\.git$/, \"\")}/compare/${cfg.branch}...${branch}`;\n throw new LibrarySyncError(\n `gh pr create failed: ${pr.stderr.trim()}. Open manually: ${manualUrl}`,\n \"remote_error\",\n );\n }\n const prUrl = pr.stdout.trim().split(\"\\n\").pop() ?? \"(unknown)\";\n return { prUrl, branch };\n }\n\n async publish(_lib: Library, _refs: AssetRef[], _opts: PublishOpts): Promise<PublishResult> {\n throw new OperationNotPermittedError(\"publish\", \"git libraries cannot publish; use store\");\n }\n}\n","/**\n * LocalSyncDriver — no-op driver for `backend: 'local'`.\n *\n * status() reports reachable with empty diffs; pull/push are no-ops;\n * propose/publish always throw OperationNotPermittedError.\n *\n * @docLink packages/library/concepts#sync-driver\n */\n\nimport {\n OperationNotPermittedError,\n type Library,\n type SyncStatus,\n type PullResult,\n type PushResult,\n type PullOpts,\n type PushOpts,\n type ProposeOpts,\n type ProposeResult,\n type PublishOpts,\n type PublishResult,\n type AssetRef,\n} from \"../user-library.js\";\nimport type { LibrarySyncDriver } from \"./driver.js\";\n\nexport class LocalSyncDriver implements LibrarySyncDriver {\n readonly backend = \"local\" as const;\n\n async status(_lib: Library): Promise<SyncStatus> {\n return {\n reachable: true,\n localChanges: { added: [], modified: [], deleted: [] },\n notes: [\"local library — no remote sync needed\"],\n };\n }\n\n async pull(_lib: Library, _opts?: PullOpts): Promise<PullResult> {\n return { applied: 0, conflicts: [] };\n }\n\n async push(_lib: Library, _opts?: PushOpts): Promise<PushResult> {\n return { pushed: 0 };\n }\n\n async propose(_lib: Library, _opts: ProposeOpts): Promise<ProposeResult> {\n throw new OperationNotPermittedError(\n \"propose\",\n \"local libraries have no remote; convert to git first\",\n );\n }\n\n async publish(_lib: Library, _refs: AssetRef[], _opts: PublishOpts): Promise<PublishResult> {\n throw new OperationNotPermittedError(\"publish\", \"local libraries cannot publish\");\n }\n}\n","/**\n * LibraryManager — CRUD for the `libraries` table plus driver dispatch.\n *\n * Wraps a LocalIndex handle (sharing its db) and exposes the user-facing\n * library lifecycle: add / list / get / setDefault / rename / update /\n * remove. Also owns ensurePersonalLibrary() — the silent auto-init on first\n * `skaile asset migrate`.\n *\n * @docLink packages/library/concepts#library-manager\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { eq } from \"drizzle-orm\";\nimport type { LibrarySyncDriver } from \"../sync/driver.js\";\nimport { GitSyncDriver } from \"../sync/git-driver.js\";\nimport { LocalSyncDriver } from \"../sync/local-driver.js\";\nimport {\n type AddLibraryInput,\n type BackendConfig,\n DuplicateLibraryNameError,\n type Library,\n type LibraryBackend,\n type UpdateLibraryInput,\n UserLibraryNotFoundError,\n} from \"../user-library.js\";\nimport type { LocalIndex } from \"./library.js\";\nimport * as schema from \"./schema.js\";\n\nfunction rowToLibrary(row: typeof schema.libraries.$inferSelect): Library {\n const cfg = (() => {\n try {\n return JSON.parse(row.backendConfig) as BackendConfig;\n } catch {\n return {} as BackendConfig;\n }\n })();\n return {\n id: row.id,\n name: row.name,\n path: row.path,\n backend: row.backend as LibraryBackend,\n backendConfig: cfg,\n ownership: row.ownership as Library[\"ownership\"],\n structure: (row.structure as Library[\"structure\"]) ?? undefined,\n isDefault: row.isDefault,\n manifestGenerated: row.manifestGenerated,\n lastSyncAt: row.lastSyncAt ? new Date(row.lastSyncAt) : undefined,\n createdAt: new Date(row.createdAt),\n updatedAt: new Date(row.updatedAt),\n };\n}\n\nexport class LibraryManager {\n private readonly localDrv = new LocalSyncDriver();\n private readonly gitDrv = new GitSyncDriver();\n\n constructor(private readonly lib: LocalIndex) {}\n\n /** Resolve the sync driver for a given backend. */\n driverFor(backend: LibraryBackend): LibrarySyncDriver {\n switch (backend) {\n case \"local\":\n return this.localDrv;\n case \"git\":\n return this.gitDrv;\n }\n }\n\n async addLibrary(input: AddLibraryInput): Promise<Library> {\n const db = await this.lib.dbHandle();\n const existing = await db\n .select()\n .from(schema.libraries)\n .where(eq(schema.libraries.name, input.name))\n .get();\n if (existing) throw new DuplicateLibraryNameError(input.name);\n\n const id = crypto.randomUUID();\n const now = new Date().toISOString();\n // When isDefault=true, clear any other default first.\n if (input.isDefault) {\n await db.update(schema.libraries).set({ isDefault: false }).run();\n }\n await db\n .insert(schema.libraries)\n .values({\n id,\n name: input.name,\n path: input.path,\n backend: input.backend,\n backendConfig: JSON.stringify(input.backendConfig ?? {}),\n ownership: input.ownership,\n structure: input.structure ?? null,\n isDefault: input.isDefault ?? false,\n manifestGenerated: input.manifestGenerated ?? false,\n createdAt: now,\n updatedAt: now,\n })\n .run();\n return this.requireLibrary(id);\n }\n\n async listLibraries(): Promise<Library[]> {\n const db = await this.lib.dbHandle();\n const rows = await db.select().from(schema.libraries).all();\n return rows.map(rowToLibrary).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());\n }\n\n async getLibrary(nameOrId: string): Promise<Library | null> {\n const db = await this.lib.dbHandle();\n let row = await db\n .select()\n .from(schema.libraries)\n .where(eq(schema.libraries.name, nameOrId))\n .get();\n if (!row) {\n row = await db.select().from(schema.libraries).where(eq(schema.libraries.id, nameOrId)).get();\n }\n return row ? rowToLibrary(row) : null;\n }\n\n async requireLibrary(nameOrId: string): Promise<Library> {\n const lib = await this.getLibrary(nameOrId);\n if (!lib) throw new UserLibraryNotFoundError(nameOrId);\n return lib;\n }\n\n async updateLibrary(nameOrId: string, patch: UpdateLibraryInput): Promise<Library> {\n const lib = await this.requireLibrary(nameOrId);\n const db = await this.lib.dbHandle();\n const updates: Partial<typeof schema.libraries.$inferInsert> = {\n updatedAt: new Date().toISOString(),\n };\n if (patch.name !== undefined) updates.name = patch.name;\n if (patch.path !== undefined) updates.path = patch.path;\n if (patch.backend !== undefined) updates.backend = patch.backend;\n if (patch.backendConfig !== undefined)\n updates.backendConfig = JSON.stringify(patch.backendConfig);\n if (patch.ownership !== undefined) updates.ownership = patch.ownership;\n if (patch.structure !== undefined) updates.structure = patch.structure;\n if (patch.manifestGenerated !== undefined) updates.manifestGenerated = patch.manifestGenerated;\n if (patch.isDefault !== undefined) updates.isDefault = patch.isDefault;\n if (patch.lastSyncAt !== undefined) updates.lastSyncAt = patch.lastSyncAt.toISOString();\n await db.update(schema.libraries).set(updates).where(eq(schema.libraries.id, lib.id)).run();\n return this.requireLibrary(lib.id);\n }\n\n async setDefault(nameOrId: string): Promise<Library> {\n const lib = await this.requireLibrary(nameOrId);\n const db = await this.lib.dbHandle();\n await db.update(schema.libraries).set({ isDefault: false }).run();\n await db\n .update(schema.libraries)\n .set({ isDefault: true, updatedAt: new Date().toISOString() })\n .where(eq(schema.libraries.id, lib.id))\n .run();\n return this.requireLibrary(lib.id);\n }\n\n async removeLibrary(nameOrId: string, opts: { purge?: boolean } = {}): Promise<void> {\n const lib = await this.requireLibrary(nameOrId);\n const db = await this.lib.dbHandle();\n await db.delete(schema.libraries).where(eq(schema.libraries.id, lib.id)).run();\n if (opts.purge && fs.existsSync(lib.path)) {\n fs.rmSync(lib.path, { recursive: true, force: true });\n }\n }\n\n /**\n * Idempotently ensure a `personal` library exists at `<librariesDir>/personal`.\n * Created silently — one stderr line — on first call when no writable default\n * exists. Returns the library row and a `created` flag.\n */\n async ensurePersonalLibrary(\n librariesDir: string,\n ): Promise<{ library: Library; created: boolean }> {\n const existing = await this.getLibrary(\"personal\");\n if (existing) return { library: existing, created: false };\n // Check whether any writable default already exists.\n const all = await this.listLibraries();\n const writableDefault = all.find(\n (l) => l.isDefault && (l.ownership === \"owner\" || l.ownership === \"contributor\"),\n );\n if (writableDefault) return { library: writableDefault, created: false };\n\n const personalPath = path.join(librariesDir, \"personal\");\n fs.mkdirSync(personalPath, { recursive: true });\n const lib = await this.addLibrary({\n name: \"personal\",\n path: personalPath,\n backend: \"local\",\n backendConfig: {},\n ownership: \"owner\",\n structure: \"domain\",\n isDefault: true,\n manifestGenerated: false,\n });\n process.stderr.write(\n `[skaile/library] Created personal library at ${personalPath} (default).\\n`,\n );\n return { library: lib, created: true };\n }\n}\n","/**\n * Sidecar git helper — manages the single shared git repo at\n * `~/.skaile/sources/` (PR-3 § D.5).\n *\n * Each sidecar lives in its own subdirectory under `<rootDir>`. All sidecars\n * share one `.git/` so users can push the entire root to a personal remote\n * (e.g. their own `dotfiles` repo) without juggling N repos.\n *\n * `ensureInitialized()` is idempotent — safe to call on every command. The\n * helper applies a fallback `user.name` / `user.email` only when the global\n * git config is missing those keys, so it never overrides a user's own\n * identity.\n *\n * Mutating commands (`commit()`) are no-ops when `skip: true` is passed; this\n * is how the CLI's `--no-commit` flag flows through.\n *\n * Shells out to the system `git` binary via `child_process` — keeps the\n * dependency surface minimal and matches the rest of the agent-framework's\n * pattern (no `simple-git` / `isomorphic-git`).\n *\n * @docLink packages/library/concepts#sidecar-git\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Result of a raw `git` invocation via {@link SidecarGit.runRaw}.\n *\n * @docLink packages/library/concepts#sidecar-git\n */\nexport interface GitInvocationResult {\n stdout: string;\n stderr: string;\n exitCode: number;\n}\n\n/**\n * Options accepted by {@link SidecarGit.commit}.\n */\nexport interface SidecarCommitOptions {\n /** Skip the commit entirely. Used by the CLI's `--no-commit` flag. */\n skip?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst FALLBACK_USER_NAME = \"Skaile CLI\";\nconst FALLBACK_USER_EMAIL = \"skaile-cli@local\";\n\nconst ROOT_README = `# Skaile Sidecar Manifests\n\nThis directory is managed by \\`skaile source sidecar\\` commands. Each\nsubdirectory is a curated local-overlay manifest for an asset source\nregistered in your LocalIndex at \\`~/.skaile/index.db\\`.\n\nYou can push this repo to your own remote (e.g. a private dotfiles repo)\nto share or back up your sidecars across machines:\n\n\\`\\`\\`bash\nskaile source sidecar git -- remote add origin git@example.com:you/sidecars.git\nskaile source sidecar git -- push -u origin main\n\\`\\`\\`\n\nSee the agent-framework docs (\\`library/docs/source-sidecars.md\\`) for the\nfull workflow.\n`;\n\nconst GITATTRIBUTES = \"* text=auto eol=lf\\n\";\n\n// ---------------------------------------------------------------------------\n// SidecarGit\n// ---------------------------------------------------------------------------\n\n/**\n * Git operations over the shared sidecar root.\n *\n * One instance per CLI invocation is the typical pattern; the helper is\n * stateless beyond the `rootDir`.\n *\n * @docLink packages/library/concepts#sidecar-git\n */\nexport class SidecarGit {\n constructor(public readonly rootDir: string) {}\n\n /**\n * Initialize the sidecar root if it doesn't yet exist.\n *\n * Steps (idempotent — each is a no-op when already present):\n * 1. `mkdir -p <rootDir>`\n * 2. `git init -b main <rootDir>` if `<rootDir>/.git` is missing\n * 3. Write `.gitattributes` (`* text=auto eol=lf`) if missing\n * 4. Write `README.md` if missing\n * 5. Apply fallback `user.name` / `user.email` to the repo config if\n * the global config is missing them\n * 6. Create the seed commit (`chore: initialize sidecar manifests`) if\n * the repo has no commits yet\n *\n * Subsequent calls don't reset config, so a user who overrode the\n * identity manually keeps their override.\n *\n * @docLink packages/library/concepts#sidecar-git\n */\n async ensureInitialized(): Promise<void> {\n if (!fs.existsSync(this.rootDir)) {\n fs.mkdirSync(this.rootDir, { recursive: true });\n }\n\n const gitDir = path.join(this.rootDir, \".git\");\n const freshRepo = !fs.existsSync(gitDir);\n if (freshRepo) {\n const init = this.spawn([\"init\", \"-b\", \"main\"]);\n if (init.exitCode !== 0) {\n throw new Error(`git init failed: ${init.stderr || init.stdout}`);\n }\n }\n\n // Seed files (idempotent).\n const attrsPath = path.join(this.rootDir, \".gitattributes\");\n if (!fs.existsSync(attrsPath)) fs.writeFileSync(attrsPath, GITATTRIBUTES, \"utf-8\");\n const readmePath = path.join(this.rootDir, \"README.md\");\n if (!fs.existsSync(readmePath)) fs.writeFileSync(readmePath, ROOT_README, \"utf-8\");\n\n // Apply fallback identity only when missing in global config.\n if (!this.hasGlobalGitConfig(\"user.name\")) {\n this.spawn([\"config\", \"user.name\", FALLBACK_USER_NAME]);\n }\n if (!this.hasGlobalGitConfig(\"user.email\")) {\n this.spawn([\"config\", \"user.email\", FALLBACK_USER_EMAIL]);\n }\n\n // Seed commit so subsequent commits have a parent.\n if (freshRepo || !this.hasAnyCommit()) {\n this.spawn([\"add\", \".gitattributes\", \"README.md\"]);\n this.spawn([\"commit\", \"-m\", \"chore: initialize sidecar manifests\"]);\n }\n }\n\n /**\n * Stage everything under `<rootDir>/<slug>/` and create a commit.\n *\n * Idempotent: if there are no staged changes after `git add`, the commit\n * is skipped (and resolves successfully — a no-op is fine).\n *\n * @param slug - Sidecar slug (subdirectory name)\n * @param message - Commit message (conventional-commits style preferred;\n * the CLI uses `feat(<slug>): create sidecar...`, `chore(<slug>): ...`)\n * @param opts - `{ skip: true }` short-circuits without staging or committing\n */\n async commit(slug: string, message: string, opts?: SidecarCommitOptions): Promise<void> {\n if (opts?.skip) return;\n\n // Stage the slug subtree. If it doesn't exist (e.g. sidecar removed),\n // fall back to `git add -A` so a deletion is captured.\n const slugDir = path.join(this.rootDir, slug);\n if (fs.existsSync(slugDir)) {\n this.spawn([\"add\", \"--\", slug]);\n } else {\n this.spawn([\"add\", \"-A\"]);\n }\n\n // Skip commit when nothing is staged (idempotent re-run).\n const status = this.spawn([\"status\", \"--porcelain\"]);\n if (status.stdout.trim().length === 0) return;\n\n const result = this.spawn([\"commit\", \"-m\", message]);\n if (result.exitCode !== 0) {\n // Race: `git commit` may report \"nothing to commit\" if a concurrent\n // command staged + committed. Treat that as a successful no-op.\n const combined = `${result.stdout}\\n${result.stderr}`;\n if (/nothing to commit|nothing added to commit/i.test(combined)) return;\n throw new Error(`git commit failed: ${combined.trim()}`);\n }\n }\n\n /**\n * Check whether the sidecar repo has uncommitted changes.\n *\n * @returns `true` when `git status --porcelain` has any output.\n */\n async hasChanges(): Promise<boolean> {\n const result = this.spawn([\"status\", \"--porcelain\"]);\n return result.stdout.trim().length > 0;\n }\n\n /**\n * Run an arbitrary `git -C <rootDir> <args>` invocation and return the\n * captured stdout/stderr + exit code.\n *\n * Used by `skaile source sidecar git -- <args>` so users don't have to\n * `cd ~/.skaile/sources` to operate the repo manually.\n *\n * @param args - Git arguments (no leading `git` token)\n * @returns Combined output + exit code; never throws on non-zero exit\n * @docLink packages/library/concepts#sidecar-git\n */\n async runRaw(args: string[]): Promise<GitInvocationResult> {\n return this.spawn(args);\n }\n\n // -- Internals -----------------------------------------------------------\n\n private spawn(args: string[]): GitInvocationResult {\n const result = spawnSync(\"git\", [\"-C\", this.rootDir, ...args], {\n encoding: \"utf-8\",\n });\n return {\n stdout: result.stdout ?? \"\",\n stderr: result.stderr ?? \"\",\n exitCode: result.status ?? 1,\n };\n }\n\n private hasGlobalGitConfig(key: string): boolean {\n // `git config --global --get <key>` exits 0 when present, 1 when absent.\n const result = spawnSync(\"git\", [\"config\", \"--global\", \"--get\", key], { encoding: \"utf-8\" });\n return result.status === 0 && (result.stdout ?? \"\").trim().length > 0;\n }\n\n private hasAnyCommit(): boolean {\n const result = this.spawn([\"rev-parse\", \"--verify\", \"HEAD\"]);\n return result.exitCode === 0;\n }\n}\n","/**\n * skaile.yaml v2 extensions + skaile.lock.yaml reader/writer.\n *\n * The v2 workspace format extends the existing v1 skaile.yaml with:\n * - `version: 2` marker\n * - `library:` section (default pin policy, instance refs with aliases)\n * - `presets_applied:` section (applied Preset references with timestamps)\n *\n * The lock file (`skaile.lock.yaml`) is new in v2 and records resolved\n * subscription state (pinned versions, SHA256 hashes, requires graph).\n *\n * @docLink packages/library/api-reference#workspace-config\n */\n\nimport * as z from \"zod\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { parse as yamlParse, stringify as yamlStringify } from \"yaml\";\nimport { PIN_POLICIES } from \"./library.js\";\n\n// ---------------------------------------------------------------------------\n// skaile.yaml v2 — library section schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Zod schema for the `PinPolicy` type.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const PinPolicySchema = z.enum(PIN_POLICIES);\n\n/**\n * Zod schema for a single instance reference entry within `library.instances`.\n *\n * Each entry holds the instance UUID and an optional human-readable alias.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const LibraryInstanceRefSchema = z.object({\n id: z.string().uuid(),\n alias: z.string().optional(),\n});\n\n/**\n * Zod schema for the `library:` section of skaile.yaml v2.\n *\n * Defaults: `pin_policy = \"minor-track\"`, `instances = []`.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const LibrarySectionSchema = z.object({\n pin_policy: PinPolicySchema.default(\"minor-track\"),\n instances: z.array(LibraryInstanceRefSchema).default([]),\n});\n\n/**\n * Zod schema for a single item entry inside a `presets_applied` record.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const PresetAppliedItemSchema = z.object({\n instance_id: z.string().uuid(),\n def_ref: z.string(),\n});\n\n/**\n * Zod schema for a single applied-preset entry in the `presets_applied:` section.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const PresetAppliedSchema = z.object({\n ref: z.string(),\n applied_at: z.string(),\n items: z.array(PresetAppliedItemSchema).default([]),\n});\n\n/**\n * Zod schema for the full skaile.yaml v2 workspace config document.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport const WorkspaceConfigV2Schema = z.object({\n version: z.literal(2),\n library: LibrarySectionSchema.optional(),\n presets_applied: z.array(PresetAppliedSchema).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// skaile.lock.yaml schemas\n// ---------------------------------------------------------------------------\n\n/**\n * Zod schema for a single resolved-subscription entry in skaile.lock.yaml.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport const LockSubscriptionSchema = z.object({\n subscription_id: z.string().uuid(),\n instance_id: z.string().uuid(),\n def_ref: z.string(),\n resolved_version: z.string(),\n resolved_sha256: z.string().optional(),\n pin_policy: PinPolicySchema,\n});\n\n/**\n * Zod schema for a single directed edge in the asset requires graph.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport const RequiresEdgeSchema = z.object({\n from: z.string(),\n to: z.string(),\n kind: z.string().optional(),\n});\n\n/**\n * Zod schema for a single expanded-preset entry tracking which instance IDs\n * a preset application produced.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport const PresetExpandedSchema = z.object({\n preset_ref: z.string(),\n instance_ids: z.array(z.string().uuid()),\n});\n\n/**\n * Zod schema for the complete skaile.lock.yaml document.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport const LockFileSchema = z.object({\n version: z.literal(2),\n generated_at: z.string(),\n subscriptions: z.array(LockSubscriptionSchema).default([]),\n requires_graph: z.array(RequiresEdgeSchema).default([]),\n presets_expanded: z.array(PresetExpandedSchema).default([]),\n});\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * TypeScript type for the `library:` section of skaile.yaml v2.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport type LibrarySection = z.infer<typeof LibrarySectionSchema>;\n\n/**\n * A single instance UUID reference with optional alias in `library.instances`.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport type LibraryInstanceRef = z.infer<typeof LibraryInstanceRefSchema>;\n\n/**\n * Record of a previously applied preset in the `presets_applied:` section.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport type PresetApplied = z.infer<typeof PresetAppliedSchema>;\n\n/**\n * The parsed v2 workspace config (skaile.yaml `version: 2` document).\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport type WorkspaceConfigV2 = z.infer<typeof WorkspaceConfigV2Schema>;\n\n/**\n * A single resolved-subscription record from skaile.lock.yaml.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport type LockSubscription = z.infer<typeof LockSubscriptionSchema>;\n\n/**\n * The parsed skaile.lock.yaml document.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport type LockFile = z.infer<typeof LockFileSchema>;\n\n// ---------------------------------------------------------------------------\n// skaile.yaml v2 reader/writer\n// ---------------------------------------------------------------------------\n\n/**\n * Extract the v2-specific sections from a parsed skaile.yaml object.\n * Returns null if the object is v1 (no `version: 2` marker).\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport function parseWorkspaceV2(raw: Record<string, unknown>): WorkspaceConfigV2 | null {\n if (raw.version !== 2) return null;\n return WorkspaceConfigV2Schema.parse(raw);\n}\n\n/**\n * Read the v2 sections from a skaile.yaml file on disk.\n * Returns null if the file doesn't exist or is v1.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport function loadWorkspaceV2(dir: string, filename = \"skaile.yaml\"): WorkspaceConfigV2 | null {\n const filePath = path.join(dir, filename);\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = yamlParse(content) as Record<string, unknown>;\n if (!raw || typeof raw !== \"object\") return null;\n return parseWorkspaceV2(raw);\n}\n\n/**\n * Write v2 sections into an existing skaile.yaml, preserving other content.\n * Creates a minimal v2 file if none exists.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport function saveWorkspaceV2(\n dir: string,\n v2: Partial<Omit<WorkspaceConfigV2, \"version\">>,\n filename = \"skaile.yaml\",\n): void {\n const filePath = path.join(dir, filename);\n let existing: Record<string, unknown> = {};\n if (fs.existsSync(filePath)) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n existing = (yamlParse(content) as Record<string, unknown>) ?? {};\n }\n existing.version = 2;\n if (v2.library !== undefined) existing.library = v2.library;\n if (v2.presets_applied !== undefined) existing.presets_applied = v2.presets_applied;\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, yamlStringify(existing, { indent: 2 }), \"utf-8\");\n}\n\n// ---------------------------------------------------------------------------\n// skaile.lock.yaml reader/writer\n// ---------------------------------------------------------------------------\n\nconst LOCK_FILENAME = \"skaile.lock.yaml\";\n\n/**\n * Load and validate a skaile.lock.yaml file.\n * Returns null if the file doesn't exist.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport function loadLockFile(dir: string): LockFile | null {\n const filePath = path.join(dir, LOCK_FILENAME);\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = yamlParse(content);\n return LockFileSchema.parse(raw);\n}\n\n/**\n * Write a skaile.lock.yaml file. Overwrites any existing lock file.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport function saveLockFile(dir: string, lock: LockFile): void {\n const filePath = path.join(dir, LOCK_FILENAME);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(\n filePath,\n `# Auto-generated by skaile. Do not edit manually.\\n${yamlStringify(lock, { indent: 2 })}`,\n \"utf-8\",\n );\n}\n\n/**\n * Create an empty lock file structure.\n *\n * @docLink packages/library/api-reference#lock-file\n */\nexport function createEmptyLockFile(): LockFile {\n return {\n version: 2,\n generated_at: new Date().toISOString(),\n subscriptions: [],\n requires_graph: [],\n presets_expanded: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Version detection\n// ---------------------------------------------------------------------------\n\n/**\n * Detect the workspace config version from a skaile.yaml file.\n * Returns 1 for v1 (no version field), 2 for v2, null if no file.\n *\n * @docLink packages/library/api-reference#workspace-config\n */\nexport function detectWorkspaceVersion(dir: string, filename = \"skaile.yaml\"): 1 | 2 | null {\n const filePath = path.join(dir, filename);\n if (!fs.existsSync(filePath)) return null;\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = yamlParse(content) as Record<string, unknown>;\n if (!raw || typeof raw !== \"object\") return null;\n return raw.version === 2 ? 2 : 1;\n}\n","/**\n * Manifest write-back — on `skaile library add`, when the upstream repo has\n * no `.skaile-source.yaml`, run discovery and write a CLI-generated manifest.\n *\n * Behaviour by ownership:\n * - owner: write file, leave to commit upstream (CLI nudges)\n * - contributor: write file, register in .git/info/exclude (silent)\n * - reader: same as contributor\n *\n * @docLink packages/library/concepts#manifest-writeback\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { LibraryOwnership, LibraryStructure } from \"../user-library.js\";\n\nexport interface WriteManifestInput {\n libraryPath: string;\n ownership: LibraryOwnership;\n structure: LibraryStructure;\n}\n\nexport interface WriteManifestResult {\n wrote: boolean;\n manifestPath: string;\n}\n\nconst MANIFEST_FILENAME = \".skaile-source.yaml\";\n\nexport async function writeManifestIfMissing(\n input: WriteManifestInput,\n): Promise<WriteManifestResult> {\n const manifestPath = path.join(input.libraryPath, MANIFEST_FILENAME);\n if (fs.existsSync(manifestPath)) return { wrote: false, manifestPath };\n\n // Minimal v2 stub — author can fill in discovery results later. The full\n // discovery integration (calling @skaile/workspaces/discovery's discoverAssetsInTree)\n // is deferred to the CLI command, which already imports @skaile/discovery.\n const now = new Date().toISOString();\n const yaml = `# Generated by skaile library add on ${now}\n# Edit by hand to inline discovered assets; or run \\`skaile library refresh-manifest\\`.\nversion: 2\nstructure: ${input.structure}\npublisher: \"\"\nassets: []\n`;\n fs.writeFileSync(manifestPath, yaml, \"utf-8\");\n\n // For non-owners, hide from upstream so the user doesn't accidentally PR it.\n if (input.ownership !== \"owner\") {\n const excludePath = path.join(input.libraryPath, \".git\", \"info\", \"exclude\");\n if (fs.existsSync(path.dirname(excludePath))) {\n const current = fs.existsSync(excludePath) ? fs.readFileSync(excludePath, \"utf-8\") : \"\";\n if (!current.includes(MANIFEST_FILENAME)) {\n fs.writeFileSync(\n excludePath,\n (current.endsWith(\"\\n\") || current === \"\" ? current : `${current}\\n`) +\n `# skaile-managed local-overlay manifest\\n${MANIFEST_FILENAME}\\n`,\n \"utf-8\",\n );\n }\n }\n }\n\n return { wrote: true, manifestPath };\n}\n","/**\n * v1 -> v2 skaile.yaml migration utility.\n *\n * Detects a v1 workspace config (no `version` field) and upgrades it to v2.\n * The upgrade is non-destructive: all existing v1 fields are preserved and\n * the only structural change is adding `version: 2`.\n *\n * @docLink packages/library/api-reference#migration\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { type Document, parse as yamlParse, parseDocument } from \"yaml\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Result returned by {@link migrateWorkspaceConfig}.\n *\n * @docLink packages/library/api-reference#migration\n */\nexport interface MigrationResult {\n /** Whether the file was actually modified (false in dry-run or already v2). */\n migrated: boolean;\n /** Detected version after migration (or current version if no migration). */\n version: 1 | 2;\n /** Human-readable warnings about v1 patterns that need manual attention. */\n warnings: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Migration\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a workspace config needs migration and optionally perform it.\n *\n * The upgrade preserves all existing YAML content (including comments) and\n * inserts `version: 2` at the top of the document.\n *\n * @param dir - Directory containing skaile.yaml.\n * @param opts - `dryRun` to check without writing; `filename` to override the default filename.\n * @returns Migration result with `migrated` flag and any v1-pattern warnings.\n * @docLink packages/library/api-reference#migration\n */\nexport function migrateWorkspaceConfig(\n dir: string,\n opts?: { dryRun?: boolean; filename?: string },\n): MigrationResult {\n const filename = opts?.filename ?? \"skaile.yaml\";\n const filePath = path.join(dir, filename);\n\n if (!fs.existsSync(filePath)) {\n return { migrated: false, version: 1, warnings: [\"No skaile.yaml found\"] };\n }\n\n const content = fs.readFileSync(filePath, \"utf-8\");\n const raw = yamlParse(content) as Record<string, unknown>;\n\n if (!raw || typeof raw !== \"object\") {\n return { migrated: false, version: 1, warnings: [\"Invalid YAML content\"] };\n }\n\n // Already v2\n if (raw.version === 2) {\n return { migrated: false, version: 2, warnings: [] };\n }\n\n const warnings: string[] = [];\n\n // Detect v1 patterns that need manual migration\n if (raw.dependencies && Array.isArray(raw.dependencies)) {\n warnings.push(\n \"v1 'dependencies' field found. In v2, use 'library.instances' to reference \" +\n \"configured asset instances. Manual migration recommended.\",\n );\n }\n\n if (raw.ai_resources) {\n warnings.push(\n \"v1 'ai_resources' field found. In v2, sources are managed via \" +\n \"'skaile source add'. The field still works but is deprecated.\",\n );\n }\n\n if (!opts?.dryRun) {\n // Use parseDocument to preserve comments and formatting.\n // Insert version: 2 at the top so it's the first key.\n const doc = parseDocument(content);\n if (doc.contents && \"items\" in doc.contents) {\n const map = doc.contents as Document.Parsed[\"contents\"] & { items: unknown[] };\n // Remove existing version key if present, then prepend\n const items = map.items as { key?: { value?: unknown } }[];\n const idx = items.findIndex((p) => p.key?.value === \"version\");\n if (idx >= 0) items.splice(idx, 1);\n doc.set(\"version\", 2);\n const added = items.pop();\n if (added) items.unshift(added);\n } else {\n doc.set(\"version\", 2);\n }\n fs.writeFileSync(filePath, doc.toString(), \"utf-8\");\n }\n\n return {\n migrated: !opts?.dryRun,\n version: opts?.dryRun ? 1 : 2,\n warnings,\n };\n}\n","/**\n * Version pin resolver.\n *\n * Resolves a version pin expression (^1.4, ~1.4, 1.4.x, latest, exact:1.4.2)\n * against a set of available versions. Ties broken by highest semver.\n *\n * @docLink packages/library/api-reference#pin-resolver\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A version pin expression string.\n *\n * Supported formats: `exact:X.Y.Z`, `X.Y.Z` (bare), `^X.Y`, `~X.Y`, `X.Y.x`, `latest`.\n *\n * @docLink packages/library/api-reference#pin-resolver\n */\nexport type PinExpression = string;\n\n/**\n * Result of a successful {@link resolvePin} call.\n *\n * @docLink packages/library/api-reference#pin-resolver\n */\nexport interface ResolveResult {\n /** The matched version string. */\n version: string;\n /** How the match was made. */\n match: \"exact\" | \"range\" | \"latest\";\n}\n\ninterface SemVer {\n major: number;\n minor: number;\n patch: number;\n raw: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a version pin expression against available versions.\n *\n * Supported pin formats:\n * - `exact:1.4.2` — exact match only\n * - `1.4.2` — exact match (bare version)\n * - `^1.4` or `^1.4.0` — caret range (>=1.4.0, <2.0.0)\n * - `~1.4` or `~1.4.0` — tilde range (>=1.4.0, <1.5.0)\n * - `1.4.x` — same as ~1.4 (patch-level)\n * - `latest` — highest available version\n *\n * @param pin - The pin expression string.\n * @param availableVersions - All available version strings to match against.\n * @returns The best matching version (highest within range), or null if no match.\n * @docLink packages/library/api-reference#pin-resolver\n */\nexport function resolvePin(pin: PinExpression, availableVersions: string[]): ResolveResult | null {\n if (availableVersions.length === 0) return null;\n\n const parsed = availableVersions\n .map(parseSemVer)\n .filter((v): v is SemVer => v !== null)\n .sort((a, b) => compareSemVer(b, a)); // descending — highest first\n\n if (parsed.length === 0) return null;\n\n // latest — pick the highest\n if (pin === \"latest\") {\n return { version: parsed[0].raw, match: \"latest\" };\n }\n\n // exact:X.Y.Z — strict equality\n if (pin.startsWith(\"exact:\")) {\n const target = pin.slice(6);\n const found = parsed.find((v) => v.raw === target);\n return found ? { version: found.raw, match: \"exact\" } : null;\n }\n\n // ^X.Y.Z or ^X.Y — caret range (>=X.Y.Z, <(X+1).0.0)\n // NOTE: Deviates from npm semver for major-zero ranges. npm treats ^0.1.4 as\n // >=0.1.4, <0.2.0 (minor-locked). We treat it as >=0.1.4, <1.0.0 (major-locked).\n // This is acceptable in Phase 1 (no assets use 0.x versions). Fix before Phase 2.\n if (pin.startsWith(\"^\")) {\n const target = parseRangeTarget(pin.slice(1));\n if (!target) return null;\n\n const match = parsed.find(\n (v) =>\n v.major === target.major &&\n (v.minor > target.minor || (v.minor === target.minor && v.patch >= target.patch)),\n );\n return match ? { version: match.raw, match: \"range\" } : null;\n }\n\n // ~X.Y.Z or ~X.Y — tilde range (>=X.Y.Z, <X.(Y+1).0)\n if (pin.startsWith(\"~\")) {\n const target = parseRangeTarget(pin.slice(1));\n if (!target) return null;\n\n const match = parsed.find(\n (v) => v.major === target.major && v.minor === target.minor && v.patch >= target.patch,\n );\n return match ? { version: match.raw, match: \"range\" } : null;\n }\n\n // X.Y.x — same as ~X.Y.0\n if (pin.endsWith(\".x\")) {\n const base = pin.slice(0, -2);\n const parts = base.split(\".\");\n const major = Number.parseInt(parts[0], 10);\n const minor = parts.length > 1 ? Number.parseInt(parts[1], 10) : 0;\n\n if (Number.isNaN(major)) return null;\n\n const match = parsed.find(\n (v) => v.major === major && (Number.isNaN(minor) || v.minor === minor),\n );\n return match ? { version: match.raw, match: \"range\" } : null;\n }\n\n // Bare version — exact match\n const bareSemver = parseSemVer(pin);\n if (bareSemver) {\n const found = parsed.find((v) => v.raw === pin);\n return found ? { version: found.raw, match: \"exact\" } : null;\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseSemVer(v: string): SemVer | null {\n const match = v.match(/^(\\d+)\\.(\\d+)\\.(\\d+)/);\n if (!match) return null;\n return {\n major: Number.parseInt(match[1], 10),\n minor: Number.parseInt(match[2], 10),\n patch: Number.parseInt(match[3], 10),\n raw: v,\n };\n}\n\nfunction compareSemVer(a: SemVer, b: SemVer): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n return a.patch - b.patch;\n}\n\nfunction parseRangeTarget(range: string): { major: number; minor: number; patch: number } | null {\n const parts = range.split(\".\");\n const major = Number.parseInt(parts[0], 10);\n if (Number.isNaN(major)) return null;\n const minor = parts.length > 1 ? Number.parseInt(parts[1], 10) : 0;\n const patch = parts.length > 2 ? Number.parseInt(parts[2], 10) : 0;\n return {\n major,\n minor: Number.isNaN(minor) ? 0 : minor,\n patch: Number.isNaN(patch) ? 0 : patch,\n };\n}\n","/**\n * LocalCatalogSource — ICatalogSource backed by local filesystem discovery.\n *\n * Walks subscribed local repos via `discoverAssetsInTree`, computes SHA256\n * over the deterministic file filter, and caches AssetDefinition rows in\n * the LocalIndex SQLite.\n *\n * Used by the CLI for local-only workflows. The platform uses the remote\n * catalog source (Phase 2).\n *\n * @docLink packages/library/concepts#local-catalog-source\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport {\n type DiscoveryResult,\n discoverAssetsInTree,\n loadSourceConfig,\n type SourceConfig,\n} from \"@skaile/workspaces/discovery\";\nimport type {\n CatalogAsset,\n CatalogAssetFilter,\n CatalogSourceInfo,\n IAssetKindRegistry,\n ICatalogSource,\n} from \"@skaile/workspaces/plugins\";\nimport type { AssetDefinition, AssetFilter } from \"../library.js\";\nimport type { LocalIndex } from \"./library.js\";\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\n/**\n * Optional constructor opts for {@link LocalCatalogSource}.\n *\n * @docLink packages/library/concepts#local-catalog-source\n */\nexport interface LocalCatalogSourceOptions {\n /**\n * Absolute path to a sidecar directory carrying a local-overlay manifest\n * (`~/.skaile/sources/<slug>/`). When set, discovery merges the sidecar's\n * `.skaile-source.yaml` on top of the in-repo config before dispatch.\n *\n * Typically populated by `openLibrary()`-based callers reading\n * `source.sidecarPath` from the registered source row.\n */\n sidecarPath?: string;\n}\n\n// ---------------------------------------------------------------------------\n// LocalCatalogSource\n// ---------------------------------------------------------------------------\n\n/**\n * Local-filesystem implementation of `ICatalogSource` (from `@skaile/plugins`).\n *\n * Backed by `discoverAssetsInTree` from `@skaile/discovery`. Upserts discovered\n * assets into the `LocalIndex` cache via `upsertAssetDef()`. Preset-kind assets\n * are skipped (handled by the Preset subsystem, not stored as AssetDefinitions).\n *\n * @docLink packages/library/concepts#local-catalog-source\n */\nexport class LocalCatalogSource implements ICatalogSource {\n readonly id: string;\n private readonly sidecarPath?: string;\n\n constructor(\n private readonly library: LocalIndex,\n private readonly sourceId: string,\n private readonly rootPath: string,\n private readonly registry?: IAssetKindRegistry,\n options?: LocalCatalogSourceOptions,\n ) {\n this.id = `local:${sourceId}`;\n this.sidecarPath = options?.sidecarPath;\n }\n\n async resolve(ref: string): Promise<CatalogAsset | null> {\n const def = await this.library.getAssetDef(ref);\n if (!def || def.libraryId !== this.sourceId) return null;\n return defToCatalogAsset(def);\n }\n\n async listAssets(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const libraryFilter: AssetFilter = { libraryId: this.sourceId };\n if (filter?.kind) libraryFilter.kind = filter.kind as AssetDefinition[\"kind\"];\n if (filter?.publisher) libraryFilter.publisher = filter.publisher;\n if (filter?.prefix) libraryFilter.prefix = filter.prefix;\n\n const defs = await this.library.listAssetDefs(libraryFilter);\n return defs.map(defToCatalogAsset);\n }\n\n async fetchTarball(_ref: string, _sha256: string): Promise<Uint8Array> {\n throw new Error(\n \"LocalCatalogSource does not support tarball delivery. Assets are available on disk.\",\n );\n }\n\n async listSources(): Promise<CatalogSourceInfo[]> {\n return [{ id: this.sourceId, type: \"local\", url: this.rootPath }];\n }\n\n /**\n * Sync: discover assets in the source directory and cache them in the library.\n *\n * Runs the discovery pipeline (glob -> parse -> filter -> hash -> requires)\n * and upserts each discovered asset into the LocalIndex cache.\n *\n * @param syncOpts - When `includeDev` is set, assets under the source\n * config's `dev_paths` (e.g. `ai-assets-dev/`) are discovered and cached\n * too. Defaults to excluding them (a normal run).\n * @returns Discovery statistics and any errors encountered.\n */\n async sync(syncOpts?: {\n includeDev?: boolean;\n }): Promise<{ assetsFound: number; assetsUpdated: number; errors: string[] }> {\n // Sidecar overlay: when present, discoverAssetsInTree merges\n // `<rootPath>/.skaile-source.yaml` (base) with\n // `<sidecarPath>/.skaile-source.yaml` (overlay) per PR-3 § D.3.\n // Pass `sidecarPath` directly to keep the merge logic in one place.\n const opts: Parameters<typeof discoverAssetsInTree>[1] = {\n registry: this.registry,\n sidecarPath: this.sidecarPath,\n includeDev: syncOpts?.includeDev ?? false,\n };\n if (!this.sidecarPath) {\n // No sidecar: load the base config eagerly so existing behaviour\n // (publisher overrides from in-repo config alone) is preserved.\n opts.sourceConfig = loadSourceConfigIfPresent(this.rootPath);\n }\n const result: DiscoveryResult = discoverAssetsInTree(this.rootPath, opts);\n\n let assetsUpdated = 0;\n const errors: string[] = [];\n\n for (const asset of result.assets) {\n // Preset is a composition entity, not an asset kind — skip library upsert.\n // Presets are still discovered (for the requires graph) but handled by the\n // Preset system in Task 1.6, not stored as AssetDefinitions.\n if (asset.kind === \"preset\") continue;\n\n try {\n await this.library.upsertAssetDef({\n id: asset.ref,\n kind: asset.kind as AssetDefinition[\"kind\"],\n publisher: asset.publisher,\n name: asset.name,\n version: asset.version,\n sha256: asset.sha256,\n description:\n typeof asset.manifest.description === \"string\" ? asset.manifest.description : undefined,\n license: typeof asset.manifest.license === \"string\" ? asset.manifest.license : undefined,\n category:\n typeof asset.manifest.category === \"string\" ? asset.manifest.category : undefined,\n manifest: asset.manifest,\n libraryId: this.sourceId,\n cachedAt: new Date(),\n updatedAt: new Date(),\n });\n assetsUpdated++;\n } catch (err) {\n errors.push(`${asset.ref}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n for (const err of result.errors) {\n errors.push(`${err.path}: ${err.error}`);\n }\n\n return { assetsFound: result.assets.length, assetsUpdated, errors };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction defToCatalogAsset(def: AssetDefinition): CatalogAsset {\n return {\n id: def.id,\n kind: def.kind,\n publisher: def.publisher,\n name: def.name,\n version: def.version,\n sha256: def.sha256,\n description: def.description,\n license: def.license,\n category: def.category,\n manifest: def.manifest,\n };\n}\n\nfunction loadSourceConfigIfPresent(rootPath: string): SourceConfig | undefined {\n const configPath = path.join(rootPath, \".skaile-source.yaml\");\n if (!fs.existsSync(configPath)) return undefined;\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n const result = loadSourceConfig(content);\n if (!result.ok) return undefined;\n return result.config;\n } catch {\n return undefined;\n }\n}\n","/**\n * Filesystem cache for {@link RemoteCatalogSource}.\n *\n * Cache layout (default `~/.skaile/catalog-cache/`):\n *\n * <dir>/\n * index.json — JSON map of metadata entries with TTL bookkeeping\n * tarballs/<sha>.tgz — content-addressed tarball blobs (SHA256-verified)\n *\n * Two caches live in `index.json`:\n *\n * - **resolve cache** — keyed by canonical ref (`<publisher>/<name>@<version>`),\n * value is the {@link CatalogAsset} or `null` (negative cache for missing refs)\n * plus a `fetchedAt` timestamp.\n * - **list cache** — keyed by a deterministic stringified filter,\n * value is the array of {@link CatalogAsset} plus a `fetchedAt` timestamp.\n *\n * Tarball blobs are cached on disk by SHA256; the SHA256 itself acts as the\n * integrity tag, so no separate TTL is needed — content-addressed blobs never\n * become stale.\n *\n * Concurrency: writes go through atomic temp-file rename to keep readers consistent.\n * Multiple processes writing to the same cache dir is safe at the per-key level\n * (last writer wins) but readers may see momentarily stale data — acceptable\n * for a CLI cache.\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport * as crypto from \"node:crypto\";\nimport type { CatalogAsset, CatalogAssetFilter } from \"@skaile/workspaces/plugins\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * One entry in the resolve cache. `value` is `null` to negatively-cache misses.\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport interface ResolveCacheEntry {\n fetchedAt: number;\n value: CatalogAsset | null;\n}\n\n/**\n * One entry in the list cache. `key` is a stable string derived from the\n * filter; `items` is the response array.\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport interface ListCacheEntry {\n fetchedAt: number;\n items: CatalogAsset[];\n}\n\n/**\n * Persisted shape of `index.json`.\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport interface CatalogCacheIndex {\n /** Schema version — bumped on incompatible layout changes. */\n version: 1;\n /** Resolve cache by canonical ref. */\n resolve: Record<string, ResolveCacheEntry>;\n /** List cache by filter key. */\n list: Record<string, ListCacheEntry>;\n}\n\n/**\n * Options for {@link CatalogCache}.\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport interface CatalogCacheOptions {\n /** Cache directory. Default: `~/.skaile/catalog-cache/`. */\n dir?: string;\n /** TTL in milliseconds. `0` disables network and forces cache-only reads. */\n ttlMs: number;\n /** Override clock for tests. */\n now?: () => number;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nfunction defaultCacheDir(): string {\n return path.join(os.homedir(), \".skaile\", \"catalog-cache\");\n}\n\nconst INDEX_FILE = \"index.json\";\nconst TARBALL_DIR = \"tarballs\";\n\n// ---------------------------------------------------------------------------\n// CatalogCache\n// ---------------------------------------------------------------------------\n\n/**\n * Filesystem-backed cache for catalog metadata + tarballs.\n *\n * Per-key freshness is computed against {@link CatalogCacheOptions.ttlMs}. When\n * `ttlMs === 0` the cache is treated as **air-gapped** — every entry is\n * considered valid forever, and the only way to refresh is an explicit\n * {@link CatalogCache.invalidateAll} call (driven by `skaile update`).\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport class CatalogCache {\n readonly dir: string;\n private readonly ttlMs: number;\n private readonly nowFn: () => number;\n private index: CatalogCacheIndex | null = null;\n\n constructor(opts: CatalogCacheOptions) {\n this.dir = opts.dir ?? defaultCacheDir();\n this.ttlMs = opts.ttlMs;\n this.nowFn = opts.now ?? Date.now;\n this.ensureDir();\n }\n\n // ── public: resolve cache ───────────────────────────────────────────────\n\n /**\n * Return a fresh resolve-cache entry for `ref`, or `null` if absent / stale.\n *\n * When `ttlMs === 0` (air-gapped), all entries are considered fresh\n * regardless of `fetchedAt`.\n */\n getResolve(ref: string): ResolveCacheEntry | null {\n const idx = this.loadIndex();\n const entry = idx.resolve[ref];\n if (!entry) return null;\n if (this.ttlMs === 0) return entry;\n if (this.nowFn() - entry.fetchedAt > this.ttlMs) return null;\n return entry;\n }\n\n /**\n * Return a stale resolve-cache entry regardless of TTL — for stale-while-revalidate.\n */\n getResolveStale(ref: string): ResolveCacheEntry | null {\n const idx = this.loadIndex();\n return idx.resolve[ref] ?? null;\n }\n\n /** Persist a resolve-cache entry (use `null` to negatively cache misses). */\n setResolve(ref: string, value: CatalogAsset | null): void {\n const idx = this.loadIndex();\n idx.resolve[ref] = { fetchedAt: this.nowFn(), value };\n this.writeIndex(idx);\n }\n\n // ── public: list cache ──────────────────────────────────────────────────\n\n /**\n * Return a fresh list-cache entry for `filter`, or `null` if absent / stale.\n */\n getList(filter?: CatalogAssetFilter): ListCacheEntry | null {\n const key = filterKey(filter);\n const idx = this.loadIndex();\n const entry = idx.list[key];\n if (!entry) return null;\n if (this.ttlMs === 0) return entry;\n if (this.nowFn() - entry.fetchedAt > this.ttlMs) return null;\n return entry;\n }\n\n /** Return a stale list-cache entry regardless of TTL — for stale-while-revalidate. */\n getListStale(filter?: CatalogAssetFilter): ListCacheEntry | null {\n const key = filterKey(filter);\n const idx = this.loadIndex();\n return idx.list[key] ?? null;\n }\n\n /** Persist a list-cache entry. */\n setList(filter: CatalogAssetFilter | undefined, items: CatalogAsset[]): void {\n const key = filterKey(filter);\n const idx = this.loadIndex();\n idx.list[key] = { fetchedAt: this.nowFn(), items };\n this.writeIndex(idx);\n }\n\n // ── public: tarball cache ───────────────────────────────────────────────\n\n /** Absolute path where a tarball with `sha256` would be cached. */\n tarballPath(sha256: string): string {\n return path.join(this.dir, TARBALL_DIR, `${sha256}.tgz`);\n }\n\n /** Read a cached tarball from disk if present, otherwise `null`. */\n readTarball(sha256: string): Uint8Array | null {\n const p = this.tarballPath(sha256);\n if (!fs.existsSync(p)) return null;\n return fs.readFileSync(p);\n }\n\n /** Persist a tarball blob to disk (atomic write). */\n writeTarball(sha256: string, bytes: Uint8Array): void {\n const dir = path.join(this.dir, TARBALL_DIR);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n const finalPath = this.tarballPath(sha256);\n const tmpPath = `${finalPath}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;\n fs.writeFileSync(tmpPath, bytes);\n fs.renameSync(tmpPath, finalPath);\n }\n\n // ── public: invalidation ────────────────────────────────────────────────\n\n /**\n * Wipe all cached metadata (resolve + list). Tarballs are content-addressed\n * and remain valid — they are not invalidated.\n *\n * Called by `skaile update`.\n */\n invalidateAll(): void {\n const idx: CatalogCacheIndex = { version: 1, resolve: {}, list: {} };\n this.index = idx;\n this.writeIndex(idx);\n }\n\n /**\n * Wipe all cached metadata **and** delete tarball blobs. Used for full reset.\n */\n invalidateEverything(): void {\n this.invalidateAll();\n const tarballDir = path.join(this.dir, TARBALL_DIR);\n if (fs.existsSync(tarballDir)) {\n fs.rmSync(tarballDir, { recursive: true, force: true });\n }\n }\n\n /** Return whether `ttlMs` is zero (air-gapped mode). */\n get airGapped(): boolean {\n return this.ttlMs === 0;\n }\n\n // ── private ─────────────────────────────────────────────────────────────\n\n private ensureDir(): void {\n if (!fs.existsSync(this.dir)) fs.mkdirSync(this.dir, { recursive: true });\n const tarballDir = path.join(this.dir, TARBALL_DIR);\n if (!fs.existsSync(tarballDir)) fs.mkdirSync(tarballDir, { recursive: true });\n }\n\n private indexPath(): string {\n return path.join(this.dir, INDEX_FILE);\n }\n\n private loadIndex(): CatalogCacheIndex {\n if (this.index) return this.index;\n const p = this.indexPath();\n if (!fs.existsSync(p)) {\n this.index = { version: 1, resolve: {}, list: {} };\n return this.index;\n }\n try {\n const raw = JSON.parse(fs.readFileSync(p, \"utf-8\"));\n if (raw && typeof raw === \"object\" && raw.version === 1) {\n this.index = {\n version: 1,\n resolve: raw.resolve ?? {},\n list: raw.list ?? {},\n };\n return this.index;\n }\n } catch {\n // fall through to fresh\n }\n this.index = { version: 1, resolve: {}, list: {} };\n return this.index;\n }\n\n private writeIndex(idx: CatalogCacheIndex): void {\n this.index = idx;\n const p = this.indexPath();\n const tmp = `${p}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(idx, null, 2), \"utf-8\");\n fs.renameSync(tmp, p);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Stable string key for a {@link CatalogAssetFilter}. Sorts keys so semantically\n * equivalent filters share a cache slot.\n */\nexport function filterKey(filter?: CatalogAssetFilter): string {\n if (!filter) return \"__all__\";\n const keys = Object.keys(filter).sort();\n const norm: Record<string, unknown> = {};\n for (const k of keys) {\n const v = (filter as Record<string, unknown>)[k];\n if (v !== undefined) norm[k] = v;\n }\n return Object.keys(norm).length === 0 ? \"__all__\" : JSON.stringify(norm);\n}\n\n/**\n * Compute the SHA-256 digest of `bytes` as a lowercase hex string.\n *\n * Used by {@link RemoteCatalogSource.fetchTarball} to verify integrity of\n * downloaded tarballs (spec invariant: \"Hash pinning ... Mismatch = hard fail\").\n *\n * @docLink packages/library/api-reference#catalog-cache\n */\nexport function sha256Hex(bytes: Uint8Array): string {\n const h = crypto.createHash(\"sha256\");\n h.update(bytes);\n return h.digest(\"hex\");\n}\n","/**\n * RemoteCatalogSource — `ICatalogSource` HTTP client for the public skaile.store\n * Catalog backend (see `store/backend`).\n *\n * Wire shape:\n *\n * GET /trpc/catalog.get?input=<superjson({ ref })> → { result: { data: AssetDefinition | null } }\n * GET /trpc/catalog.list?input=<superjson({ filter? })> → { result: { data: AssetDefinition[] } }\n * GET /tarball/<sha256> → 307 → <storage url> (binary tarball)\n *\n * The tRPC server uses the standalone fastify adapter at `prefix: /trpc`\n * (`store/backend/libs/router-trpc/src/trpc.plugin.ts`). The transformer is\n * superjson, but our queries take only plain primitives + objects so the\n * `meta` envelope is empty in practice; we still send the canonical\n * `{ \"json\": ... }` shape so the server's superjson decoder is happy.\n *\n * The REST `GET /tarball/:sha256` controller lives at\n * `store/backend/apps/api/src/tarball.controller.ts` and 307-redirects to the\n * storage tier (presigned S3 URL or public CDN URL). The client is responsible\n * for following the redirect, downloading the bytes, and **verifying SHA256\n * client-side** — mismatch is a hard fail (spec invariant: \"Hash pinning ...\n * Mismatch = hard fail\").\n *\n * Cache: see {@link CatalogCache}. Stale-while-revalidate on metadata: a\n * stale entry serves the read while a background fetch refreshes the slot.\n * Tarballs are content-addressed and never expire — once cached on disk by\n * SHA256 they remain valid forever (until {@link CatalogCache.invalidateEverything}).\n *\n * Air-gapped: `cacheTtlMs: 0` disables network reads entirely. Every method\n * serves from cache or throws {@link OfflineError}; only `skaile update`\n * (which calls {@link RemoteCatalogSource.refresh}) flips the network on\n * for one bulk refresh.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\n\nimport type {\n ICatalogSource,\n CatalogAsset,\n CatalogAssetFilter,\n CatalogSourceInfo,\n} from \"@skaile/workspaces/plugins\";\nimport type { InstallManifest } from \"@skaile/workspaces/types\";\n\nimport { CatalogCache, sha256Hex, type CatalogCacheOptions } from \"./cache.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * A `fetch`-shaped function. Injected for tests; defaults to global `fetch`.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport type HttpClient = (\n url: string,\n init?: {\n method?: string;\n headers?: Record<string, string>;\n redirect?: \"follow\" | \"manual\" | \"error\";\n },\n) => Promise<Response>;\n\n/**\n * Constructor options for {@link RemoteCatalogSource}.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport interface RemoteCatalogSourceOptions {\n /** Base URL of the Catalog backend, e.g. `https://api.skaile.store`. No trailing slash required. */\n baseUrl: string;\n /**\n * Metadata cache TTL in milliseconds.\n * Default `86_400_000` (24h). `0` disables network — air-gapped mode.\n */\n cacheTtlMs?: number;\n /** Override `fetch` for tests. */\n httpClient?: HttpClient;\n /** Override the cache directory. Default is `~/.skaile/catalog-cache/`. */\n cacheDir?: string;\n /** Override clock for tests. */\n now?: () => number;\n /** Pre-built cache instance (test injection). When provided, `cacheTtlMs`/`cacheDir`/`now` are ignored. */\n cache?: CatalogCache;\n /**\n * If true, suppresses the background revalidation `unhandledRejection` log when\n * a stale-while-revalidate fetch fails. Default false.\n */\n silentBackgroundErrors?: boolean;\n}\n\n/**\n * Thrown when the SHA256 of a downloaded tarball does not match the expected\n * value. This is a **hard fail** per the spec — the bytes are tampered or\n * corrupt and must not be installed.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport class TarballHashMismatchError extends Error {\n constructor(\n public readonly expected: string,\n public readonly actual: string,\n ) {\n super(`SHA256 mismatch: expected ${expected}, got ${actual}`);\n this.name = \"TarballHashMismatchError\";\n }\n}\n\n/**\n * Thrown when the client is in air-gapped mode (`cacheTtlMs === 0`) and the\n * requested data is not in the cache. The caller can resolve by running\n * `skaile update` to perform a one-shot bulk refresh.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport class OfflineError extends Error {\n constructor(message: string) {\n super(`${message} (air-gapped mode; run \\`skaile update\\` to refresh the cache)`);\n this.name = \"OfflineError\";\n }\n}\n\n/**\n * Thrown when the Catalog backend returns a non-2xx (and non-307 for tarball\n * fetch) response. Carries the HTTP status for debug.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport class CatalogHttpError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly url?: string,\n ) {\n super(message);\n this.name = \"CatalogHttpError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// RemoteCatalogSource\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TTL_MS = 86_400_000; // 24h\n\n/**\n * HTTP client implementation of `ICatalogSource` for the public skaile.store\n * Catalog. See module docstring for the wire contract.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport class RemoteCatalogSource implements ICatalogSource {\n readonly id: string;\n readonly baseUrl: string;\n readonly cache: CatalogCache;\n private readonly cacheTtlMs: number;\n private readonly httpClient: HttpClient;\n private readonly silentBackgroundErrors: boolean;\n /** Tracks in-flight background revalidations so callers can `await` them in tests. */\n private readonly inFlight = new Map<string, Promise<void>>();\n\n constructor(opts: RemoteCatalogSourceOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.id = `remote:${this.baseUrl}`;\n this.cacheTtlMs = opts.cacheTtlMs ?? DEFAULT_TTL_MS;\n this.httpClient = opts.httpClient ?? defaultFetch;\n this.silentBackgroundErrors = opts.silentBackgroundErrors ?? false;\n this.cache =\n opts.cache ??\n new CatalogCache({\n dir: opts.cacheDir,\n ttlMs: this.cacheTtlMs,\n now: opts.now,\n } satisfies CatalogCacheOptions);\n }\n\n // ── ICatalogSource ──────────────────────────────────────────────────────\n\n /**\n * Resolve a single asset by canonical ref (`<publisher>/<name>@<version>`).\n *\n * Cache: hit returns immediately. Miss fetches `/trpc/catalog.get`. Stale\n * entry serves the cached value and triggers a background refresh.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n */\n async resolve(ref: string): Promise<CatalogAsset | null> {\n const fresh = this.cache.getResolve(ref);\n if (fresh) return fresh.value;\n\n if (this.cache.airGapped) {\n const stale = this.cache.getResolveStale(ref);\n if (stale) return stale.value;\n throw new OfflineError(`Asset '${ref}' not in cache`);\n }\n\n // Stale-while-revalidate: serve stale + refresh in background.\n const stale = this.cache.getResolveStale(ref);\n if (stale) {\n this.scheduleBackground(`resolve:${ref}`, () => this.fetchAndStoreResolve(ref));\n return stale.value;\n }\n\n return this.fetchAndStoreResolve(ref);\n }\n\n /**\n * List assets matching `filter`.\n *\n * Cache: hit returns immediately. Miss fetches `/trpc/catalog.list`. Stale\n * entry serves the cached array and triggers a background refresh.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n */\n async listAssets(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const fresh = this.cache.getList(filter);\n if (fresh) return fresh.items;\n\n if (this.cache.airGapped) {\n const stale = this.cache.getListStale(filter);\n if (stale) return stale.items;\n throw new OfflineError(\"Catalog list not in cache\");\n }\n\n const stale = this.cache.getListStale(filter);\n if (stale) {\n const filterKey = JSON.stringify(filter ?? null);\n this.scheduleBackground(`list:${filterKey}`, () => this.fetchAndStoreList(filter));\n return stale.items;\n }\n\n return this.fetchAndStoreList(filter);\n }\n\n /**\n * Fetch the content-addressed tarball for an asset. The bytes are downloaded\n * via the REST endpoint `GET /tarball/:sha256` (which 307-redirects to the\n * storage tier), then verified against `sha256` on the client side.\n *\n * Cache: tarballs are content-addressed and cached forever once written.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n *\n * @throws {@link TarballHashMismatchError} when the downloaded SHA256 does not match.\n */\n async fetchTarball(_ref: string, sha256: string): Promise<Uint8Array> {\n const cached = this.cache.readTarball(sha256);\n if (cached) {\n // Defensive: re-verify the cached blob. A bit-flip on disk should not\n // poison the install path. (Cheap — local file read, ~ms.)\n const actual = sha256Hex(cached);\n if (actual !== sha256) {\n throw new TarballHashMismatchError(sha256, actual);\n }\n return cached;\n }\n\n if (this.cache.airGapped) {\n throw new OfflineError(`Tarball '${sha256}' not in cache`);\n }\n\n const url = `${this.baseUrl}/tarball/${encodeURIComponent(sha256)}`;\n const res = await this.httpClient(url, { method: \"GET\", redirect: \"follow\" });\n if (!res.ok) {\n throw new CatalogHttpError(\n `Failed to fetch tarball ${sha256}: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const buf = new Uint8Array(await res.arrayBuffer());\n const actual = sha256Hex(buf);\n if (actual !== sha256) {\n throw new TarballHashMismatchError(sha256, actual);\n }\n this.cache.writeTarball(sha256, buf);\n return buf;\n }\n\n /**\n * Single synthetic Source pointing at the configured Catalog URL. Phase 2\n * is single-Source per spec; multi-source federation is Phase 4.8.\n */\n async listSources(): Promise<CatalogSourceInfo[]> {\n return [{ id: this.id, type: \"remote-catalog\", url: this.baseUrl }];\n }\n\n // ── extension API ───────────────────────────────────────────────────────\n\n /**\n * Force a metadata-cache refresh. Wipes all resolve/list entries and\n * re-fetches `listAssets()` (no filter) to pre-warm the canonical query.\n *\n * Driven by `skaile update`. Tarballs (content-addressed) are not touched\n * — they remain valid across refreshes.\n *\n * In air-gapped mode this method **does** make a network call (bypassing\n * the TTL=0 gate); it is the only way to repopulate the cache.\n */\n async refresh(): Promise<{ assetsCached: number }> {\n this.cache.invalidateAll();\n // Air-gapped bypass: call the network directly even when ttl is 0.\n const items = await this.fetchListNetwork(undefined);\n this.cache.setList(undefined, items);\n // Pre-warm resolve cache for known refs so subsequent reads are hot.\n for (const item of items) {\n this.cache.setResolve(item.id, item);\n }\n return { assetsCached: items.length };\n }\n\n /**\n * Fetch the pointer-only install manifest for an asset ref.\n *\n * The install manifest is the Pointer Triple: the immutable upstream\n * `source.url` + `source.commitSha`, the per-file `files[].sha256` list, a\n * composite `sha256` rollup, plus `kind` and `tier`. Callers fetch the asset\n * bytes directly from the upstream repo at that commit and verify each file\n * against the recorded hashes — the Catalog itself never serves asset bytes.\n *\n * Wire surface: `GET /trpc/catalog.getInstallManifest?input=<superjson({ ref })>`.\n *\n * This is a `RemoteCatalogSource`-only method — it is not part of the\n * `ICatalogSource` contract. `LocalCatalogSource` has the asset bytes on disk\n * and has no pointer-triple concept, so adding it to the shared interface\n * would force a meaningless implementation there.\n *\n * Not cached: the install path is a one-shot read driven by `skaile install`.\n *\n * @throws {@link CatalogHttpError} on a non-2xx response or malformed envelope.\n */\n async getInstallManifest(ref: string): Promise<InstallManifest> {\n const url = trpcGetUrl(this.baseUrl, \"catalog.getInstallManifest\", { ref });\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog.getInstallManifest ${ref} failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseTrpcGet(res);\n if (data === null || data === undefined || typeof data !== \"object\") {\n throw new CatalogHttpError(\n `catalog.getInstallManifest ${ref} returned a non-object payload (got ${typeof data})`,\n 200,\n url,\n );\n }\n return data as InstallManifest;\n }\n\n /**\n * Cheap probe used during cross-check when both a source-side and a store-side\n * candidate at the same version need to be verified for sha256 equality.\n * Returns only the composite sha256 — no source URL, no file list.\n *\n * Wire: `GET /trpc/catalog.getCanonicalDigest?input=<superjson({ ref })>`.\n *\n * Not cached: one-shot read during install resolution.\n *\n * @param ref - Canonical asset ref `<publisher>/<kind>:<name>@<version>`.\n * @returns `{ sha256 }` on a 200, or `null` on a 404.\n * @throws {@link CatalogHttpError} on a non-2xx/non-404 response or malformed payload.\n * @docLink packages/library/api-reference#remote-catalog-source\n */\n async getCanonicalDigest(ref: string): Promise<{ sha256: string } | null> {\n const url = trpcGetUrl(this.baseUrl, \"catalog.getCanonicalDigest\", { ref });\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (res.status === 404) return null;\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog.getCanonicalDigest ${ref} failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseTrpcGet(res);\n if (!data || typeof data !== \"object\") {\n throw new CatalogHttpError(\n `catalog.getCanonicalDigest ${ref} returned a non-object payload`,\n 200,\n url,\n );\n }\n const d = data as { sha256?: unknown };\n if (typeof d.sha256 !== \"string\") {\n throw new CatalogHttpError(\n `catalog.getCanonicalDigest ${ref} missing sha256 string`,\n 200,\n url,\n );\n }\n return { sha256: d.sha256 };\n }\n\n /**\n * Wait for any in-flight stale-while-revalidate background fetches to settle.\n * Test-only escape hatch.\n */\n async waitForBackground(): Promise<void> {\n // Snapshot to avoid mutation during iteration.\n const promises = Array.from(this.inFlight.values());\n await Promise.allSettled(promises);\n }\n\n // ── private ─────────────────────────────────────────────────────────────\n\n private scheduleBackground(key: string, fn: () => Promise<unknown>): void {\n if (this.inFlight.has(key)) return;\n const p = (async () => {\n try {\n await fn();\n } catch (err) {\n if (!this.silentBackgroundErrors) {\n process.stderr.write(\n `[skaile/catalog] Background refresh failed for ${key}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n } finally {\n this.inFlight.delete(key);\n }\n })();\n this.inFlight.set(key, p);\n }\n\n private async fetchAndStoreResolve(ref: string): Promise<CatalogAsset | null> {\n const value = await this.fetchResolveNetwork(ref);\n this.cache.setResolve(ref, value);\n return value;\n }\n\n private async fetchAndStoreList(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const items = await this.fetchListNetwork(filter);\n this.cache.setList(filter, items);\n return items;\n }\n\n /** Raw network call: GET /trpc/catalog.get?input=<superjson> */\n private async fetchResolveNetwork(ref: string): Promise<CatalogAsset | null> {\n const url = trpcGetUrl(this.baseUrl, \"catalog.get\", { ref });\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog.get ${ref} failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseTrpcGet(res);\n if (data === null || data === undefined) return null;\n return normalizeCatalogAsset(data);\n }\n\n /** Raw network call: GET /trpc/catalog.list?input=<superjson> */\n private async fetchListNetwork(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const input = filter ? { filter } : {};\n const url = trpcGetUrl(this.baseUrl, \"catalog.list\", input);\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog.list failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseTrpcGet(res);\n if (!Array.isArray(data)) {\n throw new CatalogHttpError(\n `catalog.list returned non-array payload (got ${typeof data})`,\n 200,\n url,\n );\n }\n return data.map(normalizeCatalogAsset);\n }\n}\n\n// ---------------------------------------------------------------------------\n// tRPC GET helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a tRPC v11 GET URL with superjson-encoded input.\n *\n * Format: `<base>/trpc/<procedure>?input=<urlencoded({\"json\": <input>})>`\n *\n * superjson encodes plain values as `{ \"json\": <value> }`. The `meta` block is\n * only present for non-JSON-native types (Date, Map, BigInt, etc.) — our inputs\n * are plain strings/objects so we never emit `meta`.\n *\n * Exported for tests.\n *\n * @docLink packages/library/api-reference#remote-catalog-source\n */\nexport function trpcGetUrl(baseUrl: string, procedure: string, input: unknown): string {\n const wrapped = JSON.stringify({ json: input });\n return `${baseUrl.replace(/\\/+$/, \"\")}/trpc/${procedure}?input=${encodeURIComponent(wrapped)}`;\n}\n\n/**\n * Parse a tRPC GET response body and unwrap the superjson `result.data`\n * envelope. Throws {@link CatalogHttpError} when the response shape is\n * malformed or carries a tRPC `error` payload.\n */\nasync function parseTrpcGet(res: Response): Promise<unknown> {\n const text = await res.text();\n let body: unknown;\n try {\n body = text.length > 0 ? JSON.parse(text) : null;\n } catch {\n throw new CatalogHttpError(\n `tRPC response is not valid JSON: ${text.slice(0, 200)}`,\n res.status,\n );\n }\n\n if (body && typeof body === \"object\" && \"error\" in body) {\n const err = (body as { error: { message?: string; data?: { code?: string } } }).error;\n throw new CatalogHttpError(\n `tRPC error: ${err.message ?? \"unknown\"}${err.data?.code ? ` (${err.data.code})` : \"\"}`,\n res.status,\n );\n }\n\n // tRPC v11 GET shape: { result: { data: <superjson-encoded> } }\n // superjson value shape: { json: <value>, meta?: {...} }\n const result = (body as { result?: { data?: unknown } } | null)?.result;\n if (!result || !(\"data\" in result)) {\n throw new CatalogHttpError(`tRPC response missing result.data envelope`, res.status);\n }\n const data = result.data as unknown;\n // superjson encoding: pull out the `json` key if it's the wrapped shape.\n if (data && typeof data === \"object\" && !Array.isArray(data) && \"json\" in (data as object)) {\n return (data as { json: unknown }).json;\n }\n return data;\n}\n\n// ---------------------------------------------------------------------------\n// Server → CatalogAsset normalization\n// ---------------------------------------------------------------------------\n\n/**\n * The store backend `AssetDefinition` row shape (post-PostXL) carries fields\n * that don't map 1:1 onto {@link CatalogAsset}. This helper produces a stable\n * client-side shape: it computes the canonical ref string, falls back to the\n * generated ID when the server already provides a canonical ref, and copies\n * across optional metadata.\n */\nfunction normalizeCatalogAsset(raw: unknown): CatalogAsset {\n if (!raw || typeof raw !== \"object\") {\n throw new CatalogHttpError(\"Catalog response item is not an object\", 200);\n }\n const r = raw as Record<string, unknown>;\n const publisher = pickString(r, \"publisher\") ?? pickString(r, \"publisherSlug\") ?? \"\";\n const name = pickString(r, \"name\") ?? \"\";\n const version = pickString(r, \"version\") ?? \"\";\n const id = pickString(r, \"id\") ?? `${publisher}/${name}@${version}`;\n const kind = pickString(r, \"kind\") ?? \"\";\n const manifest =\n typeof r.manifest === \"object\" && r.manifest !== null\n ? (r.manifest as Record<string, unknown>)\n : typeof r.manifestJson === \"object\" && r.manifestJson !== null\n ? (r.manifestJson as Record<string, unknown>)\n : {};\n\n const asset: CatalogAsset = {\n id,\n kind,\n publisher,\n name,\n version,\n manifest,\n };\n const sha = pickString(r, \"sha256\") ?? pickString(r, \"tarballSha256\");\n if (sha) asset.sha256 = sha;\n const description = pickString(r, \"description\");\n if (description) asset.description = description;\n const license = pickString(r, \"license\");\n if (license) asset.license = license;\n const category = pickString(r, \"category\");\n if (category) asset.category = category;\n return asset;\n}\n\nfunction pickString(r: Record<string, unknown>, key: string): string | undefined {\n const v = r[key];\n return typeof v === \"string\" ? v : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Default fetch\n// ---------------------------------------------------------------------------\n\n/**\n * Upper bound on a single catalog HTTP request. Without it, a hung or\n * unreachable backend would block `resolve()` / `listAssets()` indefinitely\n * (a dropped connection never yields a TCP RST) and stall the caller.\n */\nconst CATALOG_REQUEST_TIMEOUT_MS = 10_000;\n\nconst defaultFetch: HttpClient = async (url, init) => {\n if (typeof fetch === \"undefined\") {\n throw new Error(\"global fetch is not available; pass an httpClient explicitly\");\n }\n const requestInit = (init ?? {}) as RequestInit;\n return fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? AbortSignal.timeout(CATALOG_REQUEST_TIMEOUT_MS),\n });\n};\n","/**\n * RestCatalogSource — `ICatalogSource` HTTP client for the forge-store REST backend.\n *\n * Wire shape:\n *\n * GET /api/catalog/get?ref=<publisher>/<name>@<version> → asset row | null\n * GET /api/catalog/list?publisher=&kind=&category= → asset row[]\n * GET /api/tarball/manifest?sha256=<hex> → { sha256, url, sizeBytes, fileCount, public: true }\n * GET <manifest.url> → binary tarball (follows 307 redirect)\n *\n * The forge-store REST API is served by Nuxt 4 + Nitro (`forge-store/server/api/`).\n * All catalog endpoints are anonymous (no authentication required). The tarball\n * download URL may be a presigned S3 URL or a CDN URL; the client follows the\n * redirect and downloads the bytes directly.\n *\n * The client verifies SHA256 on the client side after download (spec invariant:\n * \"Hash pinning ... Mismatch = hard fail\").\n *\n * Cache / air-gapped: identical semantics to {@link RemoteCatalogSource} — stale-while-\n * revalidate on metadata, content-addressed tarballs cached forever.\n *\n * @docLink packages/library/api-reference#rest-catalog-source\n */\n\nimport type {\n ICatalogSource,\n CatalogAsset,\n CatalogAssetFilter,\n CatalogSourceInfo,\n} from \"@skaile/workspaces/plugins\";\n\nimport { CatalogCache, sha256Hex, type CatalogCacheOptions } from \"./cache.js\";\nimport {\n TarballHashMismatchError,\n OfflineError,\n CatalogHttpError,\n type HttpClient,\n} from \"./remote-catalog-source.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Constructor options for {@link RestCatalogSource}.\n *\n * @docLink packages/library/api-reference#rest-catalog-source\n */\nexport interface RestCatalogSourceOptions {\n /** Base URL of the forge-store instance, e.g. `http://localhost:3000`. No trailing slash required. */\n baseUrl: string;\n /**\n * Metadata cache TTL in milliseconds.\n * Default `86_400_000` (24h). `0` disables network — air-gapped mode.\n */\n cacheTtlMs?: number;\n /** Override `fetch` for tests. */\n httpClient?: HttpClient;\n /** Override the cache directory. Default is `~/.skaile/catalog-cache/`. */\n cacheDir?: string;\n /** Override clock for tests. */\n now?: () => number;\n /** Pre-built cache instance (test injection). When provided, `cacheTtlMs`/`cacheDir`/`now` are ignored. */\n cache?: CatalogCache;\n /**\n * If true, suppresses the background revalidation `unhandledRejection` log when\n * a stale-while-revalidate fetch fails. Default false.\n */\n silentBackgroundErrors?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// RestCatalogSource\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TTL_MS = 86_400_000; // 24h\n\n/**\n * HTTP client implementation of `ICatalogSource` for the forge-store REST API.\n * See module docstring for the wire contract.\n *\n * @docLink packages/library/api-reference#rest-catalog-source\n */\nexport class RestCatalogSource implements ICatalogSource {\n readonly id: string;\n readonly baseUrl: string;\n readonly cache: CatalogCache;\n private readonly cacheTtlMs: number;\n private readonly httpClient: HttpClient;\n private readonly silentBackgroundErrors: boolean;\n /** Tracks in-flight background revalidations so callers can `await` them in tests. */\n private readonly inFlight = new Map<string, Promise<void>>();\n\n constructor(opts: RestCatalogSourceOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/+$/, \"\");\n this.id = `rest:${this.baseUrl}`;\n this.cacheTtlMs = opts.cacheTtlMs ?? DEFAULT_TTL_MS;\n this.httpClient = opts.httpClient ?? defaultFetch;\n this.silentBackgroundErrors = opts.silentBackgroundErrors ?? false;\n this.cache =\n opts.cache ??\n new CatalogCache({\n dir: opts.cacheDir,\n ttlMs: this.cacheTtlMs,\n now: opts.now,\n } satisfies CatalogCacheOptions);\n }\n\n // ── ICatalogSource ──────────────────────────────────────────────────────\n\n /**\n * Resolve a single asset by canonical ref (`<publisher>/<name>@<version>`).\n *\n * Cache: hit returns immediately. Miss fetches `/api/catalog/get?ref=<ref>`. Stale\n * entry serves the cached value and triggers a background refresh.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n */\n async resolve(ref: string): Promise<CatalogAsset | null> {\n const fresh = this.cache.getResolve(ref);\n if (fresh) return fresh.value;\n\n if (this.cache.airGapped) {\n const stale = this.cache.getResolveStale(ref);\n if (stale) return stale.value;\n throw new OfflineError(`Asset '${ref}' not in cache`);\n }\n\n // Stale-while-revalidate: serve stale + refresh in background.\n const stale = this.cache.getResolveStale(ref);\n if (stale) {\n this.scheduleBackground(`resolve:${ref}`, () => this.fetchAndStoreResolve(ref));\n return stale.value;\n }\n\n return this.fetchAndStoreResolve(ref);\n }\n\n /**\n * List assets matching `filter`.\n *\n * Cache: hit returns immediately. Miss fetches `/api/catalog/list`. Stale\n * entry serves the cached array and triggers a background refresh.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n *\n * Note: `filter.prefix` is not supported by the forge-store REST API and is silently ignored.\n */\n async listAssets(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const fresh = this.cache.getList(filter);\n if (fresh) return fresh.items;\n\n if (this.cache.airGapped) {\n const stale = this.cache.getListStale(filter);\n if (stale) return stale.items;\n throw new OfflineError(\"Catalog list not in cache\");\n }\n\n const stale = this.cache.getListStale(filter);\n if (stale) {\n const filterKey = JSON.stringify(filter ?? null);\n this.scheduleBackground(`list:${filterKey}`, () => this.fetchAndStoreList(filter));\n return stale.items;\n }\n\n return this.fetchAndStoreList(filter);\n }\n\n /**\n * Fetch the content-addressed tarball for an asset.\n *\n * Steps:\n * 1. `GET /api/tarball/manifest?sha256=<sha256>` → JSON with `{ url, ... }`\n * 2. `GET <manifest.url>` following redirects → raw bytes\n * 3. Verify SHA256 client-side — hard fail on mismatch\n * 4. Write to cache on success\n *\n * Cache: tarballs are content-addressed and cached forever once written.\n *\n * Air-gapped: throws {@link OfflineError} on cache miss.\n *\n * @throws {@link TarballHashMismatchError} when the downloaded SHA256 does not match.\n */\n async fetchTarball(_ref: string, sha256: string): Promise<Uint8Array> {\n const cached = this.cache.readTarball(sha256);\n if (cached) {\n // Defensive: re-verify the cached blob. A bit-flip on disk should not\n // poison the install path. (Cheap — local file read, ~ms.)\n const actual = sha256Hex(cached);\n if (actual !== sha256) {\n throw new TarballHashMismatchError(sha256, actual);\n }\n return cached;\n }\n\n if (this.cache.airGapped) {\n throw new OfflineError(`Tarball '${sha256}' not in cache`);\n }\n\n // Step 1: fetch the manifest to get the download URL.\n const manifestUrl = `${this.baseUrl}/api/tarball/manifest?sha256=${encodeURIComponent(sha256)}`;\n const manifestRes = await this.httpClient(manifestUrl, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!manifestRes.ok) {\n throw new CatalogHttpError(\n `Failed to fetch tarball manifest for ${sha256}: ${manifestRes.status} ${manifestRes.statusText}`,\n manifestRes.status,\n manifestUrl,\n );\n }\n const manifestText = await manifestRes.text();\n let manifest: unknown;\n try {\n manifest = JSON.parse(manifestText);\n } catch {\n throw new CatalogHttpError(\n `Tarball manifest response is not valid JSON: ${manifestText.slice(0, 200)}`,\n manifestRes.status,\n manifestUrl,\n );\n }\n const downloadUrl =\n manifest && typeof manifest === \"object\" && \"url\" in (manifest as object)\n ? (manifest as { url: unknown }).url\n : undefined;\n if (typeof downloadUrl !== \"string\") {\n throw new CatalogHttpError(\n `Tarball manifest missing 'url' field`,\n manifestRes.status,\n manifestUrl,\n );\n }\n\n // Step 2: download the tarball bytes.\n const tarballRes = await this.httpClient(downloadUrl, { method: \"GET\", redirect: \"follow\" });\n if (!tarballRes.ok) {\n throw new CatalogHttpError(\n `Failed to fetch tarball ${sha256}: ${tarballRes.status} ${tarballRes.statusText}`,\n tarballRes.status,\n downloadUrl,\n );\n }\n const buf = new Uint8Array(await tarballRes.arrayBuffer());\n\n // Step 3: verify SHA256.\n const actual = sha256Hex(buf);\n if (actual !== sha256) {\n throw new TarballHashMismatchError(sha256, actual);\n }\n\n // Step 4: write to cache only after verification.\n this.cache.writeTarball(sha256, buf);\n return buf;\n }\n\n /**\n * Single synthetic Source pointing at the configured forge-store URL.\n */\n async listSources(): Promise<CatalogSourceInfo[]> {\n return [{ id: this.id, type: \"rest-catalog\", url: this.baseUrl }];\n }\n\n // ── extension API ───────────────────────────────────────────────────────\n\n /**\n * Force a metadata-cache refresh. Wipes all resolve/list entries and\n * re-fetches `listAssets()` (no filter) to pre-warm the canonical query.\n *\n * Driven by `skaile update`. Tarballs (content-addressed) are not touched.\n *\n * In air-gapped mode this method **does** make a network call (bypassing\n * the TTL=0 gate); it is the only way to repopulate the cache.\n */\n async refresh(): Promise<{ assetsCached: number }> {\n this.cache.invalidateAll();\n // Air-gapped bypass: call the network directly even when ttl is 0.\n const items = await this.fetchListNetwork(undefined);\n this.cache.setList(undefined, items);\n // Pre-warm resolve cache for known refs so subsequent reads are hot.\n for (const item of items) {\n this.cache.setResolve(item.id, item);\n }\n return { assetsCached: items.length };\n }\n\n /**\n * Wait for any in-flight stale-while-revalidate background fetches to settle.\n * Test-only escape hatch.\n */\n async waitForBackground(): Promise<void> {\n // Snapshot to avoid mutation during iteration.\n const promises = Array.from(this.inFlight.values());\n await Promise.allSettled(promises);\n }\n\n // ── private ─────────────────────────────────────────────────────────────\n\n private scheduleBackground(key: string, fn: () => Promise<unknown>): void {\n if (this.inFlight.has(key)) return;\n const p = (async () => {\n try {\n await fn();\n } catch (err) {\n if (!this.silentBackgroundErrors) {\n process.stderr.write(\n `[skaile/catalog] Background refresh failed for ${key}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n } finally {\n this.inFlight.delete(key);\n }\n })();\n this.inFlight.set(key, p);\n }\n\n private async fetchAndStoreResolve(ref: string): Promise<CatalogAsset | null> {\n const value = await this.fetchResolveNetwork(ref);\n this.cache.setResolve(ref, value);\n return value;\n }\n\n private async fetchAndStoreList(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const items = await this.fetchListNetwork(filter);\n this.cache.setList(filter, items);\n return items;\n }\n\n /** Raw network call: GET /api/catalog/get?ref=<ref> */\n private async fetchResolveNetwork(ref: string): Promise<CatalogAsset | null> {\n const url = `${this.baseUrl}/api/catalog/get?ref=${encodeURIComponent(ref)}`;\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog/get ${ref} failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseRestResponse(res, url);\n if (data === null || data === undefined) return null;\n return normalizeRestAsset(data);\n }\n\n /** Raw network call: GET /api/catalog/list?publisher=&kind=&category= */\n private async fetchListNetwork(filter?: CatalogAssetFilter): Promise<CatalogAsset[]> {\n const params = new URLSearchParams();\n if (filter?.publisher) params.set(\"publisher\", filter.publisher);\n if (filter?.kind) params.set(\"kind\", filter.kind);\n // Note: filter.prefix is not supported by forge-store REST API and is omitted.\n // filter.category is also not on CatalogAssetFilter — category filtering is server-side only.\n const qs = params.toString();\n const url = `${this.baseUrl}/api/catalog/list${qs ? `?${qs}` : \"\"}`;\n const res = await this.httpClient(url, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n });\n if (!res.ok) {\n throw new CatalogHttpError(\n `catalog/list failed: ${res.status} ${res.statusText}`,\n res.status,\n url,\n );\n }\n const data = await parseRestResponse(res, url);\n if (!Array.isArray(data)) {\n throw new CatalogHttpError(\n `catalog/list returned non-array payload (got ${typeof data})`,\n 200,\n url,\n );\n }\n return data.map(normalizeRestAsset);\n }\n}\n\n// ---------------------------------------------------------------------------\n// REST response parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a forge-store REST JSON response. Throws {@link CatalogHttpError} when\n * the response body is not valid JSON.\n */\nasync function parseRestResponse(res: Response, url: string): Promise<unknown> {\n const text = await res.text();\n if (text.length === 0) return null;\n try {\n return JSON.parse(text);\n } catch {\n throw new CatalogHttpError(\n `REST response is not valid JSON: ${text.slice(0, 200)}`,\n res.status,\n url,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Server → CatalogAsset normalization\n// ---------------------------------------------------------------------------\n\n/**\n * Normalize a forge-store REST asset row to {@link CatalogAsset}.\n *\n * The forge-store row shape:\n * ```json\n * {\n * \"id\": \"asset_skill_use_exa\",\n * \"publisherNamespace\": \"skaile\",\n * \"name\": \"use-exa\",\n * \"version\": \"1.0.0\",\n * \"kind\": \"skill\",\n * \"sha256\": \"<hex>\",\n * \"description\": \"...\",\n * \"license\": \"MIT\",\n * \"category\": \"knowledge\",\n * \"requiresJson\": \"{\\\"refs\\\":[]}\",\n * \"filesJson\": \"{\\\"paths\\\":[]}\"\n * }\n * ```\n *\n * The canonical `CatalogAsset.id` is built as `<publisherNamespace>/<name>@<version>`.\n * The `manifest` is assembled from both `requiresJson` and `filesJson` (both are optional\n * JSON strings; parse failures fall back to `{}`).\n */\nfunction normalizeRestAsset(raw: unknown): CatalogAsset {\n if (!raw || typeof raw !== \"object\") {\n throw new CatalogHttpError(\"Catalog REST response item is not an object\", 200);\n }\n const r = raw as Record<string, unknown>;\n const publisher = pickString(r, \"publisherNamespace\") ?? pickString(r, \"publisher\") ?? \"\";\n const name = pickString(r, \"name\") ?? \"\";\n const version = pickString(r, \"version\") ?? \"\";\n const kind = pickString(r, \"kind\") ?? \"\";\n\n // Build canonical ref as the asset id.\n const id = `${publisher}/${name}@${version}`;\n\n // Build manifest from requiresJson + filesJson.\n const requiresParsed = tryParseJson(pickString(r, \"requiresJson\"));\n const filesParsed = tryParseJson(pickString(r, \"filesJson\"));\n const manifest: Record<string, unknown> = { ...requiresParsed, ...filesParsed };\n\n const asset: CatalogAsset = {\n id,\n kind,\n publisher,\n name,\n version,\n manifest,\n };\n\n const sha = pickString(r, \"sha256\");\n if (sha) asset.sha256 = sha;\n const description = pickString(r, \"description\");\n if (description) asset.description = description;\n const license = pickString(r, \"license\");\n if (license) asset.license = license;\n const category = pickString(r, \"category\");\n if (category) asset.category = category;\n\n return asset;\n}\n\nfunction pickString(r: Record<string, unknown>, key: string): string | undefined {\n const v = r[key];\n return typeof v === \"string\" ? v : undefined;\n}\n\n/**\n * Parse a JSON string, returning an object or `{}` on any failure.\n */\nfunction tryParseJson(s: string | undefined): Record<string, unknown> {\n if (!s) return {};\n try {\n const parsed = JSON.parse(s);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n return {};\n}\n\n// ---------------------------------------------------------------------------\n// Default fetch\n// ---------------------------------------------------------------------------\n\n/**\n * Upper bound on a single catalog HTTP request. Without it, a hung or\n * unreachable backend would block `resolve()` / `listAssets()` indefinitely\n * (a dropped connection never yields a TCP RST) and stall the caller.\n */\nconst CATALOG_REQUEST_TIMEOUT_MS = 10_000;\n\nconst defaultFetch: HttpClient = async (url, init) => {\n if (typeof fetch === \"undefined\") {\n throw new Error(\"global fetch is not available; pass an httpClient explicitly\");\n }\n const requestInit = (init ?? {}) as RequestInit;\n return fetch(url, {\n ...requestInit,\n signal: requestInit.signal ?? AbortSignal.timeout(CATALOG_REQUEST_TIMEOUT_MS),\n });\n};\n","/**\n * Knowledge manifest schema and validation.\n *\n * Moved from @skaile/workspaces/types/manifests/knowledge.ts in Phase 1.7.4.\n * This is now the canonical location for knowledge manifest validation.\n *\n * Knowledge is currently a read-only slot (runtime support deferred to Phase 4).\n * The schema is minimal: name, description, version, files, keywords, license.\n */\n\nimport * as z from \"zod\";\n\n// ---------------------------------------------------------------------------\n// Validation result (inline — avoids importing from types/manifests/_shared)\n// ---------------------------------------------------------------------------\n\nexport interface ManifestValidationSuccess<T> {\n ok: true;\n data: T;\n}\n\nexport interface ManifestValidationFailure {\n ok: false;\n errors: Array<{ path: string; message: string }>;\n}\n\nexport type ManifestValidationResult<T> = ManifestValidationSuccess<T> | ManifestValidationFailure;\n\n// ---------------------------------------------------------------------------\n// Schema\n// ---------------------------------------------------------------------------\n\n/**\n * Knowledge manifest schema.\n * Slot reserved per spec — runtime support deferred to Phase 4.\n * Currently just an index of files.\n */\nexport const KnowledgeManifestSchema = z.looseObject({\n name: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n files: z.array(z.string()).optional(),\n keywords: z.array(z.string()).optional(),\n license: z.string().optional(),\n});\n\nexport type KnowledgeManifest = z.infer<typeof KnowledgeManifestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation\n// ---------------------------------------------------------------------------\n\nexport function validateKnowledge(data: unknown): ManifestValidationResult<KnowledgeManifest> {\n const result = KnowledgeManifestSchema.safeParse(data);\n if (result.success) {\n return { ok: true, data: result.data };\n }\n return {\n ok: false,\n errors: result.error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n })),\n };\n}\n","/**\n * Knowledge asset kind provider.\n *\n * Exported from @skaile/library for explicit registration by the CLI\n * at bootstrap. Discovery does NOT auto-include this provider\n * (discovery must stay a leaf — no library imports).\n *\n * Implements IAssetKindProvider with knowledge-specific:\n * - Discovery patterns: knowledge.yaml, knowledge/index.yaml\n * - Manifest validation via KnowledgeManifestSchema\n * - File filter: manifest + documents/ subdirectory\n * - No requires extraction (knowledge has no cross-asset deps)\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { IAssetKindProvider, AssetKindFileFilter } from \"@skaile/workspaces/plugins\";\nimport { validateKnowledge } from \"./knowledge-manifest.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction collectDirRecursive(baseDir: string, relativeDir: string): string[] {\n const full = path.join(baseDir, relativeDir);\n if (!fs.existsSync(full) || !fs.statSync(full).isDirectory()) return [];\n const results: string[] = [];\n for (const entry of fs.readdirSync(full, { withFileTypes: true })) {\n const rel = path.posix.join(relativeDir, entry.name);\n if (entry.isDirectory()) {\n results.push(...collectDirRecursive(baseDir, rel));\n } else if (entry.isFile()) {\n results.push(rel);\n }\n }\n return results;\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport const knowledgeKindProvider: IAssetKindProvider = {\n kind: \"knowledge\",\n displayName: \"Knowledge\",\n providerVersion: \"1.0.0\",\n discoveryPatterns: [\"**/knowledge.yaml\", \"**/knowledge/index.yaml\"],\n\n matchesPath(relativePath: string): boolean {\n const parts = relativePath.split(\"/\");\n const filename = parts[parts.length - 1] ?? \"\";\n if (filename === \"knowledge.yaml\") return true;\n if (filename === \"index.yaml\" && parts.length >= 2 && parts[parts.length - 2] === \"knowledge\") {\n return true;\n }\n return false;\n },\n\n validateManifest(data: unknown) {\n return validateKnowledge(data);\n },\n\n defaultFileFilter(manifestPath: string): AssetKindFileFilter {\n const dir = path.dirname(manifestPath);\n const manifestName = path.basename(manifestPath);\n const files = [manifestName];\n files.push(...collectDirRecursive(dir, \"documents\"));\n files.sort();\n return { assetRoot: dir, files };\n },\n\n // Knowledge has no cross-asset dependency edges — omit extractRequires\n};\n","/**\n * Preset parser — validates *.preset.yaml content against the PresetManifestSchema.\n *\n * Also performs structural validation beyond what zod alone covers:\n * - Unique item IDs within the preset\n * - Cycle detection for nested preset refs (max depth 3)\n * - Cross-item refs (#item-id) resolve to declared items\n *\n * @docLink packages/library/concepts#preset-parsing\n */\n\nimport { parse as yamlParse } from \"yaml\";\nimport { PresetManifestSchema, type PresetManifest } from \"@skaile/workspaces/types/manifests\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Result of parsing and validating a preset manifest.\n *\n * When `ok` is false, `errors` contains human-readable messages.\n * `preset` may still be set on partial success (structural errors after Zod passes).\n *\n * @docLink packages/library/concepts#preset-parsing\n */\nexport interface ParseResult {\n /** Whether the preset passed all validation checks. */\n ok: boolean;\n /** The validated preset manifest (set even on structural errors after Zod passes). */\n preset?: PresetManifest;\n /** Validation error messages. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Parse and validate a preset manifest object.\n *\n * @param data - Raw parsed YAML content (from `yaml` or similar).\n * @returns ParseResult with validated preset or error messages.\n * @docLink packages/library/concepts#preset-parsing\n */\nexport function parsePreset(data: unknown): ParseResult {\n // Step 1: Zod schema validation\n const zodResult = PresetManifestSchema.safeParse(data);\n if (!zodResult.success) {\n return {\n ok: false,\n errors: zodResult.error.issues.map((issue) => `${issue.path.join(\".\")}: ${issue.message}`),\n };\n }\n\n const preset = zodResult.data;\n const errors: string[] = [];\n\n // Step 2: Unique item IDs + ambiguous ref detection\n const ids = new Set<string>();\n const refCounts = new Map<string, number>();\n for (const item of preset.items) {\n if (item.id) {\n if (ids.has(item.id)) {\n errors.push(`Duplicate item id: \"${item.id}\"`);\n }\n ids.add(item.id);\n } else {\n // Track items without IDs that share the same ref (ambiguous for upgrade matching)\n refCounts.set(item.ref, (refCounts.get(item.ref) ?? 0) + 1);\n }\n }\n for (const [ref, count] of refCounts) {\n if (count > 1) {\n errors.push(\n `${count} items share ref \"${ref}\" without distinct \"id\" fields — upgrade matching will be ambiguous`,\n );\n }\n }\n\n // Step 3: Cross-item refs (#item-id) reference declared IDs\n for (const item of preset.items) {\n if (item.composes) {\n for (const compose of item.composes) {\n if (compose.ref.startsWith(\"#\")) {\n const targetId = compose.ref.slice(1);\n if (!ids.has(targetId)) {\n errors.push(\n `Cross-item ref \"${compose.ref}\" in item \"${item.id ?? item.ref}\" references undeclared id \"${targetId}\"`,\n );\n }\n }\n }\n }\n }\n\n // Step 4: Placeholder validation per item\n for (const item of preset.items) {\n if (item.placeholders) {\n const keys = new Set<string>();\n for (const ph of item.placeholders) {\n if (keys.has(ph.key)) {\n errors.push(`Duplicate placeholder key \"${ph.key}\" in item \"${item.id ?? item.ref}\"`);\n }\n keys.add(ph.key);\n\n // enum type requires values\n if (ph.type === \"enum\" && (!ph.values || ph.values.length === 0)) {\n errors.push(`Placeholder \"${ph.key}\" has type \"enum\" but no values defined`);\n }\n }\n }\n }\n\n if (errors.length > 0) {\n return { ok: false, preset, errors };\n }\n\n return { ok: true, preset, errors: [] };\n}\n\n/**\n * Parse preset from a raw YAML string.\n *\n * @param yamlContent - Raw YAML string content of a `*.preset.yaml` file.\n * @returns ParseResult — includes a YAML parse error in `errors` if the string is malformed.\n * @docLink packages/library/concepts#preset-parsing\n */\nexport function parsePresetYaml(yamlContent: string): ParseResult {\n let data: unknown;\n try {\n data = yamlParse(yamlContent);\n } catch (err) {\n return {\n ok: false,\n errors: [`YAML parse error: ${err instanceof Error ? err.message : String(err)}`],\n };\n }\n return parsePreset(data);\n}\n\n/**\n * Detect nested preset refs within a preset's items.\n *\n * A ref is classified as a nested preset if it appears in `knownPresetRefs`.\n * Refs starting with `library://` or `#` are always skipped.\n *\n * @param preset - Validated preset manifest.\n * @param knownPresetRefs - Optional set of refs known to be presets.\n * @returns Array of refs that are nested presets.\n * @docLink packages/library/concepts#preset-parsing\n */\nexport function detectNestedPresetRefs(\n preset: PresetManifest,\n knownPresetRefs?: Set<string>,\n): string[] {\n const nested: string[] = [];\n for (const item of preset.items) {\n // Skip library:// and #cross-item refs\n if (item.ref.startsWith(\"library://\") || item.ref.startsWith(\"#\")) continue;\n\n // Heuristic: if the ref is in the known presets set, it's nested\n if (knownPresetRefs?.has(item.ref)) {\n nested.push(item.ref);\n }\n }\n return nested;\n}\n\n/**\n * Validate nesting depth. Max depth is 3.\n *\n * @param presetRef - The ref of the preset being validated.\n * @param currentDepth - Current nesting depth (0 = top-level).\n * @returns Error message string if depth exceeded, undefined otherwise.\n * @docLink packages/library/concepts#preset-parsing\n */\nexport function validateNestingDepth(presetRef: string, currentDepth: number): string | undefined {\n const MAX_DEPTH = 3;\n if (currentDepth >= MAX_DEPTH) {\n return `Preset \"${presetRef}\" exceeds maximum nesting depth (${MAX_DEPTH} levels allowed, depth ${currentDepth} reached)`;\n }\n return undefined;\n}\n","/**\n * Item ref resolver — classifies each preset item's ref and produces an apply plan.\n *\n * Three ref types:\n * - Asset ref: `<publisher>/<name>@<version>` → create new Instance + subscribe\n * - Library ref: `library://<tier>/instances/<id>` → reuse existing Instance\n * - Nested Preset: another preset ref → recursively apply\n * - Cross-item ref: `#<item-id>` → resolved at apply-time from sibling item results\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\n\nimport type { PresetItem } from \"@skaile/workspaces/types/manifests\";\nimport type { Instance, AssetDefinition, IAssetIndex } from \"../library.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Classification of a preset item's ref string.\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport type ItemRefKind = \"asset\" | \"library-instance\" | \"nested-preset\" | \"cross-item\";\n\n/**\n * A resolved preset item whose ref is an asset definition ref.\n *\n * At apply-time, a new Instance will be created from `defRef`.\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport interface ResolvedAssetItem {\n kind: \"asset\";\n item: PresetItem;\n /** The asset definition ref (may include version). */\n defRef: string;\n /** Resolved asset definition from library cache (null if not cached). */\n assetDef: AssetDefinition | null;\n}\n\n/**\n * A resolved preset item whose ref is a `library://` URI pointing to an existing Instance.\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport interface ResolvedLibraryItem {\n kind: \"library-instance\";\n item: PresetItem;\n /** The instance UUID extracted from the library:// URI. */\n instanceId: string;\n /** The resolved instance (null if not found). */\n instance: Instance | null;\n}\n\n/**\n * A resolved preset item that recursively refers to another preset.\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport interface ResolvedNestedPresetItem {\n kind: \"nested-preset\";\n item: PresetItem;\n /** The nested preset ref. */\n presetRef: string;\n}\n\n/**\n * A resolved preset item that is a cross-item reference (`#<item-id>`).\n *\n * Resolved at apply-time from sibling item results (items must be ordered).\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport interface ResolvedCrossItemRef {\n kind: \"cross-item\";\n item: PresetItem;\n /** The target item id (without the # prefix). */\n targetId: string;\n}\n\n/**\n * Discriminated union of all resolved preset item types.\n *\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport type ResolvedItem =\n | ResolvedAssetItem\n | ResolvedLibraryItem\n | ResolvedNestedPresetItem\n | ResolvedCrossItemRef;\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Classify a single item ref string into its {@link ItemRefKind}.\n *\n * Returns `\"asset\"` by default when the ref doesn't match a known prefix.\n * The caller (apply.ts) re-classifies based on `knownPresetRefs`.\n *\n * @param ref - The raw ref string from a preset item.\n * @returns The classified kind.\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport function classifyRef(ref: string): ItemRefKind {\n if (ref.startsWith(\"library://\")) return \"library-instance\";\n if (ref.startsWith(\"#\")) return \"cross-item\";\n // Distinguish nested presets from assets: nested presets are identified by\n // the caller providing a known-presets set. Without that context, we default\n // to \"asset\". The caller (apply.ts) reclassifies based on discovery.\n return \"asset\";\n}\n\n/**\n * Extract the instance UUID from a `library://` URI.\n *\n * Format: `library://<tier>/instances/<uuid>` where tier is `personal | team | org`.\n *\n * @param ref - The full `library://` URI string.\n * @returns The UUID string, or null if the URI is malformed.\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport function extractLibraryInstanceId(ref: string): string | null {\n const match = ref.match(/^library:\\/\\/[^/]+\\/instances\\/([a-f0-9-]+)$/i);\n return match ? match[1] : null;\n}\n\n/**\n * Resolve a single preset item against the library.\n *\n * @param item - The preset item to resolve.\n * @param library - The library to look up definitions/instances.\n * @param knownPresetRefs - Set of refs known to be presets (for nested detection).\n * @returns A typed {@link ResolvedItem} discriminated by kind.\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport async function resolveItem(\n item: PresetItem,\n library: IAssetIndex,\n knownPresetRefs?: Set<string>,\n): Promise<ResolvedItem> {\n const ref = item.ref;\n\n // Cross-item ref\n if (ref.startsWith(\"#\")) {\n return { kind: \"cross-item\", item, targetId: ref.slice(1) };\n }\n\n // Library instance ref\n if (ref.startsWith(\"library://\")) {\n const instanceId = extractLibraryInstanceId(ref);\n if (!instanceId) {\n return { kind: \"library-instance\", item, instanceId: \"\", instance: null };\n }\n const instance = await library.getInstance(instanceId);\n return { kind: \"library-instance\", item, instanceId, instance };\n }\n\n // Nested preset (detected via knownPresetRefs)\n if (knownPresetRefs?.has(ref)) {\n return { kind: \"nested-preset\", item, presetRef: ref };\n }\n\n // Asset ref (default)\n const assetDef = await library.getAssetDef(ref);\n return { kind: \"asset\", item, defRef: ref, assetDef };\n}\n\n/**\n * Resolve all items in a preset in parallel.\n *\n * @param items - Array of preset items to resolve.\n * @param library - The library to look up definitions/instances.\n * @param knownPresetRefs - Set of refs known to be presets.\n * @returns Array of resolved items in the same order as the input.\n * @docLink packages/library/concepts#preset-item-resolution\n */\nexport async function resolveAllItems(\n items: PresetItem[],\n library: IAssetIndex,\n knownPresetRefs?: Set<string>,\n): Promise<ResolvedItem[]> {\n return Promise.all(items.map((item) => resolveItem(item, library, knownPresetRefs)));\n}\n","/**\n * Placeholder type system — validation, defaults, type coercion.\n *\n * Supports 8 types: text, multiline, secret, number, boolean, enum, oauth, instance-picker.\n *\n * Each type defines:\n * - Validation rules\n * - Default value handling\n * - Coercion from string input (CLI prompting returns strings)\n *\n * The `instance-picker` type queries the LocalIndex for available instances\n * matching a filter (kind, defRef prefix).\n *\n * @docLink packages/library/concepts#placeholder-system\n */\n\nimport type { Placeholder } from \"@skaile/workspaces/types/manifests\";\nimport type { IAssetIndex, InstanceFilter } from \"../library.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Result of validating a single placeholder value.\n *\n * @docLink packages/library/concepts#placeholder-system\n */\nexport interface PlaceholderValidationResult {\n /** Whether the value passed validation. */\n valid: boolean;\n /** Validation error messages (empty when valid). */\n errors: string[];\n /** Coerced value (type-appropriate). */\n value?: unknown;\n}\n\n/**\n * Filter options for the `instance-picker` placeholder type.\n *\n * @docLink packages/library/concepts#placeholder-system\n */\nexport interface InstancePickerOptions {\n /** Filter instances by asset kind. */\n kind?: string;\n /** Filter instances by defRef prefix. */\n defRefPrefix?: string;\n}\n\n/**\n * A selectable instance entry returned by {@link queryInstancePickerChoices}.\n *\n * @docLink packages/library/concepts#placeholder-system\n */\nexport interface InstancePickerChoice {\n /** UUID of the selectable instance. */\n instanceId: string;\n /** Asset definition ref for the instance. */\n defRef: string;\n /** Human-readable display label. */\n label: string;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a single placeholder value against its schema.\n *\n * @param placeholder - The placeholder definition.\n * @param value - The user-provided value (may be undefined if optional).\n * @returns Validation result with coerced value.\n * @docLink packages/library/concepts#placeholder-system\n */\nexport function validatePlaceholder(\n placeholder: Placeholder,\n value: unknown,\n): PlaceholderValidationResult {\n const { key, type = \"text\", required } = placeholder;\n\n // Handle missing values\n if (value === undefined || value === null || value === \"\") {\n if (placeholder.default !== undefined) {\n return { valid: true, errors: [], value: placeholder.default };\n }\n if (required === true || required === undefined) {\n // Default: required unless explicitly set to false\n return { valid: false, errors: [`Placeholder \"${key}\" is required`] };\n }\n return { valid: true, errors: [], value: undefined };\n }\n\n // Type-specific validation\n switch (type) {\n case \"text\":\n return validateText(key, value);\n case \"multiline\":\n return validateMultiline(key, value);\n case \"secret\":\n return validateSecret(key, value);\n case \"number\":\n return validateNumber(key, value);\n case \"boolean\":\n return validateBoolean(key, value);\n case \"enum\":\n return validateEnum(key, value, placeholder.values);\n case \"oauth\":\n return validateOauth(key, value);\n case \"instance-picker\":\n return validateInstancePicker(key, value);\n }\n}\n\n/**\n * Validate all placeholders for an item.\n *\n * @param placeholders - Array of placeholder definitions.\n * @param inputs - Map of key to user-provided value.\n * @returns Map of key to validated value plus aggregate errors.\n * @docLink packages/library/concepts#placeholder-system\n */\nexport function validateAllPlaceholders(\n placeholders: Placeholder[],\n inputs: Record<string, unknown>,\n): { valid: boolean; values: Record<string, unknown>; errors: string[] } {\n const values: Record<string, unknown> = {};\n const errors: string[] = [];\n\n for (const ph of placeholders) {\n const result = validatePlaceholder(ph, inputs[ph.key]);\n if (!result.valid) {\n errors.push(...result.errors);\n } else if (result.value !== undefined) {\n values[ph.key] = result.value;\n }\n }\n\n return { valid: errors.length === 0, values, errors };\n}\n\n/**\n * Query available instances for an `instance-picker` placeholder.\n *\n * @param library - The library to query.\n * @param options - Optional filter by kind or defRef prefix.\n * @returns Available instance choices for display in a CLI prompt.\n * @docLink packages/library/concepts#placeholder-system\n */\nexport async function queryInstancePickerChoices(\n library: IAssetIndex,\n options?: InstancePickerOptions,\n): Promise<InstancePickerChoice[]> {\n const filter: InstanceFilter = {};\n if (options?.defRefPrefix) {\n filter.defRef = options.defRefPrefix;\n }\n\n const instances = await library.listInstances(filter);\n\n return instances.map((inst) => ({\n instanceId: inst.id,\n defRef: inst.defRef,\n label: `${inst.defRef} (${inst.id.slice(0, 8)})`,\n }));\n}\n\n/**\n * Get the effective default value for a placeholder.\n *\n * @param placeholder - The placeholder definition.\n * @returns The declared default, or undefined if none.\n * @docLink packages/library/concepts#placeholder-system\n */\nexport function getDefaultValue(placeholder: Placeholder): unknown {\n return placeholder.default;\n}\n\n/**\n * Check if a placeholder holds a secret value (should be routed through SecretsRouter).\n *\n * Returns true for `secret` and `oauth` types.\n *\n * @param placeholder - The placeholder definition.\n * @docLink packages/library/concepts#placeholder-system\n */\nexport function isSecretPlaceholder(placeholder: Placeholder): boolean {\n return placeholder.type === \"secret\" || placeholder.type === \"oauth\";\n}\n\n// ---------------------------------------------------------------------------\n// Type validators\n// ---------------------------------------------------------------------------\n\nfunction validateText(key: string, value: unknown): PlaceholderValidationResult {\n if (typeof value !== \"string\") {\n return { valid: false, errors: [`Placeholder \"${key}\" must be a string`] };\n }\n return { valid: true, errors: [], value };\n}\n\nfunction validateMultiline(key: string, value: unknown): PlaceholderValidationResult {\n if (typeof value !== \"string\") {\n return { valid: false, errors: [`Placeholder \"${key}\" must be a string`] };\n }\n return { valid: true, errors: [], value };\n}\n\nfunction validateSecret(key: string, value: unknown): PlaceholderValidationResult {\n if (typeof value !== \"string\") {\n return { valid: false, errors: [`Placeholder \"${key}\" must be a string`] };\n }\n if (value.length === 0) {\n return { valid: false, errors: [`Placeholder \"${key}\" (secret) cannot be empty`] };\n }\n return { valid: true, errors: [], value };\n}\n\nfunction validateNumber(key: string, value: unknown): PlaceholderValidationResult {\n if (typeof value === \"number\" && !Number.isNaN(value)) {\n return { valid: true, errors: [], value };\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return { valid: true, errors: [], value: parsed };\n }\n }\n return { valid: false, errors: [`Placeholder \"${key}\" must be a valid number`] };\n}\n\nfunction validateBoolean(key: string, value: unknown): PlaceholderValidationResult {\n if (typeof value === \"boolean\") {\n return { valid: true, errors: [], value };\n }\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\" || lower === \"yes\") {\n return { valid: true, errors: [], value: true };\n }\n if (lower === \"false\" || lower === \"0\" || lower === \"no\") {\n return { valid: true, errors: [], value: false };\n }\n }\n return { valid: false, errors: [`Placeholder \"${key}\" must be a boolean`] };\n}\n\nfunction validateEnum(\n key: string,\n value: unknown,\n allowedValues?: Array<string | number>,\n): PlaceholderValidationResult {\n if (!allowedValues || allowedValues.length === 0) {\n return { valid: false, errors: [`Placeholder \"${key}\" (enum) has no allowed values defined`] };\n }\n const stringValue = String(value);\n const matches = allowedValues.some((v) => String(v) === stringValue);\n if (!matches) {\n return {\n valid: false,\n errors: [\n `Placeholder \"${key}\" value \"${stringValue}\" is not in allowed values: [${allowedValues.join(\", \")}]`,\n ],\n };\n }\n // Return the original type from the allowed values\n const matched = allowedValues.find((v) => String(v) === stringValue);\n return { valid: true, errors: [], value: matched };\n}\n\nfunction validateOauth(key: string, value: unknown): PlaceholderValidationResult {\n // OAuth placeholders hold an opaque token/ref string\n if (typeof value !== \"string\") {\n return { valid: false, errors: [`Placeholder \"${key}\" (oauth) must be a string`] };\n }\n if (value.length === 0) {\n return { valid: false, errors: [`Placeholder \"${key}\" (oauth) cannot be empty`] };\n }\n return { valid: true, errors: [], value };\n}\n\nfunction validateInstancePicker(key: string, value: unknown): PlaceholderValidationResult {\n // instance-picker value is a UUID (instance id)\n if (typeof value !== \"string\") {\n return {\n valid: false,\n errors: [`Placeholder \"${key}\" (instance-picker) must be a string UUID`],\n };\n }\n const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (!uuidPattern.test(value)) {\n return {\n valid: false,\n errors: [`Placeholder \"${key}\" (instance-picker) must be a valid UUID`],\n };\n }\n return { valid: true, errors: [], value };\n}\n","/**\n * Two-namespace interpolation for preset item config.\n *\n * Syntax:\n * - `${INPUT:KEY}` — placeholder value inlined into Instance.config\n * - `${SECRET:KEY}` — stored as credential_ref in Instance; value is handed\n * to SecretsRouter.setSecret separately\n *\n * The `materialize` map on a preset item defines how placeholder values fold\n * into the Instance config JSON. Each key is a dotted config path; each value\n * is a template string that may contain ${INPUT:KEY} or ${SECRET:KEY} tokens.\n *\n * Constraints:\n * - `${SECRET:KEY}` MUST be the sole token in a template (no mixing with\n * INPUT or literal text). Mixed templates would embed non-secret data\n * into the stored secret, breaking update semantics.\n * - All referenced keys MUST exist in the context. Missing keys throw\n * InterpolationError rather than silently producing empty strings.\n *\n * Example:\n * ```yaml\n * materialize:\n * host: \"${INPUT:HOST}\"\n * port: \"${INPUT:PORT}\"\n * credentials.api_key: \"${SECRET:API_KEY}\"\n * ```\n *\n * @docLink packages/library/concepts#interpolation\n */\n\nimport type { SecretsRouter } from \"@skaile/workspaces/secrets\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Runtime context passed to {@link interpolate} containing resolved placeholder values.\n *\n * @docLink packages/library/concepts#interpolation\n */\nexport interface InterpolationContext {\n /** Validated placeholder values (key to value). */\n inputs: Record<string, unknown>;\n /** Secret values (key to plaintext value) to be stored via SecretsRouter. */\n secrets: Record<string, string>;\n}\n\n/**\n * Result produced by {@link interpolate}.\n *\n * @docLink packages/library/concepts#interpolation\n */\nexport interface InterpolationResult {\n /** The materialized config to set on the Instance. */\n config: Record<string, unknown>;\n /** Credential ref to set on the Instance (if any secret placeholders used). */\n credentialRef?: string;\n /** Secret entries that need to be stored (ref to plaintext value). */\n secretsToStore: Array<{ ref: string; value: string }>;\n}\n\n/**\n * Thrown when a template references a missing key or mixes `${SECRET:...}` with other tokens.\n *\n * @docLink packages/library/concepts#interpolation\n */\nexport class InterpolationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InterpolationError\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Interpolate a materialize map with placeholder values.\n *\n * @param materialize - Map of dotted config paths to template strings.\n * @param baseConfig - Pre-existing item config (author-prefilled values).\n * @param context - Validated input values and secret values.\n * @param credentialRefPrefix - Prefix for generated credential refs.\n * @returns Interpolated config and secrets to store.\n * @throws {InterpolationError} if a referenced key is missing or a SECRET token\n * is mixed with other tokens in the same template.\n * @docLink packages/library/concepts#interpolation\n */\nexport function interpolate(\n materialize: Record<string, string> | undefined,\n baseConfig: Record<string, unknown> | undefined,\n context: InterpolationContext,\n credentialRefPrefix: string,\n): InterpolationResult {\n const config: Record<string, unknown> = { ...(baseConfig ?? {}) };\n const secretsToStore: Array<{ ref: string; value: string }> = [];\n let credentialRef: string | undefined;\n\n if (!materialize) {\n // No materialize map: merge inputs directly into config (flat)\n for (const [key, value] of Object.entries(context.inputs)) {\n config[key] = value;\n }\n // If there are secrets, create a credential ref\n if (Object.keys(context.secrets).length > 0) {\n credentialRef = `${credentialRefPrefix}/creds`;\n for (const [key, value] of Object.entries(context.secrets)) {\n secretsToStore.push({ ref: `${credentialRef}/${key}`, value });\n }\n }\n return { config, credentialRef, secretsToStore };\n }\n\n // Process materialize map\n for (const [configPath, template] of Object.entries(materialize)) {\n const resolved = resolveTemplate(template, context);\n\n if (resolved.hasSecret) {\n // This config path holds a secret reference — don't inline the value\n if (!credentialRef) {\n credentialRef = `${credentialRefPrefix}/creds`;\n }\n const secretRef = `${credentialRef}/${configPath}`;\n secretsToStore.push({ ref: secretRef, value: resolved.value as string });\n // Store the ref path in config so the runtime knows where to look\n setNestedValue(config, configPath, `secret://${secretRef}`);\n } else {\n setNestedValue(config, configPath, resolved.value);\n }\n }\n\n return { config, credentialRef, secretsToStore };\n}\n\n/**\n * Store interpolated secrets via the SecretsRouter.\n *\n * @param router - The SecretsRouter instance.\n * @param secretsToStore - Array of `{ref, value}` pairs from {@link InterpolationResult}.\n * @docLink packages/library/concepts#interpolation\n */\nexport async function storeSecrets(\n router: SecretsRouter,\n secretsToStore: Array<{ ref: string; value: string }>,\n): Promise<void> {\n for (const { ref, value } of secretsToStore) {\n const encoded = new TextEncoder().encode(value);\n await router.setSecret(ref, encoded);\n }\n}\n\n/**\n * Check if a template string contains any interpolation tokens (`${INPUT:...}` or `${SECRET:...}`).\n *\n * @param template - The template string to inspect.\n * @returns `true` if at least one token is present.\n * @docLink packages/library/concepts#interpolation\n */\nexport function hasInterpolationTokens(template: string): boolean {\n return INTERPOLATION_PATTERN.test(template);\n}\n\n/**\n * Extract all placeholder keys referenced in a materialize map.\n *\n * @param materialize - Map of dotted config paths to template strings.\n * @returns Sets of unique `INPUT` and `SECRET` key names referenced across all templates.\n * @docLink packages/library/concepts#interpolation\n */\nexport function extractReferencedKeys(materialize: Record<string, string>): {\n inputKeys: string[];\n secretKeys: string[];\n} {\n const inputKeys = new Set<string>();\n const secretKeys = new Set<string>();\n\n for (const template of Object.values(materialize)) {\n const pattern = new RegExp(INTERPOLATION_PATTERN.source, \"g\");\n for (const match of template.matchAll(pattern)) {\n const namespace = match[1];\n const key = match[2];\n if (namespace === \"INPUT\") inputKeys.add(key);\n else if (namespace === \"SECRET\") secretKeys.add(key);\n }\n }\n\n return { inputKeys: [...inputKeys], secretKeys: [...secretKeys] };\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/** Pattern: ${INPUT:KEY} or ${SECRET:KEY} */\nconst INTERPOLATION_PATTERN = /\\$\\{(INPUT|SECRET):([^}]+)\\}/;\n\ninterface TemplateResolution {\n value: unknown;\n hasSecret: boolean;\n}\n\nfunction resolveTemplate(template: string, context: InterpolationContext): TemplateResolution {\n // Check if the entire template is a single token (preserve type)\n const singleMatch = template.match(/^\\$\\{(INPUT|SECRET):([^}]+)\\}$/);\n if (singleMatch) {\n const [, namespace, key] = singleMatch;\n if (namespace === \"SECRET\") {\n if (!(key in context.secrets)) {\n throw new InterpolationError(`Missing secret key \"${key}\" in interpolation context`);\n }\n return { value: context.secrets[key], hasSecret: true };\n }\n // INPUT — return the typed value directly\n if (!(key in context.inputs)) {\n throw new InterpolationError(`Missing input key \"${key}\" in interpolation context`);\n }\n return { value: context.inputs[key], hasSecret: false };\n }\n\n // Multi-token template — reject if it contains any SECRET tokens.\n // Mixing secrets with other data in a compound string breaks update\n // semantics (updating the non-secret part later won't update the stored\n // secret) and leaks non-secret data into the secret store.\n const tokens = [...template.matchAll(/\\$\\{(INPUT|SECRET):([^}]+)\\}/g)];\n const hasSecretToken = tokens.some(([, ns]) => ns === \"SECRET\");\n if (hasSecretToken) {\n throw new InterpolationError(\n `Template \"${template}\" mixes \\${SECRET:...} with other tokens. ` +\n `SECRET must be the sole token in a template value.`,\n );\n }\n\n // Pure INPUT multi-token — string interpolation\n const result = template.replace(/\\$\\{INPUT:([^}]+)\\}/g, (_, key) => {\n if (!(key in context.inputs)) {\n throw new InterpolationError(`Missing input key \"${key}\" in interpolation context`);\n }\n return String(context.inputs[key] ?? \"\");\n });\n\n return { value: result, hasSecret: false };\n}\n\n/**\n * Set a value at a dotted path in an object.\n * Creates intermediate objects as needed.\n *\n * Example: setNestedValue(obj, \"a.b.c\", 42) → obj.a.b.c = 42\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split(\".\");\n let current: Record<string, unknown> = obj;\n\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i];\n if (current[key] === undefined || current[key] === null || typeof current[key] !== \"object\") {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n\n current[parts[parts.length - 1]] = value;\n}\n","/**\n * applyPreset — the main orchestrator for preset application.\n *\n * Given a preset ref and user inputs, this function:\n * 1. Parses the preset manifest\n * 2. Validates all placeholder inputs\n * 3. Resolves each item ref (asset, library-instance, nested-preset, cross-item)\n * 4. Interpolates config and secrets\n * 5. Creates Instances in the Library\n * 6. Subscribes the workspace to created Instances\n * 7. Stores secrets via SecretsRouter\n * 8. Returns the apply result\n *\n * Nesting: nested preset refs are recursively applied (max depth 3).\n * Outer-wins: outer preset's inputs override nested preset's defaults.\n *\n * NOTE: The `composes` field on preset items is validated at parse-time\n * (cross-item refs resolve to declared IDs) but NOT interpreted at apply-time.\n * Composition (e.g. attaching skills/connectors to an agent item) is a Phase 2\n * concern — Task 1.7 will wire the composes declarations into the Instance's\n * config as part of the agent binding step.\n *\n * @docLink packages/library/concepts#preset-application\n */\n\nimport type { PresetManifest, PresetItem } from \"@skaile/workspaces/types/manifests\";\nimport type { SecretsRouter } from \"@skaile/workspaces/secrets\";\nimport type { IAssetIndex, Instance, Subscription, PinPolicy } from \"../library.js\";\nimport { parsePreset, validateNestingDepth } from \"./parse.js\";\nimport { resolveItem } from \"./resolve-item.js\";\nimport { validateAllPlaceholders, isSecretPlaceholder } from \"./placeholders.js\";\nimport { interpolate, storeSecrets, type InterpolationContext } from \"./interpolate.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Options for {@link applyPreset}.\n *\n * @docLink packages/library/concepts#preset-application\n */\nexport interface ApplyOpts {\n /** The library for instance creation and subscription. */\n library: IAssetIndex;\n /** Workspace ID for subscription creation. */\n workspaceId: string;\n /** Pin policy for created instances (default: \"minor-track\"). */\n pinPolicy?: PinPolicy;\n /** SecretsRouter for secret storage. */\n secretsRouter?: SecretsRouter;\n /** Set of known preset refs (for nested detection). */\n knownPresetRefs?: Set<string>;\n /** Loader function for nested presets (given a ref, return manifest data). */\n loadPreset?: (ref: string) => Promise<Record<string, unknown> | null>;\n /** Current nesting depth (internal, used for recursion). */\n _depth?: number;\n /** Creator identity for audit trail. */\n createdBy?: string;\n}\n\n/**\n * Aggregated result of a {@link applyPreset} call.\n *\n * @docLink packages/library/concepts#preset-application\n */\nexport interface ApplyResult {\n /** All instances created during this apply (including nested). */\n instances: Instance[];\n /** All subscriptions created during this apply. */\n subscriptions: Subscription[];\n /** Errors encountered (non-fatal — partial apply). */\n errors: string[];\n}\n\n/**\n * Per-item result used internally during preset application.\n *\n * @docLink packages/library/concepts#preset-application\n */\nexport interface ApplyItemResult {\n /** Instances created for this item. */\n instances: Instance[];\n /** Subscriptions created for this item. */\n subscriptions: Subscription[];\n /** Non-fatal errors for this item. */\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Apply a parsed preset manifest.\n *\n * This is the primary entry point for CLI and platform consumers.\n * It handles: validation → resolve → interpolate → create instances →\n * subscribe → store secrets.\n *\n * @param presetRef - Canonical ref of the preset being applied.\n * @param manifest - The validated preset manifest (already parsed).\n * @param inputs - User-provided placeholder values (key to value).\n * @param opts - Apply options (library, workspace, secrets, nesting context).\n * @returns Aggregated apply result.\n * @docLink packages/library/concepts#preset-application\n */\nexport async function applyPreset(\n presetRef: string,\n manifest: PresetManifest,\n inputs: Record<string, unknown>,\n opts: ApplyOpts,\n): Promise<ApplyResult> {\n const depth = opts._depth ?? 0;\n const pinPolicy = opts.pinPolicy ?? \"minor-track\";\n\n // Validate nesting depth\n const depthError = validateNestingDepth(presetRef, depth);\n if (depthError) {\n return { instances: [], subscriptions: [], errors: [depthError] };\n }\n\n const result: ApplyResult = { instances: [], subscriptions: [], errors: [] };\n const itemResults = new Map<string, Instance>();\n\n for (const item of manifest.items) {\n const itemResult = await applyItemImpl(\n presetRef,\n item,\n inputs,\n opts,\n depth,\n pinPolicy,\n itemResults,\n );\n\n result.errors.push(...itemResult.errors);\n\n for (const inst of itemResult.instances) {\n result.instances.push(inst);\n if (item.id && itemResult.instances.length > 0) {\n // Track the first instance under the item id for cross-item resolution\n itemResults.set(item.id, itemResult.instances[0]);\n }\n }\n result.subscriptions.push(...itemResult.subscriptions);\n }\n\n return result;\n}\n\n/**\n * Apply a preset from raw YAML data.\n *\n * Convenience wrapper that parses first, then applies.\n *\n * @param presetRef - Canonical ref of the preset.\n * @param data - Raw parsed YAML object (pre-read from disk).\n * @param inputs - User-provided placeholder values.\n * @param opts - Apply options.\n * @returns Aggregated apply result, with parse errors in `errors` if parse fails.\n * @docLink packages/library/concepts#preset-application\n */\nexport async function applyPresetFromData(\n presetRef: string,\n data: unknown,\n inputs: Record<string, unknown>,\n opts: ApplyOpts,\n): Promise<ApplyResult> {\n const parseResult = parsePreset(data);\n if (!parseResult.ok || !parseResult.preset) {\n return {\n instances: [],\n subscriptions: [],\n errors: parseResult.errors.map((e) => `Parse: ${e}`),\n };\n }\n return applyPreset(presetRef, parseResult.preset, inputs, opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internal: per-item apply\n// ---------------------------------------------------------------------------\n\nasync function applyItemImpl(\n presetRef: string,\n item: PresetItem,\n inputs: Record<string, unknown>,\n opts: ApplyOpts,\n depth: number,\n pinPolicy: PinPolicy,\n itemResults: Map<string, Instance>,\n): Promise<ApplyItemResult> {\n const { library } = opts;\n\n // Resolve the item ref\n const resolved = await resolveItem(item, library, opts.knownPresetRefs);\n\n switch (resolved.kind) {\n case \"cross-item\": {\n const target = itemResults.get(resolved.targetId);\n if (!target) {\n return {\n instances: [],\n subscriptions: [],\n errors: [\n `Cross-item ref \"#${resolved.targetId}\" not yet resolved (items must be ordered)`,\n ],\n };\n }\n return { instances: [target], subscriptions: [], errors: [] };\n }\n\n case \"library-instance\": {\n if (!resolved.instance) {\n return {\n instances: [],\n subscriptions: [],\n errors: [`Library instance \"${resolved.instanceId}\" not found`],\n };\n }\n // Subscribe workspace to existing instance\n try {\n const sub = await library.subscribe(opts.workspaceId, resolved.instanceId, pinPolicy);\n return { instances: [resolved.instance], subscriptions: [sub], errors: [] };\n } catch {\n // DuplicateSubscription is non-fatal\n return { instances: [resolved.instance], subscriptions: [], errors: [] };\n }\n }\n\n case \"nested-preset\": {\n if (!opts.loadPreset) {\n return {\n instances: [],\n subscriptions: [],\n errors: [`Cannot resolve nested preset \"${resolved.presetRef}\" — no loader provided`],\n };\n }\n const nestedData = await opts.loadPreset(resolved.presetRef);\n if (!nestedData) {\n return {\n instances: [],\n subscriptions: [],\n errors: [`Nested preset \"${resolved.presetRef}\" not found`],\n };\n }\n const parseResult = parsePreset(nestedData);\n if (!parseResult.ok || !parseResult.preset) {\n return { instances: [], subscriptions: [], errors: parseResult.errors };\n }\n\n // Outer-wins: merge outer inputs over item.inputs\n const nestedInputs = {\n ...((item.inputs as Record<string, unknown>) ?? {}),\n ...inputs,\n };\n\n const nestedResult = await applyPreset(resolved.presetRef, parseResult.preset, nestedInputs, {\n ...opts,\n _depth: depth + 1,\n });\n\n // Propagate ALL nested instances and subscriptions (not just [0])\n return {\n instances: nestedResult.instances,\n subscriptions: nestedResult.subscriptions,\n errors: nestedResult.errors,\n };\n }\n\n case \"asset\": {\n // Validate and interpolate\n const itemInputs = { ...inputs };\n let validatedValues: Record<string, unknown> = {};\n const secretValues: Record<string, string> = {};\n\n if (item.placeholders && item.placeholders.length > 0) {\n const nonSecretPhs = item.placeholders.filter((ph) => !isSecretPlaceholder(ph));\n const secretPhs = item.placeholders.filter((ph) => isSecretPlaceholder(ph));\n\n const validation = validateAllPlaceholders(nonSecretPhs, itemInputs);\n if (!validation.valid) {\n return { instances: [], subscriptions: [], errors: validation.errors };\n }\n validatedValues = validation.values;\n\n const secretValidation = validateAllPlaceholders(secretPhs, itemInputs);\n if (!secretValidation.valid) {\n return { instances: [], subscriptions: [], errors: secretValidation.errors };\n }\n for (const [key, value] of Object.entries(secretValidation.values)) {\n secretValues[key] = String(value);\n }\n }\n\n // Interpolate\n const credentialRefPrefix = `preset/${presetRef}/${item.id ?? resolved.defRef}`;\n const context: InterpolationContext = {\n inputs: validatedValues,\n secrets: secretValues,\n };\n const interpolated = interpolate(\n item.materialize,\n item.config as Record<string, unknown> | undefined,\n context,\n credentialRefPrefix,\n );\n\n // Store secrets\n if (opts.secretsRouter && interpolated.secretsToStore.length > 0) {\n try {\n await storeSecrets(opts.secretsRouter, interpolated.secretsToStore);\n } catch (err) {\n return {\n instances: [],\n subscriptions: [],\n errors: [\n `Secret storage failed for \"${item.ref}\": ${err instanceof Error ? err.message : String(err)}`,\n ],\n };\n }\n }\n\n // Create Instance in library\n try {\n const instance = await library.createInstance({\n defRef: resolved.defRef,\n defPin: pinPolicy,\n config: interpolated.config,\n credentialRef: interpolated.credentialRef,\n createdBy: opts.createdBy ?? `preset:${presetRef}`,\n });\n\n // Subscribe workspace\n const subscriptions: Subscription[] = [];\n try {\n const sub = await library.subscribe(opts.workspaceId, instance.id, pinPolicy);\n subscriptions.push(sub);\n } catch {\n // DuplicateSubscription is non-fatal\n }\n\n return { instances: [instance], subscriptions, errors: [] };\n } catch (err) {\n return {\n instances: [],\n subscriptions: [],\n errors: [\n `Instance creation failed for \"${item.ref}\": ${err instanceof Error ? err.message : String(err)}`,\n ],\n };\n }\n }\n }\n}\n","/**\n * Preset upgrade detection — structural vs non-structural changes.\n *\n * Non-structural changes (config values, placeholder defaults) propagate\n * automatically per pin policy. Structural changes (added/removed items,\n * changed refs) require explicit `skaile preset upgrade`.\n *\n * The upgrade detector compares two preset versions and classifies the diff.\n *\n * @docLink packages/library/concepts#upgrade-strategies\n */\n\nimport type { PresetManifest, PresetItem } from \"@skaile/workspaces/types/manifests\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Classification of the diff between two preset versions.\n *\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport type ChangeKind = \"structural\" | \"non-structural\";\n\n/**\n * Detailed diff between two preset manifest versions.\n *\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport interface PresetDiff {\n /** Overall classification — `structural` or `non-structural`. */\n kind: ChangeKind;\n /** Items added in the new version (structural). */\n addedItems: PresetItem[];\n /** Items removed from the old version (structural). */\n removedItems: PresetItem[];\n /** Items with changed refs or placeholder/materialize changes (structural). */\n changedRefItems: Array<{ old: PresetItem; new: PresetItem }>;\n /** Items with config-only changes (non-structural, safe to auto-propagate). */\n configChangedItems: Array<{ old: PresetItem; new: PresetItem }>;\n /** Human-readable summary string for CLI display. */\n summary: string;\n}\n\n/**\n * Result of {@link evaluateUpgrade} — indicates whether the upgrade can proceed automatically.\n *\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport interface UpgradeResult {\n /** Whether upgrade can proceed without user confirmation. */\n autoUpgradable: boolean;\n /** The computed diff between old and new. */\n diff: PresetDiff;\n /** If structural, the list of actions that require explicit user approval. */\n requiredActions?: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Detect changes between two preset versions.\n *\n * @param oldManifest - The currently applied preset manifest.\n * @param newManifest - The new preset manifest to upgrade to.\n * @returns Classified diff with added/removed/changed item lists.\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport function detectChanges(\n oldManifest: PresetManifest,\n newManifest: PresetManifest,\n): PresetDiff {\n const oldItems = indexItems(oldManifest.items);\n const newItems = indexItems(newManifest.items);\n\n const addedItems: PresetItem[] = [];\n const removedItems: PresetItem[] = [];\n const changedRefItems: Array<{ old: PresetItem; new: PresetItem }> = [];\n const configChangedItems: Array<{ old: PresetItem; new: PresetItem }> = [];\n\n // Find removed items (in old, not in new)\n for (const [key, oldItem] of oldItems) {\n if (!newItems.has(key)) {\n removedItems.push(oldItem);\n }\n }\n\n // Find added items (in new, not in old)\n for (const [key, newItem] of newItems) {\n if (!oldItems.has(key)) {\n addedItems.push(newItem);\n }\n }\n\n // Find changed items (in both)\n for (const [key, newItem] of newItems) {\n const oldItem = oldItems.get(key);\n if (!oldItem) continue;\n\n // Ref change = structural\n if (oldItem.ref !== newItem.ref) {\n changedRefItems.push({ old: oldItem, new: newItem });\n } else if (\n !deepEqual(oldItem.placeholders, newItem.placeholders) ||\n !deepEqual(oldItem.materialize, newItem.materialize)\n ) {\n // Placeholder/materialize changes are structural: they alter interpolation\n // semantics and require re-prompting the user or re-running the apply pipeline.\n changedRefItems.push({ old: oldItem, new: newItem });\n } else if (!deepEqual(oldItem.config, newItem.config)) {\n // Config-only changes are non-structural (safe to auto-propagate).\n configChangedItems.push({ old: oldItem, new: newItem });\n }\n }\n\n // Classify\n const isStructural =\n addedItems.length > 0 || removedItems.length > 0 || changedRefItems.length > 0;\n\n const kind: ChangeKind = isStructural ? \"structural\" : \"non-structural\";\n\n const summaryParts: string[] = [];\n if (addedItems.length > 0) summaryParts.push(`+${addedItems.length} items`);\n if (removedItems.length > 0) summaryParts.push(`-${removedItems.length} items`);\n if (changedRefItems.length > 0) summaryParts.push(`${changedRefItems.length} ref changes`);\n if (configChangedItems.length > 0)\n summaryParts.push(`${configChangedItems.length} config changes`);\n\n const summary = summaryParts.length > 0 ? `${kind}: ${summaryParts.join(\", \")}` : \"no changes\";\n\n return {\n kind,\n addedItems,\n removedItems,\n changedRefItems,\n configChangedItems,\n summary,\n };\n}\n\n/**\n * Determine if a preset upgrade can proceed automatically or needs user confirmation.\n *\n * @param oldManifest - Currently applied version.\n * @param newManifest - Target version.\n * @returns Upgrade result indicating auto-upgradability and required actions.\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport function evaluateUpgrade(\n oldManifest: PresetManifest,\n newManifest: PresetManifest,\n): UpgradeResult {\n const diff = detectChanges(oldManifest, newManifest);\n\n if (diff.kind === \"non-structural\") {\n return { autoUpgradable: true, diff };\n }\n\n // Structural changes require explicit approval\n const requiredActions: string[] = [];\n\n if (diff.addedItems.length > 0) {\n requiredActions.push(\n `Create ${diff.addedItems.length} new instance(s): ${diff.addedItems.map((i) => i.ref).join(\", \")}`,\n );\n }\n\n if (diff.removedItems.length > 0) {\n requiredActions.push(\n `Remove ${diff.removedItems.length} instance(s): ${diff.removedItems.map((i) => i.ref).join(\", \")}`,\n );\n }\n\n if (diff.changedRefItems.length > 0) {\n requiredActions.push(`Replace ${diff.changedRefItems.length} instance(s) with new refs`);\n }\n\n return { autoUpgradable: false, diff, requiredActions };\n}\n\n/**\n * Apply a non-structural upgrade to existing instances.\n *\n * Updates config on existing instances to match the new preset version's\n * config/materialize/placeholder defaults. Only runs when `evaluateUpgrade`\n * returns `autoUpgradable: true`.\n *\n * @param newManifest - The new preset manifest.\n * @param existingInstances - Map of item key to instance ID.\n * @param library - Library instance used to call `updateInstance`.\n * @returns Count of updated instances and any per-instance errors.\n * @docLink packages/library/concepts#upgrade-strategies\n */\nexport async function applyNonStructuralUpgrade(\n newManifest: PresetManifest,\n existingInstances: Map<string, string>,\n library: {\n updateInstance: (id: string, patch: { config?: Record<string, unknown> }) => Promise<unknown>;\n },\n): Promise<{ updated: number; errors: string[] }> {\n let updated = 0;\n const errors: string[] = [];\n\n for (const item of newManifest.items) {\n const key = itemKey(item);\n const instanceId = existingInstances.get(key);\n if (!instanceId) continue;\n\n if (item.config) {\n try {\n await library.updateInstance(instanceId, {\n config: item.config as Record<string, unknown>,\n });\n updated++;\n } catch (err) {\n errors.push(\n `Failed to update instance \"${instanceId}\": ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n }\n\n return { updated, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Create a stable key for matching items across versions.\n * Uses `id` if available, falls back to `ref`.\n */\nfunction itemKey(item: PresetItem): string {\n return item.id ?? item.ref;\n}\n\n/**\n * Index items by their stable key.\n */\nfunction indexItems(items: PresetItem[]): Map<string, PresetItem> {\n const map = new Map<string, PresetItem>();\n for (const item of items) {\n map.set(itemKey(item), item);\n }\n return map;\n}\n\n/**\n * Deep equality check (JSON-based, suitable for config objects).\n */\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === undefined && b === undefined) return true;\n if (a === null && b === null) return true;\n if (a === undefined || b === undefined) return false;\n if (a === null || b === null) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n"]}