@dsh-workbench/core 1.1.2 → 1.1.3

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.
@@ -4545,6 +4545,7 @@ function checkVersionRange(contract, version) {
4545
4545
  }
4546
4546
  var MARKET_DISCOVER_ROUTE = "panels/market-discover";
4547
4547
  var MARKET_DOC_ROUTE = "panels/market-doc";
4548
+ var MARKET_GIT_PROBE_ROUTE = "panels/git-probe";
4548
4549
  var MARKET_PUBLISH_PREVIEW_ROUTE = "panels/market-publish-preview";
4549
4550
  var MARKET_SOURCES_RESOURCE = "market-sources";
4550
4551
  var MARKET_SOURCES_ROUTE = "panels/market-sources";
@@ -5533,6 +5534,80 @@ function bundleInspectHandler(ctx) {
5533
5534
  };
5534
5535
  }
5535
5536
  //#endregion
5537
+ //#region src/shared/api/host/git-exec.ts
5538
+ var NO_PROMPT_ENV = [
5539
+ "GIT_TERMINAL_PROMPT=0",
5540
+ "GIT_ASKPASS=/usr/bin/false",
5541
+ "SSH_ASKPASS=/usr/bin/false",
5542
+ "SSH_ASKPASS_REQUIRE=never",
5543
+ "GCM_INTERACTIVE=never",
5544
+ "GIT_SSH_COMMAND=ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new"
5545
+ ];
5546
+ function gitNoPromptPrefix() {
5547
+ return [quoteShellArg("env"), ...NO_PROMPT_ENV.map((one) => quoteShellArg(one))].join(" ");
5548
+ }
5549
+ function withoutAskpassNoise(text) {
5550
+ return text.split("\n").filter((line) => !/unable to read askpass response/i.test(line)).join("\n").trim();
5551
+ }
5552
+ //#endregion
5553
+ //#region src/shared/api/host/git-probe.ts
5554
+ var PROBE_TIMEOUT_MS = 1e4;
5555
+ var AUTH_TEXT = /authentication failed|could not read (username|password)|permission denied|terminal prompts disabled|host key verification failed|repository not found|no such identity|access denied|unauthorized|forbidden/;
5556
+ function classifyGitProbe(stderr, timedOut) {
5557
+ if (timedOut) return "unreachable";
5558
+ return AUTH_TEXT.test(stderr.toLowerCase()) ? "auth" : "unreachable";
5559
+ }
5560
+ async function probeGitAddress(shell, url, options = {}) {
5561
+ const line = [
5562
+ gitNoPromptPrefix(),
5563
+ quoteShellArg("git"),
5564
+ quoteShellArg("ls-remote"),
5565
+ quoteShellArg(url),
5566
+ quoteShellArg("HEAD")
5567
+ ].join(" ");
5568
+ let result;
5569
+ try {
5570
+ result = await runShell(shell, line, { timeoutMs: options.timeoutMs ?? PROBE_TIMEOUT_MS });
5571
+ } catch (error) {
5572
+ return {
5573
+ status: "unreachable",
5574
+ detail: error instanceof Error ? error.message : String(error)
5575
+ };
5576
+ }
5577
+ if (result.exitCode === 0) return { status: "ok" };
5578
+ const detail = tailLines(withoutAskpassNoise(result.stderr || result.stdout), 3);
5579
+ return {
5580
+ status: classifyGitProbe(`${result.stderr}\n${result.stdout}`, result.timedOut),
5581
+ ...detail === "" ? {} : { detail }
5582
+ };
5583
+ }
5584
+ //#endregion
5585
+ //#region src/shared/api/host/git-routes.ts
5586
+ function gitProbeHandler(ctx) {
5587
+ return async (search) => {
5588
+ const url = param(search, "url");
5589
+ if (url === void 0) return {
5590
+ ok: false,
5591
+ error: {
5592
+ code: "workbench/no-url",
5593
+ message: "要探哪个地址?缺 url。"
5594
+ }
5595
+ };
5596
+ const shell = ctx.get("shell");
5597
+ if (shell === void 0) return {
5598
+ ok: false,
5599
+ error: {
5600
+ code: "workbench/no-shell",
5601
+ message: "这台机器上没有执行缝,探不了 git 地址"
5602
+ }
5603
+ };
5604
+ return {
5605
+ ok: true,
5606
+ ...await probeGitAddress(shell, url)
5607
+ };
5608
+ };
5609
+ }
5610
+ //#endregion
5536
5611
  //#region src/shared/api/host/host-routes.ts
