@duckmind/dm-darwin-arm64 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.
Files changed (95) hide show
  1. package/dm +0 -0
  2. package/extensions/.dm-extensions.json +14 -65
  3. package/extensions/dm-9router-ext/README.md +142 -0
  4. package/extensions/dm-9router-ext/package.json +45 -0
  5. package/extensions/dm-9router-ext/src/index.ts +541 -0
  6. package/extensions/dm-9router-ext/tsconfig.json +17 -0
  7. package/extensions/dm-subagents/package-lock.json +3 -3
  8. package/extensions/dm-tasks/node_modules/.package-lock.json +3 -3
  9. package/extensions/dm-tasks/node_modules/typebox/build/type/script/mapping.d.mts +2 -2
  10. package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.d.mts +2 -2
  11. package/extensions/dm-tasks/node_modules/typebox/build/type/script/parser.mjs +2 -2
  12. package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.d.mts +1 -1
  13. package/extensions/dm-tasks/node_modules/typebox/build/type/types/number.mjs +1 -1
  14. package/extensions/dm-tasks/node_modules/typebox/build/type/types/record.d.mts +1 -1
  15. package/extensions/dm-tasks/node_modules/typebox/package.json +1 -1
  16. package/extensions/dm-tasks/package-lock.json +3 -3
  17. package/package.json +1 -1
  18. package/theme/theme-alps.json +93 -0
  19. package/extensions/dm-chime/README.md +0 -11
  20. package/extensions/dm-chime/docs/protocols.md +0 -107
  21. package/extensions/dm-chime/index.ts +0 -205
  22. package/extensions/dm-chime/package.json +0 -33
  23. package/extensions/dm-phone/README.md +0 -24
  24. package/extensions/dm-phone/index.ts +0 -12
  25. package/extensions/dm-phone/node_modules/.package-lock.json +0 -29
  26. package/extensions/dm-phone/node_modules/ws/LICENSE +0 -20
  27. package/extensions/dm-phone/node_modules/ws/README.md +0 -548
  28. package/extensions/dm-phone/node_modules/ws/browser.js +0 -8
  29. package/extensions/dm-phone/node_modules/ws/index.js +0 -22
  30. package/extensions/dm-phone/node_modules/ws/lib/buffer-util.js +0 -131
  31. package/extensions/dm-phone/node_modules/ws/lib/constants.js +0 -19
  32. package/extensions/dm-phone/node_modules/ws/lib/event-target.js +0 -292
  33. package/extensions/dm-phone/node_modules/ws/lib/extension.js +0 -203
  34. package/extensions/dm-phone/node_modules/ws/lib/limiter.js +0 -55
  35. package/extensions/dm-phone/node_modules/ws/lib/permessage-deflate.js +0 -528
  36. package/extensions/dm-phone/node_modules/ws/lib/receiver.js +0 -760
  37. package/extensions/dm-phone/node_modules/ws/lib/sender.js +0 -607
  38. package/extensions/dm-phone/node_modules/ws/lib/stream.js +0 -161
  39. package/extensions/dm-phone/node_modules/ws/lib/subprotocol.js +0 -62
  40. package/extensions/dm-phone/node_modules/ws/lib/validation.js +0 -152
  41. package/extensions/dm-phone/node_modules/ws/lib/websocket-server.js +0 -562
  42. package/extensions/dm-phone/node_modules/ws/lib/websocket.js +0 -1407
  43. package/extensions/dm-phone/node_modules/ws/package.json +0 -70
  44. package/extensions/dm-phone/node_modules/ws/wrapper.mjs +0 -21
  45. package/extensions/dm-phone/package-lock.json +0 -66
  46. package/extensions/dm-phone/package.json +0 -35
  47. package/extensions/dm-phone/phone-session-pool.ts +0 -8
  48. package/extensions/dm-phone/public/app/attachments.js +0 -233
  49. package/extensions/dm-phone/public/app/autocomplete-controller.js +0 -81
  50. package/extensions/dm-phone/public/app/autocomplete.js +0 -135
  51. package/extensions/dm-phone/public/app/bindings.js +0 -178
  52. package/extensions/dm-phone/public/app/command-catalog.js +0 -76
  53. package/extensions/dm-phone/public/app/commands.js +0 -376
  54. package/extensions/dm-phone/public/app/constants.js +0 -60
  55. package/extensions/dm-phone/public/app/formatters.js +0 -131
  56. package/extensions/dm-phone/public/app/handlers.js +0 -442
  57. package/extensions/dm-phone/public/app/main.js +0 -6
  58. package/extensions/dm-phone/public/app/markdown.js +0 -105
  59. package/extensions/dm-phone/public/app/messages.js +0 -418
  60. package/extensions/dm-phone/public/app/sheet-actions.js +0 -113
  61. package/extensions/dm-phone/public/app/sheet-navigation.js +0 -19
  62. package/extensions/dm-phone/public/app/sheets-view.js +0 -287
  63. package/extensions/dm-phone/public/app/state.js +0 -95
  64. package/extensions/dm-phone/public/app/tool-rendering.js +0 -562
  65. package/extensions/dm-phone/public/app/transport.js +0 -176
  66. package/extensions/dm-phone/public/app/ui.js +0 -417
  67. package/extensions/dm-phone/public/app.js +0 -1
  68. package/extensions/dm-phone/public/icon.svg +0 -15
  69. package/extensions/dm-phone/public/index.html +0 -146
  70. package/extensions/dm-phone/public/manifest.webmanifest +0 -17
  71. package/extensions/dm-phone/public/styles.css +0 -1139
  72. package/extensions/dm-phone/public/sw.js +0 -78
  73. package/extensions/dm-phone/src/extension/duckmind-models.js +0 -264
  74. package/extensions/dm-phone/src/extension/phone-args.ts +0 -121
  75. package/extensions/dm-phone/src/extension/phone-paths.ts +0 -250
  76. package/extensions/dm-phone/src/extension/phone-quota.ts +0 -188
  77. package/extensions/dm-phone/src/extension/phone-runtime.ts +0 -154
  78. package/extensions/dm-phone/src/extension/phone-server-runtime.ts +0 -1217
  79. package/extensions/dm-phone/src/extension/phone-sessions.ts +0 -139
  80. package/extensions/dm-phone/src/extension/phone-static.ts +0 -30
  81. package/extensions/dm-phone/src/extension/phone-tailscale.ts +0 -148
  82. package/extensions/dm-phone/src/extension/phone-theme.ts +0 -85
  83. package/extensions/dm-phone/src/extension/register-phone-child-extension.ts +0 -112
  84. package/extensions/dm-phone/src/extension/register-phone-extension.ts +0 -106
  85. package/extensions/dm-phone/src/extension/types.ts +0 -73
  86. package/extensions/dm-phone/src/session-pool/parent-session-worker.ts +0 -882
  87. package/extensions/dm-phone/src/session-pool/session-pool.ts +0 -470
  88. package/extensions/dm-phone/src/session-pool/session-worker.ts +0 -739
  89. package/extensions/dm-phone/src/session-pool/types.ts +0 -111
  90. package/extensions/dm-phone/src/session-pool/utils.ts +0 -23
  91. package/extensions/dm-phone/test/duckmind-models.test.js +0 -147
  92. package/extensions/dm-thinking-timer/LICENSE +0 -21
  93. package/extensions/dm-thinking-timer/README.md +0 -7
  94. package/extensions/dm-thinking-timer/package.json +0 -20
  95. 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-04T18:26:42.473665+00:00",
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-chime",
230
- "upstream_name": "pi-chime",
231
- "source_url": "https://github.com/santychuy/pi-setup.git",
232
- "upstream_revision": "58278dcc39029204fa84cc81fc0b5e9dec350f0b",
233
- "target_dir": "extensions/dm-chime",
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
- "index.ts",
239
- "docs/"
206
+ "tsconfig.json",
207
+ "src/"
240
208
  ],
241
- "source_subdir": "extensions/chime",
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-chime",
424
- "source_dir": "extensions/dm-chime",
425
- "staged_dir": "dist/extensions/dm-chime",
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
+ [![npm](https://img.shields.io/npm/v/dm-9router-ext?color=blue)](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
+ }