@dsh-workbench/shared 0.3.6 → 0.3.8

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.
Files changed (140) hide show
  1. package/dist/api/context-ref.d.ts +0 -12
  2. package/dist/api/context-ref.js +0 -40
  3. package/dist/api/facts.d.ts +0 -6
  4. package/dist/api/facts.js +0 -8
  5. package/dist/api/long-task.d.ts +8 -0
  6. package/dist/api/long-task.js +10 -0
  7. package/dist/components/ConfirmBar.css +26 -0
  8. package/dist/components/ConfirmBar.d.ts +36 -0
  9. package/dist/components/ConfirmBar.js +26 -0
  10. package/dist/components/Form.d.ts +7 -5
  11. package/dist/components/Form.js +5 -3
  12. package/dist/components/FormNodes.d.ts +17 -13
  13. package/dist/components/FormNodes.js +13 -5
  14. package/dist/components/FormTypes.d.ts +39 -14
  15. package/dist/components/MockStrip.css +11 -1
  16. package/dist/components/StateDot.d.ts +5 -0
  17. package/dist/components/StateDot.js +10 -0
  18. package/dist/config/constants.d.ts +2 -0
  19. package/dist/config/constants.js +2 -0
  20. package/dist/host/__tests__/fakes.d.ts +41 -0
  21. package/dist/host/__tests__/fakes.js +76 -0
  22. package/dist/host/__tests__/preflight-fixtures.d.ts +19 -0
  23. package/dist/host/__tests__/preflight-fixtures.js +47 -0
  24. package/dist/host/board-fact.d.ts +8 -0
  25. package/dist/host/board-fact.js +16 -0
  26. package/dist/host/browser-read.js +2 -1
  27. package/dist/host/context-inject.d.ts +24 -0
  28. package/dist/host/context-inject.js +74 -0
  29. package/dist/host/context-ref.d.ts +13 -0
  30. package/dist/host/context-ref.js +41 -0
  31. package/dist/host/diy-debug.d.ts +80 -0
  32. package/dist/host/diy-debug.js +88 -0
  33. package/dist/host/diy-record.d.ts +135 -0
  34. package/dist/host/diy-record.js +162 -0
  35. package/dist/host/events.d.ts +9 -0
  36. package/dist/host/events.js +70 -0
  37. package/dist/host/facts.d.ts +6 -0
  38. package/dist/host/facts.js +9 -0
  39. package/dist/host/git.js +1 -1
  40. package/dist/host/http.d.ts +2 -2
  41. package/dist/host/http.js +3 -3
  42. package/dist/host/long-task.d.ts +5 -0
  43. package/dist/host/long-task.js +3 -0
  44. package/dist/host/mount-units.d.ts +52 -0
  45. package/dist/host/mount-units.js +186 -0
  46. package/dist/host/opencli-runtime.js +1 -1
  47. package/dist/host/opencli-window.js +1 -1
  48. package/dist/host/opencli.js +2 -1
  49. package/dist/host/panel-state.d.ts +120 -0
  50. package/dist/host/panel-state.js +176 -0
  51. package/dist/host/plugin-source.js +1 -1
  52. package/dist/host/preflight.d.ts +58 -0
  53. package/dist/host/preflight.js +233 -0
  54. package/dist/host/probe-cache.d.ts +6 -0
  55. package/dist/host/probe-cache.js +19 -0
  56. package/dist/host/probe-libs.d.ts +45 -0
  57. package/dist/host/probe-libs.js +61 -0
  58. package/dist/host/probe-units.d.ts +17 -0
  59. package/dist/host/probe-units.js +102 -0
  60. package/dist/host/probe-verdict.d.ts +7 -0
  61. package/dist/host/probe-verdict.js +143 -0
  62. package/dist/host/shell-text.d.ts +13 -0
  63. package/dist/host/shell-text.js +20 -0
  64. package/dist/host/tool-scope.d.ts +32 -0
  65. package/dist/host/tool-scope.js +84 -0
  66. package/dist/host/unit-declaration.d.ts +65 -0
  67. package/dist/host/unit-declaration.js +213 -0
  68. package/dist/host/unit-readiness.d.ts +7 -0
  69. package/dist/host/unit-readiness.js +5 -0
  70. package/dist/host/unit-registry.d.ts +9 -0
  71. package/dist/host/unit-registry.js +33 -0
  72. package/dist/host/version-range.d.ts +2 -0
  73. package/dist/host/version-range.js +73 -0
  74. package/dist/host.d.ts +7 -4
  75. package/dist/host.js +7 -4
  76. package/dist/i18n/en.js +4 -0
  77. package/dist/i18n/index.d.ts +5 -1
  78. package/dist/i18n/zh.d.ts +4 -0
  79. package/dist/i18n/zh.js +4 -0
  80. package/dist/index.d.ts +1 -4
  81. package/dist/index.js +1 -4
  82. package/dist/lib/board-fact.d.ts +0 -7
  83. package/dist/lib/board-fact.js +0 -15
  84. package/dist/lib/diy-record.d.ts +38 -1
  85. package/dist/lib/diy-record.js +66 -0
  86. package/dist/lib/text.d.ts +0 -13
  87. package/dist/lib/text.js +0 -20
  88. package/dist/testing/declaration.js +1 -1
  89. package/package.json +1 -1
  90. package/src/api/__tests__/facts.test.ts +0 -13
  91. package/src/api/__tests__/long-task.test.ts +15 -0
  92. package/src/api/context-ref.ts +0 -39
  93. package/src/api/facts.ts +0 -9
  94. package/src/api/long-task.ts +11 -0
  95. package/src/components/ConfirmBar.css +26 -0
  96. package/src/components/ConfirmBar.test.tsx +130 -0
  97. package/src/components/ConfirmBar.tsx +63 -0
  98. package/src/components/Form.test.tsx +15 -0
  99. package/src/components/Form.tsx +7 -5
  100. package/src/components/FormNodes.tsx +50 -26
  101. package/src/components/FormTypes.test.ts +31 -0
  102. package/src/components/FormTypes.ts +46 -15
  103. package/src/components/FormWiring.test.tsx +1 -0
  104. package/src/config/constants.ts +3 -0
  105. package/src/host/__tests__/board-fact.test.ts +47 -0
  106. package/src/{lib → host/__tests__}/diy-debug.test.ts +1 -1
  107. package/src/{lib → host/__tests__}/diy-record.test.ts +137 -1
  108. package/src/host/__tests__/facts.test.ts +13 -0
  109. package/src/host/__tests__/long-task.test.ts +42 -0
  110. package/src/{lib → host/__tests__}/panel-state.test.ts +1 -1
  111. package/src/host/__tests__/preflight-route.test.ts +33 -0
  112. package/src/host/__tests__/shell-text.test.ts +44 -0
  113. package/src/host/board-fact.ts +14 -0
  114. package/src/host/browser-read.ts +2 -1
  115. package/src/host/context-ref.ts +40 -0
  116. package/src/{lib → host}/diy-record.ts +95 -1
  117. package/src/host/facts.ts +10 -0
  118. package/src/host/git.ts +1 -1
  119. package/src/host/http.ts +4 -4
  120. package/src/host/long-task.ts +9 -0
  121. package/src/host/opencli-runtime.ts +1 -1
  122. package/src/host/opencli-window.ts +1 -1
  123. package/src/host/opencli.ts +2 -1
  124. package/src/host/plugin-source.ts +1 -1
  125. package/src/host/shell-text.ts +21 -0
  126. package/src/{api → host}/unit-declaration.ts +1 -1
  127. package/src/host.ts +7 -4
  128. package/src/i18n/en.ts +4 -0
  129. package/src/i18n/zh.ts +4 -0
  130. package/src/index.ts +1 -4
  131. package/src/lib/board-fact.test.ts +1 -33
  132. package/src/lib/board-fact.ts +0 -13
  133. package/src/lib/text.test.ts +1 -43
  134. package/src/lib/text.ts +0 -22
  135. package/src/testing/declaration.ts +1 -1
  136. package/dist/lib/lint-probe.d.ts +0 -1
  137. package/dist/lib/lint-probe.js +0 -6
  138. /package/src/{api → host}/__tests__/unit-declaration.test.ts +0 -0
  139. /package/src/{lib → host}/diy-debug.ts +0 -0
  140. /package/src/{lib → host}/panel-state.ts +0 -0