5537
5612
  function createHostRoutes(input) {
5538
5613
  const { ctx, facts, opencli, running, profile } = input;
@@ -5542,6 +5617,7 @@ function createHostRoutes(input) {
5542
5617
  [DSH_PLUGINS_ROUTE]: profile.dshPlugins(ctx),
5543
5618
  [BUNDLE_REGISTRIES_ROUTE]: bundleRegistriesHandler(ctx),
5544
5619
  [BUNDLE_INSPECT_ROUTE]: bundleInspectHandler(ctx),
5620
+ [MARKET_GIT_PROBE_ROUTE]: gitProbeHandler(ctx),
5545
5621
  [MODULE_VERSIONS_ROUTE]: moduleVersionsHandler(ctx, ctx.get("shell"), running, () => profile.selfUpdateView(dshHome(), basename(profile.dirOf(ctx) ?? "")))
5546
5622
  };
5547
5623
  }
@@ -13075,7 +13151,6 @@ function publishPreviewRoutes(workshop, inferredAuthorOf = async () => void 0) {
13075
13151
  var DEFAULT_TTL_MS = 3e5;
13076
13152
  var DEFAULT_TIMEOUT_MS$2 = 3e4;
13077
13153
  var DEFAULT_MAX_BYTES$1 = 4194304;
13078
- var GIT_NO_PROMPT = `${quoteShellArg("env")} GIT_TERMINAL_PROMPT=0`;
13079
13154
  function messageOf$1(error) {
13080
13155
  return error instanceof Error ? error.message : String(error);
13081
13156
  }
@@ -13137,7 +13212,7 @@ function gitProblemOf(source) {
13137
13212
  };
13138
13213
  }
13139
13214
  function tail(text) {
13140
- return text.trim().split("\n").filter((line) => line !== "").slice(-3).join(" ");
13215
+ return withoutAskpassNoise(text).split("\n").filter((line) => line !== "").slice(-3).join(" ");
13141
13216
  }
