@dsh-workbench/core 1.1.10 → 1.1.12

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.
@@ -6501,6 +6501,22 @@ function migrationFollowUp(input) {
6501
6501
  } : void 0;
6502
6502
  }
6503
6503
  //#endregion
6504
+ //#region src/shared/api/host/profile-dependencies.ts
6505
+ function dependencyReader(profileDir) {
6506
+ if (profileDir === null) return () => void 0;
6507
+ let dependencies;
6508
+ return (pkg) => {
6509
+ if (dependencies === void 0) try {
6510
+ const raw = JSON.parse(readFileSync(join(profileDir, "package.json"), "utf8")).dependencies;
6511
+ dependencies = typeof raw === "object" && raw !== null ? raw : {};
6512
+ } catch {
6513
+ dependencies = {};
6514
+ }
6515
+ const value = dependencies[pkg];
6516
+ return typeof value === "string" ? value : void 0;
6517
+ };
6518
+ }
6519
+ //#endregion
6504
6520
  //#region src/shared/api/host/bundle-routes.ts
6505
6521
  function registryOf(search) {
6506
6522
  const raw = param(search, "registry");
@@ -6564,9 +6580,10 @@ async function latestIfReleaseReady(supply, input) {
6564
6580
  async function workbenchVersion(supply, input) {
6565
6581
  const read = supply.readProfilePackage(input.dir, PLUGIN_ID);
6566
6582
  if (read === void 0) return void 0;
6583
+ const spec = dependencyReader(input.dir)(PLUGIN_ID);
6567
6584
  const registry = read.registry ?? input.fallback;
6568
6585
  const shell = input.shell;
6569
- const queried = read.local === true || shell === void 0 || registry === void 0 ? void 0 : await supply.latestVersion({
6586
+ const queried = read.local === true || !input.check || shell === void 0 || registry === void 0 ? void 0 : await supply.latestVersion({
6570
6587
  shell,
6571
6588
  name: read.pkg,
6572
6589
  registry,
@@ -6586,7 +6603,9 @@ async function workbenchVersion(supply, input) {
6586
6603
  ...latest === void 0 ? {} : { latest },
6587
6604
  ...input.running === void 0 ? {} : { running: input.running },
6588
6605
  ...read.local === true ? { local: true } : {},
6589
- ...input.followUp === void 0 ? {} : { followUp: input.followUp }
6606
+ ...input.followUp === void 0 ? {} : { followUp: input.followUp },
6607
+ ...spec === void 0 ? {} : { spec },
6608
+ ...registry === void 0 || read.local === true ? {} : { registry }
6590
6609
  };
6591
6610
  }
6592
6611
  function moduleVersionsHandler(ctx, shell, running, selfUpdate) {
@@ -6601,12 +6620,15 @@ function moduleVersionsHandler(ctx, shell, running, selfUpdate) {
6601
6620
  const found = supply.profileModules(dir);
6602
6621
  const refusals = new Map((ctx.get("workbenchUnits")?.refusals() ?? []).filter((one) => one.unit !== "").map((one) => [one.unit, one.reasons]));
6603
6622
  const force = param(search, "force") === "1";
6623
+ const check = param(search, "check") !== "0";
6604
6624
  const fallback = (await manager.registries())?.resolved ?? void 0;
6625
+ const dependencyOf = dependencyReader(dir);
6605
6626
  const modules = await Promise.all(found.map(async (module) => {
6606
6627
  const local = module.local === true;
6607
6628
  const fromRegistry = module.fromRegistry !== false;
6608
6629
  const registry = fromRegistry ? module.registry ?? fallback : void 0;
6609
- const latest = local || !fromRegistry || shell === void 0 || registry === void 0 ? void 0 : await supply.latestVersion({
6630
+ const spec = dependencyOf(module.pkg);
6631
+ const latest = local || !fromRegistry || !check || shell === void 0 || registry === void 0 ? void 0 : await supply.latestVersion({
6610
6632
  shell,
6611
6633
  name: module.pkg,
6612
6634
  registry,
@@ -6641,8 +6663,10 @@ function moduleVersionsHandler(ctx, shell, running, selfUpdate) {
6641
6663
  ...local ? {
6642
6664
  local: true,
6643
6665
  latestUnavailable: "local"
6644
- } : latest !== void 0 ? {} : { latestUnavailable: !fromRegistry ? "not-registry" : registry === void 0 ? "no-registry" : "probe-failed" },
6645
- ...refused === void 0 ? {} : { refused }
6666
+ } : latest !== void 0 ? {} : !fromRegistry ? { latestUnavailable: "not-registry" } : registry === void 0 ? { latestUnavailable: "no-registry" } : check ? { latestUnavailable: "probe-failed" } : {},
6667
+ ...refused === void 0 ? {} : { refused },
6668
+ ...spec === void 0 ? {} : { spec },
6669
+ ...registry === void 0 ? {} : { registry }
6646
6670
  };
6647
6671
  }));
6648
6672
  const selfUpdateNow = selfUpdate?.();
@@ -6658,6 +6682,7 @@ function moduleVersionsHandler(ctx, shell, running, selfUpdate) {
6658
6682
  shell,
6659
6683
  fallback,
6660
6684
  force,
6685
+ check,
6661
6686
  ...running === void 0 ? {} : { running },
6662
6687
  ...followUp === void 0 ? {} : { followUp },
6663
6688
  logger: ctx.logger
@@ -14646,22 +14671,6 @@ function transportOfSpec(spec) {
14646
14671
  };
14647
14672
  }
14648
14673
  //#endregion
14649
- //#region src/shared/api/host/profile-dependencies.ts
14650
- function dependencyReader(profileDir) {
14651
- if (profileDir === null) return () => void 0;
14652
- let dependencies;
14653
- return (pkg) => {
14654
- if (dependencies === void 0) try {
14655
- const raw = JSON.parse(readFileSync(join(profileDir, "package.json"), "utf8")).dependencies;
14656
- dependencies = typeof raw === "object" && raw !== null ? raw : {};
14657
- } catch {
14658
- dependencies = {};
14659
- }
14660
- const value = dependencies[pkg];
14661
- return typeof value === "string" ? value : void 0;
14662
- };
14663
- }
14664
- //#endregion
14665
14674
  //#region src/modules/panels/model/market-sources-act.ts
14666
14675
  function marketSourcesRoutes(store) {
14667
14676
  return { [MARKET_SOURCES_ROUTE]: async () => ({
@@ -16636,7 +16645,7 @@ var INSTALLED_PLUGINS_ROUTE = "panels/plugins";
16636
16645
  //#endregion
16637
16646
  //#region src/modules/panels/model/plugin-section.ts
16638
16647
  async function installedPlugins(options) {
16639
- const { ledger, shell, force = false } = options;
16648
+ const { ledger, shell, force = false, check = true } = options;
16640
16649
  const supply = options.supply ?? requireSupply();
16641
16650
  const rows = [];
16642
16651
  for (const entry of ledger.list()) {
@@ -16644,7 +16653,8 @@ async function installedPlugins(options) {
16644
16653
  shell,
16645
16654
  package: entry.package,
16646
16655
  registry: entry.registry,
16647
- force
16656
+ force,
16657
+ check
16648
16658
  });
16649
16659
  rows.push({
16650
16660
  pkg: entry.package,
@@ -16654,6 +16664,8 @@ async function installedPlugins(options) {
16654
16664
  ...release.latest === void 0 ? {} : { latest: release.latest }
16655
16665
  },
16656
16666
  ...entry.local === true ? { local: true } : {},
16667
+ ...entry.registry === void 0 ? {} : { registry: entry.registry },
16668
+ ...entry.installedAt === void 0 ? {} : { installedAt: entry.installedAt },
16657
16669
  ...pluginOnDisk(entry, ledger.pluginFiles) ? {} : { broken: true }
16658
16670
  });
16659
16671
  }
@@ -16667,7 +16679,8 @@ function pluginRoutes(options) {
16667
16679
  ledger: options.ledger,
16668
16680
  ...options.shell === void 0 ? {} : { shell: options.shell },
16669
16681
  ...options.supply === void 0 ? {} : { supply: options.supply },
16670
- force: param(search, "force") === "1"
16682
+ force: param(search, "force") === "1",
16683
+ check: param(search, "check") !== "0"
16671
16684
  })
16672
16685
  };
16673
16686
  } };
@@ -1,8 +1,14 @@
1
- import { type ModuleVersionsView, type VersionsPart } from './use-module-versions';
1
+ import { type ModuleVersionsView, type VersionsPart, type VersionsScope } from './use-module-versions';
2
+ export interface MarketReloadOptions {
3
+ readonly force?: boolean;
4
+ }
5
+ export interface MarketCheckOptions {
6
+ readonly force?: boolean;
7
+ readonly scope?: VersionsScope;
8
+ }
2
9
  export interface MarketReload {
3
- readonly reload: (options?: {
4
- readonly force?: boolean;
5
- }) => void;
10
+ readonly reload: (options?: MarketReloadOptions) => void;
11
+ readonly recheck: () => void;
6
12
  readonly checkPart: (part: VersionsPart) => void;
7
13
  }
8
14
  export interface MarketReloadInput {
@@ -18,19 +18,19 @@ export interface ModuleVersionsState {
18
18
  readonly modulesCheck: VersionsCheck;
19
19
  readonly pluginsCheck: VersionsCheck;
20
20
  }
21
- export interface ModuleVersionsView extends ModuleVersionsState {
22
- readonly checking: boolean;
23
- reload(options?: {
24
- readonly force?: boolean;
25
- readonly fresh?: boolean;
26
- readonly scope?: VersionsScope;
27
- }): void;
28
- }
29
21
  export interface ModuleVersionsRead {
22
+ check?: boolean;
30
23
  force?: boolean;
31
24
  fresh?: boolean;
32
25
  scope?: VersionsScope;
33
26
  }
27
+ export interface InstalledReadOptions {
28
+ readonly fresh?: boolean;
29
+ }
30
+ export interface ModuleVersionsView extends ModuleVersionsState {
31
+ readonly checking: boolean;
32
+ reload(options?: ModuleVersionsRead): void;
33
+ }
34
34
  export declare function bumpModuleVersionsEpoch(): void;
35
35
  export declare function moduleVersionsValue(): ModuleVersionsState;
36
36
  export declare function resetModuleVersions(): void;
@@ -39,4 +39,5 @@ export declare function withMarketUpdates(modules: readonly ModuleVersion[], row
39
39
  export declare function moduleVersionsCheckedAt(now: ModuleVersionsState): number | null;
40
40
  export declare function moduleVersionsChecking(value: ModuleVersionsState): boolean;
41
41
  export declare function runModuleVersionsRead(force?: boolean, fresh?: boolean, scope?: VersionsScope): Promise<void>;
42
+ export declare function runInstalledRead(options?: InstalledReadOptions): Promise<void>;
42
43
  export declare function useModuleVersions(): ModuleVersionsView;
@@ -1,16 +1,15 @@
1
- import type { ReactNode, Translate } from '@dsh-workbench/shared';
1
+ import type { Translate } from '@dsh-workbench/shared';
2
2
  import type { UnitManifest } from '@dsh-workbench/shared';
3
3
  import type { CapabilityMap } from '../../../shared/hooks/use-capabilities';
4
4
  import type { MarketFreshness } from './market-freshness';
5
5
  import type { InstalledPlugin } from '../../../shared/api/installed-plugins';
6
- import { type InstalledWorkbenchModule, type MarketRow, type MarketRowAction, type SharedRow } from './market-rows';
6
+ import { type InstalledWorkbenchModule } from './market-rows';
7
7
  import type { TitleResolve } from './market-names';
8
8
  import type { MarketMock } from './market-mock';
9
- import type { MarketFailure } from './market-row-types';
10
9
  import type { ModuleUpdateMap } from './market-rows';
11
10
  import type { WorkbenchSelfUpdate, WorkbenchVersion } from '../../../kernel/contract/bundle-install';
12
- import { type Pending } from './market-view-text';
13
11
  import type { VersionsCheck, VersionsPart } from '../market/use-module-versions';
12
+ import type { MarketReloadOptions } from '../market/use-market-reload';
14
13
  export interface MarketViewProps {
15
14
  readonly t: Translate;
16
15
  readonly titleOf: TitleResolve;
@@ -19,9 +18,7 @@ export interface MarketViewProps {
19
18
  readonly capabilities: CapabilityMap | null;
20
19
  readonly runtimePluginMarket?: boolean | undefined;
21
20
  readonly freshness: MarketFreshness;
22
- readonly onChanged: (options?: {
23
- readonly force?: boolean;
24
- }) => void;
21
+ readonly onChanged: (options?: MarketReloadOptions) => void;
25
22
  readonly onPending?: ((pending: boolean) => void) | undefined;
26
23
  readonly updates?: ModuleUpdateMap | undefined;
27
24
  readonly modulesCheck?: VersionsCheck | undefined;
@@ -38,23 +35,4 @@ export interface MarketViewProps {
38
35
  readonly defaults?: readonly string[] | undefined;
39
36
  readonly changed?: Readonly<Record<string, number>> | undefined;
40
37
  }
41
- export declare function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, checks, onRecheck, rechecking, runtimePluginMarket, }: {
42
- readonly t: Translate;
43
- readonly runtimePluginMarket?: boolean | undefined;
44
- readonly self: MarketRow | undefined;
45
- readonly shown: readonly MarketRow[];
46
- readonly pluginList: readonly MarketRow[];
47
- readonly installedList: readonly MarketRow[];
48
- readonly shared: readonly SharedRow[];
49
- readonly pending: Pending | null;
50
- readonly failed: MarketFailure | null;
51
- readonly notice: string | null;
52
- readonly act: (id: string, action: MarketRowAction) => Promise<void>;
53
- readonly onConfirming: (id: string | null) => void;
54
- readonly setDefault: (id: string, next: boolean) => Promise<void>;
55
- readonly boardBusy: boolean;
56
- readonly checks: Readonly<Record<VersionsPart, ReactNode>>;
57
- readonly onRecheck: () => void;
58
- readonly rechecking: boolean;
59
- }): JSX.Element;
60
38
  export declare function MarketView({ t, titleOf, manifests, installable, capabilities, runtimePluginMarket, freshness, onChanged, onPending, updates, modulesCheck, pluginsCheck, onCheck, installed, installedRead, workbench, selfUpdate, plugins, settling, installing, mock, defaults, changed, }: MarketViewProps): JSX.Element;
@@ -2,6 +2,7 @@ import type { Translate, WriteOutcome } from '@dsh-workbench/shared';
2
2
  import type { MarketFailure, MarketRow } from './market-row-types';
3
3
  import { type MarketRowAction } from './market-rows';
4
4
  import { type HeldRow, type Pending } from './market-view-text';
5
+ import type { MarketReloadOptions } from '../market/use-market-reload';
5
6
  export interface MarketActSeats {
6
7
  readonly setPending: (next: Pending | null) => void;
7
8
  readonly setHeld: (next: HeldRow | undefined) => void;
@@ -15,8 +16,6 @@ export interface MarketActOptions {
15
16
  readonly rowOf: (id: string) => MarketRow | undefined;
16
17
  readonly seats: MarketActSeats;
17
18
  readonly send: (body: Record<string, unknown>) => Promise<WriteOutcome<unknown>>;
18
- readonly onChanged: (options?: {
19
- readonly force?: boolean;
20
- }) => void;
19
+ readonly onChanged: (options?: MarketReloadOptions) => void;
21
20
  }
22
21
  export declare function marketActOf(options: MarketActOptions): (id: string, action: MarketRowAction) => Promise<void>;
@@ -0,0 +1,25 @@
1
+ import type { ReactNode, Translate } from '@dsh-workbench/shared';
2
+ import type { MarketFailure, MarketRow, MarketRowAction } from './market-row-types';
3
+ import type { SharedRow } from './market-shared-rows';
4
+ import type { Pending } from './market-view-text';
5
+ import type { VersionsPart } from '../market/use-module-versions';
6
+ export declare function MarketBody({ t, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, checks, onRecheck, rechecking, runtimePluginMarket, onOpenDetail, }: {
7
+ readonly t: Translate;
8
+ readonly runtimePluginMarket?: boolean | undefined;
9
+ readonly self: MarketRow | undefined;
10
+ readonly shown: readonly MarketRow[];
11
+ readonly pluginList: readonly MarketRow[];
12
+ readonly installedList: readonly MarketRow[];
13
+ readonly shared: readonly SharedRow[];
14
+ readonly pending: Pending | null;
15
+ readonly failed: MarketFailure | null;
16
+ readonly notice: string | null;
17
+ readonly act: (id: string, action: MarketRowAction) => Promise<void>;
18
+ readonly onConfirming: (id: string | null) => void;
19
+ readonly setDefault: (id: string, next: boolean) => Promise<void>;
20
+ readonly boardBusy: boolean;
21
+ readonly checks: Readonly<Record<VersionsPart, ReactNode>>;
22
+ readonly onRecheck: () => void;
23
+ readonly rechecking: boolean;
24
+ readonly onOpenDetail?: ((id: string) => void) | undefined;
25
+ }): JSX.Element;
@@ -0,0 +1,14 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ import type { MarketRow } from './market-row-types';
3
+ export interface MarketDetailFact {
4
+ readonly labelKey: string;
5
+ readonly value: string;
6
+ readonly code?: boolean;
7
+ }
8
+ export declare function isDirectSourceSpec(spec: string): boolean;
9
+ export declare function localPathOf(row: MarketRow): string | undefined;
10
+ export declare function installSourceOf(row: MarketRow, t: Translate): {
11
+ readonly text: string;
12
+ readonly code: boolean;
13
+ };
14
+ export declare function marketDetailFacts(row: MarketRow, t: Translate): readonly MarketDetailFact[];
@@ -0,0 +1,20 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ import type { MarketFailure, MarketRow, MarketRowAction } from './market-row-types';
3
+ import type { Pending } from './market-view-text';
4
+ export declare function MarketDetailPage({ t, row, pending, failure, notice, boardBusy, confirming, confirmingRow, rowById, onBack, onConfirming, onDefault, onAct, onRecheck, rechecking, }: {
5
+ readonly t: Translate;
6
+ readonly row: MarketRow;
7
+ readonly pending: Pending | null;
8
+ readonly failure: MarketFailure | null;
9
+ readonly notice: string | null;
10
+ readonly boardBusy?: boolean | undefined;
11
+ readonly confirming: string | null;
12
+ readonly confirmingRow: MarketRow | undefined;
13
+ readonly rowById: ReadonlyMap<string, MarketRow>;
14
+ readonly onBack: () => void;
15
+ readonly onConfirming: (id: string | null) => void;
16
+ readonly onDefault: (id: string, next: boolean) => Promise<void>;
17
+ readonly onAct: (id: string, action: MarketRowAction) => Promise<void>;
18
+ readonly onRecheck: () => void;
19
+ readonly rechecking: boolean;
20
+ }): JSX.Element;
@@ -0,0 +1,17 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ import type { MarketFailure, MarketRow, MarketRowAction } from './market-row-types';
3
+ import type { Pending } from './market-view-text';
4
+ export interface MarketDetailProps {
5
+ readonly t: Translate;
6
+ readonly row: MarketRow;
7
+ readonly pending: Pending | null;
8
+ readonly failure: MarketFailure | null;
9
+ readonly notice: string | null;
10
+ readonly boardBusy?: boolean | undefined;
11
+ readonly onBack: () => void;
12
+ readonly onRequest: (action: MarketRowAction) => void;
13
+ readonly onDefault?: ((next: boolean) => void) | undefined;
14
+ readonly onRecheck: () => void;
15
+ readonly rechecking: boolean;
16
+ }
17
+ export declare function MarketDetail({ t, row, pending, failure, notice, boardBusy, onBack, onRequest, onDefault, onRecheck, rechecking, }: MarketDetailProps): JSX.Element;
@@ -22,6 +22,9 @@ export interface ModuleUpdate {
22
22
  readonly local?: boolean;
23
23
  readonly blocked?: ModuleUpdateBlock;
24
24
  readonly market?: MarketInstalledModule;
25
+ readonly pkg?: string;
26
+ readonly spec?: string;
27
+ readonly registry?: string;
25
28
  }
26
29
  export interface MarketFollowUp {
27
30
  readonly id: string;
@@ -53,4 +56,8 @@ export interface MarketRow {
53
56
  readonly defaultChanged?: number;
54
57
  readonly broken?: boolean;
55
58
  readonly followUp?: MarketFollowUp;
59
+ readonly spec?: string;
60
+ readonly registry?: string;
61
+ readonly installedAt?: string;
62
+ readonly removeViaBundle?: boolean;
56
63
  }
@@ -25,6 +25,8 @@ export interface InstalledWorkbenchModule {
25
25
  readonly refused?: readonly string[] | undefined;
26
26
  readonly clientRefused?: readonly string[] | undefined;
27
27
  readonly market?: MarketInstalledModule | undefined;
28
+ readonly spec?: string | undefined;
29
+ readonly registry?: string | undefined;
28
30
  }
29
31
  export declare function withClientRefusals(modules: readonly InstalledWorkbenchModule[], refusals: readonly {
30
32
  readonly unit: string;
@@ -0,0 +1,33 @@
1
+ import type { ReactNode, Translate } from '@dsh-workbench/shared';
2
+ import type { MarketFailure, MarketRow, MarketRowAction } from './market-row-types';
3
+ import type { SharedRow } from './market-shared-rows';
4
+ import type { VersionsPart } from '../market/use-module-versions';
5
+ import type { Pending } from './market-view-text';
6
+ export declare function MarketSceneView({ t, runtimePluginMarket, self, shown, pluginList, installedList, shared, pending, failed, notice, act, onConfirming, setDefault, boardBusy, checks, onRecheck, rechecking, onOpenDetail, detailRow, confirming, confirmingRow, rowById, settled, nothing, settlingSize, onBack, }: {
7
+ readonly t: Translate;
8
+ readonly runtimePluginMarket?: boolean | undefined;
9
+ readonly self: MarketRow | undefined;
10
+ readonly shown: readonly MarketRow[];
11
+ readonly pluginList: readonly MarketRow[];
12
+ readonly installedList: readonly MarketRow[];
13
+ readonly shared: readonly SharedRow[];
14
+ readonly pending: Pending | null;
15
+ readonly failed: MarketFailure | null;
16
+ readonly notice: string | null;
17
+ readonly act: (id: string, action: MarketRowAction) => Promise<void>;
18
+ readonly onConfirming: (id: string | null) => void;
19
+ readonly setDefault: (id: string, next: boolean) => Promise<void>;
20
+ readonly boardBusy: boolean;
21
+ readonly checks: Readonly<Record<VersionsPart, ReactNode>>;
22
+ readonly onRecheck: () => void;
23
+ readonly rechecking: boolean;
24
+ readonly onOpenDetail: (id: string) => void;
25
+ readonly detailRow: MarketRow | undefined;
26
+ readonly confirming: string | null;
27
+ readonly confirmingRow: MarketRow | undefined;
28
+ readonly rowById: ReadonlyMap<string, MarketRow>;
29
+ readonly settled: boolean;
30
+ readonly nothing: boolean;
31
+ readonly settlingSize: number;
32
+ readonly onBack: () => void;
33
+ }): JSX.Element;
@@ -1,9 +1,27 @@
1
1
  import type { ReactNode, Translate } from '@dsh-workbench/shared';
2
- import type { MarketFailure, MarketRow } from './market-row-types';
3
- import { type MarketRowAction } from './market-rows';
4
- import type { MarketSectionIcon } from './market-section-icon';
2
+ import type { MarketFailure, MarketRow, MarketRowAction } from './market-row-types';
5
3
  import { type Pending } from './market-view-text';
6
- export declare function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, boardBusy, headAction, keepHead, onRecheck, rechecking, }: {
4
+ import type { MarketSectionIcon } from './market-section-icon';
5
+ export declare function MarketLineStatus({ t, row, quiet, }: {
6
+ readonly t: Translate;
7
+ readonly row: MarketRow;
8
+ readonly quiet: boolean;
9
+ }): JSX.Element | null;
10
+ export declare function MarketRowFailure({ t, failure, onRecheck, rechecking, }: {
11
+ readonly t: Translate;
12
+ readonly failure: MarketFailure | null;
13
+ readonly onRecheck: () => void;
14
+ readonly rechecking: boolean;
15
+ }): JSX.Element | null;
16
+ export declare function MarketRowControls({ t, row, pending, boardBusy, onRequest, onDefault, }: {
17
+ readonly t: Translate;
18
+ readonly row: MarketRow;
19
+ readonly pending: Pending | null;
20
+ readonly boardBusy?: boolean | undefined;
21
+ readonly onRequest: (action: MarketRowAction) => void;
22
+ readonly onDefault?: ((next: boolean) => void) | undefined;
23
+ }): JSX.Element;
24
+ export declare function MarketSection({ t, titleKey, icon, rows, pending, failureOf, act, confirmActions, onConfirming, onDefault, onOpenDetail, boardBusy, headAction, keepHead, onRecheck, rechecking, }: {
7
25
  readonly t: Translate;
8
26
  readonly titleKey?: string;
9
27
  readonly icon?: MarketSectionIcon;
@@ -12,6 +30,7 @@ export declare function MarketSection({ t, titleKey, icon, rows, pending, failur
12
30
  readonly failureOf: (id: string) => MarketFailure | null;
13
31
  readonly act: (id: string, action: MarketRowAction) => Promise<void>;
14
32
  readonly onDefault?: ((id: string, next: boolean) => void) | undefined;
33
+ readonly onOpenDetail?: ((id: string) => void) | undefined;
15
34
  readonly boardBusy?: boolean | undefined;
16
35
  readonly confirmActions: readonly MarketRowAction[];
17
36
  readonly onConfirming: (id: string | null) => void;
@@ -34,6 +34,7 @@ export declare function heldIdOf(pending: Pending | null, held: HeldRow | undefi
34
34
  export declare function pinnedRowOf(pending: Pending | null, held: HeldRow | undefined): MarketRow | undefined;
35
35
  export declare function withPinnedRow(rows: readonly MarketRow[], pinned: MarketRow | undefined): MarketRow[];
36
36
  export declare function marketFootVisible(shown: readonly MarketRow[], installed: readonly MarketRow[]): boolean;
37
+ export declare function marketRowMap(shown: readonly MarketRow[], self: MarketRow | undefined, installed: readonly MarketRow[], plugins: readonly MarketRow[]): ReadonlyMap<string, MarketRow>;
37
38
  export declare function marketNamesOf(t: Translate, modules: readonly NameSource[], titleOf: TitleResolve, mocked: boolean): MarketNameMap;
38
39
  export interface HeldRowControl {
39
40
  readonly held: HeldRow | undefined;
@@ -6,6 +6,7 @@ export declare function installedPlugins(options: {
6
6
  readonly ledger: PluginLedger;
7
7
  readonly shell?: DshShell | undefined;
8
8
  readonly force?: boolean;
9
+ readonly check?: boolean;
9
10
  readonly supply?: SupplyPort | undefined;
10
11
  }): Promise<readonly InstalledPlugin[]>;
11
12
  export declare function pluginRoutes(options: {
@@ -6,6 +6,8 @@ export interface InstalledPlugin {
6
6
  readonly latest?: string;
7
7
  readonly local?: boolean;
8
8
  readonly broken?: boolean;
9
+ readonly registry?: string;
10
+ readonly installedAt?: string;
9
11
  }
10
12
  export interface InstalledPluginsPayload {
11
13
  readonly plugins: readonly InstalledPlugin[];
@@ -3,5 +3,5 @@ import { type BundleInspectionPayload, type BundleRegistriesPayload, type Module
3
3
  import { type InstalledPluginsPayload } from '../api/installed-plugins';
4
4
  export declare function readBundleRegistries(): Promise<ApiResponse<BundleRegistriesPayload>>;
5
5
  export declare function readBundleInspection(spec: string, registry?: string): Promise<ApiResponse<BundleInspectionPayload>>;
6
- export declare function readModuleVersions(force?: boolean): Promise<ApiResponse<ModuleVersionsPayload>>;
7
- export declare function readInstalledPlugins(force?: boolean): Promise<ApiResponse<InstalledPluginsPayload>>;
6
+ export declare function readModuleVersions(force?: boolean, check?: boolean): Promise<ApiResponse<ModuleVersionsPayload>>;
7
+ export declare function readInstalledPlugins(force?: boolean, check?: boolean): Promise<ApiResponse<InstalledPluginsPayload>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/core",
3
- "version": "1.1.10",
3
+ "version": "1.1.12",
4
4
  "description": "个人工作台:Agent 工作台(左栏 + 常驻对话 + 自研右侧数据面板)。",
5
5
  "type": "module",
6
6
  "icon": "./icon.svg",
@@ -76,7 +76,7 @@
76
76
  }
77
77
  },
78
78
  "devDependencies": {
79
- "@arch-guard/core": "^0.11.1",
79
+ "@arch-guard/core": "^0.11.2",
80
80
  "@deepseek-ai/dsh-client-ui-primitives": "0.2.1-rc.2",
81
81
  "@types/node": "^24.19.0",
82
82
  "@types/proper-lockfile": "^4.1.4",
@@ -100,8 +100,8 @@
100
100
  "proper-lockfile": "^4.1.2",
101
101
  "which": "^7.0.0",
102
102
  "write-file-atomic": "^8.0.0",
103
- "@dsh-workbench/shared": "1.1.10",
104
- "@dsh-workbench/adapters-default": "1.1.10"
103
+ "@dsh-workbench/adapters-default": "1.1.12",
104
+ "@dsh-workbench/shared": "1.1.12"
105
105
  },
106
106
  "license": "MIT",
107
107
  "repository": {