@aiot-nexus/plugin-sdk 2.0.0 → 2.0.1

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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @aiot-nexus/plugin-sdk
2
2
 
3
+ > 版本适用性:当前包版本为 `2.0.1`,只面向 Framework API `2.0.0` 的 v2 worker/RPC 模型。1.x SDK 和同步 Host API 已停止适用,但其历史语义保留在本文末尾和 [v1 到 v2 迁移说明](../docs/plugin-framework-v1-v2-migration.md);2.x 不提供 1.x 运行模型兼容层。
4
+
3
5
  AIoT Nexus 独立插件开发包,包含公开 TypeScript 契约、PluginFrame 浏览器客户端和 `nexus-plugin` 命令行工具。
4
6
 
5
7
  ## 环境
@@ -35,7 +37,7 @@ SDK 提供两层非阻塞版本检查:
35
37
  - `nexus-plugin` 启动时先读取缓存。缓存新鲜期为 24 小时;缓存缺失或过期时在后台检查,不等待网络,不改变命令退出码。检测到普通更新时会显示:
36
38
 
37
39
  ```text
38
- npm notice Update available for @aiot-nexus/plugin-sdk: 2.0.0 -> 2.1.0
40
+ npm notice Update available for @aiot-nexus/plugin-sdk: 2.0.1 -> 2.1.0
39
41
  npm notice Run npm install --save-dev @aiot-nexus/plugin-sdk@latest
40
42
  ```
41
43
 
@@ -64,7 +66,7 @@ nexus-plugin create my-frame-plugin \
64
66
  - 目标目录非空时命令以返回码 `2` 拒绝覆盖。生成或安装失败返回 `1`。
65
67
  - 两套模板均读取宿主 `PluginRendererContext.language` 和 `themeMode`,通过 `onContextChanged` 在同一 iframe 内响应运行时语言与主题切换,并内置 `zh-CN` / `en-US` renderer 文案;manifest 使用相同文化资源本地化宿主入口。模板页面自身不提供语言或主题选择控件。
66
68
 
67
- 默认来源从 npm registry 安装。离线开发时先执行 `npm run pack:sdk`,再通过 `--sdk-source /path/to/aiot-nexus-plugin-sdk-2.0.0.tgz` 指定本地包;CLI 会把本地包一并放入生成工程。
69
+ 默认来源从 npm registry 安装。离线开发时先执行 `npm run pack:sdk`,再通过 `--sdk-source /path/to/aiot-nexus-plugin-sdk-2.0.1.tgz` 指定本地包;CLI 会把本地包一并放入生成工程。
68
70
 
69
71
  ## 独立调试
70
72
 
@@ -117,6 +119,21 @@ npm run dev:nexus -- --host D:\prj\tmp\aiot-nexus\dist\electron\nexus-win32-x64\
117
119
  | --- | --- |
118
120
  | `src/renderer/**` | 只运行 `build:web` 并替换 renderer;宿主 PID 不变,iframe 重新完成 `ready/init`。 |
119
121
  | `src/manifest.json` 的展示、贡献点等安全字段 | 构建 renderer、原子替换 manifest 后重扫插件目录;宿主 PID 不变。 |
120
- | `src/main.ts`、依赖、原生模块或主进程相关 manifest 字段 | 完整构建成功后先停止插件 worker,原子替换完整插件包,再在同一 Nexus 进程中启动新 worker;宿主 PID 不变。 |
122
+ | `src/main.ts`、依赖、原生模块或 worker 相关 manifest 字段 | 完整构建成功后先停止插件 worker,原子替换完整插件包,再在同一 Nexus 进程中启动新 worker;宿主 PID 不变。 |
121
123
 
122
124
  更新构建或 worker 重载失败时保留上一个可运行部署,并回滚插件包后重新激活旧 worker。`mainEntry` 不通过清理 `require.cache` 热替换;每次包更新都执行 `deactivate`、替换包和新的 worker 激活,但不重启整个 Nexus。默认打开 Renderer DevTools;可传 `--no-devtools`。`--inspect[=<port>]` 和 `--inspect-brk[=<port>]` 调试的是插件 worker,贡献点选择支持 `--surface` 与 `--contribution-id`。按 `Ctrl+C` 停止 CLI 时,CLI 会先请求插件 worker 关闭,再关闭其启动的正式宿主。
