blade-code 0.10.25 → 0.10.26

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 (87) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/chunk-01n8k1jj.js +1 -0
  3. package/dist/{chunk-9tp00s2z.js → chunk-0q4jbbm5.js} +1 -1
  4. package/dist/{chunk-65pe5x3a.js → chunk-1g5h4zv6.js} +1 -1
  5. package/dist/{chunk-763aam58.js → chunk-1hzj6s0f.js} +2 -2
  6. package/dist/{chunk-a0ga35qv.js → chunk-1mh2285d.js} +35 -35
  7. package/dist/{chunk-qvthjzt5.js → chunk-20kg90zt.js} +1 -1
  8. package/dist/{chunk-18n15nn8.js → chunk-35d5gdgw.js} +1 -1
  9. package/dist/{chunk-0t0dsepx.js → chunk-46yg6dfr.js} +2 -2
  10. package/dist/{chunk-ve4wkta1.js → chunk-4aem0m2n.js} +1 -1
  11. package/dist/{chunk-565weg3f.js → chunk-58tpe6nx.js} +2 -2
  12. package/dist/{chunk-saneyjmy.js → chunk-58yqrbey.js} +1 -1
  13. package/dist/{chunk-5xph8r1k.js → chunk-5mtryjjc.js} +1 -1
  14. package/dist/{chunk-wbvs2tv5.js → chunk-5yr2c8gz.js} +2 -2
  15. package/dist/{chunk-58wxa5cj.js → chunk-6axhk4r7.js} +1 -1
  16. package/dist/{chunk-m3ya6rtr.js → chunk-6k74z0eb.js} +2 -2
  17. package/dist/{chunk-kjwc997q.js → chunk-6srz3q5d.js} +1 -1
  18. package/dist/{chunk-mmw7jbxg.js → chunk-7jv8thn1.js} +2 -2
  19. package/dist/{chunk-5dr18jzd.js → chunk-89gswfb2.js} +1 -1
  20. package/dist/{chunk-awwe1rqb.js → chunk-8htfb5zn.js} +2 -2
  21. package/dist/{chunk-r561wfcz.js → chunk-9ka0bdry.js} +1 -1
  22. package/dist/{chunk-5k02rk0f.js → chunk-a4cyec1y.js} +2 -2
  23. package/dist/{chunk-rhcts0qe.js → chunk-aa28p37g.js} +1 -1
  24. package/dist/{chunk-9gtc0kd2.js → chunk-acf5v2fv.js} +2 -2
  25. package/dist/{chunk-4vwyhhjt.js → chunk-b5fegjt7.js} +1 -1
  26. package/dist/chunk-bbjtt28z.js +1 -0
  27. package/dist/{chunk-jx1q1f88.js → chunk-ct2x59pr.js} +1 -1
  28. package/dist/chunk-d9jz1edf.js +100 -0
  29. package/dist/{chunk-pserj9y9.js → chunk-dxgzyy09.js} +1 -1
  30. package/dist/{chunk-xjq1htyt.js → chunk-ebffhjma.js} +2 -2
  31. package/dist/{chunk-15edqtyv.js → chunk-edyxa2jw.js} +1 -1
  32. package/dist/{chunk-qy36y9xc.js → chunk-eqa706gn.js} +2 -2
  33. package/dist/chunk-f88wkyfm.js +1 -0
  34. package/dist/{chunk-rc9rfrws.js → chunk-fbc5zfq7.js} +1 -1
  35. package/dist/chunk-fkwqgqsw.js +1 -0
  36. package/dist/{chunk-m27w377p.js → chunk-fnt1z0y8.js} +1 -1
  37. package/dist/chunk-gahvpbbs.js +1 -0
  38. package/dist/{chunk-fg1t369y.js → chunk-gn37wxwg.js} +1 -1
  39. package/dist/chunk-h2npwqz9.js +10 -0
  40. package/dist/{chunk-7tea6e9y.js → chunk-jt55ct49.js} +2 -2
  41. package/dist/{chunk-xjqcc0nt.js → chunk-k99rbzqw.js} +1 -1
  42. package/dist/{chunk-rb7aayp5.js → chunk-kskg7crs.js} +22 -38
  43. package/dist/{chunk-dbb20rxh.js → chunk-kvd5nexw.js} +1 -1
  44. package/dist/chunk-kwe0a3xw.js +1 -0
  45. package/dist/{chunk-38pr3rjg.js → chunk-m7x4ya6m.js} +1 -1
  46. package/dist/chunk-mqsxghqb.js +1 -0
  47. package/dist/chunk-nar8qz5t.js +1 -0
  48. package/dist/{chunk-5sw8j9ae.js → chunk-nt6xmzk0.js} +1 -1
  49. package/dist/{chunk-nwg0bpex.js → chunk-p6nhdbdw.js} +2 -2
  50. package/dist/{chunk-5tb28pxt.js → chunk-pja0tttq.js} +1 -1
  51. package/dist/{chunk-h61xsxmy.js → chunk-px3t1rxa.js} +2 -2
  52. package/dist/chunk-pyfag66h.js +1 -0
  53. package/dist/chunk-q1papzdc.js +1 -0
  54. package/dist/{chunk-6vhc5gdf.js → chunk-r46ws0q8.js} +2 -2
  55. package/dist/{chunk-eeet612j.js → chunk-rgafk34p.js} +1 -1
  56. package/dist/chunk-rth3jfdq.js +2 -0
  57. package/dist/{chunk-10yas08a.js → chunk-rtktz9v1.js} +232 -231
  58. package/dist/{chunk-vjrn667c.js → chunk-s1khjfye.js} +2 -2
  59. package/dist/{chunk-86g3xxx7.js → chunk-sprjrvn6.js} +1 -1
  60. package/dist/chunk-ss449b56.js +1 -0
  61. package/dist/{chunk-b22x3h7k.js → chunk-tg1mf1tf.js} +1 -1
  62. package/dist/{chunk-qdngw7h1.js → chunk-tnrrnzzv.js} +1 -1
  63. package/dist/chunk-vc2c8wkx.js +2 -0
  64. package/dist/{chunk-qnsj1pp3.js → chunk-vp50e95n.js} +3 -3
  65. package/dist/chunk-wg8p9g0z.js +1 -0
  66. package/dist/chunk-xkb48pvz.js +1 -0
  67. package/dist/{chunk-k89zf5h1.js → chunk-xp44jtsd.js} +1 -1
  68. package/dist/{chunk-whxmvh0n.js → chunk-y2en7qvs.js} +2 -2
  69. package/dist/{chunk-wyq21fev.js → chunk-zs9mwd17.js} +3 -3
  70. package/package.json +1 -1
  71. package/dist/chunk-0qayfsc9.js +0 -2
  72. package/dist/chunk-37bxrzq5.js +0 -1
  73. package/dist/chunk-3mgfa96q.js +0 -1
  74. package/dist/chunk-584eewzf.js +0 -1
  75. package/dist/chunk-6pb6zs96.js +0 -2
  76. package/dist/chunk-7cgbnp1m.js +0 -1
  77. package/dist/chunk-9e244cxx.js +0 -1
  78. package/dist/chunk-axrwmx6e.js +0 -1
  79. package/dist/chunk-bt6xqnbx.js +0 -10
  80. package/dist/chunk-d6qktf17.js +0 -1
  81. package/dist/chunk-eh8gdgfb.js +0 -1
  82. package/dist/chunk-f769xhg0.js +0 -1
  83. package/dist/chunk-fgy8pbk6.js +0 -1
  84. package/dist/chunk-kmf716yy.js +0 -1
  85. package/dist/chunk-mbxffehd.js +0 -1
  86. package/dist/chunk-vbsk6mjn.js +0 -100
  87. package/dist/chunk-w0z7cn13.js +0 -1
