@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.
- package/dist/src/activation/set-activation.d.ts +22 -40
- package/dist/src/activation/set-activation.js +191 -336
- package/dist/src/demote/demote-to-external-source.d.ts +1 -1
- package/dist/src/demote/demote-to-external-source.js +53 -24
- package/dist/src/hooks/install/plan.js +6 -3
- package/dist/src/hooks/uninstall/plan.js +4 -3
- package/dist/src/index.d.ts +1 -5
- package/dist/src/index.js +1 -4
- package/dist/src/install/install-extensions.d.ts +5 -5
- package/dist/src/install/install-extensions.js +2 -1
- package/dist/src/install/root-intent.d.ts +2 -2
- package/dist/src/install/vocabulary.d.ts +5 -4
- package/dist/src/knowledge/install/plan.js +2 -1
- package/dist/src/knowledge/uninstall/plan.js +4 -3
- package/dist/src/mcps/install/plan.d.ts +1 -1
- package/dist/src/mcps/install/plan.js +59 -3
- package/dist/src/mcps/operations/uninstall.js +2 -1
- package/dist/src/mcps/uninstall/plan.js +13 -4
- package/dist/src/packs/graph-transition.d.ts +0 -25
- package/dist/src/packs/graph-transition.js +0 -101
- package/dist/src/packs/install/plan.d.ts +0 -13
- package/dist/src/packs/install/plan.js +12 -9
- package/dist/src/packs/member-install-step.js +8 -21
- package/dist/src/packs/promote-authored-pack.js +6 -3
- package/dist/src/packs/uninstall/plan.js +53 -21
- package/dist/src/rules/install/plan.js +6 -3
- package/dist/src/rules/uninstall/plan.js +4 -3
- package/dist/src/skills/application/index.d.ts +42 -0
- package/dist/src/skills/application/index.js +37 -0
- package/dist/src/skills/domain/selection.d.ts +22 -0
- package/dist/src/skills/domain/selection.js +18 -0
- package/dist/src/skills/install/artifact.d.ts +4 -0
- package/dist/src/skills/install/artifact.js +29 -0
- package/dist/src/skills/install/bundled.js +4 -4
- package/dist/src/skills/install/plan.d.ts +15 -4
- package/dist/src/skills/install/plan.js +114 -97
- package/dist/src/skills/uninstall/plan.js +13 -5
- package/dist/src/step-failure.js +12 -0
- package/dist/src/subagents/application/index.d.ts +42 -0
- package/dist/src/subagents/application/index.js +37 -0
- package/dist/src/subagents/domain/selection.d.ts +22 -0
- package/dist/src/subagents/domain/selection.js +18 -0
- package/dist/src/subagents/install/plan.d.ts +2 -2
- package/dist/src/subagents/install/plan.js +4 -4
- package/dist/src/subagents/operations/enable.js +1 -3
- package/dist/src/subagents/uninstall/plan.js +5 -4
- package/dist/src/testing.d.ts +3 -2
- package/dist/src/testing.js +9 -6
- package/dist/src/uninstall/root-intent.d.ts +2 -1
- package/dist/src/uninstall/root-intent.js +1 -0
- package/dist/src/uninstall/undesired-target.d.ts +26 -0
- package/dist/src/uninstall/undesired-target.js +56 -0
- package/dist/src/uninstall/uninstall-extensions.d.ts +1 -1
- package/dist/src/uninstall/uninstall-extensions.js +103 -3
- package/dist/src/update/root-request.d.ts +2 -2
- package/dist/src/update/selective/plan.d.ts +2 -3
- package/dist/src/update/selective/plan.js +2 -2
- package/dist/src/update/selective/requirements.d.ts +2 -6
- package/dist/src/update/selective/requirements.js +1 -3
- package/dist/src/update/selective/selection.js +1 -1
- package/dist/src/update/selective/skills.d.ts +2 -4
- package/dist/src/update/selective/skills.js +22 -27
- package/dist/src/update/selective/subagents.d.ts +2 -3
- package/dist/src/update/selective/subagents.js +11 -9
- package/dist/src/update/selective/use-case.d.ts +7 -7
- package/dist/src/update/selective/vocabulary.d.ts +1 -1
- package/dist/src/update/selector.js +1 -1
- package/dist/src/update/targeted-plan.js +4 -2
- package/dist/src/workspace-paths.d.ts +0 -6
- package/dist/src/workspace-paths.js +0 -10
- package/package.json +30 -24
- package/dist/src/glob.d.ts +0 -35
- package/dist/src/glob.js +0 -75
- package/dist/src/install/selection-interaction.d.ts +0 -46
- package/dist/src/install/selection-interaction.js +0 -22
- package/dist/src/skills/install/selection.d.ts +0 -26
- package/dist/src/skills/install/selection.js +0 -41
- package/dist/src/skills/operations/install-result.d.ts +0 -33
- package/dist/src/skills/operations/install-result.js +0 -10
- package/dist/src/skills/operations/install.d.ts +0 -67
- package/dist/src/skills/operations/install.js +0 -591
- package/dist/src/subagents/install/selection.d.ts +0 -26
- package/dist/src/subagents/install/selection.js +0 -37
- package/dist/src/uninstall/retention-policy.d.ts +0 -21
- 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,
|
|
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 "
|
|
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 "
|
|
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* () {
|
package/dist/src/testing.d.ts
CHANGED
|
@@ -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 {
|
|
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/
|
|
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>;
|
package/dist/src/testing.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
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(
|
|
159
|
-
|
|
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
|
-
|
|
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" | "
|
|
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
|
}
|
|
@@ -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
|
|
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({
|
|
91
|
-
|
|
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) =>
|
|
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" | "
|
|
22
|
-
export declare const RootUpdatableTypeSegmentSchema: Schema.Literals<readonly ("knowledge" | "rules" | "hooks" | "
|
|
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 {
|
|
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>,
|
|
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,
|
|
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
|
-
? {
|
|
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
|
|
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
|
-
|
|
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
|
|
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 "
|
|
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<
|
|
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("
|
|
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 {
|
|
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 =
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
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<
|
|
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("
|
|
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
|