@agentxm/extension-lifecycle 0.29.4 → 0.30.2

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 (85) hide show
  1. package/dist/src/activation/set-activation.d.ts +22 -40
  2. package/dist/src/activation/set-activation.js +191 -336
  3. package/dist/src/demote/demote-to-external-source.d.ts +1 -1
  4. package/dist/src/demote/demote-to-external-source.js +53 -24
  5. package/dist/src/hooks/install/plan.js +6 -3
  6. package/dist/src/hooks/uninstall/plan.js +4 -3
  7. package/dist/src/index.d.ts +1 -5
  8. package/dist/src/index.js +1 -4
  9. package/dist/src/install/install-extensions.d.ts +5 -5
  10. package/dist/src/install/install-extensions.js +2 -1
  11. package/dist/src/install/root-intent.d.ts +2 -2
  12. package/dist/src/install/vocabulary.d.ts +5 -4
  13. package/dist/src/knowledge/install/plan.js +2 -1
  14. package/dist/src/knowledge/uninstall/plan.js +4 -3
  15. package/dist/src/mcps/install/plan.d.ts +1 -1
  16. package/dist/src/mcps/install/plan.js +59 -3
  17. package/dist/src/mcps/operations/uninstall.js +2 -1
  18. package/dist/src/mcps/uninstall/plan.js +13 -4
  19. package/dist/src/packs/graph-transition.d.ts +0 -25
  20. package/dist/src/packs/graph-transition.js +0 -101
  21. package/dist/src/packs/install/plan.d.ts +0 -13
  22. package/dist/src/packs/install/plan.js +12 -9
  23. package/dist/src/packs/member-install-step.js +8 -21
  24. package/dist/src/packs/promote-authored-pack.js +6 -3
  25. package/dist/src/packs/uninstall/plan.js +53 -21
  26. package/dist/src/rules/install/plan.js +6 -3
  27. package/dist/src/rules/uninstall/plan.js +4 -3
  28. package/dist/src/skills/application/index.d.ts +42 -0
  29. package/dist/src/skills/application/index.js +37 -0
  30. package/dist/src/skills/domain/selection.d.ts +22 -0
  31. package/dist/src/skills/domain/selection.js +18 -0
  32. package/dist/src/skills/install/artifact.d.ts +4 -0
  33. package/dist/src/skills/install/artifact.js +29 -0
  34. package/dist/src/skills/install/bundled.js +4 -4
  35. package/dist/src/skills/install/plan.d.ts +15 -4
  36. package/dist/src/skills/install/plan.js +114 -97
  37. package/dist/src/skills/uninstall/plan.js +13 -5
  38. package/dist/src/step-failure.js +12 -0
  39. package/dist/src/subagents/application/index.d.ts +42 -0
  40. package/dist/src/subagents/application/index.js +37 -0
  41. package/dist/src/subagents/domain/selection.d.ts +22 -0
  42. package/dist/src/subagents/domain/selection.js +18 -0
  43. package/dist/src/subagents/install/plan.d.ts +2 -2
  44. package/dist/src/subagents/install/plan.js +4 -4
  45. package/dist/src/subagents/operations/enable.js +1 -3
  46. package/dist/src/subagents/uninstall/plan.js +5 -4
  47. package/dist/src/testing.d.ts +3 -2
  48. package/dist/src/testing.js +9 -6
  49. package/dist/src/uninstall/root-intent.d.ts +2 -1
  50. package/dist/src/uninstall/root-intent.js +1 -0
  51. package/dist/src/uninstall/undesired-target.d.ts +26 -0
  52. package/dist/src/uninstall/undesired-target.js +56 -0
  53. package/dist/src/uninstall/uninstall-extensions.d.ts +1 -1
  54. package/dist/src/uninstall/uninstall-extensions.js +103 -3
  55. package/dist/src/update/root-request.d.ts +2 -2
  56. package/dist/src/update/selective/plan.d.ts +2 -3
  57. package/dist/src/update/selective/plan.js +2 -2
  58. package/dist/src/update/selective/requirements.d.ts +2 -6
  59. package/dist/src/update/selective/requirements.js +1 -3
  60. package/dist/src/update/selective/selection.js +1 -1
  61. package/dist/src/update/selective/skills.d.ts +2 -4
  62. package/dist/src/update/selective/skills.js +22 -27
  63. package/dist/src/update/selective/subagents.d.ts +2 -3
  64. package/dist/src/update/selective/subagents.js +11 -9
  65. package/dist/src/update/selective/use-case.d.ts +7 -7
  66. package/dist/src/update/selective/vocabulary.d.ts +1 -1
  67. package/dist/src/update/selector.js +1 -1
  68. package/dist/src/update/targeted-plan.js +4 -2
  69. package/dist/src/workspace-paths.d.ts +0 -6
  70. package/dist/src/workspace-paths.js +0 -10
  71. package/package.json +30 -24
  72. package/dist/src/glob.d.ts +0 -35
  73. package/dist/src/glob.js +0 -75
  74. package/dist/src/install/selection-interaction.d.ts +0 -46
  75. package/dist/src/install/selection-interaction.js +0 -22
  76. package/dist/src/skills/install/selection.d.ts +0 -26
  77. package/dist/src/skills/install/selection.js +0 -41
  78. package/dist/src/skills/operations/install-result.d.ts +0 -33
  79. package/dist/src/skills/operations/install-result.js +0 -10
  80. package/dist/src/skills/operations/install.d.ts +0 -67
  81. package/dist/src/skills/operations/install.js +0 -591
  82. package/dist/src/subagents/install/selection.d.ts +0 -26
  83. package/dist/src/subagents/install/selection.js +0 -37
  84. package/dist/src/uninstall/retention-policy.d.ts +0 -21
  85. package/dist/src/uninstall/retention-policy.js +0 -28
