@deepseek-ai/dsh-experimental-client-ui-forge 0.0.0-stage → 0.2.2-alpha.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.
- package/LICENSE +21 -0
- package/README.i18n.yaml +37 -0
- package/README.md +142 -2
- package/README.zh.md +143 -0
- package/lib/client.js +11802 -0
- package/lib/index.js +3238 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +2502 -0
- package/lib/typert.remote-client.d.ts +85 -0
- package/lib/typert.remote-client.js +1538 -0
- package/lib/types/client/ActionToast.d.ts +14 -0
- package/lib/types/client/ChangeRequestCard.d.ts +56 -0
- package/lib/types/client/ChangedFiles.d.ts +36 -0
- package/lib/types/client/ChangesTab.d.ts +59 -0
- package/lib/types/client/ChangesTabTitle.d.ts +13 -0
- package/lib/types/client/DiffFile.d.ts +76 -0
- package/lib/types/client/FileLabel.d.ts +20 -0
- package/lib/types/client/FileTreePane.d.ts +15 -0
- package/lib/types/client/ForgeTab.d.ts +57 -0
- package/lib/types/client/ForgeTabTitle.d.ts +11 -0
- package/lib/types/client/HeaderButton.d.ts +27 -0
- package/lib/types/client/LocalChangesCard.d.ts +29 -0
- package/lib/types/client/RefreshGlyph.d.ts +18 -0
- package/lib/types/client/ReviewComposer.d.ts +40 -0
- package/lib/types/client/ReviewThread.d.ts +26 -0
- package/lib/types/client/SessionHoverForge.d.ts +20 -0
- package/lib/types/client/SessionRowForge.d.ts +39 -0
- package/lib/types/client/SubmitReview.d.ts +22 -0
- package/lib/types/client/WorktreeProgress.d.ts +44 -0
- package/lib/types/client/WorktreeToggle.d.ts +43 -0
- package/lib/types/client/changes-address.d.ts +70 -0
- package/lib/types/client/changes-store.d.ts +39 -0
- package/lib/types/client/checkout.d.ts +34 -0
- package/lib/types/client/code-selection.d.ts +23 -0
- package/lib/types/client/diff-rows.d.ts +96 -0
- package/lib/types/client/file-tree.d.ts +33 -0
- package/lib/types/client/format.d.ts +21 -0
- package/lib/types/client/glyphs.d.ts +33 -0
- package/lib/types/client/index.d.ts +25 -0
- package/lib/types/client/locales.d.ts +282 -0
- package/lib/types/client/mount.d.ts +17 -0
- package/lib/types/client/review-queue.d.ts +136 -0
- package/lib/types/client/review.d.ts +56 -0
- package/lib/types/client/session-list.d.ts +46 -0
- package/lib/types/client/source.d.ts +146 -0
- package/lib/types/client/status.d.ts +99 -0
- package/lib/types/diff.d.ts +32 -0
- package/lib/types/git.d.ts +93 -0
- package/lib/types/index.d.ts +296 -0
- package/lib/types/local-diff.d.ts +100 -0
- package/lib/types/panel.d.ts +135 -0
- package/lib/types/parse.d.ts +57 -0
- package/lib/types/patch-cache.d.ts +33 -0
- package/lib/types/states.d.ts +95 -0
- package/lib/types/types.d.ts +399 -0
- package/lib/types/worktree.d.ts +225 -0
- package/locale/de.json +6 -0
- package/locale/en.json +6 -0
- package/locale/es.json +6 -0
- package/locale/fr.json +6 -0
- package/locale/ja.json +6 -0
- package/locale/pt.json +6 -0
- package/locale/ru.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +123 -3
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** App-wide notice for forge panel actions, rendered outside the panel so it outlives it. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { InjectFace, PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { NS } from './locales.ts';
|
|
5
|
+
import type { NoticeSource } from './source.ts';
|
|
6
|
+
/** Full props of the `shell.overlay` entry. */
|
|
7
|
+
export type ActionToastProps = PropsLocale<typeof NS> & InjectFace<Omit<NoticeSource, 'report'>>;
|
|
8
|
+
/**
|
|
9
|
+
* Render the current notice: a success notice with its undo action, or a failure warning.
|
|
10
|
+
* @param props - notice hook, dismissal, and copy.
|
|
11
|
+
* @returns the toast, or nothing while no notice shows.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ActionToast({ useNotice, dismiss, t }: ActionToastProps): ReactNode;
|
|
14
|
+
//# sourceMappingURL=ActionToast.d.ts.map
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One change request as a card: its title links to the host, a one-line
|
|
3
|
+
* summary shows while collapsed, and while expanded one row per fact (checks,
|
|
4
|
+
* review, merge state, and the changed lines, which open its changes) above
|
|
5
|
+
* the ready-for-review or merge action.
|
|
6
|
+
*/
|
|
7
|
+
import { type ReactNode } from 'react';
|
|
8
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
9
|
+
import type { ChangeRequestSnapshot, MergeRequest } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
10
|
+
import type { ForgePanelChangeRequest } from '../types.ts';
|
|
11
|
+
import type { NS } from './locales.ts';
|
|
12
|
+
type Translate = PropsLocale<typeof NS>['t'];
|
|
13
|
+
/** What a card can do; a surface without a Session binding omits `remove`, `markReady`, `merge`, and `viewChanges`. */
|
|
14
|
+
export interface ChangeRequestActions {
|
|
15
|
+
/** Open a URL outside the app. */
|
|
16
|
+
readonly openLink: (url: string) => void;
|
|
17
|
+
/** Copy a URL to the clipboard. */
|
|
18
|
+
readonly copyLink: (url: string) => void;
|
|
19
|
+
/** Read the status again after a failed read. */
|
|
20
|
+
readonly retry: () => void;
|
|
21
|
+
/** Remove the change request from its Session. */
|
|
22
|
+
readonly remove?: ((entry: ForgePanelChangeRequest) => void) | undefined;
|
|
23
|
+
/** Mark a draft ready for review; settles once the outcome is reported. */
|
|
24
|
+
readonly markReady?: ((entry: ForgePanelChangeRequest) => Promise<void>) | undefined;
|
|
25
|
+
/** Merge the change request as `request` describes; settles once the outcome is reported. */
|
|
26
|
+
readonly merge?: ((entry: ForgePanelChangeRequest, request: MergeRequest) => Promise<void>) | undefined;
|
|
27
|
+
/** Load complete check details independently of polling; cancellation follows the open list. */
|
|
28
|
+
readonly readChecks?: ((url: string, headSha: string, signal: AbortSignal) => Promise<ChangeRequestSnapshot>) | undefined;
|
|
29
|
+
/** Open the changes view of the change request. */
|
|
30
|
+
readonly viewChanges?: ((entry: ForgePanelChangeRequest) => void) | undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Props of one change request card. */
|
|
33
|
+
export interface ChangeRequestCardProps {
|
|
34
|
+
/** Change request with its latest snapshot and polling result. */
|
|
35
|
+
readonly entry: ForgePanelChangeRequest;
|
|
36
|
+
/** Whether the details show. */
|
|
37
|
+
readonly expanded: boolean;
|
|
38
|
+
/** Show or hide the details. */
|
|
39
|
+
readonly onToggle: () => void;
|
|
40
|
+
/** Current epoch milliseconds for relative times. */
|
|
41
|
+
readonly now: number;
|
|
42
|
+
/** Card actions. */
|
|
43
|
+
readonly actions: ChangeRequestActions;
|
|
44
|
+
/** Active UI language for numeric formatting. */
|
|
45
|
+
readonly locale: string;
|
|
46
|
+
/** Forge panel copy. */
|
|
47
|
+
readonly t: Translate;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Render one change request.
|
|
51
|
+
* @param props - change request, expansion, current time, actions, and copy.
|
|
52
|
+
* @returns the card.
|
|
53
|
+
*/
|
|
54
|
+
export declare function ChangeRequestCard({ entry, expanded, onToggle, now, actions, locale, t }: ChangeRequestCardProps): ReactNode;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=ChangeRequestCard.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Changed-file navigation shared by the toolbar menu and wide diff pane, with a disclosure column on every row. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { ForgeDiffFile } from '../types.ts';
|
|
5
|
+
import type { NS } from './locales.ts';
|
|
6
|
+
/** Viewing choices remain owned by the changes tab while either navigation surface is hidden. */
|
|
7
|
+
export interface ChangedFilesState {
|
|
8
|
+
readonly query: string;
|
|
9
|
+
readonly collapsed: Readonly<Record<string, boolean>>;
|
|
10
|
+
readonly selected: string | null;
|
|
11
|
+
}
|
|
12
|
+
/** Data and actions of the changed-file navigator. */
|
|
13
|
+
export interface ChangedFilesProps extends PropsLocale<typeof NS> {
|
|
14
|
+
readonly files: readonly ForgeDiffFile[];
|
|
15
|
+
readonly state: ChangedFilesState;
|
|
16
|
+
readonly filter: (query: string) => void;
|
|
17
|
+
readonly toggle: (path: string) => void;
|
|
18
|
+
readonly jump: (path: string) => void;
|
|
19
|
+
/** A menu row participates in the shared menu's keyboard walk. */
|
|
20
|
+
readonly menu?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Render searchable directory navigation without reading file contents.
|
|
24
|
+
* @param props - changed files, per-tab choices, navigation actions, and localized copy.
|
|
25
|
+
* @returns the search field and matching branches.
|
|
26
|
+
*/
|
|
27
|
+
export declare function ChangedFiles(props: ChangedFilesProps): ReactNode;
|
|
28
|
+
/**
|
|
29
|
+
* Open directory navigation through the existing files toolbar entry.
|
|
30
|
+
* @param props - navigator data and whether its owning tab is visible.
|
|
31
|
+
* @returns the toolbar entry and its portalled menu.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ChangedFilesMenu({ visible, ...props }: ChangedFilesProps & {
|
|
34
|
+
readonly visible: boolean;
|
|
35
|
+
}): ReactNode;
|
|
36
|
+
//# sourceMappingURL=ChangedFiles.d.ts.map
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Body of the changes tab: the local changes of the Session's checkout in a
|
|
3
|
+
* chosen scope, or the changes of one of its change requests, as one list of
|
|
4
|
+
* file sections under a toolbar that jumps between files and switches the
|
|
5
|
+
* layout. The view reads the changes when it opens, on each navigation, on
|
|
6
|
+
* refresh, and when the change request's head or the checkout's `branch`
|
|
7
|
+
* scope summary changes; a read keeps the previous changes on screen until it settles.
|
|
8
|
+
*/
|
|
9
|
+
import { type ReactNode } from 'react';
|
|
10
|
+
import type { HostObservable, InjectFace, PropsLocale, PropsRuntime, PropsStore } from '@deepseek-ai/dsh-client-ui-slots';
|
|
11
|
+
import type { SidebarRightTabInfo } from '@deepseek-ai/dsh-client-ui-sidebar-right/client';
|
|
12
|
+
import type { RemoteResult } from '@deepseek-ai/dsh-typert-protocol';
|
|
13
|
+
import type { ForgeChangeRequestDiff, ForgeLocalDiff, ForgeLocalScope } from '../types.ts';
|
|
14
|
+
import type { ForgeReviewRequest, ForgeReviewResult } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
15
|
+
import { type ReviewQueue } from './review-queue.ts';
|
|
16
|
+
import type { ReviewSelection } from './review.ts';
|
|
17
|
+
import type { createChangesStore } from './changes-store.ts';
|
|
18
|
+
import type { ForgePanelKey, NS } from './locales.ts';
|
|
19
|
+
import type { PanelSnapshot } from './source.ts';
|
|
20
|
+
/** Business face of the changes tab body. */
|
|
21
|
+
export interface ChangesTabInjected {
|
|
22
|
+
/** Append a frozen comment to the main input without submitting it. */
|
|
23
|
+
readonly addReviewToInput: (selection: ReviewSelection) => boolean;
|
|
24
|
+
/** Records retained across Session switches and cleared when this tab occurrence closes. */
|
|
25
|
+
readonly reviewQueue: (tab: Pick<SidebarRightTabInfo['tab'], 'id' | 'signal'>) => ReviewQueue;
|
|
26
|
+
/** Publish one comment or a completed review; never retries mutations. */
|
|
27
|
+
readonly submitReview: (url: string, request: ForgeReviewRequest) => Promise<RemoteResult<ForgeReviewResult>>;
|
|
28
|
+
/** Panel source while visible; the renderer releases the subscription for an inactive key. */
|
|
29
|
+
readonly keyedHooks: {
|
|
30
|
+
readonly panel: (visibility: string) => HostObservable<PanelSnapshot> | undefined;
|
|
31
|
+
};
|
|
32
|
+
/** Open the panel stream again after it ended. */
|
|
33
|
+
readonly reconnect: () => void;
|
|
34
|
+
/** Read the local changes of one scope; `signal` aborts the read. */
|
|
35
|
+
readonly localDiff: (scope: ForgeLocalScope, signal: AbortSignal) => Promise<RemoteResult<ForgeLocalDiff>>;
|
|
36
|
+
/** Read the new side of one file in a local scope. */
|
|
37
|
+
readonly localText: (scope: ForgeLocalScope, path: string) => Promise<RemoteResult<string>>;
|
|
38
|
+
/** Read the changes of a change request by its binding URL; `signal` aborts the read. */
|
|
39
|
+
readonly changeRequestDiff: (url: string, signal: AbortSignal) => Promise<RemoteResult<ForgeChangeRequestDiff>>;
|
|
40
|
+
/** Read one file of a change request at a commit. */
|
|
41
|
+
readonly changeRequestText: (url: string, commit: string, path: string) => Promise<RemoteResult<string>>;
|
|
42
|
+
/** Open a URL outside the app. */
|
|
43
|
+
readonly openLink: (url: string) => void;
|
|
44
|
+
/** Copy a path to the clipboard and report the outcome. */
|
|
45
|
+
readonly copyPath: (path: string) => void;
|
|
46
|
+
/** Ask the Session's Agent to create a change request for its changes, reporting the outcome. */
|
|
47
|
+
readonly createChangeRequest: () => void;
|
|
48
|
+
/** Show a failure notice. */
|
|
49
|
+
readonly report: (key: ForgePanelKey, params?: Readonly<Record<string, string>>) => void;
|
|
50
|
+
}
|
|
51
|
+
/** Full props of the changes tab body. */
|
|
52
|
+
export type ChangesTabProps = Pick<PropsRuntime<'sidebar.right.pane.tab'>, 'useTabInfo' | 'sessionId'> & PropsStore<ReturnType<typeof createChangesStore>> & InjectFace<ChangesTabInjected> & PropsLocale<typeof NS>;
|
|
53
|
+
/**
|
|
54
|
+
* Render the changes tab of one Session.
|
|
55
|
+
* @param props - tab information, the tab's choices, the panel snapshot hook, reads and actions, and copy.
|
|
56
|
+
* @returns the view body.
|
|
57
|
+
*/
|
|
58
|
+
export declare function ChangesTab({ useTabInfo, sessionId, useStore, actions, usePanel, reconnect, localDiff, localText, changeRequestDiff, changeRequestText, openLink, copyPath, createChangeRequest, addReviewToInput, reviewQueue, submitReview, report, t, }: ChangesTabProps): ReactNode;
|
|
59
|
+
//# sourceMappingURL=ChangesTab.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Chip title of a changes tab: the changes icon and the view's name in the current language. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { NS } from './locales.ts';
|
|
5
|
+
/** Props of the changes tab title. */
|
|
6
|
+
export type ChangesTabTitleProps = Pick<PropsRuntime<'sidebar.right.pane.tab.title'>, 'useTabInfo'> & PropsLocale<typeof NS>;
|
|
7
|
+
/**
|
|
8
|
+
* Render the chip title of a changes tab; an address this package did not mint keeps the captured title.
|
|
9
|
+
* @param props - tab information and forge panel copy.
|
|
10
|
+
* @returns the icon followed by the title.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ChangesTabTitle({ useTabInfo, t }: ChangesTabTitleProps): ReactNode;
|
|
13
|
+
//# sourceMappingURL=ChangesTabTitle.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One file of the changes view: a sticky header with the path, badges, line
|
|
3
|
+
* counts, and file actions, then its hunks unified or side by side with the
|
|
4
|
+
* unchanged lines between them collapsed into rows that expand them.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode } from 'react';
|
|
7
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
8
|
+
import type { ForgeDiffFile } from '../types.ts';
|
|
9
|
+
import { type ReviewActions } from './ReviewComposer.tsx';
|
|
10
|
+
import type { ForgePanelKey, NS } from './locales.ts';
|
|
11
|
+
type Translate = PropsLocale<typeof NS>['t'];
|
|
12
|
+
/** One action of a file's menu. */
|
|
13
|
+
export interface DiffFileAction {
|
|
14
|
+
/** Dictionary key of the row label. */
|
|
15
|
+
readonly label: ForgePanelKey;
|
|
16
|
+
/** Runs the action. */
|
|
17
|
+
readonly run: () => void;
|
|
18
|
+
}
|
|
19
|
+
/** New side of a file: its lines once read, `loading` while a read runs, or undefined before any. */
|
|
20
|
+
export type DiffFileText = readonly string[] | 'loading' | undefined;
|
|
21
|
+
/** Props of one file section. */
|
|
22
|
+
export interface DiffFileProps {
|
|
23
|
+
/** Whether the owning tab is visible and may show temporary menus. */
|
|
24
|
+
readonly visible: boolean;
|
|
25
|
+
/** Comment destinations and the source being reviewed. */
|
|
26
|
+
readonly review?: ReviewActions;
|
|
27
|
+
/** The file and its hunks. */
|
|
28
|
+
readonly file: ForgeDiffFile;
|
|
29
|
+
/** Whether the section shows its lines. */
|
|
30
|
+
readonly expanded: boolean;
|
|
31
|
+
/** Expand or collapse the section. */
|
|
32
|
+
readonly onToggle: () => void;
|
|
33
|
+
/** Whether the file shows the large-file notice instead of its lines until revealed. */
|
|
34
|
+
readonly large: boolean;
|
|
35
|
+
/** Whether the user revealed a large file. */
|
|
36
|
+
readonly revealed: boolean;
|
|
37
|
+
/** Show a large file anyway. */
|
|
38
|
+
readonly onReveal: () => void;
|
|
39
|
+
/** The file's new side, which supplies collapsed unchanged lines. */
|
|
40
|
+
readonly text: DiffFileText;
|
|
41
|
+
/** Indexes of the expanded gaps. */
|
|
42
|
+
readonly open: ReadonlySet<number>;
|
|
43
|
+
/** Expand one gap. */
|
|
44
|
+
readonly onExpand: (index: number) => void;
|
|
45
|
+
/** Whether deletions and additions show in two columns; a file with only additions or only deletions keeps one. */
|
|
46
|
+
readonly split: boolean;
|
|
47
|
+
/** Whether long lines wrap. */
|
|
48
|
+
readonly wrap: boolean;
|
|
49
|
+
/** Badge text after the path, or empty for none. */
|
|
50
|
+
readonly badge: string;
|
|
51
|
+
/** Hover text of the path: both paths of a renamed file, else the path. */
|
|
52
|
+
readonly tooltip: string;
|
|
53
|
+
/** Rows of the file's menu. */
|
|
54
|
+
readonly actions: readonly DiffFileAction[];
|
|
55
|
+
/** Receives the section element, which scrolling to the file targets. */
|
|
56
|
+
readonly sectionRef: (element: HTMLElement | null) => void;
|
|
57
|
+
/** Forge panel copy. */
|
|
58
|
+
readonly t: Translate;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Render added and deleted line counts, or the binary label for binary content.
|
|
62
|
+
* @param props - the counts and copy.
|
|
63
|
+
* @returns the counts.
|
|
64
|
+
*/
|
|
65
|
+
export declare function Counts({ file, t }: {
|
|
66
|
+
readonly file: Pick<ForgeDiffFile, 'additions' | 'deletions' | 'binary'>;
|
|
67
|
+
readonly t: Translate;
|
|
68
|
+
}): ReactNode;
|
|
69
|
+
/**
|
|
70
|
+
* Render one file of a diff.
|
|
71
|
+
* @param props - the file, its section and gap state, layout choices, menu actions, and copy.
|
|
72
|
+
* @returns the file section.
|
|
73
|
+
*/
|
|
74
|
+
export declare function DiffFile(props: DiffFileProps): ReactNode;
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=DiffFile.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The label of a changed file in the files menu, the local changes list, and a
|
|
3
|
+
* file's header: its name, then its directory in smaller subdued type, with the
|
|
4
|
+
* complete path in a tooltip.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Render a changed file's name and directory. The directory gives up its space
|
|
9
|
+
* before the name does; assistive technology reads the complete path.
|
|
10
|
+
* @param props.path - the file's path in the repository.
|
|
11
|
+
* @param props.tooltip - the hover text, such as both paths of a renamed file; defaults to the path.
|
|
12
|
+
* @param props.className - class of the outer element, which callers size within their row.
|
|
13
|
+
* @returns the label.
|
|
14
|
+
*/
|
|
15
|
+
export declare function FileLabel({ path, tooltip, className }: {
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly tooltip?: string | undefined;
|
|
18
|
+
readonly className?: string | undefined;
|
|
19
|
+
}): ReactNode;
|
|
20
|
+
//# sourceMappingURL=FileLabel.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Resizable file navigation; width belongs to the mounted tab and survives hiding the pane. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import { type ChangedFilesProps } from './ChangedFiles.tsx';
|
|
4
|
+
/** Placement of a tab's file navigator; hiding it retains its viewing choices. */
|
|
5
|
+
export type FileTreePosition = 'right' | 'left' | 'hidden';
|
|
6
|
+
/**
|
|
7
|
+
* Render a keyboard- and pointer-resizable tree beside the diff.
|
|
8
|
+
* @param props - tree rows, pane position, and the toggle's controlled element id.
|
|
9
|
+
* @returns the bounded pane and its resize separator.
|
|
10
|
+
*/
|
|
11
|
+
export declare function FileTreePane({ position, id, ...props }: ChangedFilesProps & {
|
|
12
|
+
readonly position: FileTreePosition;
|
|
13
|
+
readonly id: string;
|
|
14
|
+
}): ReactNode;
|
|
15
|
+
//# sourceMappingURL=FileTreePane.d.ts.map
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** Body of the forge sidebar tab: where the Session works, its local changes, and the change requests it created or pushed. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { HostObservable, InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { RemoteHostFacts } from '@deepseek-ai/dsh-api-remotes/client';
|
|
5
|
+
import type { MergeRequest } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
6
|
+
import type { ForgePanelChangeRequest } from '../types.ts';
|
|
7
|
+
import { type ChangeRequestActions } from './ChangeRequestCard.tsx';
|
|
8
|
+
import type { NS } from './locales.ts';
|
|
9
|
+
import type { PanelSnapshot } from './source.ts';
|
|
10
|
+
/** Business face of the tab body. */
|
|
11
|
+
export interface ForgeTabInjected {
|
|
12
|
+
/** Panel snapshot of the Session and the Host facts; the renderer binds them as `usePanel` and `useHost`. */
|
|
13
|
+
readonly hooks: {
|
|
14
|
+
readonly panel: HostObservable<PanelSnapshot>;
|
|
15
|
+
readonly host: HostObservable<RemoteHostFacts>;
|
|
16
|
+
readonly locale: HostObservable<string>;
|
|
17
|
+
};
|
|
18
|
+
/** Open the stream again after it ended. */
|
|
19
|
+
readonly reconnect: () => void;
|
|
20
|
+
/**
|
|
21
|
+
* Reinspect the checkout, probe sign-in, and poll the change requests;
|
|
22
|
+
* settles once the Host has inspected and probed, after reporting a failure.
|
|
23
|
+
*/
|
|
24
|
+
readonly refresh: () => Promise<void>;
|
|
25
|
+
/** Remove a change request from the Session, offering to undo it. */
|
|
26
|
+
readonly remove: (entry: ForgePanelChangeRequest) => void;
|
|
27
|
+
/** Mark a draft ready for review; settles once the outcome is reported. */
|
|
28
|
+
readonly markReady: (entry: ForgePanelChangeRequest) => Promise<void>;
|
|
29
|
+
/** Merge a change request as `request` describes; settles once the outcome is reported. */
|
|
30
|
+
readonly merge: (entry: ForgePanelChangeRequest, request: MergeRequest) => Promise<void>;
|
|
31
|
+
/** Read the complete checks of an opened change request. */
|
|
32
|
+
readonly readChecks: NonNullable<ChangeRequestActions['readChecks']>;
|
|
33
|
+
/** Check the removed worktree of the Session out again, reporting the outcome. */
|
|
34
|
+
readonly restore: () => void;
|
|
35
|
+
/** Open a URL outside the app. */
|
|
36
|
+
readonly openLink: (url: string) => void;
|
|
37
|
+
/** Copy text to the clipboard and report the outcome. */
|
|
38
|
+
readonly copyText: (text: string) => void;
|
|
39
|
+
/** Copy a path to the clipboard and report the outcome. */
|
|
40
|
+
readonly copyPath: (path: string) => void;
|
|
41
|
+
/** Record whether the tab is visible, for the header entry's pressed state. */
|
|
42
|
+
readonly reportVisible: (visible: boolean) => void;
|
|
43
|
+
/** Ask the Session's Agent to create a change request for its changes, reporting the outcome. */
|
|
44
|
+
readonly createChangeRequest: () => void;
|
|
45
|
+
}
|
|
46
|
+
/** Full props of the tab body. */
|
|
47
|
+
export type ForgeTabProps = Pick<PropsRuntime<'sidebar.right.pane.tab'>, 'useTabInfo' | 'sessionId'> & InjectFace<ForgeTabInjected> & PropsLocale<typeof NS>;
|
|
48
|
+
/**
|
|
49
|
+
* Render the forge tab of one Session. The local changes card shows whenever
|
|
50
|
+
* the `branch` scope changes files, independently of bound change requests.
|
|
51
|
+
* The only open change request starts expanded; once the
|
|
52
|
+
* user expands or collapses a card, the panel keeps that choice across later updates.
|
|
53
|
+
* @param props - tab information, panel snapshot and Host facts hooks, actions, and copy.
|
|
54
|
+
* @returns the tab body.
|
|
55
|
+
*/
|
|
56
|
+
export declare function ForgeTab({ useTabInfo, sessionId, usePanel, useHost, useLocale, reconnect, refresh, remove, markReady, merge, readChecks, restore, openLink, copyText, copyPath, reportVisible, createChangeRequest, t, }: ForgeTabProps): ReactNode;
|
|
57
|
+
//# sourceMappingURL=ForgeTab.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Chip title of the forge tab: the change request glyph and the localized tab name. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { NS } from './locales.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Render the tab chip title in the current UI language.
|
|
7
|
+
* @param props - forge panel copy.
|
|
8
|
+
* @returns the glyph followed by the tab name.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ForgeTabTitle({ t }: PropsLocale<typeof NS>): ReactNode;
|
|
11
|
+
//# sourceMappingURL=ForgeTabTitle.d.ts.map
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** Session header entry that shows or hides the forge tab and marks change requests that need attention. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { HostObservable, InjectFace, PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { NS } from './locales.ts';
|
|
5
|
+
import type { PanelSnapshot } from './source.ts';
|
|
6
|
+
/** Business face of the header entry. */
|
|
7
|
+
export interface HeaderButtonInjected {
|
|
8
|
+
/** Panel snapshot and tab visibility of the Session; the renderer binds them as `usePanel` and `useVisible`. */
|
|
9
|
+
readonly hooks: {
|
|
10
|
+
readonly panel: HostObservable<PanelSnapshot>;
|
|
11
|
+
readonly visible: HostObservable<boolean>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Hide the forge tab when it is visible, otherwise open or reveal it.
|
|
15
|
+
* @param visible - whether the tab is visible now.
|
|
16
|
+
*/
|
|
17
|
+
readonly toggle: (visible: boolean) => void;
|
|
18
|
+
}
|
|
19
|
+
/** Full props of the header entry. */
|
|
20
|
+
export type HeaderButtonProps = InjectFace<HeaderButtonInjected> & PropsLocale<typeof NS>;
|
|
21
|
+
/**
|
|
22
|
+
* Render the header entry.
|
|
23
|
+
* @param props - panel snapshot and visibility hooks, the toggle, and copy.
|
|
24
|
+
* @returns the entry, or nothing outside a Git checkout without bound change requests.
|
|
25
|
+
*/
|
|
26
|
+
export declare function HeaderButton({ usePanel, useVisible, toggle, t }: HeaderButtonProps): ReactNode;
|
|
27
|
+
//# sourceMappingURL=HeaderButton.d.ts.map
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The panel card of the checkout's `branch` scope changes, independent of
|
|
3
|
+
* change request bindings: file counts and paths open the local changes view,
|
|
4
|
+
* and an optional action asks the Agent for a change request.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode } from 'react';
|
|
7
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
8
|
+
import type { ForgeLocalChanges } from '../types.ts';
|
|
9
|
+
import type { NS } from './locales.ts';
|
|
10
|
+
/** Props of the local changes card. */
|
|
11
|
+
export interface LocalChangesCardProps {
|
|
12
|
+
/** Files the `branch` scope changes and the ref it compares with. */
|
|
13
|
+
readonly local: ForgeLocalChanges;
|
|
14
|
+
/** Whether the card offers to create a change request. */
|
|
15
|
+
readonly creatable: boolean;
|
|
16
|
+
/** Open the changes view, scrolled to `path` when given. */
|
|
17
|
+
readonly view: (path?: string) => void;
|
|
18
|
+
/** Ask the Agent to create a change request for the changes. */
|
|
19
|
+
readonly create: () => void;
|
|
20
|
+
/** Forge panel copy. */
|
|
21
|
+
readonly t: PropsLocale<typeof NS>['t'];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Render the local changes card; the file list starts collapsed.
|
|
25
|
+
* @param props - the changes, the view and create actions, and copy.
|
|
26
|
+
* @returns the card.
|
|
27
|
+
*/
|
|
28
|
+
export declare function LocalChangesCard({ local, creatable, view, create, t }: LocalChangesCardProps): ReactNode;
|
|
29
|
+
//# sourceMappingURL=LocalChangesCard.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Refresh glyph that turns while a refresh runs. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
/** Props of the refresh glyph. */
|
|
4
|
+
export interface RefreshGlyphProps {
|
|
5
|
+
/** Whether the refresh runs. */
|
|
6
|
+
readonly busy: boolean;
|
|
7
|
+
/** Glyph size in pixels. */
|
|
8
|
+
readonly size: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Render the refresh glyph. It turns while `busy` and, once `busy` ends,
|
|
12
|
+
* completes the turn under way, so a quick refresh still shows a whole turn
|
|
13
|
+
* and the glyph stops upright. Under reduced motion it dims and returns instead of turning.
|
|
14
|
+
* @param props - whether the refresh runs, and the glyph size.
|
|
15
|
+
* @returns the glyph.
|
|
16
|
+
*/
|
|
17
|
+
export declare function RefreshGlyph({ busy, size }: RefreshGlyphProps): ReactNode;
|
|
18
|
+
//# sourceMappingURL=RefreshGlyph.d.ts.map
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Plain-text comment editor for a frozen selection in either review tab. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { ReviewQueue } from './review-queue.ts';
|
|
5
|
+
import type { ReviewSelection, ReviewSource } from './review.ts';
|
|
6
|
+
import type { NS } from './locales.ts';
|
|
7
|
+
/** Actions supplied by the owning changes tab. */
|
|
8
|
+
export interface ReviewActions {
|
|
9
|
+
/** The source currently displayed; selecting a range freezes it. */
|
|
10
|
+
readonly source: ReviewSource;
|
|
11
|
+
/** Browser records shared by the changes tab. */
|
|
12
|
+
readonly records?: ReviewQueue;
|
|
13
|
+
/** Whether another comment already started a pending review. */
|
|
14
|
+
readonly reviewStarted?: boolean;
|
|
15
|
+
/** Open the confirmed publication URL. */
|
|
16
|
+
readonly openLink?: (url: string) => void;
|
|
17
|
+
/** A write is running or its outcome still needs confirmation. */
|
|
18
|
+
readonly publishingBlocked?: boolean;
|
|
19
|
+
/** Append an atomic quote without sending the Agent a message. */
|
|
20
|
+
readonly addToInput: (selection: ReviewSelection) => boolean;
|
|
21
|
+
/** Retain a new comment after its quote was accepted. */
|
|
22
|
+
readonly onQuoted?: (selection: ReviewSelection) => void;
|
|
23
|
+
/** Publish one comment; an error string preserves the editor. */
|
|
24
|
+
readonly publish?: (selection: ReviewSelection) => Promise<string | undefined>;
|
|
25
|
+
/** Keep one comment for the final review; false preserves the editor. */
|
|
26
|
+
readonly queue?: (selection: ReviewSelection) => boolean;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Render the line range, plain-text editor, and explicitly named destinations.
|
|
30
|
+
* @param props - frozen selection, actions, cancellation, and localized copy.
|
|
31
|
+
* @returns the inline comment form.
|
|
32
|
+
*/
|
|
33
|
+
export declare function ReviewComposer({ selection, actions, close, visible, split, t }: PropsLocale<typeof NS> & {
|
|
34
|
+
readonly visible?: boolean;
|
|
35
|
+
readonly split?: boolean;
|
|
36
|
+
readonly selection: ReviewSelection;
|
|
37
|
+
readonly actions: ReviewActions;
|
|
38
|
+
readonly close: () => void;
|
|
39
|
+
}): ReactNode;
|
|
40
|
+
//# sourceMappingURL=ReviewComposer.d.ts.map
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Inline comment records and editing of a pending review at its captured code location. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { ReviewActions } from './ReviewComposer.tsx';
|
|
5
|
+
import { type FileReviewState, type ReviewThread as Thread } from './review-queue.ts';
|
|
6
|
+
import type { NS } from './locales.ts';
|
|
7
|
+
/**
|
|
8
|
+
* Subscribe only to comments that belong to the displayed file and source.
|
|
9
|
+
* @param actions - review actions and their browser store.
|
|
10
|
+
* @param path - displayed file path.
|
|
11
|
+
* @returns stable file-scoped comments and write availability.
|
|
12
|
+
*/
|
|
13
|
+
export declare function useFileReview(actions: ReviewActions | undefined, path: string): FileReviewState;
|
|
14
|
+
/**
|
|
15
|
+
* Render a saved comment at its line, with pending edits kept in the browser queue.
|
|
16
|
+
* @param props - record, edit availability, source actions, and localized copy.
|
|
17
|
+
* @returns one compact inline comment card.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ReviewThread({ thread, actions, locked, outdated, split, t }: PropsLocale<typeof NS> & {
|
|
20
|
+
readonly thread: Thread;
|
|
21
|
+
readonly actions: ReviewActions;
|
|
22
|
+
readonly locked: boolean;
|
|
23
|
+
readonly outdated: boolean;
|
|
24
|
+
readonly split: boolean;
|
|
25
|
+
}): ReactNode;
|
|
26
|
+
//# sourceMappingURL=ReviewThread.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The forge section of a Session row's hover card: the worktree branch while
|
|
3
|
+
* the Session works in the worktree the panel created for it, and its change
|
|
4
|
+
* requests, most urgent first.
|
|
5
|
+
*/
|
|
6
|
+
import type { ReactNode } from 'react';
|
|
7
|
+
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
8
|
+
import type { NS } from './locales.ts';
|
|
9
|
+
import { type SessionListInjected } from './session-list.ts';
|
|
10
|
+
/** Change requests the hover card lists before naming how many more there are. */
|
|
11
|
+
export declare const HOVER_CHANGE_REQUEST_LIMIT = 3;
|
|
12
|
+
/** Full props of the hover section. */
|
|
13
|
+
export type SessionHoverForgeProps = PropsRuntime<'sidebar.session.row.hover'> & PropsLocale<typeof NS> & InjectFace<SessionListInjected>;
|
|
14
|
+
/**
|
|
15
|
+
* Render the forge section of a Session's hover card.
|
|
16
|
+
* @param props - the row's Session, the shared hooks, and copy.
|
|
17
|
+
* @returns the section, or null for a Session without a worktree or change requests.
|
|
18
|
+
*/
|
|
19
|
+
export declare function SessionHoverForge({ sessionId, useSessions, useStates, t }: SessionHoverForgeProps): ReactNode;
|
|
20
|
+
//# sourceMappingURL=SessionHoverForge.d.ts.map
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session row icons after the time label: a branch glyph while the Session
|
|
3
|
+
* works in the worktree the panel created for it, and the state glyph of its
|
|
4
|
+
* most urgent change request. Glyphs of open change requests stay in the
|
|
5
|
+
* row's subdued color with a dot for their checks; merged and closed ones keep
|
|
6
|
+
* their state color.
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from 'react';
|
|
9
|
+
import type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
|
|
10
|
+
import type { ChecksRollup } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
11
|
+
import type { ForgePanelKey, NS } from './locales.ts';
|
|
12
|
+
import { type SessionListChangeRequest, type SessionListInjected } from './session-list.ts';
|
|
13
|
+
type Translate = PropsLocale<typeof NS>['t'];
|
|
14
|
+
/** Copy of each checks outcome a row and its hover card name. */
|
|
15
|
+
export declare const CHECKS_LABEL: Record<Exclude<ChecksRollup, 'none'>, ForgePanelKey>;
|
|
16
|
+
/**
|
|
17
|
+
* The checks outcome a row shows for a change request: none for a merged,
|
|
18
|
+
* closed, or not yet polled one.
|
|
19
|
+
* @param entry - the change request.
|
|
20
|
+
* @returns the outcome.
|
|
21
|
+
*/
|
|
22
|
+
export declare function rowChecks(entry: SessionListChangeRequest): ChecksRollup;
|
|
23
|
+
/**
|
|
24
|
+
* Name a change request's state and checks, as one line.
|
|
25
|
+
* @param entry - the change request.
|
|
26
|
+
* @param t - forge panel copy.
|
|
27
|
+
* @returns the line.
|
|
28
|
+
*/
|
|
29
|
+
export declare function stateLine(entry: SessionListChangeRequest, t: Translate): string;
|
|
30
|
+
/** Full props of the row icons. */
|
|
31
|
+
export type SessionRowForgeProps = PropsRuntime<'sidebar.session.row.trailing'> & PropsLocale<typeof NS> & InjectFace<SessionListInjected>;
|
|
32
|
+
/**
|
|
33
|
+
* Render a Session row's forge icons.
|
|
34
|
+
* @param props - the row's Session, the shared hooks, and copy.
|
|
35
|
+
* @returns the icons, or nothing for a Session without a worktree or change requests.
|
|
36
|
+
*/
|
|
37
|
+
export declare function SessionRowForge({ sessionId, useSessions, useStates, t }: SessionRowForgeProps): ReactNode;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=SessionRowForge.d.ts.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Centered review submission with a summary, decision, and pending-comment count. */
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
4
|
+
import type { ReviewQueue } from './review-queue.ts';
|
|
5
|
+
import type { NS } from './locales.ts';
|
|
6
|
+
/**
|
|
7
|
+
* Submit a review independently of the diff scroll position; comments remain at their code locations.
|
|
8
|
+
* @param props - durable queue, current head, submission outcome, and modal actions.
|
|
9
|
+
* @returns a portalled modal with keyboard focus ownership.
|
|
10
|
+
*/
|
|
11
|
+
export declare function SubmitReview({ queue, url, headSha, busy, error, submit, close, check, reconcile, t }: PropsLocale<typeof NS> & {
|
|
12
|
+
readonly queue: ReviewQueue;
|
|
13
|
+
readonly url: string;
|
|
14
|
+
readonly headSha: string;
|
|
15
|
+
readonly busy: boolean;
|
|
16
|
+
readonly error: string | null;
|
|
17
|
+
readonly submit: () => void;
|
|
18
|
+
readonly close: () => void;
|
|
19
|
+
readonly check: () => void;
|
|
20
|
+
readonly reconcile: () => void;
|
|
21
|
+
}): ReactNode;
|
|
22
|
+
//# sourceMappingURL=SubmitReview.d.ts.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card above the composer while a Session's worktree is created, while a message
|
|
3
|
+
* waits after a failed or stopped attempt, and when its worktree is gone or
|
|
4
|
+
* being restored.
|
|
5
|
+
*/
|
|
6
|
+
import { type ReactNode } from 'react';
|
|
7
|
+
import type { HostObservable, InjectFace, PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
8
|
+
import type { NS } from './locales.ts';
|
|
9
|
+
import type { PanelSnapshot } from './source.ts';
|
|
10
|
+
/** Business face of the card. */
|
|
11
|
+
export interface WorktreeProgressInjected {
|
|
12
|
+
/** Panel snapshot of the Session; the renderer binds it as `usePanel`. */
|
|
13
|
+
readonly hooks: {
|
|
14
|
+
readonly panel: HostObservable<PanelSnapshot>;
|
|
15
|
+
};
|
|
16
|
+
/** Stop the running attempt a message waits for; the message keeps waiting. */
|
|
17
|
+
readonly stop: () => void;
|
|
18
|
+
/** Make another attempt at the worktree a message waits for. */
|
|
19
|
+
readonly retry: () => void;
|
|
20
|
+
/** Withdraw the worktree request, so the waiting message goes on without a worktree. */
|
|
21
|
+
readonly withdraw: () => void;
|
|
22
|
+
/**
|
|
23
|
+
* Check out the removed worktree again.
|
|
24
|
+
* @returns the failure text, or undefined once it is restored.
|
|
25
|
+
*/
|
|
26
|
+
readonly restore: () => Promise<string | undefined>;
|
|
27
|
+
/** Move the Session back to the source checkout of its removed worktree. */
|
|
28
|
+
readonly leave: () => void;
|
|
29
|
+
}
|
|
30
|
+
/** Full props of the card. */
|
|
31
|
+
export type WorktreeProgressProps = InjectFace<WorktreeProgressInjected> & PropsLocale<typeof NS>;
|
|
32
|
+
/**
|
|
33
|
+
* Render the worktree card of a Session: the running attempt at its
|
|
34
|
+
* requested worktree, which can be stopped while a message waits for it; the
|
|
35
|
+
* failed or stopped attempt a message waits after, with another attempt or
|
|
36
|
+
* withdrawing the request so the message goes on without a worktree; or the
|
|
37
|
+
* removal of the worktree the Session works in, with restoring it, whose
|
|
38
|
+
* steps the card follows, and returning to the source checkout, after which
|
|
39
|
+
* a waiting message goes on.
|
|
40
|
+
* @param props - panel hook, actions, and copy.
|
|
41
|
+
* @returns the card, or nothing while no attempt runs, no message waits, and the worktree exists.
|
|
42
|
+
*/
|
|
43
|
+
export declare function WorktreeProgress({ usePanel, stop, retry, withdraw, restore, leave, t }: WorktreeProgressProps): ReactNode;
|
|
44
|
+
//# sourceMappingURL=WorktreeProgress.d.ts.map
|