@leviyuan/lodestar 0.17.0 → 0.17.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
@@ -12,7 +12,7 @@ AI 不是帮手,是倍率。它放大的不是体力,是你 —— 你的直觉
12
12
 
13
13
  在飞书群里使用 Codex、Claude Code 和 DeepSeek Harness。每个群对应一个项目目录和会话,回复、工具调用、提问和后台任务通过飞书卡片展示。
14
14
 
15
- 支持 Codex、GLM Coding Plan、DeepSeek、Claude native 和 DeepSeek Harness 原生后端。账号、模型与 effort 可在群里切换,选择按群保存。
15
+ 支持 Codex、GLM Coding Plan、DeepSeek、OpenRouter、Claude native 和 DeepSeek Harness 原生后端。账号、模型与 effort 可在群里切换,选择按群保存。
16
16
 
17
17
  ## 安装
18
18
 
@@ -130,10 +130,53 @@ tools = "Read,Write,Edit,Bash,Glob,Grep"
130
130
  bin = "/abs/path/to/claude-wrapper" # 可选的 Claude 可执行文件
131
131
  ```
132
132
 
133
- 账号配置使用 `[token_source.glm]`、`[token_source.deepseek]` 等节。GLM 和 DeepSeek 也可以从本机 Claude settings 中识别;识别后由对应 Token Source 注入凭据,避免不同账号的环境变量串用。项目的工具限制只作用于主会话,委派 Agent 使用完整工具集。
133
+ 账号配置使用 `[token_source.glm]`、`[token_source.deepseek]` 等节。GLM、DeepSeekOpenRouter 也可以从本机 Claude settings 中识别;识别后由对应 Token Source 注入凭据,避免不同账号的环境变量串用。项目的工具限制只作用于主会话,委派 Agent 使用完整工具集。
134
+
135
+ `md` / `model` 首页用独立分组展示 `claude`、`codex`、`dsh`:每组都有浅蓝标题栏、边框和 `Agent · 名称` 标题,默认展开,Token Source 行放在组内。选账号后进入模型和 effort 选择。除 OpenRouter 的默认九项外,各来源默认显示接口目录。接口中的模型使用「隐藏 / 显示」,只调整面板可见性,接口新增模型仍会出现。
136
+
137
+ 所有 Token Source 都提供「补录模型」,用于登记接口列表外的模型,并支持「删除」补录记录。记录保存在 `custom_models`;支持端点验证的来源会先验证,无法确认模型能力或 effort 的记录明确显示 `MISS`,不会凭空赋予运行能力。接口后来收录同名模型时自动转为接口项,不重复显示。删除补录记录需要先切换仍选用它的会话;默认模型和辅助模型中指向已删除补录项的配置也会清理。
138
+
139
+ 所有对话卡的模型标识固定为 `claude · 模型名/effort`、`codex · 模型名/effort` 或 `dsh · 模型名/effort`。窗口额度沿用原来的紧凑格式,如 `4.1h·7%·[6.9d·17%]`(重置倒计时与已用百分比);余额显示 `余额 $12.34` 或 `余额 ¥12.34`。缺失或读取失败显示 `MISS`。
140
+
141
+ OpenRouter 通过 Claude Agent SDK 运行。在群内发送 `openrouter-setup <api_key>`,再通过 `model` 面板选择模型和 effort;自建兼容端点用 `openrouter-setup <base_url> <api_key>`。也可在配置文件中添加:
142
+
143
+ ```toml
144
+ [token_source.openrouter]
145
+ agent = "claude"
146
+ api_key = "填写自己的 OpenRouter API key"
147
+ # base_url = "https://openrouter.ai/api" # SDK 自动追加 /v1/messages
148
+ # model = "anthropic/claude-fable-5.1" # 可选:默认运行模型,须获账号目录确认
149
+ # effort = "max" # 可选:仅覆盖默认运行模型的档位
150
+ # models = "anthropic/claude-fable-5.1,moonshotai/kimi-k3" # 可选:自定义可选列表
151
+ # slots = "haiku=anthropic/claude-fable-5.1" # 可选:辅助任务模型,须获账号目录确认且使用相同的 effort 参数模式
152
+ ```
153
+
154
+ OpenRouter 默认可选列表按 [Arena Agent Labs 榜单](https://arena.ai/leaderboard/agent?rankBy=labs) 的 2026-09-08 快照设置:前 12 家各取排名最高的模型,排除 OpenAI、Z.ai / GLM、DeepSeek,保留以下 9 项。
155
+
156
+ | Labs 排名 | 厂商 | OpenRouter 模型 | 默认档位 |
157
+ | --- | --- | --- | --- |
158
+ | 1 | Anthropic | `anthropic/claude-fable-5.1` | max |
159
+ | 3 | Moonshot | `moonshotai/kimi-k3` | max |
160
+ | 4 | Tencent | `tencent/hy4-preview` | high |
161
+ | 7 | Google | `google/gemini-3.8-flash` | high |
162
+ | 8 | SpaceXAI | `x-ai/grok-4.5` | high |
163
+ | 9 | Alibaba | `qwen/qwen3.8-max-0902` | xhigh |
164
+ | 10 | Meta | `meta/muse-spark-1.2` | xhigh |
165
+ | 11 | Xiaomi | `xiaomi/mimo-v2.5-pro` | 模型默认 |
166
+ | 12 | MiniMax | `minimax/minimax-m3` | 模型默认 |
167
+
168
+ 在 `md` / `model` → claude → OpenRouter 中,点「显示模型」选择账号目录中的模型,点每行「隐藏」移出面板列表。可见性自动持久化,不改当前运行模型;全部隐藏后也能继续显示或补录。未配置 `models` 时才使用上述九项;`models = ""` 明确表示没有已显示的接口模型,刷新或重启不会补回默认项。榜单变化不会覆盖用户维护的列表。
169
+
170
+ 候选目录来自 `/api/v1/models/user`,按账号供应商和隐私设置筛选,仅纳入支持文本和工具调用的交互模型;OpenAI、GLM、DeepSeek 及无法保证厂商范围的自动路由不会出现在添加候选中。目录刷新失败显示 `MISS`。显式配置但已下线的模型保留为可删除的 `MISS` 项。
171
+
172
+ effort 按上游声明提供。小米、MiniMax 等没有 effort 选择器的模型使用「模型默认」,实际请求不携带 effort 参数。两种参数模式之间切换时,空闲进程会保存原生会话并在下一轮用新环境恢复;相同模式下继续使用 SDK 热切换。未配置 `model` 时需要通过面板明确选择运行模型。
173
+
174
+ OpenRouter 余额来自 `/api/v1/credits`,按 `total_credits - total_usage` 计算,卡片仅显示 `余额 $…`,不附加 Key 限额或累计消费。现有 Key 已实测返回 200;接口权限和错误以实际响应为准。SDK 使用 Bearer token,并显式清空 `ANTHROPIC_API_KEY`。OpenRouter 官方的兼容保证限于 Anthropic 第一方供应商;上述九项的工具调用、模型与档位参数已做真实验证,验证范围见 [后端说明](docs/claude-agent-backend.md)。
134
175
 
135
176
  DeepSeek Harness 使用独立的 `[token_source.deepseek-harness]` 账号与原生会话。在群内发送 `deepseek-harness-setup <api_key>`,再通过 `model` 面板选择该来源即可启用。自建端点用 `deepseek-harness-setup <base_url> <api_key>`;这里使用原生 API 根地址,不带 `/anthropic`。
136
177
 
178
+ DSH 也支持 GLM Coding Plan:已有 `[token_source.glm]` 时自动复用该账号,在 `md` → dsh → GLM Coding Plan 中选择模型。独立凭据用 `dsh-glm-setup [base_url] <api_key>`,配置节为 `[token_source.dsh-glm]`。它调用 Coding Plan 的 OpenAI 端点,复用 GLM 额度查询;不经过 OpenRouter 或 Claude SDK。账号接口返回的模型都进入列表,当前 DSH 原生目录未声明能力的项显示 `MISS`,也可隐藏和恢复。
179
+
137
180
  ```toml
