dsh-vault 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ox0400
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 ADDED
@@ -0,0 +1,150 @@
1
+ # dsh-vault — 加密凭据保险库插件
2
+
3
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
+
5
+ dsh-vault 是一个面向 DeepSeek Harness 的安全加密插件:把你在使用 AI 过程中产生的**用户名、邮箱、手机号、密码、二次动态密钥(TOTP)** 以及开发工作流中常用的 **SSH 连接、API Key、Secret、OAuth access/refresh token** 等敏感凭据加密存储,并通过模型工具提供增删改查、检索、密码生成与动态验证码生成能力。
6
+
7
+ **安全性与实现**
8
+
9
+ - **零外部依赖**:全部加密基于 Node 内置 `node:crypto`(AES-256-GCM 认证加密 + scrypt 密钥派生 + RFC 6238 TOTP),不引入任何第三方加密库。
10
+ - **主密码**:所有条目由 `scrypt(主密码, 盐)` 派生的 256 位密钥经 **AES-256-GCM** 加密。密钥永不落盘;进程内解锁后缓存复用(避免每次写入重复 scrypt),重启后重新派生。
11
+ - **防篡改**:GCM 认证标签 + 文档内固定明文的校验信封,错误主密码、密文被改动都会立即失败,绝不返回垃圾数据。
12
+ - **磁盘无明文**:加密文档中不含任何明文凭据;每个条目独立随机 nonce。
13
+ - **原子写入**:复用 harness 的 `writeFileAtomic` + 文件锁,任何时刻磁盘上都是完整的新/旧文档;进程内写入串行化、跨进程写入加锁。
14
+ - **检索不泄密**:`vault_search` 只返回摘要(id/标题/分类/用户名/邮箱/手机/主机/端口/URL/标签),**绝不返回密码、密钥、令牌与 TOTP 密钥**;完整凭据只能通过 `vault_get` 按 id 显式读取。
15
+
16
+ ## 条目模型
17
+
18
+ 每条记录包含一个 `title`、一个可选 `kind` 分类,以及任意组合的字段:
19
+
20
+ | 字段 | 说明 |
21
+ |---|---|
22
+ | `kind` | `login`(默认)/ `ssh` / `api-key` / `secret` / `oauth` / `custom` |
23
+ | `username` / `email` / `phone` | 账号身份 |
24
+ | `password` | 密码 |
25
+ | `host` / `port` | SSH 主机与端口(如 `db.internal` / `2222`) |
26
+ | `privateKey` | SSH 私钥(PEM) |
27
+ | `apiKey` | API 密钥 |
28
+ | `secret` | 通用 Secret(client secret、共享密钥等) |
29
+ | `accessToken` / `refreshToken` / `expiresAt` | OAuth 令牌对与过期时间(epoch millis) |
30
+ | `otpSecret` | TOTP 密钥(Base32 或 otpauth:// URI) |
31
+ | `url` / `notes` / `tags` | 元信息 |
32
+ | `fields` | 任意附加键值(如 `{"region": "us-east-1"}`),可检索 |
33
+
34
+ ## 工具
35
+
36
+ | 工具 | 作用 |
37
+ |---|---|
38
+ | `vault_add` | 新增条目(上述字段任意组合;空字符串/空数组字段会被忽略) |
39
+ | `vault_get` | 按 id 读取完整条目(含全部密钥) |
40
+ | `vault_search` | 跨标题/分类/用户名/邮箱/手机/主机/端口/URL/备注/标签/自定义字段(含数字/布尔/嵌套值)检索,返回无密摘要;`limit` 须为 1–100 的整数 |
41
+ | `vault_update` | 按 id 更新字段(未提供的字段保留;空字符串清除该字段;`title` 可改名) |
42
+ | `vault_delete` | 按 id 删除条目(不可恢复) |
43
+ | `vault_totp` | 为存储的 otpSecret(或直接传入的 Base32/otpauth URI)生成当前 6 位动态验证码 |
44
+ | `vault_generate_password` | 生成强随机密码(长度/字符集/去歧义/分组可选;`group` 须为 ≥2 的整数) |
45
+
46
+ **典型开发场景**:存一条 SSH 凭据(`kind: ssh` + host/port/username/password 或 privateKey),开发时让模型 `vault_search` 找主机、`vault_get` 取连接信息;存 API 网关的 `api-key`/`oauth` 条目管理 access/refresh token 轮换。
47
+
48
+ ## 安装
49
+
50
+ dsh-vault 是一个 **bundle**(声明 `dsh.bundle` 的包):安装到 profile 后,它的 `cordis.patch.yml` 会自动插入 `vault` 插件行(按包名 `dsh-vault` 引用,主密码经 `DSH_VAULT_PASSWORD` 环境变量注入)。包内含自包含构建脚本,git 安装时会自动编译 `lib/`。
51
+
52
+ ### 方式一:从 GitHub 安装(推荐)
53
+
54
+ ```sh
55
+ dsh plugin --profile demo add github:Ox0400/dsh-vault
56
+ ```
57
+
58
+ git 安装拉取的是**源码**,`prepare` 脚本会在安装时构建 `lib/`。pnpm ≥10 默认阻止 git 依赖执行构建脚本,首次 `add` 会失败并打印一个 `allowBuilds` 键——把**精确的键**(含仓库 URL 的那行)加入 profile 的 `pnpm-workspace.yaml`,再重新 `add`:
59
+
60
+ ```yaml
61
+ # $DSH_HOME/profiles/<name>/pnpm-workspace.yaml
62
+ allowBuilds:
63
+ dsh-vault@https://codeload.github.com/Ox0400/dsh-vault/tar.gz/<sha>: true
64
+ ```
65
+
66
+ 建议**锁定 commit** 再安装,避免上游推送改变安装时执行的代码:
67
+
68
+ ```sh
69
+ dsh plugin --profile demo add github:Ox0400/dsh-vault#<sha>
70
+ ```
71
+
72
+ 允许构建 = 允许该包的代码在你的机器上于安装时执行;只对你信任的源码授予。
73
+
74
+ ### 方式二:本地 clone 开发
75
+
76
+ ```sh
77
+ git clone git@github.com:Ox0400/dsh-vault.git
78
+ cd dsh-vault
79
+ pnpm install # 安装 devDependencies(typescript/tsdown/vitest 等)
80
+ pnpm build # 构建 host 侧 lib/*.js 与浏览器 bundle lib/client.js
81
+ pnpm test # 运行 41 项 vitest 测试
82
+ ```
83
+
84
+ > 测试需要 harness 的 `dsh-llm`/`dsh-system-prompt` 等 peer 包,在 harness monorepo 内开发时由 workspace 链接提供。
85
+
86
+ ### 方式三:本地路径安装到 profile
87
+
88
+ ```sh
89
+ dsh plugin --profile demo add /绝对/路径/to/dsh-vault
90
+ ```
91
+
92
+ 启动前设置主密码:
93
+
94
+ ```sh
95
+ export DSH_VAULT_PASSWORD='你的强主密码'
96
+ ```
97
+
98
+ `dsh plugin --profile demo remove dsh-vault` 卸载(同时移除依赖与 layer)。
99
+
100
+ ## 配置
101
+
102
+ | 配置项 | 说明 |
103
+ |---|---|
104
+ | `masterPassword` | 直接配置主密码(会出现在 cordis.yml 中,不推荐) |
105
+ | `masterPasswordEnv` | 环境变量名,运行时从该变量读取主密码(推荐) |
106
+ | `path` | 保险库文件路径,默认 `$DSH_HOME/vault/default.json` |
107
+ | `name` | 保险库名,用于默认路径(如 `name: work` → `$DSH_HOME/vault/work.json`) |
108
+
109
+ 首次调用任一工具时自动创建保险库;之后每次启动用主密码重新解锁。**忘记主密码 = 数据永久丢失**(无后门,这是设计使然)。
110
+
111
+ ## 开发
112
+
113
+ ```sh
114
+ # 单元 + 集成测试(vitest,41 项)
115
+ pnpm test # 或 npx vitest run
116
+
117
+ # 类型检查
118
+ pnpm typecheck # tsc -p tsconfig.json --noEmit
119
+
120
+ # 构建(host 侧 lib/*.js 与浏览器 bundle lib/client.js)
121
+ pnpm build # = build:host (tsc) + build:client (tsdown)
122
+
123
+ # 打包发布(可选:npm pack 产物可直接 `dsh plugin add ./dsh-vault-0.1.0.tgz`)
124
+ npm pack
125
+ ```
126
+
127
+ 仓库内所有测试通过:41/41(crypto/TOTP/密码生成/store CRUD/网关/集成)。
128
+
129
+ ## 打包与发布
130
+
131
+ 本包是标准 npm bundle:
132
+
133
+ - `dsh.bundle.patch` → `cordis.patch.yml`(安装到 profile 后自动应用的 layer)
134
+ - `dsh.client` → 浏览器端声明(`exports["./client"]` 指向 `lib/client.js`)
135
+ - `prepare` 脚本 → git 安装时自包含构建(`tsc` host + `tsdown` client)
136
+ - 运行时依赖全部走 `peerDependencies`(由宿主 harness 提供,避免重复实例)
137
+
138
+ 可选发布途径:
139
+
140
+ ```sh
141
+ npm pack # 产出 tarball → dsh plugin add ./dsh-vault-0.1.0.tgz
142
+ npm publish --access public # 发布 npm → dsh plugin add dsh-vault
143
+ ```
144
+
145
+ ## 安全边界与已知限制
146
+
147
+ - 主密码强度决定保险库强度;建议 ≥ 16 字符高熵。
148
+ - scrypt 成本参数(N=32768, r=8, p=1)已持久化在文档中,可随版本提升,旧文档仍可解密。
149
+ - 明文凭据仅存在于进程内存与 `vault_get` 显式读取期间;`vault_search`/`vault_update` 的输出均不含密码、密钥与令牌。`vault_get` 返回的秘密会进入该次工具调用结果(模型上下文),调用方应避免在对话中复述。
150
+ - 本插件面向单机/个人部署;团队共享保险库不在范围内。
@@ -0,0 +1,12 @@
1
+ # dsh-vault bundle patch: the layer applied when a profile lists this bundle.
2
+ # Rows reference the package by name, so Node resolution finds the installed
3
+ # code (lib/index.js on the host, lib/client.js in the browser via the
4
+ # package's dsh.client declaration). The master password is read from the
5
+ # DSH_VAULT_PASSWORD environment variable at unlock time — never written into
6
+ # any composition file.
7
+
8
+ - insert:
9
+ - id: vault
10
+ name: dsh-vault
11
+ config:
12
+ masterPasswordEnv: DSH_VAULT_PASSWORD