@eddyskywalker/dsh-chatgpt-subscription 0.26.1 → 0.27.0
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/CHANGELOG.md +28 -0
- package/README.md +57 -0
- package/lib/client.js +2176 -116
- package/lib/client.js.map +1 -1
- package/lib/index.js +2112 -93
- package/lib/types/client/index.d.ts +2 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/progress-updates/contracts.d.ts +125 -0
- package/lib/types/client/progress-updates/contracts.d.ts.map +1 -0
- package/lib/types/client/progress-updates/guide-artwork.d.ts +28 -0
- package/lib/types/client/progress-updates/guide-artwork.d.ts.map +1 -0
- package/lib/types/client/progress-updates/host-source.d.ts +128 -0
- package/lib/types/client/progress-updates/host-source.d.ts.map +1 -0
- package/lib/types/client/progress-updates/index.d.ts +91 -0
- package/lib/types/client/progress-updates/index.d.ts.map +1 -0
- package/lib/types/client/progress-updates/locales.d.ts +127 -0
- package/lib/types/client/progress-updates/locales.d.ts.map +1 -0
- package/lib/types/client/progress-updates/markdown-lite.d.ts +60 -0
- package/lib/types/client/progress-updates/markdown-lite.d.ts.map +1 -0
- package/lib/types/client/progress-updates/progress-row.d.ts +87 -0
- package/lib/types/client/progress-updates/progress-row.d.ts.map +1 -0
- package/lib/types/client/progress-updates/settings-binding.d.ts +71 -0
- package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -0
- package/lib/types/client/progress-updates/settings-section.d.ts +57 -0
- package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -0
- package/lib/types/client/progress-updates/styles.d.ts +34 -0
- package/lib/types/client/progress-updates/styles.d.ts.map +1 -0
- package/lib/types/client/progress-updates/tool-name.d.ts +14 -0
- package/lib/types/client/progress-updates/tool-name.d.ts.map +1 -0
- package/lib/types/client/progress-updates/updates-panel.d.ts +113 -0
- package/lib/types/client/progress-updates/updates-panel.d.ts.map +1 -0
- package/lib/types/client/step-code/locales.d.ts +2 -2
- package/lib/types/client/workbuddy/WorkBuddySection.d.ts.map +1 -1
- package/lib/types/client/workbuddy/locales.d.ts +108 -0
- package/lib/types/client/workbuddy/locales.d.ts.map +1 -1
- package/lib/types/client/workbuddy/styles.d.ts.map +1 -1
- package/lib/types/client/workbuddy/useWorkBuddySection.d.ts +9 -1
- package/lib/types/client/workbuddy/useWorkBuddySection.d.ts.map +1 -1
- package/lib/types/host/progress-updates/index.d.ts +90 -0
- package/lib/types/host/progress-updates/index.d.ts.map +1 -0
- package/lib/types/host/progress-updates/nudge.d.ts +91 -0
- package/lib/types/host/progress-updates/nudge.d.ts.map +1 -0
- package/lib/types/host/progress-updates/prompt.d.ts +34 -0
- package/lib/types/host/progress-updates/prompt.d.ts.map +1 -0
- package/lib/types/host/progress-updates/routes.d.ts +39 -0
- package/lib/types/host/progress-updates/routes.d.ts.map +1 -0
- package/lib/types/host/progress-updates/store.d.ts +74 -0
- package/lib/types/host/progress-updates/store.d.ts.map +1 -0
- package/lib/types/host/progress-updates/tool.d.ts +42 -0
- package/lib/types/host/progress-updates/tool.d.ts.map +1 -0
- package/lib/types/host/reasoning-collapse-guard/index.d.ts +5 -0
- package/lib/types/host/reasoning-collapse-guard/index.d.ts.map +1 -1
- package/lib/types/host/web-provider-reconciler.d.ts +34 -0
- package/lib/types/host/web-provider-reconciler.d.ts.map +1 -0
- package/lib/types/host/workbuddy/account-pool.d.ts +32 -1
- package/lib/types/host/workbuddy/account-pool.d.ts.map +1 -1
- package/lib/types/host/workbuddy/adapter.d.ts +32 -0
- package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
- package/lib/types/host/workbuddy/atrest.d.ts +98 -0
- package/lib/types/host/workbuddy/atrest.d.ts.map +1 -0
- package/lib/types/host/workbuddy/checkin.d.ts +16 -0
- package/lib/types/host/workbuddy/checkin.d.ts.map +1 -1
- package/lib/types/host/workbuddy/client.d.ts +9 -0
- package/lib/types/host/workbuddy/client.d.ts.map +1 -1
- package/lib/types/host/workbuddy/dsml.d.ts +55 -0
- package/lib/types/host/workbuddy/dsml.d.ts.map +1 -0
- package/lib/types/host/workbuddy/guardrails.d.ts +111 -0
- package/lib/types/host/workbuddy/guardrails.d.ts.map +1 -0
- package/lib/types/host/workbuddy/mapper.d.ts +11 -0
- package/lib/types/host/workbuddy/mapper.d.ts.map +1 -1
- package/lib/types/host/workbuddy/model-catalog.d.ts +8 -1
- package/lib/types/host/workbuddy/model-catalog.d.ts.map +1 -1
- package/lib/types/host/workbuddy/outbound-identity.d.ts +66 -0
- package/lib/types/host/workbuddy/outbound-identity.d.ts.map +1 -0
- package/lib/types/host/workbuddy/routes.d.ts +8 -1
- package/lib/types/host/workbuddy/routes.d.ts.map +1 -1
- package/lib/types/host/workbuddy/token-store.d.ts +93 -0
- package/lib/types/host/workbuddy/token-store.d.ts.map +1 -1
- package/lib/types/index.d.ts +63 -5
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/shared/workbuddy-contracts.d.ts +54 -2
- package/lib/types/shared/workbuddy-contracts.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ import { type WorkBuddyLocaleKey } from './workbuddy/locales.ts';
|
|
|
9
9
|
import { type GlmCodingPlanLocaleKey } from './glm-coding-plan/locales.ts';
|
|
10
10
|
import { type OllamaLocaleKey } from './ollama/locales.ts';
|
|
11
11
|
import { type StepCodeLocaleKey } from './step-code/locales.ts';
|
|
12
|
+
import { type ProgressUpdatesLocaleKey } from './progress-updates/locales.ts';
|
|
12
13
|
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
13
14
|
/**
|
|
14
15
|
* Every namespace this plugin registers, typed by that line's own dictionary.
|
|
@@ -29,6 +30,7 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
|
29
30
|
'dsh-glm-coding-plan': GlmCodingPlanLocaleKey;
|
|
30
31
|
'dsh-ollama': OllamaLocaleKey;
|
|
31
32
|
'dsh-step-code': StepCodeLocaleKey;
|
|
33
|
+
'dsh-progress-updates': ProgressUpdatesLocaleKey;
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
36
|
export declare const inject: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAenE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAM/D,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAGtH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlG,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAExH,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5G,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGxH,OAAO,EAAgD,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAG9G,OAAO,EAA0D,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAElI,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElG,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAenE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAM/D,OAAO,EAAoD,KAAK,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAGtH,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGlG,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAExH,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG5G,OAAO,EAAqD,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAGxH,OAAO,EAAgD,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAG9G,OAAO,EAA0D,KAAK,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAElI,OAAO,EAA0C,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAElG,OAAO,EAA+C,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAK5G,OAAO,EAA6D,KAAK,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAExI,OAAO,QAAQ,kCAAkC,CAAC;IAChD;;;;;;;OAOG;IACH,UAAU,kBAAkB;QAC1B,0BAA0B,EAAE,SAAS,CAAA;QACrC,iBAAiB,EAAE,oBAAoB,CAAA;QACvC,YAAY,EAAE,eAAe,CAAA;QAC7B,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,eAAe,EAAE,iBAAiB,CAAA;QAClC,kBAAkB,EAAE,oBAAoB,CAAA;QACxC,eAAe,EAAE,kBAAkB,CAAA;QACnC,qBAAqB,EAAE,sBAAsB,CAAA;QAC7C,YAAY,EAAE,eAAe,CAAA;QAC7B,eAAe,EAAE,iBAAiB,CAAA;QAClC,sBAAsB,EAAE,wBAAwB,CAAA;KACjD;CACF;AAED,eAAO,MAAM,MAAM,UAQlB,CAAA;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAwJ9C"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「进展更新」浏览器半边的平台契约与线格式类型。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么要自己声明槽位
|
|
5
|
+
*
|
|
6
|
+
* `tool.call.toolview` 与 `settings.section` 由本插件已安装的 ui-tool /
|
|
7
|
+
* ui-settings 在 `SlotMap` 上合并出来,所以**这两条不在这里重复声明**——同一个
|
|
8
|
+
* SlotsMap 条目被两份形状不同的 augmentation 各写一次是编译错误。
|
|
9
|
+
*
|
|
10
|
+
* 而右侧栏的两处槽位(`sidebar.right.pane.tab` / `sidebar.right.pane.tab.title`)
|
|
11
|
+
* 以及 `ctx.sidebarRightTabs` / `ctx.sidebarRight` 两个服务,由 ui-sidebar-right
|
|
12
|
+
* 提供,它不是本插件的依赖:装了才有,没装就没有。为了这两条槽位去依赖那个包,
|
|
13
|
+
* 等于把一个可选能力变成硬依赖。所以这里按平台同形把它们**声明**出来——运行
|
|
14
|
+
* 语义完全由平台的槽位注册表决定,这里只是让 register/inject 的实参过类型检查。
|
|
15
|
+
*
|
|
16
|
+
* ## 为什么 ProgressUpdate 在这里再写一遍
|
|
17
|
+
*
|
|
18
|
+
* 宿主那一份在 `src/host/progress-updates/store.ts`。客户端 tsconfig 的
|
|
19
|
+
* `rootDir` 是 `src`、include 只覆盖 `src/client/**` 与 `src/shared/**`,
|
|
20
|
+
* 从浏览器半边 import 宿主模块既越界也会把宿主依赖拖进客户端闭包。两份形状必须
|
|
21
|
+
* 逐字一致,由 `test/progress-updates-client.test.tsx` 的双向赋值断言钉住。
|
|
22
|
+
*
|
|
23
|
+
* @module @eddyskywalker/dsh-chatgpt-subscription/client/progress-updates/contracts
|
|
24
|
+
*/
|
|
25
|
+
/** 一条已展示的进展(与 `src/host/progress-updates/store.ts` 的 `ProgressUpdate` 同形)。 */
|
|
26
|
+
export interface ProgressUpdate {
|
|
27
|
+
/** 稳定标识,同一会话内唯一。 */
|
|
28
|
+
id: string;
|
|
29
|
+
/** 单行标题,约 60 字以内,用户语言,纯文本,无 Markdown。 */
|
|
30
|
+
title?: string;
|
|
31
|
+
/** 详情正文,约 1000 字以内,轻 Markdown。 */
|
|
32
|
+
message: string;
|
|
33
|
+
/** 产生时刻,Unix 毫秒时间戳。 */
|
|
34
|
+
at: number;
|
|
35
|
+
/** 来源标签(计数会话 id)。 */
|
|
36
|
+
source?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 右侧栏页签类型的注册面(阶段一)。
|
|
40
|
+
*
|
|
41
|
+
* 字段与官方 `SidebarRightTabDefinition` 同形,完整定义在 ui-sidebar-right 的
|
|
42
|
+
* tab-registry 里;本插件只用到 id / kind / title。
|
|
43
|
+
*/
|
|
44
|
+
export interface SidebarRightTabDefinition {
|
|
45
|
+
/** 本实现在页签系统里的身份,全域唯一,也是阶段二注册用的 key。 */
|
|
46
|
+
readonly id: string;
|
|
47
|
+
/** 页签类型判别值,`openTab` 用它点名。 */
|
|
48
|
+
readonly kind: string;
|
|
49
|
+
/** 资源地址 glob;**省略 = 页面型页签**,按 kind 打开。本面板不认领地址。 */
|
|
50
|
+
readonly patterns?: readonly string[];
|
|
51
|
+
/** 优先级档位;不表态时平台按 extension 处理。 */
|
|
52
|
+
readonly priority?: 'extension' | 'builtin' | 'fallback';
|
|
53
|
+
/** 页签条上的标题,打开时捕获。 */
|
|
54
|
+
readonly title: (address: string) => string;
|
|
55
|
+
/**
|
|
56
|
+
* 右侧栏 guide 页里的入口格;省略则这一页签不出现在 guide 上。
|
|
57
|
+
*
|
|
58
|
+
* 这是「用户怎么到达这个面板」的**可见入口**:页签类型只是声明,guide 条目才是
|
|
59
|
+
* 那块可以点的卡片。条目的 `icon` 收一个组件,平台自家的几格都带自己的品牌色。
|
|
60
|
+
*/
|
|
61
|
+
readonly guide?: readonly SidebarRightGuideEntry[];
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 右侧栏 guide 页里的一个入口格。
|
|
65
|
+
*
|
|
66
|
+
* 字段与官方 `SidebarRightGuideEntry` 同形(完整定义在 ui-sidebar-right 的
|
|
67
|
+
* tab-registry 里);本插件用到的就是标题、一行说明与图标。
|
|
68
|
+
*/
|
|
69
|
+
export interface SidebarRightGuideEntry {
|
|
70
|
+
/** 本类型内部唯一的入口标识。 */
|
|
71
|
+
readonly id: string;
|
|
72
|
+
/** 在全部类型的所有入口里升序排位。 */
|
|
73
|
+
readonly order: number;
|
|
74
|
+
/** 卡片标题(惰性求值,切语言无需重注册)。 */
|
|
75
|
+
readonly title: () => string;
|
|
76
|
+
/** 标题下的一行说明;guide 条目少时才显示。 */
|
|
77
|
+
readonly description?: () => string;
|
|
78
|
+
/** 标题前的彩色标记;省略时平台画一个立方体占位。 */
|
|
79
|
+
readonly icon?: import('react').ComponentType<{
|
|
80
|
+
size?: number;
|
|
81
|
+
className?: string;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
/** 右侧栏页签类型注册表(阶段一的服务面)。 */
|
|
85
|
+
export interface SidebarRightTabRegistryService {
|
|
86
|
+
/**
|
|
87
|
+
* 注册一个页签类型。
|
|
88
|
+
* @param definition - 类型的静态声明。
|
|
89
|
+
* @returns 幂等卸载函数。
|
|
90
|
+
*/
|
|
91
|
+
register(definition: SidebarRightTabDefinition): () => void;
|
|
92
|
+
/**
|
|
93
|
+
* 读一个 kind 当前生效的类型。
|
|
94
|
+
* @param kind - 类型判别值。
|
|
95
|
+
* @returns 注册定义;没有注册时 undefined。
|
|
96
|
+
*/
|
|
97
|
+
get?(kind: string): unknown;
|
|
98
|
+
}
|
|
99
|
+
/** 右侧栏导航面:按 kind 打开一个页面型页签。 */
|
|
100
|
+
export interface SidebarRightService {
|
|
101
|
+
/**
|
|
102
|
+
* 按 kind 打开一个页面型页签。
|
|
103
|
+
* @param kind - 阶段一声明过的类型判别值。
|
|
104
|
+
*/
|
|
105
|
+
openTab(kind: string): void;
|
|
106
|
+
}
|
|
107
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
108
|
+
interface SlotMap {
|
|
109
|
+
/**
|
|
110
|
+
* 右侧栏一个页签的正文,按页签类型的 id 分发(session 作用域的注入工厂会
|
|
111
|
+
* 拿到当前会话 id)。本页签不消费平台给的其他注入面,所以只声明驱动
|
|
112
|
+
* register/inject 过类型检查的这两轴。
|
|
113
|
+
*/
|
|
114
|
+
'sidebar.right.pane.tab': {
|
|
115
|
+
kind: 'keyed';
|
|
116
|
+
scope: 'session';
|
|
117
|
+
};
|
|
118
|
+
/** 同一个页签在标签条上显示的标题。 */
|
|
119
|
+
'sidebar.right.pane.tab.title': {
|
|
120
|
+
kind: 'keyed';
|
|
121
|
+
scope: 'session';
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,uCAAuC;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAA;IACxD,qBAAqB;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;IAC3C;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;CACnD;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,oBAAoB;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAA;IAC5B,8BAA8B;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,CAAA;IACnC,8BAA8B;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,OAAO,EAAE,aAAa,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACrF;AAED,2BAA2B;AAC3B,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,yBAAyB,GAAG,MAAM,IAAI,CAAA;IAC3D;;;;OAIG;IACH,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B;AAED,+BAA+B;AAC/B,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,OAAO;QACf;;;;WAIG;QACH,wBAAwB,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAA;QAC7D,uBAAuB;QACvB,8BAA8B,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE,SAAS,CAAA;SAAE,CAAA;KACpE;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 右侧栏 guide 页里「进展更新」那一格用的彩色标记。
|
|
3
|
+
*
|
|
4
|
+
* 为什么自带颜色:guide 的图标槽位收的是 `ComponentType<IconProps>`,平台自家的
|
|
5
|
+
* 那几个(`plugin-artwork.tsx` 的 PluginArtworkTerminal / Loop / Subagent / Search)
|
|
6
|
+
* 都**不骑 currentColor**,各自带品牌色与渐变——截图里那四格的颜色差异就是这么来的。
|
|
7
|
+
* 所以这里照它们的样子画:36×36 viewBox、{size, className}、固定调色板。
|
|
8
|
+
*
|
|
9
|
+
* 图形语义:一条向上的折线(进展)加一个末端的箭头,与对话流里那一行的「状态点 +
|
|
10
|
+
* 标题」互为同一件事的两种画法。渐变用 useId 生成前缀,避免同页多实例时
|
|
11
|
+
* `url(#…)` 全部解析到第一个实例。
|
|
12
|
+
*
|
|
13
|
+
* @module @eddyskywalker/dsh-chatgpt-subscription/client/progress-updates/guide-artwork
|
|
14
|
+
*/
|
|
15
|
+
/** 图标组件的入参,与平台 `IconProps` 同形(本包不依赖 ui-primitives 的运行时包)。 */
|
|
16
|
+
export interface GuideArtworkProps {
|
|
17
|
+
/** 边长(px)。guide 里平台传 36。 */
|
|
18
|
+
size?: number;
|
|
19
|
+
/** 追加的类名。 */
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 「进展更新」的彩色标记:一条攀升的折线,末端带箭头。
|
|
24
|
+
* @param props - 尺寸与类名。
|
|
25
|
+
* @returns 36×36 的彩色 SVG。
|
|
26
|
+
*/
|
|
27
|
+
export declare function ProgressUpdatesArtwork({ size, className }: GuideArtworkProps): React.JSX.Element;
|
|
28
|
+
//# sourceMappingURL=guide-artwork.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide-artwork.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/guide-artwork.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAoCrG"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器半边的**真实取数通道**:轮询宿主路由,把结果包成面板认的快照源。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么是 HTTP
|
|
5
|
+
*
|
|
6
|
+
* 宿主半边(`src/host/progress-updates/`)跑在 DSH 宿主进程里,浏览器半边跑在
|
|
7
|
+
* 用户浏览器的另一个运行时里:两者之间没有共享对象、没有事件总线,只有同源
|
|
8
|
+
* HTTP。所以这里的数据来源只有一条 —— `GET /api/dsh-progress-updates/updates`
|
|
9
|
+
* (宿主那一侧的注册见 `src/host/progress-updates/routes.ts`,路径是冻结契约,
|
|
10
|
+
* 搬家时不能顺手改名,否则面板读到的是 404)。**不读对话流**:进展是 agent 自己
|
|
11
|
+
* 汇报的,不是从消息流里刮出来的。
|
|
12
|
+
*
|
|
13
|
+
* ## 生命周期(谁在什么时候轮询)
|
|
14
|
+
*
|
|
15
|
+
* 轮询不是常驻的。{@link createHostProgressSource} 返回的源在**第一个订阅者到来
|
|
16
|
+
* 时**才开始轮询,**最后一个订阅者离开时**停表并清空定时器。面板只在页签打开、
|
|
17
|
+
* 页签正文组件挂载时才订阅(`useSyncExternalStore`),所以页签关着就完全不发请求。
|
|
18
|
+
*
|
|
19
|
+
* 页面切到后台(`document.hidden`)时也停表,回到前台立刻补一次再继续 —— 和
|
|
20
|
+
* `dsh-usage` 的设置页同一个节奏。判断不出可见性时退化成固定间隔轮询,见
|
|
21
|
+
* {@link isDocumentVisible}。
|
|
22
|
+
*
|
|
23
|
+
* ## 失败策略
|
|
24
|
+
*
|
|
25
|
+
* 403 / 500 / 网络错误 / 超时 / JSON 坏掉 —— 一律**吞掉**,保留最后一份成功快照,
|
|
26
|
+
* 不抛错、不白屏。面板因此永远显示"已知的最新状态",而不是因为一次抖动整块消失。
|
|
27
|
+
* 首次请求就失败时快照是空数组,面板渲染正常的空态。
|
|
28
|
+
*
|
|
29
|
+
* @module @eddyskywalker/dsh-chatgpt-subscription/client/progress-updates/host-source
|
|
30
|
+
*/
|
|
31
|
+
import type { ProgressUpdate } from './contracts.ts';
|
|
32
|
+
import type { ProgressSnapshotSource } from './updates-panel.tsx';
|
|
33
|
+
/**
|
|
34
|
+
* 本路由族的前缀(**文档相对**,不带前导斜杠)。
|
|
35
|
+
*
|
|
36
|
+
* 宿主那边注册的是绝对路径 `/api/dsh-progress-updates/updates`;浏览器这边必须写
|
|
37
|
+
* 成不带前导斜杠的相对路径:GUI 以 `<base href="./">` 提供,子路径部署时相对路径
|
|
38
|
+
* 才会解析到该部署的入口目录下,前导斜杠会逃逸出这个前缀、永远打不到路由
|
|
39
|
+
* (同 dsh-usage / dsh-git-graph 的处理)。
|
|
40
|
+
*/
|
|
41
|
+
export declare const PROGRESS_UPDATES_PATH = "api/dsh-progress-updates/updates";
|
|
42
|
+
/** 轮询间隔(毫秒)。进展更新是人读的一行行文字,2 秒足够跟手,也不至于压宿主。 */
|
|
43
|
+
export declare const PROGRESS_POLL_MS = 2000;
|
|
44
|
+
/** 单次请求的硬上限;宿主卡住时不能把请求越堆越多。 */
|
|
45
|
+
export declare const PROGRESS_FETCH_TIMEOUT_MS = 8000;
|
|
46
|
+
/** 路由返回的响应体形状(与宿主的 `{ updates }` 对齐)。 */
|
|
47
|
+
export interface ProgressUpdatesResponse {
|
|
48
|
+
/** 该会话的进展,按产生顺序排列。 */
|
|
49
|
+
updates: ProgressUpdate[];
|
|
50
|
+
}
|
|
51
|
+
/** 定时器宿主的最小形状;抽出来是为了测试能塞假时钟。 */
|
|
52
|
+
export interface ProgressTimers {
|
|
53
|
+
/** 起一个重复定时器,返回句柄。 */
|
|
54
|
+
setInterval: (handler: () => void, ms: number) => unknown;
|
|
55
|
+
/** 清掉重复定时器。 */
|
|
56
|
+
clearInterval: (handle: unknown) => void;
|
|
57
|
+
/** 起一个一次性定时器,返回句柄。 */
|
|
58
|
+
setTimeout: (handler: () => void, ms: number) => unknown;
|
|
59
|
+
/** 清掉一次性定时器。 */
|
|
60
|
+
clearTimeout: (handle: unknown) => void;
|
|
61
|
+
}
|
|
62
|
+
/** 取数客户端的可注入依赖(测试用它塞假 fetch / 假时钟 / 假可见性)。 */
|
|
63
|
+
export interface ProgressFetchDeps {
|
|
64
|
+
/**
|
|
65
|
+
* fetch 实现;缺省时**每次请求**现取 `globalThis.fetch`。
|
|
66
|
+
*
|
|
67
|
+
* 现取而不是在工厂里抓一份闭包,是为了让测试可以在 apply 之后替换
|
|
68
|
+
* `globalThis.fetch`,也为了让某些在 fetch 外面包一层鉴权的宿主环境生效。
|
|
69
|
+
*/
|
|
70
|
+
fetch?: typeof globalThis.fetch;
|
|
71
|
+
/** 轮询间隔(毫秒),缺省 {@link PROGRESS_POLL_MS}。 */
|
|
72
|
+
pollMs?: number;
|
|
73
|
+
/** 单次请求超时(毫秒),缺省 {@link PROGRESS_FETCH_TIMEOUT_MS}。 */
|
|
74
|
+
timeoutMs?: number;
|
|
75
|
+
/** 是否可见(缺省读 `document.visibilityState`);不可见时停表。 */
|
|
76
|
+
isVisible?: () => boolean;
|
|
77
|
+
/** 定时器宿主,缺省 {@link DEFAULT_TIMERS}。 */
|
|
78
|
+
timers?: ProgressTimers;
|
|
79
|
+
/** 解析响应体,缺省按 {@link ProgressUpdatesResponse} 取 `updates`。 */
|
|
80
|
+
decode?: (body: unknown) => readonly ProgressUpdate[];
|
|
81
|
+
/** 观测一次失败(错误已被吞掉,只为测试与诊断)。 */
|
|
82
|
+
onError?: (error: unknown) => void;
|
|
83
|
+
}
|
|
84
|
+
/** 面板数据源 + 一个显式停止入口(apply 卸载时调用)。 */
|
|
85
|
+
export interface HostProgressSource extends ProgressSnapshotSource {
|
|
86
|
+
/**
|
|
87
|
+
* 停止轮询并清空监听(幂等,且**是终态**)。
|
|
88
|
+
*
|
|
89
|
+
* 停止之后新的订阅者不会让它重新起表:卸载路径上可能还有一次迟到重订阅,
|
|
90
|
+
* 那时重新起表就等于给一个已经卸载的插件留下常驻定时器。快照仍然可读。
|
|
91
|
+
*/
|
|
92
|
+
stop(): void;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 判断页面当前是否可见。
|
|
96
|
+
*
|
|
97
|
+
* 只在明确拿到 `hidden` 时判为不可见:恒为 `prerender` 的嵌入式 WebView、或者
|
|
98
|
+
* 压根没有 `document` 的运行环境都会落到"可见"这一侧 —— **退化行为是继续按固定
|
|
99
|
+
* 间隔轮询**,而不是静默停摆(面板停摆比多轮询几次糟糕得多)。
|
|
100
|
+
* @returns 是否应该继续轮询。
|
|
101
|
+
*/
|
|
102
|
+
export declare function isDocumentVisible(): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* 拼出这次请求的地址。
|
|
105
|
+
*
|
|
106
|
+
* 拿得到会话 id 就带上 `?session=<id>`(宿主按会话分桶);拿不到(槽位没有把
|
|
107
|
+
* sessionId 传下来)就**退化到不带参数**的请求 —— 宿主对空 session 的语义是
|
|
108
|
+
* "当前/合并桶"(`src/host/progress-updates/index.ts` 的 `updatesOf('')` 回退到
|
|
109
|
+
* `session` 桶),因此单会话部署下仍能拿到进展。
|
|
110
|
+
* @param sessionId - 当前会话 id,空串/undefined 表示退化。
|
|
111
|
+
* @returns 文档相对的请求地址。
|
|
112
|
+
*/
|
|
113
|
+
export declare function progressUpdatesUrl(sessionId?: string): string;
|
|
114
|
+
/**
|
|
115
|
+
* 起一个轮询数据源:真正发 `GET` 请求,把结果喂给面板。
|
|
116
|
+
*
|
|
117
|
+
* 语义要点:
|
|
118
|
+
* - 惰性:没有订阅者时不发任何请求(页签关着 = 零流量);
|
|
119
|
+
* - 稳定引用:两次成功请求之间 `getSnapshot()` 返回**同一个数组对象**,
|
|
120
|
+
* `useSyncExternalStore` 不会判成无限更新;新快照内容不变时也沿用旧引用;
|
|
121
|
+
* - 吞错:任何失败都只是"这次没更新",最后一份快照原样保留。
|
|
122
|
+
*
|
|
123
|
+
* @param sessionId - 当前会话 id(可能为空:见 {@link progressUpdatesUrl} 的退化说明)。
|
|
124
|
+
* @param deps - 可注入依赖(fetch、定时器、可见性、间隔)。
|
|
125
|
+
* @returns 面板数据源 + 显式停止入口。
|
|
126
|
+
*/
|
|
127
|
+
export declare function createHostProgressSource(sessionId?: string, deps?: ProgressFetchDeps): HostProgressSource;
|
|
128
|
+
//# sourceMappingURL=host-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-source.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/host-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAEjE;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,qCAAqC,CAAA;AAEvE,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,OAAQ,CAAA;AAErC,+BAA+B;AAC/B,eAAO,MAAM,yBAAyB,OAAQ,CAAA;AAE9C,yCAAyC;AACzC,MAAM,WAAW,uBAAuB;IACtC,sBAAsB;IACtB,OAAO,EAAE,cAAc,EAAE,CAAA;CAC1B;AAED,gCAAgC;AAChC,MAAM,WAAW,cAAc;IAC7B,qBAAqB;IACrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;IACzD,eAAe;IACf,aAAa,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;IACxC,sBAAsB;IACtB,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAA;IACxD,gBAAgB;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;CACxC;AAUD,8CAA8C;AAC9C,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IAC/B,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAA;IACzB,uCAAuC;IACvC,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS,cAAc,EAAE,CAAA;IACrD,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,kBAAmB,SAAQ,sBAAsB;IAChE;;;;;OAKG;IACH,IAAI,IAAI,IAAI,CAAA;CACb;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C;AAoBD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7D;AAsBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,GAAE,iBAAsB,GAC3B,kBAAkB,CAoJpB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「进展更新」浏览器半边的挂载点 —— 本插件的一个子模块,由
|
|
3
|
+
* `src/client/index.tsx` 调用 {@link installProgressUpdatesClient}。
|
|
4
|
+
*
|
|
5
|
+
* 复刻 Kimi Code 的「进展更新」在网页里的那一半。挂四样东西:
|
|
6
|
+
*
|
|
7
|
+
* 1. **对话流的进展行**(主形态):给 `progress_update` 工具注册
|
|
8
|
+
* `tool.call.toolview` 视图,agent 每发一条进展,对话里就多一行;
|
|
9
|
+
* 2. 侧栏页签的**类型**(阶段一,`ctx.sidebarRightTabs.register`)——
|
|
10
|
+
* 没有它,下面的正文与标题注册得再对,面板也永远打不开;
|
|
11
|
+
* 3. 侧栏页签的正文与标题(阶段二,`sidebar.right.pane.tab` /
|
|
12
|
+
* `sidebar.right.pane.tab.title`),键都是阶段一的 id;
|
|
13
|
+
* 4. 设置页里的「进展更新」分区(`settings.section`,**独立一格**,不与订阅服务
|
|
14
|
+
* 那格合并),点击「打开进展面板」调 `ctx.sidebarRight.openTab(kind)`。
|
|
15
|
+
*
|
|
16
|
+
* 字典与样式**不在这里登记**:`src/client/index.tsx` 像其余每条线路一样,自己
|
|
17
|
+
* `ctx.locale.register(NS_PROGRESS_UPDATES, …)` 并安装样式表,本模块只挂槽位
|
|
18
|
+
* ——同一个命名空间注册两次在真实 locale 服务里会抛重复登记,那是会被吞掉但毫无
|
|
19
|
+
* 意义的第二次调用。
|
|
20
|
+
*
|
|
21
|
+
* ## 三段式依赖与降级
|
|
22
|
+
*
|
|
23
|
+
* ui-sidebar-right 不一定装着:页签类型注册与打开面板都在「服务在不在」的检查
|
|
24
|
+
* 之后才做,缺了它就只留对话流行与设置页(按钮点了没反应而不是报错)。对话流视图
|
|
25
|
+
* 本身只依赖 slots,所以它一定挂得上。
|
|
26
|
+
*
|
|
27
|
+
* ## 数据从哪来
|
|
28
|
+
*
|
|
29
|
+
* 侧栏面板**不读对话流**,它的数据只来自宿主半边的
|
|
30
|
+
* `GET /api/dsh-progress-updates/updates?session=<id>` 路由
|
|
31
|
+
* (`src/host/progress-updates/routes.ts`)。宿主与浏览器是两个运行时,中间只有
|
|
32
|
+
* 同源 HTTP,所以浏览器这边必须**主动去读** —— 轮询客户端在 `./host-source.ts`。
|
|
33
|
+
*
|
|
34
|
+
* @module @eddyskywalker/dsh-chatgpt-subscription/client/progress-updates
|
|
35
|
+
*/
|
|
36
|
+
import type { Context as ClientContext } from '@deepseek-ai/cordis';
|
|
37
|
+
import { type ProgressSnapshotSource } from './updates-panel.tsx';
|
|
38
|
+
import { type ProgressSettingsForm } from './settings-binding.ts';
|
|
39
|
+
/**
|
|
40
|
+
* 本实现在右侧栏页签系统里的身份:它既是阶段一 `sidebarRightTabs` 里的 `id`,
|
|
41
|
+
* 也是阶段二两处 keyed 槽位注册用的键。
|
|
42
|
+
*/
|
|
43
|
+
export declare const PANEL_TAB_ID = "@eddyskywalker/dsh-chatgpt-subscription/progress-updates";
|
|
44
|
+
/**
|
|
45
|
+
* 页签类型判别值(`kind`):`ctx.sidebarRight.openTab` 用它点名。语义上是
|
|
46
|
+
* 「一类页签」,所以与上面的身份分开写。
|
|
47
|
+
*/
|
|
48
|
+
export declare const PANEL_TAB_KIND = "progress-updates";
|
|
49
|
+
/**
|
|
50
|
+
* 设置页那一格的 id。
|
|
51
|
+
*
|
|
52
|
+
* **独立一格**:本插件的订阅服务 hub 注册的是 `subscription-hub`(order 45),
|
|
53
|
+
* 进展更新不进那一格——用户要求它是一个单独的分区。
|
|
54
|
+
*/
|
|
55
|
+
export declare const SETTINGS_SECTION_ID = "progress-updates";
|
|
56
|
+
/**
|
|
57
|
+
* 导航顺序:**150**,排在所有既有条目之后。
|
|
58
|
+
*
|
|
59
|
+
* 既有 order 分布(plugin 侧 `subscription-hub` = 45;平台侧 general=0、
|
|
60
|
+
* models=10、plugins=15、agent-presets=20、account=-10)。150 远在这条线之外,
|
|
61
|
+
* 既不会撞号,也不会把订阅服务那一格挤到别的位置——新条目只往后拿号。
|
|
62
|
+
*/
|
|
63
|
+
export declare const SETTINGS_SECTION_ORDER = 150;
|
|
64
|
+
/** 浏览器半边的挂载参数。 */
|
|
65
|
+
export interface ProgressUpdatesClientOptions {
|
|
66
|
+
/**
|
|
67
|
+
* 面板数据源;**显式传入时优先**(测试、将来替换取数实现都走这里)。
|
|
68
|
+
* 缺省时按会话各建一份宿主路由轮询源,见 {@link createHostProgressSource}。
|
|
69
|
+
*/
|
|
70
|
+
source?: ProgressSnapshotSource;
|
|
71
|
+
/**
|
|
72
|
+
* 打开侧栏面板的通道;缺省时读 `ctx.sidebarRight`。测试注入一个假通道来断言
|
|
73
|
+
* 「按钮真的调了 openTab」。
|
|
74
|
+
*/
|
|
75
|
+
openPanel?: (kind: string) => void;
|
|
76
|
+
/**
|
|
77
|
+
* 设置表单通道;缺省时从 `ctx.configForms` 现取。测试注入一个假的来断言
|
|
78
|
+
* 「开关写的是本插件 Config 的那两个字段」。
|
|
79
|
+
*/
|
|
80
|
+
settings?: ProgressSettingsForm;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 挂载「进展更新」的浏览器半边。
|
|
84
|
+
*
|
|
85
|
+
* 失败策略与家族其它模块一致:槽位/页签注册失败只吞掉、不抛出 —— web shell 在
|
|
86
|
+
* 插件 apply 抛错时会整页启动失败,外部插件不能把 GUI 带下水。
|
|
87
|
+
* @param ctx - 浏览器根上下文。
|
|
88
|
+
* @param options - 可选的数据源、打开面板通道与设置表单通道。
|
|
89
|
+
*/
|
|
90
|
+
export declare function installProgressUpdatesClient(ctx: ClientContext, options?: ProgressUpdatesClientOptions): void;
|
|
91
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAMnE,OAAO,EAA+C,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAG9G,OAAO,EAA8B,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAG7F;;;GAGG;AACH,eAAO,MAAM,YAAY,6DAA6D,CAAA;AAEtF;;;GAGG;AACH,eAAO,MAAM,cAAc,qBAAqB,CAAA;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qBAAqB,CAAA;AAErD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC,kBAAkB;AAClB,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC;;;OAGG;IACH,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAChC;AA4CD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,4BAAiC,GAAG,IAAI,CA+KjH"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「进展更新」在 locale 服务里的命名空间。
|
|
3
|
+
*
|
|
4
|
+
* 跟着本插件其余线路的命名习惯走(`dsh-kimi-code`、`dsh-step-code`、`dsh-ollama`
|
|
5
|
+
* ……都是「dsh-<线路>」):新线路并入本插件的字典体系,而不是另开一个与包名无关
|
|
6
|
+
* 的命名空间。
|
|
7
|
+
*/
|
|
8
|
+
export declare const NS_PROGRESS_UPDATES: "dsh-progress-updates";
|
|
9
|
+
/**
|
|
10
|
+
* 中文文案。
|
|
11
|
+
*
|
|
12
|
+
* 键名沿用本插件其余字典的扁平驼峰(`hubTitle`、`imageToolRunning` 那一套),
|
|
13
|
+
* 不另起一套点号命名——同一份 index.tsx 里两种命名风格会让「这条键属于哪张表」
|
|
14
|
+
* 变成要靠记忆的事。
|
|
15
|
+
*/
|
|
16
|
+
export declare const zh: {
|
|
17
|
+
/** 设置页导航里的那一格,也是侧栏页签的标题。 */
|
|
18
|
+
readonly navTitle: "进展更新";
|
|
19
|
+
readonly progressTitle: "进展更新";
|
|
20
|
+
/** 右侧栏 guide 卡片标题下的一行说明。 */
|
|
21
|
+
readonly progressGuideNote: "agent 汇报的每一步进展,都收在这里";
|
|
22
|
+
readonly markdownCopy: "复制";
|
|
23
|
+
readonly markdownCopied: "已复制";
|
|
24
|
+
readonly markdownFootnotes: "脚注";
|
|
25
|
+
readonly progressLatest: "最新";
|
|
26
|
+
readonly progressCount: "共 {n} 条";
|
|
27
|
+
readonly progressExpand: "展开这条进展";
|
|
28
|
+
readonly progressCollapse: "收起这条进展";
|
|
29
|
+
readonly progressEmptyTitle: "还没有进展更新";
|
|
30
|
+
readonly progressEmptyHint: "agent 开始多步任务后,会在这里汇报它进行到哪一步。";
|
|
31
|
+
readonly rowPending: "进展更新";
|
|
32
|
+
readonly rowRunning: "进行中";
|
|
33
|
+
readonly rowDone: "已汇报";
|
|
34
|
+
readonly rowError: "未发出";
|
|
35
|
+
readonly rowExpand: "展开这条进展的详情";
|
|
36
|
+
readonly rowCollapse: "收起这条进展的详情";
|
|
37
|
+
readonly settingsHint: "进展更新会让 agent 在多步任务中主动汇报进度。打开面板可以看它到目前为止的全部汇报。";
|
|
38
|
+
readonly settingsOpen: "打开进展面板";
|
|
39
|
+
readonly settingsEnabledName: "进展更新";
|
|
40
|
+
readonly settingsEnabledNote: "让 agent 在对话中发布进展更新";
|
|
41
|
+
readonly settingsThresholdName: "催促阈值";
|
|
42
|
+
readonly settingsThresholdNote: "连续这么多轮没有进展时,提醒 agent 汇报一次";
|
|
43
|
+
readonly settingsPanelName: "进展面板";
|
|
44
|
+
readonly settingsPanelNote: "在右侧栏查看本次会话的全部进展";
|
|
45
|
+
readonly settingsUnavailable: "这项设置当前不可修改(宿主没有开放配置表单)";
|
|
46
|
+
readonly settingsSaveFailed: "保存失败,请稍后再试";
|
|
47
|
+
};
|
|
48
|
+
/** 英文对照,键集与 zh 完全一致。 */
|
|
49
|
+
export declare const en: Record<ProgressUpdatesLocaleKey, string>;
|
|
50
|
+
/** 与其余线路同形的字典包(四个内置语言 id 都指向那两份)。 */
|
|
51
|
+
export declare const dictionaries: {
|
|
52
|
+
zh: {
|
|
53
|
+
/** 设置页导航里的那一格,也是侧栏页签的标题。 */
|
|
54
|
+
readonly navTitle: "进展更新";
|
|
55
|
+
readonly progressTitle: "进展更新";
|
|
56
|
+
/** 右侧栏 guide 卡片标题下的一行说明。 */
|
|
57
|
+
readonly progressGuideNote: "agent 汇报的每一步进展,都收在这里";
|
|
58
|
+
readonly markdownCopy: "复制";
|
|
59
|
+
readonly markdownCopied: "已复制";
|
|
60
|
+
readonly markdownFootnotes: "脚注";
|
|
61
|
+
readonly progressLatest: "最新";
|
|
62
|
+
readonly progressCount: "共 {n} 条";
|
|
63
|
+
readonly progressExpand: "展开这条进展";
|
|
64
|
+
readonly progressCollapse: "收起这条进展";
|
|
65
|
+
readonly progressEmptyTitle: "还没有进展更新";
|
|
66
|
+
readonly progressEmptyHint: "agent 开始多步任务后,会在这里汇报它进行到哪一步。";
|
|
67
|
+
readonly rowPending: "进展更新";
|
|
68
|
+
readonly rowRunning: "进行中";
|
|
69
|
+
readonly rowDone: "已汇报";
|
|
70
|
+
readonly rowError: "未发出";
|
|
71
|
+
readonly rowExpand: "展开这条进展的详情";
|
|
72
|
+
readonly rowCollapse: "收起这条进展的详情";
|
|
73
|
+
readonly settingsHint: "进展更新会让 agent 在多步任务中主动汇报进度。打开面板可以看它到目前为止的全部汇报。";
|
|
74
|
+
readonly settingsOpen: "打开进展面板";
|
|
75
|
+
readonly settingsEnabledName: "进展更新";
|
|
76
|
+
readonly settingsEnabledNote: "让 agent 在对话中发布进展更新";
|
|
77
|
+
readonly settingsThresholdName: "催促阈值";
|
|
78
|
+
readonly settingsThresholdNote: "连续这么多轮没有进展时,提醒 agent 汇报一次";
|
|
79
|
+
readonly settingsPanelName: "进展面板";
|
|
80
|
+
readonly settingsPanelNote: "在右侧栏查看本次会话的全部进展";
|
|
81
|
+
readonly settingsUnavailable: "这项设置当前不可修改(宿主没有开放配置表单)";
|
|
82
|
+
readonly settingsSaveFailed: "保存失败,请稍后再试";
|
|
83
|
+
};
|
|
84
|
+
'zh-CN': {
|
|
85
|
+
/** 设置页导航里的那一格,也是侧栏页签的标题。 */
|
|
86
|
+
readonly navTitle: "进展更新";
|
|
87
|
+
readonly progressTitle: "进展更新";
|
|
88
|
+
/** 右侧栏 guide 卡片标题下的一行说明。 */
|
|
89
|
+
readonly progressGuideNote: "agent 汇报的每一步进展,都收在这里";
|
|
90
|
+
readonly markdownCopy: "复制";
|
|
91
|
+
readonly markdownCopied: "已复制";
|
|
92
|
+
readonly markdownFootnotes: "脚注";
|
|
93
|
+
readonly progressLatest: "最新";
|
|
94
|
+
readonly progressCount: "共 {n} 条";
|
|
95
|
+
readonly progressExpand: "展开这条进展";
|
|
96
|
+
readonly progressCollapse: "收起这条进展";
|
|
97
|
+
readonly progressEmptyTitle: "还没有进展更新";
|
|
98
|
+
readonly progressEmptyHint: "agent 开始多步任务后,会在这里汇报它进行到哪一步。";
|
|
99
|
+
readonly rowPending: "进展更新";
|
|
100
|
+
readonly rowRunning: "进行中";
|
|
101
|
+
readonly rowDone: "已汇报";
|
|
102
|
+
readonly rowError: "未发出";
|
|
103
|
+
readonly rowExpand: "展开这条进展的详情";
|
|
104
|
+
readonly rowCollapse: "收起这条进展的详情";
|
|
105
|
+
readonly settingsHint: "进展更新会让 agent 在多步任务中主动汇报进度。打开面板可以看它到目前为止的全部汇报。";
|
|
106
|
+
readonly settingsOpen: "打开进展面板";
|
|
107
|
+
readonly settingsEnabledName: "进展更新";
|
|
108
|
+
readonly settingsEnabledNote: "让 agent 在对话中发布进展更新";
|
|
109
|
+
readonly settingsThresholdName: "催促阈值";
|
|
110
|
+
readonly settingsThresholdNote: "连续这么多轮没有进展时,提醒 agent 汇报一次";
|
|
111
|
+
readonly settingsPanelName: "进展面板";
|
|
112
|
+
readonly settingsPanelNote: "在右侧栏查看本次会话的全部进展";
|
|
113
|
+
readonly settingsUnavailable: "这项设置当前不可修改(宿主没有开放配置表单)";
|
|
114
|
+
readonly settingsSaveFailed: "保存失败,请稍后再试";
|
|
115
|
+
};
|
|
116
|
+
en: Record<"navTitle" | "progressTitle" | "progressGuideNote" | "markdownCopy" | "markdownCopied" | "markdownFootnotes" | "progressLatest" | "progressCount" | "progressExpand" | "progressCollapse" | "progressEmptyTitle" | "progressEmptyHint" | "rowPending" | "rowRunning" | "rowDone" | "rowError" | "rowExpand" | "rowCollapse" | "settingsHint" | "settingsOpen" | "settingsEnabledName" | "settingsEnabledNote" | "settingsThresholdName" | "settingsThresholdNote" | "settingsPanelName" | "settingsPanelNote" | "settingsUnavailable" | "settingsSaveFailed", string>;
|
|
117
|
+
'en-US': Record<"navTitle" | "progressTitle" | "progressGuideNote" | "markdownCopy" | "markdownCopied" | "markdownFootnotes" | "progressLatest" | "progressCount" | "progressExpand" | "progressCollapse" | "progressEmptyTitle" | "progressEmptyHint" | "rowPending" | "rowRunning" | "rowDone" | "rowError" | "rowExpand" | "rowCollapse" | "settingsHint" | "settingsOpen" | "settingsEnabledName" | "settingsEnabledNote" | "settingsThresholdName" | "settingsThresholdNote" | "settingsPanelName" | "settingsPanelNote" | "settingsUnavailable" | "settingsSaveFailed", string>;
|
|
118
|
+
};
|
|
119
|
+
/** 本命名空间的字典键联合,供类型化 `t` 座位使用。 */
|
|
120
|
+
export type ProgressUpdatesLocaleKey = keyof typeof zh;
|
|
121
|
+
declare module '@deepseek-ai/dsh-client-ui-slots' {
|
|
122
|
+
interface LocaleNamespaceMap {
|
|
123
|
+
/** 「进展更新」的界面文案。 */
|
|
124
|
+
'dsh-progress-updates': ProgressUpdatesLocaleKey;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=locales.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/locales.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAG,sBAA+B,CAAA;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,EAAE;IACb,4BAA4B;;;IAG5B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BpB,CAAA;AAEV,wBAAwB;AACxB,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,wBAAwB,EAAE,MAAM,CA6BvD,CAAA;AAED,qCAAqC;AACrC,eAAO,MAAM,YAAY;;QAjEvB,4BAA4B;;;QAG5B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAH5B,4BAA4B;;;QAG5B,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmE7B,CAAA;AAED,iCAAiC;AACjC,MAAM,MAAM,wBAAwB,GAAG,MAAM,OAAO,EAAE,CAAA;AAEtD,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,mBAAmB;QACnB,sBAAsB,EAAE,wBAAwB,CAAA;KACjD;CACF"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 进展正文的轻量 Markdown 渲染。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么不复用平台的 MarkdownText
|
|
5
|
+
*
|
|
6
|
+
* 平台的渲染器在 `@deepseek-ai/dsh-client-ui-primitives` 里,那个包的 `lib` 是
|
|
7
|
+
* **浏览器构建产物**:顶层静态 `import css from './StateDot.module.css'`。Node 的 ESM
|
|
8
|
+
* 加载器先于任何 vite 插件与 alias 生效,所以只要本包在测试里 import 它,整个测试
|
|
9
|
+
* 文件就 `Unknown file extension ".css"`。那是「只被 shell 加载」的包,不该被别的包
|
|
10
|
+
* 在 Node 里 require。
|
|
11
|
+
*
|
|
12
|
+
* ## 这个渲染器覆盖什么
|
|
13
|
+
*
|
|
14
|
+
* `progress_update` 的契约把正文限定为「一段正文 + 少量 bullet,轻 Markdown」,
|
|
15
|
+
* 所以这里只做契约允许的那一小撮:
|
|
16
|
+
*
|
|
17
|
+
* - 段落(空行分隔,段内换行保留)
|
|
18
|
+
* - `-` / `*` / `•` 开头的无序列表,以及 `1.` 开头的有序列表
|
|
19
|
+
* - 行内 `code`
|
|
20
|
+
* - `**粗体**`
|
|
21
|
+
* - `###` 标题(最多三级)
|
|
22
|
+
*
|
|
23
|
+
* 刻意**不做**表格、图片、链接、HTML、脚注:那些超出契约,而完整实现的代价(一个
|
|
24
|
+
* 解析器 + 一套安全过滤)远大于本面板的收益。渲染结果全是 React 元素,不经过
|
|
25
|
+
* `dangerouslySetInnerHTML`,因此没有注入面。
|
|
26
|
+
*
|
|
27
|
+
* @module @eddyskywalker/dsh-chatgpt-subscription/client/progress-updates/markdown-lite
|
|
28
|
+
*/
|
|
29
|
+
import type { ReactNode } from 'react';
|
|
30
|
+
/** 块级解析的一个中间行类型。 */
|
|
31
|
+
type Block = {
|
|
32
|
+
kind: 'p';
|
|
33
|
+
lines: string[];
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'ul';
|
|
36
|
+
items: string[];
|
|
37
|
+
} | {
|
|
38
|
+
kind: 'ol';
|
|
39
|
+
items: string[];
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'h';
|
|
42
|
+
level: number;
|
|
43
|
+
text: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* 把正文切成块。
|
|
47
|
+
* @param source - Markdown 原文。
|
|
48
|
+
* @returns 按出现顺序排列的块。
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseBlocks(source: string): Block[];
|
|
51
|
+
/**
|
|
52
|
+
* 把一条进展的正文渲染成 React 元素。
|
|
53
|
+
* @param props - 正文原文。
|
|
54
|
+
* @returns 块级元素;空正文渲染空片段。
|
|
55
|
+
*/
|
|
56
|
+
export declare function MarkdownLite({ text }: {
|
|
57
|
+
text: string;
|
|
58
|
+
}): ReactNode;
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=markdown-lite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-lite.d.ts","sourceRoot":"","sources":["../../../../src/client/progress-updates/markdown-lite.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAgCtC,oBAAoB;AACpB,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9C;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,CAiDnD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA2BlE"}
|