138
181
  [token_source.deepseek-harness]
139
182
  agent = "dsh"
@@ -6,7 +6,9 @@ import { createUserMessage, ReasoningEffortId } from "@deepseek-ai/dsh-llm";
6
6
  import { SessionLogOffset } from "@deepseek-ai/dsh-session";
7
7
  var name = "lodestar-bridge";
8
8
  var inject = ["agents", "llm", "agentDefaultModel", "sessionPersistence", "tools", "systemPrompt", "userQuestions", "compaction", "shellEnv", "attachments", "sdkAppStartup"];
9
- var PROVIDER = "deepseek-official";
9
+ var PROVIDER = process.env.LODESTAR_DSH_PROVIDER ?? "deepseek-official";
10
+ if (!["deepseek-official", "zai-coding-cn", "zai"].includes(PROVIDER))
11
+ throw new Error(`Unsupported DSH provider: ${PROVIDER}`);
10
12
  var DELEGATION_TOOLS = ["subagent", "subagent_fork", "workflow", "ralph", "send_message"];
11
13
  function apply(ctx) {
12
14
  let root;
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import{resolve as E}from"node:path";import{fileURLToPath as b}from"node:url";async function T(e=process.argv.slice(2)){let n=e.shift()??"";if(!n||n==="help"||n==="--help"||n==="-h"){process.stdout.write(`${w()}
3
- `);return}let t=k();switch(n){case"identities":{let r=await d(t,"GET","/agents/identities");process.stdout.write(e.includes("--json")?`${JSON.stringify(r,null,2)}
4
- `:q(r));return}case"run":await C(t,e);return;case"follow-up":case"followup":await P(t,e);return;case"answer":await A(t,e);return;case"status":{let r=c(e[0],"status requires run_id"),s=await d(t,"GET",`/agents/runs/${encodeURIComponent(r)}`);if(process.stdout.write(S(s)),s.status==="failed"||s.status==="cancelled")process.exitCode=1;return}case"cancel":{let r=c(e[0],"cancel requires run_id"),s=await d(t,"DELETE",`/agents/runs/${encodeURIComponent(r)}`);process.stdout.write(`${JSON.stringify(s)}
5
- `);return}default:throw Error(w())}}async function C(e,n){let t=g(n,!0),r=await y(t),s={identity_ids:t.identityIds,prompt:r,...t.effort?{effort:t.effort}:{}},i=await d(e,"POST","/agents/runs",s);await m(e,i,t.noWait)}async function P(e,n){let t=c(n.shift(),"follow-up requires run_id"),r=g(n,!1),i={prompt:await y(r),...r.identityId?{identity_id:r.identityId}:{},...r.effort?{effort:r.effort}:{}},o=await d(e,"POST",`/agents/runs/${encodeURIComponent(t)}/follow-up`,i);await m(e,o,r.noWait)}async function A(e,n){let t=c(n.shift(),"answer requires run_id"),r="",s="",i=!1,o={};for(let u=0;u<n.length;u++){let a=n[u],f=()=>c(n[++u],`${a} requires a value`);switch(a){case"--identity":case"-i":r=f();break;case"--request":s=f();break;case"--answer":{let p=f(),l=p.indexOf("=");if(l<=0)throw Error("--answer must be question-or-id=value");o[p.slice(0,l)]=p.slice(l+1);break}case"--stdin":i=!0;break;default:throw Error(`unknown answer option: ${a}`)}}if(i){let u=(await _()).trim(),a;try{a=JSON.parse(u)}catch{throw Error("answer stdin must be a JSON object")}if(!a||typeof a!=="object"||Array.isArray(a))throw Error("answer stdin must be a JSON object");for(let[f,p]of Object.entries(a))o[f]=String(p)}if(!s)throw Error("answer requires --request");if(Object.keys(o).length===0)throw Error("answer requires --answer or --stdin");let I=await d(e,"POST",`/agents/runs/${encodeURIComponent(t)}/answer`,{request_id:s,answers:o,...r?{identity_id:r}:{}});await h(e,String(I.run_id??t))}function g(e,n){let t={identityIds:[],identityId:"",effort:"",prompt:"",noWait:!1,readStdin:!1},r=[];for(let s=0;s<e.length;s++){let i=e[s],o=()=>c(e[++s],`${i} requires a value`);switch(i){case"--identity":case"-i":if(n)t.identityIds.push(o());else t.identityId=o();break;case"--effort":t.effort=o();break;case"--prompt":t.prompt=o();break;case"--stdin":t.readStdin=!0;break;case"--no-wait":t.noWait=!0;break;default:if(i.startsWith("-"))throw Error(`unknown option: ${i}`);r.push(i)}}if(t.identityIds=[...new Set(t.identityIds)],n&&t.identityIds.length===0)throw Error("run requires at least one --identity");if(!t.prompt&&r.length)t.prompt=r.join(" ");if(!t.prompt)t.readStdin=!0;return t}async function y(e){let n=e.readStdin?await _():"",t=e.prompt||n;if(!t.trim())throw Error("agent prompt is empty");return t}async function m(e,n,t){let r=String(n.run_id??"");if(!r)throw Error("agent API returned no run_id");if(t){process.stdout.write(`${JSON.stringify(n,null,2)}
6
- `);return}await h(e,r)}async function h(e,n){let t=!1,r=()=>{if(t)return;t=!0,d(e,"DELETE",`/agents/runs/${encodeURIComponent(n)}`).then(()=>process.exit(130),(s)=>{process.stderr.write(`lodestar-agent: cancellation failed: ${$(s)}
7
- `),process.exit(1)})};process.once("SIGINT",r),process.once("SIGTERM",r);try{while(!0){let s=await d(e,"GET",`/agents/runs/${encodeURIComponent(n)}`);if(s.status==="needs_input"||s.status==="completed"||s.status==="failed"||s.status==="cancelled"){if(process.stdout.write(S(s)),s.status==="failed"||s.status==="cancelled")process.exitCode=1;return}await new Promise((i)=>setTimeout(i,1000))}}finally{process.off("SIGINT",r),process.off("SIGTERM",r)}}function k(){if(process.env.DSH_LODESTAR_AGENT_CONTEXT!==void 0){let t=JSON.parse(process.env.DSH_LODESTAR_AGENT_CONTEXT);if(typeof t.baseUrl!=="string"||!t.baseUrl||typeof t.capability!=="string"||!t.capability)throw Error("invalid DSH Lodestar delegation context");return{baseUrl:t.baseUrl.replace(/\/+$/,""),capability:t.capability}}let e=String(process.env.LODESTAR_AGENT_URL??"").replace(/\/+$/,""),n=String(process.env.LODESTAR_AGENT_CAPABILITY??"");if(!e||!n)throw Error("lodestar-agent must run inside a Lodestar-managed Agent session (missing capability)");return{baseUrl:e,capability:n}}async function d(e,n,t,r){let s=await fetch(`${e.baseUrl}${t}`,{method:n,headers:{authorization:`Bearer ${e.capability}`,...r?{"content-type":"application/json"}:{}},...r?{body:JSON.stringify(r)}:{}}),i=await s.text(),o;try{o=JSON.parse(i)}catch{throw Error(`agent API ${n} ${t} returned HTTP ${s.status}: ${i||"(empty)"}`)}if(!s.ok)throw Error(o?.error??`agent API HTTP ${s.status}`);return o}function q(e){let n=[`catalog ${e.catalog_generation??"MISS"}`];for(let t of e.identities??[])n.push([t.status==="ready"?"✅":"MISS",t.id,t.display_name,t.model,`default-effort=${t.default_effort}`,t.source_default?"source-default":"",t.reason??""].filter(Boolean).join(" · "));for(let t of e.source_failures??[])n.push(`MISS · ${t.display} · ${t.reason}`);return`${n.join(`
2
+ import{realpathSync as Z}from"node:fs";import{fileURLToPath as P}from"node:url";async function J(z=process.argv.slice(2)){let B=z.shift()??"";if(!B||B==="help"||B==="--help"||B==="-h"){process.stdout.write(`${_()}
3
+ `);return}let j=R();switch(B){case"identities":{let D=await M(j,"GET","/agents/identities");process.stdout.write(z.includes("--json")?`${JSON.stringify(D,null,2)}
4
+ `:b(D));return}case"run":await S(j,z);return;case"follow-up":case"followup":await A(j,z);return;case"answer":await f(j,z);return;case"status":{let D=Q(z[0],"status requires run_id"),E=await M(j,"GET",`/agents/runs/${encodeURIComponent(D)}`);if(process.stdout.write(O(E)),E.status==="failed"||E.status==="cancelled")process.exitCode=1;return}case"cancel":{let D=Q(z[0],"cancel requires run_id"),E=await M(j,"DELETE",`/agents/runs/${encodeURIComponent(D)}`);process.stdout.write(`${JSON.stringify(E)}
5
+ `);return}default:throw Error(_())}}async function S(z,B){let j=$(B,!0),D=await L(j),E={identity_ids:j.identityIds,prompt:D,...j.effort?{effort:j.effort}:{}},G=await M(z,"POST","/agents/runs",E);await T(z,G,j.noWait)}async function A(z,B){let j=Q(B.shift(),"follow-up requires run_id"),D=$(B,!1),G={prompt:await L(D),...D.identityId?{identity_id:D.identityId}:{},...D.effort?{effort:D.effort}:{}},H=await M(z,"POST",`/agents/runs/${encodeURIComponent(j)}/follow-up`,G);await T(z,H,D.noWait)}async function f(z,B){let j=Q(B.shift(),"answer requires run_id"),D="",E="",G=!1,H={};for(let N=0;N<B.length;N++){let K=B[N],V=()=>Q(B[++N],`${K} requires a value`);switch(K){case"--identity":case"-i":D=V();break;case"--request":E=V();break;case"--answer":{let X=V(),Y=X.indexOf("=");if(Y<=0)throw Error("--answer must be question-or-id=value");H[X.slice(0,Y)]=X.slice(Y+1);break}case"--stdin":G=!0;break;default:throw Error(`unknown answer option: ${K}`)}}if(G){let N=(await W()).trim(),K;try{K=JSON.parse(N)}catch{throw Error("answer stdin must be a JSON object")}if(!K||typeof K!=="object"||Array.isArray(K))throw Error("answer stdin must be a JSON object");for(let[V,X]of Object.entries(K))H[V]=String(X)}if(!E)throw Error("answer requires --request");if(Object.keys(H).length===0)throw Error("answer requires --answer or --stdin");let U=await M(z,"POST",`/agents/runs/${encodeURIComponent(j)}/answer`,{request_id:E,answers:H,...D?{identity_id:D}:{}});await F(z,String(U.run_id??j))}function $(z,B){let j={identityIds:[],identityId:"",effort:"",prompt:"",noWait:!1,readStdin:!1},D=[];for(let E=0;E<z.length;E++){let G=z[E],H=()=>Q(z[++E],`${G} requires a value`);switch(G){case"--identity":case"-i":if(B)j.identityIds.push(H());else j.identityId=H();break;case"--effort":j.effort=H();break;case"--prompt":j.prompt=H();break;case"--stdin":j.readStdin=!0;break;case"--no-wait":j.noWait=!0;break;default:if(G.startsWith("-"))throw Error(`unknown option: ${G}`);D.push(G)}}if(j.identityIds=[...new Set(j.identityIds)],B&&j.identityIds.length===0)throw Error("run requires at least one --identity");if(!j.prompt&&D.length)j.prompt=D.join(" ");if(!j.prompt)j.readStdin=!0;return j}async function L(z){let B=z.readStdin?await W():"",j=z.prompt||B;if(!j.trim())throw Error("agent prompt is empty");return j}async function T(z,B,j){let D=String(B.run_id??"");if(!D)throw Error("agent API returned no run_id");if(j){process.stdout.write(`${JSON.stringify(B,null,2)}
6
+ `);return}await F(z,D)}async function F(z,B){let j=!1,D=()=>{if(j)return;j=!0,M(z,"DELETE",`/agents/runs/${encodeURIComponent(B)}`).then(()=>process.exit(130),(E)=>{process.stderr.write(`lodestar-agent: cancellation failed: ${C(E)}
7
+ `),process.exit(1)})};process.once("SIGINT",D),process.once("SIGTERM",D);try{while(!0){let E=await M(z,"GET",`/agents/runs/${encodeURIComponent(B)}`);if(E.status==="needs_input"||E.status==="completed"||E.status==="failed"||E.status==="cancelled"){if(process.stdout.write(O(E)),E.status==="failed"||E.status==="cancelled")process.exitCode=1;return}await new Promise((G)=>setTimeout(G,1000))}}finally{process.off("SIGINT",D),process.off("SIGTERM",D)}}function R(){if(process.env.DSH_LODESTAR_AGENT_CONTEXT!==void 0){let j=JSON.parse(process.env.DSH_LODESTAR_AGENT_CONTEXT);if(typeof j.baseUrl!=="string"||!j.baseUrl||typeof j.capability!=="string"||!j.capability)throw Error("invalid DSH Lodestar delegation context");return{baseUrl:j.baseUrl.replace(/\/+$/,""),capability:j.capability}}let z=String(process.env.LODESTAR_AGENT_URL??"").replace(/\/+$/,""),B=String(process.env.LODESTAR_AGENT_CAPABILITY??"");if(!z||!B)throw Error("lodestar-agent must run inside a Lodestar-managed Agent session (missing capability)");return{baseUrl:z,capability:B}}async function M(z,B,j,D){let E=await fetch(`${z.baseUrl}${j}`,{method:B,headers:{authorization:`Bearer ${z.capability}`,...D?{"content-type":"application/json"}:{}},...D?{body:JSON.stringify(D)}:{}}),G=await E.text(),H;try{H=JSON.parse(G)}catch{throw Error(`agent API ${B} ${j} returned HTTP ${E.status}: ${G||"(empty)"}`)}if(!E.ok)throw Error(H?.error??`agent API HTTP ${E.status}`);return H}function b(z){let B=[`catalog ${z.catalog_generation??"MISS"}`];for(let j of z.identities??[])B.push([j.status==="ready"?"✅":"MISS",j.id,j.display_name,j.model,`default-effort=${j.default_effort}`,j.source_default?"source-default":"",j.reason??""].filter(Boolean).join(" · "));for(let j of z.source_failures??[])B.push(`MISS · ${j.display} · ${j.reason}`);return`${B.join(`
8
8
  `)}
9
- `}function S(e){let n=[`# Lodestar agent ${e.run_id??"MISS"}`,"",`- Status: ${e.status??"MISS"}`,...e.parent_run_id?[`- Parent: ${e.parent_run_id} (${e.parent_kind??"delegate"})`]:[]];if(e.error)n.push(`- Error: ${e.error}`);for(let t of e.workers??[]){if(n.push("",`## ${t.identity_name??t.identity_id}`,"",`Status: ${t.status}`),t.session_id)n.push(`Session: ${t.session_id}`);if(t.error)n.push("",`Error: ${t.error}`);if(t.pending_input){n.push("",`Input request: ${t.pending_input.request_id}`);for(let r of t.pending_input.questions??[])if(n.push(`- [${r.id}] ${r.question}`),r.options?.length)n.push(` Options: ${r.options.map((s)=>s.label).join(" / ")}`);n.push("","Answer with:",`lodestar-agent answer ${e.run_id} --identity '${t.identity_id}' --request '${t.pending_input.request_id}' --stdin`)}if(t.output)n.push("",t.output)}if(e.presentation_errors?.length)n.push("","Presentation errors:",...e.presentation_errors.map((t)=>`- ${t}`));return`${n.join(`
9
+ `}function O(z){let B=[`# Lodestar agent ${z.run_id??"MISS"}`,"",`- Status: ${z.status??"MISS"}`,...z.parent_run_id?[`- Parent: ${z.parent_run_id} (${z.parent_kind??"delegate"})`]:[]];if(z.error)B.push(`- Error: ${z.error}`);for(let j of z.workers??[]){if(B.push("",`## ${j.identity_name??j.identity_id}`,"",`Status: ${j.status}`),j.session_id)B.push(`Session: ${j.session_id}`);if(j.error)B.push("",`Error: ${j.error}`);if(j.pending_input){B.push("",`Input request: ${j.pending_input.request_id}`);for(let D of j.pending_input.questions??[])if(B.push(`- [${D.id}] ${D.question}`),D.options?.length)B.push(` Options: ${D.options.map((E)=>E.label).join(" / ")}`);B.push("","Answer with:",`lodestar-agent answer ${z.run_id} --identity '${j.identity_id}' --request '${j.pending_input.request_id}' --stdin`)}if(j.output)B.push("",j.output)}if(z.presentation_errors?.length)B.push("","Presentation errors:",...z.presentation_errors.map((j)=>`- ${j}`));return`${B.join(`
10
10
  `)}
11
- `}async function _(){if(process.stdin.isTTY)return"";let e=[];for await(let n of process.stdin)e.push(Buffer.isBuffer(n)?n:Buffer.from(n));return Buffer.concat(e).toString("utf8")}function c(e,n){if(!e?.trim())throw Error(n);return e.trim()}function w(){return["Usage:"," lodestar-agent identities [--json]"," lodestar-agent run --identity <id> [--identity <id>...] [--effort <level>] --stdin"," lodestar-agent follow-up <run_id> [--identity <id>] [--effort <level>] --stdin"," lodestar-agent answer <run_id> [--identity <id>] --request <id> (--answer key=value | --stdin)"," lodestar-agent status <run_id>"," lodestar-agent cancel <run_id>"].join(`
12
- `)}function $(e){return e instanceof Error?e.message:String(e)}if(process.argv[1]&&E(process.argv[1])===b(import.meta.url))T().catch((e)=>{process.stderr.write(`lodestar-agent: ${$(e)}
13
- `),process.exitCode=1});export{g as parsePromptArgs,T as main};
11
+ `}async function W(){if(process.stdin.isTTY)return"";let z=[];for await(let B of process.stdin)z.push(Buffer.isBuffer(B)?B:Buffer.from(B));return Buffer.concat(z).toString("utf8")}function Q(z,B){if(!z?.trim())throw Error(B);return z.trim()}function _(){return["Usage:"," lodestar-agent identities [--json]"," lodestar-agent run --identity <id> [--identity <id>...] [--effort <level>] --stdin"," lodestar-agent follow-up <run_id> [--identity <id>] [--effort <level>] --stdin"," lodestar-agent answer <run_id> [--identity <id>] --request <id> (--answer key=value | --stdin)"," lodestar-agent status <run_id>"," lodestar-agent cancel <run_id>"].join(`
12
+ `)}function C(z){return z instanceof Error?z.message:String(z)}if(process.argv[1]&&Z(process.argv[1])===Z(P(import.meta.url)))J().catch((z)=>{process.stderr.write(`lodestar-agent: ${C(z)}
13
+ `),process.exitCode=1});export{$ as parsePromptArgs,J as main};