@@ -0,0 +1,213 @@
1
+ /**
2
+ * 声明协议当前版本;模块清单的 dsh.workbench.apiVersion 要写这个整数。
3
+ */
4
+ export const WORKBENCH_API_VERSION = 1;
5
+ /**
6
+ * 外壳愿意认的协议版本;不在表里的模块当场被拒,不猜语义。
7
+ */
8
+ export const SUPPORTED_API_VERSIONS = [WORKBENCH_API_VERSION];
9
+ /**
10
+ * 协议认得的全部键;写了别的键不会被采纳(外壳静默忽略),所以字段名拼错不会有提示。
11
+ */
12
+ export const DECLARATION_KEYS = [
13
+ 'apiVersion',
14
+ 'unit',
15
+ 'card',
16
+ 'tools',
17
+ 'host',
18
+ 'env',
19
+ ];
20
+ /**
21
+ * 协议要求必写的键;env 不在其中(没有环境需要就不写)。
22
+ */
23
+ export const DECLARATION_REQUIRED_KEYS = [
24
+ 'apiVersion',
25
+ 'unit',
26
+ 'card',
27
+ 'tools',
28
+ 'host',
29
+ ];
30
+ const CARD_KEYS = ['titleKey', 'order'];
31
+ const TOOL_KEYS = ['name', 'writes', 'key'];
32
+ const TOOL_KEY_SHAPE = /^[a-z][a-zA-Z0-9]*$/;
33
+ const HOST_KEYS = ['inject', 'optional'];
34
+ function text(value) {
35
+ return typeof value === 'string' ? value.trim() : '';
36
+ }
37
+ function isRecord(value) {
38
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
39
+ }
40
+ function outsideKeys(value, allowed) {
41
+ return Object.keys(value).filter((key) => !allowed.includes(key));
42
+ }
43
+ function listOf(keys) {
44
+ return keys.map((key) => JSON.stringify(key)).join(' / ');
45
+ }
46
+ function stringArrayProblems(at, value) {
47
+ if (!Array.isArray(value))
48
+ return [`${at} 要是一串字符串,现在是 ${JSON.stringify(value)}`];
49
+ return value.flatMap((item, index) => text(item) === '' ? [`${at}[${index}] 不是非空字符串:${JSON.stringify(item)}`] : []);
50
+ }
51
+ /**
52
+ * 查清单里 dsh.workbench 那一段的形状,回一串给人看的问题(中文,带字段路径)。
53
+ * @param subject 报错时用的主语,一般是包名。
54
+ * @param raw 清单里那段原始值,可能什么都不是。
55
+ * @returns 空数组表示形状过得去;版本不对就当场返回(后面的字段无从判起)。
56
+ */
57
+ export function declarationProblemsOf(subject, raw) {
58
+ if (!isRecord(raw))
59
+ return [`${subject}: dsh.workbench 不是一个对象 —— ${JSON.stringify(raw)}`];
60
+ const version = raw.apiVersion;
61
+ if (version === undefined) {
62
+ return [
63
+ `${subject}: dsh.workbench 没有 apiVersion —— 协议从 v${WORKBENCH_API_VERSION} 起,` +
64
+ `写 \`"apiVersion": ${WORKBENCH_API_VERSION}\`。缺它 = 外壳不认这个模块(ADR-0038 §2.3)`,
65
+ ];
66
+ }
67
+ if (!Number.isInteger(version) || !SUPPORTED_API_VERSIONS.includes(version)) {
68
+ return [
69
+ `${subject}: dsh.workbench.apiVersion 是 ${JSON.stringify(version)},这里只认 ` +
70
+ `${SUPPORTED_API_VERSIONS.join(' / ')}(要整数)`,
71
+ ];
72
+ }
73
+ const problems = [];
74
+ const unknown = outsideKeys(raw, DECLARATION_KEYS);
75
+ if (unknown.length > 0) {
76
+ problems.push(`${subject}: dsh.workbench 里有协议 v${WORKBENCH_API_VERSION} 不认识的键 ${listOf(unknown)} —— ` +
77
+ `只有 ${listOf(DECLARATION_KEYS)}。(拼错的键会被外壳**静默忽略**:那句声明等于没写)`);
78
+ }
79
+ for (const key of DECLARATION_REQUIRED_KEYS) {
80
+ if (raw[key] === undefined) {
81
+ problems.push(`${subject}: dsh.workbench 缺 ${key}` +
82
+ (key === 'card' ? '(这个模块没有卡片就写 `"card": null`)' : ''));
83
+ }
84
+ }
85
+ const card = raw.card;
86
+ if (card !== undefined && card !== null) {
87
+ if (!isRecord(card)) {
88
+ problems.push(`${subject}: dsh.workbench.card 要么是对象、要么是 null,现在是 ${JSON.stringify(card)}`);
89
+ }
90
+ else {
91
+ const extra = outsideKeys(card, CARD_KEYS);
92
+ if (extra.length > 0) {
93
+ problems.push(`${subject}: dsh.workbench.card 里有不认的键 ${listOf(extra)} —— card 只有 ${listOf(CARD_KEYS)}` +
94
+ `(卡片默认显不显示由运行期的面板配置决定,清单里没有这一位)`);
95
+ }
96
+ if (text(card.titleKey) === '') {
97
+ problems.push(`${subject}: dsh.workbench.card.titleKey 要是非空字符串(面板那一格的文案键)`);
98
+ }
99
+ if (typeof card.order !== 'number' || !Number.isFinite(card.order)) {
100
+ problems.push(`${subject}: dsh.workbench.card.order 要是数字,现在是 ${JSON.stringify(card.order)}`);
101
+ }
102
+ }
103
+ }
104
+ const tools = raw.tools;
105
+ if (tools !== undefined) {
106
+ if (!Array.isArray(tools)) {
107
+ problems.push(`${subject}: dsh.workbench.tools 要是一串声明,现在是 ${JSON.stringify(tools)}`);
108
+ }
109
+ else {
110
+ const seen = new Set();
111
+ const seenKeys = new Set();
112
+ tools.forEach((tool, index) => {
113
+ const at = `dsh.workbench.tools[${index}]`;
114
+ if (!isRecord(tool)) {
115
+ problems.push(`${subject}: ${at} 要是对象,现在是 ${JSON.stringify(tool)}`);
116
+ return;
117
+ }
118
+ const extra = outsideKeys(tool, TOOL_KEYS);
119
+ if (extra.length > 0) {
120
+ problems.push(`${subject}: ${at} 里有不认的键 ${listOf(extra)} —— tools 只有 ${listOf(TOOL_KEYS)}`);
121
+ }
122
+ const name = text(tool.name);
123
+ if (name === '') {
124
+ problems.push(`${subject}: ${at}.name 要是非空字符串`);
125
+ }
126
+ else if (seen.has(name)) {
127
+ problems.push(`${subject}: ${at}.name「${name}」与前面那条撞了 —— 工具名会进 dsh 的工具表,不许重`);
128
+ }
129
+ else {
130
+ seen.add(name);
131
+ }
132
+ if (typeof tool.writes !== 'boolean') {
133
+ problems.push(`${subject}: ${at}.writes 要是 true / false(它是"这会写"的唯一声明,缺了审批无从认领)`);
134
+ }
135
+ if (tool.key !== undefined) {
136
+ const key = text(tool.key);
137
+ if (!TOOL_KEY_SHAPE.test(key)) {
138
+ problems.push(`${subject}: ${at}.key 要是 lowerCamelCase 的标识符(如 \`sync\` / \`podLogs\`),` +
139
+ `现在是 ${JSON.stringify(tool.key)} —— 它会变成生成物里的键名,所以不引号、不许带点或横线`);
140
+ }
141
+ else if (seenKeys.has(key)) {
142
+ problems.push(`${subject}: ${at}.key「${key}」与前面那条撞了 —— 生成物里的键只能有一个`);
143
+ }
144
+ else {
145
+ seenKeys.add(key);
146
+ }
147
+ }
148
+ });
149
+ }
150
+ }
151
+ const host = raw.host;
152
+ if (host !== undefined) {
153
+ if (!isRecord(host)) {
154
+ problems.push(`${subject}: dsh.workbench.host 要是对象,现在是 ${JSON.stringify(host)}`);
155
+ }
156
+ else {
157
+ const extra = outsideKeys(host, HOST_KEYS);
158
+ if (extra.length > 0) {
159
+ problems.push(`${subject}: dsh.workbench.host 里有不认的键 ${listOf(extra)} —— host 只有 ${listOf(HOST_KEYS)}`);
160
+ }
161
+ if (host.inject === undefined) {
162
+ problems.push(`${subject}: dsh.workbench.host.inject 没写 —— 它声明这个模块要外壳的哪几个服务,` +
163
+ `外壳靠它判"能不能挂"。一个都不要也要写 \`"inject": []\``);
164
+ }
165
+ else {
166
+ problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.inject`, host.inject));
167
+ }
168
+ if (host.optional !== undefined) {
169
+ problems.push(...stringArrayProblems(`${subject}: dsh.workbench.host.optional`, host.optional));
170
+ }
171
+ }
172
+ }
173
+ if (raw.env !== undefined && !isRecord(raw.env)) {
174
+ problems.push(`${subject}: dsh.workbench.env 要是对象(command / plugins / libs)—— ` +
175
+ `语义由门禁的 env 判据查,这里只查形状`);
176
+ }
177
+ return problems;
178
+ }
179
+ /**
180
+ * 读一份清单:先查形状,过了再把声明规整成 manifest。
181
+ * @param subject 报错时用的主语。
182
+ * @param raw 清单里 dsh.workbench 那段原始值。
183
+ * @returns 有问题时只有 problems;没问题时 declaration 与 manifest 都给,manifest 里的字符串已 trim。
184
+ */
185
+ export function readDeclaration(subject, raw) {
186
+ const problems = declarationProblemsOf(subject, raw);
187
+ if (problems.length > 0)
188
+ return { problems };
189
+ const declaration = raw;
190
+ const card = declaration.card;
191
+ return {
192
+ declaration,
193
+ problems: [],
194
+ manifest: {
195
+ id: text(declaration.unit),
196
+ card: card === null
197
+ ? null
198
+ : {
199
+ titleKey: text(card.titleKey),
200
+ order: card.order,
201
+ },
202
+ tools: declaration.tools.map((tool) => ({
203
+ name: text(tool.name),
204
+ writes: tool.writes,
205
+ })),
206
+ host: {
207
+ inject: [...(declaration.host.inject ?? [])],
208
+ ...(declaration.host.optional === undefined ? {} : { optional: [...declaration.host.optional] }),
209
+ },
210
+ ...(declaration.env === undefined ? {} : { env: declaration.env }),
211
+ },
212
+ };
213
+ }
@@ -0,0 +1,7 @@
1
+ import type { UnitManifest } from '@dsh-workbench/shared';
2
+ export interface UnitReadiness {
3
+ readonly canMount: boolean;
4
+ readonly missingHard: readonly string[];
5
+ readonly missingSoft: readonly string[];
6
+ }
7
+ export declare function unitReadiness(manifest: UnitManifest, lookup: (name: string) => unknown): UnitReadiness;
@@ -0,0 +1,5 @@
1
+ export function unitReadiness(manifest, lookup) {
2
+ const missingHard = manifest.host.inject.filter((name) => lookup(name) === undefined);
3
+ const missingSoft = (manifest.host.optional ?? []).filter((name) => lookup(name) === undefined);
4
+ return { canMount: missingHard.length === 0, missingHard, missingSoft };
5
+ }
@@ -0,0 +1,9 @@
1
+ import type { UnitManifest } from '@dsh-workbench/shared';
2
+ import type { UnitHostFace } from './unit-face';
3
+ export interface UnitRegistry {
4
+ register(face: UnitHostFace): () => void;
5
+ all(): readonly UnitHostFace[];
6
+ manifests(): readonly UnitManifest[];
7
+ subscribe(listener: () => void): () => void;
8
+ }
9
+ export declare function createUnitRegistry(): UnitRegistry;
@@ -0,0 +1,33 @@
1
+ export function createUnitRegistry() {
2
+ const faces = [];
3
+ const ids = new Set();
4
+ const listeners = new Set();
5
+ function notify() {
6
+ for (const listener of listeners)
7
+ listener();
8
+ }
9
+ return {
10
+ register(face) {
11
+ const id = face.manifest.id;
12
+ if (ids.has(id))
13
+ throw new Error(`套件 id 重复:${id}(id 会进持久化配置,不能撞)`);
14
+ ids.add(id);
15
+ faces.push(face);
16
+ notify();
17
+ return () => {
18
+ const index = faces.indexOf(face);
19
+ if (index < 0)
20
+ return;
21
+ faces.splice(index, 1);
22
+ ids.delete(id);
23
+ notify();
24
+ };
25
+ },
26
+ all: () => faces,
27
+ manifests: () => faces.map((face) => face.manifest),
28
+ subscribe(listener) {
29
+ listeners.add(listener);
30
+ return () => listeners.delete(listener);
31
+ },
32
+ };
33
+ }
@@ -0,0 +1,2 @@
1
+ export type VersionVerdict = 'satisfied' | 'unsatisfied' | 'malformed';
2
+ export declare function checkVersionRange(contract: string | undefined, version: string): VersionVerdict;
@@ -0,0 +1,73 @@
1
+ import { compareVersions } from './release';
2
+ function readable(version) {
3
+ return compareVersions(version, '0.0.0') !== undefined;
4
+ }
5
+ function segmentsOf(version) {
6
+ if (!readable(version))
7
+ return undefined;
8
+ return version.split('.').map((part) => Number.parseInt(part, 10));
9
+ }
10
+ function caretUpper(base) {
11
+ const [major = 0, minor = 0, patch = 0] = base;
12
+ if (major > 0)
13
+ return `${major + 1}.0.0`;
14
+ return minor > 0 ? `0.${minor + 1}.0` : `0.0.${patch + 1}`;
15
+ }
16
+ function tildeUpper(base) {
17
+ const [major = 0, minor = 0] = base;
18
+ return `${major}.${minor + 1}.0`;
19
+ }
20
+ function comparator(token, version) {
21
+ const match = /^(>=|<=|>|<|=|\^|~)?\s*(.+)$/.exec(token.trim());
22
+ if (match === null)
23
+ return undefined;
24
+ const [, operator = '', raw = ''] = match;
25
+ const base = segmentsOf(raw.trim());
26
+ if (base === undefined)
27
+ return undefined;
28
+ const at = (other) => compareVersions(version, other);
29
+ switch (operator) {
30
+ case '^':
31
+ return (at(raw) ?? -1) >= 0 && (at(caretUpper(base)) ?? 1) < 0;
32
+ case '~':
33
+ return (at(raw) ?? -1) >= 0 && (at(tildeUpper(base)) ?? 1) < 0;
34
+ default:
35
+ break;
36
+ }
37
+ const compared = at(raw.trim());
38
+ if (compared === undefined)
39
+ return undefined;
40
+ switch (operator) {
41
+ case '>=':
42
+ return compared >= 0;
43
+ case '<=':
44
+ return compared <= 0;
45
+ case '>':
46
+ return compared > 0;
47
+ case '<':
48
+ return compared < 0;
49
+ case '=':
50
+ case '':
51
+ return compared === 0;
52
+ default:
53
+ return undefined;
54
+ }
55
+ }
56
+ export function checkVersionRange(contract, version) {
57
+ const spec = contract?.trim() ?? '';
58
+ if (spec === '')
59
+ return 'satisfied';
60
+ if (!readable(version))
61
+ return 'malformed';
62
+ const tokens = spec.split(/\s+/).filter((token) => token !== '');
63
+ if (tokens.length === 0)
64
+ return 'satisfied';
65
+ for (const token of tokens) {
66
+ const verdict = comparator(token, version);
67
+ if (verdict === undefined)
68
+ return 'malformed';
69
+ if (!verdict)
70
+ return 'unsatisfied';
71
+ }
72
+ return 'satisfied';
73
+ }
package/dist/host.d.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  export * from './config/constants.js';
2
2
  export * from './api/context-ref.js';
3
3
  export * from './api/unit.js';
4
- export * from './api/unit-declaration.js';
5
4
  export * from './api/facts.js';
6
5
  export * from './api/long-task.js';
7
6
  export * from './lib/text.js';
8
7
  export * from './lib/ui.js';
9
- export * from './lib/panel-state.js';
10
8
  export * from './lib/board-fact.js';
11
- export * from './lib/diy-debug.js';
12
- export * from './lib/diy-record.js';
13
9
  export * from './api/blocker-table.js';
10
+ export * from './host/board-fact.js';
14
11
  export * from './host/browser-find.js';
15
12
  export * from './host/browser-read.js';
16
13
  export * from './host/cli-error.js';
14
+ export * from './host/context-ref.js';
17
15
  export * from './host/data-root.js';
16
+ export * from './host/diy-debug.js';
17
+ export * from './host/diy-record.js';
18
18
  export * from './host/facts.js';
19
19
  export * from './host/git.js';
20
20
  export * from './host/http.js';
@@ -22,12 +22,15 @@ export * from './host/long-task.js';
22
22
  export * from './host/opencli-runtime.js';
23
23
  export * from './host/opencli-window.js';
24
24
  export * from './host/opencli.js';
25
+ export * from './host/panel-state.js';
25
26
  export * from './host/plugin-ledger.js';
26
27
  export * from './host/plugin-source.js';
27
28
  export * from './host/provision.js';
29
+ export * from './host/shell-text.js';
28
30
  export * from './host/shell.js';
29
31
  export * from './host/tool-approval.js';
30
32
  export * from './host/tool-kit.js';
33
+ export * from './host/unit-declaration.js';
31
34
  export * from './host/unit-face.js';
32
35
  export * from './host/unit-libs.js';
33
36
  export * from './host/value-handoff.js';
package/dist/host.js CHANGED
@@ -1,20 +1,20 @@
1
1
  export * from './config/constants.js';
2
2
  export * from './api/context-ref.js';
3
3
  export * from './api/unit.js';
4
- export * from './api/unit-declaration.js';
5
4
  export * from './api/facts.js';
6
5
  export * from './api/long-task.js';
7
6
  export * from './lib/text.js';
8
7
  export * from './lib/ui.js';
9
- export * from './lib/panel-state.js';
10
8
  export * from './lib/board-fact.js';
11
- export * from './lib/diy-debug.js';
12
- export * from './lib/diy-record.js';
13
9
  export * from './api/blocker-table.js';
10
+ export * from './host/board-fact.js';
14
11
  export * from './host/browser-find.js';
15
12
  export * from './host/browser-read.js';
16
13
  export * from './host/cli-error.js';
14
+ export * from './host/context-ref.js';
17
15
  export * from './host/data-root.js';
16
+ export * from './host/diy-debug.js';
17
+ export * from './host/diy-record.js';
18
18
  export * from './host/facts.js';
19
19
  export * from './host/git.js';
20
20
  export * from './host/http.js';
@@ -22,12 +22,15 @@ export * from './host/long-task.js';
22
22
  export * from './host/opencli-runtime.js';
23
23
  export * from './host/opencli-window.js';
24
24
  export * from './host/opencli.js';
25
+ export * from './host/panel-state.js';
25
26
  export * from './host/plugin-ledger.js';
26
27
  export * from './host/plugin-source.js';
27
28
  export * from './host/provision.js';
29
+ export * from './host/shell-text.js';
28
30
  export * from './host/shell.js';
29
31
  export * from './host/tool-approval.js';
30
32
  export * from './host/tool-kit.js';
33
+ export * from './host/unit-declaration.js';
31
34
  export * from './host/unit-face.js';
32
35
  export * from './host/unit-libs.js';
33
36
  export * from './host/value-handoff.js';
package/dist/i18n/en.js CHANGED
@@ -37,6 +37,7 @@ export const en = {
37
37
  'session.actions': 'Actions for {name}',
38
38
  'status.idle': 'Idle',
39
39
  'status.running': 'Running',
40
+ 'status.longTask': 'Long task running',
40
41
  'status.waitingApproval': 'Waiting for approval',
41
42
  'status.planReview': 'Plan awaiting review',
42
43
  'status.waitingAnswer': 'Waiting for your answer',
@@ -50,6 +51,8 @@ export const en = {
50
51
  'project.attention.warning.other': '{n} sessions waiting for you',
51
52
  'project.attention.running.one': '1 session running',
52
53
  'project.attention.running.other': '{n} sessions running',
54
+ 'project.attention.longTask.one': '1 long task running',
55
+ 'project.attention.longTask.other': '{n} long tasks running',
53
56
  'project.attention.done.one': '1 session finished, unread',
54
57
  'project.attention.done.other': '{n} sessions finished, unread',
55
58
  'project.attention.state.warning': 'Approval',
@@ -426,6 +429,7 @@ export const en = {
426
429
  'record.waiting.note': 'Press "Start recording" on that page, then "Stop recording" when done (it will not switch you back)',
427
430
  'record.recording': 'Recording',
428
431
  'record.recording.note': 'Press "Stop recording" when done; if the bar is gone press Halt so the agent grabs it first',
432
+ 'record.recording.shots': '; to keep a shot of this moment press "Screenshot" on the bar ({n} taken)',
429
433
  'record.finished': 'Recording finished',
430
434
  'record.finished.note': 'This run is done — the agent will grab it and wrap up on its own',
431
435
  'record.act.cancel': 'Cancel',
@@ -39,6 +39,7 @@ export declare const dictionaries: {
39
39
  readonly 'session.actions': "{name} 的操作";
40
40
  readonly 'status.idle': "空闲";
41
41
  readonly 'status.running': "进行中";
42
+ readonly 'status.longTask': "长任务在跑";
42
43
  readonly 'status.waitingApproval': "等待审批";
43
44
  readonly 'status.planReview': "计划待审";
44
45
  readonly 'status.waitingAnswer': "等待回答";
@@ -52,6 +53,8 @@ export declare const dictionaries: {
52
53
  readonly 'project.attention.warning.other': "{n} 个会话在等你点头";
53
54
  readonly 'project.attention.running.one': "1 个会话在跑";
54
55
  readonly 'project.attention.running.other': "{n} 个会话在跑";
56
+ readonly 'project.attention.longTask.one': "1 个长任务在跑";
57
+ readonly 'project.attention.longTask.other': "{n} 个长任务在跑";
55
58
  readonly 'project.attention.done.one': "1 个会话跑完没看";
56
59
  readonly 'project.attention.done.other': "{n} 个会话跑完没看";
57
60
  readonly 'project.attention.state.warning': "待审批";
@@ -428,6 +431,7 @@ export declare const dictionaries: {
428
431
  readonly 'record.waiting.note': "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)";
429
432
  readonly 'record.recording': "录制中";
430
433
  readonly 'record.recording.note': "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收";
434
+ readonly 'record.recording.shots': ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)";
431
435
  readonly 'record.finished': "录制完成";
432
436
  readonly 'record.finished.note': "这一段录完了 —— agent 会自己来取并收工,不用你点";
433
437
  readonly 'record.act.cancel': "取消";
@@ -441,7 +445,7 @@ export declare const dictionaries: {
441
445
  readonly 'approval.longTask.what': "要停的那一趟";
442
446
  readonly 'approval.longTask.signal': "停了只是让外壳发出中断信号 —— 平台侧那趟活儿的收尾看模块自己";
443
447
  };
444
- en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.localMark" | "panels.market.localHint" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.workbenchName" | "panels.market.workbenchLocal" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal", string>;
448
+ en: Record<"time.now" | "time.ago" | "time.minutes" | "time.hours" | "time.days" | "blocker.retry" | "blocker.copy" | "blocker.unknown.title" | "blocker.login.go" | "blocker.login.titleGeneric" | "blocker.login.title" | "blocker.login.manual" | "blocker.login.hint" | "blocker.forbidden.open" | "blocker.forbidden.titleGeneric" | "blocker.forbidden.title" | "blocker.forbidden.hint" | "blocker.timeout.hint" | "blocker.exec.hint" | "blocker.fix.install" | "blocker.fix.update" | "blocker.market.open" | "env.unit.failed" | "env.unit.failedHint" | "env.unit.missingPlugin" | "env.unit.hint" | "env.unit.missingCommands" | "env.unit.missingCommandsHint" | "env.unit.unchecked" | "env.unit.uncheckedHint" | "brand.name" | "toggle.open" | "toggle.collapse" | "project.label" | "workspace.section" | "project.none" | "project.empty" | "project.add" | "project.add.busy" | "project.add.failed" | "project.search.label" | "project.search.placeholder" | "project.search.empty" | "project.group.workspaces" | "project.group.defaultWorkspace" | "project.group.workshop" | "project.rename.row" | "project.rename.current" | "project.rename.title" | "project.rename.description" | "project.rename.field" | "project.rename.placeholder" | "project.rename.hint" | "project.rename.save" | "project.rename.saving" | "project.rename.cancel" | "project.rename.failed" | "session.new" | "session.new.label" | "session.empty" | "session.noProject" | "session.list.label" | "session.copy" | "session.pinned" | "session.actions" | "status.idle" | "status.running" | "status.longTask" | "status.waitingApproval" | "status.planReview" | "status.waitingAnswer" | "status.compact.approval" | "status.compact.planReview" | "status.compact.answer" | "status.completed" | "status.subagentsRunning.one" | "status.subagentsRunning.other" | "project.attention.warning.one" | "project.attention.warning.other" | "project.attention.running.one" | "project.attention.running.other" | "project.attention.longTask.one" | "project.attention.longTask.other" | "project.attention.done.one" | "project.attention.done.other" | "project.attention.state.warning" | "project.attention.state.running" | "project.attention.state.done" | "hover.copied" | "time.short.minutes" | "time.short.hours" | "time.short.days" | "time.short.months" | "time.short.years" | "panels.title" | "panels.groupBoardless" | "panels.groupPlugins" | "panels.market.defaultHint" | "panels.market.defaultLabel" | "panels.market.defaultLocked" | "panels.followAll" | "panels.followAllConfirmTitle" | "panels.followAllConfirmDetail" | "panels.followAllConfirmAck" | "panels.followAllConfirmYes" | "panels.followAllConfirmNo" | "panels.enabled" | "panels.disabled" | "panels.choose" | "panels.buildModule" | "panels.failed" | "panels.dragHint" | "panels.unknownStep" | "panels.labelWithHint" | "panels.hintJoin" | "panels.dep.failed" | "panels.dep.missingPlugin" | "panels.dep.missingCommands" | "panels.dep.unchecked" | "panels.tab.modules" | "panels.tab.market" | "panels.browseMarket" | "panels.noneInstalled" | "panels.noneInstalledHint" | "panels.market.installed" | "panels.market.notActive" | "panels.market.notUsable" | "panels.market.broken" | "panels.market.hasNew" | "panels.market.hasProblem" | "panels.market.missing" | "panels.market.unchecked" | "panels.market.checking" | "panels.market.sectionInstalled" | "panels.market.sectionPending" | "panels.market.sectionShared" | "panels.market.sharedUsedBy" | "panels.market.listSeparator" | "panels.market.sharedMissing" | "panels.market.sharedOutdated" | "panels.market.sharedUnsatisfied" | "panels.market.sharedOk" | "panels.market.versionArrow" | "panels.market.lead" | "panels.market.install" | "panels.market.update" | "panels.market.swapSlow" | "panels.market.uninstall" | "panels.market.uninstallLabel" | "panels.market.installing" | "panels.market.updating" | "panels.market.uninstalling" | "panels.market.confirmUninstallTitle" | "panels.market.confirmUninstallDetail" | "panels.market.confirmUninstallAck" | "panels.market.confirmYes" | "panels.market.confirmNo" | "panels.market.failed" | "panels.market.needEnv" | "panels.market.needCommands" | "panels.market.localMark" | "panels.market.localHint" | "panels.market.noSource" | "panels.market.badSource" | "panels.market.empty" | "panels.market.sectionPlugins" | "panels.market.moduleOutdated" | "panels.market.moduleRefused" | "panels.market.moduleRefusedDetail" | "panels.market.moduleRestartHint" | "panels.market.pendingRestart" | "panels.market.workbenchName" | "panels.market.workbenchLocal" | "panels.market.pluginKeptInUse" | "panels.market.pluginKeptUnsure" | "panels.market.pluginKeptHeld" | "panels.market.pluginKeptUnnamed" | "panels.market.pluginBroken" | "panels.market.restartNeeded" | "panels.market.foot" | "panels.market.recheck" | "panels.market.checkUpdates" | "panels.market.checkedAt" | "panels.market.justNow" | "panels.market.minutesAgo" | "panels.market.hoursAgo" | "panels.market.add.description" | "panels.market.add.specPlaceholder" | "panels.market.add.guideToggle" | "panels.market.add.guideHide" | "panels.market.add.guideIdTitle" | "panels.market.add.guideIdExample" | "panels.market.add.guideIdHint" | "panels.market.add.guideGitTitle" | "panels.market.add.guideGitExample" | "panels.market.add.guideGitHint" | "panels.market.add.guidePathTitle" | "panels.market.add.guidePathExample" | "panels.market.add.guidePathHint" | "panels.market.add.guideExampleLabel" | "panels.market.add.guideFill" | "panels.market.add.guideSafety" | "panels.market.add.registryLegend" | "panels.market.add.registryOfficial" | "panels.market.add.registryMirror" | "panels.market.add.registryWithHost" | "panels.market.add.registryToggle" | "panels.market.add.installVersion" | "panels.market.add.registryDefault" | "panels.market.add.registryCustom" | "panels.market.add.registryCustomPlaceholder" | "panels.market.add.registryCustomHint" | "panels.market.add.registryCustomInvalid" | "panels.market.add.run" | "panels.market.add.edit" | "panels.market.add.changeRegistry" | "panels.market.add.installingTitle" | "panels.market.add.installedTitle" | "panels.market.add.failedTitle" | "panels.market.add.cancelledTitle" | "panels.market.add.failureNetworkHost" | "panels.market.add.problemInvalid" | "panels.market.add.problemInstalled" | "panels.market.add.problemNotFound" | "panels.market.add.problemNotPackage" | "panels.market.add.problemNotBundle" | "panels.market.add.problemNotWorkbenchModule" | "panels.market.add.problemNotModuleOrPlugin" | "panels.market.add.failureNotModuleOrPlugin" | "panels.market.add.installedPlugin" | "panels.market.add.pluginPreview" | "panels.market.add.pluginAlias" | "panels.market.add.problemNetwork" | "panels.market.add.problemUnknown" | "panels.market.add.failureNetwork" | "panels.market.add.failureNotFound" | "panels.market.add.failureNoMatchingVersion" | "panels.market.add.failureDiskFull" | "panels.market.add.failurePermission" | "panels.market.add.failureBuildBlocked" | "panels.market.add.failureIntegrity" | "panels.market.add.failureTimeout" | "panels.market.add.failurePnpmMissing" | "panels.market.add.failureInstalled" | "panels.market.add.failureGeneric" | "panels.market.add.approveTitle" | "panels.market.add.approveCaution" | "panels.market.add.approveRun" | "panels.market.add.restart" | "panels.market.add.tookEffect" | "panels.market.add.details" | "panels.market.add.open" | "panels.market.add.title" | "panels.market.add.intro" | "panels.market.add.specLabel" | "panels.market.add.specHint" | "panels.market.add.exampleTitle" | "panels.market.add.exampleFill" | "panels.market.add.registryLabel" | "panels.market.add.registryProfile" | "panels.market.add.registryPnpm" | "panels.market.add.check" | "panels.market.add.checking" | "panels.market.add.classifying" | "panels.market.add.change" | "panels.market.add.previewTitle" | "panels.market.add.fieldName" | "panels.market.add.fieldVersion" | "panels.market.add.fieldDescription" | "panels.market.add.fieldSource" | "panels.market.add.install" | "panels.market.add.installing" | "panels.market.add.cancel" | "panels.market.add.close" | "panels.market.add.retry" | "panels.market.add.changeSource" | "panels.market.add.approveBuilds" | "panels.market.add.approveHint" | "panels.market.add.doneApplied" | "panels.market.add.doneRestart" | "panels.market.add.restartWhy" | "panels.market.add.restartWhy.no-hmr" | "panels.market.add.restartWhy.package-moved" | "panels.market.add.restartWhy.host-module" | "panels.market.add.restartWhy.unmanaged-plugin" | "panels.market.add.restartWhy.module-comparison" | "panels.market.add.cancelled" | "panels.market.add.failed" | "panels.market.add.removed" | "panels.market.add.supplyPending" | "panels.market.add.supplyFailed" | "panels.market.add.notModule" | "panels.market.add.removedRestart" | "panels.market.add.remove" | "panels.market.add.problem.invalidSpec" | "panels.market.add.problem.alreadyInstalled" | "panels.market.add.problem.notFound" | "panels.market.add.problem.notAPackage" | "panels.market.add.problem.notABundle" | "panels.market.add.problem.network" | "panels.market.add.problem.unknown" | "panels.market.add.reason.invalidSpec" | "panels.market.add.reason.incompatible" | "panels.market.add.reason.notBundle" | "panels.market.add.reason.notRemovable" | "panels.market.add.reason.bundleInUse" | "panels.market.add.reason.stopProfile" | "panels.market.add.reason.staleApproval" | "panels.market.add.reason.operationError" | "panels.market.add.reason.buildBlocked" | "panels.market.add.reason.pnpmMissing" | "panels.market.add.reason.noMatchingVersion" | "panels.market.add.reason.diskFull" | "panels.market.add.reason.permission" | "panels.market.add.reason.integrity" | "panels.market.add.reason.timeout" | "panels.market.add.reason.network" | "panels.market.add.reason.notFound" | "panels.market.add.reason.unknown" | "blocker.fix.running" | "blocker.fix.failed" | "blocker.retry.running" | "panels.reading" | "panels.cardBroken" | "panels.cardRetry" | "panels.empty" | "panels.emptyHint" | "env.title" | "env.checking" | "env.installing" | "env.failed" | "env.elapsed" | "env.stepFailed.install" | "env.stepFailed.path" | "env.stepFailed.shell" | "env.bridge.ok" | "env.bridge.short" | "env.bridge.why" | "env.bridge.daemon" | "env.bridge.extension" | "env.bridge.extensionLink" | "env.bridge.profile" | "env.bridge.stale" | "env.bridge.unknown" | "env.fix.title" | "env.fix.why" | "env.fix.whyPath" | "env.fix.whyShell" | "env.fix.step" | "env.fix.stepPath" | "env.fix.stepShell" | "env.fix.permission" | "env.fix.network" | "env.fix.details" | "env.retry" | "env.copyCommand" | "env.copied" | "env.step.opencli" | "env.step.codingPlugin" | "env.step.bridge" | "env.step.warm" | "env.warm.done" | "env.warm.short" | "rightbar.label" | "rightbar.expand" | "rightbar.collapse" | "rightbar.column.label" | "rightbar.column.workbench" | "rightbar.column.dsh" | "rightbar.refresh" | "rightbar.refreshing" | "rightbar.updatedAt" | "rightbar.noProject" | "rightbar.openPlatform" | "coding.notARepo.title" | "error.unknown" | "board.title" | "panel.conversation" | "panels.label" | "configSync.nav" | "configSync.lead" | "configSync.source" | "configSync.sourceBroken" | "configSync.sourceRows" | "configSync.sourceDead" | "configSync.refresh" | "configSync.loading" | "configSync.readHint" | "configSync.tag.new" | "configSync.tag.differs" | "configSync.conflictNote" | "configSync.code.lang" | "configSync.code.copy" | "configSync.code.copied" | "configSync.code.wrap" | "configSync.code.unwrap" | "configSync.code.collapse" | "configSync.code.collapseAria" | "configSync.code.expandAria" | "configSync.code.expand" | "configSync.missing" | "configSync.apply" | "configSync.applyNone" | "configSync.applying" | "configSync.applied" | "configSync.appliedIds" | "configSync.skippedIds" | "configSync.nothing" | "configSync.unreadable" | "configSync.noSource" | "configSync.emptyProviders" | "configSync.failed" | "debug.workspace" | "debug.status" | "debug.status.trouble" | "debug.stalled" | "debug.act.pause" | "debug.act.resume" | "debug.act.stop" | "debug.act.stop.ask" | "debug.card.here.title" | "debug.card.here.note" | "debug.card.away.note" | "debug.card.paused.note" | "debug.card.hidden.note" | "record.waiting" | "record.waiting.note" | "record.recording" | "record.recording.note" | "record.recording.shots" | "record.finished" | "record.finished.note" | "record.act.cancel" | "record.act.halt" | "approval.record.site" | "approval.record.what" | "approval.record.lands" | "approval.record.noUrl" | "approval.record.oneAction" | "approval.record.noSwitch" | "approval.longTask.what" | "approval.longTask.signal", string>;
445
449
  };
446
450
  /** 中文词表的键类型(从 `zh.ts` 转出):`en` 与模块词表都得覆盖同一批键。 */
447
451
  export type { WorkbenchMessages };
package/dist/i18n/zh.d.ts CHANGED
@@ -37,6 +37,7 @@ export declare const zh: {
37
37
  readonly 'session.actions': "{name} 的操作";
38
38
  readonly 'status.idle': "空闲";
39
39
  readonly 'status.running': "进行中";
40
+ readonly 'status.longTask': "长任务在跑";
40
41
  readonly 'status.waitingApproval': "等待审批";
41
42
  readonly 'status.planReview': "计划待审";
42
43
  readonly 'status.waitingAnswer': "等待回答";
@@ -50,6 +51,8 @@ export declare const zh: {
50
51
  readonly 'project.attention.warning.other': "{n} 个会话在等你点头";
51
52
  readonly 'project.attention.running.one': "1 个会话在跑";
52
53
  readonly 'project.attention.running.other': "{n} 个会话在跑";
54
+ readonly 'project.attention.longTask.one': "1 个长任务在跑";
55
+ readonly 'project.attention.longTask.other': "{n} 个长任务在跑";
53
56
  readonly 'project.attention.done.one': "1 个会话跑完没看";
54
57
  readonly 'project.attention.done.other': "{n} 个会话跑完没看";
55
58
  readonly 'project.attention.state.warning': "待审批";
@@ -426,6 +429,7 @@ export declare const zh: {
426
429
  readonly 'record.waiting.note': "请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)";
427
430
  readonly 'record.recording': "录制中";
428
431
  readonly 'record.recording.note': "做完按「结束录制」;浮条没了按「停」,让 agent 先取再收";
432
+ readonly 'record.recording.shots': ";想留一张现场就按浮条上的「截图」(已拍 {n} 张)";
429
433
  readonly 'record.finished': "录制完成";
430
434
  readonly 'record.finished.note': "这一段录完了 —— agent 会自己来取并收工,不用你点";
431
435
  readonly 'record.act.cancel': "取消";
package/dist/i18n/zh.js CHANGED
@@ -37,6 +37,7 @@ export const zh = {
37
37
  'session.actions': '{name} 的操作',
38
38
  'status.idle': '空闲',
39
39
  'status.running': '进行中',
40
+ 'status.longTask': '长任务在跑',
40
41
  'status.waitingApproval': '等待审批',
41
42
  'status.planReview': '计划待审',
42
43
  'status.waitingAnswer': '等待回答',
@@ -50,6 +51,8 @@ export const zh = {
50
51
  'project.attention.warning.other': '{n} 个会话在等你点头',
51
52
  'project.attention.running.one': '1 个会话在跑',
52
53
  'project.attention.running.other': '{n} 个会话在跑',
54
+ 'project.attention.longTask.one': '1 个长任务在跑',
55
+ 'project.attention.longTask.other': '{n} 个长任务在跑',
53
56
  'project.attention.done.one': '1 个会话跑完没看',
54
57
  'project.attention.done.other': '{n} 个会话跑完没看',
55
58
  'project.attention.state.warning': '待审批',
@@ -426,6 +429,7 @@ export const zh = {
426
429
  'record.waiting.note': '请在那一页按「开始录制」,做完按「结束录制」(录完不替你切回来)',
427
430
  'record.recording': '录制中',
428
431
  'record.recording.note': '做完按「结束录制」;浮条没了按「停」,让 agent 先取再收',
432
+ 'record.recording.shots': ';想留一张现场就按浮条上的「截图」(已拍 {n} 张)',
429
433
  'record.finished': '录制完成',
430
434
  'record.finished.note': '这一段录完了 —— agent 会自己来取并收工,不用你点',
431
435
  'record.act.cancel': '取消',
package/dist/index.d.ts CHANGED
@@ -7,7 +7,6 @@ export * from './api/facts.js';
7
7
  export * from './api/host-write.js';
8
8
  export * from './api/long-task.js';
9
9
  export * from './api/unit-board.js';
10
- export * from './api/unit-declaration.js';
11
10
  export * from './api/unit.js';
12
11
  export * from './api/workbench-client.js';
13
12
  export * from './api/workbench-contract.js';
@@ -19,6 +18,7 @@ export * from './components/CardAnchor.js';
19
18
  export * from './components/CardBoundary.js';
20
19
  export * from './components/CardHead.js';
21
20
  export * from './components/ChoiceGroup.js';
21
+ export * from './components/ConfirmBar.js';
22
22
  export * from './components/Field.js';
23
23
  export * from './components/Form.js';
24
24
  export * from './components/FormActions.js';
@@ -49,10 +49,7 @@ export * from './i18n/zh.js';
49
49
  export * from './lib/blocker-action.js';
50
50
  export * from './lib/board-fact.js';
51
51
  export * from './lib/busy.js';
52
- export * from './lib/diy-debug.js';
53
- export * from './lib/diy-record.js';
54
52
  export * from './lib/form-problem.js';
55
- export * from './lib/panel-state.js';
56
53
  export * from './lib/react.js';
57
54
  export * from './lib/text.js';
58
55
  export * from './lib/ui.js';