@chance722/dsh-inbox 0.2.3 → 0.2.4
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 +21 -21
- package/README.md +141 -134
- package/README.zh.md +141 -134
- package/cordis.patch.yml +11 -11
- package/lib/client.js +156 -55
- package/lib/index.js +106 -19
- package/lib/types/client/messages.d.ts +36 -18
- package/lib/types/host/remote/merge.d.ts +17 -1
- package/lib/types/host/remote/pull.d.ts +25 -3
- package/lib/types/host/s3/client.d.ts +25 -1
- package/lib/types/host/webdav/config.d.ts +4 -0
- package/lib/types/shared/panel-wire.d.ts +34 -0
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 Chance722
|
|
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.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Chance722
|
|
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,69 +1,69 @@
|
|
|
1
|
-
# dsh-inbox
|
|
2
|
-
|
|
3
|
-

|
|
4
|
-
|
|
5
|
-
A **local inbox plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)** (`dsh`): file whatever you copy into one vault, get it back when you need it — including **by asking your assistant in conversation**.
|
|
6
|
-
|
|
7
|
-
English | [中文](README.zh.md)
|
|
8
|
-
|
|
9
|
-
## The problem it solves
|
|
10
|
-
|
|
11
|
-
The things you copy during a day — a link to read later, a screenshot, a snippet of config, an account and password — end up scattered across clipboard history, bookmark folders and temporary files. When you need them you cannot find them, and you cannot remember where they went.
|
|
12
|
-
|
|
13
|
-
**dsh-inbox puts them in one local vault**: paste to file, automatic classification, browse and search from the sidebar — and instead of digging through it yourself, just ask your assistant "what was that article about caching I saved last month?".
|
|
14
|
-
|
|
15
|
-
It works for you alone: everything lands on your machine, and the model only sees a record when you ask it to look.
|
|
16
|
-
|
|
17
|
-
## Features
|
|
18
|
-
|
|
19
|
-
| Feature | What it does |
|
|
20
|
-
|---|---|
|
|
21
|
-
| **Two ways in** | `/inbox <text or link>` in the composer (attach images to carry them along), or paste / drop / pick a file in the panel |
|
|
22
|
-
| **Automatic classification** | Links are filed by platform and media type (a Bilibili video, a WeChat article…), text by credential shape, images get a 疑似证件 tag when they have card proportions; what the rules cannot decide goes to the model, with a daily cap |
|
|
1
|
+
# dsh-inbox
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
A **local inbox plugin for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)** (`dsh`): file whatever you copy into one vault, get it back when you need it — including **by asking your assistant in conversation**.
|
|
6
|
+
|
|
7
|
+
English | [中文](README.zh.md)
|
|
8
|
+
|
|
9
|
+
## The problem it solves
|
|
10
|
+
|
|
11
|
+
The things you copy during a day — a link to read later, a screenshot, a snippet of config, an account and password — end up scattered across clipboard history, bookmark folders and temporary files. When you need them you cannot find them, and you cannot remember where they went.
|
|
12
|
+
|
|
13
|
+
**dsh-inbox puts them in one local vault**: paste to file, automatic classification, browse and search from the sidebar — and instead of digging through it yourself, just ask your assistant "what was that article about caching I saved last month?".
|
|
14
|
+
|
|
15
|
+
It works for you alone: everything lands on your machine, and the model only sees a record when you ask it to look.
|
|
16
|
+
|
|
17
|
+
## Features
|
|
18
|
+
|
|
19
|
+
| Feature | What it does |
|
|
20
|
+
|---|---|
|
|
21
|
+
| **Two ways in** | `/inbox <text or link>` in the composer (attach images to carry them along), or paste / drop / pick a file in the panel |
|
|
22
|
+
| **Automatic classification** | Links are filed by platform and media type (a Bilibili video, a WeChat article…), text by credential shape, images get a 疑似证件 tag when they have card proportions; what the rules cannot decide goes to the model, with a daily cap |
|
|
23
23
|
| **Panel** | Filter by watch-later / category / tag, search across title, text, link and note, switch between two list densities; the detail pane edits name, category, note and tags, flags watch-later, deletes and restores; it follows dsh's dark and light themes **and its language** (switch dsh to English under 设置 → 常规 and the whole panel, dock, cards and manual come with you) |
|
|
24
|
-
| **Everything has a name** | A link is named by the headline of the page it points at (no model tokens spent), a photo or file by the name it arrived with, and the name you type always wins. The row shows the name; the glyph on the left says what kind of thing it is (a key for a credential) |
|
|
25
|
-
| **Who judged the category** | A coloured badge next to the category: 规则判定 (grey, the local rules) / 模型判定 (violet, the capped model pass) / 手动判定 (blue, your own choice — nothing overwrites it later) |
|
|
26
|
-
| **Ask in conversation** | Ask for 收件箱 / 仓库 / inbox and the assistant searches by words, category, tag, watch-later flag or kind (ten at a time plus a count of the rest, with thumbnails right in the results), then opens one by id (text up to 1000 characters, link, note, tags, attachment facts). To look at one yourself: expand 「N 次工具调用」 above the answer and press 打开 ↗ — the 仓库 tab opens on that record |
|
|
27
|
-
| **Looking at a picture** | Image bytes stay out of the conversation by default; when you ask "look at this picture and tell me what it is", the assistant sends that one image to itself — explicitly, per call |
|
|
28
|
-
| **Credentials are safe** | A credential's body is **encrypted at rest** with a key derived from your master password; neither the password nor the key is ever written down. The list shows only the name you gave it; plain text never reaches a conversation or a model |
|
|
29
|
-
| **Two-way sync** | Point it at a WebDAV folder or an S3 bucket: changes are pushed a few seconds after you make them, 刷新 runs a full sync (push, then pull,
|
|
30
|
-
| **Conversation cards** | Tool results render as dsh-inbox cards — links become clickable, image markers become thumbnails drawn on your machine |
|
|
31
|
-
| **Gateway quirks** | Some object-storage gateways bind each AccessKey to an "application" and identify clients by a header (refusing you with the same status a wrong password gets) — the plugin keeps **one client identity per protocol** for exactly that |
|
|
32
|
-
|
|
33
|
-
## Screenshots
|
|
34
|
-
|
|
35
|
-

|
|
36
|
-
|
|
37
|
-
It all lives inside dsh: the left rail gains an **Inbox** entry that opens a full-page vault, and the panel's top right has 设置 (settings) and 使用手册 (a short manual).
|
|
38
|
-
|
|
39
|
-
## Two ways to use it
|
|
40
|
-
|
|
41
|
-
**① File something from the conversation**
|
|
42
|
-
|
|
43
|
-
Type `/inbox` in the composer followed by text or a link, and attach images directly — **this command never reaches the model**, it only goes into the vault. It is the way to file credentials and throwaway links that have no business appearing in a conversation.
|
|
44
|
-
|
|
45
|
-
**② Ask for it later**
|
|
46
|
-
|
|
47
|
-
No command needed, just talk:
|
|
48
|
-
|
|
49
|
-
> which of my saved images is the mini-program code?
|
|
50
|
-
>
|
|
51
|
-
> show me that article about caching I saved last week
|
|
52
|
-
>
|
|
53
|
-
> list the links in my inbox I haven't read yet
|
|
54
|
-
|
|
55
|
-
Two questions in the same conversation, on a real machine:
|
|
56
|
-
|
|
57
|
-

|
|
58
|
-
|
|
59
|
-

|
|
60
|
-
|
|
61
|
-
## Install
|
|
62
|
-
|
|
24
|
+
| **Everything has a name** | A link is named by the headline of the page it points at (no model tokens spent), a photo or file by the name it arrived with, and the name you type always wins. The row shows the name; the glyph on the left says what kind of thing it is (a key for a credential) |
|
|
25
|
+
| **Who judged the category** | A coloured badge next to the category: 规则判定 (grey, the local rules) / 模型判定 (violet, the capped model pass) / 手动判定 (blue, your own choice — nothing overwrites it later) |
|
|
26
|
+
| **Ask in conversation** | Ask for 收件箱 / 仓库 / inbox and the assistant searches by words, category, tag, watch-later flag or kind (ten at a time plus a count of the rest, with thumbnails right in the results), then opens one by id (text up to 1000 characters, link, note, tags, attachment facts). To look at one yourself: expand 「N 次工具调用」 above the answer and press 打开 ↗ — the 仓库 tab opens on that record |
|
|
27
|
+
| **Looking at a picture** | Image bytes stay out of the conversation by default; when you ask "look at this picture and tell me what it is", the assistant sends that one image to itself — explicitly, per call |
|
|
28
|
+
| **Credentials are safe** | A credential's body is **encrypted at rest** with a key derived from your master password; neither the password nor the key is ever written down. The list shows only the name you gave it; plain text never reaches a conversation or a model |
|
|
29
|
+
| **Two-way sync** | Point it at a WebDAV folder or an S3 bucket: changes are pushed a few seconds after you make them, 刷新 runs a full sync (push, then pull, merged per record by `id` + timestamp), and emptying the recycle bin deletes the cloud copies too. Two machines see each other when they share one 「目录」 (blank, `/` and `inbox` are the same) |
|
|
30
|
+
| **Conversation cards** | Tool results render as dsh-inbox cards — links become clickable, image markers become thumbnails drawn on your machine |
|
|
31
|
+
| **Gateway quirks** | Some object-storage gateways bind each AccessKey to an "application" and identify clients by a header (refusing you with the same status a wrong password gets) — the plugin keeps **one client identity per protocol** for exactly that |
|
|
32
|
+
|
|
33
|
+
## Screenshots
|
|
34
|
+
|
|
35
|
+

|
|
36
|
+
|
|
37
|
+
It all lives inside dsh: the left rail gains an **Inbox** entry that opens a full-page vault, and the panel's top right has 设置 (settings) and 使用手册 (a short manual).
|
|
38
|
+
|
|
39
|
+
## Two ways to use it
|
|
40
|
+
|
|
41
|
+
**① File something from the conversation**
|
|
42
|
+
|
|
43
|
+
Type `/inbox` in the composer followed by text or a link, and attach images directly — **this command never reaches the model**, it only goes into the vault. It is the way to file credentials and throwaway links that have no business appearing in a conversation.
|
|
44
|
+
|
|
45
|
+
**② Ask for it later**
|
|
46
|
+
|
|
47
|
+
No command needed, just talk:
|
|
48
|
+
|
|
49
|
+
> which of my saved images is the mini-program code?
|
|
50
|
+
>
|
|
51
|
+
> show me that article about caching I saved last week
|
|
52
|
+
>
|
|
53
|
+
> list the links in my inbox I haven't read yet
|
|
54
|
+
|
|
55
|
+
Two questions in the same conversation, on a real machine:
|
|
56
|
+
|
|
57
|
+

|
|
58
|
+
|
|
59
|
+

|
|
60
|
+
|
|
61
|
+
## Install
|
|
62
|
+
|
|
63
63
|
Needs Node ≥ 22 and a working `dsh`. `dsh plugin add` forwards to pnpm, so the installer brings pnpm along when your machine does not have it:
|
|
64
|
-
|
|
65
|
-
**Platform**: fully accepted on **Windows** only so far; macOS and Linux are **not verified yet** (no platform-specific dependency in the code — try it and tell me how it goes).
|
|
66
|
-
|
|
64
|
+
|
|
65
|
+
**Platform**: fully accepted on **Windows** only so far; macOS and Linux are **not verified yet** (no platform-specific dependency in the code — try it and tell me how it goes).
|
|
66
|
+
|
|
67
67
|
`dsh web` is just `dsh --profile web`, so install into the profile you already start:
|
|
68
68
|
|
|
69
69
|
```powershell
|
|
@@ -94,78 +94,85 @@ dsh --profile inbox --no-open --port 3102 # start it there
|
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
Other flags: `--profile <name>` installs elsewhere, `--install-pnpm` installs pnpm first when it is missing (the two commands above already carry it), `--no-default` leaves the default preset alone, `--help` lists everything. Which profile you install into only decides **where the panel runs** — the agent preset is shared by every profile (`~/.dsh/.agent-presets/inbox/`), so installing into a second one just fills in the missing row.
|
|
97
|
-
|
|
98
|
-
### From a local checkout
|
|
99
|
-
|
|
100
|
-
```powershell
|
|
101
|
-
git clone <this repo> dsh-inbox ; cd dsh-inbox
|
|
102
|
-
pnpm install ; pnpm build
|
|
103
|
-
node lib/cli.js init --package <absolute path to this repo>
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### Uninstall
|
|
107
|
-
|
|
108
|
-
```powershell
|
|
97
|
+
|
|
98
|
+
### From a local checkout
|
|
99
|
+
|
|
100
|
+
```powershell
|
|
101
|
+
git clone <this repo> dsh-inbox ; cd dsh-inbox
|
|
102
|
+
pnpm install ; pnpm build
|
|
103
|
+
node lib/cli.js init --package <absolute path to this repo>
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Uninstall
|
|
107
|
+
|
|
108
|
+
```powershell
|
|
109
109
|
# 1. remove the package from the profile you installed it into
|
|
110
110
|
# (also drops it from dsh.profile.bundles)
|
|
111
111
|
dsh plugin --profile <that profile> remove @chance722/dsh-inbox
|
|
112
|
-
|
|
113
|
-
# 2. delete what init created
|
|
114
|
-
rm -r ~/.dsh/.agent-presets/inbox # the preset copy
|
|
115
|
-
# default preset: delete agent-presets.default in ~/.dsh/settings.yaml (falls back to the
|
|
116
|
-
# deployment default) or set it to standard; every init left a settings.yaml.bak-* backup
|
|
117
|
-
|
|
112
|
+
|
|
113
|
+
# 2. delete what init created
|
|
114
|
+
rm -r ~/.dsh/.agent-presets/inbox # the preset copy
|
|
115
|
+
# default preset: delete agent-presets.default in ~/.dsh/settings.yaml (falls back to the
|
|
116
|
+
# deployment default) or set it to standard; every init left a settings.yaml.bak-* backup
|
|
117
|
+
|
|
118
118
|
# 3. and the profile itself, if you made one just for this
|
|
119
119
|
rm -r ~/.dsh/profiles/<that profile>
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**Uninstalling does not delete your vault.** To remove the records too: `rm -r ~/.dsh/storages/dsh_inbox`.
|
|
123
|
-
|
|
124
|
-
## Where things live
|
|
125
|
-
|
|
126
|
-
All of it on your machine (`%DSH_HOME%`, i.e. `C:\Users\<you>\.dsh` on Windows):
|
|
127
|
-
|
|
128
|
-
| What | Where |
|
|
129
|
-
|---|---|
|
|
130
|
-
| Records: text, links, category, note, tags, watch-later… | `storages\dsh_inbox\items\*.json`, one file each |
|
|
131
|
-
| Attachment index (mime / size / original name) | `storages\dsh_inbox\attachments\*.json` |
|
|
132
|
-
| The **bytes** of images, videos and files | `attachments\` — dsh's own content-addressed store, never auto-deleted |
|
|
133
|
-
| Remote password / S3 AccessKey Secret | dsh's credential store, `.credentials.yaml` |
|
|
134
|
-
| Remote settings (URL, bucket, client identity…) | dsh's own settings |
|
|
135
|
-
|
|
136
|
-
### What the remote looks like
|
|
137
|
-
|
|
138
|
-
With a remote configured and `/inbox` as the directory:
|
|
139
|
-
|
|
140
|
-
| Remote path | What it is |
|
|
141
|
-
|---|---|
|
|
142
|
-
| `inbox/<whatever you drop>` | The **drop folder**: any device drops files here and this one ingests them |
|
|
143
|
-
| `inbox/sync/items/<record id>.json` | One record, **machine-readable** — the source of truth for sync |
|
|
144
|
-
| `inbox/sync/items/<record id>.txt` | The same record, **readable** (text, note, which attachments it points at) |
|
|
145
|
-
| `inbox/sync/attachments/<attachment id>.<ext>` | Attachment **bytes** (images, video, PDFs open as themselves) |
|
|
146
|
-
| `inbox/sync/attachments/<attachment id>.meta.json` | The attachment's metadata (original name, dimensions, size, digest) |
|
|
147
|
-
| A 0-byte key ending in `/` | A folder marker the cloud drive made itself, not us |
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- **
|
|
152
|
-
- **
|
|
153
|
-
- **
|
|
154
|
-
- **
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**Uninstalling does not delete your vault.** To remove the records too: `rm -r ~/.dsh/storages/dsh_inbox`.
|
|
123
|
+
|
|
124
|
+
## Where things live
|
|
125
|
+
|
|
126
|
+
All of it on your machine (`%DSH_HOME%`, i.e. `C:\Users\<you>\.dsh` on Windows):
|
|
127
|
+
|
|
128
|
+
| What | Where |
|
|
129
|
+
|---|---|
|
|
130
|
+
| Records: text, links, category, note, tags, watch-later… | `storages\dsh_inbox\items\*.json`, one file each |
|
|
131
|
+
| Attachment index (mime / size / original name) | `storages\dsh_inbox\attachments\*.json` |
|
|
132
|
+
| The **bytes** of images, videos and files | `attachments\` — dsh's own content-addressed store, never auto-deleted |
|
|
133
|
+
| Remote password / S3 AccessKey Secret | dsh's credential store, `.credentials.yaml` |
|
|
134
|
+
| Remote settings (URL, bucket, client identity…) | dsh's own settings |
|
|
135
|
+
|
|
136
|
+
### What the remote looks like
|
|
137
|
+
|
|
138
|
+
With a remote configured and `/inbox` as the directory:
|
|
139
|
+
|
|
140
|
+
| Remote path | What it is |
|
|
141
|
+
|---|---|
|
|
142
|
+
| `inbox/<whatever you drop>` | The **drop folder**: any device drops files here and this one ingests them |
|
|
143
|
+
| `inbox/sync/items/<record id>.json` | One record, **machine-readable** — the source of truth for sync |
|
|
144
|
+
| `inbox/sync/items/<record id>.txt` | The same record, **readable** (text, note, which attachments it points at) |
|
|
145
|
+
| `inbox/sync/attachments/<attachment id>.<ext>` | Attachment **bytes** (images, video, PDFs open as themselves) |
|
|
146
|
+
| `inbox/sync/attachments/<attachment id>.meta.json` | The attachment's metadata (original name, dimensions, size, digest) |
|
|
147
|
+
| A 0-byte key ending in `/` | A folder marker the cloud drive made itself, not us |
|
|
148
|
+
|
|
149
|
+
### How syncing works
|
|
150
|
+
|
|
151
|
+
- **Automatic**: a push goes out a few seconds after a capture or an edit (debounced — several quick saves become one push). 「刷新」 is a full sync: push → pull → re-read the list.
|
|
152
|
+
- **Merging**: incoming records are settled one by one by `id` + timestamp — the newer write wins, no conflict copies. Attachment bytes come down when a record needs them.
|
|
153
|
+
- **Two machines**: they see each other when both use the same 「目录」 (blank, `/` and `inbox` all mean the same directory). Records a machine left under an older directory can be pulled in by ticking **Merge other sync directories too** in the settings.
|
|
154
|
+
- **Deleting**: 「删除」 only moves a record to the bin, and other devices learn it is gone instead of pushing it back; emptying the bin is what deletes the cloud copy as well.
|
|
155
|
+
|
|
156
|
+
## Privacy and security
|
|
157
|
+
|
|
158
|
+
- **Credentials are encrypted at rest**: the body is stored as ciphertext (AES-256-GCM, key derived from your master password). **Neither the password nor the key is ever written down** — the vault locks again on every restart and you unlock it under 设置 → 账密加密; a forgotten password means unrecoverable ciphertext. With no master password set, a credential is **refused rather than stored in the clear**.
|
|
159
|
+
- **What that covers**: only the **body** of credential records. Notes, categories, tags, timestamps and attachment **bytes** are not encrypted — a key inside a pasted file is still a key inside a file.
|
|
160
|
+
- **Masked where it matters**: a credential is listed by the name you gave it, and its plain text never reaches a conversation or a model.
|
|
161
|
+
- **Pictures**: classification does send an image to the model (a phone photo of an ID card has the same proportions as any other photo); the conversation gets an `[attachment:id]` marker by default. **The one exception**: when you explicitly ask the assistant to look at a picture, that single image is sent to it — per call, never by default.
|
|
162
|
+
- **The model cannot see your vault** unless you ask it to look, and classification requests are redacted first.
|
|
163
|
+
- **Your remote needs access control**: only credential bodies are ciphertext up there — text, links, notes and attachment bytes are in the clear, and the master password and key never sync.
|
|
164
|
+
|
|
165
|
+
## Development
|
|
166
|
+
|
|
167
|
+
```powershell
|
|
168
|
+
pnpm install
|
|
169
|
+
pnpm build # lib/index.js (host) + lib/client.js (panel) + lib/cli.js (init) + lib/types
|
|
170
|
+
pnpm typecheck
|
|
171
|
+
pnpm test # vitest
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Client-side changes need `pnpm build` and a page reload (dsh's client-hmr reloads it for you); host-side changes need a restart. Details in [docs/help/dev-setup.md](docs/help/dev-setup.md); milestones and acceptance records in the [development bus](docs/feature/dev-bus.md).
|
|
175
|
+
|
|
176
|
+
## License
|
|
177
|
+
|
|
178
|
+
MIT
|