13142
13217
  function classifyGitError(stderr, timedOut) {
13143
13218
  if (timedOut) return {
@@ -13241,7 +13316,7 @@ function createMarketIndexReader(options) {
13241
13316
  }
13242
13317
  };
13243
13318
  try {
13244
- const result = await runShell(shell, `${GIT_NO_PROMPT} ${line}`, { timeoutMs });
13319
+ const result = await runShell(shell, `${gitNoPromptPrefix()} ${line}`, { timeoutMs });
13245
13320
  if (result.exitCode !== 0) return {
13246
13321
  ok: false,
13247
13322
  problem: classifyGitError(result.stderr, result.timedOut),
@@ -9,6 +9,6 @@ export interface DiscoverConfirmProps {
9
9
  readonly locale: string;
10
10
  readonly choice: DiscoverChoice | null;
11
11
  readonly onCancel: () => void;
12
- readonly onConfirm: () => void;
12
+ readonly onConfirm: (url?: string) => void;
13
13
  }
14
14
  export declare function DiscoverConfirm({ t, locale, choice, onCancel, onConfirm }: DiscoverConfirmProps): JSX.Element | null;
@@ -8,5 +8,6 @@ export interface DiscoverDetailProps {
8
8
  readonly onBack: () => void;
9
9
  readonly onInstall: (entry: DiscoverEntry, version: DiscoverVersionRow) => void;
10
10
  readonly onShowInstalled: (name: string) => void;
11
+ readonly installDisabled?: boolean;
11
12
  }
12
13
  export declare function DiscoverDetail(props: DiscoverDetailProps): JSX.Element;
@@ -0,0 +1,8 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ export interface DiscoverInstallingProps {
3
+ readonly t: Translate;
4
+ readonly name: string;
5
+ readonly cancelling: boolean;
6
+ readonly onCancel: () => void;
7
+ }
8
+ export declare function DiscoverInstalling({ t, name, cancelling, onCancel }: DiscoverInstallingProps): JSX.Element;
@@ -7,6 +7,7 @@ export interface DiscoverRowsProps {
7
7
  readonly onOpen: (name: string) => void;
8
8
  readonly onInstall: (entry: DiscoverEntry, version: DiscoverVersionRow) => void;
9
9
  readonly onShowInstalled: (name: string) => void;
10
+ readonly installDisabled?: boolean;
10
11
  }
11
12
  export declare function canInstall(version: DiscoverVersionRow | undefined): boolean;
12
13
  export declare function sourceTextOf(t: Translate, version: DiscoverVersionRow): string;
@@ -14,11 +15,12 @@ export declare function MarketIcon({ src, size }: {
14
15
  readonly src?: string | undefined;
15
16
  readonly size?: number;
16
17
  }): JSX.Element;
17
- export declare function EntryAction({ t, entry, title, onInstall, onShowInstalled, }: {
18
+ export declare function EntryAction({ t, entry, title, onInstall, onShowInstalled, installDisabled, }: {
18
19
  readonly t: Translate;
19
20
  readonly entry: DiscoverEntry;
20
21
  readonly title: string;
21
22
  readonly onInstall: (entry: DiscoverEntry, version: DiscoverVersionRow) => void;
22
23
  readonly onShowInstalled: (name: string) => void;
24
+ readonly installDisabled?: boolean;
23
25
  }): JSX.Element | null;
24
- export declare function DiscoverRows({ t, locale, entries, onOpen, onInstall, onShowInstalled }: DiscoverRowsProps): JSX.Element;
26
+ export declare function DiscoverRows({ t, locale, entries, onOpen, onInstall, onShowInstalled, installDisabled }: DiscoverRowsProps): JSX.Element;
@@ -23,3 +23,9 @@ export declare function DiscoverNoSource({ t, onAdd }: {
23
23
  readonly t: Translate;
24
24
  readonly onAdd: () => void;
25
25
  }): JSX.Element;
26
+ export declare function DiscoverReadFailure({ t, text, auth, onRetry, }: {
27
+ readonly t: Translate;
28
+ readonly text: string;
29
+ readonly auth: boolean;
30
+ readonly onRetry: () => void;
31
+ }): JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { Translate } from '@dsh-workbench/shared';
2
+ import type { GitTransportState } from './use-git-transport';
3
+ export interface DiscoverTransportProps {
4
+ readonly t: Translate;
5
+ readonly transport: GitTransportState;
6
+ }
7
+ export declare function DiscoverTransport({ t, transport }: DiscoverTransportProps): JSX.Element;
@@ -5,5 +5,6 @@ export interface DiscoverVersionsProps {
5
5
  readonly locale: string;
6
6
  readonly entry: DiscoverEntry;
7
7
  readonly onInstall: (entry: DiscoverEntry, version: DiscoverVersionRow) => void;
8
+ readonly installDisabled?: boolean;
8
9
  }
9
- export declare function DiscoverVersions({ t, locale, entry, onInstall }: DiscoverVersionsProps): JSX.Element;
10
+ export declare function DiscoverVersions({ t, locale, entry, onInstall, installDisabled }: DiscoverVersionsProps): JSX.Element;
@@ -7,6 +7,8 @@ interface InstallTarget {
7
7
  }
8
8
  export type InstallVerdict = {
9
9
  readonly kind: 'done';
10
+ } | {
11
+ readonly kind: 'cancelled';
10
12
  } | {
11
13
  readonly kind: 'failed';
12
14
  readonly text: string;
@@ -38,10 +40,14 @@ export interface DiscoverController {
38
40
  readonly writeFailed: string | null;
39
41
  readonly provisionFailed: string | null;
40
42
  readonly busy: boolean;
43
+ readonly installing: string | null;
44
+ readonly cancelling: boolean;
45
+ readonly installDisabled: boolean;
41
46
  readonly addingSource: boolean;
42
47
  readonly manageOpen: boolean;
43
48
  readonly problem: {
44
49
  readonly id: string;
50
+ readonly kind: string;
45
51
  readonly detail: string;
46
52
  } | null;
47
53
  readonly uninitialized: {
@@ -70,7 +76,8 @@ export interface DiscoverController {
70
76
  readonly addSource: (url: string) => void;
71
77
  readonly removeSourceById: (id: string) => void;
72
78
  readonly selectSource: (id: string) => void;
73
- readonly install: () => void;
79
+ readonly install: (url?: string) => void;
80
+ readonly cancelInstall: () => void;
74
81
  }
75
82
  export declare function useDiscover(t: Translate, active: boolean, onInstalled: () => void): DiscoverController;
76
83
  export type { InstallTarget };
@@ -0,0 +1,19 @@
1
+ import type { GitProbeStatus, MarketIndexGitSource } from '../../../kernel/contract/market-index';
2
+ export type TransportProbe = GitProbeStatus | 'checking' | 'unknown';
3
+ export interface GitTransportRow {
4
+ readonly kind: 'https' | 'ssh';
5
+ readonly url: string;
6
+ }
7
+ export interface GitTransportState {
8
+ readonly rows: readonly GitTransportRow[];
9
+ readonly chosen: string | null;
10
+ readonly states: Readonly<Record<string, TransportProbe>>;
11
+ readonly custom: string;
12
+ readonly customState: TransportProbe | null;
13
+ readonly probing: boolean;
14
+ readonly ready: boolean;
15
+ setChosen(url: string): void;
16
+ setCustom(value: string): void;
17
+ checkCustom(): void;
18
+ }
19
+ export declare function useGitTransport(source: MarketIndexGitSource | null): GitTransportState;
@@ -6,6 +6,7 @@ export interface ModuleVersionsState {
6
6
  readonly workbench: WorkbenchVersion | null;
7
7
  readonly selfUpdate: WorkbenchSelfUpdate | null;
8
8
  readonly read: boolean;
9
+ readonly checking: boolean;
9
10
  readonly checkedAt: number | null;
10
11
  }
11
12
  export interface ModuleVersionsView extends ModuleVersionsState {
@@ -1,2 +1,2 @@
1
- export { MARKET_DISCOVER_ROUTE, MARKET_DOC_ROUTE, MARKET_INDEX_FORMAT, MARKET_INDEX_PATH, MARKET_PUBLISH_PREVIEW_ROUTE, MARKET_SOURCES_RESOURCE, MARKET_SOURCES_ROUTE, MARKET_WORKBENCH_LABEL, } from '@dsh-workbench/shared/contract/protocol/market-index';
2
- export type { DiscoverCompat, DiscoverDoc, DiscoverDocKind, DiscoverEntry, DiscoverFilter, DiscoverInstallState, DiscoverPayload, DiscoverProblem, DiscoverSourceRow, DiscoverState, DiscoverVersionRow, IndexSourceSpec, MarketClaim, MarketIndex, MarketIndexCategory, MarketIndexEngines, MarketIndexEntry, MarketIndexEntryMetadata, MarketIndexGitSource, MarketIndexLabel, MarketIndexMetadata, MarketIndexNpmSource, MarketIndexParse, MarketIndexProblem, MarketIndexProblemKind, MarketIndexSortKey, MarketIndexSource, MarketIndexVersion, MarketLocalizedText, MarketPublishDestination, MarketSourceConfig, MarketSourceKind, MarketSourcePolicy, MarketSourcesAction, MarketSourcesPayload, PublishChangelog, PublishPreview, } from '@dsh-workbench/shared/contract/protocol/market-index';
1
+ export { MARKET_DISCOVER_ROUTE, MARKET_DOC_ROUTE, MARKET_GIT_PROBE_ROUTE, MARKET_INDEX_FORMAT, MARKET_INDEX_PATH, MARKET_PUBLISH_PREVIEW_ROUTE, MARKET_SOURCES_RESOURCE, MARKET_SOURCES_ROUTE, MARKET_WORKBENCH_LABEL, } from '@dsh-workbench/shared/contract/protocol/market-index';
2
+ export type { DiscoverCompat, DiscoverDoc, DiscoverDocKind, DiscoverEntry, DiscoverFilter, DiscoverInstallState, DiscoverPayload, DiscoverProblem, DiscoverSourceRow, DiscoverState, DiscoverVersionRow, GitProbePayload, GitProbeStatus, IndexSourceSpec, MarketClaim, MarketIndex, MarketIndexCategory, MarketIndexEngines, MarketIndexEntry, MarketIndexEntryMetadata, MarketIndexGitSource, MarketIndexLabel, MarketIndexMetadata, MarketIndexNpmSource, MarketIndexParse, MarketIndexProblem, MarketIndexProblemKind, MarketIndexSortKey, MarketIndexSource, MarketIndexVersion, MarketLocalizedText, MarketPublishDestination, MarketSourceConfig, MarketSourceKind, MarketSourcePolicy, MarketSourcesAction, MarketSourcesPayload, PublishChangelog, PublishPreview, } from '@dsh-workbench/shared/contract/protocol/market-index';
@@ -0,0 +1,2 @@
1
+ export declare function gitNoPromptPrefix(): string;
2
+ export declare function withoutAskpassNoise(text: string): string;
@@ -0,0 +1,6 @@
1
+ import type { DshShell } from '@dsh-workbench/shared';
2
+ import type { GitProbePayload, GitProbeStatus } from '../../../kernel/contract/market-index';
3
+ export declare function classifyGitProbe(stderr: string, timedOut: boolean): GitProbeStatus;
4
+ export declare function probeGitAddress(shell: DshShell, url: string, options?: {
5
+ readonly timeoutMs?: number;
6
+ }): Promise<GitProbePayload>;
@@ -0,0 +1,3 @@
1
+ import type { DshHostContext } from '@dsh-workbench/shared';
2
+ import { type RouteHandler } from '@dsh-workbench/shared/host';
3
+ export declare function gitProbeHandler(ctx: DshHostContext): RouteHandler;
@@ -1,9 +1,10 @@
1
1
  import type { ApiResponse } from '@dsh-workbench/shared';
2
- import { type DiscoverDoc, type DiscoverDocKind, type DiscoverPayload, type MarketSourcesPayload, type PublishPreview } from '../../kernel/contract/market-index';
2
+ import { type DiscoverDoc, type DiscoverDocKind, type DiscoverPayload, type GitProbePayload, type MarketSourcesPayload, type PublishPreview } from '../../kernel/contract/market-index';
3
3
  export declare function readMarketDiscover(options?: {
4
4
  readonly force?: boolean;
5
5
  }): Promise<ApiResponse<DiscoverPayload>>;
6
6
  export declare function readMarketSources(): Promise<ApiResponse<MarketSourcesPayload>>;
7
+ export declare function readGitProbe(url: string): Promise<ApiResponse<GitProbePayload>>;
7
8
  export declare function readMarketDoc(name: string, version: string, kind: DiscoverDocKind): Promise<ApiResponse<{
8
9
  readonly doc: DiscoverDoc;
9
10
  }>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dsh-workbench/core",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "个人工作台:Agent 工作台(左栏 + 常驻对话 + 自研右侧数据面板)。",
5
5
  "type": "module",
6
6
  "icon": "./icon.svg",
@@ -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.2",
104
- "@dsh-workbench/adapters-default": "1.1.2"
103
+ "@dsh-workbench/shared": "1.1.3",
104
+ "@dsh-workbench/adapters-default": "1.1.3"
105
105
  },
106
106
  "license": "MIT",
107
107
  "repository": {