@openvulcan/dsh-vulcancode 0.0.0-stage → 0.4.3

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 (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +126 -2
  3. package/assets/openvulcan-icon.svg +33 -0
  4. package/cordis.patch.yml +19 -0
  5. package/node_modules/@openvulcan/dsh-decision-guard/LICENSE +21 -0
  6. package/node_modules/@openvulcan/dsh-decision-guard/README.md +14 -0
  7. package/node_modules/@openvulcan/dsh-decision-guard/assets/decision-guard-icon.png +0 -0
  8. package/node_modules/@openvulcan/dsh-decision-guard/lib/calls.d.ts +40 -0
  9. package/node_modules/@openvulcan/dsh-decision-guard/lib/calls.js +150 -0
  10. package/node_modules/@openvulcan/dsh-decision-guard/lib/client.js +2250 -0
  11. package/node_modules/@openvulcan/dsh-decision-guard/lib/decide.d.ts +90 -0
  12. package/node_modules/@openvulcan/dsh-decision-guard/lib/decide.js +108 -0
  13. package/node_modules/@openvulcan/dsh-decision-guard/lib/index.d.ts +129 -0
  14. package/node_modules/@openvulcan/dsh-decision-guard/lib/index.js +572 -0
  15. package/node_modules/@openvulcan/dsh-decision-guard/lib/intent.d.ts +22 -0
  16. package/node_modules/@openvulcan/dsh-decision-guard/lib/intent.js +77 -0
  17. package/node_modules/@openvulcan/dsh-decision-guard/lib/panel.d.ts +158 -0
  18. package/node_modules/@openvulcan/dsh-decision-guard/lib/panel.js +340 -0
  19. package/node_modules/@openvulcan/dsh-decision-guard/lib/records.d.ts +133 -0
  20. package/node_modules/@openvulcan/dsh-decision-guard/lib/records.js +186 -0
  21. package/node_modules/@openvulcan/dsh-decision-guard/lib/review.d.ts +55 -0
  22. package/node_modules/@openvulcan/dsh-decision-guard/lib/review.js +202 -0
  23. package/node_modules/@openvulcan/dsh-decision-guard/lib/session-state.d.ts +62 -0
  24. package/node_modules/@openvulcan/dsh-decision-guard/lib/session-state.js +155 -0
  25. package/node_modules/@openvulcan/dsh-decision-guard/lib/version.d.ts +2 -0
  26. package/node_modules/@openvulcan/dsh-decision-guard/lib/version.js +4 -0
  27. package/node_modules/@openvulcan/dsh-decision-guard/package.json +68 -0
  28. package/node_modules/@openvulcan/dsh-vulcan-account/LICENSE +21 -0
  29. package/node_modules/@openvulcan/dsh-vulcan-account/assets/account-icon.png +0 -0
  30. package/node_modules/@openvulcan/dsh-vulcan-account/lib/client.js +573 -0
  31. package/node_modules/@openvulcan/dsh-vulcan-account/lib/index.d.ts +92 -0
  32. package/node_modules/@openvulcan/dsh-vulcan-account/lib/index.js +194 -0
  33. package/node_modules/@openvulcan/dsh-vulcan-account/package.json +57 -0
  34. package/node_modules/@openvulcan/dsh-vulcan-answers/LICENSE +21 -0
  35. package/node_modules/@openvulcan/dsh-vulcan-answers/assets/answers-icon.png +0 -0
  36. package/node_modules/@openvulcan/dsh-vulcan-answers/assets/prompts/answer-mode-interactive.md +79 -0
  37. package/node_modules/@openvulcan/dsh-vulcan-answers/assets/prompts/answer-mode-standard.md +1 -0
  38. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/answer-model.d.ts +258 -0
  39. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/answer-model.js +698 -0
  40. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/client.js +671 -0
  41. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/fences.d.ts +29 -0
  42. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/fences.js +70 -0
  43. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/index.d.ts +19 -0
  44. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/index.js +52 -0
  45. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/limits.d.ts +9 -0
  46. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/limits.js +9 -0
  47. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/prompt.d.ts +22 -0
  48. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/prompt.js +39 -0
  49. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/reply-format.d.ts +20 -0
  50. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/reply-format.js +17 -0
  51. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/session-state.d.ts +66 -0
  52. package/node_modules/@openvulcan/dsh-vulcan-answers/lib/session-state.js +118 -0
  53. package/node_modules/@openvulcan/dsh-vulcan-answers/package.json +59 -0
  54. package/node_modules/@openvulcan/dsh-vulcan-luaskills/LICENSE +21 -0
  55. package/node_modules/@openvulcan/dsh-vulcan-luaskills/assets/luaskills-icon.svg +1 -0
  56. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/client.js +949 -0
  57. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/constants.d.ts +46 -0
  58. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/constants.js +51 -0
  59. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/engine.d.ts +55 -0
  60. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/engine.js +149 -0
  61. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/hub.d.ts +49 -0
  62. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/hub.js +116 -0
  63. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/index.d.ts +26 -0
  64. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/index.js +276 -0
  65. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/protocol.d.ts +65 -0
  66. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/protocol.js +2 -0
  67. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/runtime.d.ts +111 -0
  68. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/runtime.js +281 -0
  69. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/sdk-install.d.ts +26 -0
  70. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/sdk-install.js +87 -0
  71. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/settings.d.ts +79 -0
  72. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/settings.js +165 -0
  73. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/skills.d.ts +34 -0
  74. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/skills.js +61 -0
  75. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/tools.d.ts +59 -0
  76. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/tools.js +107 -0
  77. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/worker.d.ts +10 -0
  78. package/node_modules/@openvulcan/dsh-vulcan-luaskills/lib/worker.js +140 -0
  79. package/node_modules/@openvulcan/dsh-vulcan-luaskills/package.json +57 -0
  80. package/node_modules/@openvulcan/dsh-vulcan-memory/LICENSE +21 -0
  81. package/node_modules/@openvulcan/dsh-vulcan-memory/assets/markdown-memory-guide.md +21 -0
  82. package/node_modules/@openvulcan/dsh-vulcan-memory/assets/memory-curator/SKILL.md +31 -0
  83. package/node_modules/@openvulcan/dsh-vulcan-memory/assets/memory-icon.png +0 -0
  84. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/client.js +1090 -0
  85. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/index.d.ts +30 -0
  86. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/index.js +240 -0
  87. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/inject.d.ts +30 -0
  88. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/inject.js +46 -0
  89. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/constants.d.ts +23 -0
  90. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/constants.js +25 -0
  91. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/document.d.ts +108 -0
  92. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/document.js +373 -0
  93. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/errors.d.ts +14 -0
  94. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/errors.js +31 -0
  95. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/index.d.ts +196 -0
  96. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/index.js +204 -0
  97. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/operations.d.ts +92 -0
  98. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/operations.js +472 -0
  99. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/package.d.ts +126 -0
  100. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/package.js +553 -0
  101. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/registry.d.ts +56 -0
  102. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/registry.js +182 -0
  103. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/scope.d.ts +13 -0
  104. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/scope.js +24 -0
  105. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/search.d.ts +65 -0
  106. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/search.js +227 -0
  107. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/snapshot.d.ts +34 -0
  108. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/snapshot.js +171 -0
  109. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/store.d.ts +72 -0
  110. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/store.js +250 -0
  111. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/timestamp.d.ts +6 -0
  112. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/timestamp.js +12 -0
  113. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/tokens.d.ts +8 -0
  114. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/markdown/tokens.js +38 -0
  115. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/page.d.ts +132 -0
  116. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/page.js +235 -0
  117. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/project.d.ts +14 -0
  118. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/project.js +27 -0
  119. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/settings.d.ts +29 -0
  120. package/node_modules/@openvulcan/dsh-vulcan-memory/lib/settings.js +62 -0
  121. package/node_modules/@openvulcan/dsh-vulcan-memory/package.json +63 -0
  122. package/node_modules/@openvulcan/dsh-vulcan-reasoning/LICENSE +21 -0
  123. package/node_modules/@openvulcan/dsh-vulcan-reasoning/lib/client.js +509 -0
  124. package/node_modules/@openvulcan/dsh-vulcan-reasoning/lib/index.d.ts +6 -0
  125. package/node_modules/@openvulcan/dsh-vulcan-reasoning/lib/index.js +8 -0
  126. package/node_modules/@openvulcan/dsh-vulcan-reasoning/package.json +42 -0
  127. package/node_modules/@openvulcan/dsh-vulcan-style/LICENSE +21 -0
  128. package/node_modules/@openvulcan/dsh-vulcan-style/assets/style-icon.png +0 -0
  129. package/node_modules/@openvulcan/dsh-vulcan-style/lib/client.js +1121 -0
  130. package/node_modules/@openvulcan/dsh-vulcan-style/lib/index.d.ts +34 -0
  131. package/node_modules/@openvulcan/dsh-vulcan-style/lib/index.js +42 -0
  132. package/node_modules/@openvulcan/dsh-vulcan-style/package.json +51 -0
  133. package/node_modules/@openvulcan/openvulcan-account/LICENSE +21 -0
  134. package/node_modules/@openvulcan/openvulcan-account/lib/account.d.ts +140 -0
  135. package/node_modules/@openvulcan/openvulcan-account/lib/account.js +347 -0
  136. package/node_modules/@openvulcan/openvulcan-account/lib/index.d.ts +1 -0
  137. package/node_modules/@openvulcan/openvulcan-account/lib/index.js +1 -0
  138. package/node_modules/@openvulcan/openvulcan-account/package.json +29 -0
  139. package/node_modules/@openvulcan/vulcan-decision/LICENSE +21 -0
  140. package/node_modules/@openvulcan/vulcan-decision/README.md +23 -0
  141. package/node_modules/@openvulcan/vulcan-decision/bin/vulcan-decision.js +4 -0
  142. package/node_modules/@openvulcan/vulcan-decision/lib/cli.d.ts +5 -0
  143. package/node_modules/@openvulcan/vulcan-decision/lib/cli.js +267 -0
  144. package/node_modules/@openvulcan/vulcan-decision/lib/cloud/edge.d.ts +211 -0
  145. package/node_modules/@openvulcan/vulcan-decision/lib/cloud/edge.js +594 -0
  146. package/node_modules/@openvulcan/vulcan-decision/lib/download.d.ts +36 -0
  147. package/node_modules/@openvulcan/vulcan-decision/lib/download.js +99 -0
  148. package/node_modules/@openvulcan/vulcan-decision/lib/engine.d.ts +37 -0
  149. package/node_modules/@openvulcan/vulcan-decision/lib/engine.js +39 -0
  150. package/node_modules/@openvulcan/vulcan-decision/lib/hardware.d.ts +105 -0
  151. package/node_modules/@openvulcan/vulcan-decision/lib/hardware.js +207 -0
  152. package/node_modules/@openvulcan/vulcan-decision/lib/home.d.ts +26 -0
  153. package/node_modules/@openvulcan/vulcan-decision/lib/home.js +54 -0
  154. package/node_modules/@openvulcan/vulcan-decision/lib/index.d.ts +17 -0
  155. package/node_modules/@openvulcan/vulcan-decision/lib/index.js +17 -0
  156. package/node_modules/@openvulcan/vulcan-decision/lib/local/engine.d.ts +54 -0
  157. package/node_modules/@openvulcan/vulcan-decision/lib/local/engine.js +157 -0
  158. package/node_modules/@openvulcan/vulcan-decision/lib/local/models.d.ts +126 -0
  159. package/node_modules/@openvulcan/vulcan-decision/lib/local/models.js +261 -0
  160. package/node_modules/@openvulcan/vulcan-decision/lib/local/packs.d.ts +102 -0
  161. package/node_modules/@openvulcan/vulcan-decision/lib/local/packs.js +195 -0
  162. package/node_modules/@openvulcan/vulcan-decision/lib/local/worker.d.ts +61 -0
  163. package/node_modules/@openvulcan/vulcan-decision/lib/local/worker.js +123 -0
  164. package/node_modules/@openvulcan/vulcan-decision/lib/protocol.d.ts +74 -0
  165. package/node_modules/@openvulcan/vulcan-decision/lib/protocol.js +31 -0
  166. package/node_modules/@openvulcan/vulcan-decision/lib/render.d.ts +15 -0
  167. package/node_modules/@openvulcan/vulcan-decision/lib/render.js +33 -0
  168. package/node_modules/@openvulcan/vulcan-decision/lib/version.d.ts +2 -0
  169. package/node_modules/@openvulcan/vulcan-decision/lib/version.js +4 -0
  170. package/node_modules/@openvulcan/vulcan-decision/package.json +40 -0
  171. package/node_modules/@openvulcan/vulcan-decision/python/vulcan_decision_worker.py +363 -0
  172. package/node_modules/@openvulcan/vulcan-decision/runtime-packs/onnx-cpu.json +627 -0
  173. package/node_modules/@openvulcan/vulcan-decision/runtime-packs/onnx-cuda.json +423 -0
  174. package/node_modules/@openvulcan/vulcan-decision/runtime-packs/torch-cpu.json +1047 -0
  175. package/node_modules/@openvulcan/vulcan-decision/runtime-packs/torch-cu128.json +647 -0
  176. package/package.json +55 -4
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenVulcan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,127 @@
1
- # Temporary Holding Version
1
+ <div align="center">
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="docs/assets/openvulcan-logo-dark.svg">
5
+ <img src="docs/assets/openvulcan-logo-light.svg" alt="OpenVulcan" width="360">
6
+ </picture>
7
+
8
+ # dsh-vulcancode
9
+
10
+ **把 VulcanCode 的体验带进 DeepSeek Harness(dsh)**
11
+
12
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
13
+ [![npm](https://img.shields.io/npm/v/@openvulcan/dsh-vulcancode)](https://www.npmjs.com/package/@openvulcan/dsh-vulcancode)
14
+
15
+ **简体中文** | [English](README.en.md)
16
+
17
+ [特色功能](#特色功能) · [架构与包结构](#架构与包结构) · [快速开始](#快速开始) · [开发](#开发)
18
+
19
+ </div>
20
+
21
+ ---
22
+
23
+ ## 关于项目
24
+
25
+ dsh-vulcancode 是 DeepSeek Harness(dsh)的社区插件套件。安装一个包,即可在 dsh 中使用 VulcanCode 的界面风格、交互式回答、自动审批、LuaSkills 和长期记忆,并为 pi-ai 模型配置思考级别。
26
+
27
+ 本项目与 DeepSeek 无关联,dsh 是 DeepSeek 的产品。
28
+
29
+ ## 特色功能
30
+
31
+ - **桌面工作台**采用 VulcanCode 配色、可独立开关的直角外观,以及加宽后能充分利用内容区的设置页面。
32
+ - **结果可交互**,模型可在对话中用图表、流程图和决策卡片呈现结果。卡片里的选择可以带回输入框继续讨论。
33
+ - **工具调用可审查**,Vulcan Decision 在执行前使用云端或本机模型判定,并支持配置复核和人工确认。
34
+ - **技能与经验可复用**,LuaSkills 把技能发布为 AI 可调用的工具,Markdown 长期记忆保留用户、空间和项目经验。
35
+ - **模型可单独配置思考级别**,pi-ai 模型的可选级别和接口传输值可按供应商、按模型设置。
36
+
37
+ ## 架构与包结构
38
+
39
+ dsh 通过套件的 `cordis.patch.yml` 装载七个插件。自动审批调用判定引擎,使用云端判定时通过 `openvulcanAccount` 获取账号凭据。账号插件和判定引擎复用同一账号库。发布包随附这九个工作区依赖,用户只需安装套件。
40
+
41
+ ### 套件入口
42
+
43
+ #### `@openvulcan/dsh-vulcancode`
44
+
45
+ 负责声明 dsh 兼容范围和插件组。安装入口是 `dsh plugin add @openvulcan/dsh-vulcancode`,插件管理页可查看套件。源码在 [packages/dsh-vulcancode](packages/dsh-vulcancode)。
46
+
47
+ ### dsh 插件
48
+
49
+ #### `@openvulcan/dsh-vulcan-account`
50
+
51
+ 在「设置 › OpenVulcan 账号」选择国际站或中国站,浏览器授权后即可在 dsh 内查看账号状态或退出登录。插件将凭据保存到 dsh 的凭据存储,并通过 `openvulcanAccount` 向云端判定等集成提供账号服务。源码在 [packages/dsh-vulcan-account](packages/dsh-vulcan-account)。
52
+
53
+ #### `@openvulcan/dsh-decision-guard`
54
+
55
+ 在「设置 › 自动审批」选择与权限预设的接入方式,配置云端或本机判定、复核 LLM 和询问规则,并查看审批记录。判定模型给出放行、需确认或拦截三类结果。未放行的调用按配置进入复核、询问或拒绝。详见[自动审批的边界](#自动审批的边界)和[插件说明](packages/dsh-decision-guard/README.md)。
56
+
57
+ #### `@openvulcan/dsh-vulcan-answers`
58
+
59
+ 在对话中渲染模型输出的 `ui-*` 代码围栏,例如对比表、图表、流程图、时序图和决策卡片。决策选项可以插入输入框或发送。对话默认使用交互模式,输入框里的「回答」可以按会话切换为标准 Markdown,从下次请求起生效。源码在 [packages/dsh-vulcan-answers](packages/dsh-vulcan-answers)。
60
+
61
+ #### `@openvulcan/dsh-vulcan-luaskills`
62
+
63
+ 在「设置 › LuaSkills」按需安装约 190 MB 的运行库和默认代码导航技能 CodeKit。安装后引擎和工具自动接入,可以调整 VM 池、缓存、受管 Python / Node 和网络设置。侧栏「LuaSkills」可启用、停用、更新或卸载技能,也可从 LuaSkills Hub 搜索和安装新技能。源码在 [packages/dsh-vulcan-luaskills](packages/dsh-vulcan-luaskills)。
64
+
65
+ #### `@openvulcan/dsh-vulcan-memory`
66
+
67
+ 以 Markdown 保存用户画像、空间记忆和项目记忆。向模型提供 `memory_outline`、`memory_search`、`memory_write` 与 `memory-curator` 技能,并在会话开始时按预算注入快照。侧栏「长期记忆」支持编辑、调整注入预算和导入导出。当前可用的是 Markdown 模式。源码在 [packages/dsh-vulcan-memory](packages/dsh-vulcan-memory)。
68
+
69
+ #### `@openvulcan/dsh-vulcan-reasoning`
70
+
71
+ 在「设置 › 模型」展开已配置的 pi-ai 提供商卡片中的「自定义思考级别」。按模型选择跟随目录、关闭思考,或自定义对话中可选的级别及接口传输值。保存后在对话模型选择器中选用,传输值以对应模型接口支持的参数为准。源码在 [packages/dsh-vulcan-reasoning](packages/dsh-vulcan-reasoning)。
72
+
73
+ #### `@openvulcan/dsh-vulcan-style`
74
+
75
+ 在「设置 › 通用设置」的「Vulcan 界面风格」选择跟随系统、亮色、暗色、指挥舱或 dsh 自带主题。直角开关可与任意主题搭配,覆盖 Windows 桌面内容区等界面边角。设置布局为模型目录、内置插件和 LuaSkills 等页面留出更多可用宽度。源码在 [packages/dsh-vulcan-style](packages/dsh-vulcan-style)。
76
+
77
+ ### 共享库与命令行
78
+
79
+ #### `@openvulcan/vulcan-decision`
80
+
81
+ 为宿主提供 `allow`、`review` 和 `block` 判定,支持 OpenVulcan 云端端点和按需安装的本机运行包。随附的 `vulcan-decision` CLI 可用于探测云端、检查硬件、管理本机运行包和模型,以及对单次工具调用执行判定。详见[判定引擎与命令行说明](packages/vulcan-decision/README.md)。
82
+
83
+ #### `@openvulcan/openvulcan-account`
84
+
85
+ 封装设备授权、凭据刷新、账号资料查询和设备注销,并定义 `CredentialStore` 存储接口。dsh 插件接入宿主凭据存储,独立 CLI 可使用库内的文件存储实现。源码在 [packages/openvulcan-account](packages/openvulcan-account)。
86
+
87
+ ## 快速开始
88
+
89
+ 套件声明兼容 dsh `>=0.2.1-rc.2 <0.3.0`。
90
+
91
+ ```sh
92
+ dsh plugin add @openvulcan/dsh-vulcancode
93
+ ```
94
+
95
+ ### 使用
96
+
97
+ 1. 安装后重启 dsh。使用云端判定时,在「设置 › OpenVulcan 账号」完成浏览器授权。选用本机判定可以跳过账号登录。
98
+ 2. 打开「设置 › 自动审批」配置判定方式。在权限选择器中选「自动审查」可对当前会话启用,该预设使用完全权限。改用「独立开关」会为所有会话叠加判定,并保留已有权限预设的文件沙箱。
99
+ 3. 需要技能工具时,在「设置 › LuaSkills」安装运行库。进度显示在页面上,完成后技能工具自动接入。
100
+ 4. 界面风格、交互式回答和 Markdown 长期记忆默认启用。思考级别可以在配置好 pi-ai 提供商后按模型调整。
101
+
102
+ > **我们承诺云端命令判定模型永久免费提供。**(2026 年 10 月 27 日)
103
+
104
+ ## 自动审批的边界
105
+
106
+ - 自动审批可以降低 AI 误执行命令的风险。AI 刻意绕过时,仍可能先写脚本再运行它。
107
+ - 任何错误都不会被当作放行。无人值守时,需要复核的调用只有在复核明确放行后才会执行。
108
+ - 请同时使用沙箱、Git 与备份。
109
+
110
+ ## 开发
111
+
112
+ ```sh
113
+ pnpm install
114
+ pnpm run build
115
+ pnpm run test
116
+ pnpm run pack:dsh # 生成 dist/openvulcan-dsh-vulcancode-<版本>.tgz
117
+ ```
118
+
119
+ 本地安装打包结果使用 `dsh plugin add ./dist/openvulcan-dsh-vulcancode-<版本>.tgz`。
120
+
121
+ ## 致谢
122
+
123
+ 感谢 [LINUX DO](https://linux.do/) 社区的支持与交流。
124
+
125
+ ## 许可
126
+
127
+ [MIT](LICENSE)
@@ -0,0 +1,33 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" shape-rendering="geometricPrecision">
2
+ <rect x="0" y="0" width="1024" height="1024" rx="220" fill="#0B0D10"/>
3
+ <rect x="2" y="2" width="1020" height="1020" rx="218" fill="none" stroke="#FFFFFF" stroke-opacity="0.0784" stroke-width="2"/>
4
+ <rect x="6" y="6" width="1012" height="1012" rx="214" fill="none" stroke="#000000" stroke-opacity="0.0706" stroke-width="1"/>
5
+ <svg x="200.135" y="172.032" width="623.731" height="696.320" viewBox="32 29 232 259" preserveAspectRatio="xMidYMid meet">
6
+ <defs>
7
+ <linearGradient id="k2" x1="0%" y1="100%" x2="100%" y2="0%">
8
+ <stop offset="0%" stop-color="#FF6527"/>
9
+ <stop offset="100%" stop-color="#F44E1C"/>
10
+ </linearGradient>
11
+ </defs>
12
+ <g id="vulcan-symbol">
13
+ <path d="M 2 0
14
+ L 84 0
15
+ C 88 0 91 1 95 5
16
+ L 153 76
17
+ C 159 83 159 95 153 102
18
+ L 95 173
19
+ C 91 177 88 178 84 178
20
+ L 2 178
21
+ L 78 89
22
+ Z" fill="#FFFFFF" transform="translate(30 110)"/>
23
+ <path d="M 73 0
24
+ C 64 14 51 28 38 40
25
+ C 21 55 7 68 2 87
26
+ C -2 107 8 129 25 150
27
+ C 39 134 53 119 67 107
28
+ C 82 95 91 79 93 60
29
+ C 95 40 86 18 73 0
30
+ Z" fill="url(#k2)" transform="translate(169 29)"/>
31
+ </g>
32
+ </svg>
33
+ </svg>
@@ -0,0 +1,19 @@
1
+ - insert:
2
+ - id: dsh-vulcancode
3
+ name: cordis:group
4
+ group: true
5
+ config:
6
+ - id: openvulcan-account
7
+ name: '@openvulcan/dsh-vulcan-account'
8
+ - id: vulcan-decision-guard
9
+ name: '@openvulcan/dsh-decision-guard'
10
+ - id: vulcan-style
11
+ name: '@openvulcan/dsh-vulcan-style'
12
+ - id: vulcan-answers
13
+ name: '@openvulcan/dsh-vulcan-answers'
14
+ - id: vulcan-luaskills
15
+ name: '@openvulcan/dsh-vulcan-luaskills'
16
+ - id: vulcan-memory
17
+ name: '@openvulcan/dsh-vulcan-memory'
18
+ - id: vulcan-reasoning
19
+ name: '@openvulcan/dsh-vulcan-reasoning'
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenVulcan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,14 @@
1
+ # @openvulcan/dsh-decision-guard
2
+
3
+ Vulcan Decision 自动审批插件,属于 [dsh-vulcancode](https://github.com/OpenVulcan/dsh-vulcancode) 套件,随套件
4
+ 安装,不单独安装:
5
+
6
+ ```sh
7
+ dsh plugin add @openvulcan/dsh-vulcancode
8
+ ```
9
+
10
+ The Vulcan Decision auto approval plugin, part of the
11
+ [dsh-vulcancode](https://github.com/OpenVulcan/dsh-vulcancode) suite. It is installed with the suite, not on
12
+ its own.
13
+
14
+ License: MIT
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Translate dsh tool calls into what the decision model reads.
3
+ *
4
+ * The model was trained on a fixed set of tool shapes (`shell_command`, `write_file`, `edit_file`,
5
+ * `create_file`, `read_file`, ...). dsh's own tools are translated into those shapes using only
6
+ * facts the call carries; nothing is guessed. Other tools, including MCP tools, are passed with
7
+ * their own name and arguments.
8
+ */
9
+ /** What to do with one call before the model sees it. */
10
+ export type Translation =
11
+ /** Judge the call with the model, rendered as this tool and arguments. */
12
+ {
13
+ readonly kind: 'judge';
14
+ readonly tool: string;
15
+ readonly arguments: Readonly<Record<string, unknown>>;
16
+ }
17
+ /** Run it without asking the model; see {@link AllowReason}. */
18
+ | {
19
+ readonly kind: 'allow';
20
+ readonly reason: AllowReason;
21
+ };
22
+ /**
23
+ * - `internal`: a dsh tool whose only effect stays inside the harness (todos, goals, questions,
24
+ * agent messages, job and terminal reads).
25
+ * - `project-edit`: a file edit inside the project, which the model's release notes let hosts
26
+ * allow directly.
27
+ * - `project-read`: a read or search inside the project.
28
+ */
29
+ export type AllowReason = 'internal' | 'project-edit' | 'project-read';
30
+ /**
31
+ * @param name - tool name as dsh reports it.
32
+ * @param args - tool arguments as dsh reports them.
33
+ * @param project - the session's working directory, when known.
34
+ */
35
+ export declare function translateCall(name: string, args: unknown, project: string | undefined): Translation;
36
+ /**
37
+ * Whether `target` lies inside the project. A project at a filesystem root or the home directory
38
+ * covers too much to count, and repository metadata (`.git`, where hooks live) never counts.
39
+ */
40
+ export declare function insideProject(project: string | undefined, target: string): boolean;
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Translate dsh tool calls into what the decision model reads.
3
+ *
4
+ * The model was trained on a fixed set of tool shapes (`shell_command`, `write_file`, `edit_file`,
5
+ * `create_file`, `read_file`, ...). dsh's own tools are translated into those shapes using only
6
+ * facts the call carries; nothing is guessed. Other tools, including MCP tools, are passed with
7
+ * their own name and arguments.
8
+ */
9
+ import os from 'node:os';
10
+ import path from 'node:path';
11
+ import { INTENT_TOOL } from './decide.js';
12
+ /** dsh tools whose effects stay inside the harness; every other tool is judged. */
13
+ const INTERNAL_TOOLS = new Set([
14
+ 'ask_user_question',
15
+ 'cordis_inspect_list',
16
+ 'cordis_inspect_query',
17
+ 'create_goal',
18
+ // Vulcan Decision's own intent tool only records a statement for the reviewer.
19
+ INTENT_TOOL,
20
+ 'get_goal',
21
+ 'update_goal',
22
+ 'job_list',
23
+ 'job_output',
24
+ 'list_agents',
25
+ 'list_subagent_models',
26
+ 'present',
27
+ 'send_message',
28
+ 'session_event_read',
29
+ 'session_event_search',
30
+ 'session_event_trace',
31
+ 'session_search',
32
+ 'session_trace',
33
+ 'skill',
34
+ 'team_task_create',
35
+ 'team_task_get',
36
+ 'team_task_list',
37
+ 'team_task_update',
38
+ 'terminal_list',
39
+ 'terminal_read',
40
+ 'todo_write',
41
+ 'wait_agent',
42
+ 'web_search',
43
+ 'working_directory',
44
+ ]);
45
+ /**
46
+ * @param name - tool name as dsh reports it.
47
+ * @param args - tool arguments as dsh reports them.
48
+ * @param project - the session's working directory, when known.
49
+ */
50
+ export function translateCall(name, args, project) {
51
+ if (INTERNAL_TOOLS.has(name))
52
+ return { kind: 'allow', reason: 'internal' };
53
+ const record = isRecord(args) ? args : undefined;
54
+ if (record === undefined)
55
+ return { kind: 'judge', tool: name, arguments: { arguments: args } };
56
+ const text = (key) => typeof record[key] === 'string' ? record[key] : undefined;
57
+ switch (name) {
58
+ case 'bash':
59
+ case 'pwsh':
60
+ return shell(text('command'), text('workdir'), name === 'bash' ? 'bash' : 'powershell', project, name, record);
61
+ case 'terminal_send': {
62
+ // Text typed into a terminal session runs like a command in that terminal's shell.
63
+ const command = text('text');
64
+ return command === undefined ? passThrough(name, record) : judge('shell_command', { command });
65
+ }
66
+ case 'write':
67
+ return fileChange('write_file', text('file_path'), project, name, record);
68
+ case 'edit':
69
+ return fileChange('edit_file', text('file_path'), project, name, record);
70
+ case 'str_replace_editor': {
71
+ const command = text('command');
72
+ if (command === 'view')
73
+ return fileRead(text('path'), project, name, record);
74
+ if (command === 'create')
75
+ return fileChange('create_file', text('path'), project, name, record);
76
+ if (command === 'str_replace' || command === 'insert')
77
+ return fileChange('edit_file', text('path'), project, name, record);
78
+ return passThrough(name, record);
79
+ }
80
+ case 'read':
81
+ case 'read_image':
82
+ return fileRead(text('file_path'), project, name, record);
83
+ case 'glob':
84
+ case 'grep':
85
+ case 'lsp':
86
+ // Searches default to the session workspace.
87
+ return fileRead(text('path') ?? '.', project, name, record);
88
+ default:
89
+ return passThrough(name, record);
90
+ }
91
+ }
92
+ function shell(command, workdir, shellName, project, name, record) {
93
+ if (command === undefined)
94
+ return passThrough(name, record);
95
+ // A working directory is stated only when the call names one; a persistent shell's current
96
+ // directory is shell state the call does not carry.
97
+ const cwd = workdir === undefined ? undefined : resolveIn(project, workdir);
98
+ return judge('shell_command', { command, ...cwd === undefined ? {} : { cwd }, shell: shellName });
99
+ }
100
+ function fileChange(tool, file, project, name, record) {
101
+ if (file === undefined)
102
+ return passThrough(name, record);
103
+ if (insideProject(project, file))
104
+ return { kind: 'allow', reason: 'project-edit' };
105
+ // Only the target path is judged; file bodies are never sent to the model.
106
+ return judge(tool, { path: file });
107
+ }
108
+ function fileRead(file, project, name, record) {
109
+ if (file === undefined)
110
+ return passThrough(name, record);
111
+ if (insideProject(project, file))
112
+ return { kind: 'allow', reason: 'project-read' };
113
+ return judge('read_file', { path: file });
114
+ }
115
+ function judge(tool, args) {
116
+ return { kind: 'judge', tool, arguments: args };
117
+ }
118
+ function passThrough(name, record) {
119
+ return judge(name, record);
120
+ }
121
+ /** Absolute form of a path the tool resolves against the session workspace. */
122
+ function resolveIn(project, target) {
123
+ if (path.isAbsolute(target))
124
+ return target;
125
+ return project === undefined ? undefined : path.resolve(project, target);
126
+ }
127
+ /**
128
+ * Whether `target` lies inside the project. A project at a filesystem root or the home directory
129
+ * covers too much to count, and repository metadata (`.git`, where hooks live) never counts.
130
+ */
131
+ export function insideProject(project, target) {
132
+ if (project === undefined || project === '')
133
+ return false;
134
+ const root = path.resolve(project);
135
+ if (path.parse(root).root === root || sameDir(root, os.homedir()))
136
+ return false;
137
+ const relative = path.relative(root, path.resolve(root, target));
138
+ if (relative === '')
139
+ return true;
140
+ const segments = relative.split(/[\\/]/);
141
+ if (segments[0] === '..' || path.isAbsolute(relative))
142
+ return false;
143
+ return !segments.some(segment => segment.toLowerCase() === '.git');
144
+ }
145
+ function sameDir(a, b) {
146
+ return path.relative(path.resolve(a), path.resolve(b)) === '';
147
+ }
148
+ function isRecord(value) {
149
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
150
+ }