@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
@@ -0,0 +1,331 @@
1
+ /**
2
+ * Advancing the subagents a workspace selected.
3
+ *
4
+ * `subagents update` re-resolves each selected, enabled subagent against the
5
+ * source the workspace declared and advances the ones whose resolution
6
+ * differs from what was accepted. A subagent that cannot be re-resolved, is
7
+ * workspace-authored, or is held by the minimum release age is reported as a
8
+ * skipped unit rather than failing the sweep.
9
+ *
10
+ * @experimental This API is unstable and may change without notice.
11
+ */
12
+ import * as Array from "effect/Array";
13
+ import * as DateTime from "effect/DateTime";
14
+ import * as Effect from "effect/Effect";
15
+ import * as Option from "effect/Option";
16
+ import { decodeExtensionNameSync, parseSourceQualifiedRegistrySourcePatternParts, } from "@agentxm/extension-model/unstable/extensions";
17
+ import { isWorkspaceSourceLocator } from "@agentxm/extension-model/unstable/sources/workspace";
18
+ import { buildInstallOperation, SubagentManager } from "@agentxm/extension-materialization";
19
+ import { classifyPublisherBindingTransition, makeConfiguredReleaseAgeEvaluation, normalizeReleaseAgeRecords, publisherTransitionWarning, registryBindingProposal, } from "@agentxm/extension-resolution";
20
+ import { resolveSource, SourceHostProviders } from "@agentxm/extension-sources";
21
+ import { operationPresentation, prepareExecutionCandidate, StepFailure, } from "@agentxm/workspace-operations";
22
+ import { acceptedResolutionRef, configuredRowsByName, WorkspaceMutations, } from "@agentxm/workspace-state";
23
+ import { ExtensionLifecycleFailed } from "../../errors.js";
24
+ import { withPublisherTrustConditions } from "../../publisher-binding.js";
25
+ import { StepFailureConversion } from "../../step-failure-conversion.js";
26
+ import { buildSelectiveUpdatePlan } from "./plan.js";
27
+ import { selectUpdateTargets, } from "./selection.js";
28
+ import { ignoreVersionConstraintsCondition, selectiveUpdatePlanName, } from "./vocabulary.js";
29
+ const PLAN_NAME = selectiveUpdatePlanName("subagent");
30
+ const PLAN_DESCRIPTION = "Update installed subagents";
31
+ const NOTHING_INSTALLED = "No subagents installed.";
32
+ /**
33
+ * Every selected entry failed to re-resolve: a source-reachability problem,
34
+ * not a per-entry skip.
35
+ */
36
+ const allSubagentResolutionsFailed = new ExtensionLifecycleFailed({
37
+ category: "network",
38
+ detail: "All matched subagent source re-resolutions failed.",
39
+ suggestions: [{ description: "Verify the original source paths are still accessible." }],
40
+ });
41
+ const appendWarning = (warning) => (result) => warning === undefined || result.result === "error"
42
+ ? result
43
+ : {
44
+ ...result,
45
+ message: result.message.length === 0 ? warning : `${result.message}; ${warning}`,
46
+ };
47
+ const skippedSubagentStep = (scope, outcome) => ({
48
+ readiness: "ready",
49
+ label: `Skip ${outcome.name}`,
50
+ run: Effect.succeed({
51
+ result: "success",
52
+ disposition: "skipped",
53
+ message: outcome.reason,
54
+ artifact: {
55
+ path: outcome.source,
56
+ scope,
57
+ change: "unchanged",
58
+ targets: [{ path: outcome.source, change: "unchanged" }],
59
+ },
60
+ }),
61
+ });
62
+ const toRegistrySubagentPattern = (source) => {
63
+ const parsed = parseSourceQualifiedRegistrySourcePatternParts(source);
64
+ if (parsed === undefined)
65
+ return Option.none();
66
+ if (parsed.type !== undefined && parsed.type !== "subagents")
67
+ return Option.none();
68
+ return Option.some(parsed);
69
+ };
70
+ const releaseAgeRecord = (args) => ({
71
+ reason: "minimum-release-age",
72
+ target: args.target,
73
+ dependencyPath: [args.target],
74
+ ...(args.requestedRange === undefined ? {} : { requestedRange: args.requestedRange }),
75
+ ...(args.selectedVersion === undefined ? {} : { selectedVersion: args.selectedVersion }),
76
+ candidateVersion: args.evidence.version,
77
+ publishedAt: args.evidence.publishedAt,
78
+ eligibleAt: args.evidence.eligibleAt,
79
+ minimumReleaseAgeSeconds: args.evidence.minimumReleaseAgeSeconds,
80
+ });
81
+ /** Settle a `subagents update` request: decide everything, write nothing. */
82
+ export const prepareSelectiveSubagentUpdate = Effect.fn("SelectiveSubagentUpdate.prepare")(function* (request) {
83
+ const ws = yield* WorkspaceMutations;
84
+ const sources = yield* SourceHostProviders;
85
+ const releaseAgeEvaluation = yield* makeConfiguredReleaseAgeEvaluation();
86
+ const allSubagents = yield* ws.records.rows("subagent").pipe(Effect.map(configuredRowsByName));
87
+ const lockedSubagents = yield* ws.getLockedSubagents();
88
+ const subagentEntries = Object.entries(allSubagents).flatMap(([name, entry]) => entry.enabled && entry.source !== undefined ? [[name, entry.source]] : []);
89
+ if (subagentEntries.length === 0) {
90
+ return {
91
+ outcome: "nothing",
92
+ reason: "none-installed",
93
+ message: NOTHING_INSTALLED,
94
+ subjectType: "subagent",
95
+ planName: PLAN_NAME,
96
+ planDescription: PLAN_DESCRIPTION,
97
+ };
98
+ }
99
+ const selection = yield* selectUpdateTargets({
100
+ entries: subagentEntries,
101
+ source: request.source,
102
+ nameFilters: request.nameFilters,
103
+ nameFilterFlag: request.nameFilterFlag,
104
+ resourceType: "subagent",
105
+ resourceLabel: "subagent",
106
+ resourceLabelPlural: "subagents",
107
+ });
108
+ if (selection.kind === "nothing") {
109
+ return {
110
+ outcome: "nothing",
111
+ reason: selection.reason,
112
+ message: selection.message,
113
+ subjectType: "subagent",
114
+ planName: PLAN_NAME,
115
+ planDescription: PLAN_DESCRIPTION,
116
+ };
117
+ }
118
+ const filteredEntries = selection.entries;
119
+ const findSubagentRefs = (source, options) => sources
120
+ .find(source, {
121
+ names: options.subagentNames,
122
+ type: "subagent",
123
+ owner: options.owner,
124
+ versionRange: options.versionRange,
125
+ })
126
+ .pipe(Effect.map((refs) => Array.filter(refs, (ref) => ref.type === "subagent")));
127
+ const results = yield* Effect.forEach(filteredEntries, ([name, sourceStr]) => Effect.gen(function* () {
128
+ if (isWorkspaceSourceLocator(sourceStr)) {
129
+ return {
130
+ type: "skip",
131
+ name,
132
+ source: sourceStr,
133
+ reason: `Subagent "${name}" is workspace-sourced and unchanged`,
134
+ };
135
+ }
136
+ const source = yield* resolveSource(sourceStr);
137
+ const registryPattern = toRegistrySubagentPattern(sourceStr);
138
+ if (source.type === "registry" && Option.isSome(registryPattern)) {
139
+ const lookupName = registryPattern.value.name ?? decodeExtensionNameSync(name);
140
+ const requestedRange = registryPattern.value.versionRange;
141
+ const registryResolution = yield* sources.resolveNamedRegistry(source, {
142
+ owner: registryPattern.value.owner,
143
+ type: "subagent",
144
+ name: lookupName,
145
+ versionRange: requestedRange === undefined ? Option.none() : Option.some(requestedRange),
146
+ releaseAgeEvaluation,
147
+ });
148
+ if (registryResolution.kind === "selected" || registryResolution.kind === "exempted") {
149
+ if (registryResolution.ref.type !== "subagent") {
150
+ return yield* new ExtensionLifecycleFailed({
151
+ category: "internal",
152
+ detail: `Registry resolved ${registryResolution.target} as ${registryResolution.ref.type}, expected subagent`,
153
+ });
154
+ }
155
+ return {
156
+ type: "match",
157
+ ref: registryResolution.ref,
158
+ holdbacks: registryResolution.kind === "exempted" ||
159
+ registryResolution.newerHeld === undefined
160
+ ? []
161
+ : [
162
+ releaseAgeRecord({
163
+ target: registryResolution.target,
164
+ ...(requestedRange === undefined ? {} : { requestedRange }),
165
+ selectedVersion: registryResolution.ref.version,
166
+ evidence: registryResolution.newerHeld,
167
+ }),
168
+ ],
169
+ ...(registryResolution.kind === "selected"
170
+ ? {}
171
+ : {
172
+ bypasses: [
173
+ {
174
+ ...releaseAgeRecord({
175
+ target: registryResolution.target,
176
+ ...(requestedRange === undefined ? {} : { requestedRange }),
177
+ selectedVersion: registryResolution.ref.version,
178
+ evidence: registryResolution.bypassed,
179
+ }),
180
+ ...registryResolution.exemption,
181
+ },
182
+ ],
183
+ }),
184
+ };
185
+ }
186
+ if (registryResolution.kind === "policy_held") {
187
+ const holdback = releaseAgeRecord({
188
+ target: registryResolution.target,
189
+ ...(registryResolution.requestedRange === undefined
190
+ ? {}
191
+ : { requestedRange: registryResolution.requestedRange }),
192
+ evidence: registryResolution.candidate,
193
+ });
194
+ return {
195
+ type: "skip",
196
+ name,
197
+ source: sourceStr,
198
+ reason: `Subagent "${name}" is held by the minimum release age until ${holdback.eligibleAt}`,
199
+ holdback,
200
+ };
201
+ }
202
+ return {
203
+ type: "skip",
204
+ name,
205
+ source: sourceStr,
206
+ reason: registryResolution.kind === "not_found"
207
+ ? `Subagent "${name}" not found in source ${sources.origin(source)}`
208
+ : `No version of subagent "${name}" satisfies ${registryResolution.requestedRange}`,
209
+ };
210
+ }
211
+ const requestedOwner = Option.match(registryPattern, {
212
+ onNone: () => Option.none(),
213
+ onSome: (pattern) => Option.some(pattern.owner),
214
+ });
215
+ const namedRefs = yield* findSubagentRefs(source, {
216
+ subagentNames: [name],
217
+ owner: requestedOwner,
218
+ versionRange: Option.none(),
219
+ });
220
+ const subagentRef = namedRefs.find((r) => r.subagent.name === name);
221
+ if (subagentRef) {
222
+ return { type: "match", ref: subagentRef, holdbacks: [] };
223
+ }
224
+ return {
225
+ type: "skip",
226
+ name,
227
+ source: sourceStr,
228
+ reason: `Subagent "${name}" not found in source ${sources.origin(source)}`,
229
+ };
230
+ }).pipe(Effect.catch((error) => Effect.succeed({
231
+ type: "skip",
232
+ name,
233
+ source: sourceStr,
234
+ reason: `Failed to resolve "${name}": ${String(error)}`,
235
+ }))), { concurrency: "unbounded" });
236
+ const resolved = results.filter((result) => result.type === "match");
237
+ const skipped = results.filter((result) => result.type === "skip");
238
+ if (resolved.length === 0 && skipped.length === 0) {
239
+ return yield* Effect.fail(allSubagentResolutionsFailed);
240
+ }
241
+ const subagentManager = yield* SubagentManager;
242
+ const failureConversion = yield* StepFailureConversion;
243
+ // Classify every proposed Registry acceptance against the accepted
244
+ // resolution. A replaced publisher binding is a trust decision a person
245
+ // makes at a prompt; the plan carries it as an interactive-only condition.
246
+ const warningsBySubagent = new Map();
247
+ const publisherTransitions = [];
248
+ for (const item of resolved) {
249
+ const proposed = registryBindingProposal(item.ref);
250
+ const accepted = lockedSubagents[item.ref.subagent.name];
251
+ if (proposed === undefined || accepted?.type !== "registry")
252
+ continue;
253
+ const transition = classifyPublisherBindingTransition({
254
+ accepted: yield* acceptedResolutionRef({
255
+ workspace: ws,
256
+ type: "subagent",
257
+ name: proposed.target,
258
+ }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
259
+ category: "conflict",
260
+ detail: `The accepted resolution for subagent "${proposed.target}" could not be read, so the proposed publisher binding cannot be checked`,
261
+ cause,
262
+ }))),
263
+ proposed,
264
+ });
265
+ if (Option.isSome(transition)) {
266
+ publisherTransitions.push(transition.value);
267
+ warningsBySubagent.set(item.ref.subagent.name, publisherTransitionWarning(transition.value));
268
+ }
269
+ }
270
+ const makeRunClosure = (ref) => {
271
+ const step = buildInstallOperation(subagentManager, {
272
+ toStepFailure: failureConversion.toStepFailure,
273
+ ref,
274
+ versionRange: Option.none(),
275
+ });
276
+ if (step.readiness === "error") {
277
+ return Effect.fail(new StepFailure({ category: "conflict", detail: step.errorMessage }));
278
+ }
279
+ return step.run.pipe(Effect.map(appendWarning(warningsBySubagent.get(ref.subagent.name))));
280
+ };
281
+ const units = resolved.map((item) => ({
282
+ name: item.ref.subagent.name,
283
+ ref: item.ref,
284
+ force: request.ignoreVersionConstraints,
285
+ operation: item.ref,
286
+ }));
287
+ const rawPlan = buildSelectiveUpdatePlan(units, lockedSubagents, PLAN_NAME, Option.some(PLAN_DESCRIPTION), makeRunClosure);
288
+ const basePlanWithReleaseAge = {
289
+ ...rawPlan,
290
+ presentation: operationPresentation({ imperative: "update", past: "Updated", gerund: "Updating" }, "subagent"),
291
+ releaseAge: {
292
+ evaluatedAt: DateTime.formatIso(releaseAgeEvaluation.evaluatedAt),
293
+ holdbacks: normalizeReleaseAgeRecords([
294
+ ...resolved.flatMap((item) => item.holdbacks),
295
+ ...skipped.flatMap((item) => (item.holdback === undefined ? [] : [item.holdback])),
296
+ ]),
297
+ bypasses: normalizeReleaseAgeRecords(resolved.flatMap((item) => item.bypasses ?? [])),
298
+ },
299
+ };
300
+ const skippedSteps = skipped
301
+ .filter((item) => item.holdback === undefined)
302
+ .map((item) => skippedSubagentStep(ws.scope, item));
303
+ const [firstJob, ...restJobs] = basePlanWithReleaseAge.jobs;
304
+ const plan = skippedSteps.length === 0
305
+ ? basePlanWithReleaseAge
306
+ : firstJob === undefined
307
+ ? { ...basePlanWithReleaseAge, jobs: [{ concurrency: 1, steps: skippedSteps }] }
308
+ : {
309
+ ...basePlanWithReleaseAge,
310
+ jobs: [{ ...firstJob, steps: [...firstJob.steps, ...skippedSteps] }, ...restJobs],
311
+ };
312
+ const configuredAgentOperations = [
313
+ ...new Set(request.nameFilters.length > 0
314
+ ? request.nameFilters
315
+ : plan.jobs.flatMap((job) => job.steps.map((step) => step.label.replace(/^(?:Skip|Update)\s+/u, "")))),
316
+ ].map((name) => ({ extensionType: "subagent", name, plannedState: "enabled" }));
317
+ const executionPlan = withPublisherTrustConditions({
318
+ ...plan,
319
+ riskConditions: [
320
+ ...(plan.riskConditions ?? []),
321
+ ...(request.ignoreVersionConstraints ? [ignoreVersionConstraintsCondition] : []),
322
+ ],
323
+ }, publisherTransitions);
324
+ return {
325
+ outcome: "planned",
326
+ subjectType: "subagent",
327
+ planName: PLAN_NAME,
328
+ execution: yield* prepareExecutionCandidate(executionPlan, { configuredAgentOperations }),
329
+ };
330
+ });
331
+ //# sourceMappingURL=subagents.js.map
@@ -0,0 +1,121 @@
1
+ /**
2
+ * The selective update use case.
3
+ *
4
+ * `skills update` and `subagents update` narrow the configured entries with
5
+ * the selectors a person typed, then advance the ones whose source now
6
+ * resolves to something other than what was accepted. Both settle through the
7
+ * same shape every other lifecycle use case does: `prepare` decides
8
+ * everything and writes nothing, `previewOrApply` resolves the frozen
9
+ * candidate into one operation outcome.
10
+ *
11
+ * @experimental This API is unstable and may change without notice.
12
+ */
13
+ import * as Effect from "effect/Effect";
14
+ import { type SelectiveSkillUpdateRequest } from "./skills.js";
15
+ import { type SelectiveSubagentUpdateRequest } from "./subagents.js";
16
+ /** Everything a selective update route can ask for. */
17
+ export type SelectiveUpdateRequest = SelectiveSkillUpdateRequest | SelectiveSubagentUpdateRequest;
18
+ /** Settle a selective update: decide what may advance, write nothing. */
19
+ export declare const prepareSelectiveUpdate: (request: SelectiveUpdateRequest) => Effect.Effect<{
20
+ outcome: "nothing";
21
+ reason: "none-installed";
22
+ message: string;
23
+ subjectType: "skill";
24
+ planName: string;
25
+ planDescription: string;
26
+ execution?: never;
27
+ } | {
28
+ outcome: "nothing";
29
+ reason: "no-source-match" | "no-name-match";
30
+ message: string;
31
+ subjectType: "skill";
32
+ planName: string;
33
+ planDescription: string;
34
+ execution?: never;
35
+ } | {
36
+ outcome: "planned";
37
+ subjectType: "skill";
38
+ planName: string;
39
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("./requirements.ts").SelectiveUpdateStepRequirements, never>;
40
+ reason?: never;
41
+ message?: never;
42
+ planDescription?: never;
43
+ } | {
44
+ outcome: "nothing";
45
+ reason: "none-installed";
46
+ message: string;
47
+ subjectType: "subagent";
48
+ planName: string;
49
+ planDescription: string;
50
+ execution?: never;
51
+ } | {
52
+ outcome: "nothing";
53
+ reason: "no-source-match" | "no-name-match";
54
+ message: string;
55
+ subjectType: "subagent";
56
+ planName: string;
57
+ planDescription: string;
58
+ execution?: never;
59
+ } | {
60
+ outcome: "planned";
61
+ subjectType: "subagent";
62
+ planName: string;
63
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("./requirements.ts").SelectiveUpdateStepRequirements, never>;
64
+ reason?: never;
65
+ message?: never;
66
+ planDescription?: never;
67
+ }, import("../../errors.ts").ExtensionLifecycleFailed | import("@agentxm/extension-sources").SourceSyntaxInvalid | import("@agentxm/extension-sources").SourceHostNotConfigured | import("@agentxm/extension-sources").SourceNotResolvable | import("@agentxm/extension-sources").SourceNetworkFailure | import("@agentxm/extension-sources").GitOperationFailed | import("@agentxm/extension-sources").WorkspaceCatalogUnavailable | import("@agentxm/extension-sources").AxmSkillGateUnavailable | import("@agentxm/registry-client").RegistryProblem | import("@agentxm/registry-client").RegistryRequestFailed | import("@agentxm/registry-client").RegistryOperationFailed | import("@agentxm/workspace-state").SettingsIoError | import("@agentxm/workspace-state").SettingsParseError | import("@agentxm/workspace-state").SettingsDecodeError | import("@agentxm/workspace-state").LockfileIoError | import("@agentxm/workspace-state").LockfileParseError | import("@agentxm/workspace-state").LockfileDecodeError | import("@agentxm/workspace-state").LockfileVersionUnsupported | import("@agentxm/workspace-state").WorkspaceRootEscape | import("@agentxm/workspace-state").LockfileValidationError | import("@agentxm/extension-resolution").ExtensionResolutionFailed | import("@agentxm/workspace-operations").CandidateFingerprintFailed, import("../../step-failure-conversion.ts").StepFailureConversion | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("@agentxm/workspace-state").WorkspaceMutations | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("effect/unstable/http/HttpClient").HttpClient | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | import("@agentxm/extension-sources").SourceHostProviders | import("@agentxm/extension-materialization").SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog>;
68
+ /** Settle a selective update, then preview or apply it. */
69
+ export declare const SelectiveUpdate: {
70
+ readonly prepare: (request: SelectiveUpdateRequest) => Effect.Effect<{
71
+ outcome: "nothing";
72
+ reason: "none-installed";
73
+ message: string;
74
+ subjectType: "skill";
75
+ planName: string;
76
+ planDescription: string;
77
+ execution?: never;
78
+ } | {
79
+ outcome: "nothing";
80
+ reason: "no-source-match" | "no-name-match";
81
+ message: string;
82
+ subjectType: "skill";
83
+ planName: string;
84
+ planDescription: string;
85
+ execution?: never;
86
+ } | {
87
+ outcome: "planned";
88
+ subjectType: "skill";
89
+ planName: string;
90
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("./requirements.ts").SelectiveUpdateStepRequirements, never>;
91
+ reason?: never;
92
+ message?: never;
93
+ planDescription?: never;
94
+ } | {
95
+ outcome: "nothing";
96
+ reason: "none-installed";
97
+ message: string;
98
+ subjectType: "subagent";
99
+ planName: string;
100
+ planDescription: string;
101
+ execution?: never;
102
+ } | {
103
+ outcome: "nothing";
104
+ reason: "no-source-match" | "no-name-match";
105
+ message: string;
106
+ subjectType: "subagent";
107
+ planName: string;
108
+ planDescription: string;
109
+ execution?: never;
110
+ } | {
111
+ outcome: "planned";
112
+ subjectType: "subagent";
113
+ planName: string;
114
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("./requirements.ts").SelectiveUpdateStepRequirements, never>;
115
+ reason?: never;
116
+ message?: never;
117
+ planDescription?: never;
118
+ }, import("../../errors.ts").ExtensionLifecycleFailed | import("@agentxm/extension-sources").SourceSyntaxInvalid | import("@agentxm/extension-sources").SourceHostNotConfigured | import("@agentxm/extension-sources").SourceNotResolvable | import("@agentxm/extension-sources").SourceNetworkFailure | import("@agentxm/extension-sources").GitOperationFailed | import("@agentxm/extension-sources").WorkspaceCatalogUnavailable | import("@agentxm/extension-sources").AxmSkillGateUnavailable | import("@agentxm/registry-client").RegistryProblem | import("@agentxm/registry-client").RegistryRequestFailed | import("@agentxm/registry-client").RegistryOperationFailed | import("@agentxm/workspace-state").SettingsIoError | import("@agentxm/workspace-state").SettingsParseError | import("@agentxm/workspace-state").SettingsDecodeError | import("@agentxm/workspace-state").LockfileIoError | import("@agentxm/workspace-state").LockfileParseError | import("@agentxm/workspace-state").LockfileDecodeError | import("@agentxm/workspace-state").LockfileVersionUnsupported | import("@agentxm/workspace-state").WorkspaceRootEscape | import("@agentxm/workspace-state").LockfileValidationError | import("@agentxm/extension-resolution").ExtensionResolutionFailed | import("@agentxm/workspace-operations").CandidateFingerprintFailed, import("../../step-failure-conversion.ts").StepFailureConversion | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("@agentxm/workspace-state").WorkspaceMutations | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("effect/unstable/http/HttpClient").HttpClient | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | import("@agentxm/extension-sources").SourceHostProviders | import("@agentxm/extension-materialization").SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog>;
119
+ readonly previewOrApply: (candidate: import("./vocabulary.js").PlannedSelectiveUpdateCandidate, execution: import("@agentxm/workspace-operations").PlanExecution) => Effect.Effect<import("@agentxm/workspace-operations").OperationResolution<never>, import("@agentxm/workspace-state").WorkspaceSettingsReadFailure | import("@agentxm/workspace-operations").ApprovalRecoveryMissing | import("@agentxm/workspace-operations").PlanInteractionFailed | import("@agentxm/workspace-transactions").WorkspaceTransitionAcquireFailure, import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/workspace-transactions").FootprintRecorder | import("@agentxm/workspace-operations").OperationJournal | import("@agentxm/workspace-operations").ResolvePlanInteraction | import("./requirements.ts").SelectiveUpdateStepRequirements>;
120
+ };
121
+ //# sourceMappingURL=use-case.d.ts.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The selective update use case.
3
+ *
4
+ * `skills update` and `subagents update` narrow the configured entries with
5
+ * the selectors a person typed, then advance the ones whose source now
6
+ * resolves to something other than what was accepted. Both settle through the
7
+ * same shape every other lifecycle use case does: `prepare` decides
8
+ * everything and writes nothing, `previewOrApply` resolves the frozen
9
+ * candidate into one operation outcome.
10
+ *
11
+ * @experimental This API is unstable and may change without notice.
12
+ */
13
+ import * as Effect from "effect/Effect";
14
+ import { prepareSelectiveSkillUpdate } from "./skills.js";
15
+ import { prepareSelectiveSubagentUpdate, } from "./subagents.js";
16
+ import { previewOrApplySelectiveUpdate } from "./vocabulary.js";
17
+ /** Settle a selective update: decide what may advance, write nothing. */
18
+ export const prepareSelectiveUpdate = Effect.fn("SelectiveUpdate.prepare")(function* (request) {
19
+ return request.kind === "selective-skills"
20
+ ? yield* prepareSelectiveSkillUpdate(request)
21
+ : yield* prepareSelectiveSubagentUpdate(request);
22
+ });
23
+ /** Settle a selective update, then preview or apply it. */
24
+ export const SelectiveUpdate = {
25
+ prepare: prepareSelectiveUpdate,
26
+ previewOrApply: previewOrApplySelectiveUpdate,
27
+ };
28
+ //# sourceMappingURL=use-case.js.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * What a selective update settles with.
3
+ *
4
+ * `skills update` and `subagents update` both settle as one of two things: a
5
+ * frozen execution candidate, or the reason there is nothing to execute. The
6
+ * reason is a bounded classification, never a rendered sentence plus
7
+ * suggestions — the application decides what to offer a person for each one.
8
+ *
9
+ * @experimental This API is unstable and may change without notice.
10
+ */
11
+ import { type ExecutionCandidate, type PlanExecution, type PlanRiskCondition } from "@agentxm/workspace-operations";
12
+ import type { SelectiveUpdateStepRequirements } from "./requirements.js";
13
+ import type { SelectiveUpdateNothingReason } from "./selection.js";
14
+ /** Which extension type a selective update is about. */
15
+ export type SelectiveUpdateSubjectType = "skill" | "subagent";
16
+ /** The plan name each selective update reports under. */
17
+ export declare const selectiveUpdatePlanName: (type: SelectiveUpdateSubjectType) => string;
18
+ /**
19
+ * Advancing outside the version ranges installed Packs declare is an override
20
+ * a person states on the command line, so the plan carries it as a condition
21
+ * the operator already met rather than a silent policy.
22
+ */
23
+ export declare const ignoreVersionConstraintsCondition: PlanRiskCondition;
24
+ /** A settled selective update that has work to execute. */
25
+ export interface PlannedSelectiveUpdateCandidate {
26
+ readonly outcome: "planned";
27
+ readonly subjectType: SelectiveUpdateSubjectType;
28
+ readonly planName: string;
29
+ readonly execution: ExecutionCandidate<SelectiveUpdateStepRequirements>;
30
+ }
31
+ /** A settled selective update with nothing to execute, and why. */
32
+ export interface NothingSelectiveUpdateCandidate {
33
+ readonly outcome: "nothing";
34
+ readonly reason: SelectiveUpdateNothingReason;
35
+ readonly message: string;
36
+ readonly subjectType: SelectiveUpdateSubjectType;
37
+ readonly planName: string;
38
+ readonly planDescription: string;
39
+ }
40
+ export type SelectiveUpdateCandidate = PlannedSelectiveUpdateCandidate | NothingSelectiveUpdateCandidate;
41
+ /** Preview or apply a settled selective update. */
42
+ export declare const previewOrApplySelectiveUpdate: (candidate: PlannedSelectiveUpdateCandidate, execution: PlanExecution) => import("effect/Effect").Effect<import("@agentxm/workspace-operations").OperationResolution<never>, import("@agentxm/workspace-state").WorkspaceSettingsReadFailure | import("@agentxm/workspace-operations").ApprovalRecoveryMissing | import("@agentxm/workspace-operations").PlanInteractionFailed | import("@agentxm/workspace-transactions").WorkspaceTransitionAcquireFailure, import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/workspace-transactions").FootprintRecorder | import("@agentxm/workspace-operations").OperationJournal | import("@agentxm/workspace-operations").ResolvePlanInteraction | SelectiveUpdateStepRequirements>;
43
+ //# sourceMappingURL=vocabulary.d.ts.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * What a selective update settles with.
3
+ *
4
+ * `skills update` and `subagents update` both settle as one of two things: a
5
+ * frozen execution candidate, or the reason there is nothing to execute. The
6
+ * reason is a bounded classification, never a rendered sentence plus
7
+ * suggestions — the application decides what to offer a person for each one.
8
+ *
9
+ * @experimental This API is unstable and may change without notice.
10
+ */
11
+ import { resolveExecutionCandidate, } from "@agentxm/workspace-operations";
12
+ /** The plan name each selective update reports under. */
13
+ export const selectiveUpdatePlanName = (type) => type === "skill" ? "Update skills" : "Update subagents";
14
+ /**
15
+ * Advancing outside the version ranges installed Packs declare is an override
16
+ * a person states on the command line, so the plan carries it as a condition
17
+ * the operator already met rather than a silent policy.
18
+ */
19
+ export const ignoreVersionConstraintsCondition = {
20
+ level: "override-required",
21
+ id: "ignore-pack-version-constraints",
22
+ policy: "ignore-version-constraints",
23
+ requiredFlag: "--ignore-version-constraints",
24
+ detail: "Allow updates outside version constraints declared by installed packs.",
25
+ };
26
+ /** Preview or apply a settled selective update. */
27
+ export const previewOrApplySelectiveUpdate = (candidate, execution) => resolveExecutionCandidate(candidate.execution, execution);
28
+ //# sourceMappingURL=vocabulary.js.map
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Resolving what a `<type> update` selector names.
3
+ *
4
+ * A person narrows a configured sweep two ways: a positional that may be an
5
+ * installed name or a source, and repeated `--name` filters that may be exact
6
+ * names or globs. Deciding which configured entries those name is update's
7
+ * own question — it re-reads the configured entries, re-resolves their
8
+ * declared sources, and compares origins — so it is settled here, beside the
9
+ * sweep it narrows, rather than by whichever surface parsed the flags.
10
+ *
11
+ * A selector that matches nothing is a settled answer, not a failure: the
12
+ * sweep reports it as nothing to advance, in the same shape as a workspace
13
+ * with nothing configured.
14
+ *
15
+ * @experimental This API is unstable and may change without notice.
16
+ */
17
+ import * as Effect from "effect/Effect";
18
+ import * as Option from "effect/Option";
19
+ import { SourceHostProviders } from "@agentxm/extension-sources";
20
+ import { WorkspaceRecords } from "@agentxm/workspace-state";
21
+ import type { WorkspaceUpdatableType } from "./configured.js";
22
+ /** The flag spelling reported when a `--name` filter matches nothing. */
23
+ export declare const UPDATE_NAME_FILTER_FLAG = "--name";
24
+ /** Every type a selector can narrow: whatever a configured sweep can cover. */
25
+ export type ConfiguredUpdateSelectorType = WorkspaceUpdatableType;
26
+ /** What one `<type> update` invocation asked for, before it is resolved. */
27
+ export interface ConfiguredUpdateSelector {
28
+ readonly resourceType: ConfiguredUpdateSelectorType;
29
+ /** The positional selector, which may name an installed extension or a source. */
30
+ readonly source: Option.Option<string>;
31
+ /** Repeated `--name` filters; exact names or globs over installed names. */
32
+ readonly nameFilters: ReadonlyArray<string>;
33
+ /** False where the positional is a source spelling only (MCP connections). */
34
+ readonly sourceMayMatchName?: boolean;
35
+ }
36
+ /** What a selector resolved to. */
37
+ export type ConfiguredUpdateSelection =
38
+ /** No selector was given: every configured entry of the type is in scope. */
39
+ {
40
+ readonly _tag: "All";
41
+ }
42
+ /** The selector matched these installed names. */
43
+ | {
44
+ readonly _tag: "Names";
45
+ readonly names: ReadonlyArray<string>;
46
+ }
47
+ /** The selector matched nothing, and this says which selector and why. */
48
+ | {
49
+ readonly _tag: "NoMatch";
50
+ readonly message: string;
51
+ };
52
+ /**
53
+ * Resolve a selector against the type's configured, enabled entries.
54
+ *
55
+ * Returns `All` when no selector was given, so a workspace with nothing
56
+ * configured still reports through the sweep's own "no configured …" message
57
+ * rather than a selector no-op.
58
+ */
59
+ export declare const resolveConfiguredUpdateSelection: (selector: ConfiguredUpdateSelector) => Effect.Effect<{
60
+ _tag: "All";
61
+ message?: never;
62
+ names?: never;
63
+ } | {
64
+ _tag: "NoMatch";
65
+ message: string;
66
+ names?: never;
67
+ } | {
68
+ _tag: "Names";
69
+ names: string[];
70
+ message?: never;
71
+ }, import("@agentxm/extension-sources").SourceSyntaxInvalid | import("@agentxm/extension-sources").SourceHostNotConfigured | import("@agentxm/extension-sources").SourceNotResolvable | import("@agentxm/extension-sources").SourceNetworkFailure | import("@agentxm/extension-sources").GitOperationFailed | import("@agentxm/extension-sources").WorkspaceCatalogUnavailable | import("@agentxm/extension-sources").AxmSkillGateUnavailable | import("@agentxm/registry-client").RegistryProblem | import("@agentxm/registry-client").RegistryRequestFailed | import("@agentxm/registry-client").RegistryOperationFailed | import("@agentxm/workspace-state").WorkspaceStateReadFailure, import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/unstable/http/HttpClient").HttpClient | SourceHostProviders | import("@agentxm/extension-sources").WorkspaceCatalog | WorkspaceRecords>;
72
+ //# sourceMappingURL=selector.d.ts.map