125
+
126
+ ## v1 SDK 历史说明(不适用于当前包)
127
+
128
+ SDK 1.x 对应 Framework API `1.0.0`:`mainEntry` 在 Electron 主进程中加载,Host API 直接返回同步 `NexusResult<T>`,完整插件包变化需要重启 Nexus。旧离线包名使用 `aiot-nexus-plugin-sdk-1.1.1.tgz`,旧调试目标是 `Attach Nexus plugin main (9229)`。
129
+
130
+ | v1 项目 | 历史行为 | v2 替代 |
131
+ | --- | --- | --- |
132
+ | `npm run dev` | Electron 调试宿主在主进程加载 `mainEntry` | 调试宿主创建独立插件 worker |
133
+ | `npm run dev:debug` | `--inspect-brk=9229` 暂停 Electron 主进程 | inspect 端口连接插件 worker,宿主 UI 可独立启动 |
134
+ | `npm run dev:nexus` 完整包变化 | 退出旧 Nexus、替换包、启动新 Nexus,PID 改变 | 停止目标 worker、替换包、启动新 worker,Nexus PID 不变 |
135
+ | Host API 调用 | 直接获得 `NexusResult<T>` | `await` `Promise<NexusResult<T>>` |
136
+ | Renderer-only 调试 | 不执行 `mainEntry`,`invokeMain` 返回 unsupported | 该限制在 v2 继续成立 |
137
+ | 更新失败 | 恢复旧包并重新启动宿主 | 恢复旧包和旧 worker,不重启 Nexus |
138
+
139
+ 这些约定只用于阅读旧插件和历史报告。迁移到当前 SDK 时必须把 manifest 升到 2.x、异步等待 Host API、实现资源关闭,并改用插件 worker 调试和生命周期;不能只修改 npm 包版本而保留同步调用。
@@ -115,6 +115,8 @@
115
115
  }
116
116
 
117
117
  .frame-shell {
118
+ display: flex;
119
+ flex-direction: column;
118
120
  flex: 1 1 auto;
119
121
  min-width: 0;
120
122
  padding: 12px;
@@ -123,6 +125,7 @@
123
125
 
124
126
  iframe {
125
127
  display: block;
128
+ flex: 1 1 auto;
126
129
  width: 100%;
127
130
  min-height: 360px;
128
131
  border: 1px solid var(--border);
@@ -1,5 +1,5 @@
1
1
  import pluginManifestSchema from "../.generated/plugin-manifest.schema.json";
2
- export declare const PLUGIN_SDK_VERSION = "2.0.0";
2
+ export declare const PLUGIN_SDK_VERSION = "2.0.1";
3
3
  export { pluginManifestSchema };
4
4
  export * from "../.generated/plugin-framework-version";
5
5
  export * from "./types";
package/dist/src/index.js CHANGED
@@ -20,7 +20,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
20
20
  exports.pluginManifestSchema = exports.PLUGIN_SDK_VERSION = void 0;
21
21
  const plugin_manifest_schema_json_1 = __importDefault(require("../.generated/plugin-manifest.schema.json"));
22
22
  exports.pluginManifestSchema = plugin_manifest_schema_json_1.default;
23
- exports.PLUGIN_SDK_VERSION = "2.0.0";
23
+ exports.PLUGIN_SDK_VERSION = "2.0.1";
24
24
  __exportStar(require("../.generated/plugin-framework-version"), exports);
25
25
  __exportStar(require("./types"), exports);
26
26
  __exportStar(require("./browser/frame-client"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiot-nexus/plugin-sdk",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Types, PluginFrame client, and CLI for AIoT Nexus independent plugins.",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {
@@ -36,7 +36,7 @@
36
36
  <p id="formError" class="error" hidden></p>
37
37
  </section>
38
38
 
39
- <section class="panel">
39
+ <section class="panel recent-rows-panel">
40
40
  <div class="panel-heading">
41
41
  <h2 data-i18n="section.recentRows">Recent Rows</h2>
42
42
  <span id="statusLog" data-i18n="status.idle">Idle</span>
@@ -15,13 +15,15 @@
15
15
 
16
16
  body {
17
17
  margin: 0;
18
- min-height: 0;
18
+ min-height: 100vh;
19
19
  background: #f3f5f7;
20
20
  }
21
21
 
22
22
  .plugin-shell {
23
23
  display: grid;
24
+ grid-template-rows: auto auto auto minmax(0, 1fr);
24
25
  gap: 12px;
26
+ min-height: 100vh;
25
27
  padding: 16px;
26
28
  }
27
29
 
@@ -100,6 +102,17 @@ h2 {
100
102
  padding: 14px 16px;
101
103
  }
102
104
 
105
+ .recent-rows-panel {
106
+ display: flex;
107
+ flex-direction: column;
108
+ min-height: 0;
109
+ }
110
+
111
+ .recent-rows-panel .table-wrap {
112
+ flex: 1 1 auto;
113
+ min-height: 0;
114
+ }
115
+
103
116
  .entry-form {
104
117
  display: grid;
105
118
  grid-template-columns: minmax(150px, 1fr) minmax(220px, 2fr) auto;