@operatingtag/dsh-unclesam 0.0.0-stage → 1.0.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/CHANGELOG.md +893 -0
- package/LICENSE +142 -0
- package/README.md +354 -2
- package/client.js +1099 -0
- package/cordis.patch.yml +48 -0
- package/icon.svg +17 -0
- package/index.js +1411 -0
- package/install.cmd +43 -0
- package/install.ps1 +311 -0
- package/lib/cdp.mjs +247 -0
- package/lib/engine.mjs +1412 -0
- package/lib/i18n.mjs +141 -0
- package/lib/prefs.mjs +101 -0
- package/lib/prompt.mjs +518 -0
- package/lib/savings.mjs +131 -0
- package/locale/ar.json +98 -0
- package/locale/az.json +98 -0
- package/locale/bg.json +98 -0
- package/locale/bn.json +98 -0
- package/locale/cs.json +98 -0
- package/locale/da.json +98 -0
- package/locale/de.json +98 -0
- package/locale/el.json +98 -0
- package/locale/en.json +98 -0
- package/locale/es.json +98 -0
- package/locale/fa.json +98 -0
- package/locale/fi.json +98 -0
- package/locale/fr.json +98 -0
- package/locale/he.json +98 -0
- package/locale/hi.json +98 -0
- package/locale/hr.json +98 -0
- package/locale/hu.json +98 -0
- package/locale/id.json +98 -0
- package/locale/it.json +98 -0
- package/locale/ja.json +98 -0
- package/locale/ka.json +98 -0
- package/locale/kk.json +98 -0
- package/locale/km.json +98 -0
- package/locale/ko.json +98 -0
- package/locale/lt.json +98 -0
- package/locale/mr.json +98 -0
- package/locale/ms.json +98 -0
- package/locale/my.json +98 -0
- package/locale/ne.json +98 -0
- package/locale/nl.json +98 -0
- package/locale/no.json +98 -0
- package/locale/pl.json +98 -0
- package/locale/pt.json +98 -0
- package/locale/ro.json +98 -0
- package/locale/ru.json +98 -0
- package/locale/si.json +98 -0
- package/locale/sk.json +98 -0
- package/locale/sl.json +98 -0
- package/locale/sr.json +98 -0
- package/locale/sv.json +98 -0
- package/locale/sw.json +98 -0
- package/locale/ta.json +98 -0
- package/locale/te.json +98 -0
- package/locale/th.json +98 -0
- package/locale/tl.json +98 -0
- package/locale/tr.json +98 -0
- package/locale/uk.json +98 -0
- package/locale/ur.json +98 -0
- package/locale/uz.json +98 -0
- package/locale/vi.json +98 -0
- package/locale/zh.json +98 -0
- package/package.json +73 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
FREE TO USE — NOT FREE TO CHANGE OR SHARE
|
|
3
|
+
|
|
4
|
+
Uncle Sam (dsh-unclesam)
|
|
5
|
+
Copyright (c) 2026 Darren T. Weldon — published under the Operating Tag name
|
|
6
|
+
Contact: @operatingtag
|
|
7
|
+
|
|
8
|
+
☕ Buy me a coffee: https://revolut.me/operatingtag
|
|
9
|
+
(a request, not a condition — see the note at the end)
|
|
10
|
+
|
|
11
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
12
|
+
WHAT THIS MEANS, IN PLAIN ENGLISH
|
|
13
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
14
|
+
|
|
15
|
+
You may install it and use it. That is it, and that is free, forever, for anyone
|
|
16
|
+
acting personally rather than commercially.
|
|
17
|
+
|
|
18
|
+
You may not change it. You may not pass it on. You may not sell it. You may not
|
|
19
|
+
use it in a business. You may not publish a fork of it anywhere.
|
|
20
|
+
|
|
21
|
+
If you want any of those, ask. They are available, for a fee, from Operating Tag.
|
|
22
|
+
|
|
23
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
+
WHAT YOU MAY DO
|
|
25
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
26
|
+
|
|
27
|
+
· install it from its official source and run it
|
|
28
|
+
|
|
29
|
+
· use it for personal, non-commercial purposes, as often as you like
|
|
30
|
+
|
|
31
|
+
· keep it installed for as long as you like
|
|
32
|
+
|
|
33
|
+
· read the source to understand how it works
|
|
34
|
+
|
|
35
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
36
|
+
WHAT YOU MAY NOT DO
|
|
37
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
38
|
+
|
|
39
|
+
· modify it, adapt it, translate it, or create a derivative of it
|
|
40
|
+
|
|
41
|
+
· copy it, distribute it, publish it, mirror it, or make it available to
|
|
42
|
+
anybody else by any means, including over a network
|
|
43
|
+
|
|
44
|
+
· upload it to any code host, package registry, website, forum or chat
|
|
45
|
+
|
|
46
|
+
· sell it, resell it, rent it, charge for it, or charge for access to it
|
|
47
|
+
|
|
48
|
+
· bundle it into anything you supply to another person
|
|
49
|
+
|
|
50
|
+
· use it for any commercial purpose, or in the course of a business
|
|
51
|
+
|
|
52
|
+
· use the name "Uncle Sam" or "Operating Tag" to promote or endorse
|
|
53
|
+
anything, or to suggest a connection that does not exist
|
|
54
|
+
|
|
55
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
56
|
+
THE OFFICIAL SOURCES — ONE RULE THAT MATTERS
|
|
57
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
58
|
+
|
|
59
|
+
There are exactly two places where this software may legitimately be obtained:
|
|
60
|
+
|
|
61
|
+
1. the GitHub repository operated by Operating Tag
|
|
62
|
+
2. the npm package @operatingtag/dsh-unclesam
|
|
63
|
+
|
|
64
|
+
A copy obtained anywhere else is not licensed, whoever supplied it and however
|
|
65
|
+
it was described. If you see this software for sale, it is not being sold by its
|
|
66
|
+
author.
|
|
67
|
+
|
|
68
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
69
|
+
THE LEGAL LICENCE
|
|
70
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
71
|
+
|
|
72
|
+
This work is licensed under the Creative Commons
|
|
73
|
+
Attribution-NonCommercial-NoDerivatives 4.0 International Public License
|
|
74
|
+
("CC BY-NC-ND 4.0").
|
|
75
|
+
|
|
76
|
+
The summary above describes the intent. The licence text below is the binding
|
|
77
|
+
agreement, and where the two appear to differ the licence text governs.
|
|
78
|
+
|
|
79
|
+
Full licence, human-readable summary, and legal code:
|
|
80
|
+
https://creativecommons.org/licenses/by-nc-nd/4.0/
|
|
81
|
+
|
|
82
|
+
Attribution Notice, as required by Section 3(a)(1)(A):
|
|
83
|
+
|
|
84
|
+
Title: Uncle Sam (dsh-unclesam)
|
|
85
|
+
Creator: Darren T. Weldon, publishing as Operating Tag
|
|
86
|
+
Source: the GitHub repository operated by Operating Tag
|
|
87
|
+
Licence: CC BY-NC-ND 4.0
|
|
88
|
+
Changes: none permitted — this is unadapted material
|
|
89
|
+
|
|
90
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
91
|
+
A NOTE ON WHAT THIS LICENCE DOES AND DOES NOT ALLOW
|
|
92
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
93
|
+
|
|
94
|
+
Two points are worth stating plainly, because they are where people get this
|
|
95
|
+
wrong.
|
|
96
|
+
|
|
97
|
+
Non-commercial means non-commercial. Under the licence, "NonCommercial" means
|
|
98
|
+
not primarily intended for or directed towards commercial advantage or monetary
|
|
99
|
+
compensation. A company using this in its business is not a non-commercial use,
|
|
100
|
+
whatever it was told.
|
|
101
|
+
|
|
102
|
+
No derivative works means no derivative works. Reading the source is permitted.
|
|
103
|
+
Changing it is not, and neither is publishing a changed copy. The licence
|
|
104
|
+
expressly withholds permission to share adapted material.
|
|
105
|
+
|
|
106
|
+
If you need either of those rights — commercial use, or the right to modify and
|
|
107
|
+
distribute — they are available under a separate written licence from Operating
|
|
108
|
+
Tag. Ask, and you will get a straight answer and a clear price.
|
|
109
|
+
|
|
110
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
111
|
+
ONGOING DEVELOPMENT
|
|
112
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
113
|
+
|
|
114
|
+
This software is under active development and you should expect bugs. It drives
|
|
115
|
+
a third-party website that changes without notice, and it is not affiliated
|
|
116
|
+
with, endorsed by, or supported by that third party.
|
|
117
|
+
|
|
118
|
+
It is provided as-is and as-available. The disclaimer of warranties in Section 5
|
|
119
|
+
of the licence is not decoration — nothing here is promised to work, to keep
|
|
120
|
+
working, or to be free of defects.
|
|
121
|
+
|
|
122
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
123
|
+
THE ASK
|
|
124
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
125
|
+
|
|
126
|
+
This is written by one person, at night, funded by nothing. Fifty-one languages
|
|
127
|
+
were written out by hand and each was tested until it behaved.
|
|
128
|
+
|
|
129
|
+
If it saved you money or an afternoon:
|
|
130
|
+
|
|
131
|
+
https://revolut.me/operatingtag
|
|
132
|
+
|
|
133
|
+
That is a request. It carries no legal weight, it is not a condition of the
|
|
134
|
+
licence, and ignoring it changes nothing about your rights.
|
|
135
|
+
|
|
136
|
+
═══════════════════════════════════════════════════════════════════════════════
|
|
137
|
+
|
|
138
|
+
Creative Commons is not a party to this licence and provides no legal services.
|
|
139
|
+
The full text of CC BY-NC-ND 4.0 is published by Creative Commons at
|
|
140
|
+
https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode
|
|
141
|
+
|
|
142
|
+
-- Operating Tag, October 2026
|
package/README.md
CHANGED
|
@@ -1,3 +1,355 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Uncle Sam — a harness model provider that drives chat.deepseek.com
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**☕ [Buy me a coffee](https://revolut.me/operatingtag)** — this is written by one person, at night, funded by
|
|
4
|
+
nothing. There is no other revenue model. A star or a bug report is worth just as much.
|
|
5
|
+
|
|
6
|
+
> **This product is ongoing and under active development. Expect bugs.**
|
|
7
|
+
>
|
|
8
|
+
> It works, it is fast, and it has been driven daily for weeks — but it keeps changing, and the browser route
|
|
9
|
+
> depends on a website that changes without telling anyone. If something breaks, a screenshot and the version
|
|
10
|
+
> number is worth more than a description. Pin a version if you depend on it.
|
|
11
|
+
|
|
12
|
+
## Contents
|
|
13
|
+
|
|
14
|
+
- [Installing](#installing)
|
|
15
|
+
- [Why it is built this way](#why-it-is-built-this-way)
|
|
16
|
+
- [Architecture](#architecture)
|
|
17
|
+
- [Tool use is emulated](#tool-use-is-emulated-and-that-is-a-real-limitation)
|
|
18
|
+
- [Configuration](#configuration)
|
|
19
|
+
- [The API-vs-web switch](#the-api-vs-web-switch)
|
|
20
|
+
- [Testing](#testing)
|
|
21
|
+
- [Licence](#licence)
|
|
22
|
+
|
|
23
|
+
Not affiliated with DeepSeek. It drives their public web product exactly as a person would.
|
|
24
|
+
|
|
25
|
+
Adds **`deepseek-web`** as a model provider. A real browser answers each call, so the model runs on the
|
|
26
|
+
web account already open in a tab — no API key, no per-token billing.
|
|
27
|
+
|
|
28
|
+
Replies from the web route are signed **🔴 Uncle Sam**. That name is a joke, not a claim: it marks which
|
|
29
|
+
route answered, and API replies carry no signature at all.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
provider deepseek-web
|
|
33
|
+
models deepseek-chat · deepseek-chat-search · deepseek-reasoner · deepseek-reasoner-search
|
|
34
|
+
status ongoing development — expect bugs
|
|
35
|
+
measured first token ~1.9 s · overhead ~0.6 s · a full turn in ~2.5 s
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Installing
|
|
41
|
+
|
|
42
|
+
Uncle Sam is a **DeepSeek Harness plugin**. It does nothing outside the harness, because it registers a model
|
|
43
|
+
provider, a host route and two client slots. Installing it into anything else will simply do nothing visible.
|
|
44
|
+
|
|
45
|
+
**Requirements**
|
|
46
|
+
|
|
47
|
+
| | |
|
|
48
|
+
|---|---|
|
|
49
|
+
| DeepSeek Harness | any recent build with the plugin manager |
|
|
50
|
+
| Browser | Brave recommended, Edge used automatically when Brave is absent |
|
|
51
|
+
| Node | 22 or newer |
|
|
52
|
+
|
|
53
|
+
**From a package registry, once published**
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm add @operatingtag/dsh-unclesam
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Then add the bundle row to your profile so the harness loads it:
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
# cordis.patch.yml
|
|
63
|
+
- insert:
|
|
64
|
+
- id: dsh-unclesam
|
|
65
|
+
name: '@operatingtag/dsh-unclesam'
|
|
66
|
+
config:
|
|
67
|
+
port: 9222
|
|
68
|
+
defaultModel: deepseek-chat
|
|
69
|
+
autoMinimise: true
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**From a folder**
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
Settings → Plugins → install from a local path
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
pointed at the folder containing `package.json`.
|
|
79
|
+
|
|
80
|
+
**What you should see afterwards**
|
|
81
|
+
|
|
82
|
+
1. **Settings → Uncle Sam** — a page with four status rows and a sign-in button.
|
|
83
|
+
2. **Under the chat box** — `● DeepSeek Harness` or `● Uncle Sam`, click to switch.
|
|
84
|
+
3. **The model list** — `deepseek-chat (web)` and `deepseek-reasoner (web)` beside the API models.
|
|
85
|
+
|
|
86
|
+
**First run**
|
|
87
|
+
|
|
88
|
+
Click **Sign in / open chat**. The browser opens and **stays visible** until you have signed in at
|
|
89
|
+
chat.deepseek.com. After that it minimises itself and you will not see it again. The session lives in your
|
|
90
|
+
browser profile, so no password is stored by the plugin.
|
|
91
|
+
|
|
92
|
+
**Removing it**
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
Settings → Plugins → Uncle Sam → Uninstall
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Nothing else is written outside the browser profile you signed in to.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Why it is built this way
|
|
103
|
+
|
|
104
|
+
The obvious route — call `chat.deepseek.com`'s own HTTP API — was attempted and abandoned, because the
|
|
105
|
+
site makes every message clear two gates:
|
|
106
|
+
|
|
107
|
+
| Gate | What it means |
|
|
108
|
+
|---|---|
|
|
109
|
+
| `/api/v0/chat/create_pow_challenge` | a **proof-of-work** challenge per message |
|
|
110
|
+
| `challenges.cloudflare.com/turnstile` | a bot gate on the origin |
|
|
111
|
+
|
|
112
|
+
Re-implementing either is a losing game: they are obfuscated, they change, and when they change the
|
|
113
|
+
failure looks exactly like a network fault. **The page already solves both for its own requests.**
|
|
114
|
+
|
|
115
|
+
So the adapter never speaks HTTP to the site. It drives the page, and the page does the rest. Auth, PoW
|
|
116
|
+
and Turnstile stop being our problem and cannot break independently of the site itself.
|
|
117
|
+
|
|
118
|
+
**Verified:** a plain `HEAD` to the site returns `403`; the browser path returns answers.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Architecture
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
index.js the adapter: harness StreamChunk ←→ engine
|
|
126
|
+
lib/engine.mjs browser + page: type, send, stream, settle
|
|
127
|
+
lib/cdp.mjs Chrome DevTools Protocol client, zero dependencies
|
|
128
|
+
lib/prompt.mjs flatten messages + tools into one message; recover tool calls from the reply
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Nothing is installed as a dependency. Node 24 ships a global `WebSocket` and `fetch`, which is all CDP
|
|
132
|
+
needs, so the token stream never leaves the host process and there is no IPC hop per delta.
|
|
133
|
+
|
|
134
|
+
### The four failures that shaped the code
|
|
135
|
+
|
|
136
|
+
Each of these was observed, not anticipated, and each is now guarded by a comment at the site.
|
|
137
|
+
|
|
138
|
+
1. **The answer arrived with the previous answer glued to the front.** The reader took the last
|
|
139
|
+
"message-ish" block, and after a failed *New chat* click the previous transcript was still there.
|
|
140
|
+
Fixed twice over: the reset is now *verified* (count of assistant blocks must reach zero), and the
|
|
141
|
+
reader takes a **baseline index** so only blocks created after the prompt can ever be returned.
|
|
142
|
+
|
|
143
|
+
2. **The answer was emitted twice.** The DOM held it once; the adapter's fallback branch re-emitted the
|
|
144
|
+
whole text for a non-prefix change and the consumer appended it. Deltas now emit **only characters
|
|
145
|
+
not yet sent**, computed by longest common prefix. A streaming adapter may never resend text.
|
|
146
|
+
|
|
147
|
+
3. **A `zoompan`-style trap in miniature:** `waitFor` called its probe without a catch, so waiting for the
|
|
148
|
+
browser's debug port died on the first `fetch failed` — the normal state for several seconds.
|
|
149
|
+
A throw inside the poll now means "not ready yet".
|
|
150
|
+
|
|
151
|
+
4. **The tool call JSON leaked into the transcript.** Tool calls are JSON, so a reply beginning with `{`
|
|
152
|
+
or a fence is now *buffered*; prose streams immediately, and only a buffered JSON reply is turned
|
|
153
|
+
into a tool call. `committed text == concatenated deltas` is asserted in the test.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Tool use is emulated, and that is a real limitation
|
|
158
|
+
|
|
159
|
+
A web chat has no structured tool channel. Tools are described in the prompt, and a call is recovered by
|
|
160
|
+
parsing a JSON object out of the reply:
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
{"tool": "get_weather", "arguments": {"city": "Madrid"}}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**This works** — verified returning `get_weather({"city":"Madrid"})` with `finish: tool-calls`.
|
|
167
|
+
|
|
168
|
+
**But it is weaker than native tool calling.** A model that ignores the instruction answers in prose, and
|
|
169
|
+
the harness sees no tool use that turn. For heavy agentic work the API provider is more reliable; this
|
|
170
|
+
provider is best for chat, subagents, compaction, and any turn where the model must be the *web* model.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Configuration
|
|
175
|
+
|
|
176
|
+
`cordis.patch.yml` sets:
|
|
177
|
+
|
|
178
|
+
| key | default | meaning |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `port` | `9222` | the browser's debugging port |
|
|
181
|
+
| `defaultModel` | `deepseek-chat` | used when a call names no model |
|
|
182
|
+
| `showBrowser` | `true` | whether the window is visible while it works |
|
|
183
|
+
|
|
184
|
+
The browser must hold a signed-in `chat.deepseek.com` session. The first call launches Brave on the
|
|
185
|
+
**Default** profile if the port is not already open. If Brave is already running *without* a debugging
|
|
186
|
+
port, the adapter cannot attach and reports that clearly.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## The API-vs-web switch
|
|
191
|
+
|
|
192
|
+
**The model picker is the switch.** There is no second control, because a second control that also
|
|
193
|
+
chose the model would be two sources of truth for one decision.
|
|
194
|
+
|
|
195
|
+
| Pick this model | Provider | DeepThink | Search |
|
|
196
|
+
|---|---|---|---|
|
|
197
|
+
| `DeepSeek Chat (web)` | browser | off | off |
|
|
198
|
+
| `DeepSeek Chat + Search (web)` | browser | off | **on** |
|
|
199
|
+
| `DeepSeek Reasoner (web)` | browser | **on** | off |
|
|
200
|
+
| `DeepSeek Reasoner + Search (web)` | browser | **on** | **on** |
|
|
201
|
+
| any model without `(web)` | the API | — | — |
|
|
202
|
+
|
|
203
|
+
A **WEB** or **API** badge renders beside the model label so the active route is visible at a glance.
|
|
204
|
+
When the label is not recognised the badge renders nothing rather than guessing — a wrong badge would
|
|
205
|
+
be worse than none.
|
|
206
|
+
|
|
207
|
+
### Search is visible in the transcript
|
|
208
|
+
|
|
209
|
+
With a search model, a turn produces **two blocks**:
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
Web search — "What is one technology news headline from today?"
|
|
213
|
+
Sources (4): yna.co.kr · fnnews.com · rthk.hk · sina.com.cn
|
|
214
|
+
Links: https://k.sina.com.cn/article_... http://www.21jingji.com/article_...
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
then the answer that used them. The page does not expose the query it typed internally, so the quoted
|
|
218
|
+
query is the prompt that triggered the search; the sources and links are read from the page after the
|
|
219
|
+
answer settles, from the `cdn.deepseek.com/site-icons/<domain>` favicons and the external citation
|
|
220
|
+
anchors. Because the sources only exist once the answer is finished, **search turns buffer instead of
|
|
221
|
+
streaming**; non-search turns still stream token by token.
|
|
222
|
+
|
|
223
|
+
### The two switches
|
|
224
|
+
|
|
225
|
+
`DeepThink` is the reasoning pass; `Search` lets it read the live web. Both are per-conversation and are
|
|
226
|
+
cleared by *New chat*, which is why the engine sets them **after** the reset and **before** typing. They
|
|
227
|
+
are also re-read after clicking, because a click is a request rather than a result.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Testing
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
node test-adapter.mjs # prose path: contract checks
|
|
235
|
+
node test-adapter.mjs --tools # tool path: JSON must not reach the text channel
|
|
236
|
+
node test-search-adapter.mjs # search path: two blocks, query + sources + answer
|
|
237
|
+
node test-engine.mjs "prompt" # raw engine timings
|
|
238
|
+
DEBUG_WEB_CHAT=1 node test-engine.mjs "prompt" # per-poll trace
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
`test-adapter.mjs` enforces the three rules that matter: a block is opened before any delta, exactly one
|
|
242
|
+
terminal `finish`, and committed text equals the concatenated deltas.
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Verification status
|
|
247
|
+
|
|
248
|
+
| Claim | Evidence |
|
|
249
|
+
|---|---|
|
|
250
|
+
| Engine drives the page end to end | measured across several prompts |
|
|
251
|
+
| Adapter emits a valid chunk sequence | `test-adapter.mjs` — **passes** |
|
|
252
|
+
| Search emits query + sources + answer | `test-search-adapter.mjs` — **passes**, 4 domains + links, 5.0 s |
|
|
253
|
+
| Tool emulation recovers a call | **passes**, `get_weather({"city":"Madrid"})` |
|
|
254
|
+
| Bundle installs and activates | `application: applied`, v1.1.0 |
|
|
255
|
+
| Row composed into the profile | present in `dsh.profile.bundles` |
|
|
256
|
+
| Client half present with `dsh.client` | `client.js` + `platform: web`, `inject` conversation UI |
|
|
257
|
+
| **Model selectable in the GUI** | **not visually verified** — the Web UI answers a bare origin with `dsh web authentication required; reopen the URL printed by dsh web`, and that URL is not recoverable from this session |
|
|
258
|
+
| **The WEB/API badge rendered** | **not visually verified** — same reason |
|
|
259
|
+
| **A live harness turn** | **not run** — needs a model selected in the picker |
|
|
260
|
+
|
|
261
|
+
The last three need the harness restarted by the user and one model chosen; they cannot be closed from
|
|
262
|
+
inside the running session.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Changelog
|
|
267
|
+
|
|
268
|
+
Every released version, newest first, in [CHANGELOG.md](CHANGELOG.md).
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Support
|
|
273
|
+
|
|
274
|
+
Uncle Sam exists to stop you paying per token. If it has saved you money, and you would like to see the
|
|
275
|
+
next one built on hardware that does not run out of memory halfway through, you are welcome to buy me a
|
|
276
|
+
coffee:
|
|
277
|
+
|
|
278
|
+
**[☕ revolut.me/operatingtag](https://revolut.me/operatingtag)**
|
|
279
|
+
|
|
280
|
+
A star on the repo or a useful bug report is worth just as much.
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Licence
|
|
285
|
+
|
|
286
|
+
**CC BY-NC-ND 4.0** — Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.
|
|
287
|
+
Copyright (c) 2026 Darren T. Weldon, published under the Operating Tag name.
|
|
288
|
+
|
|
289
|
+
**The whole deal, in one line: install it and use it, personally, for free. Do not change it, do not share
|
|
290
|
+
it, do not sell it, and do not use it in a business.**
|
|
291
|
+
|
|
292
|
+
That is not open source, and it does not pretend to be. It is a free personal-use grant over software you may
|
|
293
|
+
not copy or modify.
|
|
294
|
+
|
|
295
|
+
### What you may do
|
|
296
|
+
|
|
297
|
+
```
|
|
298
|
+
install it from its official source and run it
|
|
299
|
+
use it for personal, non-commercial purposes
|
|
300
|
+
read the source to understand how it works
|
|
301
|
+
keep it installed for as long as you like
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### What you may not do
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
modify, adapt, translate or create a derivative of it
|
|
308
|
+
copy, distribute, publish, mirror or make it available to anyone else
|
|
309
|
+
upload it to any code host, registry, website, forum or chat
|
|
310
|
+
sell, resell, rent, or charge for it or for access to it
|
|
311
|
+
bundle it into anything you supply to another person
|
|
312
|
+
use it for any commercial purpose, or in the course of a business
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### The official sources
|
|
316
|
+
|
|
317
|
+
**Exactly two places** may legitimately supply this software:
|
|
318
|
+
|
|
319
|
+
```
|
|
320
|
+
the GitHub repository operated by Operating Tag
|
|
321
|
+
the npm package @operatingtag/dsh-unclesam
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
A copy from anywhere else is not licensed, whoever supplied it. **If you see this software for sale, it is not
|
|
325
|
+
being sold by its author.**
|
|
326
|
+
|
|
327
|
+
### If you need more than that
|
|
328
|
+
|
|
329
|
+
Commercial use, and the right to modify and distribute, are available under a **separate written licence**.
|
|
330
|
+
Ask Operating Tag and you will get a straight answer and a clear price.
|
|
331
|
+
|
|
332
|
+
The [LICENSE](LICENSE) file is what actually governs, and it opens with the same summary in plain English
|
|
333
|
+
before the licence text.
|
|
334
|
+
|
|
335
|
+
### The ask
|
|
336
|
+
|
|
337
|
+
This is written by one person, at night, funded by nothing. Fifty-one languages were written out by hand and
|
|
338
|
+
each was tested until it behaved. There is no other revenue model.
|
|
339
|
+
|
|
340
|
+
If it saved you money or an afternoon:
|
|
341
|
+
|
|
342
|
+
**[☕ revolut.me/operatingtag](https://revolut.me/operatingtag)**
|
|
343
|
+
|
|
344
|
+
That is a **request, not a condition.** It carries no legal weight, and ignoring it changes nothing about your
|
|
345
|
+
rights.
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
Uncle Sam is an independent plugin. It is not affiliated with, endorsed by, or supported by DeepSeek.
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
@operatingtag/dsh-unclesam v1.0.0
|
|
353
|
+
Author Operating Tag
|
|
354
|
+
Licence CC BY-NC-ND 4.0 — free to use, not to change, share or sell
|
|
355
|
+
```
|