@agentxm/extension-lifecycle 0.28.11 → 0.28.13

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 (207) hide show
  1. package/dist/src/activation/display-paths.d.ts +25 -0
  2. package/dist/src/activation/display-paths.js +25 -0
  3. package/dist/src/activation/errors.d.ts +16 -0
  4. package/dist/src/activation/errors.js +7 -0
  5. package/dist/src/activation/set-activation.d.ts +134 -0
  6. package/dist/src/activation/set-activation.js +772 -0
  7. package/dist/src/demote/demote-to-external-source.d.ts +82 -0
  8. package/dist/src/demote/demote-to-external-source.js +233 -0
  9. package/dist/src/errors.d.ts +0 -8
  10. package/dist/src/errors.js +0 -8
  11. package/dist/src/glob.d.ts +35 -0
  12. package/dist/src/glob.js +75 -0
  13. package/dist/src/hooks/configured-agent-outcomes-provider.d.ts +7 -3
  14. package/dist/src/hooks/configured-agent-outcomes-provider.js +11 -4
  15. package/dist/src/hooks/install/plan.d.ts +45 -0
  16. package/dist/src/hooks/install/plan.js +224 -0
  17. package/dist/src/hooks/uninstall/plan.d.ts +20 -0
  18. package/dist/src/hooks/uninstall/plan.js +77 -0
  19. package/dist/src/index.d.ts +48 -16
  20. package/dist/src/index.js +60 -17
  21. package/dist/src/install/aggregate-projection-step.d.ts +16 -0
  22. package/dist/src/install/aggregate-projection-step.js +49 -0
  23. package/dist/src/install/configured.d.ts +65 -0
  24. package/dist/src/install/configured.js +406 -0
  25. package/dist/src/install/inline-mcp-operation.d.ts +4 -0
  26. package/dist/src/install/inline-mcp-operation.js +25 -0
  27. package/dist/src/install/install-extensions.d.ts +110 -0
  28. package/dist/src/install/install-extensions.js +282 -0
  29. package/dist/src/install/per-type-install.d.ts +12 -0
  30. package/dist/src/install/per-type-install.js +12 -0
  31. package/dist/src/install/registry-install-target.d.ts +35 -0
  32. package/dist/src/install/registry-install-target.js +66 -0
  33. package/dist/src/install/registry-login-suggestion.d.ts +21 -0
  34. package/dist/src/install/registry-login-suggestion.js +34 -0
  35. package/dist/src/install/registry-source-resolution.d.ts +54 -0
  36. package/dist/src/install/registry-source-resolution.js +216 -0
  37. package/dist/src/install/root-intent.d.ts +19 -0
  38. package/dist/src/install/root-intent.js +122 -0
  39. package/dist/src/install/selection-interaction.d.ts +46 -0
  40. package/dist/src/install/selection-interaction.js +22 -0
  41. package/dist/src/install/vocabulary.d.ts +143 -0
  42. package/dist/src/install/vocabulary.js +29 -0
  43. package/dist/src/knowledge/install/plan.d.ts +35 -0
  44. package/dist/src/knowledge/install/plan.js +128 -0
  45. package/dist/src/knowledge/uninstall/plan.d.ts +23 -0
  46. package/dist/src/knowledge/uninstall/plan.js +140 -0
  47. package/dist/src/live.d.ts +4 -11
  48. package/dist/src/live.js +4 -11
  49. package/dist/src/mcps/install/plan.d.ts +65 -0
  50. package/dist/src/mcps/install/plan.js +301 -0
  51. package/dist/src/mcps/operations/disable.d.ts +5 -3
  52. package/dist/src/mcps/operations/disable.js +6 -4
  53. package/dist/src/mcps/operations/enable.d.ts +5 -3
  54. package/dist/src/mcps/operations/enable.js +8 -6
  55. package/dist/src/mcps/operations/sync-outcome.d.ts +1 -1
  56. package/dist/src/mcps/operations/uninstall.d.ts +5 -3
  57. package/dist/src/mcps/operations/uninstall.js +4 -4
  58. package/dist/src/mcps/uninstall/plan.d.ts +24 -0
  59. package/dist/src/mcps/uninstall/plan.js +109 -0
  60. package/dist/src/packs/artifact.d.ts +21 -0
  61. package/dist/src/packs/artifact.js +32 -0
  62. package/dist/src/packs/constraint-gate.d.ts +30 -0
  63. package/dist/src/packs/constraint-gate.js +76 -0
  64. package/dist/src/packs/expansion.d.ts +13 -14
  65. package/dist/src/packs/expansion.js +1 -2
  66. package/dist/src/packs/graph-transition.d.ts +64 -0
  67. package/dist/src/packs/graph-transition.js +219 -0
  68. package/dist/src/packs/install/plan.d.ts +95 -0
  69. package/dist/src/packs/install/plan.js +845 -0
  70. package/dist/src/packs/member-install-step.d.ts +29 -0
  71. package/dist/src/packs/member-install-step.js +156 -0
  72. package/dist/src/packs/operations/install.d.ts +3 -3
  73. package/dist/src/packs/operations/install.js +5 -5
  74. package/dist/src/packs/promote-authored-pack.d.ts +86 -0
  75. package/dist/src/packs/promote-authored-pack.js +239 -0
  76. package/dist/src/packs/resolved-dependency.d.ts +9 -26
  77. package/dist/src/packs/resolved-dependency.js +8 -20
  78. package/dist/src/packs/uninstall/plan.d.ts +66 -0
  79. package/dist/src/packs/uninstall/plan.js +344 -0
  80. package/dist/src/packs/uninstall/readiness.d.ts +50 -0
  81. package/dist/src/packs/uninstall/readiness.js +130 -0
  82. package/dist/src/publisher-binding.d.ts +8 -40
  83. package/dist/src/publisher-binding.js +8 -46
  84. package/dist/src/rules/install/plan.d.ts +35 -0
  85. package/dist/src/rules/install/plan.js +133 -0
  86. package/dist/src/rules/uninstall/plan.d.ts +19 -0
  87. package/dist/src/rules/uninstall/plan.js +54 -0
  88. package/dist/src/skills/install/bundled.d.ts +73 -0
  89. package/dist/src/skills/install/bundled.js +244 -0
  90. package/dist/src/skills/install/plan.d.ts +72 -0
  91. package/dist/src/skills/install/plan.js +429 -0
  92. package/dist/src/skills/install/selection.d.ts +26 -0
  93. package/dist/src/skills/install/selection.js +41 -0
  94. package/dist/src/skills/install/source.d.ts +21 -0
  95. package/dist/src/skills/install/source.js +76 -0
  96. package/dist/src/skills/operations/disable.d.ts +3 -2
  97. package/dist/src/skills/operations/disable.js +7 -11
  98. package/dist/src/skills/operations/enable.d.ts +3 -2
  99. package/dist/src/skills/operations/enable.js +6 -8
  100. package/dist/src/skills/operations/install.d.ts +4 -4
  101. package/dist/src/skills/operations/install.js +13 -12
  102. package/dist/src/skills/uninstall/plan.d.ts +23 -0
  103. package/dist/src/skills/uninstall/plan.js +165 -0
  104. package/dist/src/skills/utils.js +1 -1
  105. package/dist/src/step-failure-conversion.d.ts +44 -0
  106. package/dist/src/step-failure-conversion.js +26 -0
  107. package/dist/src/step-failure.d.ts +29 -0
  108. package/dist/src/step-failure.js +130 -0
  109. package/dist/src/subagents/install/plan.d.ts +49 -0
  110. package/dist/src/subagents/install/plan.js +270 -0
  111. package/dist/src/subagents/install/selection.d.ts +26 -0
  112. package/dist/src/subagents/install/selection.js +37 -0
  113. package/dist/src/subagents/install/source.d.ts +18 -0
  114. package/dist/src/subagents/install/source.js +72 -0
  115. package/dist/src/subagents/operations/disable.d.ts +5 -3
  116. package/dist/src/subagents/operations/disable.js +5 -3
  117. package/dist/src/subagents/operations/enable.d.ts +5 -3
  118. package/dist/src/subagents/operations/enable.js +17 -12
  119. package/dist/src/subagents/uninstall/plan.d.ts +20 -0
  120. package/dist/src/subagents/uninstall/plan.js +142 -0
  121. package/dist/src/test-packages.d.ts +34 -0
  122. package/dist/src/test-packages.js +111 -0
  123. package/dist/src/test-registry.d.ts +78 -0
  124. package/dist/src/test-registry.js +223 -0
  125. package/dist/src/testing.d.ts +108 -0
  126. package/dist/src/testing.js +241 -0
  127. package/dist/src/uninstall/retention-policy.d.ts +21 -0
  128. package/dist/src/uninstall/retention-policy.js +28 -0
  129. package/dist/src/uninstall/root-intent.d.ts +17 -0
  130. package/dist/src/uninstall/root-intent.js +101 -0
  131. package/dist/src/uninstall/uninstall-extensions.d.ts +61 -0
  132. package/dist/src/uninstall/uninstall-extensions.js +127 -0
  133. package/dist/src/uninstall/vocabulary.d.ts +40 -0
  134. package/dist/src/uninstall/vocabulary.js +14 -0
  135. package/dist/src/update/atomicity.d.ts +22 -0
  136. package/dist/src/update/atomicity.js +23 -0
  137. package/dist/src/update/blockers.d.ts +31 -0
  138. package/dist/src/update/blockers.js +78 -0
  139. package/dist/src/update/configured.d.ts +78 -0
  140. package/dist/src/update/configured.js +546 -0
  141. package/dist/src/update/root-request.d.ts +39 -0
  142. package/dist/src/update/root-request.js +117 -0
  143. package/dist/src/update/selective/plan.d.ts +45 -0
  144. package/dist/src/update/selective/plan.js +61 -0
  145. package/dist/src/update/selective/requirements.d.ts +17 -0
  146. package/dist/src/update/selective/requirements.js +14 -0
  147. package/dist/src/update/selective/selection.d.ts +63 -0
  148. package/dist/src/update/selective/selection.js +85 -0
  149. package/dist/src/update/selective/skills.d.ts +55 -0
  150. package/dist/src/update/selective/skills.js +596 -0
  151. package/dist/src/update/selective/subagents.d.ts +52 -0
  152. package/dist/src/update/selective/subagents.js +331 -0
  153. package/dist/src/update/selective/use-case.d.ts +121 -0
  154. package/dist/src/update/selective/use-case.js +28 -0
  155. package/dist/src/update/selective/vocabulary.d.ts +43 -0
  156. package/dist/src/update/selective/vocabulary.js +28 -0
  157. package/dist/src/update/selector.d.ts +72 -0
  158. package/dist/src/update/selector.js +120 -0
  159. package/dist/src/update/targeted-plan.d.ts +30 -0
  160. package/dist/src/update/targeted-plan.js +113 -0
  161. package/dist/src/update/update-extensions.d.ts +164 -0
  162. package/dist/src/update/update-extensions.js +579 -0
  163. package/dist/src/workspace-paths.d.ts +31 -0
  164. package/dist/src/workspace-paths.js +46 -0
  165. package/package.json +22 -12
  166. package/dist/src/configured-entry-resolution.d.ts +0 -111
  167. package/dist/src/configured-entry-resolution.js +0 -731
  168. package/dist/src/failure-adapter.d.ts +0 -35
  169. package/dist/src/failure-adapter.js +0 -23
  170. package/dist/src/hooks/manager.d.ts +0 -15
  171. package/dist/src/hooks/manager.js +0 -769
  172. package/dist/src/internal/fs-helpers.d.ts +0 -12
  173. package/dist/src/internal/fs-helpers.js +0 -13
  174. package/dist/src/internal/integrity.d.ts +0 -13
  175. package/dist/src/internal/integrity.js +0 -17
  176. package/dist/src/knowledge/manager.d.ts +0 -11
  177. package/dist/src/knowledge/manager.js +0 -711
  178. package/dist/src/mcps/manager.d.ts +0 -16
  179. package/dist/src/mcps/manager.js +0 -247
  180. package/dist/src/mcps/operations/artifact.d.ts +0 -24
  181. package/dist/src/mcps/operations/artifact.js +0 -74
  182. package/dist/src/mcps/operations/install.d.ts +0 -78
  183. package/dist/src/mcps/operations/install.js +0 -596
  184. package/dist/src/packs/dependency-resolution.d.ts +0 -65
  185. package/dist/src/packs/dependency-resolution.js +0 -414
  186. package/dist/src/packs/manager.d.ts +0 -16
  187. package/dist/src/packs/manager.js +0 -181
  188. package/dist/src/registry-materialization.d.ts +0 -52
  189. package/dist/src/registry-materialization.js +0 -72
  190. package/dist/src/release-age-posture.d.ts +0 -23
  191. package/dist/src/release-age-posture.js +0 -15
  192. package/dist/src/resolution-timeout.d.ts +0 -5
  193. package/dist/src/resolution-timeout.js +0 -11
  194. package/dist/src/rules/manager.d.ts +0 -20
  195. package/dist/src/rules/manager.js +0 -480
  196. package/dist/src/skills/manager.d.ts +0 -18
  197. package/dist/src/skills/manager.js +0 -346
  198. package/dist/src/skills/materialization.d.ts +0 -54
  199. package/dist/src/skills/materialization.js +0 -158
  200. package/dist/src/skills/operations/source-hash.d.ts +0 -2
  201. package/dist/src/skills/operations/source-hash.js +0 -6
  202. package/dist/src/subagents/manager.d.ts +0 -18
  203. package/dist/src/subagents/manager.js +0 -722
  204. package/dist/src/workflows/install-command/workflow.d.ts +0 -56
  205. package/dist/src/workflows/install-command/workflow.js +0 -46
  206. package/dist/src/workflows/uninstall-command/workflow.d.ts +0 -42
  207. package/dist/src/workflows/uninstall-command/workflow.js +0 -29
