@sh1robana/dsh-plugin-message-edit 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,12 @@
1
1
  # 开发与发布
2
2
 
3
- 项目仓库:[sh1robana/dsh-plugin-message-edit](https://github.com/sh1robana/dsh-plugin-message-edit)。首个正式版本为 `0.3.0`。本页说明流程;上线状态以 npm 页面、GitHub Release 和市场实际条目为准。
3
+ 项目仓库:[sh1robana/dsh-plugin-message-edit](https://github.com/sh1robana/dsh-plugin-message-edit)。本页以 `0.3.2` 为发行示例,首个正式版本为 `0.3.0`。上线状态以各渠道的实际条目为准。
4
+
5
+ 本次发行版本为 `0.3.2`,包含 DSH `0.2.1-rc.2` 适配及日志结构修复,已获准发布到 GitHub 和 npm;两渠道结果分别在 `log/README.md` 记录。既有 `0.3.1` 发行包不覆盖,社区目录更新另按授权执行。
4
6
 
5
7
  ## 构建安装包
6
8
 
7
- 需要 Node.js 24 或以上。安装开发依赖后执行:
9
+ 需要 Node.js 24 或以上。先创建 `artifacts` 目录,安装开发依赖后执行:
8
10
 
9
11
  ```sh
10
12
  npm ci
@@ -13,21 +15,33 @@ npm test
13
15
  npm pack --ignore-scripts --pack-destination artifacts
14
16
  ```
15
17
 
16
- 先创建 `artifacts` 目录。安装包包含已构建的宿主与客户端、README、许可、构建指纹及演示截图,不包含本机配置、会话或备份。GitHub Release 的安装包名称固定为 `dsh-plugin-message-edit-0.3.0.tgz`。
18
+ `npm pack` 实际生成 `artifacts/sh1robana-dsh-plugin-message-edit-0.3.2.tgz`。为统一 GitHub Release 附件名称,在 PowerShell 中复制为发行文件名:
19
+
20
+ ```powershell
21
+ Copy-Item -LiteralPath ./artifacts/sh1robana-dsh-plugin-message-edit-0.3.2.tgz -Destination ./artifacts/dsh-plugin-message-edit-0.3.2.tgz
22
+ ```
23
+
24
+ GitHub Release 上传使用复制后的 `artifacts/dsh-plugin-message-edit-0.3.2.tgz`,两份文件内容相同。安装包包含已构建的宿主与客户端、README、许可、构建指纹及演示截图,不包含本机配置、会话或备份。更新版本时,以上两个文件名中的版本号一并调整;已发布安装包不覆盖。
17
25
 
18
- 官方宿主包的开发依赖和 peerDependencies 已固定,兼容范围为实际验证的 `0.2.0-rc.2`。改名、改版本或改源码后都需要重新构建、测试和打包。
26
+ 当前工作区的官方宿主开发依赖对齐 DSH `0.2.1-rc.2`、Cordis `4.0.5`,运行时依赖保留在 `peerDependencies`。顶层 `engines.dsh` 与相关 peer 使用 `0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2`;实际完成桌面验证的仍为前两个版本,`0.2.1-rc.2` 待桌面验收。改名、改版本或改源码后都需要重新构建、测试和打包。
27
+
28
+ `npm test` 默认执行 109 项检查。将 `DSH_TARGET_ATTACHMENT_CLIENT` 设置为目标宿主 `dsh-client-ui-attachment/lib/client.js` 的绝对路径,额外检查原生拖放;将 `DSH_TARGET_MODULES_CLIENT` 设置为目标 `dsh-client-modules/lib/client.js` 的绝对路径,额外检查真实模块加载器与本次客户端产物。两个输入均启用时共 111 项,只读取目标实现,不安装或重启宿主。真实 AgentLoop 回归还使用官方完整 V4 恢复校验器,覆盖首回合助手编辑后继续对话的日志结构;该校验器仅为开发依赖,不添加为运行时 peer。桌面行为由维护者在独立测试会话验收,分别记录在 `log/`。
29
+
30
+ 本机已将两个目标检查输入单独保存在 `.inspection/host-inputs/0.2.1-rc.2/`,使用方式见该目录的 `README.md`,无需保留整套宿主解包副本。这些是本地可选输入,不属于源码或发行包;干净克隆按上面的目标文件路径提供,适配新版时重新从对应目标取证。
19
31
 
20
32
  ## GitHub
21
33
 
22
- 1. 使用维护者账号创建公开仓库,添加 `dsh-plugin` topic。
34
+ 1. 核对 Git 远程地址和目标分支,确认推送到本项目仓库;本工作区的 `origin` 是 Moeblack 上游,不能直接作为发布目标。
23
35
  2. 核对 `package.json` 的 `repository`、`homepage`、`bugs` 和贡献者指向实际项目与 GitHub 公开名称。
24
36
  3. 推送源码,保留上游来源与许可。不要推送 `.inspection`、`.local-backups`、`.dsh`、`node_modules` 或个人会话截图。
25
- 4. 创建 `v0.3.0` Release,附上测试通过的 `.tgz`,核对下载内容。安装时将 Release 附件的完整链接交给 `dsh plugin add`。
37
+ 4. 创建 `v0.3.2` Release,附上测试通过的 `dsh-plugin-message-edit-0.3.2.tgz`,核对下载内容。安装时将 Release 附件的完整链接交给 `dsh plugin add`。
26
38
 
27
39
  GitHub CLI 可以通过 `gh auth login --hostname github.com --git-protocol https --web` 登录。账号认证由维护者本人完成。
28
40
 
29
41
  ## npm
30
42
 
43
+ 仅在获得 npm 发布授权后执行本节;GitHub Release 发布不会自动更新 npm。
44
+
31
45
  `dsh-plugin-message-edit` 的无作用域包名已被其他维护者占用。npm 包使用维护者的作用域 `@sh1robana/dsh-plugin-message-edit`;GitHub 仓库名称不受影响。
32
46
 
33
47
  使用实际维护者的 npm 账号完成官方网页登录:
@@ -37,9 +51,9 @@ npm login --auth-type=web --registry https://registry.npmjs.org/
37
51
  npm whoami
38
52
  ```
39
53
 
40
- 包名已经同步到 manifest、锁文件、补丁、构建配置和 README。重新构建、测试、打包后,使用检查过的安装包执行 `npm publish ./artifacts/dsh-plugin-message-edit-0.3.0.tgz --access public --tag latest`。
54
+ 包名已经同步到 manifest、锁文件、补丁、构建配置和 README。重新构建、测试、打包后,使用检查过的安装包执行 `npm publish ./artifacts/dsh-plugin-message-edit-0.3.2.tgz --access public --tag latest`。
41
55
 
42
- 网页登录或发布的双重验证由账号持有人完成,不需要向协作者提供密码或长期令牌。发布后核对 `npm view @sh1robana/dsh-plugin-message-edit@0.3.0 version dist.integrity repository`,再用干净的测试 profile 验证从 registry 拉取。
56
+ 网页登录或发布的双重验证由账号持有人完成,不需要向协作者提供密码或长期令牌。发布后核对 `npm view @sh1robana/dsh-plugin-message-edit@0.3.2 version dist.integrity repository`,再用干净的测试 profile 验证从 registry 拉取。
43
57
 
44
58
  参考:[npm 作用域公共包发布说明](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/)、[发布双重验证](https://docs.npmjs.com/requiring-2fa-for-package-publishing-and-settings-modification/)。
45
59
 
package/index.mjs CHANGED
@@ -1,4 +1,6 @@
1
+ import { isAbsolute } from "node:path";
1
2
  import { foldSurface } from "@deepseek-ai/dsh-session";
3
+ import { createSystemMessage } from "@deepseek-ai/dsh-llm";
2
4
  //#region src/saved-user-messages.ts
3
5
  function savedUserMessageSeq(event) {
4
6
  if (event.type !== "user/message" || typeof event.surfaceOp !== "object" || event.surfaceOp.op !== "replace") return void 0;
@@ -32,9 +34,9 @@ function visibleUserEvents(events) {
32
34
  //#region src/build-info.ts
33
35
  /** 由构建脚本生成;前后端共享同一份构建身份。 */
34
36
  const MESSAGE_EDIT_BUILD_INFO = Object.freeze({
35
- "version": "0.3.0",
36
- "buildId": "952c32134401a88f10f7",
37
- "targetDshVersion": "0.2.0-rc.2"
37
+ "version": "0.3.2",
38
+ "buildId": "dd2956d22ba2bccbd0c2",
39
+ "targetDshVersion": "0.2.1-rc.2"
38
40
  });
39
41
  //#endregion
40
42
  //#region src/shared.ts
@@ -46,6 +48,7 @@ const MESSAGE_EDIT_VIEW_ORDER = 15;
46
48
  const MESSAGE_EDIT_VERSION_SCHEMA = 2;
47
49
  //#endregion
48
50
  //#region src/index.ts
51
+ /** Host half of Message Edit: turn-atomic forks and structurally reversible versions. */
49
52
  /** Stable Cordis plugin name. */
50
53
  const name = "message-edit";
51
54
  /** Public services used by the branch transaction and timeline projection. */
@@ -428,14 +431,19 @@ function appendSurfaceSeedEvent(events, type, data, intent) {
428
431
  ...intent.sourceEventSeqs === void 0 ? {} : { sourceEventSeqs: intent.sourceEventSeqs }
429
432
  });
430
433
  }
431
- function appendManualTurn(events, manual) {
434
+ function appendManualTurn(events, manual, reserveSystemHead) {
432
435
  const { turn, user, assistant } = manual;
433
436
  appendLogSeedEvent(events, "turn/start", { turn });
434
- appendSurfaceSeedEvent(events, "user/message", user, { surfaceOp: "append" });
435
437
  appendLogSeedEvent(events, "step/start", {
436
438
  turn,
437
439
  step: 1
438
440
  });
441
+ if (reserveSystemHead) appendSurfaceSeedEvent(events, "system/message", {
442
+ turn,
443
+ step: 1,
444
+ message: createSystemMessage("")
445
+ }, { surfaceOp: "append" });
446
+ appendSurfaceSeedEvent(events, "user/message", user, { surfaceOp: "append" });
439
447
  appendSurfaceSeedEvent(events, "assistant/message", {
440
448
  turn,
441
449
  step: 1,
@@ -491,7 +499,7 @@ function versionSeed(source, plan, projections) {
491
499
  });
492
500
  }
493
501
  appendLogSeedEvent(events, "message-edit/version", plan.version);
494
- if (plan.manualTurn !== void 0) appendManualTurn(events, plan.manualTurn);
502
+ if (plan.manualTurn !== void 0) appendManualTurn(events, plan.manualTurn, foldSurface(events, projections).nodes.length === 0);
495
503
  return {
496
504
  events,
497
505
  inheritedLength
@@ -686,11 +694,17 @@ async function openReference(ctx, sessionId, path, signal) {
686
694
  const snapshot = await ctx.sessionQuery.readSession(sessionId);
687
695
  const fs = ctx.get("fs");
688
696
  if (fs === void 0) throw new Error("当前 DSH 未提供文件系统服务。");
697
+ const controller = sessionController(ctx);
698
+ let cwd = snapshot.session.cwd;
699
+ if (!isAbsolute(path)) {
700
+ const directory = (await controller.projections({ sessionId }, signal))?.values["workingDirectory"];
701
+ if (typeof directory === "string") cwd = directory;
702
+ }
689
703
  const target = await fs.resolve(path, {
690
- ...snapshot.session.cwd === void 0 ? {} : { cwd: snapshot.session.cwd },
704
+ ...cwd === void 0 ? {} : { cwd },
691
705
  signal
692
706
  });
693
- await sessionController(ctx).openWorkspacePath({ path: fs.processPath(target) }, signal);
707
+ await controller.openWorkspacePath({ path: fs.processPath(target) }, signal);
694
708
  }
695
709
  async function recoverOperation(inverses) {
696
710
  const failures = [];
@@ -904,16 +918,19 @@ async function mapConcurrent(items, worker) {
904
918
  return results;
905
919
  }
906
920
  async function timeline(ctx, sessionId) {
921
+ const currentLog = await ctx.sessionQuery.readSession(sessionId);
907
922
  const targetTrace = await ctx.sessionQuery.traceSession(sessionId);
908
923
  const rootId = targetTrace.complete ? targetTrace.root.header.id : targetTrace.ancestors.at(-1)?.header.id ?? sessionId;
909
924
  const rootTrace = rootId === sessionId ? targetTrace : await ctx.sessionQuery.traceSession(rootId);
910
925
  const lineage = flattenLineage(rootTrace.target, rootTrace.descendants);
911
- const logs = await mapConcurrent(lineage, async ({ record }) => {
912
- if (record.header.id !== sessionId && record.header.parentSession === void 0) return {
913
- events: [],
914
- inheritedEventCount: 0
915
- };
916
- return ctx.sessionQuery.readSession(record.header.id);
926
+ const inspections = await mapConcurrent(lineage, async ({ record }) => {
927
+ if (record.header.id === sessionId) return { version: ownVersionEvent(record.header, currentLog.events, currentLog.inheritedEventCount) };
928
+ try {
929
+ const log = await ctx.sessionQuery.readSession(record.header.id);
930
+ return { version: ownVersionEvent(record.header, log.events, log.inheritedEventCount) };
931
+ } catch (error) {
932
+ return { unavailableReason: error instanceof Error ? error.message : String(error) };
933
+ }
917
934
  });
918
935
  const recordsById = new Map(lineage.map(({ record }) => [record.header.id, record]));
919
936
  const currentPath = /* @__PURE__ */ new Set();
@@ -923,8 +940,8 @@ async function timeline(ctx, sessionId) {
923
940
  pathId = recordsById.get(pathId)?.header.parentSession;
924
941
  }
925
942
  const versions = lineage.map(({ record, depth }, index) => {
926
- const log = logs[index];
927
- const version = ownVersionEvent(record.header, log?.events ?? [], log?.inheritedEventCount ?? 0);
943
+ const inspection = inspections[index];
944
+ const version = inspection?.version;
928
945
  return {
929
946
  sessionId: record.header.id,
930
947
  ...record.header.parentSession === void 0 ? {} : { parentSessionId: record.header.parentSession },
@@ -936,6 +953,7 @@ async function timeline(ctx, sessionId) {
936
953
  depth,
937
954
  current: record.header.id === sessionId,
938
955
  onCurrentEffectPath: currentPath.has(record.header.id),
956
+ ...inspection?.unavailableReason === void 0 ? {} : { unavailableReason: inspection.unavailableReason },
939
957
  ...version === void 0 ? {} : {
940
958
  operation: version.effect.operation,
941
959
  cascade: version.effect.cascade,
@@ -959,13 +977,12 @@ async function timeline(ctx, sessionId) {
959
977
  const inverseId = undoCursor.inverseSessionId;
960
978
  if (undoStack.includes(inverseId)) throw new Error("版本效果逆链包含循环。");
961
979
  if (!versionsById.has(inverseId)) throw new Error(`恢复目标 ${inverseId} 不在可见版本树中。`);
980
+ if (versionsById.get(inverseId)?.unavailableReason !== void 0) break;
962
981
  undoStack.push(inverseId);
963
982
  undoCursor = versionsById.get(inverseId);
964
983
  }
965
- const redoSessionIds = versions.filter((version) => version.inverseSessionId === sessionId).map((version) => version.sessionId);
966
- const currentIndex = versions.findIndex((version) => version.current);
967
- const currentLog = logs[currentIndex];
968
- if (currentIndex < 0 || currentLog === void 0) throw new Error("当前版本不在版本树中。");
984
+ const redoSessionIds = versions.filter((version) => version.inverseSessionId === sessionId && version.unavailableReason === void 0).map((version) => version.sessionId);
985
+ if (versions.findIndex((version) => version.current) < 0) throw new Error("当前版本不在版本树中。");
969
986
  const turns = closedTurns(visibleUserEvents(currentLog.events));
970
987
  return {
971
988
  sessionId,
package/package.json CHANGED
@@ -1,141 +1,141 @@
1
- {
2
- "name": "@sh1robana/dsh-plugin-message-edit",
3
- "description": "DeepSeek Harness 桌面端消息编辑:原地保存、附件编辑、分支重生成与版本时间线",
4
- "version": "0.3.0",
5
- "type": "module",
6
- "main": "./index.mjs",
7
- "exports": {
8
- ".": "./index.mjs",
9
- "./client": "./client.js",
10
- "./cordis.patch.yml": "./cordis.patch.yml",
11
- "./package.json": "./package.json"
12
- },
13
- "files": [
14
- "index.mjs",
15
- "client.js",
16
- "client.js.map",
17
- "cordis.patch.yml",
18
- "README.md",
19
- "NOTICE.md",
20
- "build-info.json",
21
- "LICENSE",
22
- "docs/screenshots/editor-light.jpg",
23
- "docs/screenshots/editor-dark.jpg",
24
- "CHANGELOG.md",
25
- "docs/发布指南.md"
26
- ],
27
- "dsh": {
28
- "bundle": {
29
- "patch": "./cordis.patch.yml"
30
- },
31
- "client": {
32
- "platform": "web",
33
- "inject": [
34
- "@deepseek-ai/dsh-client-connection",
35
- "@deepseek-ai/dsh-api-session-controller",
36
- "@deepseek-ai/dsh-client-ui-conversation",
37
- "@deepseek-ai/dsh-client-ui-workspace"
38
- ]
39
- },
40
- "engines": {
41
- "dsh": "0.2.0-rc.2"
42
- }
43
- },
44
- "scripts": {
45
- "build": "node ./scripts/build.mjs",
46
- "test": "node --test tests/*.test.mjs",
47
- "prepublishOnly": "npm run build",
48
- "check:installed": "powershell -NoProfile -File ./scripts/check-desktop-install.ps1"
49
- },
50
- "keywords": [
51
- "deepseek-harness",
52
- "dsh",
53
- "dsh-plugin",
54
- "message-edit",
55
- "attachment",
56
- "timeline"
57
- ],
58
- "license": "MIT",
59
- "devDependencies": {
60
- "@deepseek-ai/cordis": "~4.0.4",
61
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
62
- "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
63
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
64
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
65
- "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
66
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
67
- "@deepseek-ai/dsh-client-file-upload": "0.2.0-rc.2",
68
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
69
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
70
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
71
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
72
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
73
- "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
74
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
75
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
76
- "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
77
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
78
- "@deepseek-ai/dsh-session-query": "0.2.0-rc.2",
79
- "@deepseek-ai/dsh-workspace": "0.2.0-rc.2",
80
- "@types/react": "^18.3.0",
81
- "@types/react-dom": "^18.3.0",
82
- "immer": "^10.2.0",
83
- "lightningcss": "^1.32.0",
84
- "react": "^18.2.0",
85
- "react-dom": "^18.3.1",
86
- "tsdown": "^0.22.2",
87
- "typescript": "^6.0.3",
88
- "zustand": "~4.4.7"
89
- },
90
- "engines": {
91
- "node": ">=24"
92
- },
93
- "peerDependencies": {
94
- "@deepseek-ai/cordis": "~4.0.4",
95
- "@deepseek-ai/dsh-agent": "0.2.0-rc.2",
96
- "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2",
97
- "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2",
98
- "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
99
- "@deepseek-ai/dsh-attachment": "0.2.0-rc.2",
100
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2",
101
- "@deepseek-ai/dsh-client-file-upload": "0.2.0-rc.2",
102
- "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
103
- "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
104
- "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
105
- "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
106
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
107
- "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
108
- "@deepseek-ai/dsh-llm": "0.2.0-rc.2",
109
- "@deepseek-ai/dsh-session": "0.2.0-rc.2",
110
- "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2",
111
- "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2",
112
- "@deepseek-ai/dsh-session-query": "0.2.0-rc.2",
113
- "@deepseek-ai/dsh-workspace": "0.2.0-rc.2"
114
- },
115
- "publishConfig": {
116
- "access": "public",
117
- "registry": "https://registry.npmjs.org/"
118
- },
119
- "contributors": [
120
- {
121
- "name": "shirobana",
122
- "url": "https://github.com/sh1robana"
123
- },
124
- {
125
- "name": "Codex(OpenAI AI 编程助手)",
126
- "url": "https://openai.com/codex/"
127
- }
128
- ],
129
- "repository": {
130
- "type": "git",
131
- "url": "git+https://github.com/sh1robana/dsh-plugin-message-edit.git"
132
- },
133
- "homepage": "https://github.com/sh1robana/dsh-plugin-message-edit#readme",
134
- "bugs": {
135
- "url": "https://github.com/sh1robana/dsh-plugin-message-edit/issues"
136
- },
137
- "author": {
138
- "name": "shirobana",
139
- "url": "https://github.com/sh1robana"
140
- }
141
- }
1
+ {
2
+ "name": "@sh1robana/dsh-plugin-message-edit",
3
+ "description": "DeepSeek Harness 桌面端消息编辑:原地保存、附件编辑、分支重生成与版本时间线",
4
+ "version": "0.3.2",
5
+ "type": "module",
6
+ "main": "./index.mjs",
7
+ "exports": {
8
+ ".": "./index.mjs",
9
+ "./client": "./client.js",
10
+ "./cordis.patch.yml": "./cordis.patch.yml",
11
+ "./package.json": "./package.json"
12
+ },
13
+ "files": [
14
+ "index.mjs",
15
+ "client.js",
16
+ "client.js.map",
17
+ "cordis.patch.yml",
18
+ "README.md",
19
+ "NOTICE.md",
20
+ "build-info.json",
21
+ "LICENSE",
22
+ "docs/screenshots/editor-light.jpg",
23
+ "docs/screenshots/editor-dark.jpg",
24
+ "CHANGELOG.md",
25
+ "docs/发布指南.md"
26
+ ],
27
+ "dsh": {
28
+ "bundle": {
29
+ "patch": "./cordis.patch.yml"
30
+ },
31
+ "client": {
32
+ "platform": "web",
33
+ "inject": [
34
+ "@deepseek-ai/dsh-client-connection",
35
+ "@deepseek-ai/dsh-api-session-controller",
36
+ "@deepseek-ai/dsh-client-ui-conversation",
37
+ "@deepseek-ai/dsh-client-ui-workspace"
38
+ ]
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build": "node ./scripts/build.mjs",
43
+ "test": "node --test tests/*.test.mjs",
44
+ "prepublishOnly": "npm run build",
45
+ "check:installed": "powershell -NoProfile -File ./scripts/check-desktop-install.ps1"
46
+ },
47
+ "keywords": [
48
+ "deepseek-harness",
49
+ "dsh",
50
+ "dsh-plugin",
51
+ "message-edit",
52
+ "attachment",
53
+ "timeline"
54
+ ],
55
+ "license": "MIT",
56
+ "devDependencies": {
57
+ "@deepseek-ai/cordis": "~4.0.5",
58
+ "@deepseek-ai/dsh-agent": "0.2.1-rc.2",
59
+ "@deepseek-ai/dsh-agent-loop": "0.2.1-rc.2",
60
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.1-rc.2",
61
+ "@deepseek-ai/dsh-api-session-controller": "0.2.1-rc.2",
62
+ "@deepseek-ai/dsh-attachment": "0.2.1-rc.2",
63
+ "@deepseek-ai/dsh-client-connection": "0.2.1-rc.2",
64
+ "@deepseek-ai/dsh-client-file-upload": "0.2.1-rc.2",
65
+ "@deepseek-ai/dsh-client-store": "0.2.1-rc.2",
66
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.1-rc.2",
67
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.1-rc.2",
68
+ "@deepseek-ai/dsh-client-ui-session": "0.2.1-rc.2",
69
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.1-rc.2",
70
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.1-rc.2",
71
+ "@deepseek-ai/dsh-llm": "0.2.1-rc.2",
72
+ "@deepseek-ai/dsh-session": "0.2.1-rc.2",
73
+ "@deepseek-ai/dsh-session-format-v3-to-v4": "0.2.1-rc.2",
74
+ "@deepseek-ai/dsh-session-persistence": "0.2.1-rc.2",
75
+ "@deepseek-ai/dsh-session-projection": "0.2.1-rc.2",
76
+ "@deepseek-ai/dsh-session-query": "0.2.1-rc.2",
77
+ "@deepseek-ai/dsh-workspace": "0.2.1-rc.2",
78
+ "@types/node": "^24.19.2",
79
+ "@types/react": "^18.3.0",
80
+ "@types/react-dom": "^18.3.0",
81
+ "immer": "^10.2.0",
82
+ "lightningcss": "^1.32.0",
83
+ "react": "^18.2.0",
84
+ "react-dom": "^18.3.1",
85
+ "tsdown": "^0.22.2",
86
+ "typescript": "^6.0.3",
87
+ "zustand": "~4.4.7"
88
+ },
89
+ "engines": {
90
+ "node": ">=24",
91
+ "dsh": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2"
92
+ },
93
+ "peerDependencies": {
94
+ "@deepseek-ai/cordis": "~4.0.4",
95
+ "@deepseek-ai/dsh-agent": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
96
+ "@deepseek-ai/dsh-agent-loop": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
97
+ "@deepseek-ai/dsh-agent-preset-registry": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
98
+ "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
99
+ "@deepseek-ai/dsh-attachment": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
100
+ "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
101
+ "@deepseek-ai/dsh-client-file-upload": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
102
+ "@deepseek-ai/dsh-client-store": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
103
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
104
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
105
+ "@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
106
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
107
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
108
+ "@deepseek-ai/dsh-llm": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
109
+ "@deepseek-ai/dsh-session": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
110
+ "@deepseek-ai/dsh-session-persistence": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
111
+ "@deepseek-ai/dsh-session-projection": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
112
+ "@deepseek-ai/dsh-session-query": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2",
113
+ "@deepseek-ai/dsh-workspace": "0.2.0-rc.2 || 0.2.1-rc.1 || 0.2.1-rc.2"
114
+ },
115
+ "publishConfig": {
116
+ "access": "public",
117
+ "registry": "https://registry.npmjs.org/"
118
+ },
119
+ "contributors": [
120
+ {
121
+ "name": "shirobana",
122
+ "url": "https://github.com/sh1robana"
123
+ },
124
+ {
125
+ "name": "Codex(OpenAI AI 编程助手)",
126
+ "url": "https://openai.com/codex/"
127
+ }
128
+ ],
129
+ "repository": {
130
+ "type": "git",
131
+ "url": "git+https://github.com/sh1robana/dsh-plugin-message-edit.git"
132
+ },
133
+ "homepage": "https://github.com/sh1robana/dsh-plugin-message-edit#readme",
134
+ "bugs": {
135
+ "url": "https://github.com/sh1robana/dsh-plugin-message-edit/issues"
136
+ },
137
+ "author": {
138
+ "name": "shirobana",
139
+ "url": "https://github.com/sh1robana"
140
+ }
141
+ }