@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.
Files changed (67) hide show
  1. package/CHANGELOG.md +893 -0
  2. package/LICENSE +142 -0
  3. package/README.md +354 -2
  4. package/client.js +1099 -0
  5. package/cordis.patch.yml +48 -0
  6. package/icon.svg +17 -0
  7. package/index.js +1411 -0
  8. package/install.cmd +43 -0
  9. package/install.ps1 +311 -0
  10. package/lib/cdp.mjs +247 -0
  11. package/lib/engine.mjs +1412 -0
  12. package/lib/i18n.mjs +141 -0
  13. package/lib/prefs.mjs +101 -0
  14. package/lib/prompt.mjs +518 -0
  15. package/lib/savings.mjs +131 -0
  16. package/locale/ar.json +98 -0
  17. package/locale/az.json +98 -0
  18. package/locale/bg.json +98 -0
  19. package/locale/bn.json +98 -0
  20. package/locale/cs.json +98 -0
  21. package/locale/da.json +98 -0
  22. package/locale/de.json +98 -0
  23. package/locale/el.json +98 -0
  24. package/locale/en.json +98 -0
  25. package/locale/es.json +98 -0
  26. package/locale/fa.json +98 -0
  27. package/locale/fi.json +98 -0
  28. package/locale/fr.json +98 -0
  29. package/locale/he.json +98 -0
  30. package/locale/hi.json +98 -0
  31. package/locale/hr.json +98 -0
  32. package/locale/hu.json +98 -0
  33. package/locale/id.json +98 -0
  34. package/locale/it.json +98 -0
  35. package/locale/ja.json +98 -0
  36. package/locale/ka.json +98 -0
  37. package/locale/kk.json +98 -0
  38. package/locale/km.json +98 -0
  39. package/locale/ko.json +98 -0
  40. package/locale/lt.json +98 -0
  41. package/locale/mr.json +98 -0
  42. package/locale/ms.json +98 -0
  43. package/locale/my.json +98 -0
  44. package/locale/ne.json +98 -0
  45. package/locale/nl.json +98 -0
  46. package/locale/no.json +98 -0
  47. package/locale/pl.json +98 -0
  48. package/locale/pt.json +98 -0
  49. package/locale/ro.json +98 -0
  50. package/locale/ru.json +98 -0
  51. package/locale/si.json +98 -0
  52. package/locale/sk.json +98 -0
  53. package/locale/sl.json +98 -0
  54. package/locale/sr.json +98 -0
  55. package/locale/sv.json +98 -0
  56. package/locale/sw.json +98 -0
  57. package/locale/ta.json +98 -0
  58. package/locale/te.json +98 -0
  59. package/locale/th.json +98 -0
  60. package/locale/tl.json +98 -0
  61. package/locale/tr.json +98 -0
  62. package/locale/uk.json +98 -0
  63. package/locale/ur.json +98 -0
  64. package/locale/uz.json +98 -0
  65. package/locale/vi.json +98 -0
  66. package/locale/zh.json +98 -0
  67. 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
- # Temporary Holding Version
1
+ # Uncle Sam — a harness model provider that drives chat.deepseek.com
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
+ **☕ [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
+ ```