@@ -1,2 +1,2 @@
1
- import{Ff as d,Hf as h}from"./chunk-9gtc0kd2.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
- export{q as zc,w as Ac};
1
+ import{Jf as d,Lf as h}from"./chunk-acf5v2fv.js";var q={debug:{alias:"d",type:"string",describe:'Enable debug mode with optional category filtering (e.g., "agent,ui" or "!chat,!loop")',group:"Debug Options:"},model:{type:"string",describe:"Override the current run model using a model config ID (TUI / print / headless)",group:"AI Options:"},print:{alias:"p",type:"boolean",describe:"Print response and exit (useful for pipes)",group:"Output Options:"},headless:{type:"boolean",describe:"Run full agent loop without Ink UI and print all events to the terminal",group:"Output Options:"},"output-format":{alias:["outputFormat"],type:"string",choices:["text","json","stream-json","jsonl"],default:"text",describe:"Output format: --print supports text|json|stream-json; --headless supports text|jsonl",group:"Output Options:"},"json-schema":{alias:["jsonSchema"],type:"string",describe:"Inline JSON Schema for the turn-scoped structured final response",group:"Output Options:"},"output-schema":{alias:["outputSchema"],type:"string",describe:"Path to a JSON Schema file for the structured final response",group:"Output Options:"},"include-partial-messages":{alias:["includePartialMessages"],type:"boolean",describe:"Include partial message chunks as they arrive",group:"Output Options:"},"input-format":{alias:["inputFormat"],type:"string",choices:["text","stream-json"],default:"text",describe:"Input format",group:"Input Options:"},"replay-user-messages":{alias:["replayUserMessages"],type:"boolean",describe:"Re-emit user messages from stdin",group:"Input Options:"},"allowed-tools":{alias:["allowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to allow",group:"Security Options:"},"disallowed-tools":{alias:["disallowedTools"],type:"array",string:!0,describe:"Comma or space-separated list of tool names to deny",group:"Security Options:"},"mcp-config":{alias:["mcpConfig"],type:"array",string:!0,describe:"Load MCP servers from JSON files or strings",group:"MCP Options:"},"system-prompt":{alias:["systemPrompt"],type:"string",describe:"System prompt to use for the session (replaces default)",group:"AI Options:"},"append-system-prompt":{alias:["appendSystemPrompt"],type:"string",describe:"Append a system prompt to the default system prompt",group:"AI Options:"},"max-turns":{alias:["maxTurns"],type:"number",describe:"Maximum conversation turns (-1: unlimited, 0: disable chat, N>0: limit to N turns)",group:"AI Options:",default:void 0},"max-concurrent-tasks":{alias:["maxConcurrentTasks"],type:"number",describe:"Maximum top-level tasks running concurrently in this process",group:"AI Options:",default:void 0},"max-queued-tasks":{alias:["maxQueuedTasks"],type:"number",describe:"Maximum top-level tasks waiting for an admission slot",group:"AI Options:",default:void 0},"permission-mode":{alias:["permissionMode"],type:"string",choices:["default","autoEdit","yolo","plan"],describe:"Permission mode (default: ask for non-read tools, autoEdit: auto-approve edits, yolo: auto-approve all, plan: reserved)",group:"Security Options:"},yolo:{type:"boolean",describe:"Auto-approve all tools (shortcut for --permission-mode=yolo)",group:"Security Options:"},"trust-workspace":{alias:["trustWorkspace"],type:"boolean",describe:"Trust the current workspace before loading project models, MCP, LSP, permissions, or plugins",group:"Security Options:"},continue:{alias:"c",type:"boolean",describe:"Continue the most recent conversation",group:"Session Options:"},resume:{alias:"r",describe:"Resume a conversation - provide a session ID or interactively select a conversation to resume",group:"Session Options:",coerce:(b)=>{if(b===void 0||b===!0||b==="")return"true";return String(b)}},"fork-session":{alias:["forkSession"],type:"boolean",describe:"Create a new session ID when resuming",group:"Session Options:"},settings:{type:"string",describe:"Path to a settings JSON file or JSON string",group:"Configuration:"},"add-dir":{alias:["addDir"],type:"array",string:!0,describe:"Additional directories to allow tool access to",group:"Security Options:"},ide:{type:"boolean",describe:"Automatically connect to IDE on startup",group:"Integration:"},acp:{type:"boolean",describe:"Run in ACP (Agent Client Protocol) mode for IDE integration",group:"Integration:"},"strict-mcp-config":{alias:["strictMcpConfig"],type:"boolean",describe:"Only use MCP servers from --mcp-config",group:"MCP Options:"},"session-id":{alias:["sessionId"],type:"string",describe:"Use a specific session ID for the conversation",group:"Session Options:"},agents:{type:"string",describe:"JSON object defining custom agents",group:"AI Options:"},"setting-sources":{alias:["settingSources"],type:"string",describe:"Comma-separated list of setting sources to load",group:"Configuration:"},"plugin-dir":{alias:["pluginDir"],type:"array",string:!0,describe:"Load plugins from specified directories",group:"Plugin Options:"}},w={scriptName:"blade",usage:"$0 [command] [options]",description:h(),version:d(),locale:"en",showHelpOnFail:!0,demandCommand:!1,recommendCommands:!0,strict:!1};
2
+ export{q as Bc,w as Cc};
@@ -0,0 +1 @@
1
+ import{ud as a}from"./chunk-46yg6dfr.js";import"./chunk-8htfb5zn.js";import"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import"./chunk-s1khjfye.js";import"./chunk-sprjrvn6.js";export{a as createChatServiceAsync};
@@ -1,4 +1,4 @@
1
- import{ka as H}from"./chunk-b22x3h7k.js";import"./chunk-4dnvydyv.js";import{ed as $,kd as T}from"./chunk-wbvs2tv5.js";import"./chunk-v508x7cg.js";import"./chunk-xjqcc0nt.js";import"./chunk-wyq21fev.js";import"./chunk-6pb6zs96.js";import"./chunk-565weg3f.js";import"./chunk-58wxa5cj.js";import"./chunk-r561wfcz.js";import"./chunk-0qayfsc9.js";import{nf as k}from"./chunk-dbb20rxh.js";import"./chunk-awwe1rqb.js";import"./chunk-7tea6e9y.js";import"./chunk-9tp00s2z.js";import"./chunk-9gtc0kd2.js";import"./chunk-6vhc5gdf.js";import"./chunk-qdngw7h1.js";import"./chunk-vjrn667c.js";import"./chunk-86g3xxx7.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
1
+ import{ka as H}from"./chunk-tg1mf1tf.js";import"./chunk-4dnvydyv.js";import{gd as $,md as T}from"./chunk-5yr2c8gz.js";import"./chunk-v508x7cg.js";import"./chunk-k99rbzqw.js";import"./chunk-zs9mwd17.js";import"./chunk-rth3jfdq.js";import"./chunk-58tpe6nx.js";import"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import"./chunk-vc2c8wkx.js";import{rf as k}from"./chunk-kvd5nexw.js";import"./chunk-8htfb5zn.js";import"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import"./chunk-acf5v2fv.js";import"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import"./chunk-sprjrvn6.js";import U from"os";import J from"path";function X(z){return typeof z==="string"?z:void 0}function N(z){if(!Array.isArray(z))return;let q=[];for(let K of z)if(typeof K==="string")q.push(K);else if(K!=null)q.push(String(K));return q}function b(){console.log(`
2
2
  blade mcp
3
3
  `),console.log(`管理 MCP 服务器
4
4
  `),console.log("Commands:"),console.log(" blade mcp add <name> <commandOrUrl> [args...] 添加 MCP 服务器"),console.log(" blade mcp remove <name> 删除 MCP 服务器 [aliases: rm]"),console.log(" blade mcp list 列出所有 MCP 服务器并检查健康状态 [aliases: ls]"),console.log(" blade mcp get <name> 获取服务器详情"),console.log(" blade mcp login <name> 登录远程 MCP OAuth"),console.log(" blade mcp logout <name> 清除远程 MCP OAuth 凭证"),console.log(` blade mcp add-json <name> <json> 从 JSON 字符串添加服务器
@@ -0,0 +1 @@
1
+ import{Ad as a,Bd as b,Cd as c}from"./chunk-7jv8thn1.js";import"./chunk-58tpe6nx.js";import"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import"./chunk-vc2c8wkx.js";import"./chunk-kvd5nexw.js";import"./chunk-8htfb5zn.js";import"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import"./chunk-acf5v2fv.js";import"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import"./chunk-sprjrvn6.js";export{c as snapshotWorkspaceModelResources,b as resolveWorkspaceModelResources,a as cloneWorkspaceModelConfig};
@@ -1,2 +1,2 @@
1
1
  import{clampThinkingLevel as t,getSupportedThinkingLevels as i}from"@earendil-works/pi-ai";var f=["auto","off","minimal","low","medium","high","xhigh","max"];function s(e){return typeof e==="string"&&f.includes(e)}function g(e,o){let n=i(e);if(o!=="auto"&&!n.includes(o))throw Error(`Reasoning effort ${o} is not supported by ${e.name}`);return{selection:o,effective:o==="auto"?t(e,"high"):o,supported:n}}
2
- export{s as wd,g as xd};
2
+ export{s as yd,g as zd};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e}from"./chunk-aa28p37g.js";import"./chunk-acf5v2fv.js";import"./chunk-sprjrvn6.js";export{b as setSkipUntilVersion,d as performUpgrade,c as getUpgradeCommand,e as checkVersionOnStartup,a as checkVersion};
@@ -1,2 +1,2 @@
1
- import{xf as o}from"./chunk-7tea6e9y.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
1
+ import{Bf as o}from"./chunk-jt55ct49.js";async function e(){return o().listProviders()}async function i(r){return o().listModels(r)}
2
2
  export{e as j,i as k};
