@duckmind/dm-darwin-x64 0.32.9 → 0.33.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/dm +0 -0
- package/extensions/.dm-extensions.json +14 -65
- package/extensions/dm-9router-ext/README.md +142 -0
- package/extensions/dm-9router-ext/package.json +45 -0
- package/extensions/dm-9router-ext/src/index.ts +541 -0
- package/extensions/dm-9router-ext/tsconfig.json +17 -0
- package/extensions/dm-subagents/package-lock.json +3 -3
- package/extensions/dm-tasks/node_modules/.package-lock.json +3 -3
- package/extensions/dm-tasks/node_modules/typebox/build/type/script/mapping.d.mts +2 -2
- package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.d.mts +2 -2
- package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.mjs +2 -2
- package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.d.mts +1 -1
- package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.mjs +1 -1
- package/extensions/dm-tasks/node_modules/typebox/build/type/types/record.d.mts +1 -1
- package/extensions/dm-tasks/node_modules/typebox/package.json +1 -1
- package/extensions/dm-tasks/package-lock.json +3 -3
- package/package.json +1 -1
- package/theme/theme-alps.json +93 -0
- package/extensions/dm-chime/README.md +0 -11
- package/extensions/dm-chime/docs/protocols.md +0 -107
- package/extensions/dm-chime/index.ts +0 -205
- package/extensions/dm-chime/package.json +0 -33
- package/extensions/dm-phone/README.md +0 -24
- package/extensions/dm-phone/index.ts +0 -12
- package/extensions/dm-phone/node_modules/.package-lock.json +0 -29
- package/extensions/dm-phone/node_modules/ws/LICENSE +0 -20
- package/extensions/dm-phone/node_modules/ws/README.md +0 -548
- package/extensions/dm-phone/node_modules/ws/browser.js +0 -8
- package/extensions/dm-phone/node_modules/ws/index.js +0 -22
- package/extensions/dm-phone/node_modules/ws/lib/buffer-util.js +0 -131
- package/extensions/dm-phone/node_modules/ws/lib/constants.js +0 -19
- package/extensions/dm-phone/node_modules/ws/lib/event-target.js +0 -292
- package/extensions/dm-phone/node_modules/ws/lib/extension.js +0 -203
- package/extensions/dm-phone/node_modules/ws/lib/limiter.js +0 -55
- package/extensions/dm-phone/node_modules/ws/lib/permessage-deflate.js +0 -528
- package/extensions/dm-phone/node_modules/ws/lib/receiver.js +0 -760
- package/extensions/dm-phone/node_modules/ws/lib/sender.js +0 -607
- package/extensions/dm-phone/node_modules/ws/lib/stream.js +0 -161
- package/extensions/dm-phone/node_modules/ws/lib/subprotocol.js +0 -62
- package/extensions/dm-phone/node_modules/ws/lib/validation.js +0 -152
- package/extensions/dm-phone/node_modules/ws/lib/websocket-server.js +0 -562
- package/extensions/dm-phone/node_modules/ws/lib/websocket.js +0 -1407
- package/extensions/dm-phone/node_modules/ws/package.json +0 -70
- package/extensions/dm-phone/node_modules/ws/wrapper.mjs +0 -21
- package/extensions/dm-phone/package-lock.json +0 -66
- package/extensions/dm-phone/package.json +0 -35
- package/extensions/dm-phone/phone-session-pool.ts +0 -8
- package/extensions/dm-phone/public/app/attachments.js +0 -233
- package/extensions/dm-phone/public/app/autocomplete-controller.js +0 -81
- package/extensions/dm-phone/public/app/autocomplete.js +0 -135
- package/extensions/dm-phone/public/app/bindings.js +0 -178
- package/extensions/dm-phone/public/app/command-catalog.js +0 -76
- package/extensions/dm-phone/public/app/commands.js +0 -376
- package/extensions/dm-phone/public/app/constants.js +0 -60
- package/extensions/dm-phone/public/app/formatters.js +0 -131
- package/extensions/dm-phone/public/app/handlers.js +0 -442
- package/extensions/dm-phone/public/app/main.js +0 -6
- package/extensions/dm-phone/public/app/markdown.js +0 -105
- package/extensions/dm-phone/public/app/messages.js +0 -418
- package/extensions/dm-phone/public/app/sheet-actions.js +0 -113
- package/extensions/dm-phone/public/app/sheet-navigation.js +0 -19
- package/extensions/dm-phone/public/app/sheets-view.js +0 -287
- package/extensions/dm-phone/public/app/state.js +0 -95
- package/extensions/dm-phone/public/app/tool-rendering.js +0 -562
- package/extensions/dm-phone/public/app/transport.js +0 -176
- package/extensions/dm-phone/public/app/ui.js +0 -417
- package/extensions/dm-phone/public/app.js +0 -1
- package/extensions/dm-phone/public/icon.svg +0 -15
- package/extensions/dm-phone/public/index.html +0 -146
- package/extensions/dm-phone/public/manifest.webmanifest +0 -17
- package/extensions/dm-phone/public/styles.css +0 -1139
- package/extensions/dm-phone/public/sw.js +0 -78
- package/extensions/dm-phone/src/extension/duckmind-models.js +0 -264
- package/extensions/dm-phone/src/extension/phone-args.ts +0 -121
- package/extensions/dm-phone/src/extension/phone-paths.ts +0 -250
- package/extensions/dm-phone/src/extension/phone-quota.ts +0 -188
- package/extensions/dm-phone/src/extension/phone-runtime.ts +0 -154
- package/extensions/dm-phone/src/extension/phone-server-runtime.ts +0 -1217
- package/extensions/dm-phone/src/extension/phone-sessions.ts +0 -139
- package/extensions/dm-phone/src/extension/phone-static.ts +0 -30
- package/extensions/dm-phone/src/extension/phone-tailscale.ts +0 -148
- package/extensions/dm-phone/src/extension/phone-theme.ts +0 -85
- package/extensions/dm-phone/src/extension/register-phone-child-extension.ts +0 -112
- package/extensions/dm-phone/src/extension/register-phone-extension.ts +0 -106
- package/extensions/dm-phone/src/extension/types.ts +0 -73
- package/extensions/dm-phone/src/session-pool/parent-session-worker.ts +0 -882
- package/extensions/dm-phone/src/session-pool/session-pool.ts +0 -470
- package/extensions/dm-phone/src/session-pool/session-worker.ts +0 -739
- package/extensions/dm-phone/src/session-pool/types.ts +0 -111
- package/extensions/dm-phone/src/session-pool/utils.ts +0 -23
- package/extensions/dm-phone/test/duckmind-models.test.js +0 -147
- package/extensions/dm-thinking-timer/LICENSE +0 -21
- package/extensions/dm-thinking-timer/README.md +0 -7
- package/extensions/dm-thinking-timer/package.json +0 -20
- package/extensions/dm-thinking-timer/thinking-timer.ts +0 -250
package/dm
CHANGED
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"status": "ok",
|
|
3
|
-
"prepared_at": "2026-06-
|
|
3
|
+
"prepared_at": "2026-06-05T10:04:54.155498+00:00",
|
|
4
4
|
"managed_entries": [
|
|
5
5
|
{
|
|
6
6
|
"id": "dm-context",
|
|
@@ -78,21 +78,6 @@
|
|
|
78
78
|
],
|
|
79
79
|
"pinned_ref": "558dc831ac4064b58856a9c4dcc4125b17587075"
|
|
80
80
|
},
|
|
81
|
-
{
|
|
82
|
-
"id": "dm-thinking-timer",
|
|
83
|
-
"upstream_name": "pi-thinking-timer",
|
|
84
|
-
"source_url": "https://github.com/xRyul/pi-thinking-timer",
|
|
85
|
-
"upstream_revision": "fca92061d70c1cbe62141fbaf4ca3c19866ac020",
|
|
86
|
-
"target_dir": "extensions/dm-thinking-timer",
|
|
87
|
-
"bundle_mode": "source-package",
|
|
88
|
-
"copied_paths": [
|
|
89
|
-
"README.md",
|
|
90
|
-
"LICENSE",
|
|
91
|
-
"package.json",
|
|
92
|
-
"thinking-timer.ts"
|
|
93
|
-
],
|
|
94
|
-
"pinned_ref": "fca92061d70c1cbe62141fbaf4ca3c19866ac020"
|
|
95
|
-
},
|
|
96
81
|
{
|
|
97
82
|
"id": "dm-ultradex",
|
|
98
83
|
"upstream_name": "pi-multicodex",
|
|
@@ -133,23 +118,6 @@
|
|
|
133
118
|
],
|
|
134
119
|
"pinned_ref": "f80c63c8ff00ae29c1b8c88821c65b4d4ef9da81"
|
|
135
120
|
},
|
|
136
|
-
{
|
|
137
|
-
"id": "dm-phone",
|
|
138
|
-
"upstream_name": "pi-phone",
|
|
139
|
-
"source_url": "https://github.com/MaliNamNam/pi-phone.git",
|
|
140
|
-
"upstream_revision": "196d6ac1a7ab39c80fb230bc036fef960b418f6a",
|
|
141
|
-
"target_dir": "extensions/dm-phone",
|
|
142
|
-
"bundle_mode": "source-package-with-runtime-deps",
|
|
143
|
-
"copied_paths": [
|
|
144
|
-
"README.md",
|
|
145
|
-
"package.json",
|
|
146
|
-
"index.ts",
|
|
147
|
-
"phone-session-pool.ts",
|
|
148
|
-
"src/",
|
|
149
|
-
"public/"
|
|
150
|
-
],
|
|
151
|
-
"pinned_ref": "196d6ac1a7ab39c80fb230bc036fef960b418f6a"
|
|
152
|
-
},
|
|
153
121
|
{
|
|
154
122
|
"id": "dm-ask-user",
|
|
155
123
|
"upstream_name": "ask-user-question",
|
|
@@ -226,20 +194,19 @@
|
|
|
226
194
|
"pinned_ref": "46360329656206d7cab505f65eb5ca31d680e6fe"
|
|
227
195
|
},
|
|
228
196
|
{
|
|
229
|
-
"id": "dm-
|
|
230
|
-
"upstream_name": "pi-
|
|
231
|
-
"source_url": "https://github.com/
|
|
232
|
-
"upstream_revision": "
|
|
233
|
-
"target_dir": "extensions/dm-
|
|
234
|
-
"bundle_mode": "source-package",
|
|
197
|
+
"id": "dm-9router-ext",
|
|
198
|
+
"upstream_name": "pi-9router-ext",
|
|
199
|
+
"source_url": "https://github.com/irfansofyana/pi-9router-ext.git",
|
|
200
|
+
"upstream_revision": "e5c82d549ad7665aae566cda0e9f9cda3daec998",
|
|
201
|
+
"target_dir": "extensions/dm-9router-ext",
|
|
202
|
+
"bundle_mode": "source-package-with-runtime-deps",
|
|
235
203
|
"copied_paths": [
|
|
236
204
|
"README.md",
|
|
237
205
|
"package.json",
|
|
238
|
-
"
|
|
239
|
-
"
|
|
206
|
+
"tsconfig.json",
|
|
207
|
+
"src/"
|
|
240
208
|
],
|
|
241
|
-
"
|
|
242
|
-
"pinned_ref": "58278dcc39029204fa84cc81fc0b5e9dec350f0b"
|
|
209
|
+
"pinned_ref": "e5c82d549ad7665aae566cda0e9f9cda3daec998"
|
|
243
210
|
},
|
|
244
211
|
{
|
|
245
212
|
"id": "dm-design-md",
|
|
@@ -356,15 +323,6 @@
|
|
|
356
323
|
"install_mode": "npm-install",
|
|
357
324
|
"dependency_patches": []
|
|
358
325
|
},
|
|
359
|
-
{
|
|
360
|
-
"id": "dm-thinking-timer",
|
|
361
|
-
"source_dir": "extensions/dm-thinking-timer",
|
|
362
|
-
"staged_dir": "dist/extensions/dm-thinking-timer",
|
|
363
|
-
"bundle_mode": "source-package",
|
|
364
|
-
"dependencies_installed": false,
|
|
365
|
-
"install_mode": "none",
|
|
366
|
-
"dependency_patches": []
|
|
367
|
-
},
|
|
368
326
|
{
|
|
369
327
|
"id": "dm-ultradex",
|
|
370
328
|
"source_dir": "extensions/dm-ultradex",
|
|
@@ -374,15 +332,6 @@
|
|
|
374
332
|
"install_mode": "npm-install",
|
|
375
333
|
"dependency_patches": []
|
|
376
334
|
},
|
|
377
|
-
{
|
|
378
|
-
"id": "dm-phone",
|
|
379
|
-
"source_dir": "extensions/dm-phone",
|
|
380
|
-
"staged_dir": "dist/extensions/dm-phone",
|
|
381
|
-
"bundle_mode": "source-package-with-runtime-deps",
|
|
382
|
-
"dependencies_installed": true,
|
|
383
|
-
"install_mode": "npm-install",
|
|
384
|
-
"dependency_patches": []
|
|
385
|
-
},
|
|
386
335
|
{
|
|
387
336
|
"id": "dm-ask-user",
|
|
388
337
|
"source_dir": "extensions/dm-ask-user",
|
|
@@ -420,10 +369,10 @@
|
|
|
420
369
|
"dependency_patches": []
|
|
421
370
|
},
|
|
422
371
|
{
|
|
423
|
-
"id": "dm-
|
|
424
|
-
"source_dir": "extensions/dm-
|
|
425
|
-
"staged_dir": "dist/extensions/dm-
|
|
426
|
-
"bundle_mode": "source-package",
|
|
372
|
+
"id": "dm-9router-ext",
|
|
373
|
+
"source_dir": "extensions/dm-9router-ext",
|
|
374
|
+
"staged_dir": "dist/extensions/dm-9router-ext",
|
|
375
|
+
"bundle_mode": "source-package-with-runtime-deps",
|
|
427
376
|
"dependencies_installed": false,
|
|
428
377
|
"install_mode": "none",
|
|
429
378
|
"dependency_patches": []
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# dm-9router-ext
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/dm-9router-ext)
|
|
4
|
+
|
|
5
|
+
DM extension for [9router](https://github.com/decolua/9router) — an open-source AI routing proxy.
|
|
6
|
+
|
|
7
|
+
**Install:** `dm install npm:dm-9router-ext`
|
|
8
|
+
|
|
9
|
+
Connects DM to your 9router instance via its OpenAI-compatible API, with dynamic model discovery and interactive configuration.
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Auto-discovery** — Fetches available models and combos from 9router on startup
|
|
14
|
+
- **Dynamic provider** — Registers 9router as a DM provider with live model list
|
|
15
|
+
- **DM-native streaming** — Uses DM's built-in OpenAI completions provider without overriding other providers
|
|
16
|
+
- **Status commands** — `/9router-status`, `/9router-models`, `/9router-config`, `/9router-reload`
|
|
17
|
+
- **User-wide persistence** — Configuration survives new DM instances via `~/.dm/agent/9router-config.json`
|
|
18
|
+
- **Routing detection** — Captures upstream model info from response headers when available
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
### npm (Recommended)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
dm install npm:dm-9router-ext
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Via local path
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Clone or download this repo
|
|
32
|
+
git clone https://github.com/irfansofyana/pi-9router-ext.git
|
|
33
|
+
|
|
34
|
+
# Install locally
|
|
35
|
+
dm install /path/to/dm-9router-ext
|
|
36
|
+
|
|
37
|
+
# Or try without installing
|
|
38
|
+
dm -e /path/to/dm-9router-ext
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Manual (copy to extensions)
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
cp -r dm-9router-ext/src/index.ts ~/.dm/agent/extensions/dm-9router-ext.ts
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Configuration
|
|
48
|
+
|
|
49
|
+
### Environment Variables
|
|
50
|
+
|
|
51
|
+
| Variable | Default | Description |
|
|
52
|
+
|----------|---------|-------------|
|
|
53
|
+
| `NINE_ROUTER_BASE_URL` | `http://localhost:20128` | Your 9router instance URL |
|
|
54
|
+
| `NINE_ROUTER_API_KEY` | — | API key if 9router has `REQUIRE_API_KEY=true` |
|
|
55
|
+
|
|
56
|
+
Set them in your shell profile or prefix your `dm` command:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
NINE_ROUTER_BASE_URL=http://my-vps:20128 NINE_ROUTER_API_KEY=nr-... dm
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Interactive Configuration
|
|
63
|
+
|
|
64
|
+
Use the `/9router-config` command inside DM to set base URL and API key interactively. This is saved to `~/.dm/agent/9router-config.json` and is shared by new DM instances. Environment variables still take precedence when set.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
/9router-config
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Usage
|
|
71
|
+
|
|
72
|
+
### Selecting a 9router Model
|
|
73
|
+
|
|
74
|
+
After the extension loads, 9router models are available in DM's model picker under the dedicated `9router/` provider namespace:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
/model 9router/cc/claude-opus-4-7
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Built-in providers remain separate. To use Ollama Cloud, OpenRouter, opencode-go, etc., select their normal provider/model entries (for example `ollama-cloud/...`), not a `9router/...` model.
|
|
81
|
+
|
|
82
|
+
Or browse interactively:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
/9router-models
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Available Commands
|
|
89
|
+
|
|
90
|
+
| Command | Description |
|
|
91
|
+
|---------|-------------|
|
|
92
|
+
| `/9router-status` | Show connection status, model count, and config |
|
|
93
|
+
| `/9router-models` | Browse and select from available 9router models |
|
|
94
|
+
| `/9router-config` | Interactively configure base URL and API key |
|
|
95
|
+
| `/9router-reload` | Refresh model list from 9router |
|
|
96
|
+
|
|
97
|
+
### Available Tool
|
|
98
|
+
|
|
99
|
+
The LLM can call `ninerouter_status` to check connection status and list models programmatically.
|
|
100
|
+
|
|
101
|
+
## How It Works
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
┌─────────┐ OpenAI-compatible ┌──────────┐ ┌─────────────┐
|
|
105
|
+
│ DM │ ──────────────────────────▶│ 9router │ ──▶ │ Providers │
|
|
106
|
+
│ │ /v1/chat/completions │ (proxy) │ │ (40+) │
|
|
107
|
+
└─────────┘ └──────────┘ └─────────────┘
|
|
108
|
+
│
|
|
109
|
+
│ 1. Fetches /v1/models on startup
|
|
110
|
+
│ 2. Registers as provider "9router"
|
|
111
|
+
│ 3. Uses pi-ai's normal OpenAI implementation for only 9router models
|
|
112
|
+
│ 4. Leaves built-in/non-9router model switching untouched
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Troubleshooting
|
|
116
|
+
|
|
117
|
+
**"Failed to discover models from 9router"**
|
|
118
|
+
- Check that 9router is running: `curl http://localhost:20128/v1/models`
|
|
119
|
+
- Verify `NINE_ROUTER_BASE_URL` points to the correct host/port
|
|
120
|
+
- If `REQUIRE_API_KEY=true`, set `NINE_ROUTER_API_KEY`
|
|
121
|
+
|
|
122
|
+
**"No 9router models discovered"**
|
|
123
|
+
- 9router may have no active providers. Open the dashboard and connect a provider.
|
|
124
|
+
- Use `/9router-reload` to retry discovery.
|
|
125
|
+
|
|
126
|
+
**Models not showing in `/model` selector**
|
|
127
|
+
- Ensure the extension loaded: check for "9router connected" notification on startup
|
|
128
|
+
- Run `/9router-reload` to retry discovery
|
|
129
|
+
- Run `/reload` to refresh extensions
|
|
130
|
+
|
|
131
|
+
**Built-in provider returns 401 after installing this extension**
|
|
132
|
+
- Make sure the active model is the built-in provider (`ollama-cloud/...`, `openrouter/...`, etc.), not a `9router/...` route.
|
|
133
|
+
- Re-run `/login` for the built-in provider if its subscription token expired.
|
|
134
|
+
- This extension only registers provider id `9router`; it does not override built-in providers. If 9router is unreachable, the extension unregisters the `9router` provider instead of leaving an empty/broken provider around.
|
|
135
|
+
|
|
136
|
+
## Similar Projects
|
|
137
|
+
|
|
138
|
+
- [omniroute-pi-extension](https://www.npmjs.com/package/omniroute-pi-extension) — DM extension for OmniRoute (a fork of 9router with additional features)
|
|
139
|
+
|
|
140
|
+
## License
|
|
141
|
+
|
|
142
|
+
MIT
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dm-9router-ext",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "DM extension for 9router AI routing proxy instances",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"duckmind",
|
|
7
|
+
"dm",
|
|
8
|
+
"dm-package",
|
|
9
|
+
"dm-extension",
|
|
10
|
+
"9router",
|
|
11
|
+
"ai-router",
|
|
12
|
+
"openai-proxy"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"author": "Irfan Sofyana <mail@irfansp.dev>",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/que-nguyen/dm.git",
|
|
19
|
+
"directory": "extensions/dm-9router-ext"
|
|
20
|
+
},
|
|
21
|
+
"type": "module",
|
|
22
|
+
"main": "./src/index.ts",
|
|
23
|
+
"files": [
|
|
24
|
+
"src",
|
|
25
|
+
"README.md",
|
|
26
|
+
"package.json",
|
|
27
|
+
"tsconfig.json"
|
|
28
|
+
],
|
|
29
|
+
"scripts": {
|
|
30
|
+
"typecheck": "tsc"
|
|
31
|
+
},
|
|
32
|
+
"pi": {
|
|
33
|
+
"extensions": [
|
|
34
|
+
"./src/index.ts"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"typebox": "*",
|
|
39
|
+
"@mariozechner/pi-coding-agent": "*"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"typescript": "^5.0.0"
|
|
44
|
+
}
|
|
45
|
+
}
|