@adaptiqai/deepseek-harness 0.0.0-stage → 0.2.1

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/README.md CHANGED
@@ -1,3 +1,115 @@
1
- # Temporary Holding Version
1
+ # AdaptiqAI for DeepSeek Harness
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
+ Use your AdaptiqAI workspace in DeepSeek Harness: every model your workspace has lanes on, with native memory that keeps the whole conversation — up to 5 million tokens — and your Knowledge collections in any conversation. You sign in once, or create your account, in the browser; then pick a model and start, all from inside the harness. There are no keys to copy.
4
+
5
+ ![Welcome](docs/screenshots/welcome.jpg)
6
+
7
+ ## Install
8
+
9
+ 1. Open **Plugins** in the sidebar and choose **Add plugin**.
10
+ 2. Enter the package — `@adaptiqai/deepseek-harness`, or the full path to a downloaded `adaptiqai-deepseek-harness-<version>.tgz` — and install it.
11
+ 3. A welcome card asks you to **Connect AdaptiqAI**. Your browser opens; you sign in (or create an account with GitHub, Google or email) and approve, and the harness picks it up by itself.
12
+ 4. A new account has no model yet: the same card shows the models on offer, with price, speed and memory. Choose one and how many lanes (conversations at once), then **Get access** and confirm in the browser. The model appears in the picker as soon as it is active.
13
+
14
+ From a terminal the same is:
15
+
16
+ ```bash
17
+ dsh plugin --profile web add @adaptiqai/deepseek-harness
18
+ ```
19
+
20
+ DeepSeek Harness 0.2.0-rc.2 or a later 0.2 release is required.
21
+
22
+ ## What you get
23
+
24
+ **Your models, set up correctly.** The model picker gets an **AdaptiqAI** group with exactly the models your workspace has lanes on. Each one comes with its real context window, its output limit and its own thinking levels, all read from the server — nothing in the plugin names a model.
25
+
26
+ ![Model picker](docs/screenshots/model-picker.jpg) ![Thinking levels](docs/screenshots/thinking-levels.jpg)
27
+
28
+ **Memory you can see.** A small pill next to the send button shows how much of the conversation AdaptiqAI holds (`NCM · 25k of 5M`). After each answer it shows how much came straight from memory (`24.6k from memory`). Click it to switch the conversation between **Remember** and **Private**, see the last reply's split, and add or remove knowledge.
29
+
30
+ ![Composer](docs/screenshots/composer-from-memory.jpg) ![Memory popover](docs/screenshots/memory-popover.jpg)
31
+
32
+ **Settings → AdaptiqAI.** Your workspace, the models and lanes with live running/waiting counts, memory use split into conversations and knowledge, whether new conversations are saved, and links to the console.
33
+
34
+ ![Settings](docs/screenshots/settings.jpg)
35
+
36
+ **Knowledge.** The Knowledge panel in the sidebar lists your collections. Use one in the open conversation with one click, or drop files to create a new collection; it is attached automatically when it is ready.
37
+
38
+ ![Knowledge](docs/screenshots/knowledge.jpg) ![New collection](docs/screenshots/create-knowledge.jpg)
39
+
40
+ **One model per memory.** AdaptiqAI builds a conversation's memory and each collection for one model, and they only work with that model. The Knowledge panel lists the collections that work with the model you are using first. Collections built for other models appear below, greyed out, each with **Make available for <model>**. A collection can never be added to a conversation on the wrong model. If you switch the model in a conversation whose memory is on another model, a short note above the composer offers **Switch back** or **Start fresh on <model>**.
41
+
42
+ ![Other models' collections](docs/screenshots/knowledge-by-model.jpg) ![Model notice](docs/screenshots/model-notice.jpg)
43
+
44
+ **Notices that say what to do.** If every lane is busy, the harness waits and retries by itself and tells you so. If the workspace has no lanes on a model, you get a **Get access** button. If memory is nearly full, you are told before it fills, with a way to clean up or continue privately. If your sign-in expires, you are asked to sign in again.
45
+
46
+ ![Notices](docs/screenshots/notices.jpg)
47
+
48
+ **`/adaptiq`** in the composer: `status`, `signin`, `private`, `remember`, `knowledge`, `open`, `diagnostics`, `signout`.
49
+
50
+ **Get a model without leaving the harness.** Settings → AdaptiqAI → **Get a model** (or **Get access** on any "no lanes" notice) lists what is on offer. You confirm, and pay when payment is by card, in the browser; the plugin follows the request and shows the model when it is ready.
51
+
52
+ ![Get a model](docs/screenshots/get-a-model.jpg) ![Ready](docs/screenshots/model-ready.jpg)
53
+
54
+ **Conversations as knowledge.** The Knowledge panel's **Conversations** tab lists your other conversations on the same model, newest first. Add one, and this conversation knows what it knew.
55
+
56
+ ![Conversations](docs/screenshots/conversations.jpg)
57
+
58
+ **Agent tools.** Agents can find and attach knowledge (`adaptiq_knowledge`), check shared memory and offer clean-up options (`adaptiq_memory`), and save what they learned as a new collection (`adaptiq_create_knowledge`). Agents never delete anything; clean-up happens in the console.
59
+
60
+ ## How it works
61
+
62
+ - **Requests** go to the AdaptiqAI OpenAI-compatible API. Each request carries the harness conversation id (`X-Adaptiq-Session-Id`), so the server keeps one memory per conversation. Title requests carry no id, so they never fork a saved conversation.
63
+ - **No compaction.** AdaptiqAI keeps the full conversation, so the plugin reports the model's true context window and declines the harness's compaction requests with a plain explanation. Nothing is ever summarised away.
64
+ - **Thinking levels** come from each model's capability card (`adaptiq-model-capabilities-v1`): the levels, the value that turns thinking off, the default and the request field. Models without a card fall back to Low/High/Extra high/Max only when their id names a reasoning model.
65
+ - **Usage** is reported the harness's way: tokens read from memory count as cache reads, so the harness's own counters (cost, cache hit) are right.
66
+ - **Busy and preparing answers** are retried by the harness, honouring the server's `Retry-After`.
67
+
68
+ ## Privacy and security
69
+
70
+ - Sign-in uses the device flow: the plugin shows a short code, you approve in the browser, and the plugin receives a workspace credential. It is stored in the harness credential store (`$DSH_HOME/.credentials.yaml`, readable only by you) and renews itself. Tokens never reach the browser page.
71
+ - The connection appears in the AdaptiqAI console under **API keys** as "DeepSeek Harness on <your computer>"; revoking it there disconnects this computer only.
72
+ - **Private** conversations can still read memory and knowledge, but nothing new is saved.
73
+ - `/adaptiq diagnostics` produces a report without any secrets that you can send to support.
74
+
75
+ ## Headless and CI
76
+
77
+ Without a browser, store an API key from the console under the credential reference `ADAPTIQAI_API_KEY` (for example as an environment variable). The plugin uses it whenever no one is signed in.
78
+
79
+ ## Configuration
80
+
81
+ Everything has a production default. To change something, add a row to your profile's `cordis.patch.yml`:
82
+
83
+ ```yaml
84
+ - id: adaptiq
85
+ name: '@adaptiqai/deepseek-harness'
86
+ config:
87
+ route: adaptiqai # provider id in the model picker
88
+ apiBase: https://api.adaptiqai.com
89
+ consoleUrl: https://memory.adaptiqai.com/memory
90
+ apiKeyEnv: ADAPTIQAI_API_KEY # headless credential reference
91
+ tools: true # agent tools
92
+ progressEvents: true # streamed "preparing" progress
93
+ streamIdleTimeoutSeconds: 900
94
+ ```
95
+
96
+ ## Troubleshooting
97
+
98
+ - **"AdaptiqAI models are hidden — another provider already uses the route".** An older hand-made `adaptiqai` provider exists in your profile (usually an `llm-pi-ai` entry in `cordis.patch.yml`). Remove that entry and restart the harness.
99
+ - **Models missing.** Open Settings → AdaptiqAI and press refresh; the list shows exactly what the workspace has lanes on.
100
+ - Anything else: run `/adaptiq diagnostics` and send the report to support.
101
+
102
+ ## Development
103
+
104
+ ```bash
105
+ pnpm install
106
+ npm run link-dsh # link the locally installed DeepSeek Harness packages for types and tests
107
+ npm run build # lib/index.js (Host), lib/client.js (browser), Typert artifacts
108
+ npm test # unit tests
109
+ ADAPTIQ_LIVE=1 ADAPTIQAI_API_KEY=ak_live_… npx vitest run test/live.test.ts # one short live request
110
+ npm run pack:local # dist/adaptiqai-deepseek-harness-<version>.tgz
111
+ ```
112
+
113
+ Layout: `src/host` (adapter, sign-in, workspace service, Remote controller, command, tools), `src/client` (React UI in the AdaptiqAI design), `src/shared` (wire types), `scripts/remote-spec.mjs` (the Remote namespace; `scripts/gen-typert.mjs` turns it into the Typert artifacts the harness loads).
114
+
115
+ The UI uses PP Frama when it is installed on the computer. The package does not ship PP Frama (its licence does not allow it); otherwise it falls back to Manrope, an SIL Open Font License grotesk embedded in the browser bundle (licence in `assets/fonts/Manrope-OFL.txt`).
@@ -0,0 +1,93 @@
1
+ Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+
8
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,7 @@
1
+ # AdaptiqAI for DeepSeek Harness. One row: the Host half (model provider,
2
+ # sign-in, memory, knowledge tools, /adaptiq) and, through package.json
3
+ # dsh.client, the browser half (settings, composer memory pill, Knowledge,
4
+ # notices).
5
+ - insert:
6
+ - id: adaptiq
7
+ name: '@adaptiqai/deepseek-harness'
package/icon.svg ADDED
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
2
+ <!-- AdaptiqAI cairn on Dark Navy -->
3
+ <rect width="128" height="128" rx="28" fill="#0F1A2E"/>
4
+ <g transform="translate(64 2) scale(0.78)">
5
+ <ellipse cx="0" cy="110" rx="48" ry="14" fill="#D94E3A"/>
6
+ <ellipse cx="-3" cy="78" rx="36" ry="12" fill="#F06650"/>
7
+ <ellipse cx="3" cy="48" rx="26" ry="10" fill="#F4897A"/>
8
+ <ellipse cx="0" cy="22" rx="16" ry="8" fill="#FFFFFF"/>
9
+ </g>
10
+ </svg>