@@ -0,0 +1,10 @@
1
+ import{f as Q,g as R,h as T,i as W}from"./chunk-vp50e95n.js";import"./chunk-gn37wxwg.js";import"./chunk-edyxa2jw.js";import"./chunk-1g5h4zv6.js";import"./chunk-58yqrbey.js";import"./chunk-rtktz9v1.js";import"./chunk-tg1mf1tf.js";import"./chunk-89gswfb2.js";import"./chunk-1mh2285d.js";import"./chunk-4dnvydyv.js";import"./chunk-d9jz1edf.js";import"./chunk-p6nhdbdw.js";import"./chunk-ebffhjma.js";import{cd as M}from"./chunk-5yr2c8gz.js";import"./chunk-v508x7cg.js";import"./chunk-k99rbzqw.js";import"./chunk-46yg6dfr.js";import"./chunk-1hzj6s0f.js";import"./chunk-fnt1z0y8.js";import"./chunk-7jv8thn1.js";import"./chunk-kskg7crs.js";import"./chunk-5mtryjjc.js";import"./chunk-nt6xmzk0.js";import"./chunk-35d5gdgw.js";import"./chunk-zs9mwd17.js";import"./chunk-rth3jfdq.js";import"./chunk-58tpe6nx.js";import"./chunk-6axhk4r7.js";import"./chunk-9ka0bdry.js";import"./chunk-vc2c8wkx.js";import"./chunk-kvd5nexw.js";import"./chunk-8htfb5zn.js";import"./chunk-jt55ct49.js";import"./chunk-0q4jbbm5.js";import{Jf as J}from"./chunk-acf5v2fv.js";import"./chunk-r46ws0q8.js";import"./chunk-tnrrnzzv.js";import"./chunk-s1khjfye.js";import"./chunk-sprjrvn6.js";import b from"chalk";import H from"open";var $=`
2
+ ____ _ _
3
+ | __ )| | __ _ __| | ___
4
+ | _ \\| |/ _\` |/ _\` |/ _ \\
5
+ | |_) | | (_| | (_| | __/
6
+ |____/|_|\\__,_|\\__,_|\\___|
7
+ `,E={command:"web",describe:"Start Blade server and open web interface",builder:Q,handler:async(X)=>{let F=R(X);if(await M(),!process.env.BLADE_SERVER_PASSWORD)console.log(b.yellow("[WARN] BLADE_SERVER_PASSWORD is not set; server is unsecured.")),console.log(b.gray(` Set this environment variable to enable Basic Auth.
8
+ `));let C=await W.listenAsync(F);if(console.log(b.cyan($)),console.log(b.gray(` v${J()}
9
+ `)),F.hostname==="0.0.0.0"){let q=`http://localhost:${C.port}`;console.log(b.blue.bold(" Local access: "),b.white(q));let Y=T();for(let Z of Y)console.log(b.blue.bold(" Network access: "),b.white(`http://${Z}:${C.port}`));H(q).catch(()=>{})}else{let q=C.url.toString();console.log(b.blue.bold(" Web interface: "),b.white(q)),H(q).catch(()=>{})}console.log(""),console.log(b.gray(` Press Ctrl+C to stop the server.
10
+ `)),await new Promise(()=>{}),await C.stop()}};export{E as webCommand};
@@ -1,3 +1,3 @@
1
- import{Cf as M,zf as N}from"./chunk-9tp00s2z.js";import{Uf as H}from"./chunk-vjrn667c.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
1
+ import{Df as N,Gf as M}from"./chunk-0q4jbbm5.js";import{Yf as H}from"./chunk-s1khjfye.js";import{createModels as _,createProvider as Y,envApiKeyAuth as x,getSupportedThinkingLevels as E}from"@earendil-works/pi-ai";import{anthropicMessagesApi as F}from"@earendil-works/pi-ai/api/anthropic-messages.lazy";import{openAICompletionsApi as U}from"@earendil-works/pi-ai/api/openai-completions.lazy";import{builtinProviders as P}from"@earendil-works/pi-ai/providers/all";var K=/^[a-z][a-z0-9._-]{0,63}$/,z=/^[A-Z_][A-Z0-9_]*$/,s=new Set(["openai-completions","anthropic-messages"]);function B(u){return typeof u==="string"&&s.has(u)}function X(u,$){let h=`modelProviders.${u}`,b=[];if(!K.test(u))b.push(`${h}: id must match ${K.source}`);if(!$.name?.trim())b.push(`${h}: name must not be empty`);if(!B($.wireApi))b.push(`${h}: wireApi must be openai-completions or anthropic-messages`);try{let w=new URL($.baseUrl);if(!["http:","https:"].includes(w.protocol))b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}catch{b.push(`${h}: baseUrl must be an absolute HTTP(S) URL`)}if($.apiKeyEnv!==void 0&&!z.test($.apiKeyEnv))b.push(`${h}: apiKeyEnv must be a valid environment variable name`);if("apiKey"in $)b.push(`${h}: API keys must be stored separately in auth.json`);return b}function J(u,$){let h=$.trim().replace(/\/+$/,"");if(u==="anthropic-messages"&&/\/v1$/i.test(h))return h.slice(0,-3);return h}import{promises as Z}from"node:fs";import j from"node:path";import{Mutex as R}from"async-mutex";import T from"write-file-atomic";class Q{filePath;mutex=new R;constructor(u=j.join(H(),"auth.json")){this.filePath=u}async read(u){return(await this.readAll())[u]}async list(){let u=await this.readAll();return Object.entries(u).map(([$,h])=>({providerId:$,type:h.type}))}async modify(u,$){return this.mutex.runExclusive(async()=>{let h=await this.readAll(),b=h[u],w=await $(b);if(w===void 0)return b;return h[u]=w,await this.writeAll(h),w})}async delete(u){await this.mutex.runExclusive(async()=>{let $=await this.readAll();if(!(u in $))return;delete $[u],await this.writeAll($)})}async readAll(){try{let u=await Z.readFile(this.filePath,"utf8"),$=JSON.parse(u);return $&&typeof $==="object"&&!Array.isArray($)?$:{}}catch(u){if(u.code==="ENOENT")return{};throw u}}async writeAll(u){let $=j.dirname(this.filePath);await Z.mkdir($,{recursive:!0,mode:448}),await Z.chmod($,448),await T(this.filePath,`${JSON.stringify(u,null,2)}
2
2
  `,{mode:384}),await Z.chmod(this.filePath,384)}}var q="openai-compatible",G="anthropic-compatible",D="https://api.openai.com/v1",V="https://api.anthropic.com",A=128000,C=32768,t={input:0,output:0,cacheRead:0,cacheWrite:0},f=["openai","anthropic","deepseek","google","moonshotai","moonshotai-cn","zai","zai-coding-cn"];class L{credentials;models;compatibleModels=new Map;anthropicCompatibleModels=new Map;customProviderConfigs=new Map;customProviderModels=new Map;reservedProviderIds=new Set;constructor(u=new Q){this.credentials=u,this.models=_({credentials:u});for(let $ of P())this.models.setProvider($);this.installOpenAICompatibleProvider(),this.installAnthropicCompatibleProvider();for(let $ of this.models.getProviders())this.reservedProviderIds.add($.id)}async listProviders(){return Promise.all(this.models.getProviders().map(async(u)=>{let $=u.getModels(),h=this.customProviderConfigs.get(u.id),b=this.getFactoryWireApi(u.id);return{id:u.id,name:u.name,modelCount:$.length,defaultBaseUrl:u.baseUrl??$[0]?.baseUrl,supportsApiKey:Boolean(u.auth.apiKey),supportsOAuth:Boolean(u.auth.oauth),configured:b?!1:Boolean(await this.models.checkAuth(u.id)),custom:Boolean(h),factoryWireApi:b,wireApi:h?.wireApi,apiKeyEnv:h?.apiKeyEnv}}))}listModels(u){return this.models.getModels(u).map(($)=>this.toCatalogEntry($))}getModel(u,$){let h=this.models.getModel(u,$);if(!h&&u===q)this.registerOpenAICompatibleModel($),h=this.models.getModel(u,$);if(!h&&u===G)this.registerAnthropicCompatibleModel($),h=this.models.getModel(u,$);if(!h&&this.customProviderConfigs.has(u))this.registerCustomProviderModel(u,$),h=this.models.getModel(u,$);if(!h)throw Error(`Unknown pi-ai model: ${u}/${$}`);return h}resolveConfig(u){let $=this.getModel(u.provider,u.model),h=u.overrides;return{...$,...h?.baseUrl?{baseUrl:J($.api,h.baseUrl)}:{},...h?.maxOutputTokens?{maxTokens:h.maxOutputTokens}:{}}}async setApiKey(u,$){this.requireProvider(u),await this.credentials.modify(u,async()=>({type:"api_key",key:$}))}async clearCredential(u){this.requireProvider(u),await this.credentials.delete(u)}async isConfigured(u){return this.requireProvider(u),Boolean(await this.models.checkAuth(u))}isReservedProviderId(u){return this.reservedProviderIds.has(u)}configureModelProviders(u,$){for(let h of this.customProviderConfigs.keys())this.models.deleteProvider(h);this.customProviderConfigs.clear(),this.customProviderModels.clear();for(let[h,b]of Object.entries(u)){let w=$.filter((k)=>k.provider===h).map((k)=>k.model);this.registerModelProvider(h,b,w)}}registerModelProvider(u,$,h=[]){if(this.isReservedProviderId(u))throw Error(`modelProviders.${u}: built-in provider ids cannot be overridden`);let b=X(u,$);if(b.length>0)throw Error(b.join("; "));let w={...$,name:$.name.trim(),baseUrl:J($.wireApi,$.baseUrl),...$.apiKeyEnv?{apiKeyEnv:$.apiKeyEnv.trim()}:{}};this.customProviderConfigs.set(u,w);let k=new Map;for(let y of new Set(h)){let W=y.trim();if(!W)continue;k.set(W,this.createCompatibleModel(u,W,w.wireApi,w.baseUrl))}this.customProviderModels.set(u,k),this.installCustomProvider(u)}unregisterModelProvider(u){if(!this.customProviderConfigs.has(u))return;this.customProviderConfigs.delete(u),this.customProviderModels.delete(u),this.models.deleteProvider(u)}requireProvider(u){if(!this.models.getProvider(u))throw Error(`Unknown pi-ai provider: ${u}`)}registerOpenAICompatibleModel(u){let $=u.trim();if(!$)throw Error("OpenAI-compatible model ID must not be empty");if(this.compatibleModels.has($))return;let h=this.createCompatibleModel(q,$,"openai-completions",D);this.compatibleModels.set($,h),this.installOpenAICompatibleProvider()}registerAnthropicCompatibleModel(u){let $=u.trim();if(!$)throw Error("Anthropic-compatible model ID must not be empty");if(this.anthropicCompatibleModels.has($))return;let h=this.createCompatibleModel(G,$,"anthropic-messages",V);this.anthropicCompatibleModels.set($,h),this.installAnthropicCompatibleProvider()}registerCustomProviderModel(u,$){let h=$.trim();if(!h)throw Error("Custom provider model ID must not be empty");let b=this.customProviderConfigs.get(u),w=this.customProviderModels.get(u);if(!b||!w||w.has(h))return;w.set(h,this.createCompatibleModel(u,h,b.wireApi,b.baseUrl)),this.installCustomProvider(u)}createCompatibleModel(u,$,h,b){let w=this.models.getModels().filter((y)=>y.provider!==u&&!this.customProviderConfigs.has(y.provider)&&y.id===$),k=f.flatMap((y)=>w.filter((W)=>W.provider===y))[0]??w[0];return{id:$,name:k?.name??$,api:h,provider:u,baseUrl:b,reasoning:k?.reasoning??!1,input:k?[...k.input]:["text"],cost:{...t},contextWindow:k?.contextWindow??A,maxTokens:k?.maxTokens??C,...k?.thinkingLevelMap?{thinkingLevelMap:{...k.thinkingLevelMap}}:{}}}installOpenAICompatibleProvider(){this.models.setProvider(Y({id:q,name:"Custom OpenAI Endpoint",baseUrl:D,auth:{apiKey:x("OpenAI-compatible API key",["OPENAI_COMPATIBLE_API_KEY","BLADE_API_KEY"])},models:[...this.compatibleModels.values()],api:U()}))}installAnthropicCompatibleProvider(){this.models.setProvider(Y({id:G,name:"Custom Anthropic Endpoint",baseUrl:V,auth:{apiKey:x("Anthropic-compatible API key",["ANTHROPIC_API_KEY","BLADE_API_KEY"])},models:[...this.anthropicCompatibleModels.values()],api:F()}))}installCustomProvider(u){let $=this.customProviderConfigs.get(u),h=this.customProviderModels.get(u);if(!$||!h)return;let b=$.apiKeyEnv?[$.apiKeyEnv]:[];this.models.setProvider(Y({id:u,name:$.name,baseUrl:$.baseUrl,auth:{apiKey:x(`${$.name} API key`,b)},models:[...h.values()],api:$.wireApi==="anthropic-messages"?F():U()}))}getFactoryWireApi(u){if(u===q)return"openai-completions";if(u===G)return"anthropic-messages";return}toCatalogEntry(u){return{id:u.id,name:u.name,provider:u.provider,api:u.api,baseUrl:u.baseUrl,reasoning:u.reasoning,supportedReasoningEfforts:E(u),supportedServiceTiers:M(u),supportedResponseVerbosities:N(u),input:[...u.input],contextWindow:u.contextWindow,maxTokens:u.maxTokens,cost:{...u.cost}}}}var S;function hu(){return S??=new L,S}
3
- export{K as tf,X as uf,J as vf,L as wf,hu as xf};
3
+ export{K as xf,X as yf,J as zf,L as Af,hu as Bf};
@@ -1,2 +1,2 @@
1
1
  import{nanoid as q}from"nanoid";var u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function B(j="session",m=21){if(!u.test(j))throw Error(`Invalid session ID prefix: ${j}`);return`${j}-${q(m)}`}
2
- export{B as ld};
2
+ export{B as nd};