@@ -1,731 +0,0 @@
1
- import * as DateTime from "effect/DateTime";
2
- import * as Effect from "effect/Effect";
3
- import * as Option from "effect/Option";
4
- import { parseRegistrySourceRef, parseSourceQualifiedRegistrySourcePatternParts, } from "@agentxm/extension-model/unstable/extensions";
5
- import { parseMinimumReleaseAge } from "@agentxm/registry-protocol/unstable/registry/release-age-policy";
6
- import { resolveSource, SourceHostProviders, WorkspaceCatalog } from "@agentxm/extension-sources";
7
- import { isWorkspaceSourceLocator } from "@agentxm/extension-model/unstable/sources/workspace";
8
- import { WorkspaceMutations } from "@agentxm/workspace-state";
9
- import { ExtensionLifecycleFailed } from "./errors.js";
10
- import { ReleaseAgePosture } from "./release-age-posture.js";
11
- import { LifecycleFailureAdapter } from "./failure-adapter.js";
12
- import { acceptedResolutionRef } from "@agentxm/workspace-state";
13
- import { resolveWorkspaceExtensionRef } from "@agentxm/workspace-state";
14
- export const makeConfiguredReleaseAgeEvaluation = () => Effect.gen(function* () {
15
- const mode = yield* ReleaseAgePosture;
16
- const ws = yield* WorkspaceMutations;
17
- const configured = yield* ws.getMinimumReleaseAge();
18
- const minimumReleaseAge = parseMinimumReleaseAge(configured);
19
- if (Option.isNone(minimumReleaseAge)) {
20
- return yield* new ExtensionLifecycleFailed({
21
- category: "validation",
22
- detail: `Invalid minimumReleaseAge "${configured}"`,
23
- recover: "Use a duration such as 24h, 1440m, or 0s.",
24
- });
25
- }
26
- const evaluatedAt = yield* DateTime.now;
27
- const exclude = yield* ws.getMinimumReleaseAgeExclude();
28
- return {
29
- minimumReleaseAge: minimumReleaseAge.value,
30
- evaluatedAt,
31
- mode,
32
- exclude,
33
- };
34
- });
35
- const releaseAgeRecord = (args) => ({
36
- reason: "minimum-release-age",
37
- target: args.target,
38
- dependencyPath: [args.target],
39
- ...(Option.isSome(args.versionRange) ? { requestedRange: args.versionRange.value } : {}),
40
- ...(args.selectedVersion === undefined ? {} : { selectedVersion: args.selectedVersion }),
41
- candidateVersion: args.evidence.version,
42
- publishedAt: args.evidence.publishedAt,
43
- eligibleAt: args.evidence.eligibleAt,
44
- minimumReleaseAgeSeconds: args.evidence.minimumReleaseAgeSeconds,
45
- });
46
- const configuredRegistryResolution = (resolution) => Effect.gen(function* () {
47
- if (resolution.kind === "not_found") {
48
- return yield* new ExtensionLifecycleFailed({
49
- category: "not_found",
50
- detail: `Configured extension "${resolution.target}" could not be found in its source`,
51
- suggestions: [{ description: "Verify the configured source or update axm.json." }],
52
- });
53
- }
54
- if (resolution.kind === "version_unsatisfied") {
55
- return yield* new ExtensionLifecycleFailed({
56
- category: "conflict",
57
- title: "No compatible version",
58
- detail: `${resolution.target} has no visible version satisfying ${resolution.requestedRange}`,
59
- });
60
- }
61
- if (resolution.kind === "policy_held") {
62
- return yield* new ExtensionLifecycleFailed({
63
- category: "conflict",
64
- title: "Release held by minimum release age",
65
- detail: `${resolution.target}@${resolution.candidate.version} is held by the minimum release age until ${resolution.candidate.eligibleAt}`,
66
- // Both routes are reachable from wherever the operator is standing:
67
- // the exemption is declared once, the flag lasts one run.
68
- recover: `Declare ${resolution.target} in minimumReleaseAgeExclude, or rerun this command with --ignore-release-age to take it for this run only.`,
69
- });
70
- }
71
- const holdbacks = resolution.kind === "exempted" || resolution.newerHeld === undefined
72
- ? []
73
- : [
74
- releaseAgeRecord({
75
- target: resolution.target,
76
- versionRange: resolution.versionRange,
77
- evidence: resolution.newerHeld,
78
- selectedVersion: resolution.ref.version,
79
- }),
80
- ];
81
- const bypasses = resolution.kind === "selected"
82
- ? []
83
- : [
84
- {
85
- ...releaseAgeRecord({
86
- target: resolution.target,
87
- versionRange: resolution.versionRange,
88
- evidence: resolution.bypassed,
89
- selectedVersion: resolution.ref.version,
90
- }),
91
- ...resolution.exemption,
92
- },
93
- ];
94
- return {
95
- ref: resolution.ref,
96
- versionRange: resolution.versionRange,
97
- ...(holdbacks.length === 0 && bypasses.length === 0
98
- ? {}
99
- : { releaseAge: { holdbacks, bypasses } }),
100
- };
101
- });
102
- const resolveConfiguredRegistryRef = (name, source, expectedType, releaseAgeEvaluation) => resolveConfiguredRegistryEntry(name, source, expectedType, releaseAgeEvaluation).pipe(Effect.flatMap(Option.match({
103
- onNone: () => Effect.succeed(Option.none()),
104
- onSome: (resolution) => configuredRegistryResolution(resolution).pipe(Effect.map(Option.some)),
105
- })));
106
- export const resolveConfiguredRegistryEntry = (name, source, expectedType, releaseAgeEvaluation) => Effect.gen(function* () {
107
- if (isWorkspaceSourceLocator(source))
108
- return Option.none();
109
- const adapter = yield* LifecycleFailureAdapter;
110
- const resolvedSource = yield* resolveSource(source, { expectedType }).pipe(Effect.mapError((failure) => new ExtensionLifecycleFailed({
111
- category: "validation",
112
- detail: `Invalid ${expectedType} source for ${name}: ${adapter.describeFailure(failure)}`,
113
- cause: failure,
114
- })));
115
- if (resolvedSource.type !== "registry")
116
- return Option.none();
117
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
118
- const pluralType = parsedPattern?.type;
119
- const expectedPlural = expectedType === "mcp-server"
120
- ? "mcps"
121
- : expectedType === "knowledge"
122
- ? "knowledge"
123
- : `${expectedType}s`;
124
- if (pluralType !== undefined && pluralType !== expectedPlural) {
125
- return yield* new ExtensionLifecycleFailed({
126
- category: "validation",
127
- detail: `Configured ${expectedType} "${name}" uses a ${pluralType} Registry source`,
128
- });
129
- }
130
- if (expectedType !== "mcp-server" &&
131
- parsedPattern?.name !== undefined &&
132
- parsedPattern.name !== name) {
133
- return yield* new ExtensionLifecycleFailed({
134
- category: "validation",
135
- detail: `Configured ${expectedType} "${name}" points to Registry extension "${parsedPattern.name}"`,
136
- });
137
- }
138
- const owner = parsedPattern?.owner ?? Option.getOrUndefined(resolvedSource.owner);
139
- if (owner === undefined) {
140
- return yield* new ExtensionLifecycleFailed({
141
- category: "validation",
142
- detail: `Configured Registry source for ${expectedType} "${name}" must include an owner`,
143
- });
144
- }
145
- const versionRange = Option.fromUndefinedOr(parsedPattern?.versionRange);
146
- const registryName = expectedType === "mcp-server" ? (parsedPattern?.name ?? name) : name;
147
- const workspace = yield* WorkspaceMutations;
148
- const acceptedRef = yield* acceptedResolutionRef({
149
- workspace,
150
- type: expectedType,
151
- name,
152
- });
153
- const accepted = Option.flatMap(acceptedRef, (ref) => ref.refType === "registry" && ref.owner === owner && ref.name === registryName
154
- ? Option.some({
155
- version: ref.version,
156
- publisherBindingId: ref.publisherBindingId,
157
- })
158
- : Option.none());
159
- const providers = yield* SourceHostProviders;
160
- const resolution = yield* providers.resolveNamedRegistry(resolvedSource, {
161
- name: registryName,
162
- type: expectedType,
163
- owner,
164
- versionRange,
165
- releaseAgeEvaluation,
166
- ...(Option.isSome(accepted) ? { accepted: accepted.value } : {}),
167
- });
168
- const acceptedVersion = Option.isSome(accepted) &&
169
- (resolution.kind === "selected" || resolution.kind === "exempted") &&
170
- resolution.ref.version === accepted.value.version &&
171
- resolution.ref.publisherBindingId === accepted.value.publisherBindingId
172
- ? accepted.value.version
173
- : undefined;
174
- return Option.some({
175
- ...resolution,
176
- versionRange,
177
- ...(acceptedVersion === undefined ? {} : { acceptedVersion }),
178
- });
179
- });
180
- export const resolveConfiguredSkill = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
181
- if (isWorkspaceSourceLocator(source)) {
182
- const ws = yield* WorkspaceMutations;
183
- const ref = yield* resolveWorkspaceExtensionRef({
184
- settingsName: name,
185
- source,
186
- expectedType: "skill",
187
- layout: ws.layout,
188
- scope: ws.scope,
189
- });
190
- if (ref.type !== "skill") {
191
- return yield* new ExtensionLifecycleFailed({
192
- category: "internal",
193
- detail: `Workspace skill resolution returned ${ref.type}`,
194
- });
195
- }
196
- return { ref, versionRange: Option.none() };
197
- }
198
- const registry = yield* resolveConfiguredRegistryRef(name, source, "skill", releaseAgeEvaluation);
199
- if (Option.isSome(registry)) {
200
- if (registry.value.ref.type !== "skill") {
201
- return yield* new ExtensionLifecycleFailed({
202
- category: "internal",
203
- detail: "Registry returned a non-skill",
204
- });
205
- }
206
- return { ...registry.value, ref: registry.value.ref };
207
- }
208
- const providers = yield* SourceHostProviders;
209
- const resolvedSource = yield* resolveSource(source, { expectedType: "skill" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
210
- category: "validation",
211
- detail: `Invalid skill source for ${name}: ${cause.detail}`,
212
- cause,
213
- })));
214
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
215
- const requestedOwner = parsedPattern?.type === "skills"
216
- ? Option.some(parsedPattern.owner)
217
- : resolvedSource.type === "registry"
218
- ? resolvedSource.owner
219
- : Option.none();
220
- const versionRange = resolvedSource.type === "registry" && parsedPattern?.type === "skills"
221
- ? Option.fromUndefinedOr(parsedPattern.versionRange)
222
- : Option.none();
223
- const refs = yield* providers
224
- .find(resolvedSource, {
225
- names: [name],
226
- type: "skill",
227
- owner: requestedOwner,
228
- versionRange,
229
- })
230
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "skill")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
231
- category: "internal",
232
- detail: `Failed to resolve configured skill "${name}"`,
233
- suggestions: [
234
- {
235
- description: `Verify the configured source is reachable and still contains the skill.`,
236
- },
237
- ],
238
- cause,
239
- })));
240
- const ref = refs.find((entry) => entry.skill.name === name);
241
- if (ref === undefined) {
242
- return yield* new ExtensionLifecycleFailed({
243
- category: "not_found",
244
- detail: `Configured skill "${name}" could not be found in its source`,
245
- suggestions: [
246
- {
247
- description: `Verify the configured source still contains the skill or update axm.json.`,
248
- },
249
- ],
250
- });
251
- }
252
- return {
253
- ref,
254
- versionRange: ref.refType === "registry" ? versionRange : Option.none(),
255
- };
256
- });
257
- export const resolveConfiguredSubagent = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
258
- if (isWorkspaceSourceLocator(source)) {
259
- const ws = yield* WorkspaceMutations;
260
- const ref = yield* resolveWorkspaceExtensionRef({
261
- settingsName: name,
262
- source,
263
- expectedType: "subagent",
264
- layout: ws.layout,
265
- scope: ws.scope,
266
- });
267
- if (ref.type !== "subagent") {
268
- return yield* new ExtensionLifecycleFailed({
269
- category: "internal",
270
- detail: `Workspace subagent resolution returned ${ref.type}`,
271
- });
272
- }
273
- return { ref, versionRange: Option.none() };
274
- }
275
- const registry = yield* resolveConfiguredRegistryRef(name, source, "subagent", releaseAgeEvaluation);
276
- if (Option.isSome(registry)) {
277
- if (registry.value.ref.type !== "subagent") {
278
- return yield* new ExtensionLifecycleFailed({
279
- category: "internal",
280
- detail: "Registry returned a non-subagent",
281
- });
282
- }
283
- return { ...registry.value, ref: registry.value.ref };
284
- }
285
- const providers = yield* SourceHostProviders;
286
- const resolvedSource = yield* resolveSource(source, { expectedType: "subagent" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
287
- category: "validation",
288
- detail: `Invalid subagent source for ${name}: ${cause.detail}`,
289
- cause,
290
- })));
291
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
292
- const requestedOwner = parsedPattern?.type === "subagents"
293
- ? Option.some(parsedPattern.owner)
294
- : resolvedSource.type === "registry"
295
- ? resolvedSource.owner
296
- : Option.none();
297
- const versionRange = resolvedSource.type === "registry" && parsedPattern?.type === "subagents"
298
- ? Option.fromUndefinedOr(parsedPattern.versionRange)
299
- : Option.none();
300
- const refs = yield* providers
301
- .find(resolvedSource, {
302
- names: [name],
303
- type: "subagent",
304
- owner: requestedOwner,
305
- versionRange,
306
- })
307
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "subagent")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
308
- category: "internal",
309
- detail: `Failed to resolve configured subagent "${name}"`,
310
- suggestions: [
311
- {
312
- description: `Verify the configured source is reachable and still contains the subagent.`,
313
- },
314
- ],
315
- cause,
316
- })));
317
- const ref = refs.find((entry) => entry.subagent.name === name);
318
- if (ref === undefined) {
319
- return yield* new ExtensionLifecycleFailed({
320
- category: "not_found",
321
- detail: `Configured subagent "${name}" could not be found in its source`,
322
- suggestions: [
323
- {
324
- description: `Verify the configured source still contains the subagent or update axm.json.`,
325
- },
326
- ],
327
- });
328
- }
329
- return {
330
- ref,
331
- versionRange: ref.refType === "registry" ? versionRange : Option.none(),
332
- };
333
- });
334
- export const resolveConfiguredRule = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
335
- if (isWorkspaceSourceLocator(source)) {
336
- const ws = yield* WorkspaceMutations;
337
- const ref = yield* resolveWorkspaceExtensionRef({
338
- settingsName: name,
339
- source,
340
- expectedType: "rule",
341
- layout: ws.layout,
342
- scope: ws.scope,
343
- });
344
- if (ref.type !== "rule") {
345
- return yield* new ExtensionLifecycleFailed({
346
- category: "internal",
347
- detail: `Workspace rule resolution returned ${ref.type}`,
348
- });
349
- }
350
- return { ref, versionRange: Option.none() };
351
- }
352
- const registry = yield* resolveConfiguredRegistryRef(name, source, "rule", releaseAgeEvaluation);
353
- if (Option.isSome(registry)) {
354
- if (registry.value.ref.type !== "rule") {
355
- return yield* new ExtensionLifecycleFailed({
356
- category: "internal",
357
- detail: "Registry returned a non-rule",
358
- });
359
- }
360
- return { ...registry.value, ref: registry.value.ref };
361
- }
362
- const providers = yield* SourceHostProviders;
363
- const resolvedSource = yield* resolveSource(source, { expectedType: "rule" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
364
- category: "validation",
365
- detail: `Invalid rule source for ${name}: ${cause.detail}`,
366
- cause,
367
- })));
368
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
369
- const requestedOwner = parsedPattern?.type === "rules"
370
- ? Option.some(parsedPattern.owner)
371
- : resolvedSource.type === "registry"
372
- ? resolvedSource.owner
373
- : Option.none();
374
- const versionRange = resolvedSource.type === "registry" && parsedPattern?.type === "rules"
375
- ? Option.fromUndefinedOr(parsedPattern.versionRange)
376
- : Option.none();
377
- const refs = yield* providers
378
- .find(resolvedSource, {
379
- names: [name],
380
- type: "rule",
381
- owner: requestedOwner,
382
- versionRange,
383
- })
384
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "rule")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
385
- category: "internal",
386
- detail: `Failed to resolve configured rule "${name}"`,
387
- suggestions: [
388
- {
389
- description: "Verify the configured source is reachable and still contains the rule.",
390
- },
391
- ],
392
- cause,
393
- })));
394
- const ref = refs.find((entry) => entry.rule.name === name);
395
- if (ref === undefined) {
396
- return yield* new ExtensionLifecycleFailed({
397
- category: "not_found",
398
- detail: `Configured rule "${name}" could not be found in its source`,
399
- suggestions: [
400
- {
401
- description: "Verify the configured source still contains the rule or update axm.json.",
402
- },
403
- ],
404
- });
405
- }
406
- return {
407
- ref,
408
- versionRange: ref.refType === "registry" ? versionRange : Option.none(),
409
- };
410
- });
411
- export const resolveConfiguredHook = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
412
- if (isWorkspaceSourceLocator(source)) {
413
- const ws = yield* WorkspaceMutations;
414
- const ref = yield* resolveWorkspaceExtensionRef({
415
- settingsName: name,
416
- source,
417
- expectedType: "hook",
418
- layout: ws.layout,
419
- scope: ws.scope,
420
- });
421
- if (ref.type !== "hook") {
422
- return yield* new ExtensionLifecycleFailed({
423
- category: "internal",
424
- detail: `Workspace hook resolution returned ${ref.type}`,
425
- });
426
- }
427
- return { ref, versionRange: Option.none() };
428
- }
429
- const registry = yield* resolveConfiguredRegistryRef(name, source, "hook", releaseAgeEvaluation);
430
- if (Option.isSome(registry)) {
431
- if (registry.value.ref.type !== "hook") {
432
- return yield* new ExtensionLifecycleFailed({
433
- category: "internal",
434
- detail: "Registry returned a non-hook",
435
- });
436
- }
437
- return { ...registry.value, ref: registry.value.ref };
438
- }
439
- const providers = yield* SourceHostProviders;
440
- const resolvedSource = yield* resolveSource(source, { expectedType: "hook" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
441
- category: "validation",
442
- detail: `Invalid hook source for ${name}: ${cause.detail}`,
443
- cause,
444
- })));
445
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
446
- const requestedOwner = parsedPattern?.type === "hooks"
447
- ? Option.some(parsedPattern.owner)
448
- : resolvedSource.type === "registry"
449
- ? resolvedSource.owner
450
- : Option.none();
451
- const versionRange = resolvedSource.type === "registry" && parsedPattern?.type === "hooks"
452
- ? Option.fromUndefinedOr(parsedPattern.versionRange)
453
- : Option.none();
454
- const refs = yield* providers
455
- .find(resolvedSource, {
456
- names: [name],
457
- type: "hook",
458
- owner: requestedOwner,
459
- versionRange,
460
- })
461
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "hook")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
462
- category: "internal",
463
- detail: `Failed to resolve configured hook "${name}"`,
464
- suggestions: [
465
- {
466
- description: "Verify the configured source is reachable and still contains the hook.",
467
- },
468
- ],
469
- cause,
470
- })));
471
- const ref = refs.find((entry) => entry.hook.name === name);
472
- if (ref === undefined) {
473
- return yield* new ExtensionLifecycleFailed({
474
- category: "not_found",
475
- detail: `Configured hook "${name}" could not be found in its source`,
476
- suggestions: [
477
- {
478
- description: "Verify the configured source still contains the hook or update axm.json.",
479
- },
480
- ],
481
- });
482
- }
483
- return {
484
- ref,
485
- versionRange: ref.refType === "registry" ? versionRange : Option.none(),
486
- };
487
- });
488
- export const resolveConfiguredKnowledge = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
489
- if (isWorkspaceSourceLocator(source)) {
490
- const ws = yield* WorkspaceMutations;
491
- const ref = yield* resolveWorkspaceExtensionRef({
492
- settingsName: name,
493
- source,
494
- expectedType: "knowledge",
495
- layout: ws.layout,
496
- scope: ws.scope,
497
- });
498
- if (ref.type !== "knowledge") {
499
- return yield* new ExtensionLifecycleFailed({
500
- category: "internal",
501
- detail: `Workspace knowledge resolution returned ${ref.type}`,
502
- });
503
- }
504
- return { ref, versionRange: Option.none() };
505
- }
506
- const registry = yield* resolveConfiguredRegistryRef(name, source, "knowledge", releaseAgeEvaluation);
507
- if (Option.isSome(registry)) {
508
- if (registry.value.ref.type !== "knowledge") {
509
- return yield* new ExtensionLifecycleFailed({
510
- category: "internal",
511
- detail: "Registry returned non-knowledge content",
512
- });
513
- }
514
- return { ...registry.value, ref: registry.value.ref };
515
- }
516
- const providers = yield* SourceHostProviders;
517
- const resolvedSource = yield* resolveSource(source, { expectedType: "knowledge" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
518
- category: "validation",
519
- detail: `Invalid knowledge source for ${name}: ${cause.detail}`,
520
- cause,
521
- })));
522
- const parsedPattern = parseSourceQualifiedRegistrySourcePatternParts(source);
523
- const requestedOwner = parsedPattern?.type === "knowledge"
524
- ? Option.some(parsedPattern.owner)
525
- : resolvedSource.type === "registry"
526
- ? resolvedSource.owner
527
- : Option.none();
528
- const versionRange = resolvedSource.type === "registry" && parsedPattern?.type === "knowledge"
529
- ? Option.fromUndefinedOr(parsedPattern.versionRange)
530
- : Option.none();
531
- const refs = yield* providers
532
- .find(resolvedSource, {
533
- names: [name],
534
- type: "knowledge",
535
- owner: requestedOwner,
536
- versionRange,
537
- })
538
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "knowledge")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
539
- category: "internal",
540
- detail: `Failed to resolve configured knowledge bundle "${name}"`,
541
- cause,
542
- })));
543
- const ref = refs.find((entry) => entry.knowledge.name === name);
544
- if (ref === undefined) {
545
- return yield* new ExtensionLifecycleFailed({
546
- category: "not_found",
547
- detail: `Configured knowledge bundle "${name}" could not be found in its source`,
548
- });
549
- }
550
- return {
551
- ref,
552
- versionRange: ref.refType === "registry" ? versionRange : Option.none(),
553
- };
554
- });
555
- export const resolveConfiguredMcpServer = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
556
- if (isWorkspaceSourceLocator(source)) {
557
- const ws = yield* WorkspaceMutations;
558
- const ref = yield* resolveWorkspaceExtensionRef({
559
- settingsName: name,
560
- source,
561
- expectedType: "mcp-server",
562
- layout: ws.layout,
563
- scope: ws.scope,
564
- });
565
- if (ref.type !== "mcp-server") {
566
- return yield* new ExtensionLifecycleFailed({
567
- category: "internal",
568
- detail: `Workspace MCP server resolution returned ${ref.type}`,
569
- });
570
- }
571
- return { ref, versionRange: Option.none() };
572
- }
573
- const registry = yield* resolveConfiguredRegistryRef(name, source, "mcp-server", releaseAgeEvaluation);
574
- if (Option.isSome(registry)) {
575
- if (registry.value.ref.type !== "mcp-server") {
576
- return yield* new ExtensionLifecycleFailed({
577
- category: "internal",
578
- detail: "Registry returned a non-MCP-server",
579
- });
580
- }
581
- return { ...registry.value, ref: registry.value.ref };
582
- }
583
- const parsed = parseRegistrySourceRef(source);
584
- if (parsed === undefined || parsed.type !== "mcps" || parsed.name !== name) {
585
- return yield* new ExtensionLifecycleFailed({
586
- category: "validation",
587
- detail: `The configured MCP server entry "${name}" is invalid.`,
588
- suggestions: [{ description: `Use a name like "@owner/mcps/name".` }],
589
- });
590
- }
591
- const providers = yield* SourceHostProviders;
592
- const versionRange = Option.fromUndefinedOr(parsed.versionRange);
593
- const resolvedSource = yield* resolveSource(source, { expectedType: "mcp-server" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
594
- category: "validation",
595
- detail: `Invalid MCP server source for ${name}: ${cause.detail}`,
596
- cause,
597
- })));
598
- const refs = yield* providers
599
- .find(resolvedSource, {
600
- names: [name],
601
- type: "mcp-server",
602
- owner: Option.some(parsed.owner),
603
- versionRange,
604
- })
605
- .pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "mcp-server")), Effect.mapError((cause) => new ExtensionLifecycleFailed({
606
- category: "internal",
607
- detail: `Failed to resolve configured MCP server "${name}"`,
608
- suggestions: [
609
- {
610
- description: `Verify the configured registry source is reachable and still contains the MCP server.`,
611
- },
612
- ],
613
- cause,
614
- })));
615
- const ref = refs.find((entry) => entry.server.name === name);
616
- if (ref === undefined) {
617
- return yield* new ExtensionLifecycleFailed({
618
- category: "not_found",
619
- detail: `Configured MCP server "${name}" could not be found in its source`,
620
- suggestions: [
621
- {
622
- description: `Verify the configured source still contains the MCP server or update axm.json.`,
623
- },
624
- ],
625
- });
626
- }
627
- return {
628
- ref,
629
- versionRange,
630
- };
631
- });
632
- export const resolveConfiguredPack = (name, source, releaseAgeEvaluation) => Effect.gen(function* () {
633
- if (isWorkspaceSourceLocator(source)) {
634
- const ws = yield* WorkspaceMutations;
635
- const ref = yield* resolveWorkspaceExtensionRef({
636
- settingsName: name,
637
- source,
638
- expectedType: "pack",
639
- layout: ws.layout,
640
- scope: ws.scope,
641
- });
642
- if (ref.type !== "pack") {
643
- return yield* new ExtensionLifecycleFailed({
644
- category: "internal",
645
- detail: `Workspace pack resolution returned ${ref.type}`,
646
- });
647
- }
648
- return { ref, versionRange: Option.none() };
649
- }
650
- const registry = yield* resolveConfiguredRegistryRef(name, source, "pack", releaseAgeEvaluation);
651
- if (Option.isSome(registry)) {
652
- if (registry.value.ref.type !== "pack") {
653
- return yield* new ExtensionLifecycleFailed({
654
- category: "internal",
655
- detail: "Registry returned a non-pack",
656
- });
657
- }
658
- return { ...registry.value, ref: registry.value.ref };
659
- }
660
- const parsed = parseRegistrySourceRef(source);
661
- if (parsed === undefined || parsed.type !== "packs" || parsed.name !== name) {
662
- return yield* new ExtensionLifecycleFailed({
663
- category: "validation",
664
- detail: `The configured pack entry "${name}" is invalid.`,
665
- suggestions: [{ description: `Use a name like "@owner/packs/name".` }],
666
- });
667
- }
668
- const providers = yield* SourceHostProviders;
669
- const versionRange = Option.fromUndefinedOr(parsed.versionRange);
670
- const resolvedSource = yield* resolveSource(source, { expectedType: "pack" }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
671
- category: "validation",
672
- detail: `Invalid pack source for ${name}: ${cause.detail}`,
673
- cause,
674
- })));
675
- const findWith = (candidate) => providers.find(candidate, {
676
- names: [name],
677
- type: "pack",
678
- owner: Option.some(parsed.owner),
679
- versionRange,
680
- });
681
- const refs = yield* findWith(resolvedSource).pipe(Effect.map((entries) => entries.filter((entry) => entry.type === "pack")), Effect.catch((error) => resolvedSource.type === "registry"
682
- ? Effect.gen(function* () {
683
- const ws = yield* WorkspaceMutations;
684
- const registryHosts = yield* ws.getRegistrySourceHosts();
685
- const fallbackSources = registryHosts
686
- .filter((host) => host.location.protocol === "file:")
687
- .map((host) => ({
688
- type: "registry",
689
- name: host.name,
690
- location: host.location,
691
- owner: Option.some(parsed.owner),
692
- }));
693
- for (const fallback of fallbackSources) {
694
- if (fallback.location.href === resolvedSource.location.href) {
695
- continue;
696
- }
697
- const fallbackResult = yield* findWith(fallback).pipe(Effect.result);
698
- if (fallbackResult._tag === "Success" && fallbackResult.success.length > 0) {
699
- return fallbackResult.success.filter((entry) => entry.type === "pack");
700
- }
701
- }
702
- return yield* error;
703
- })
704
- : Effect.fail(error)), Effect.mapError((cause) => new ExtensionLifecycleFailed({
705
- category: "internal",
706
- detail: `Failed to resolve configured pack "${name}"`,
707
- suggestions: [
708
- {
709
- description: "Verify the configured registry source is reachable and still contains the pack.",
710
- },
711
- ],
712
- cause,
713
- })));
714
- const ref = refs.find((entry) => entry.pack.name === name);
715
- if (ref === undefined) {
716
- return yield* new ExtensionLifecycleFailed({
717
- category: "not_found",
718
- detail: `Configured pack "${name}" could not be found in its source`,
719
- suggestions: [
720
- {
721
- description: "Verify the configured source still contains the pack or update axm.json.",
722
- },
723
- ],
724
- });
725
- }
726
- return {
727
- ref,
728
- versionRange,
729
- };
730
- });
731
- //# sourceMappingURL=configured-entry-resolution.js.map