@@ -9,13 +9,14 @@
9
9
  */
10
10
  import * as Effect from "effect/Effect";
11
11
  import * as Option from "effect/Option";
12
- import { NO_MATERIALIZATION_OBSERVATION, SubagentManager, buildUninstallOperation, } from "@agentxm/extension-materialization";
12
+ import { NO_MATERIALIZATION_OBSERVATION, SubagentManager, } from "@agentxm/extension-materialization";
13
+ import { buildUninstallOperation } from "@agentxm/workspace-reconciliation";
13
14
  import { parseExtensionFqnParts } from "@agentxm/extension-model/unstable/extensions";
14
15
  import { WorkspaceMutations, acquiredExtensionDisplayPathFromLockEntry, } from "@agentxm/workspace-state";
15
- import { expandGlob } from "../../glob.js";
16
+ import { expandGlob } from "@agentxm/extension-model/unstable/extensions/name-patterns";
16
17
  import { lifecycleStepFailure } from "../../step-failure.js";
17
18
  import { installRefused } from "../../install/vocabulary.js";
18
- import { makeWorkspaceRetentionPolicy } from "../../uninstall/retention-policy.js";
19
+ import { makeWorkspaceRetentionPolicy } from "@agentxm/workspace-reconciliation";
19
20
  import { workspaceCanonicalPath, workspaceCanonicalRoot, workspaceLockfilePath, workspaceSettingsPath, } from "../../workspace-paths.js";
20
21
  const resolvedVersion = (entry) => entry !== undefined && entry.type === "registry" ? entry.resolvedVersion : undefined;
21
22
  const subagentSourceTarget = (args) => args.lockEntry === undefined
