



























@@ -1,3 +1,4 @@
1+/** Selection helpers for filtering migration plan items before apply. */
12import path from "node:path";
23import { isRecord } from "@openclaw/normalization-core/record-coerce";
34import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce";
@@ -6,6 +7,7 @@ import { markMigrationItemSkipped, summarizeMigrationItems } from "../../plugin-
67import type { MigrationItem, MigrationPlan } from "../../plugins/types.js";
78import { MIGRATION_CONFLICT_REASON_PHRASES } from "./output.js";
8910+// Public selection tokens and skip reasons shared with prompt tests and apply filtering.
911export const MIGRATION_SKILL_NOT_SELECTED_REASON = "not selected for migration";
1012export const MIGRATION_PLUGIN_NOT_SELECTED_REASON = "not selected for migration";
1113export const MIGRATION_SELECTION_ACCEPT = "__openclaw_migrate_accept_recommended__";
@@ -16,7 +18,9 @@ export const MIGRATION_SKILL_SELECTION_TOGGLE_ALL_ON = MIGRATION_SELECTION_TOGGL
1618export const MIGRATION_SKILL_SELECTION_TOGGLE_ALL_OFF = MIGRATION_SELECTION_TOGGLE_ALL_OFF;
17191820type InteractiveMigrationSelection = { action: "select"; selectedItemIds: Set<string> };
21+/** Interactive skill selection result consumed by the apply flow. */
1922export type InteractiveMigrationSkillSelection = InteractiveMigrationSelection;
23+/** Interactive plugin selection result consumed by the apply flow. */
2024export type InteractiveMigrationPluginSelection = InteractiveMigrationSelection;
21252226function normalizeSelectionRef(value: string): string {
@@ -173,6 +177,7 @@ function resolveSelectedPluginItemIds(
173177});
174178}
175179180+/** Returns skill copy items that can still be selected or deselected. */
176181export function getSelectableMigrationSkillItems(plan: MigrationPlan): MigrationItem[] {
177182return plan.items.filter(
178183(item) =>
@@ -182,6 +187,7 @@ export function getSelectableMigrationSkillItems(plan: MigrationPlan): Migration
182187);
183188}
184189190+/** Returns plugin install items that can still be selected or deselected. */
185191export function getSelectableMigrationPluginItems(plan: MigrationPlan): MigrationItem[] {
186192// Only source-installed curated Codex plugins become selectable install items.
187193// Cached/manual-review plugin bundles are emitted as manual items, the aggregate
@@ -196,28 +202,34 @@ export function getSelectableMigrationPluginItems(plan: MigrationPlan): Migratio
196202);
197203}
198204205+/** Returns the stable checkbox value for a skill migration item. */
199206export function getMigrationSkillSelectionValue(item: MigrationItem): string {
200207return item.id;
201208}
202209210+/** Returns the stable checkbox value for a plugin migration item. */
203211export function getMigrationPluginSelectionValue(item: MigrationItem): string {
204212return item.id;
205213}
206214215+/** Formats the visible label for a plugin migration checkbox. */
207216export function formatMigrationPluginSelectionLabel(item: MigrationItem): string {
208217return readMigrationPluginName(item) ?? item.id.replace(/^plugin:/u, "");
209218}
210219220+/** Defaults skill selection to planned items only. */
211221export function getDefaultMigrationSkillSelectionValues(items: readonly MigrationItem[]): string[] {
212222return items.filter((item) => item.status === "planned").map(getMigrationSkillSelectionValue);
213223}
214224225+/** Defaults plugin selection to planned items only. */
215226export function getDefaultMigrationPluginSelectionValues(
216227items: readonly MigrationItem[],
217228): string[] {
218229return items.filter((item) => item.status === "planned").map(getMigrationPluginSelectionValue);
219230}
220231232+/** Formats the visible label for a skill migration checkbox. */
221233export function formatMigrationSkillSelectionLabel(item: MigrationItem): string {
222234return readMigrationSkillName(item) ?? item.id.replace(/^skill:/u, "");
223235}
@@ -229,6 +241,7 @@ function humanizeMigrationConflictReason(reason: string | undefined): string {
229241return MIGRATION_CONFLICT_REASON_PHRASES[reason] ?? reason;
230242}
231243244+/** Formats conflict helper text for a skill migration checkbox. */
232245export function formatMigrationSkillSelectionHint(item: MigrationItem): string | undefined {
233246if (item.status !== "conflict") {
234247return undefined;
@@ -238,6 +251,7 @@ export function formatMigrationSkillSelectionHint(item: MigrationItem): string |
238251return sourceLabel ? `${sourceLabel} ${reason}` : reason;
239252}
240253254+/** Formats conflict helper text for a plugin migration checkbox. */
241255export function formatMigrationPluginSelectionHint(item: MigrationItem): string | undefined {
242256if (item.status !== "conflict") {
243257return undefined;
@@ -247,6 +261,7 @@ export function formatMigrationPluginSelectionHint(item: MigrationItem): string
247261return marketplace ? `${marketplace} plugin ${reason}` : reason;
248262}
249263264+/** Marks unselected selectable skill items as skipped and recomputes plan summary. */
250265export function applyMigrationSelectedSkillItemIds(
251266plan: MigrationPlan,
252267selectedItemIds: ReadonlySet<string>,
@@ -265,6 +280,7 @@ export function applyMigrationSelectedSkillItemIds(
265280};
266281}
267282283+/** Applies skill refs passed by CLI flags to a migration plan. */
268284export function applyMigrationSkillSelection(
269285plan: MigrationPlan,
270286selectedSkillRefs: readonly string[] | undefined,
@@ -277,6 +293,7 @@ export function applyMigrationSkillSelection(
277293return applyMigrationSelectedSkillItemIds(plan, selectedIds);
278294}
279295296+/** Applies plugin refs passed by CLI flags to a migration plan. */
280297export function applyMigrationPluginSelection(
281298plan: MigrationPlan,
282299selectedPluginRefs: readonly string[] | undefined,
@@ -289,6 +306,7 @@ export function applyMigrationPluginSelection(
289306return applyMigrationSelectedPluginItemIds(plan, selectedIds);
290307}
291308309+/** Marks unselected plugin items skipped and filters matching Codex plugin config writes. */
292310export function applyMigrationSelectedPluginItemIds(
293311plan: MigrationPlan,
294312selectedItemIds: ReadonlySet<string>,
@@ -424,6 +442,7 @@ function resolveMigrationSelectionBulkToggleValues(
424442return undefined;
425443}
426444445+/** Resolves checkbox values into selected skill migration item ids. */
427446export function resolveInteractiveMigrationSkillSelection(
428447items: readonly MigrationItem[],
429448selectedValues: readonly string[],
@@ -435,6 +454,7 @@ export function resolveInteractiveMigrationSkillSelection(
435454);
436455}
437456457+/** Resolves checkbox values into selected plugin migration item ids. */
438458export function resolveInteractiveMigrationPluginSelection(
439459items: readonly MigrationItem[],
440460selectedValues: readonly string[],
@@ -446,6 +466,7 @@ export function resolveInteractiveMigrationPluginSelection(
446466);
447467}
448468469+/** Reconciles all/none checkbox toggles for the skill-selection prompt. */
449470export function reconcileInteractiveMigrationSkillToggleValues(
450471selectedValues: readonly string[],
451472activatedValue: string | undefined,
@@ -465,6 +486,7 @@ export function reconcileInteractiveMigrationSkillToggleValues(
465486);
466487}
467488489+/** Reconciles Enter-key selection behavior for interactive migration prompts. */
468490export function reconcileInteractiveMigrationEnterValues(
469491selectedValues: readonly string[],
470492activatedValue: string | undefined,
@@ -485,6 +507,7 @@ export function reconcileInteractiveMigrationEnterValues(
485507return [...selectedValues];
486508}
487509510+/** Reconciles keyboard shortcuts for all/none migration prompt selections. */
488511export function reconcileInteractiveMigrationShortcutValues(
489512previousValues: readonly string[],
490513selectedValues: readonly string[],
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。