@dsh-workbench/shared 1.1.7 → 1.1.9
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/dist/api/blocker-table.d.ts +1 -0
- package/dist/api/blocker-table.js +1 -1
- package/dist/components/SelectField.css +0 -6
- package/dist/components/SelectField.d.ts +2 -3
- package/dist/components/SelectField.js +9 -30
- package/dist/components/SelectFieldNodes.d.ts +3 -1
- package/dist/components/SelectFieldNodes.js +2 -1
- package/dist/components/SelectFieldWheel.d.ts +9 -0
- package/dist/components/SelectFieldWheel.js +35 -0
- package/dist/config/constants.d.ts +4 -4
- package/dist/config/constants.js +4 -4
- package/dist/contract/capabilities.d.ts +29 -0
- package/dist/contract/capabilities.js +1 -0
- package/dist/contract/needs.d.ts +3 -3
- package/dist/contract/needs.js +1 -1
- package/dist/contract/plugin-source.d.ts +19 -0
- package/dist/contract/protocol/bundle-install.d.ts +3 -1
- package/dist/contract/protocol/bundle-install.js +3 -0
- package/dist/contract/protocol/market-index.d.ts +1 -0
- package/dist/contract/protocol/platform.d.ts +1 -1
- package/dist/contract/runner.d.ts +6 -0
- package/dist/contract/runner.js +1 -0
- package/dist/contract/unit.d.ts +4 -4
- package/dist/host/adapter-contract.d.ts +3 -0
- package/dist/host/adapter-contract.js +93 -0
- package/dist/host/adapter-set.js +6 -4
- package/dist/host/adapter-types.d.ts +1 -1
- package/dist/host/bundle-manager.d.ts +3 -0
- package/dist/host/bundle-manager.js +181 -0
- package/dist/host/cli.js +3 -1
- package/dist/host/config-sync.d.ts +48 -0
- package/dist/host/config-sync.js +342 -0
- package/dist/host/dsh-plugins.d.ts +5 -0
- package/dist/host/dsh-plugins.js +51 -0
- package/dist/host/extension.js +1 -1
- package/dist/host/flow/check.d.ts +9 -0
- package/dist/host/flow/check.js +179 -0
- package/dist/host/flow/expr.d.ts +30 -0
- package/dist/host/flow/expr.js +99 -0
- package/dist/host/flow/kit.d.ts +14 -0
- package/dist/host/flow/kit.js +13 -0
- package/dist/host/flow/run.d.ts +13 -0
- package/dist/host/flow/run.js +287 -0
- package/dist/host/flow/types.d.ts +188 -0
- package/dist/host/flow/types.js +1 -0
- package/dist/host/host-actions.d.ts +2 -0
- package/dist/host/host-actions.js +5 -0
- package/dist/host/host-kit.d.ts +19 -0
- package/dist/host/host-kit.js +14 -0
- package/dist/host/http.d.ts +2 -6
- package/dist/host/http.js +2 -2
- package/dist/host/installed-module.d.ts +23 -0
- package/dist/host/installed-module.js +264 -0
- package/dist/host/lib-install.d.ts +7 -9
- package/dist/host/lib-install.js +9 -12
- package/dist/host/lib-runners.d.ts +3 -5
- package/dist/host/lib-runners.js +2 -2
- package/dist/host/local-declaration.d.ts +7 -0
- package/dist/host/local-declaration.js +33 -0
- package/dist/host/market-index-claim.d.ts +0 -1
- package/dist/host/market-index-claim.js +0 -3
- package/dist/host/market-index-doc.d.ts +1 -45
- package/dist/host/market-index-parse.d.ts +9 -4
- package/dist/host/market-index-parse.js +17 -92
- package/dist/host/market-index.d.ts +5 -6
- package/dist/host/market-index.js +29 -87
- package/dist/host/module-root.d.ts +1 -0
- package/dist/host/module-root.js +5 -0
- package/dist/host/npm-registry.d.ts +10 -0
- package/dist/host/npm-registry.js +16 -0
- package/dist/host/opencli-runner.d.ts +2 -1
- package/dist/host/package-content.d.ts +7 -0
- package/dist/host/package-content.js +69 -0
- package/dist/host/package-kind.d.ts +13 -0
- package/dist/host/package-kind.js +51 -0
- package/dist/host/package-route.d.ts +31 -0
- package/dist/host/package-route.js +57 -0
- package/dist/host/paths.d.ts +11 -19
- package/dist/host/paths.js +16 -43
- package/dist/host/platform.js +1 -1
- package/dist/host/plugin-ledger.d.ts +8 -8
- package/dist/host/plugin-ledger.js +23 -16
- package/dist/host/plugin.d.ts +1 -2
- package/dist/host/plugin.js +4 -5
- package/dist/host/port-types.d.ts +42 -9
- package/dist/host/preflight.d.ts +3 -2
- package/dist/host/profile-create.d.ts +18 -0
- package/dist/host/profile-create.js +118 -0
- package/dist/host/profile-registries.d.ts +10 -0
- package/dist/host/profile-registries.js +150 -0
- package/dist/host/registry-declaration.d.ts +21 -0
- package/dist/host/registry-declaration.js +33 -0
- package/dist/host/release-probe.d.ts +34 -0
- package/dist/host/release-probe.js +88 -0
- package/dist/host/runner.d.ts +26 -0
- package/dist/host/runner.js +50 -0
- package/dist/host/shell.d.ts +0 -2
- package/dist/host/shell.js +0 -7
- package/dist/host/spec.js +1 -1
- package/dist/host/supply-index.d.ts +1 -0
- package/dist/host/supply-index.js +8 -7
- package/dist/host/supply-port.js +13 -3
- package/dist/host/unit-face.d.ts +2 -1
- package/dist/host/version.js +11 -6
- package/dist/host.d.ts +24 -6
- package/dist/host.js +23 -6
- package/dist/i18n/en.js +19 -20
- package/dist/i18n/index.d.ts +20 -21
- package/dist/i18n/runtime-terms.d.ts +15 -0
- package/dist/i18n/runtime-terms.js +22 -0
- package/dist/i18n/zh.d.ts +19 -20
- package/dist/i18n/zh.js +19 -20
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/testing/fake-adapter-set.d.ts +5 -0
- package/dist/testing/fake-adapter-set.js +150 -0
- package/dist/testing/needs.js +1 -1
- package/dist/testing.d.ts +1 -0
- package/dist/testing.js +1 -0
- package/package.json +1 -1
- package/src/api/__tests__/blocker-table.test.ts +25 -0
- package/src/api/{workbench-client.test.ts → __tests__/workbench-client.test.ts} +2 -2
- package/src/api/blocker-table.ts +6 -2
- package/src/components/SelectField.css +0 -6
- package/src/components/SelectField.tsx +7 -36
- package/src/components/SelectFieldNodes.tsx +4 -1
- package/src/components/{Card.test.tsx → __tests__/Card.test.tsx} +2 -2
- package/src/components/{CardAnchor.test.tsx → __tests__/CardAnchor.test.tsx} +3 -3
- package/src/components/{CardHead.test.tsx → __tests__/CardHead.test.tsx} +1 -1
- package/src/components/{ChoiceGroup.test.tsx → __tests__/ChoiceGroup.test.tsx} +2 -2
- package/src/components/{ConfirmBar.test.tsx → __tests__/ConfirmBar.test.tsx} +5 -5
- package/src/components/{Field.test.tsx → __tests__/Field.test.tsx} +1 -1
- package/src/components/{Form.test.tsx → __tests__/Form.test.tsx} +5 -5
- package/src/components/{FormActions.test.tsx → __tests__/FormActions.test.tsx} +3 -3
- package/src/components/{FormRows.test.tsx → __tests__/FormRows.test.tsx} +2 -2
- package/src/components/{FormTypes.test.ts → __tests__/FormTypes.test.ts} +1 -1
- package/src/components/{FormWiring.test.tsx → __tests__/FormWiring.test.tsx} +4 -4
- package/src/components/{Link.test.tsx → __tests__/Link.test.tsx} +1 -1
- package/src/components/{Rows.test.tsx → __tests__/Rows.test.tsx} +2 -2
- package/src/components/{SelectField.test.tsx → __tests__/SelectField.test.tsx} +7 -37
- package/src/components/{Spinner.test.tsx → __tests__/Spinner.test.tsx} +4 -4
- package/src/config/{constants.test.ts → __tests__/constants.test.ts} +1 -1
- package/src/config/{storage.test.ts → __tests__/storage.test.ts} +1 -1
- package/src/config/constants.ts +4 -4
- package/src/contract/capabilities.ts +30 -0
- package/src/contract/needs.ts +4 -4
- package/src/contract/plugin-source.ts +24 -0
- package/src/contract/protocol/bundle-install.ts +7 -1
- package/src/contract/protocol/market-index.ts +1 -0
- package/src/contract/protocol/platform.ts +1 -1
- package/src/contract/runner.ts +6 -0
- package/src/contract/unit.ts +4 -4
- package/src/host/{extension.test.ts → __tests__/extension.test.ts} +4 -4
- package/src/host/{install-failure.test.ts → __tests__/install-failure.test.ts} +1 -1
- package/src/host/{installed-sources.test.ts → __tests__/installed-sources.test.ts} +1 -1
- package/src/host/__tests__/lib-runners.test.ts +11 -2
- package/src/host/__tests__/market-index-assemble.test.ts +26 -0
- package/src/host/__tests__/market-index.test.ts +41 -51
- package/src/host/__tests__/plugin-ledger.test.ts +19 -6
- package/src/host/{recipe.test.ts → __tests__/recipe.test.ts} +3 -3
- package/src/host/__tests__/runtime-layout.test.ts +14 -0
- package/src/host/__tests__/supply-index.test.ts +2 -2
- package/src/host/__tests__/supply-port.test.ts +32 -0
- package/src/host/adapter-contract.ts +93 -0
- package/src/host/adapter-set.ts +6 -4
- package/src/host/adapter-types.ts +1 -1
- package/src/host/bundle-manager.ts +195 -0
- package/src/host/cli.ts +3 -1
- package/src/host/config-sync.ts +386 -0
- package/src/host/dsh-plugins.ts +60 -0
- package/src/host/extension.ts +1 -1
- package/src/host/flow/__tests__/advanced.test.ts +302 -0
- package/src/host/flow/__tests__/check.test.ts +169 -0
- package/src/host/flow/__tests__/run.test.ts +301 -0
- package/src/host/flow/check.ts +216 -0
- package/src/host/flow/expr.ts +94 -0
- package/src/host/flow/kit.ts +30 -0
- package/src/host/flow/run.ts +325 -0
- package/src/host/flow/types.ts +199 -0
- package/src/host/host-actions.ts +7 -0
- package/src/host/host-kit.ts +26 -0
- package/src/host/http.ts +6 -8
- package/src/host/installed-module.ts +272 -0
- package/src/host/lib-install.ts +14 -12
- package/src/host/lib-runners.ts +6 -8
- package/src/host/local-declaration.ts +37 -0
- package/src/host/market-index-claim.ts +0 -4
- package/src/host/market-index-doc.ts +1 -53
- package/src/host/market-index-parse.ts +21 -85
- package/src/host/market-index.ts +33 -127
- package/src/host/module-root.ts +6 -0
- package/src/host/npm-registry.ts +21 -0
- package/src/host/package-content.ts +76 -0
- package/src/host/package-kind.ts +63 -0
- package/src/host/package-route.ts +93 -0
- package/src/host/paths.ts +27 -52
- package/src/host/platform.ts +1 -1
- package/src/host/plugin-ledger.ts +25 -18
- package/src/host/plugin.ts +4 -5
- package/src/host/port-types.ts +43 -9
- package/src/host/preflight.ts +3 -2
- package/src/host/profile-create.ts +133 -0
- package/src/host/profile-registries.ts +145 -0
- package/src/host/registry-declaration.ts +70 -0
- package/src/host/release-probe.ts +202 -0
- package/src/host/shell.ts +0 -9
- package/src/host/spec.ts +1 -1
- package/src/host/supply-index.ts +9 -7
- package/src/host/supply-port.ts +13 -3
- package/src/host/unit-face.ts +2 -1
- package/src/host/version.ts +12 -7
- package/src/host.ts +34 -6
- package/src/i18n/{index.test.ts → __tests__/index.test.ts} +3 -3
- package/src/i18n/{merge.test.ts → __tests__/merge.test.ts} +1 -1
- package/src/i18n/{zh.test.ts → __tests__/zh.test.ts} +2 -2
- package/src/i18n/en.ts +19 -21
- package/src/i18n/runtime-terms.ts +26 -0
- package/src/i18n/zh.ts +19 -21
- package/src/index.ts +4 -0
- package/src/lib/{board-fact.test.ts → __tests__/board-fact.test.ts} +1 -1
- package/src/lib/{busy.test.ts → __tests__/busy.test.ts} +1 -1
- package/src/lib/{form-problem.test.ts → __tests__/form-problem.test.ts} +1 -1
- package/src/lib/{git-address.test.ts → __tests__/git-address.test.ts} +1 -1
- package/src/lib/{react.test.ts → __tests__/react.test.ts} +1 -1
- package/src/lib/{text.test.ts → __tests__/text.test.ts} +1 -1
- package/src/lib/{ui.test.ts → __tests__/ui.test.ts} +1 -1
- package/src/testing/__tests__/fake-adapter-set.test.ts +28 -0
- package/src/testing/fake-adapter-set.ts +173 -0
- package/src/testing/needs.ts +1 -1
- package/src/testing.ts +1 -0
- package/src/host/__tests__/command-name.test.ts +0 -16
- package/src/host/__tests__/opencli-runner.test.ts +0 -120
- package/src/host/channel-plugin.ts +0 -55
- package/src/host/command-name.ts +0 -15
- package/src/host/opencli-runner.ts +0 -76
- package/src/host/paths.test.ts +0 -26
- package/src/host/plugin-source.ts +0 -137
- package/src/host/runtime-links.test.ts +0 -31
- package/src/host/runtime-links.ts +0 -23
package/dist/i18n/zh.d.ts
CHANGED
|
@@ -82,7 +82,11 @@ export declare const zh: {
|
|
|
82
82
|
readonly 'time.short.years': "{n}年";
|
|
83
83
|
readonly 'panels.title': "面板模块";
|
|
84
84
|
readonly 'panels.groupBoardless': "无看板模块";
|
|
85
|
-
readonly 'panels.groupPlugins': "
|
|
85
|
+
readonly 'panels.groupPlugins': "插件";
|
|
86
|
+
readonly 'runtime.plugin': "插件";
|
|
87
|
+
readonly 'runtime.pluginOf': "运行时提供的插件";
|
|
88
|
+
readonly 'runtime.pluginThing': "插件";
|
|
89
|
+
readonly 'runtime.pluginArea': "插件区";
|
|
86
90
|
readonly 'panels.market.defaultHint': "打开后所有工作区默认开启,也可在工作区面板配置中单独关闭";
|
|
87
91
|
readonly 'panels.market.defaultLabel': "全局默认开启";
|
|
88
92
|
readonly 'panels.market.defaultLocked': "这份现在用不了,先更新或卸载";
|
|
@@ -160,9 +164,6 @@ export declare const zh: {
|
|
|
160
164
|
readonly 'panels.market.confirmNo': "取消";
|
|
161
165
|
readonly 'panels.market.noMarketSource': "索引里没有这个模块的新版本(刷新一次索引再试)";
|
|
162
166
|
readonly 'panels.market.failed': "没成功:{reason}";
|
|
163
|
-
readonly 'panels.market.askAgent': "问 agent";
|
|
164
|
-
readonly 'panels.market.askAgentCopied': "已复制";
|
|
165
|
-
readonly 'panels.market.askAgentText': "工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。";
|
|
166
167
|
readonly 'panels.market.failure.permission': "没装上:没有写入权限";
|
|
167
168
|
readonly 'panels.market.failure.diskFull': "没装上:磁盘满了";
|
|
168
169
|
readonly 'panels.market.failure.sandbox': "没装上:被系统拦住了";
|
|
@@ -202,7 +203,7 @@ export declare const zh: {
|
|
|
202
203
|
readonly 'panels.market.noSource': "这个模块没声明怎么装,只能自己动手";
|
|
203
204
|
readonly 'panels.market.badSource': "安装方式没写全,只能自己动手";
|
|
204
205
|
readonly 'panels.market.empty': "暂无可用模块";
|
|
205
|
-
readonly 'panels.market.sectionPlugins': "
|
|
206
|
+
readonly 'panels.market.sectionPlugins': "已安装的插件";
|
|
206
207
|
readonly 'panels.market.moduleOutdated': "有新版";
|
|
207
208
|
readonly 'panels.market.updateNeedsWorkbench': "新版本要先把工作台升级才能用";
|
|
208
209
|
readonly 'panels.market.updateIncompatible': "新版本和当前的工作台不匹配,暂时不能更新";
|
|
@@ -240,7 +241,7 @@ export declare const zh: {
|
|
|
240
241
|
readonly 'panels.market.justNow': "刚刚";
|
|
241
242
|
readonly 'panels.market.minutesAgo': "{n} 分钟前";
|
|
242
243
|
readonly 'panels.market.hoursAgo': "{n} 小时前";
|
|
243
|
-
readonly 'panels.market.add.description': "输入模块或
|
|
244
|
+
readonly 'panels.market.add.description': "输入模块或 {plugin}的包名、Git 仓库地址或本地目录路径。";
|
|
244
245
|
readonly 'panels.market.add.specPlaceholder': "例如 @dsh-workbench/module-hello";
|
|
245
246
|
readonly 'panels.market.add.guideToggle': "模块安装引导和示例";
|
|
246
247
|
readonly 'panels.market.add.guideHide': "收起引导";
|
|
@@ -279,12 +280,12 @@ export declare const zh: {
|
|
|
279
280
|
readonly 'panels.market.add.problemInstalled': "这个模块已经装过了(要换版本请带上 @版本)";
|
|
280
281
|
readonly 'panels.market.add.problemNotFound': "未找到相关模块";
|
|
281
282
|
readonly 'panels.market.add.problemNotPackage': "该路径不存在或不是有效的模块包";
|
|
282
|
-
readonly 'panels.market.add.problemNotBundle': "这个包装不进这里:{reason}。这个入口按包名认工作台模块和
|
|
283
|
+
readonly 'panels.market.add.problemNotBundle': "这个包装不进这里:{reason}。这个入口按包名认工作台模块和 {plugin},两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。";
|
|
283
284
|
readonly 'panels.market.add.problemNotWorkbenchModule': "这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。";
|
|
284
|
-
readonly 'panels.market.add.problemNotModuleOrPlugin': "这个包既不是工作台的模块,也不是
|
|
285
|
-
readonly 'panels.market.add.failureNotModuleOrPlugin': "这个包既不是工作台的模块,也不是
|
|
286
|
-
readonly 'panels.market.add.installedPlugin': "装上了:
|
|
287
|
-
readonly 'panels.market.add.pluginPreview': "这是一份
|
|
285
|
+
readonly 'panels.market.add.problemNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上。换一个版本,或者找这个包的作者。";
|
|
286
|
+
readonly 'panels.market.add.failureNotModuleOrPlugin': "这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上";
|
|
287
|
+
readonly 'panels.market.add.installedPlugin': "装上了:{plugin} {name}";
|
|
288
|
+
readonly 'panels.market.add.pluginPreview': "这是一份 {pluginThing}:装进 {pluginArea},装完就能用,不用重启。";
|
|
288
289
|
readonly 'panels.market.add.pluginAlias': "插件名:{name}";
|
|
289
290
|
readonly 'panels.market.add.problemNetwork': "无法连接模块源,请检查网络后重试";
|
|
290
291
|
readonly 'panels.market.add.problemUnknown': "无法获取模块信息:{reason}";
|
|
@@ -380,7 +381,7 @@ export declare const zh: {
|
|
|
380
381
|
readonly 'panels.discover.missingIndex': "仓库里还没有索引文件 {path}";
|
|
381
382
|
readonly 'panels.discover.initTitle': "把这个仓库初始化成模块市场索引?";
|
|
382
383
|
readonly 'panels.discover.initCta': "初始化成市场索引";
|
|
383
|
-
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts
|
|
384
|
+
readonly 'panels.discover.initWhat': "会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。";
|
|
384
385
|
readonly 'panels.discover.initBranch': "分支";
|
|
385
386
|
readonly 'panels.discover.initBranchHint': "索引和打包文件都发到这个分支;空仓库会新建它。";
|
|
386
387
|
readonly 'panels.discover.initBranchBad': "分支名只能用字母、数字、点、下划线、斜杠或短横线";
|
|
@@ -560,7 +561,7 @@ export declare const zh: {
|
|
|
560
561
|
readonly 'blocker.forbidden.hint': "账号已登录,但没有这个项目/仓库的权限;申请之后再试。";
|
|
561
562
|
readonly 'blocker.forbidden.open': "打开权限页";
|
|
562
563
|
readonly 'blocker.timeout.hint': "后台浏览器没起来,重试一次通常就好。";
|
|
563
|
-
readonly 'blocker.exec.hint': "
|
|
564
|
+
readonly 'blocker.exec.hint': "确认运行时已经装好、在终端里能直接跑起来。";
|
|
564
565
|
readonly 'blocker.unknown.title': "出了点问题";
|
|
565
566
|
readonly 'panels.reading': "正在读取面板配置…";
|
|
566
567
|
readonly 'panels.cardBroken': "这个模块起不来:{unit}({reason})";
|
|
@@ -577,16 +578,11 @@ export declare const zh: {
|
|
|
577
578
|
readonly 'env.stepFailed.shell': "连不上命令行";
|
|
578
579
|
readonly 'env.toolchain.ok': "正常";
|
|
579
580
|
readonly 'env.toolchain.warn': "还没完全准备好";
|
|
580
|
-
readonly 'env.
|
|
581
|
+
readonly 'env.runtime.ok': "已就绪";
|
|
581
582
|
readonly 'env.bridge.ok': "已连接";
|
|
582
583
|
readonly 'env.bridge.short': "还没连上";
|
|
583
584
|
readonly 'env.bridge.why': "面板的数据要用你浏览器里的登录状态。这个连接没通,模块就取不到数据;不拦路:修好它,或者先进入工作台。";
|
|
584
585
|
readonly 'env.bridge.hold': "浏览器还没连上 —— 按下面修好后点「重试」,也可以先进工作台。";
|
|
585
|
-
readonly 'env.bridge.daemon': "后台服务没起来:正常它会自己起,先在终端跑下面这条命令。";
|
|
586
|
-
readonly 'env.bridge.extension': "浏览器扩展没连上:确认浏览器开着、扩展已启用;没装就从商店装一次(装完回来点「重试」)。";
|
|
587
|
-
readonly 'env.bridge.extensionLink': "去 Chrome 应用商店装扩展";
|
|
588
|
-
readonly 'env.bridge.profile': "连上了多个浏览器账号,但没选默认的那个:先看有哪些(下面这条命令),再选一个。";
|
|
589
|
-
readonly 'env.bridge.stale': "默认的浏览器账号已经失效(它记的是上一次的扩展实例):重新选一个。";
|
|
590
586
|
readonly 'env.bridge.unknown': "没认出是哪种问题:展开原文,按里面的步骤处理。";
|
|
591
587
|
readonly 'env.fix.title': "怎么解决";
|
|
592
588
|
readonly 'env.fix.why': "工作台用它自己那份后台工具(与你在终端里那套分开装,互不影响),这台机器上还没装好它。";
|
|
@@ -616,7 +612,8 @@ export declare const zh: {
|
|
|
616
612
|
readonly 'env.copyCommand': "复制命令";
|
|
617
613
|
readonly 'env.copied': "已复制";
|
|
618
614
|
readonly 'env.step.toolchain': "运行环境";
|
|
619
|
-
readonly 'env.step.
|
|
615
|
+
readonly 'env.step.adapter': "运行时";
|
|
616
|
+
readonly 'env.step.runtime': "后台工具";
|
|
620
617
|
readonly 'env.step.bridge': "浏览器连接";
|
|
621
618
|
readonly 'env.step.diy': "DIY 模式";
|
|
622
619
|
readonly 'env.step.warm': "站点登录状态";
|
|
@@ -711,6 +708,8 @@ export declare const zh: {
|
|
|
711
708
|
readonly 'approval.publish.version': "版本";
|
|
712
709
|
readonly 'approval.publish.author': "作者";
|
|
713
710
|
readonly 'approval.publish.authorMissing': "未署名";
|
|
711
|
+
readonly 'approval.publish.labels': "标签";
|
|
712
|
+
readonly 'approval.publish.labelsMissing': "还没有(发布到市场时补 1–2 个)";
|
|
714
713
|
readonly 'approval.publish.owner': "认领人";
|
|
715
714
|
readonly 'approval.publish.ownerUnowned': "原来没署名";
|
|
716
715
|
readonly 'approval.publish.ownerTaken': "已有主人:{owner}";
|
package/dist/i18n/zh.js
CHANGED
|
@@ -74,7 +74,11 @@ export const zh = {
|
|
|
74
74
|
'time.short.years': '{n}年',
|
|
75
75
|
'panels.title': '面板模块',
|
|
76
76
|
'panels.groupBoardless': '无看板模块',
|
|
77
|
-
'panels.groupPlugins': '
|
|
77
|
+
'panels.groupPlugins': '插件',
|
|
78
|
+
'runtime.plugin': '插件',
|
|
79
|
+
'runtime.pluginOf': '运行时提供的插件',
|
|
80
|
+
'runtime.pluginThing': '插件',
|
|
81
|
+
'runtime.pluginArea': '插件区',
|
|
78
82
|
'panels.market.defaultHint': '打开后所有工作区默认开启,也可在工作区面板配置中单独关闭',
|
|
79
83
|
'panels.market.defaultLabel': '全局默认开启',
|
|
80
84
|
'panels.market.defaultLocked': '这份现在用不了,先更新或卸载',
|
|
@@ -152,9 +156,6 @@ export const zh = {
|
|
|
152
156
|
'panels.market.confirmNo': '取消',
|
|
153
157
|
'panels.market.noMarketSource': '索引里没有这个模块的新版本(刷新一次索引再试)',
|
|
154
158
|
'panels.market.failed': '没成功:{reason}',
|
|
155
|
-
'panels.market.askAgent': '问 agent',
|
|
156
|
-
'panels.market.askAgentCopied': '已复制',
|
|
157
|
-
'panels.market.askAgentText': '工作台里「{name}」(单元 {unit})用不了:{reason}。帮我查清缺什么、怎么补,补完确认真能用。',
|
|
158
159
|
'panels.market.failure.permission': '没装上:没有写入权限',
|
|
159
160
|
'panels.market.failure.diskFull': '没装上:磁盘满了',
|
|
160
161
|
'panels.market.failure.sandbox': '没装上:被系统拦住了',
|
|
@@ -194,7 +195,7 @@ export const zh = {
|
|
|
194
195
|
'panels.market.noSource': '这个模块没声明怎么装,只能自己动手',
|
|
195
196
|
'panels.market.badSource': '安装方式没写全,只能自己动手',
|
|
196
197
|
'panels.market.empty': '暂无可用模块',
|
|
197
|
-
'panels.market.sectionPlugins': '
|
|
198
|
+
'panels.market.sectionPlugins': '已安装的插件',
|
|
198
199
|
'panels.market.moduleOutdated': '有新版',
|
|
199
200
|
'panels.market.updateNeedsWorkbench': '新版本要先把工作台升级才能用',
|
|
200
201
|
'panels.market.updateIncompatible': '新版本和当前的工作台不匹配,暂时不能更新',
|
|
@@ -232,7 +233,7 @@ export const zh = {
|
|
|
232
233
|
'panels.market.justNow': '刚刚',
|
|
233
234
|
'panels.market.minutesAgo': '{n} 分钟前',
|
|
234
235
|
'panels.market.hoursAgo': '{n} 小时前',
|
|
235
|
-
'panels.market.add.description': '输入模块或
|
|
236
|
+
'panels.market.add.description': '输入模块或 {plugin}的包名、Git 仓库地址或本地目录路径。',
|
|
236
237
|
'panels.market.add.specPlaceholder': '例如 @dsh-workbench/module-hello',
|
|
237
238
|
'panels.market.add.guideToggle': '模块安装引导和示例',
|
|
238
239
|
'panels.market.add.guideHide': '收起引导',
|
|
@@ -271,12 +272,12 @@ export const zh = {
|
|
|
271
272
|
'panels.market.add.problemInstalled': '这个模块已经装过了(要换版本请带上 @版本)',
|
|
272
273
|
'panels.market.add.problemNotFound': '未找到相关模块',
|
|
273
274
|
'panels.market.add.problemNotPackage': '该路径不存在或不是有效的模块包',
|
|
274
|
-
'panels.market.add.problemNotBundle': '这个包装不进这里:{reason}。这个入口按包名认工作台模块和
|
|
275
|
+
'panels.market.add.problemNotBundle': '这个包装不进这里:{reason}。这个入口按包名认工作台模块和 {plugin},两种都能装;但 git 地址和 tarball 判断不出它是什么 —— 要是它其实是这两样之一,请改填包名或本地目录。',
|
|
275
276
|
'panels.market.add.problemNotWorkbenchModule': '这个包跟现在的工作台对不上,装上也用不了。换一个版本,或者找这个模块的作者。',
|
|
276
|
-
'panels.market.add.problemNotModuleOrPlugin': '这个包既不是工作台的模块,也不是
|
|
277
|
-
'panels.market.add.failureNotModuleOrPlugin': '这个包既不是工作台的模块,也不是
|
|
278
|
-
'panels.market.add.installedPlugin': '装上了:
|
|
279
|
-
'panels.market.add.pluginPreview': '这是一份
|
|
277
|
+
'panels.market.add.problemNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上。换一个版本,或者找这个包的作者。',
|
|
278
|
+
'panels.market.add.failureNotModuleOrPlugin': '这个包既不是工作台的模块,也不是 {pluginOf},装了也用不上',
|
|
279
|
+
'panels.market.add.installedPlugin': '装上了:{plugin} {name}',
|
|
280
|
+
'panels.market.add.pluginPreview': '这是一份 {pluginThing}:装进 {pluginArea},装完就能用,不用重启。',
|
|
280
281
|
'panels.market.add.pluginAlias': '插件名:{name}',
|
|
281
282
|
'panels.market.add.problemNetwork': '无法连接模块源,请检查网络后重试',
|
|
282
283
|
'panels.market.add.problemUnknown': '无法获取模块信息:{reason}',
|
|
@@ -372,7 +373,7 @@ export const zh = {
|
|
|
372
373
|
'panels.discover.missingIndex': '仓库里还没有索引文件 {path}',
|
|
373
374
|
'panels.discover.initTitle': '把这个仓库初始化成模块市场索引?',
|
|
374
375
|
'panels.discover.initCta': '初始化成市场索引',
|
|
375
|
-
'panels.discover.initWhat': '会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts
|
|
376
|
+
'panels.discover.initWhat': '会在 {branch} 分支写索引目录 market/ 与 README.md,提交一次并推上去;之后从这个工作台发布的模块会把打包好的文件提交到 artifacts/<包名>/,条目写到 market/<包名>.json。仓库的写权限归它的所有者。',
|
|
376
377
|
'panels.discover.initBranch': '分支',
|
|
377
378
|
'panels.discover.initBranchHint': '索引和打包文件都发到这个分支;空仓库会新建它。',
|
|
378
379
|
'panels.discover.initBranchBad': '分支名只能用字母、数字、点、下划线、斜杠或短横线',
|
|
@@ -552,7 +553,7 @@ export const zh = {
|
|
|
552
553
|
'blocker.forbidden.hint': '账号已登录,但没有这个项目/仓库的权限;申请之后再试。',
|
|
553
554
|
'blocker.forbidden.open': '打开权限页',
|
|
554
555
|
'blocker.timeout.hint': '后台浏览器没起来,重试一次通常就好。',
|
|
555
|
-
'blocker.exec.hint': '
|
|
556
|
+
'blocker.exec.hint': '确认运行时已经装好、在终端里能直接跑起来。',
|
|
556
557
|
'blocker.unknown.title': '出了点问题',
|
|
557
558
|
'panels.reading': '正在读取面板配置…',
|
|
558
559
|
'panels.cardBroken': '这个模块起不来:{unit}({reason})',
|
|
@@ -569,16 +570,11 @@ export const zh = {
|
|
|
569
570
|
'env.stepFailed.shell': '连不上命令行',
|
|
570
571
|
'env.toolchain.ok': '正常',
|
|
571
572
|
'env.toolchain.warn': '还没完全准备好',
|
|
572
|
-
'env.
|
|
573
|
+
'env.runtime.ok': '已就绪',
|
|
573
574
|
'env.bridge.ok': '已连接',
|
|
574
575
|
'env.bridge.short': '还没连上',
|
|
575
576
|
'env.bridge.why': '面板的数据要用你浏览器里的登录状态。这个连接没通,模块就取不到数据;不拦路:修好它,或者先进入工作台。',
|
|
576
577
|
'env.bridge.hold': '浏览器还没连上 —— 按下面修好后点「重试」,也可以先进工作台。',
|
|
577
|
-
'env.bridge.daemon': '后台服务没起来:正常它会自己起,先在终端跑下面这条命令。',
|
|
578
|
-
'env.bridge.extension': '浏览器扩展没连上:确认浏览器开着、扩展已启用;没装就从商店装一次(装完回来点「重试」)。',
|
|
579
|
-
'env.bridge.extensionLink': '去 Chrome 应用商店装扩展',
|
|
580
|
-
'env.bridge.profile': '连上了多个浏览器账号,但没选默认的那个:先看有哪些(下面这条命令),再选一个。',
|
|
581
|
-
'env.bridge.stale': '默认的浏览器账号已经失效(它记的是上一次的扩展实例):重新选一个。',
|
|
582
578
|
'env.bridge.unknown': '没认出是哪种问题:展开原文,按里面的步骤处理。',
|
|
583
579
|
'env.fix.title': '怎么解决',
|
|
584
580
|
'env.fix.why': '工作台用它自己那份后台工具(与你在终端里那套分开装,互不影响),这台机器上还没装好它。',
|
|
@@ -608,7 +604,8 @@ export const zh = {
|
|
|
608
604
|
'env.copyCommand': '复制命令',
|
|
609
605
|
'env.copied': '已复制',
|
|
610
606
|
'env.step.toolchain': '运行环境',
|
|
611
|
-
'env.step.
|
|
607
|
+
'env.step.adapter': '运行时',
|
|
608
|
+
'env.step.runtime': '后台工具',
|
|
612
609
|
'env.step.bridge': '浏览器连接',
|
|
613
610
|
'env.step.diy': 'DIY 模式',
|
|
614
611
|
'env.step.warm': '站点登录状态',
|
|
@@ -703,6 +700,8 @@ export const zh = {
|
|
|
703
700
|
'approval.publish.version': '版本',
|
|
704
701
|
'approval.publish.author': '作者',
|
|
705
702
|
'approval.publish.authorMissing': '未署名',
|
|
703
|
+
'approval.publish.labels': '标签',
|
|
704
|
+
'approval.publish.labelsMissing': '还没有(发布到市场时补 1–2 个)',
|
|
706
705
|
'approval.publish.owner': '认领人',
|
|
707
706
|
'approval.publish.ownerUnowned': '原来没署名',
|
|
708
707
|
'approval.publish.ownerTaken': '已有主人:{owner}',
|
package/dist/index.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ export * from './contract/extension.js';
|
|
|
42
42
|
export * from './contract/lib.js';
|
|
43
43
|
export * from './contract/git.js';
|
|
44
44
|
export * from './contract/command.js';
|
|
45
|
+
export * from './contract/runner.js';
|
|
46
|
+
export * from './contract/plugin-source.js';
|
|
45
47
|
export * from './contract/facts.js';
|
|
46
48
|
export * from './contract/long-task.js';
|
|
47
49
|
export * from './contract/protocol/bundle-install.js';
|
|
@@ -57,12 +59,14 @@ export * from './contract/protocol/unit-manifests.js';
|
|
|
57
59
|
export * from './contract/unit-board.js';
|
|
58
60
|
export * from './contract/unit-declaration.js';
|
|
59
61
|
export * from './contract/unit.js';
|
|
62
|
+
export * from './contract/capabilities.js';
|
|
60
63
|
export * from './contract/needs.js';
|
|
61
64
|
export * from './contract/unit-capability.js';
|
|
62
65
|
export * from './contract/workbench-contract.js';
|
|
63
66
|
export * from './i18n/en.js';
|
|
64
67
|
export * from './i18n/index.js';
|
|
65
68
|
export * from './i18n/merge.js';
|
|
69
|
+
export * from './i18n/runtime-terms.js';
|
|
66
70
|
export * from './i18n/settings.js';
|
|
67
71
|
export * from './i18n/zh.js';
|
|
68
72
|
export * from './lib/blocker-action.js';
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,8 @@ export * from './contract/extension.js';
|
|
|
42
42
|
export * from './contract/lib.js';
|
|
43
43
|
export * from './contract/git.js';
|
|
44
44
|
export * from './contract/command.js';
|
|
45
|
+
export * from './contract/runner.js';
|
|
46
|
+
export * from './contract/plugin-source.js';
|
|
45
47
|
export * from './contract/facts.js';
|
|
46
48
|
export * from './contract/long-task.js';
|
|
47
49
|
export * from './contract/protocol/bundle-install.js';
|
|
@@ -57,12 +59,14 @@ export * from './contract/protocol/unit-manifests.js';
|
|
|
57
59
|
export * from './contract/unit-board.js';
|
|
58
60
|
export * from './contract/unit-declaration.js';
|
|
59
61
|
export * from './contract/unit.js';
|
|
62
|
+
export * from './contract/capabilities.js';
|
|
60
63
|
export * from './contract/needs.js';
|
|
61
64
|
export * from './contract/unit-capability.js';
|
|
62
65
|
export * from './contract/workbench-contract.js';
|
|
63
66
|
export * from './i18n/en.js';
|
|
64
67
|
export * from './i18n/index.js';
|
|
65
68
|
export * from './i18n/merge.js';
|
|
69
|
+
export * from './i18n/runtime-terms.js';
|
|
66
70
|
export * from './i18n/settings.js';
|
|
67
71
|
export * from './i18n/zh.js';
|
|
68
72
|
export * from './lib/blocker-action.js';
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { ADAPTER_SET_API_VERSION } from '../host/adapters.js';
|
|
2
|
+
import { readBundleManager } from '../host/bundle-manager.js';
|
|
3
|
+
import { declarationGaps, moduleDeclarationOf, profileDirOf, profileModules, readInstalledModule, readProfilePackage, } from '../host/installed-module.js';
|
|
4
|
+
import { isNewerVersion } from '../host/version.js';
|
|
5
|
+
import { refusalReason } from '../host/spec.js';
|
|
6
|
+
import { declarationRefusalOf, pathDeclarationOf } from '../host/local-declaration.js';
|
|
7
|
+
import { createRegistryLookup } from '../host/registry-declaration.js';
|
|
8
|
+
import { createPackageRouter } from '../host/package-route.js';
|
|
9
|
+
import { createReleaseProbe } from '../host/release-probe.js';
|
|
10
|
+
export const FAKE_ADAPTER_MARKER = { adapterSet: 'fake' };
|
|
11
|
+
function result() {
|
|
12
|
+
return { ok: true, data: FAKE_ADAPTER_MARKER };
|
|
13
|
+
}
|
|
14
|
+
const data = {
|
|
15
|
+
async read(_request) {
|
|
16
|
+
return result();
|
|
17
|
+
},
|
|
18
|
+
async request(_recipe) {
|
|
19
|
+
return result();
|
|
20
|
+
},
|
|
21
|
+
async requestMany(_recipe, _calls) {
|
|
22
|
+
return {};
|
|
23
|
+
},
|
|
24
|
+
async submit(_recipe) {
|
|
25
|
+
return result();
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const supply = {
|
|
29
|
+
resolvePluginSource: () => ({ ok: false, problem: 'not-declared' }),
|
|
30
|
+
libInstallCommand: () => '',
|
|
31
|
+
libUninstallCommand: () => '',
|
|
32
|
+
pluginInstallPlan: () => ({ ok: false, problem: 'not-declared' }),
|
|
33
|
+
latestVersion: async () => undefined,
|
|
34
|
+
missingReleaseParts: async () => [],
|
|
35
|
+
probeRelease: async () => undefined,
|
|
36
|
+
splitNpmSpec: () => undefined,
|
|
37
|
+
};
|
|
38
|
+
const modules = {
|
|
39
|
+
isolatedRoot: () => '/tmp/dsh-workbench-fake',
|
|
40
|
+
isolatedHome: () => '/tmp/dsh-workbench-fake/home',
|
|
41
|
+
pluginPackagePrefix: () => 'fake-plugin-',
|
|
42
|
+
pluginManifestFile: () => 'fake-plugin.json',
|
|
43
|
+
cliCatalogPath: () => '/tmp/dsh-workbench-fake/catalog.json',
|
|
44
|
+
vendorPluginsDir: () => '/tmp/dsh-workbench-fake/plugins',
|
|
45
|
+
runtimeInstallCommand: () => 'npm i -g fake-runtime',
|
|
46
|
+
afterLibInstall: () => undefined,
|
|
47
|
+
profileDirOf: (ctx) => profileDirOf(ctx),
|
|
48
|
+
profileModules,
|
|
49
|
+
readInstalledModule,
|
|
50
|
+
readProfilePackage,
|
|
51
|
+
readBundleManager,
|
|
52
|
+
createRegistryNotebook: () => ({}),
|
|
53
|
+
declarationGaps,
|
|
54
|
+
moduleDeclarationOf,
|
|
55
|
+
registryDeclarationOf: async () => undefined,
|
|
56
|
+
pathDeclarationOf,
|
|
57
|
+
declarationRefusalOf,
|
|
58
|
+
refusalReason,
|
|
59
|
+
packageRouteOf: async () => undefined,
|
|
60
|
+
isNewerVersion,
|
|
61
|
+
startSelfUpdate: () => ({}),
|
|
62
|
+
};
|
|
63
|
+
const profile = {
|
|
64
|
+
dirOf: () => null,
|
|
65
|
+
dshPlugins: () => () => ({ ok: true, plugins: [] }),
|
|
66
|
+
selfUpdateView: () => undefined,
|
|
67
|
+
};
|
|
68
|
+
const probe = {
|
|
69
|
+
probeUnits: async () => [],
|
|
70
|
+
registerPreflight: () => undefined,
|
|
71
|
+
declaredPluginCommands: () => new Map(),
|
|
72
|
+
};
|
|
73
|
+
const runtimePreset = (capabilities) => ({
|
|
74
|
+
packageRoot: () => '/tmp/dsh-workbench-fake',
|
|
75
|
+
capabilities: () => capabilities,
|
|
76
|
+
profile: () => ({
|
|
77
|
+
label: 'fake',
|
|
78
|
+
terms: {
|
|
79
|
+
plugin: { zh: '插件', en: 'plugin' },
|
|
80
|
+
pluginOf: { zh: '的插件', en: 'a plugin of' },
|
|
81
|
+
pluginThing: { zh: '插件', en: 'a plugin' },
|
|
82
|
+
pluginArea: { zh: '插件区', en: 'the plugin area' },
|
|
83
|
+
},
|
|
84
|
+
installHint: { zh: '无', en: 'nothing to install' },
|
|
85
|
+
diagnose: {},
|
|
86
|
+
}),
|
|
87
|
+
commandSurface: () => ({
|
|
88
|
+
name: 'fake',
|
|
89
|
+
pluginPrefix: 'fake-plugin-',
|
|
90
|
+
invoke: (site, command) => (command === undefined ? `fake ${site}` : `fake ${site} ${command}`),
|
|
91
|
+
help: (site) => `fake ${site} --help`,
|
|
92
|
+
browser: (verb) => `fake browser ${verb.join(' ')}`,
|
|
93
|
+
}),
|
|
94
|
+
commands: () => ({}),
|
|
95
|
+
runners: () => ({}),
|
|
96
|
+
health: () => ({}),
|
|
97
|
+
seed: () => undefined,
|
|
98
|
+
warnUnwritableRoot: () => undefined,
|
|
99
|
+
});
|
|
100
|
+
const plugins = {
|
|
101
|
+
declarationLookup: () => () => undefined,
|
|
102
|
+
createUnits: () => ({
|
|
103
|
+
refresh: async () => ({ units: [] }),
|
|
104
|
+
touch: () => undefined,
|
|
105
|
+
report: () => ({ units: [] }),
|
|
106
|
+
dispose: () => undefined,
|
|
107
|
+
}),
|
|
108
|
+
};
|
|
109
|
+
const actions = {
|
|
110
|
+
configSyncHandler: () => (async () => ({ ok: true })),
|
|
111
|
+
profileCreateHandler: () => (async () => ({ ok: true })),
|
|
112
|
+
configSyncAction: () => ({}),
|
|
113
|
+
profileCreateAction: () => ({}),
|
|
114
|
+
};
|
|
115
|
+
export function fakeAdapterSet(overrides = {}) {
|
|
116
|
+
const release = createReleaseProbe();
|
|
117
|
+
const registry = createRegistryLookup();
|
|
118
|
+
const router = createPackageRouter({ manifestFile: 'fake-plugin.json', dshLookup: registry.registryDshOf });
|
|
119
|
+
const withRelease = {
|
|
120
|
+
...supply,
|
|
121
|
+
latestVersion: release.latestVersion,
|
|
122
|
+
missingReleaseParts: release.missingReleaseParts,
|
|
123
|
+
probeRelease: release.probeRelease,
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
apiVersion: ADAPTER_SET_API_VERSION,
|
|
127
|
+
id: 'fake-adapter-set',
|
|
128
|
+
version: '0.0.0',
|
|
129
|
+
data,
|
|
130
|
+
supply: {
|
|
131
|
+
...withRelease,
|
|
132
|
+
...modules,
|
|
133
|
+
env: withRelease,
|
|
134
|
+
modules,
|
|
135
|
+
registryDeclarationOf: registry.registryDeclarationOf,
|
|
136
|
+
packageRouteOf: router.packageRouteOf,
|
|
137
|
+
},
|
|
138
|
+
modules,
|
|
139
|
+
profile,
|
|
140
|
+
probe,
|
|
141
|
+
runtime: runtimePreset({
|
|
142
|
+
console: false,
|
|
143
|
+
pluginMarket: false,
|
|
144
|
+
browserBridge: false,
|
|
145
|
+
}),
|
|
146
|
+
plugins,
|
|
147
|
+
actions,
|
|
148
|
+
...overrides,
|
|
149
|
+
};
|
|
150
|
+
}
|
package/dist/testing/needs.js
CHANGED
package/dist/testing.d.ts
CHANGED
package/dist/testing.js
CHANGED
package/package.json
CHANGED
|
@@ -313,3 +313,28 @@ describe('blockerOfCapability', () => {
|
|
|
313
313
|
expect(blocker?.actions.map((action) => action.kind)).toEqual(['retry']);
|
|
314
314
|
});
|
|
315
315
|
});
|
|
316
|
+
|
|
317
|
+
describe('执行类失败的话术由适配器给', () => {
|
|
318
|
+
it('适配器给了 diagnose.exec 就用它,不再说默认那句', () => {
|
|
319
|
+
const blocker = blockerOfError(
|
|
320
|
+
{ code: 'cli-exec-failed', message: '跑不起来' },
|
|
321
|
+
t,
|
|
322
|
+
{ diagnose: { exec: '确认 MCP server 起得来:npx -y chrome-devtools-mcp@latest' } },
|
|
323
|
+
);
|
|
324
|
+
expect(blocker.hint).toBe('确认 MCP server 起得来:npx -y chrome-devtools-mcp@latest');
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it('适配器没给就回词表那句(opencli 那份)', () => {
|
|
328
|
+
const blocker = blockerOfError({ code: 'cli-exec-failed', message: '跑不起来' }, t);
|
|
329
|
+
expect(blocker.hint).toBe('blocker.exec.hint');
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
it('错误自己带的 hint 优先级最高', () => {
|
|
333
|
+
const blocker = blockerOfError(
|
|
334
|
+
{ code: 'cli-exec-failed', message: '跑不起来', hint: '端口被占了' },
|
|
335
|
+
t,
|
|
336
|
+
{ diagnose: { exec: '确认 MCP server 起得来' } },
|
|
337
|
+
);
|
|
338
|
+
expect(blocker.hint).toBe('端口被占了');
|
|
339
|
+
});
|
|
340
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { API_PREFIX } from '
|
|
3
|
-
import { apiGet } from '
|
|
2
|
+
import { API_PREFIX } from '../../config/constants.js';
|
|
3
|
+
import { apiGet } from '../workbench-client.js';
|
|
4
4
|
|
|
5
5
|
interface FetchRecord {
|
|
6
6
|
url: string;
|
package/src/api/blocker-table.ts
CHANGED
|
@@ -22,7 +22,11 @@ function copyAction(t: Translate, text: string): BlockerAction {
|
|
|
22
22
|
export function blockerOfError(
|
|
23
23
|
error: ApiError | undefined,
|
|
24
24
|
t: Translate,
|
|
25
|
-
context: {
|
|
25
|
+
context: {
|
|
26
|
+
path?: string | null;
|
|
27
|
+
platform?: string;
|
|
28
|
+
diagnose?: Readonly<Partial<Record<'exec' | 'login' | 'bridge', string>>>;
|
|
29
|
+
} = {},
|
|
26
30
|
): ModuleBlocker {
|
|
27
31
|
if (error === undefined) {
|
|
28
32
|
return {
|
|
@@ -93,7 +97,7 @@ export function blockerOfError(
|
|
|
93
97
|
id: 'cli-exec-failed',
|
|
94
98
|
severity: 'block',
|
|
95
99
|
title: error.message,
|
|
96
|
-
hint: error.hint ?? t('blocker.exec.hint'),
|
|
100
|
+
hint: error.hint ?? context.diagnose?.exec ?? t('blocker.exec.hint'),
|
|
97
101
|
...(error.detail === undefined ? {} : { detail: error.detail }),
|
|
98
102
|
actions: [retryAction(t)],
|
|
99
103
|
};
|