@@ -77,7 +78,7 @@ export const parseSubagentUninstallRequest = Effect.fn("UninstallExtensions.pars
77
78
  export const planSubagentUninstall = Effect.fn("UninstallExtensions.planSubagents")(function* (intent) {
78
79
  const ws = yield* WorkspaceMutations;
79
80
  const subagentManager = yield* SubagentManager;
80
- const retentionPolicy = makeWorkspaceRetentionPolicy(ws);
81
+ const retentionPolicy = makeWorkspaceRetentionPolicy(ws, lifecycleStepFailure);
81
82
  // The accepted resolution names the package the removal retires, and the
82
83
  // removal deletes it, so it is read before the step runs.
83
84
  const steps = yield* Effect.forEach(intent.targets, (target) => Effect.gen(function* () {
@@ -18,7 +18,8 @@ import type { WorkspaceScope } from "@agentxm/extension-model/unstable/workspace
18
18
  import { ReleaseAgePosture } from "@agentxm/extension-resolution";
19
19
  import { SourceHostProviders } from "@agentxm/extension-sources";
20
20
  import { type ResolvePlanInteractionTestState } from "@agentxm/workspace-operations/testing";
21
- import { ExtensionSelectionInteraction } from "./install/selection-interaction.js";
21
+ import { SkillSelectionInteraction } from "./skills/application/index.js";
22
+ import { SubagentSelectionInteraction } from "./subagents/application/index.js";
22
23
  import { BundledAxmSkillAsset } from "./skills/install/bundled.js";
23
24
  import { StepFailureConversion } from "./step-failure-conversion.js";
24
25
  /**
@@ -99,7 +100,7 @@ export declare const makeLifecycleFixture: (options?: LifecycleFixtureOptions) =
99
100
  readonly type: "skill" | "subagent";
100
101
  readonly offered: ReadonlyArray<string>;
101
102
  }>;
102
- provide: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("@agentxm/workspace-state").WorkspaceMutationsError, import("effect/FileSystem").FileSystem | import("effect/Path").Path | Exclude<R, StepFailureConversion | import("@agentxm/workspace-state").WorkspaceMutations | import("@agentxm/workspace-transactions").WorkspaceTransactionScope | import("@agentxm/workspace-projection").CodingAgentRepository | import("@agentxm/agent-integration").NativeWriteAuthority | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/extension-materialization").ExtensionManagers | import("@agentxm/workspace-transactions").FootprintRecorder | HttpClient.HttpClient | import("@agentxm/workspace-operations").OperationJournal | import("@agentxm/extension-materialization").McpSecretStore | ReleaseAgePosture | import("@agentxm/workspace-operations").ResolvePlanInteraction | SourceHostProviders | import("@agentxm/extension-materialization").SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog | import("@agentxm/extension-materialization").HookManager | import("@agentxm/extension-materialization").KnowledgeManager | import("@agentxm/extension-materialization").RuleManager | import("@agentxm/extension-materialization").SkillManager | import("@agentxm/extension-materialization").McpServerManager | import("@agentxm/extension-materialization").PackManager | ExtensionSelectionInteraction | BundledAxmSkillAsset | AgentExecutableResolver | import("@agentxm/workspace-state/live").WorkspaceStateServices | import("@agentxm/workspace-projection").ProjectionParticipants | import("@agentxm/workspace-projection").WorkspaceInvariantFacts>>;
103
+ provide: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("@agentxm/workspace-state").WorkspaceMutationsError, import("effect/FileSystem").FileSystem | import("effect/Path").Path | Exclude<R, StepFailureConversion | import("@agentxm/workspace-state").WorkspaceMutations | import("@agentxm/workspace-transactions").WorkspaceTransactionScope | import("@agentxm/workspace-projection").CodingAgentRepository | import("@agentxm/agent-integration").NativeWriteAuthority | HttpClient.HttpClient | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/extension-materialization").ExtensionManagers | import("@agentxm/extension-materialization").HookManager | import("@agentxm/extension-materialization").SkillManager | import("@agentxm/extension-materialization").RuleManager | import("@agentxm/extension-materialization").KnowledgeManager | import("@agentxm/extension-materialization").PackManager | import("@agentxm/extension-materialization").McpServerManager | import("@agentxm/workspace-transactions").FootprintRecorder | import("@agentxm/workspace-operations").OperationJournal | import("@agentxm/extension-materialization").McpSecretStore | ReleaseAgePosture | import("@agentxm/workspace-operations").ResolvePlanInteraction | SourceHostProviders | import("@agentxm/extension-materialization").SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog | import("@agentxm/workspace-projection").WorkspaceInvariantFacts | SkillSelectionInteraction | SubagentSelectionInteraction | BundledAxmSkillAsset | AgentExecutableResolver | import("@agentxm/workspace-state/live").WorkspaceStateServices | import("@agentxm/workspace-projection").ProjectionParticipants>>;
103
104
  cleanup: () => void;
104
105
  };
105
106
  export type LifecycleFixture = ReturnType<typeof makeLifecycleFixture>;
@@ -21,7 +21,8 @@ import * as HttpClient from "effect/unstable/http/HttpClient";
21
21
  import { AgentExecutableResolver } from "@agentxm/agent-integration";
22
22
  import { decodeAbsolutePathSync } from "@agentxm/extension-model/unstable/path-types";
23
23
  import { ExtensionManagersLive, HookManagerLive, KnowledgeManagerLive, McpSecretStoreLive, McpServerManagerLive, PackManagerLive, ProjectionParticipantsLive, RuleManagerLive, SkillManagerLive, SubagentManagerLive, } from "@agentxm/extension-materialization/live";
24
- import { ReleaseAgePosture, decideNamedRegistryVersion, makeAxmSkillCompatibilityPolicyLayer, namedRegistryCandidates, resolveVersionEntryWithReleaseAge, } from "@agentxm/extension-resolution";
24
+ import { ReleaseAgePosture, decideNamedRegistryVersion, namedRegistryCandidates, resolveVersionEntryWithReleaseAge, } from "@agentxm/extension-resolution";
25
+ import { makeAxmSkillCompatibilityPolicyLayer } from "@agentxm/cli-maintenance/official-skill/composition";
25
26
  import { AxmSkillCandidateGateLive } from "@agentxm/extension-resolution/live";
26
27
  import { RegistryResolutionPolicy, SourceHostProviders } from "@agentxm/extension-sources";
27
28
  import { SourceHostProvidersLive } from "@agentxm/extension-sources/live";
@@ -30,7 +31,8 @@ import { PlanInvocationTest, ResolvePlanInteractionTest, } from "@agentxm/worksp
30
31
  import { CodingAgentRepositoryLive, NativeWriteAuthorityLive, WorkspaceCatalogLive, WorkspaceInvariantFactsLive, } from "@agentxm/workspace-projection/live";
31
32
  import { layer as WorkspaceLayerLive } from "@agentxm/workspace-state/live";
32
33
  import { ExtensionLifecycleFailed } from "./errors.js";
33
- import { ExtensionSelectionInteraction } from "./install/selection-interaction.js";
34
+ import { SkillSelectionInteraction } from "./skills/application/index.js";
35
+ import { SubagentSelectionInteraction } from "./subagents/application/index.js";
34
36
  import { BundledAxmSkillAsset } from "./skills/install/bundled.js";
35
37
  import { StepFailureConversion } from "./step-failure-conversion.js";
36
38
  /**
@@ -155,19 +157,20 @@ export const makeLifecycleFixture = (options = {}) => {
155
157
  }),
156
158
  });
157
159
  const selectionCalls = [];
158
- const selection = Layer.succeed(ExtensionSelectionInteraction, {
159
- selectSkills: (candidates) => {
160
+ const selection = Layer.mergeAll(Layer.succeed(SkillSelectionInteraction, {
161
+ select: (candidates) => {
160
162
  selectionCalls.push({ type: "skill", offered: candidates.map((ref) => ref.skill.name) });
161
163
  return Effect.succeed(options.select === "none" ? [] : candidates);
162
164
  },
163
- selectSubagents: (candidates) => {
165
+ }), Layer.succeed(SubagentSelectionInteraction, {
166
+ select: (candidates) => {
164
167
  selectionCalls.push({
165
168
  type: "subagent",
166
169
  offered: candidates.map((ref) => ref.subagent.name),
167
170
  });
168
171
  return Effect.succeed(options.select === "none" ? [] : candidates);
169
172
  },
170
- });
173
+ }));
171
174
  const environment = ConfigProvider.layer(ConfigProvider.fromEnv({ env: { AXM_USER_HOME: home } }));
172
175
  // Activation never fetches a source: it turns on what the workspace already
173
176
  // acquired. A fixture that could fetch would be describing installation.
@@ -1,10 +1,11 @@
1
1
  import * as Effect from "effect/Effect";
2
2
  import type { ExtensionLifecycleFailed } from "../errors.js";
3
3
  import { type InstallableExtensionType } from "@agentxm/extension-model/unstable/extensions/installable-types";
4
- export declare const rootUninstallableTypeSegments: readonly ("knowledge" | "rules" | "hooks" | "mcps" | "skills" | "subagents" | "packs")[];
4
+ export declare const rootUninstallableTypeSegments: readonly ("knowledge" | "rules" | "hooks" | "skills" | "subagents" | "packs" | "mcps")[];
5
5
  export type RootUninstallableType = InstallableExtensionType;
6
6
  export interface RootUninstallIntent {
7
7
  readonly source: string;
8
+ readonly owner: string;
8
9
  readonly type: RootUninstallableType;
9
10
  readonly name: string;
10
11
  }
@@ -94,6 +94,7 @@ export const resolveRootUninstallIntent = Effect.fn("UninstallExtensions.resolve
94
94
  }
95
95
  return {
96
96
  source,
97
+ owner: parsed.owner,
97
98
  type: toInstallableExtensionType(parsed.type),
98
99
  name: parsed.name,
99
100
  };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Refusing to uninstall an installed package the workspace does not configure.
3
+ *
4
+ * Uninstall withdraws desired intent. An installed package that no desired
5
+ * route reaches is not intent to withdraw; sync reconciles it, so uninstall
6
+ * refuses before planning rather than reporting a removal it cannot own.
7
+ */
8
+ import * as Effect from "effect/Effect";
9
+ import type { InstallableExtensionType } from "@agentxm/extension-model/unstable/extensions/installable-types";
10
+ import { LockfileReader, WorkspaceMutations } from "@agentxm/workspace-state";
11
+ import { ExtensionLifecycleFailed } from "../errors.js";
12
+ /** The single extension a literal uninstall selector names. */
13
+ export interface UninstallSubject {
14
+ readonly type: InstallableExtensionType;
15
+ readonly name: string;
16
+ /** The owner handle, when the selector spelled a fully qualified name. */
17
+ readonly owner: string | undefined;
18
+ }
19
+ /** The subject a typed selector names, or none for a glob. */
20
+ export declare const typedUninstallSubject: (type: InstallableExtensionType, selector: string) => UninstallSubject | undefined;
21
+ /**
22
+ * Fail when no desired route reaches the subject while an installed package
23
+ * for it sits in the install root.
24
+ */
25
+ export declare const refuseUndesiredInstalledTarget: (subject: UninstallSubject) => Effect.Effect<undefined, ExtensionLifecycleFailed, import("effect/FileSystem").FileSystem | import("effect/Path").Path | WorkspaceMutations | LockfileReader>;
26
+ //# sourceMappingURL=undesired-target.d.ts.map
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Refusing to uninstall an installed package the workspace does not configure.
3
+ *
4
+ * Uninstall withdraws desired intent. An installed package that no desired
5
+ * route reaches is not intent to withdraw; sync reconciles it, so uninstall
6
+ * refuses before planning rather than reporting a removal it cannot own.
7
+ */
8
+ import * as Effect from "effect/Effect";
9
+ import { parseExtensionFqnParts, toExtensionTypePlural, } from "@agentxm/extension-model/unstable/extensions";
10
+ import { LockfileReader, WorkspaceMutations, observeInstallRoot } from "@agentxm/workspace-state";
11
+ import { ExtensionLifecycleFailed } from "../errors.js";
12
+ /** The subject a typed selector names, or none for a glob. */
13
+ export const typedUninstallSubject = (type, selector) => {
14
+ const trimmed = selector.trim();
15
+ if (trimmed.includes("*"))
16
+ return undefined;
17
+ const fqn = parseExtensionFqnParts(trimmed);
18
+ return fqn !== undefined && fqn.type === type
19
+ ? { type, name: fqn.name, owner: fqn.owner }
20
+ : { type, name: trimmed, owner: undefined };
21
+ };
22
+ const readFailed = (cause) => new ExtensionLifecycleFailed({
23
+ category: "internal",
24
+ detail: "Installed packages could not be observed",
25
+ cause,
26
+ });
27
+ /**
28
+ * Fail when no desired route reaches the subject while an installed package
29
+ * for it sits in the install root.
30
+ */
31
+ export const refuseUndesiredInstalledTarget = Effect.fn("UninstallExtensions.refuseUndesiredInstalledTarget")(function* (subject) {
32
+ const ws = yield* WorkspaceMutations;
33
+ const graph = yield* ws.getDesiredStateGraph().pipe(Effect.mapError(readFailed));
34
+ if (graph.nodes.some((node) => node.type === subject.type && node.name === subject.name))
35
+ return;
36
+ const inventory = yield* observeInstallRoot({
37
+ layout: ws.layout,
38
+ graph,
39
+ locks: yield* LockfileReader,
40
+ }).pipe(Effect.mapError(readFailed));
41
+ const installed = inventory.leftovers.some((entry) => entry.type === subject.type &&
42
+ entry.name === subject.name &&
43
+ (subject.owner === undefined || entry.owner === subject.owner));
44
+ if (!installed)
45
+ return;
46
+ const identity = subject.owner === undefined
47
+ ? subject.name
48
+ : `${subject.owner}/${toExtensionTypePlural(subject.type)}/${subject.name}`;
49
+ return yield* new ExtensionLifecycleFailed({
50
+ category: "conflict",
51
+ title: "Extension is not configured",
52
+ detail: `${subject.type} ${identity} is installed but not configured; axm sync removes installed packages that are not configured.`,
53
+ cmd: "axm sync",
54
+ });
55
+ });
56
+ //# sourceMappingURL=undesired-target.js.map
@@ -13,7 +13,7 @@ import * as Effect from "effect/Effect";
13
13
  import * as Option from "effect/Option";
14
14
  import type { InstallableExtensionType } from "@agentxm/extension-model/unstable/extensions/installable-types";
15
15
  import { type ExecutionCandidate, type OperationResolution, type PlanExecution } from "@agentxm/workspace-operations";
16
- import type { ExtensionLifecycleFailed } from "../errors.js";
16
+ import { ExtensionLifecycleFailed } from "../errors.js";
17
17
  import { type PackUninstallRequirements } from "../packs/uninstall/plan.js";
18
18
  import type { InstallExecutionFailure, PrepareInstallRequirements } from "../install/vocabulary.js";
19
19
  /** One uninstall request, whatever command spelling produced it. */
@@ -11,7 +11,10 @@
11
11
  */
12
12
  import * as Effect from "effect/Effect";
13
13
  import * as Option from "effect/Option";
14
+ import { proposeDesiredState, prepareUninstallArtifact, collectCleanupStep, buildReconciliationClosure, } from "@agentxm/workspace-reconciliation";
15
+ import { lifecycleStepFailure } from "../step-failure.js";
14
16
  import { operationPresentation, prepareExecutionCandidate, resolveExecutionCandidate, } from "@agentxm/workspace-operations";
17
+ import { ExtensionLifecycleFailed } from "../errors.js";
15
18
  import { parseHookUninstallRequest, planHookUninstall } from "../hooks/uninstall/plan.js";
16
19
  import { parseKnowledgeUninstallRequest, planKnowledgeUninstall, } from "../knowledge/uninstall/plan.js";
17
20
  import { parseMcpServerUninstallRequest, planMcpServerUninstall } from "../mcps/uninstall/plan.js";
@@ -20,6 +23,7 @@ import { parseRuleUninstallRequest, planRuleUninstall } from "../rules/uninstall
20
23
  import { parseSkillUninstallRequest, planSkillUninstall } from "../skills/uninstall/plan.js";
21
24
  import { parseSubagentUninstallRequest, planSubagentUninstall, } from "../subagents/uninstall/plan.js";
22
25
  import { resolveRootUninstallIntent } from "./root-intent.js";
26
+ import { refuseUndesiredInstalledTarget, typedUninstallSubject } from "./undesired-target.js";
23
27
  const planForType = (type, selector) => {
24
28
  switch (type) {
25
29
  case "skill":
@@ -87,23 +91,119 @@ const planForType = (type, selector) => {
87
91
  /** Settle a removal without writing anything. */
88
92
  export const prepareUninstallExtensions = Effect.fn("UninstallExtensions.prepare")(function* (request) {
89
93
  const resolved = yield* Option.match(request.type, {
90
- onSome: (type) => Effect.succeed({ type, selector: request.selector }),
91
- onNone: () => resolveRootUninstallIntent(request.selector).pipe(Effect.map((intent) => ({ type: intent.type, selector: intent.name }))),
94
+ onSome: (type) => Effect.succeed({
95
+ type,
96
+ selector: request.selector,
97
+ subject: typedUninstallSubject(type, request.selector),
98
+ }),
99
+ onNone: () => resolveRootUninstallIntent(request.selector).pipe(Effect.map((intent) => ({
100
+ type: intent.type,
101
+ selector: intent.name,
102
+ subject: { type: intent.type, name: intent.name, owner: intent.owner },
103
+ }))),
92
104
  });
105
+ // An installed package no desired route reaches is sync's to reconcile, not
106
+ // intent this removal can withdraw.
107
+ if (resolved.type !== "pack" && resolved.subject !== undefined)
108
+ yield* refuseUndesiredInstalledTarget(resolved.subject);
93
109
  const planned = yield* planForType(resolved.type, resolved.selector);
110
+ const proposal = yield* proposeDesiredState(planned.names.map((name) => ({ kind: "remove", type: resolved.type, name }))).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
111
+ category: "conflict",
112
+ detail: "Cannot derive desired state after uninstall",
113
+ cause,
114
+ })));
94
115
  // The plan's own name stands whichever spelling produced it: the removal a
95
116
  // person asked for is type-specific, and the plan name is what they read.
96
117
  // Only the presented subject varies — the root form routes across every
97
118
  // type, so it presents the default subject rather than the one this
98
119
  // request happened to settle on.
120
+ const leafType = resolved.type === "pack" ? undefined : resolved.type;
121
+ const artifacts = leafType === undefined
122
+ ? []
123
+ : yield* Effect.forEach(planned.names, (name) => prepareUninstallArtifact({ type: leafType, name }, proposal)).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
124
+ category: "conflict",
125
+ detail: "Cannot establish uninstall effects",
126
+ cause,
127
+ })));
128
+ const artifactByName = new Map(planned.names.flatMap((name, index) => artifacts[index] === undefined ? [] : [[name, artifacts[index]]]));
129
+ const cleanupAdapter = {
130
+ toStepFailure: (cause) => lifecycleStepFailure(new ExtensionLifecycleFailed({
131
+ category: "conflict",
132
+ detail: "detail" in cause ? cause.detail : cause._tag,
133
+ cause,
134
+ })),
135
+ };
136
+ const activeNames = (type) => new Set(proposal.after.nodes
137
+ .filter((node) => node.type === type && node.enabled)
138
+ .map((node) => node.name));
139
+ const jobs = yield* Effect.forEach(planned.plan.jobs, (job) => Effect.gen(function* () {
140
+ const steps = yield* Effect.forEach(job.steps, (step) => Effect.gen(function* () {
141
+ const artifact = artifactByName.get(step.label ?? "");
142
+ if (artifact === undefined || step.readiness === "error" || leafType === undefined)
143
+ return step;
144
+ if ((artifact.targets?.length ?? 0) === 0 && (artifact.references?.length ?? 0) === 0) {
145
+ // Nothing exists to withdraw: the planner's descriptive artifact
146
+ // would name paths that are neither present nor changed, so the
147
+ // step declares none, and a result that changed nothing reports
148
+ // the empty evidence instead.
149
+ const { artifact: _descriptive, ...withoutArtifact } = step;
150
+ return {
151
+ ...withoutArtifact,
152
+ run: step.run.pipe(Effect.map((result) => result.result === "success" &&
153
+ (result.disposition === "unchanged" || result.artifact?.change === "unchanged")
154
+ ? { ...result, artifact }
155
+ : result)),
156
+ };
157
+ }
158
+ const cleanup = yield* collectCleanupStep({
159
+ expectedSkillNames: activeNames("skill"),
160
+ expectedSubagentNames: activeNames("subagent"),
161
+ expectedMcpServerNames: activeNames("mcp-server"),
162
+ expectedHookNames: activeNames("hook"),
163
+ subjects: [{ type: leafType, name: step.label }],
164
+ adapter: cleanupAdapter,
165
+ }).pipe(Effect.mapError((cause) => new ExtensionLifecycleFailed({
166
+ category: "conflict",
167
+ detail: "Cannot establish owned uninstall outputs",
168
+ cause,
169
+ })));
170
+ const removal = {
171
+ ...step,
172
+ artifact,
173
+ run: step.run.pipe(Effect.map((result) => result.result === "success" ? { ...result, artifact } : result)),
174
+ };
175
+ if (Option.isNone(cleanup))
176
+ return removal;
177
+ return yield* buildReconciliationClosure({
178
+ label: step.label,
179
+ message: `Uninstalled ${step.label}`,
180
+ artifact,
181
+ children: [
182
+ { step: cleanup.value, coverage: "ineligible" },
183
+ { step: removal, coverage: "eligible" },
184
+ ],
185
+ toStepFailure: (failure) => failure._tag === "StepFailure" ? failure : cleanupAdapter.toStepFailure(failure),
186
+ validate: Effect.void,
187
+ });
188
+ }));
189
+ return { ...job, steps };
190
+ }));
99
191
  const plan = {
100
192
  ...planned.plan,
193
+ jobs,
101
194
  presentation: operationPresentation({ imperative: "uninstall", past: "Uninstalled", gerund: "Uninstalling" }, Option.getOrUndefined(request.type)),
102
195
  };
103
196
  // Every removal withdraws the extension's per-agent projection, so the
104
197
  // candidate carries the configured-agent operation the resolution projects
105
198
  // before the removal and verifies after it.
106
- const configuredAgentOperations = planned.names.map((name) => ({ extensionType: resolved.type, name, plannedState: "absent" }));
199
+ const configuredAgentOperations = planned.names.map((name) => {
200
+ const retained = proposal.after.nodes.find((node) => node.type === resolved.type && node.name === name);
201
+ return {
202
+ extensionType: resolved.type,
203
+ name,
204
+ plannedState: retained === undefined ? "absent" : retained.enabled ? "enabled" : "disabled",
205
+ };
206
+ });
107
207
  const execution = yield* prepareExecutionCandidate(plan, { configuredAgentOperations });
108
208
  return {
109
209
  type: resolved.type,
@@ -18,8 +18,8 @@ import { ExtensionLifecycleFailed } from "../errors.js";
18
18
  import { type InstallableExtensionType } from "@agentxm/extension-model/unstable/extensions/installable-types";
19
19
  import { type ExtensionName, type Handle } from "@agentxm/extension-model/unstable/extensions";
20
20
  import type { VersionRange } from "@agentxm/extension-model/unstable/version-constraints";
21
- export declare const rootUpdatableTypeSegments: readonly ("knowledge" | "rules" | "hooks" | "mcps" | "skills" | "subagents" | "packs")[];
22
- export declare const RootUpdatableTypeSegmentSchema: Schema.Literals<readonly ("knowledge" | "rules" | "hooks" | "mcps" | "skills" | "subagents" | "packs")[]>;
21
+ export declare const rootUpdatableTypeSegments: readonly ("knowledge" | "rules" | "hooks" | "skills" | "subagents" | "packs" | "mcps")[];
22
+ export declare const RootUpdatableTypeSegmentSchema: Schema.Literals<readonly ("knowledge" | "rules" | "hooks" | "skills" | "subagents" | "packs" | "mcps")[]>;
23
23
  export type RootUpdatableTypeSegment = typeof RootUpdatableTypeSegmentSchema.Type;
24
24
  export type RootUpdatableType = InstallableExtensionType;
25
25
  /** One Registry identity a root update names, with the range it requested. */
@@ -10,9 +10,8 @@
10
10
  *
11
11
  * @experimental This API is unstable and may change without notice.
12
12
  */
13
- import * as Effect from "effect/Effect";
14
13
  import type * as Option from "effect/Option";
15
- import type { JobStepResult, Plan, StepFailure } from "@agentxm/workspace-operations";
14
+ import type { Plan, PlannedJobStep } from "@agentxm/workspace-operations";
16
15
  import type { SkillExtensionRef } from "@agentxm/extension-model/unstable/extensions/refs/skill";
17
16
  import type { SubagentExtensionRef } from "@agentxm/extension-model/unstable/extensions/refs/subagent";
18
17
  import type { SkillLockEntry, SubagentLockEntry } from "@agentxm/workspace-state";
@@ -40,6 +39,6 @@ export interface SelectiveUpdateUnit<TOperation> {
40
39
  * steps are the selected entries, each either unchanged or dispatched to the
41
40
  * install operation that advances it.
42
41
  */
43
- export declare const buildSelectiveUpdatePlan: <TOperation, R>(units: ReadonlyArray<SelectiveUpdateUnit<TOperation>>, acceptedResolutions: Readonly<Record<string, AcceptedEntry | undefined>>, name: string, description: Option.Option<string>, makeRunClosure: (operation: TOperation) => Effect.Effect<JobStepResult, StepFailure, R>) => Plan<R>;
42
+ export declare const buildSelectiveUpdatePlan: <TOperation, R>(units: ReadonlyArray<SelectiveUpdateUnit<TOperation>>, acceptedResolutions: Readonly<Record<string, AcceptedEntry | undefined>>, name: string, description: Option.Option<string>, makeStep: (operation: TOperation) => PlannedJobStep<R>) => Plan<R>;
44
43
  export {};
45
44
  //# sourceMappingURL=plan.d.ts.map
@@ -41,7 +41,7 @@ const unchangedStep = (label) => ({
41
41
  * steps are the selected entries, each either unchanged or dispatched to the
42
42
  * install operation that advances it.
43
43
  */
44
- export const buildSelectiveUpdatePlan = (units, acceptedResolutions, name, description, makeRunClosure) => ({
44
+ export const buildSelectiveUpdatePlan = (units, acceptedResolutions, name, description, makeStep) => ({
45
45
  _tag: "Plan",
46
46
  name,
47
47
  description,
@@ -52,7 +52,7 @@ export const buildSelectiveUpdatePlan = (units, acceptedResolutions, name, descr
52
52
  const accepted = acceptedResolutions[unit.name];
53
53
  const needsUpdate = accepted === undefined || unit.force || hasChanged(unit.ref, accepted);
54
54
  return needsUpdate
55
- ? { readiness: "ready", label: unit.name, run: makeRunClosure(unit.operation) }
55
+ ? { ...makeStep(unit.operation), label: unit.name }
56
56
  : unchangedStep(unit.name);
57
57
  }),
58
58
  },
@@ -2,16 +2,12 @@
2
2
  * What a selective update's plan steps declare at execution time.
3
3
  *
4
4
  * A selective advance runs the same install operation the install routes run,
5
- * so its steps carry the install step requirements plus the two services that
6
- * operation reaches for directly: the source providers it re-fetches through,
7
- * and the boundary's failure conversion. Those requirements travel with the
5
+ * so its steps carry the install step requirements. Those requirements travel with the
8
6
  * step and are composed once at the application's runtime boundary — nothing
9
7
  * is captured into a step's closure on the way.
10
8
  *
11
9
  * @experimental This API is unstable and may change without notice.
12
10
  */
13
- import type { SourceHostProviders } from "@agentxm/extension-sources";
14
11
  import type { InstallStepRequirements } from "../../install/vocabulary.js";
15
- import type { StepFailureConversion } from "../../step-failure-conversion.js";
16
- export type SelectiveUpdateStepRequirements = InstallStepRequirements | SourceHostProviders | StepFailureConversion;
12
+ export type SelectiveUpdateStepRequirements = InstallStepRequirements;
17
13
  //# sourceMappingURL=requirements.d.ts.map
@@ -2,9 +2,7 @@
2
2
  * What a selective update's plan steps declare at execution time.
3
3
  *
4
4
  * A selective advance runs the same install operation the install routes run,
5
- * so its steps carry the install step requirements plus the two services that
6
- * operation reaches for directly: the source providers it re-fetches through,
7
- * and the boundary's failure conversion. Those requirements travel with the
5
+ * so its steps carry the install step requirements. Those requirements travel with the
8
6
  * step and are composed once at the application's runtime boundary — nothing
9
7
  * is captured into a step's closure on the way.
10
8
  *
@@ -14,7 +14,7 @@ import * as Effect from "effect/Effect";
14
14
  import * as Option from "effect/Option";
15
15
  import { parseSourceQualifiedRegistrySourcePatternParts } from "@agentxm/extension-model/unstable/extensions";
16
16
  import { resolveInstalledIdentifierNameOrInput, resolveSource, SourceHostProviders, } from "@agentxm/extension-sources";
17
- import { expandGlobs } from "../../glob.js";
17
+ import { expandGlobs } from "@agentxm/extension-model/unstable/extensions/name-patterns";
18
18
  /**
19
19
  * Whether a positional selector names the same origin an entry declares.
20
20
  * Two Registry patterns compare by their parsed parts; anything else
@@ -16,9 +16,7 @@
16
16
  */
17
17
  import * as Effect from "effect/Effect";
18
18
  import { SourceHostProviders } from "@agentxm/extension-sources";
19
- import { WorkspaceMutations } from "@agentxm/workspace-state";
20
19
  import { ExtensionLifecycleFailed } from "../../errors.js";
21
- import type { SelectiveUpdateStepRequirements } from "./requirements.js";
22
20
  import { type SelectiveUpdateSelectors } from "./selection.js";
23
21
  /** Everything `skills update` needs beyond the workspace it runs in. */
24
22
  export interface SelectiveSkillUpdateRequest extends SelectiveUpdateSelectors {
@@ -47,9 +45,9 @@ export declare const prepareSelectiveSkillUpdate: (request: SelectiveSkillUpdate
47
45
  outcome: "planned";
48
46
  subjectType: "skill";
49
47
  planName: string;
50
- execution: import("@agentxm/workspace-operations").ExecutionCandidate<SelectiveUpdateStepRequirements, never>;
48
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("../../index.ts").InstallStepRequirements, never>;
51
49
  reason?: never;
52
50
  message?: never;
53
51
  planDescription?: never;
54
- }, 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("effect/FileSystem").FileSystem | import("effect/Path").Path | WorkspaceMutations | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("effect/unstable/http/HttpClient").HttpClient | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | SourceHostProviders | import("@agentxm/extension-sources").WorkspaceCatalog>;
52
+ }, 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("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/extension-materialization").SkillManager | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | SourceHostProviders | import("@agentxm/extension-sources").WorkspaceCatalog | import("../../index.ts").InstallStepRequirements>;
55
53
  //# sourceMappingURL=skills.d.ts.map
@@ -27,7 +27,7 @@ import { operationPresentation, prepareExecutionCandidate, } from "@agentxm/work
27
27
  import { acceptedResolutionRef, configuredRowsByName, WorkspaceMutations, } from "@agentxm/workspace-state";
28
28
  import { ExtensionLifecycleFailed } from "../../errors.js";
29
29
  import { withPublisherTrustConditions } from "../../publisher-binding.js";
30
- import { installSkill } from "../../skills/operations/install.js";
30
+ import { planSkillInstallationStep } from "../../skills/install/plan.js";
31
31
  import { buildSelectiveUpdatePlan } from "./plan.js";
32
32
  import { selectUpdateTargets, } from "./selection.js";
33
33
  import { ignoreVersionConstraintsCondition, selectiveUpdatePlanName, } from "./vocabulary.js";
@@ -47,14 +47,6 @@ const allSkillResolutionsFailed = new ExtensionLifecycleFailed({
47
47
  recover: "Review the registries declared under `sources` in workspace settings",
48
48
  cmd: "axm help settings",
49
49
  });
50
- /**
51
- * The install operation reports more than the plan vocabulary carries. Only
52
- * the outcome and its sentence cross into the step result; a failed step
53
- * carries the typed failure the boundary renders.
54
- */
55
- const toJobStepResult = (result) => result.result === "error" && result.error !== undefined
56
- ? { result: "error", message: result.message, error: result.error }
57
- : { result: "success", message: result.message };
58
50
  const skippedSkillStep = (outcome) => ({
59
51
  readiness: "ready",
60
52
  label: `Skip ${outcome.name}`,
@@ -522,24 +514,27 @@ export const prepareSelectiveSkillUpdate = Effect.fn("SelectiveSkillUpdate.prepa
522
514
  if (warnings.length > 0)
523
515
  warningsBySkill.set(item.ref.skill.name, warnings);
524
516
  }
525
- const units = resolved.map((item) => ({
526
- name: item.ref.skill.name,
527
- ref: item.ref,
528
- force: request.ignoreVersionConstraints || item.ref.refType !== "registry",
529
- operation: {
530
- name: "install-skill",
531
- args: {
532
- ref: item.ref,
533
- force: request.ignoreVersionConstraints || item.ref.refType !== "registry",
534
- versionRange: item.versionRange,
535
- skipSettings: Option.none(),
536
- strictUnknownAgents: Option.none(),
537
- sourceName: Option.none(),
538
- },
539
- },
540
- }));
541
- const makeRunClosure = (operation) => installSkill(operation).pipe(Effect.map(toJobStepResult), Effect.map(appendWarningsToResult(warningsBySkill.get(operation.args.ref.skill.name) ?? [])));
542
- const rawPlan = buildSelectiveUpdatePlan(units, lockedSkills, PLAN_NAME, Option.some(PLAN_DESCRIPTION), makeRunClosure);
517
+ const units = yield* Effect.forEach(resolved, (item) => Effect.gen(function* () {
518
+ const force = request.ignoreVersionConstraints || item.ref.refType !== "registry";
519
+ const step = yield* planSkillInstallationStep({
520
+ ref: item.ref,
521
+ force,
522
+ operation: "update",
523
+ });
524
+ const operation = step.readiness === "error"
525
+ ? step
526
+ : {
527
+ ...step,
528
+ run: step.run.pipe(Effect.map(appendWarningsToResult(warningsBySkill.get(item.ref.skill.name) ?? []))),
529
+ };
530
+ return {
531
+ name: item.ref.skill.name,
532
+ ref: item.ref,
533
+ force,
534
+ operation,
535
+ };
536
+ }), { concurrency: 1 });
537
+ const rawPlan = buildSelectiveUpdatePlan(units, lockedSkills, PLAN_NAME, Option.some(PLAN_DESCRIPTION), (step) => step);
543
538
  const basePlanWithWarnings = {
544
539
  ...rawPlan,
545
540
  presentation: operationPresentation({ imperative: "update", past: "Updated", gerund: "Updating" }, "skill"),
@@ -15,7 +15,6 @@ import { SourceHostProviders } from "@agentxm/extension-sources";
15
15
  import { WorkspaceMutations } from "@agentxm/workspace-state";
16
16
  import { ExtensionLifecycleFailed } from "../../errors.js";
17
17
  import { StepFailureConversion } from "../../step-failure-conversion.js";
18
- import type { SelectiveUpdateStepRequirements } from "./requirements.js";
19
18
  import { type SelectiveUpdateSelectors } from "./selection.js";
20
19
  /** Everything `subagents update` needs beyond the workspace it runs in. */
21
20
  export interface SelectiveSubagentUpdateRequest extends SelectiveUpdateSelectors {
@@ -44,9 +43,9 @@ export declare const prepareSelectiveSubagentUpdate: (request: SelectiveSubagent
44
43
  outcome: "planned";
45
44
  subjectType: "subagent";
46
45
  planName: string;
47
- execution: import("@agentxm/workspace-operations").ExecutionCandidate<SelectiveUpdateStepRequirements, never>;
46
+ execution: import("@agentxm/workspace-operations").ExecutionCandidate<import("../../index.ts").InstallStepRequirements, never>;
48
47
  reason?: never;
49
48
  message?: never;
50
49
  planDescription?: never;
51
- }, 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, StepFailureConversion | import("effect/FileSystem").FileSystem | import("effect/Path").Path | WorkspaceMutations | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("effect/unstable/http/HttpClient").HttpClient | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | SourceHostProviders | SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog>;
50
+ }, 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, StepFailureConversion | import("effect/FileSystem").FileSystem | import("effect/Path").Path | WorkspaceMutations | import("effect/unstable/http/HttpClient").HttpClient | import("@agentxm/workspace-state").ConfiguredAgentOutcomesProvider | import("@agentxm/extension-resolution").ReleaseAgePosture | import("effect/Scope").Scope | SourceHostProviders | SubagentManager | import("@agentxm/extension-sources").WorkspaceCatalog>;
52
51
  //# sourceMappingURL=subagents.d.ts.map