@deepseek-ai/dsh-experimental-client-ui-forge 0.0.0-stage → 0.2.2-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.i18n.yaml +37 -0
- package/README.md +134 -2
- package/README.zh.md +135 -0
- package/lib/client.js +8745 -0
- package/lib/index.js +3131 -0
- package/lib/typert.host.d.ts +3 -0
- package/lib/typert.host.js +2222 -0
- package/lib/typert.remote-client.d.ts +79 -0
- package/lib/typert.remote-client.js +1284 -0
- package/lib/types/client/ActionToast.d.ts +14 -0
- package/lib/types/client/ChangeRequestCard.d.ts +54 -0
- package/lib/types/client/ChangesTab.d.ts +49 -0
- package/lib/types/client/ChangesTabTitle.d.ts +13 -0
- package/lib/types/client/DiffFile.d.ts +75 -0
- package/lib/types/client/FileLabel.d.ts +20 -0
- package/lib/types/client/ForgeTab.d.ts +54 -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/SessionHoverForge.d.ts +20 -0
- package/lib/types/client/SessionRowForge.d.ts +39 -0
- package/lib/types/client/WorktreeProgress.d.ts +44 -0
- package/lib/types/client/WorktreeToggle.d.ts +42 -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/diff-rows.d.ts +96 -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 +228 -0
- package/lib/types/client/mount.d.ts +17 -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 +95 -0
- package/lib/types/diff.d.ts +32 -0
- package/lib/types/git.d.ts +93 -0
- package/lib/types/index.d.ts +275 -0
- package/lib/types/local-diff.d.ts +93 -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 +89 -0
- package/lib/types/types.d.ts +395 -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,34 @@
|
|
|
1
|
+
/** What the panel's checkout row says about the checkout the Session works in. */
|
|
2
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
3
|
+
import type { ForgePanelState } from '../types.ts';
|
|
4
|
+
import type { NS } from './locales.ts';
|
|
5
|
+
type Translate = PropsLocale<typeof NS>['t'];
|
|
6
|
+
/** Facts the checkout row shows. */
|
|
7
|
+
export interface CheckoutLabel {
|
|
8
|
+
/** Branch name, the abbreviated commit while HEAD is detached, or null when HEAD has no commit. */
|
|
9
|
+
readonly name: string | null;
|
|
10
|
+
/** Whether HEAD is detached. */
|
|
11
|
+
readonly detached: boolean;
|
|
12
|
+
/** Kind of directory: a worktree with its base, another worktree, the project directory, or a removed worktree. */
|
|
13
|
+
readonly kind: string;
|
|
14
|
+
/** The kind with the directory path, home abbreviated to `~`. */
|
|
15
|
+
readonly tooltip: string;
|
|
16
|
+
/** Whether the worktree the Session works in is gone. */
|
|
17
|
+
readonly missing: boolean;
|
|
18
|
+
/** Full path of the directory, home not abbreviated; a removed worktree keeps the path it was created at. */
|
|
19
|
+
readonly path: string;
|
|
20
|
+
/** Whether the directory is a worktree rather than the project directory. */
|
|
21
|
+
readonly worktree: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Describe the checkout of a Session. A worktree this panel created names its
|
|
25
|
+
* base; any other linked worktree is a worktree, and the main checkout is the
|
|
26
|
+
* project directory. A removed worktree keeps its branch name.
|
|
27
|
+
* @param state - panel state.
|
|
28
|
+
* @param home - Host account home, or undefined to show full paths.
|
|
29
|
+
* @param t - forge panel copy.
|
|
30
|
+
* @returns the label, or undefined before a successful inspection.
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkoutLabel(state: ForgePanelState, home: string | undefined, t: Translate): CheckoutLabel | undefined;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=checkout.d.ts.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawn rows of one file diff: numbered patch lines, their side-by-side
|
|
3
|
+
* pairing, and the unchanged lines between hunks, which stay collapsed until
|
|
4
|
+
* the file's new side supplies them.
|
|
5
|
+
*/
|
|
6
|
+
import type { ForgeDiffFile, ForgeDiffHunk } from '../types.ts';
|
|
7
|
+
/** One drawn line with its number on each side that has it. */
|
|
8
|
+
export type DiffRow = {
|
|
9
|
+
readonly kind: 'add';
|
|
10
|
+
readonly old: null;
|
|
11
|
+
readonly new: number;
|
|
12
|
+
readonly text: string;
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'del';
|
|
15
|
+
readonly old: number;
|
|
16
|
+
readonly new: null;
|
|
17
|
+
readonly text: string;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'context';
|
|
20
|
+
readonly old: number;
|
|
21
|
+
readonly new: number;
|
|
22
|
+
readonly text: string;
|
|
23
|
+
};
|
|
24
|
+
/** One side of a side-by-side row. */
|
|
25
|
+
export interface SplitCell {
|
|
26
|
+
readonly kind: DiffRow['kind'];
|
|
27
|
+
readonly no: number;
|
|
28
|
+
readonly text: string;
|
|
29
|
+
}
|
|
30
|
+
/** One side-by-side row; a side without a line is null. */
|
|
31
|
+
export interface SplitRow {
|
|
32
|
+
readonly left: SplitCell | null;
|
|
33
|
+
readonly right: SplitCell | null;
|
|
34
|
+
}
|
|
35
|
+
/** A run of drawn rows, or unchanged lines drawn as one row that expands them. */
|
|
36
|
+
export type DiffSegment = {
|
|
37
|
+
readonly kind: 'rows';
|
|
38
|
+
readonly rows: readonly DiffRow[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `index` is the hunk the lines precede, or the hunk count for the lines after the last hunk;
|
|
42
|
+
* `count` is null while the length of the file is unknown.
|
|
43
|
+
*/
|
|
44
|
+
| {
|
|
45
|
+
readonly kind: 'gap';
|
|
46
|
+
readonly index: number;
|
|
47
|
+
readonly count: number | null;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Number the lines of a hunk. Context lines count on both sides, deletions on
|
|
51
|
+
* the old side, and additions on the new side; a ``
|
|
52
|
+
* marker is not a line.
|
|
53
|
+
* @param hunk - one hunk.
|
|
54
|
+
* @returns the rows in patch order.
|
|
55
|
+
*/
|
|
56
|
+
export declare function hunkRows(hunk: ForgeDiffHunk): DiffRow[];
|
|
57
|
+
/**
|
|
58
|
+
* Pair rows for the side-by-side view: each run of deletions sits beside the
|
|
59
|
+
* run of additions that follows it, row by row, and context rows fill both sides.
|
|
60
|
+
* @param rows - rows in patch order.
|
|
61
|
+
* @returns the paired rows.
|
|
62
|
+
*/
|
|
63
|
+
export declare function splitRows(rows: readonly DiffRow[]): SplitRow[];
|
|
64
|
+
/**
|
|
65
|
+
* Split file text into lines as a patch numbers them; a final line ending ends the last line.
|
|
66
|
+
* @param text - the file text.
|
|
67
|
+
* @returns the lines with any carriage returns kept.
|
|
68
|
+
*/
|
|
69
|
+
export declare function textLines(text: string): string[];
|
|
70
|
+
/**
|
|
71
|
+
* Whether file text is the new side the hunks describe: every context and
|
|
72
|
+
* added line sits at its number. A file changed after its diff was read fails.
|
|
73
|
+
* @param lines - the file's lines.
|
|
74
|
+
* @param hunks - hunks of the file's diff.
|
|
75
|
+
* @returns whether the lines match.
|
|
76
|
+
*/
|
|
77
|
+
export declare function matchesHunks(lines: readonly string[], hunks: readonly ForgeDiffHunk[]): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Lay out one file as runs of rows separated by collapsed unchanged lines.
|
|
80
|
+
* Unchanged lines before a hunk, between hunks, and after the last hunk
|
|
81
|
+
* collapse into one gap each; an open gap draws its lines from `lines` once
|
|
82
|
+
* they are known. The lines after the last hunk are unknown until `lines`
|
|
83
|
+
* arrives, unless the file is new, deleted, or its last hunk reaches its end.
|
|
84
|
+
* @param file - one file of a diff.
|
|
85
|
+
* @param lines - the file's new side, which {@link matchesHunks} accepted, or undefined while it has not been read.
|
|
86
|
+
* @param open - indexes of the gaps the user expanded.
|
|
87
|
+
* @returns the segments in file order.
|
|
88
|
+
*/
|
|
89
|
+
export declare function segmentsOf(file: ForgeDiffFile, lines: readonly string[] | undefined, open: ReadonlySet<number>): DiffSegment[];
|
|
90
|
+
/**
|
|
91
|
+
* Count the rows a file's hunks draw.
|
|
92
|
+
* @param file - one file of a diff.
|
|
93
|
+
* @returns the number of context, added, and deleted lines in its hunks.
|
|
94
|
+
*/
|
|
95
|
+
export declare function drawnLines(file: ForgeDiffFile): number;
|
|
96
|
+
//# sourceMappingURL=diff-rows.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Localized durations and relative times shown on change request cards. */
|
|
2
|
+
import type { PropsLocale } from '@deepseek-ai/dsh-client-ui-slots';
|
|
3
|
+
import type { NS } from './locales.ts';
|
|
4
|
+
type Translate = PropsLocale<typeof NS>['t'];
|
|
5
|
+
/**
|
|
6
|
+
* Format an elapsed time as hours and minutes, minutes and seconds, or seconds.
|
|
7
|
+
* @param ms - elapsed milliseconds.
|
|
8
|
+
* @param t - forge panel copy.
|
|
9
|
+
* @returns the localized duration.
|
|
10
|
+
*/
|
|
11
|
+
export declare function formatDuration(ms: number, t: Translate): string;
|
|
12
|
+
/**
|
|
13
|
+
* Format how long ago an ISO 8601 time was.
|
|
14
|
+
* @param iso - the time.
|
|
15
|
+
* @param now - current epoch milliseconds.
|
|
16
|
+
* @param t - forge panel copy.
|
|
17
|
+
* @returns the localized relative time, or undefined when `iso` does not parse.
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatAgo(iso: string, now: number, t: Translate): string | undefined;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** Lifecycle glyphs of change requests and outcome glyphs of their checks. */
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import type { CheckState } from '@deepseek-ai/dsh-experimental-forge/types';
|
|
4
|
+
import type { ChangeRequestTone } from './status.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Draw a change request in its lifecycle shape: open, open with a cross for
|
|
7
|
+
* one that needs its author, draft, merged, closed, or the open shape for an
|
|
8
|
+
* unknown state.
|
|
9
|
+
* @param props.tone - lifecycle state that picks the shape and, when tinted, the color.
|
|
10
|
+
* @param props.tinted - whether the state picks the color; otherwise the glyph uses the current text color.
|
|
11
|
+
* @param props.size - width and height in pixels, 15 by default.
|
|
12
|
+
* @param props.label - accessible name; omit it for a decorative glyph.
|
|
13
|
+
* @returns the SVG glyph.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ChangeRequestGlyph({ tone, tinted, size, label }: {
|
|
16
|
+
readonly tone: ChangeRequestTone;
|
|
17
|
+
readonly tinted?: boolean | undefined;
|
|
18
|
+
readonly size?: number | undefined;
|
|
19
|
+
readonly label?: string | undefined;
|
|
20
|
+
}): ReactNode;
|
|
21
|
+
/**
|
|
22
|
+
* Draw the decorative outcome of one check beside its text: a filled circle
|
|
23
|
+
* for success or failure, a half-filled ring while it runs, and an empty ring
|
|
24
|
+
* for neutral, skipped, and cancelled checks.
|
|
25
|
+
* @param props.state - check outcome.
|
|
26
|
+
* @param props.size - width and height in pixels, 16 by default.
|
|
27
|
+
* @returns the glyph.
|
|
28
|
+
*/
|
|
29
|
+
export declare function CheckGlyph({ state, size }: {
|
|
30
|
+
readonly state: CheckState;
|
|
31
|
+
readonly size?: number | undefined;
|
|
32
|
+
}): ReactNode;
|
|
33
|
+
//# sourceMappingURL=glyphs.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser entry of the forge panel: the sidebar tab, the changes view, the
|
|
3
|
+
* header button, the worktree option and creation card, and their Remote.
|
|
4
|
+
*/
|
|
5
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
6
|
+
export { inject } from './mount.ts';
|
|
7
|
+
export type { ForgePanelKey } from './locales.ts';
|
|
8
|
+
export type { ChangeRequestActions, ChangeRequestCardProps } from './ChangeRequestCard.tsx';
|
|
9
|
+
export type { ChangesParams, ChangesSource, ChangesTarget } from './changes-address.ts';
|
|
10
|
+
export type { ChangesTabInjected, ChangesTabProps } from './ChangesTab.tsx';
|
|
11
|
+
export type { ChangesTabTitleProps } from './ChangesTabTitle.tsx';
|
|
12
|
+
export type { DiffFileAction, DiffFileProps, DiffFileText } from './DiffFile.tsx';
|
|
13
|
+
export type { LocalChangesCardProps } from './LocalChangesCard.tsx';
|
|
14
|
+
export type { ForgeTabInjected, ForgeTabProps } from './ForgeTab.tsx';
|
|
15
|
+
export type { HeaderButtonInjected, HeaderButtonProps } from './HeaderButton.tsx';
|
|
16
|
+
export type { WorktreeProgressInjected, WorktreeProgressProps } from './WorktreeProgress.tsx';
|
|
17
|
+
export type { WorktreeToggleInjected, WorktreeToggleProps } from './WorktreeToggle.tsx';
|
|
18
|
+
export type { ActionNotice, NoticeOptions, PanelSnapshot } from './source.ts';
|
|
19
|
+
/**
|
|
20
|
+
* Mount the forge panel Remote and its UI.
|
|
21
|
+
* @param ctx - browser plugin context.
|
|
22
|
+
* @returns the disposer that withdraws the UI, then the Remote.
|
|
23
|
+
*/
|
|
24
|
+
export declare function apply(ctx: Context): Promise<() => Promise<void>>;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/** Forge panel copy owned by the locale dictionaries. */
|
|
2
|
+
/** Locale namespace of the forge panel. */
|
|
3
|
+
export declare const NS = "forgePanel";
|
|
4
|
+
/** Chinese copy; its keys define {@link ForgePanelKey}. */
|
|
5
|
+
export declare const zh: {
|
|
6
|
+
readonly 'tab.title': "变更请求";
|
|
7
|
+
readonly 'header.label': "本会话的变更请求";
|
|
8
|
+
readonly 'header.attention': "本会话的变更请求需要处理";
|
|
9
|
+
readonly 'checkout.worktree': "工作树";
|
|
10
|
+
readonly 'checkout.worktreeFrom': "工作树 · 基于 {base}";
|
|
11
|
+
readonly 'checkout.project': "项目目录";
|
|
12
|
+
readonly 'checkout.detached': "未在分支上";
|
|
13
|
+
readonly 'checkout.restore': "恢复";
|
|
14
|
+
readonly 'checkout.copyWorktreePath': "复制工作树路径";
|
|
15
|
+
readonly 'checkout.copyProjectPath': "复制项目目录路径";
|
|
16
|
+
readonly 'checkout.none': "当前目录不是 Git 仓库";
|
|
17
|
+
readonly 'checkout.failed': "无法读取 Git 信息";
|
|
18
|
+
readonly 'changes.title': "本会话的变更请求 · {count}";
|
|
19
|
+
readonly 'changes.empty': "本会话还没有变更请求";
|
|
20
|
+
readonly 'changes.emptyHint': "本会话关联的变更请求(创建、查看、编辑或检出的,以及所在分支或推送分支上的)会显示在这里";
|
|
21
|
+
readonly 'changes.local.title': "变更";
|
|
22
|
+
readonly 'changes.local.refs': "{head} → {base}";
|
|
23
|
+
readonly 'changes.local.files': "{count} 个文件";
|
|
24
|
+
readonly 'changes.local.viewAria': "查看本会话的变更:{count} 个文件,新增 {added} 行,删除 {deleted} 行";
|
|
25
|
+
readonly 'changes.local.create': "创建变更请求";
|
|
26
|
+
readonly 'changes.local.prompt': "为本会话的变更创建变更请求";
|
|
27
|
+
readonly 'signin.title': "登录 {host} 后才能显示变更请求状态";
|
|
28
|
+
readonly 'signin.copy': "复制登录命令";
|
|
29
|
+
readonly 'signin.unavailable': "无法读取 {host} 上的变更请求:{message}";
|
|
30
|
+
readonly refresh: "刷新状态";
|
|
31
|
+
readonly retry: "重试";
|
|
32
|
+
readonly 'stream.failed': "无法加载变更请求面板";
|
|
33
|
+
readonly 'change.number': "#{number}";
|
|
34
|
+
readonly 'change.stateAria': "变更请求状态:{state}";
|
|
35
|
+
readonly 'change.state.open': "打开";
|
|
36
|
+
readonly 'change.state.blocked': "需要处理";
|
|
37
|
+
readonly 'change.state.draft': "草稿";
|
|
38
|
+
readonly 'change.state.merged': "已合并";
|
|
39
|
+
readonly 'change.state.closed': "已关闭";
|
|
40
|
+
readonly 'change.state.unknown': "未知";
|
|
41
|
+
readonly 'list.worktree': "在自己的工作树中";
|
|
42
|
+
readonly 'list.stateChecks': "{state} · {checks}";
|
|
43
|
+
readonly 'list.more': "还有 {count} 个变更请求";
|
|
44
|
+
readonly 'change.expand': "展开 {name}";
|
|
45
|
+
readonly 'change.collapse': "收起 {name}";
|
|
46
|
+
readonly 'change.ci.none': "没有检查";
|
|
47
|
+
readonly 'change.ci.running': "检查中";
|
|
48
|
+
readonly 'change.ci.passed': "检查通过";
|
|
49
|
+
readonly 'change.ci.failed': "{count} 项检查失败";
|
|
50
|
+
readonly 'change.ci.failedUnlisted': "检查失败";
|
|
51
|
+
readonly 'change.checks.failed': "{count} 项失败";
|
|
52
|
+
readonly 'change.checks.running': "{count} 项进行中";
|
|
53
|
+
readonly 'change.checks.passed': "{count} 项通过";
|
|
54
|
+
readonly 'change.checks.other': "其他 {count} 项";
|
|
55
|
+
readonly 'change.checks.truncated': "只列出前 {count} 项";
|
|
56
|
+
readonly 'change.check.running': "进行中";
|
|
57
|
+
readonly 'change.check.queued': "排队中";
|
|
58
|
+
readonly 'change.flag.changesRequested': "要求修改";
|
|
59
|
+
readonly 'change.flag.conflicting': "有冲突";
|
|
60
|
+
readonly 'change.flag.draft': "草稿";
|
|
61
|
+
readonly 'change.failure.unavailable': "无法读取变更请求状态";
|
|
62
|
+
readonly 'change.failure.notFound': "变更请求不存在或没有访问权限";
|
|
63
|
+
readonly 'change.failure.unauthenticated': "登录后才能读取状态";
|
|
64
|
+
readonly 'change.unserved': "暂不支持读取该平台的变更请求状态";
|
|
65
|
+
readonly 'change.view': "在浏览器中打开";
|
|
66
|
+
readonly 'change.copy': "复制变更请求链接";
|
|
67
|
+
readonly 'change.viewChangesAria': "查看 {name} 的变更:新增 {added} 行,删除 {deleted} 行";
|
|
68
|
+
readonly 'change.remove': "从本会话移除";
|
|
69
|
+
readonly 'change.removeAria': "从本会话移除 {name}";
|
|
70
|
+
readonly 'change.row.checks': "检查";
|
|
71
|
+
readonly 'change.row.review': "评审";
|
|
72
|
+
readonly 'change.row.merge': "合并";
|
|
73
|
+
readonly 'change.row.changes': "变更";
|
|
74
|
+
readonly 'change.review.approved': "已批准";
|
|
75
|
+
readonly 'change.review.changesRequested': "要求修改";
|
|
76
|
+
readonly 'change.review.required': "等待评审";
|
|
77
|
+
readonly 'change.review.none': "尚未请求评审";
|
|
78
|
+
readonly 'change.review.threads': "{review} · {count} 条未解决讨论";
|
|
79
|
+
readonly 'change.merge.mergeable': "无冲突";
|
|
80
|
+
readonly 'change.merge.conflicting': "与 {base} 有冲突";
|
|
81
|
+
readonly 'change.merge.unknown': "正在检查冲突";
|
|
82
|
+
readonly 'change.mergedTo': "已合并到 {base}";
|
|
83
|
+
readonly 'change.markReady': "标记为可评审";
|
|
84
|
+
readonly 'change.merge': "合并";
|
|
85
|
+
readonly 'change.mergeTitle': "将 {name} 合并到 {base}";
|
|
86
|
+
readonly 'change.mergeMethod.squash': "压缩合并";
|
|
87
|
+
readonly 'change.mergeMethod.merge': "创建合并提交";
|
|
88
|
+
readonly 'change.mergeMethod.rebase': "变基合并";
|
|
89
|
+
readonly 'change.mergeNote.squash': "把全部提交压缩成一个提交";
|
|
90
|
+
readonly 'change.mergeNote.merge': "保留全部提交,并新增一个合并提交";
|
|
91
|
+
readonly 'change.mergeNote.rebase': "把提交逐个变基到 {base}";
|
|
92
|
+
readonly 'change.mergeConfirm': "确认合并";
|
|
93
|
+
readonly 'change.mergeChanged': "提交已更新,请重新检查后再打开合并菜单";
|
|
94
|
+
readonly 'diff.tab': "变更";
|
|
95
|
+
readonly 'diff.tabNumbered': "#{number} 的变更";
|
|
96
|
+
readonly 'diff.scope.branch': "分支";
|
|
97
|
+
readonly 'diff.scope.uncommitted': "未提交";
|
|
98
|
+
readonly 'diff.scope.unstaged': "未暂存";
|
|
99
|
+
readonly 'diff.scope.staged': "已暂存";
|
|
100
|
+
readonly 'diff.scopeNote.branch': "与 {base} 比较,包含未提交的修改";
|
|
101
|
+
readonly 'diff.scopeNote.uncommitted': "与 HEAD 比较,包含未跟踪的文件";
|
|
102
|
+
readonly 'diff.scopeNote.unstaged': "与暂存区比较,包含未跟踪的文件";
|
|
103
|
+
readonly 'diff.scopeNote.staged': "暂存区与 HEAD 比较";
|
|
104
|
+
readonly 'diff.allFiles': "全部 {count} 个文件";
|
|
105
|
+
readonly 'diff.refresh': "刷新变更";
|
|
106
|
+
readonly 'diff.expandAll': "全部展开";
|
|
107
|
+
readonly 'diff.collapseAll': "全部折叠";
|
|
108
|
+
readonly 'diff.split': "切换为左右对比";
|
|
109
|
+
readonly 'diff.unified': "切换为单栏对比";
|
|
110
|
+
readonly 'diff.splitAria': "左右对比";
|
|
111
|
+
readonly 'diff.wrap': "开启自动换行";
|
|
112
|
+
readonly 'diff.nowrap': "关闭自动换行";
|
|
113
|
+
readonly 'diff.wrapAria': "自动换行";
|
|
114
|
+
readonly 'diff.unchanged': "{count} 行未变更";
|
|
115
|
+
readonly 'diff.unchangedRest': "其余未变更的行";
|
|
116
|
+
readonly 'diff.newFile': "新文件";
|
|
117
|
+
readonly 'diff.deletedFile': "已删除";
|
|
118
|
+
readonly 'diff.renamed': "由 {from} 重命名";
|
|
119
|
+
readonly 'diff.renamedPath': "{from} → {path}";
|
|
120
|
+
readonly 'diff.badgeUncommitted': "未提交";
|
|
121
|
+
readonly 'diff.binary': "二进制文件,无法显示变更";
|
|
122
|
+
readonly 'diff.binaryLabel': "二进制";
|
|
123
|
+
readonly 'diff.largeCollapsed': "文件较大,{count} 行变更已收起";
|
|
124
|
+
readonly 'diff.fileTooLarge': "文件太大,无法显示变更";
|
|
125
|
+
readonly 'diff.error': "无法读取变更";
|
|
126
|
+
readonly 'diff.tooLarge': "变更太大,无法在这里显示";
|
|
127
|
+
readonly 'diff.viewInBrowser': "在浏览器中查看";
|
|
128
|
+
readonly 'diff.noForkPoint': "找不到本分支的分叉点,请选择其他范围";
|
|
129
|
+
readonly 'diff.empty': "没有变更";
|
|
130
|
+
readonly 'diff.omitted': "另有 {count} 个未跟踪的文件没有列出";
|
|
131
|
+
readonly 'diff.stale': "本地有 {count} 个提交尚未推送,这里显示的是变更请求上的变更";
|
|
132
|
+
readonly 'diff.moreActions': "{name} 的更多操作";
|
|
133
|
+
readonly 'diff.copyPath': "复制路径";
|
|
134
|
+
readonly 'diff.openFileInBrowser': "在浏览器中查看文件";
|
|
135
|
+
readonly 'diff.openFileInSidebar': "在侧边栏打开整个文件";
|
|
136
|
+
readonly 'time.now': "刚刚";
|
|
137
|
+
readonly 'time.minutes': "{n} 分钟前";
|
|
138
|
+
readonly 'time.hours': "{n} 小时前";
|
|
139
|
+
readonly 'time.days': "{n} 天前";
|
|
140
|
+
readonly 'time.months': "{n} 个月前";
|
|
141
|
+
readonly 'time.years': "{n} 年前";
|
|
142
|
+
readonly 'time.finished': "{state} · {time}";
|
|
143
|
+
readonly 'duration.seconds': "{seconds} 秒";
|
|
144
|
+
readonly 'duration.minutes': "{minutes} 分 {seconds} 秒";
|
|
145
|
+
readonly 'duration.hours': "{hours} 小时 {minutes} 分";
|
|
146
|
+
readonly 'worktree.label': "工作树";
|
|
147
|
+
readonly 'worktree.hint': "在独立的工作树中运行本会话:发送后基于所选分支新建分支,修改和提交不影响项目目录";
|
|
148
|
+
readonly 'worktree.blocked.not-git': "工作区不是 Git 仓库,无法使用工作树";
|
|
149
|
+
readonly 'worktree.blocked.outside-writable-root': "这个工作区的 Git 数据不在可写目录中(例如工作区本身就是工作树),暂不支持使用工作树";
|
|
150
|
+
readonly 'worktree.blocked.read-only': "只读模式下无法使用工作树";
|
|
151
|
+
readonly 'worktree.base': "基于 {branch}";
|
|
152
|
+
readonly 'worktree.baseHead': "基于当前 HEAD";
|
|
153
|
+
readonly 'worktree.baseMenu': "选择基准分支";
|
|
154
|
+
readonly 'worktree.currentBranch': "当前分支";
|
|
155
|
+
readonly 'creation.title': "正在创建工作树";
|
|
156
|
+
readonly 'creation.failed': "创建工作树失败";
|
|
157
|
+
readonly 'creation.prepare': "创建分支";
|
|
158
|
+
readonly 'creation.checkout': "检出文件";
|
|
159
|
+
readonly 'creation.details': "更多详情";
|
|
160
|
+
readonly 'creation.branch': "分支";
|
|
161
|
+
readonly 'creation.base': "基于";
|
|
162
|
+
readonly 'creation.head': "当前 HEAD";
|
|
163
|
+
readonly 'creation.error': "原因";
|
|
164
|
+
readonly 'creation.skip': "不使用工作树";
|
|
165
|
+
readonly 'creation.cancel': "取消";
|
|
166
|
+
readonly 'creation.stopped': "已停止创建工作树";
|
|
167
|
+
readonly 'creation.retry': "重试";
|
|
168
|
+
readonly 'creation.waiting': "消息会在工作树建好后发送";
|
|
169
|
+
readonly 'missing.title': "工作树不可用";
|
|
170
|
+
readonly 'missing.unknown': "工作树恢复尚未完成,暂时无法确认分支 {branch} 的状态。请排除恢复错误后重试,或在项目目录继续";
|
|
171
|
+
readonly 'missing.kept': "可以在原位置恢复分支 {branch} 的工作树。删除前未提交的修改无法恢复";
|
|
172
|
+
readonly 'missing.recreated': "分支 {branch} 也已删除。恢复时会从创建时的提交重建分支,之后的提交和未提交的修改无法恢复";
|
|
173
|
+
readonly 'missing.restore': "恢复工作树";
|
|
174
|
+
readonly 'missing.leave': "在项目目录继续";
|
|
175
|
+
readonly 'missing.waiting': "恢复工作树或在项目目录继续后,消息会接着发送";
|
|
176
|
+
readonly 'restoration.title': "正在恢复工作树";
|
|
177
|
+
readonly 'restoration.prepare': "准备工作树";
|
|
178
|
+
readonly 'branch.worktree': "工作树(基于 {base}):{path}";
|
|
179
|
+
readonly 'branch.linked': "工作树:{path}";
|
|
180
|
+
readonly 'branch.project': "项目目录:{path}";
|
|
181
|
+
readonly 'branch.missing': "工作树不可用:{path}";
|
|
182
|
+
readonly 'toast.removed': "已从本会话移除 {name}";
|
|
183
|
+
readonly 'toast.undo': "撤销";
|
|
184
|
+
readonly 'toast.undoFailed': "撤销失败";
|
|
185
|
+
readonly 'toast.removeFailed': "移除失败";
|
|
186
|
+
readonly 'toast.refreshFailed': "刷新失败";
|
|
187
|
+
readonly 'toast.copied': "已复制链接";
|
|
188
|
+
readonly 'toast.copyFailed': "复制失败";
|
|
189
|
+
readonly 'toast.branchesFailed': "无法读取分支";
|
|
190
|
+
readonly 'toast.worktreeFailed': "无法更改工作树选项";
|
|
191
|
+
readonly 'toast.worktreeStarted': "会话已开始,无法再改用工作树";
|
|
192
|
+
readonly 'toast.restored': "工作树已恢复";
|
|
193
|
+
readonly 'toast.restoreFailed': "无法恢复工作树:{message}";
|
|
194
|
+
readonly 'toast.leaveFailed': "无法切换到项目目录,请稍后重试";
|
|
195
|
+
readonly 'toast.markedReady': "已将 {name} 标记为可评审";
|
|
196
|
+
readonly 'toast.markReadyFailed': "标记失败:{message}";
|
|
197
|
+
readonly 'toast.merged': "已合并 {name}";
|
|
198
|
+
readonly 'toast.mergeFailed': "合并失败:{message}";
|
|
199
|
+
readonly 'toast.mergeStale': "{name} 有新的提交,确认后再合并";
|
|
200
|
+
readonly 'toast.pathCopied': "已复制路径";
|
|
201
|
+
readonly 'toast.expandFailed': "无法显示未变更的行:{message}";
|
|
202
|
+
readonly 'toast.expandStale': "文件在读取变更后又有修改,刷新后再展开";
|
|
203
|
+
readonly 'toast.prompted': "已发送:{text}";
|
|
204
|
+
readonly 'toast.promptFailed': "无法发送消息";
|
|
205
|
+
};
|
|
206
|
+
/** Key of the forge panel dictionaries. */
|
|
207
|
+
export type ForgePanelKey = keyof typeof zh;
|
|
208
|
+
/** English copy with the same keys. */
|
|
209
|
+
export declare const en: Record<ForgePanelKey, string>;
|
|
210
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
211
|
+
interface LocaleNamespaceMap {
|
|
212
|
+
/** Forge panel tab, changes view, header button, worktree option and creation card, and action notices. */
|
|
213
|
+
forgePanel: ForgePanelKey;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/** Japanese copy with the same keys. */
|
|
217
|
+
export declare const ja: Record<ForgePanelKey, string>;
|
|
218
|
+
/** Spanish copy with the same keys. */
|
|
219
|
+
export declare const es: Record<ForgePanelKey, string>;
|
|
220
|
+
/** French copy with the same keys. */
|
|
221
|
+
export declare const fr: Record<ForgePanelKey, string>;
|
|
222
|
+
/** German copy with the same keys. */
|
|
223
|
+
export declare const de: Record<ForgePanelKey, string>;
|
|
224
|
+
/** Russian copy with the same keys. */
|
|
225
|
+
export declare const ru: Record<ForgePanelKey, string>;
|
|
226
|
+
/** Portuguese copy with the same keys. */
|
|
227
|
+
export declare const pt: Record<ForgePanelKey, string>;
|
|
228
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Remote contribution and slot registrations of the forge panel. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { TypertRemoteContribution } from '@deepseek-ai/dsh-typert-protocol';
|
|
4
|
+
/** Services required before the Remote contribution mounts. */
|
|
5
|
+
export declare const inject: string[];
|
|
6
|
+
/** Registry id of the forge tab type, also its slot key. */
|
|
7
|
+
export declare const TAB_ID = "@deepseek-ai/dsh-experimental-client-ui-forge";
|
|
8
|
+
/** Kind of the forge tab. */
|
|
9
|
+
export declare const TAB_KIND = "forge-panel";
|
|
10
|
+
/**
|
|
11
|
+
* Mount the forge panel Remote, then the UI that calls it; the UI is withdrawn before the Remote.
|
|
12
|
+
* @param ctx - client plugin lifetime.
|
|
13
|
+
* @param contribution - generated forge panel Remote definitions.
|
|
14
|
+
* @returns the disposer that removes both contributions.
|
|
15
|
+
*/
|
|
16
|
+
export declare function mountForgePanel(ctx: Context, contribution: TypertRemoteContribution): Promise<() => Promise<void>>;
|
|
17
|
+
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** The forge facts a Session row shows, from the Session list and the change request states every row shares. */
|
|
2
|
+
import type { HostObservable, SnapshotSelectorHook } from '@deepseek-ai/dsh-client-ui-slots';
|
|
3
|
+
import type { UseSessions } from '@deepseek-ai/dsh-client-ui-session/client';
|
|
4
|
+
import type { SessionId } from '@deepseek-ai/dsh-session/types';
|
|
5
|
+
import type { SessionProjectionSummaryValues } from '@deepseek-ai/dsh-session-projection/types';
|
|
6
|
+
import type { ForgeChangeRequestListState, ForgeSessionWorktree } from '../types.ts';
|
|
7
|
+
import type { StreamSnapshot } from './source.ts';
|
|
8
|
+
import { type ChangeRequestTone } from './status.ts';
|
|
9
|
+
/** Change request states by URL as the Host streams them. */
|
|
10
|
+
export type ChangeRequestStates = StreamSnapshot<ReadonlyMap<string, ForgeChangeRequestListState>>;
|
|
11
|
+
/** Business face of the Session row entries: the change request states every row shares. */
|
|
12
|
+
export interface SessionListInjected {
|
|
13
|
+
readonly hooks: {
|
|
14
|
+
/** States by URL; the renderer binds it as `useStates`. */
|
|
15
|
+
readonly states: HostObservable<ChangeRequestStates>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** One visible change request of a Session with its last polled state, when known. */
|
|
19
|
+
export interface SessionListChangeRequest {
|
|
20
|
+
readonly url: string;
|
|
21
|
+
readonly state: ForgeChangeRequestListState | undefined;
|
|
22
|
+
readonly tone: ChangeRequestTone;
|
|
23
|
+
}
|
|
24
|
+
/** What a Session row and its hover card show. */
|
|
25
|
+
export interface SessionForgeFacts {
|
|
26
|
+
/** The worktree the panel created for the Session, while the Session works in it. */
|
|
27
|
+
readonly worktree: ForgeSessionWorktree | null;
|
|
28
|
+
/** Visible change requests, most urgent first; equally urgent ones keep their binding order. */
|
|
29
|
+
readonly changeRequests: readonly SessionListChangeRequest[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Derive a Session's facts from its listed projection values.
|
|
33
|
+
* @param values - the Session's projection values in the Session list, undefined before it is listed.
|
|
34
|
+
* @param states - change request states by URL.
|
|
35
|
+
* @returns the facts; a Session without a worktree or change requests shares one empty value.
|
|
36
|
+
*/
|
|
37
|
+
export declare function sessionForgeFacts(values: Readonly<Partial<SessionProjectionSummaryValues>> | undefined, states: ReadonlyMap<string, ForgeChangeRequestListState>): SessionForgeFacts;
|
|
38
|
+
/**
|
|
39
|
+
* Read one Session's facts, recomputed only when its listed values or the shared states change.
|
|
40
|
+
* @param useSessions - selector hook over the Session list.
|
|
41
|
+
* @param useStates - selector hook over the change request states.
|
|
42
|
+
* @param sessionId - the row's Session.
|
|
43
|
+
* @returns the facts.
|
|
44
|
+
*/
|
|
45
|
+
export declare function useSessionForgeFacts(useSessions: UseSessions, useStates: SnapshotSelectorHook<ChangeRequestStates>, sessionId: SessionId): SessionForgeFacts;
|
|
46
|
+
//# sourceMappingURL=session-list.d.ts.map
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Host stream sources (per-Session panel states and the change request states
|
|
3
|
+
* of the Session list), the store behind action notices, and the tab visibility store.
|
|
4
|
+
*/
|
|
5
|
+
import type { HostObservable } from '@deepseek-ai/dsh-client-ui-slots';
|
|
6
|
+
import type { ForgeChangeRequestListState, ForgeChangeRequestStatesFrame, ForgePanelState } from '../types.ts';
|
|
7
|
+
import type { ForgePanelKey } from './locales.ts';
|
|
8
|
+
/** What a stream source publishes: the value its frames built, and whether the stream ended while read. */
|
|
9
|
+
export interface StreamSnapshot<S> {
|
|
10
|
+
/** Value built from the frames so far. */
|
|
11
|
+
readonly state: S;
|
|
12
|
+
/** Whether the stream ended while surfaces still read it. */
|
|
13
|
+
readonly disconnected: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** What the panel surfaces of one Session read; `state` is null before the first one arrives. */
|
|
16
|
+
export type PanelSnapshot = StreamSnapshot<ForgePanelState | null>;
|
|
17
|
+
/** One open Host stream. */
|
|
18
|
+
export interface HostStream<F> extends AsyncIterable<F> {
|
|
19
|
+
/** Close the stream. */
|
|
20
|
+
dispose: () => void;
|
|
21
|
+
}
|
|
22
|
+
/** One open stream of panel states. */
|
|
23
|
+
export type PanelStream = HostStream<ForgePanelState>;
|
|
24
|
+
/** Stream opener and connection-reset subscription of a source. */
|
|
25
|
+
export interface StreamSourceDeps<F> {
|
|
26
|
+
/**
|
|
27
|
+
* Open the Host stream.
|
|
28
|
+
* @param signal - aborts the stream.
|
|
29
|
+
* @returns the stream.
|
|
30
|
+
*/
|
|
31
|
+
readonly open: (signal: AbortSignal) => HostStream<F>;
|
|
32
|
+
/**
|
|
33
|
+
* Subscribe to transport resets, after which an open stream no longer delivers.
|
|
34
|
+
* @param listener - called on each reset.
|
|
35
|
+
* @returns the unsubscribe function.
|
|
36
|
+
*/
|
|
37
|
+
readonly subscribeReset: (listener: () => void) => () => void;
|
|
38
|
+
}
|
|
39
|
+
/** Stream opener and connection-reset subscription of one Session's panel source. */
|
|
40
|
+
export type PanelSourceDeps = StreamSourceDeps<ForgePanelState>;
|
|
41
|
+
/** A value built from a Host stream that runs only while a surface subscribes. */
|
|
42
|
+
export interface StreamSource<S> {
|
|
43
|
+
/** Snapshot observable; the renderer binds it as a selector hook. */
|
|
44
|
+
readonly observable: HostObservable<StreamSnapshot<S>>;
|
|
45
|
+
/** Open the stream again after it ended; a no-op while it runs or nobody subscribes. */
|
|
46
|
+
readonly reconnect: () => void;
|
|
47
|
+
/** Close the stream and the reset subscription and drop every subscriber. */
|
|
48
|
+
readonly close: () => void;
|
|
49
|
+
}
|
|
50
|
+
/** Panel state of one Session, streamed only while a surface subscribes. */
|
|
51
|
+
export interface PanelSource {
|
|
52
|
+
/** Snapshot observable; the renderer binds it as `usePanel`. */
|
|
53
|
+
readonly hooks: {
|
|
54
|
+
readonly panel: HostObservable<PanelSnapshot>;
|
|
55
|
+
};
|
|
56
|
+
/** Open the stream again after it ended; a no-op while it runs or nobody subscribes. */
|
|
57
|
+
readonly reconnect: () => void;
|
|
58
|
+
/** Close the stream and the reset subscription and drop every subscriber. */
|
|
59
|
+
readonly close: () => void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a source that folds a Host stream into one value. The first
|
|
63
|
+
* subscriber opens the stream and the last one closes it; the value stays
|
|
64
|
+
* readable for the next subscriber. A stream that ends or fails while
|
|
65
|
+
* subscribed marks the snapshot disconnected until `reconnect` or a transport
|
|
66
|
+
* reset reopens it.
|
|
67
|
+
* @param deps - stream opener and reset subscription.
|
|
68
|
+
* @param initial - value before the first frame.
|
|
69
|
+
* @param fold - the value after one frame.
|
|
70
|
+
* @returns the source.
|
|
71
|
+
*/
|
|
72
|
+
export declare function createStreamSource<F, S>(deps: StreamSourceDeps<F>, initial: S, fold: (state: S, frame: F) => S): StreamSource<S>;
|
|
73
|
+
/**
|
|
74
|
+
* Create the panel source of one Session: the latest state the Host streamed.
|
|
75
|
+
* @param deps - stream opener and reset subscription.
|
|
76
|
+
* @returns the source.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createPanelSource(deps: PanelSourceDeps): PanelSource;
|
|
79
|
+
/**
|
|
80
|
+
* The known change request states after one `changeRequestStates` frame: a
|
|
81
|
+
* baseline replaces them, and a change replaces the states it carries.
|
|
82
|
+
* @param states - states by URL before the frame.
|
|
83
|
+
* @param frame - the frame.
|
|
84
|
+
* @returns states by URL after the frame.
|
|
85
|
+
*/
|
|
86
|
+
export declare function foldStates(states: ReadonlyMap<string, ForgeChangeRequestListState>, frame: ForgeChangeRequestStatesFrame): ReadonlyMap<string, ForgeChangeRequestListState>;
|
|
87
|
+
/** One action notice; `seq` keys the toast so a repeated notice restarts it. */
|
|
88
|
+
export interface ActionNotice {
|
|
89
|
+
/** Dictionary key of the notice text. */
|
|
90
|
+
readonly key: ForgePanelKey;
|
|
91
|
+
/** Values interpolated into the text. */
|
|
92
|
+
readonly params: Readonly<Record<string, string | number>>;
|
|
93
|
+
/** `success` reports a completed action; `failure` a refused or failed one. */
|
|
94
|
+
readonly tone: 'success' | 'failure';
|
|
95
|
+
/** Reverts the reported action, or undefined when it cannot be undone. */
|
|
96
|
+
readonly undo: (() => void) | undefined;
|
|
97
|
+
/** Increasing report number. */
|
|
98
|
+
readonly seq: number;
|
|
99
|
+
}
|
|
100
|
+
/** Optional parts of a reported notice. */
|
|
101
|
+
export interface NoticeOptions {
|
|
102
|
+
/** Values interpolated into the text. */
|
|
103
|
+
readonly params?: Readonly<Record<string, string | number>>;
|
|
104
|
+
/** Defaults to `failure`. */
|
|
105
|
+
readonly tone?: ActionNotice['tone'];
|
|
106
|
+
/** Reverts the reported action. */
|
|
107
|
+
readonly undo?: () => void;
|
|
108
|
+
}
|
|
109
|
+
/** Store that action wiring reports into and one `shell.overlay` entry reads. */
|
|
110
|
+
export interface NoticeSource {
|
|
111
|
+
/** Current notice, or null while none shows; the renderer binds it as `useNotice`. */
|
|
112
|
+
readonly hooks: {
|
|
113
|
+
readonly notice: HostObservable<ActionNotice | null>;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Show one notice, replacing the shown one.
|
|
117
|
+
* @param key - dictionary key of the text.
|
|
118
|
+
* @param options - interpolated values, tone, and undo action.
|
|
119
|
+
*/
|
|
120
|
+
readonly report: (key: ForgePanelKey, options?: NoticeOptions) => void;
|
|
121
|
+
/** Clear the shown notice. */
|
|
122
|
+
readonly dismiss: () => void;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Create the action notice store.
|
|
126
|
+
* @returns the store.
|
|
127
|
+
*/
|
|
128
|
+
export declare function createNoticeSource(): NoticeSource;
|
|
129
|
+
/** Whether one Session's forge tab is visible; the header entry reads it for its pressed state. */
|
|
130
|
+
export interface VisibilitySource {
|
|
131
|
+
/** Current visibility; the renderer binds it as `useVisible`. */
|
|
132
|
+
readonly hooks: {
|
|
133
|
+
readonly visible: HostObservable<boolean>;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* Record the tab's visibility.
|
|
137
|
+
* @param visible - whether the tab is visible.
|
|
138
|
+
*/
|
|
139
|
+
readonly set: (visible: boolean) => void;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Create the visibility store of one Session's forge tab, initially hidden.
|
|
143
|
+
* @returns the store.
|
|
144
|
+
*/
|
|
145
|
+
export declare function createVisibilitySource(): VisibilitySource;
|
|
146
|
+
//# sourceMappingURL=source.d.ts.map
|