@duckmind/dm-darwin-arm64 0.51.1 → 0.51.3

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 CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "status": "ok",
3
- "prepared_at": "2026-07-12T11:45:43.264428+00:00",
3
+ "prepared_at": "2026-07-14T07:10:58.273411+00:00",
4
4
  "managed_entries": [
5
5
  {
6
6
  "id": "dm-context",
@@ -12,6 +12,11 @@
12
12
  "target_dir": "extensions/dm-subagents",
13
13
  "bundle_mode": "source-package-with-runtime-deps"
14
14
  },
15
+ {
16
+ "id": "dm-9router-ext",
17
+ "target_dir": "extensions/dm-9router-ext",
18
+ "bundle_mode": "source-package-with-runtime-deps"
19
+ },
15
20
  {
16
21
  "id": "dm-fff",
17
22
  "target_dir": "extensions/dm-fff",
@@ -229,6 +234,46 @@
229
234
  ]
230
235
  }
231
236
  },
237
+ {
238
+ "id": "dm-9router-ext",
239
+ "staged_dir": "extensions/dm-9router-ext",
240
+ "bundle_mode": "source-package-with-runtime-deps",
241
+ "dependencies_installed": false,
242
+ "dependency_mode": "platform-package-dependency",
243
+ "dependencies_declared": [
244
+ "@duckmind/dm-coding-agent",
245
+ "typebox"
246
+ ],
247
+ "dependency_patches": [
248
+ "dm.extensions ts->js",
249
+ "main ts->js",
250
+ "drop-devDependencies",
251
+ "drop-peerDependencies",
252
+ "drop-scripts",
253
+ "drop-files"
254
+ ],
255
+ "stripped_documentation": [
256
+ "README.md"
257
+ ],
258
+ "javascript_bundle_minify": {
259
+ "tool": "bun build --minify",
260
+ "files": [
261
+ "src/index.js"
262
+ ],
263
+ "file_count": 1,
264
+ "before_bytes": 11057,
265
+ "after_bytes": 5746,
266
+ "externals": [
267
+ "@duckmind/dm-agent-core",
268
+ "@duckmind/dm-ai",
269
+ "@duckmind/dm-coding-agent",
270
+ "@duckmind/dm-tui",
271
+ "@types/node",
272
+ "typebox",
273
+ "typescript"
274
+ ]
275
+ }
276
+ },
232
277
  {
233
278
  "id": "dm-fff",
234
279
  "staged_dir": "extensions/dm-fff",
@@ -0,0 +1,23 @@
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
+ "type": "module",
17
+ "main": "./src/index.js",
18
+ "dm": {
19
+ "extensions": [
20
+ "./src/index.js"
21
+ ]
22
+ }
23
+ }
@@ -0,0 +1,5 @@
1
+ import{chmodSync as v,existsSync as E,mkdirSync as $,readFileSync as w,writeFileSync as S}from"node:fs";import{homedir as k}from"node:os";import{dirname as A,join as K}from"node:path";import{Type as P}from"typebox";var I="http://localhost:20128",T=process.env.NINE_ROUTER_BASE_URL,M=process.env.NINE_ROUTER_API_KEY,f=K(k(),".dm","agent","9router-config.json"),C="9router-config",x="9router-last-route",B=["x-9router-model","x-routed-model","x-actual-model","x-upstream-model","x-provider-model"];function y(e){return e.replace(/\/$/,"")}function _(e){return{baseUrl:y(T||e.baseUrl),apiKey:M||e.apiKey}}function N(){try{if(!E(f))return null;let e=JSON.parse(w(f,"utf8"));if(!e.baseUrl||typeof e.baseUrl!=="string")return null;return{baseUrl:y(e.baseUrl),apiKey:typeof e.apiKey==="string"&&e.apiKey.trim()?e.apiKey.trim():void 0}}catch(e){return console.error("[dm-9router-ext] Failed to load persisted config:",e),null}}function L(e){try{$(A(f),{recursive:!0}),S(f,`${JSON.stringify({baseUrl:e.baseUrl,apiKey:e.apiKey},null,2)}
2
+ `,{mode:384}),v(f,384)}catch(t){console.error("[dm-9router-ext] Failed to persist config:",t)}}function O(){return _(N()||{baseUrl:I,apiKey:void 0})}function j(e){for(let t of e.sessionManager.getEntries()){if(t.type!=="custom"||t.customType!==C)continue;let r=t.data;if(!r?.baseUrl)continue;return _({baseUrl:y(r.baseUrl),apiKey:void 0})}return null}function h(e,t){L(t),e.appendEntry(C,{baseUrl:t.baseUrl})}async function c(e,t){let r={Accept:"application/json"};if(e.apiKey)r.Authorization=`Bearer ${e.apiKey}`;let a=await fetch(`${e.baseUrl}/v1/models`,{method:"GET",headers:r,signal:t});if(!a.ok)throw Error(`9router returned ${a.status}: ${a.statusText}`);return(await a.json()).data||[]}async function U(e,t){try{return await c(e,t),{ok:!0}}catch(r){return{ok:!1,error:r instanceof Error?r.message:String(r)}}}function F(e){return{id:e.id,name:e.owned_by==="combo"?`\uD83D\uDD00 ${e.id}`:e.id,reasoning:!1,input:["text"],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128000,maxTokens:4096,compat:{supportsDeveloperRole:!1,supportsReasoningEffort:!1}}}function g(e,t,r){e.registerProvider("9router",{name:"9router",baseUrl:`${t.baseUrl}/v1`,apiKey:t.apiKey||"9router-no-api-key",api:"openai-completions",models:r.map(F)})}function m(e){e.unregisterProvider("9router")}async function D(e){let t=O(),r=[],a,p,u=!1;try{r=await c(t,AbortSignal.timeout(1500)),u=!0,g(e,t,r)}catch{m(e)}e.on("session_start",async(s,n)=>{let o=j(n);if(!N()&&o){t=o,h(e,t);try{r=await c(t,n.signal),u=!0,g(e,t,r)}catch{u=!1,m(e)}}if(u&&r.length>0)n.ui.notify(`9router connected — ${r.length} models available`,"info")}),e.on("after_provider_response",(s)=>{if(s.status>=400||p!=="9router")return;for(let n of B){let o=s.headers[n];if(!o||typeof o!=="string")continue;a=o,e.appendEntry(x,{model:o,timestamp:Date.now()});break}}),e.on("model_select",async(s)=>{if(p=s.model.provider,p!=="9router")a=void 0}),e.registerCommand("9router-status",{description:"Show 9router connection status and configuration",handler:async(s,n)=>{let o=await U(t,n.signal),d=["\uD83D\uDD17 9router Status","",`Base URL: ${t.baseUrl}`,`API Key: ${t.apiKey?"set":"not set"}`,`Connection: ${o.ok?"\uD83D\uDFE2 connected":`\uD83D\uDD34 ${o.error||"disconnected"}`}`,`Models: ${r.length} available`];if(a)d.push(`Last routed: ${a}`);n.ui.notify(d.join(`
3
+ `),o.ok?"info":"warning")}}),e.registerCommand("9router-models",{description:"Browse 9router available models and combos",handler:async(s,n)=>{if(r.length===0){n.ui.notify("No 9router models discovered. Check connection with /9router-status","warning");return}let o=r.map((i)=>({value:i.id,label:i.owned_by==="combo"?`\uD83D\uDD00 ${i.id}`:i.id})),d=await n.ui.select("Select a 9router model to use:",o.map((i)=>i.label)),l=o.find((i)=>i.label===d)?.value;if(!l)return;e.sendUserMessage(`/model 9router/${l}`,{deliverAs:"followUp"})}}),e.registerCommand("9router-config",{description:"Configure 9router base URL and API key",handler:async(s,n)=>{let o=await U(t,n.signal);n.ui.notify(["Current config:",` Base URL: ${t.baseUrl}`,` API Key: ${t.apiKey?"set":"not set"}`,` Status: ${o.ok?"\uD83D\uDFE2 connected":"\uD83D\uDD34 disconnected"}`,"","Enter new values. Blank keeps the current value."].join(`
4
+ `),"info");let d=await n.ui.input("Base URL",t.baseUrl);if(d===void 0)return;let l=await n.ui.input("API key (blank keeps current, '-' clears):","");if(l===void 0)return;t={baseUrl:y(d.trim()||t.baseUrl),apiKey:l.trim()===""?t.apiKey:l.trim()==="-"?void 0:l.trim()},h(e,t);try{r=await c(t,n.signal),u=!0,g(e,t,r),n.ui.notify(`9router updated — ${r.length} models at ${t.baseUrl}`,"info")}catch(i){u=!1,m(e),n.ui.notify(`Failed to connect: ${i instanceof Error?i.message:String(i)}`,"error")}}}),e.registerCommand("9router-reload",{description:"Reload models from 9router",handler:async(s,n)=>{try{r=await c(t,n.signal),u=!0,g(e,t,r),n.ui.notify(`9router reloaded — ${r.length} models`,"info")}catch(o){u=!1,m(e),n.ui.notify(`Reload failed: ${o instanceof Error?o.message:String(o)}`,"error")}}}),e.registerTool({name:"ninerouter_status",label:"9router Status",description:"Check 9router connection status and list available models",parameters:P.Object({}),async execute(s,n,o,d,l){let i=await U(t,l.signal),b=r.filter((R)=>R.owned_by==="combo");return{content:[{type:"text",text:[`9router: ${i.ok?"connected":`disconnected (${i.error})`}`,`Base URL: ${t.baseUrl}`,`Total models: ${r.length}`,` Regular: ${r.length-b.length}`,` Combos: ${b.length}`,a?`Last routed model: ${a}`:""].filter(Boolean).join(`
5
+ `)}],details:{connected:i.ok,baseUrl:t.baseUrl,modelCount:r.length,comboCount:b.length,lastRoutedModel:a,models:r.map((R)=>R.id)}}}})}export{D as default};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckmind/dm-darwin-arm64",
3
- "version": "0.51.1",
3
+ "version": "0.51.3",
4
4
  "description": "DuckMind (dm) binary payload for darwin arm64",
5
5
  "license": "MIT",
6
6
  "os": [