@roll-agent/core 0.6.0 → 0.6.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.
@@ -9,5 +9,11 @@ declare const _default: import("citty").CommandDef<{
9
9
  description: string;
10
10
  default: false;
11
11
  };
12
+ verbose: {
13
+ type: "boolean";
14
+ alias: string;
15
+ description: string;
16
+ default: false;
17
+ };
12
18
  }>;
13
19
  export default _default;
@@ -1 +1 @@
1
- import{defineCommand as e}from"citty";import{loadConfig as s}from"../../config/loader.js";import{getAgentEnv as t,getMissingAgentEnvRuntimeIssues as o,inspectAgentEnvRequirements as r}from"../../config/helpers.js";import{shouldSkipRuntimeReadinessForTool as n}from"../../config/runtime-env.js";import{createProviderModel as i,resolveLLMCall as a}from"../../llm/providers.js";import{McpClientManager as l}from"../../mcp/client-manager.js";import{AgentStore as m}from"../../registry/store.js";import{resolveTransportWithDevSpawnSpec as c}from"../../registry/dev-spawn.js";import{routeWithLLM as u}from"../../router/llm-router.js";import{extractToolInput as d}from"../../tool-runtime/argument-extractor.js";import{formatValidationIssuesMessage as g}from"../../tool-runtime/messages.js";import{preflightToolCall as f}from"../../tool-runtime/preflight.js";import{formatMissingToolMessage as p,normalizeListedTools as v}from"../utils/agent-tools.js";import{log as j}from"../utils/output.js";import{extractTextContent as y,isToolErrorResult as $}from"../utils/tool-results.js";const N=.5;function k(e){console.log(JSON.stringify(e,null,2))}function x(e){const s=y("object"==typeof e.result&&null!==e.result&&"content"in e.result?e.result.content:void 0);for(const e of s)console.log(e)}export default e({meta:{description:"LLM 智能路由,自动选择 Agent 和 tool"},args:{message:{type:"positional",description:"自然语言消息",required:!0},json:{type:"boolean",description:"JSON 格式输出",default:!1}},async run({args:e}){const{config:w}=s(),h=new m(w.agents.dataDir).list();if(0===h.length)return j.error("暂无已注册的 Agent。可使用 `roll agent add <path>`、`roll agent install <package>` 或 `roll agent add --remote <endpoint>`。"),void(process.exitCode=1);const C=s=>{if(e.json)k(s);else if("success"===s.status)x(s)},L=w.llm.defaultProvider,M=w.ask.llmModel??w.llm.defaultModel,S=w.llm.providers[L];if(!S)return j.error(`LLM provider "${L}" 未配置。请检查 roll.config.yaml`),void(process.exitCode=1);const{model:A,providerOptions:I}=a(L,M,S.apiKey,"structured-output",S.baseUrl);let b;j.info(`分析意图: "${e.message}"`);try{b=await u(e.message,h,A,I)}catch(e){const s={status:"failed",stage:"route",message:`LLM 路由失败: ${e instanceof Error?e.message:String(e)}`};return j.error(s.message),C(s),void(process.exitCode=1)}j.info(`路由决策: ${b.agentName}.${b.toolName} (置信度: ${String(b.confidence)})`);const O=w.ask.confirmThreshold??N;if(b.confidence<O){const e={status:"needs_confirmation",decision:b,message:`置信度 ${String(b.confidence)} 低于阈值 ${String(O)},跳过执行。 可使用 \`roll run ${b.agentName} ${b.toolName}\` 手动调用。`};return j.warn(e.message),C(e),void(process.exitCode=1)}const T=h.find(e=>e.skill.name===b.agentName);if(!T){const e={status:"failed",stage:"route",decision:b,message:`Agent "${b.agentName}" 未找到(LLM 返回了无效的 Agent 名称)`};return j.error(e.message),C(e),void(process.exitCode=1)}const J=i(L,w.llm.defaultModel,S.apiKey,S.baseUrl),E=new l;let K="connect";try{j.info(`连接 Agent "${T.skill.name}"...`);const s=t(w,T.skill.name),i=c(T),a=await E.connect(T.skill.name,i,T.installPath,{samplingModel:J,...s?{env:s}:{}}),l=v((await a.listTools()).tools),m=l.find(e=>e.name===b.toolName);if(!m){const e={status:"failed",stage:"route",decision:b,message:p(T.skill.name,b.toolName,l)};return j.error(e.message),C(e),void(process.exitCode=1)}K="execute";const u=await d(e.message,m,A,I),N={...b,input:u},k=r(T.skill.name,T.skill.env,w.agents.env),x=n(m.name)?[]:o(k),h=f(m,N.input,{runtimeIssues:x});if(!h.ok){const e={status:"needs_input",decision:N,validationIssues:h.issues,runtimeIssues:h.runtimeIssues,message:g(T.skill.name,b.toolName,h.issues,h.runtimeIssues)};return j.warn(e.message),C(e),void(process.exitCode=1)}j.info(`调用 ${T.skill.name}.${b.toolName}(${JSON.stringify(N.input)})`);const L=await a.callTool({name:b.toolName,arguments:N.input});if($(L)){const e={status:"failed",stage:"execute",decision:N,message:y(L.content).join("\n")||"Tool 调用失败"};return j.error(e.message),C(e),void(process.exitCode=1)}C({status:"success",decision:N,result:L}),j.success("调用完成")}catch(e){const s={status:"failed",stage:K,decision:b,message:e instanceof Error?e.message:String(e)};j.error(s.message),C(s),process.exitCode=1}finally{await E.disconnectAll()}}});
1
+ import{defineCommand as e}from"citty";import{loadConfig as s}from"../../config/loader.js";import{getAgentEnv as t,getMissingAgentEnvRuntimeIssues as o,inspectAgentEnvRequirements as r}from"../../config/helpers.js";import{shouldSkipRuntimeReadinessForTool as n}from"../../config/runtime-env.js";import{createProviderModel as i,resolveLLMCall as a}from"../../llm/providers.js";import{McpClientManager as l}from"../../mcp/client-manager.js";import{AgentStore as m}from"../../registry/store.js";import{resolveTransportWithDevSpawnSpec as c}from"../../registry/dev-spawn.js";import{routeWithLLM as u}from"../../router/llm-router.js";import{extractToolInput as d}from"../../tool-runtime/argument-extractor.js";import{formatValidationIssuesMessage as g}from"../../tool-runtime/messages.js";import{preflightToolCall as f}from"../../tool-runtime/preflight.js";import{formatMissingToolMessage as p,normalizeListedTools as v}from"../utils/agent-tools.js";import{log as j,redactToolArgsForLog as y}from"../utils/output.js";import{extractTextContent as $,isToolErrorResult as N}from"../utils/tool-results.js";const k=.5;function x(e){console.log(JSON.stringify(e,null,2))}function w(e){const s=$("object"==typeof e.result&&null!==e.result&&"content"in e.result?e.result.content:void 0);for(const e of s)console.log(e)}export default e({meta:{description:"LLM 智能路由,自动选择 Agent 和 tool"},args:{message:{type:"positional",description:"自然语言消息",required:!0},json:{type:"boolean",description:"JSON 格式输出",default:!1},verbose:{type:"boolean",alias:"v",description:"输出调试日志",default:!1}},async run({args:e}){const{config:h}=s(),C=new m(h.agents.dataDir).list();if(0===C.length)return j.error("暂无已注册的 Agent。可使用 `roll agent add <path>`、`roll agent install <package>` 或 `roll agent add --remote <endpoint>`。"),void(process.exitCode=1);const L=s=>{if(e.json)x(s);else if("success"===s.status)w(s)},M=h.llm.defaultProvider,S=h.ask.llmModel??h.llm.defaultModel,b=h.llm.providers[M];if(!b)return j.error(`LLM provider "${M}" 未配置。请检查 roll.config.yaml`),void(process.exitCode=1);const{model:A,providerOptions:I}=a(M,S,b.apiKey,"structured-output",b.baseUrl);let O;j.info(`分析意图: "${e.message}"`);try{O=await u(e.message,C,A,I)}catch(e){const s={status:"failed",stage:"route",message:`LLM 路由失败: ${e instanceof Error?e.message:String(e)}`};return j.error(s.message),L(s),void(process.exitCode=1)}j.info(`路由决策: ${O.agentName}.${O.toolName} (置信度: ${String(O.confidence)})`);const T=h.ask.confirmThreshold??k;if(O.confidence<T){const e={status:"needs_confirmation",decision:O,message:`置信度 ${String(O.confidence)} 低于阈值 ${String(T)},跳过执行。 可使用 \`roll run ${O.agentName} ${O.toolName}\` 手动调用。`};return j.warn(e.message),L(e),void(process.exitCode=1)}const J=C.find(e=>e.skill.name===O.agentName);if(!J){const e={status:"failed",stage:"route",decision:O,message:`Agent "${O.agentName}" 未找到(LLM 返回了无效的 Agent 名称)`};return j.error(e.message),L(e),void(process.exitCode=1)}const E=i(M,h.llm.defaultModel,b.apiKey,b.baseUrl),K=new l;let P="connect";try{j.info(`连接 Agent "${J.skill.name}"...`);const s=t(h,J.skill.name),i=c(J),a=await K.connect(J.skill.name,i,J.installPath,{samplingModel:E,...s?{env:s}:{}}),l=v((await a.listTools()).tools),m=l.find(e=>e.name===O.toolName);if(!m){const e={status:"failed",stage:"route",decision:O,message:p(J.skill.name,O.toolName,l)};return j.error(e.message),L(e),void(process.exitCode=1)}P="execute";const u=await d(e.message,m,A,I),k={...O,input:u},x=r(J.skill.name,J.skill.env,h.agents.env),w=n(m.name)?[]:o(x),C=f(m,k.input,{runtimeIssues:w});if(!C.ok){const e={status:"needs_input",decision:k,validationIssues:C.issues,runtimeIssues:C.runtimeIssues,message:g(J.skill.name,O.toolName,C.issues,C.runtimeIssues)};return j.warn(e.message),L(e),void(process.exitCode=1)}j.info(`调用 ${J.skill.name}.${O.toolName}`),j.debug(`调用参数: ${JSON.stringify(y(k.input))}`);const M=await a.callTool({name:O.toolName,arguments:k.input});if(N(M)){const e={status:"failed",stage:"execute",decision:k,message:$(M.content).join("\n")||"Tool 调用失败"};return j.error(e.message),L(e),void(process.exitCode=1)}L({status:"success",decision:k,result:M}),j.success("调用完成")}catch(e){const s={status:"failed",stage:P,decision:O,message:e instanceof Error?e.message:String(e)};j.error(s.message),L(s),process.exitCode=1}finally{await K.disconnectAll()}}});
@@ -14,6 +14,12 @@ declare const _default: import("citty").CommandDef<{
14
14
  description: string;
15
15
  default: false;
16
16
  };
17
+ verbose: {
18
+ type: "boolean";
19
+ alias: string;
20
+ description: string;
21
+ default: false;
22
+ };
17
23
  "input-json": {
18
24
  type: "string";
19
25
  description: string;
@@ -1 +1 @@
1
- import{readFileSync as o}from"node:fs";import{defineCommand as t}from"citty";import{loadConfig as r}from"../../config/loader.js";import{getAgentEnv as e,getMissingAgentEnvRuntimeIssues as n,inspectAgentEnvRequirements as s}from"../../config/helpers.js";import{AgentStore as i}from"../../registry/store.js";import{McpClientManager as l}from"../../mcp/client-manager.js";import{resolveTransportWithDevSpawnSpec as a}from"../../registry/dev-spawn.js";import{createProviderModel as c}from"../../llm/providers.js";import{formatValidationIssuesMessage as f}from"../../tool-runtime/messages.js";import{preflightToolCall as p}from"../../tool-runtime/preflight.js";import{formatMissingToolMessage as u,normalizeListedTools as m}from"../utils/agent-tools.js";import{extractTextContent as g,isToolErrorResult as d}from"../utils/tool-results.js";import{log as h}from"../utils/output.js";import{shouldSkipRuntimeReadinessForTool as j}from"../../config/runtime-env.js";export default t({meta:{description:"声明式调用 Agent 的指定 tool"},args:{agent:{type:"positional",description:"Agent 名称",required:!0},tool:{type:"positional",description:"Tool 名称",required:!0},json:{type:"boolean",description:"JSON 格式输出",default:!1},"input-json":{type:"string",description:"以 JSON 字符串提供完整 tool 输入对象"},"input-file":{type:"string",description:"从 JSON 文件读取完整 tool 输入对象"}},async run({args:o,rawArgs:t}){const{config:y}=r(),v=new i(y.agents.dataDir).findByName(o.agent);if(!v)return h.error(`Agent "${o.agent}" 未注册。使用 \`roll agent list\` 查看已注册 Agent。`),void(process.exitCode=1);let w;try{w=resolveToolArgs(t)}catch(o){return h.error(o instanceof Error?o.message:String(o)),void(process.exitCode=1)}const S=new l;try{const t=y.llm.defaultProvider,r=y.llm.providers[t],i=r?c(t,y.llm.defaultModel,r.apiKey,r.baseUrl):void 0;h.info(`连接 Agent "${v.skill.name}"...`);const l=e(y,v.skill.name),$=a(v),A=await S.connect(v.skill.name,$,v.installPath,{...i?{samplingModel:i}:{},...l?{env:l}:{}}),N=m((await A.listTools()).tools),x=N.find(t=>t.name===o.tool);if(!x)return h.error(u(v.skill.name,o.tool,N)),void(process.exitCode=1);const E=s(v.skill.name,v.skill.env,y.agents.env),k=j(x.name)?[]:n(E),T=p(x,w,{runtimeIssues:k});if(!T.ok)return h.error(f(v.skill.name,o.tool,T.issues,T.runtimeIssues)),void(process.exitCode=1);h.info(`调用 ${v.skill.name}.${o.tool}(${JSON.stringify(w)})`);const J=await A.callTool({name:o.tool,arguments:w});if(o.json)console.log(JSON.stringify(J,null,2));else for(const o of g(J.content))console.log(o);if(d(J))return h.error("tool 返回 isError=true"),void(process.exitCode=1);h.success("调用完成")}catch(o){const t=o instanceof Error?o.message:String(o),r=o instanceof Error&&o.cause?`\n cause: ${String(o.cause)}`:"";h.error(`${t}${r}`),process.exitCode=1}finally{await S.disconnectAll()}}});const y=new Set(["json","verbose","v","help","h","version"]),v=new Set(["config","input-json","input-file"]);function w(o){return"object"==typeof o&&null!==o&&!Array.isArray(o)}function S(o,t){let r;try{r=JSON.parse(o)}catch(o){throw new Error(`${t} 不是合法 JSON: ${o instanceof Error?o.message:String(o)}`)}if(!w(r))throw new Error(`${t} 必须是 JSON object`);return r}function $(o,t){let r=0;for(;r<o.length&&!o[r]?.startsWith("--");)r++;for(;r<o.length;){if(o[r]!==`--${t}`){r++;continue}const e=o[r+1];if(!e||e.startsWith("--"))throw new Error(`选项 --${t} 需要提供值`);return e}}export function parseExplicitToolInput(t){const r=$(t,"input-json"),e=$(t,"input-file");if(r&&e)throw new Error("不能同时使用 --input-json 和 --input-file");if(r)return S(r,"--input-json");if(e){return S(o(e,"utf-8"),`输入文件 ${e}`)}}export function resolveToolArgs(o){return{...parseExplicitToolInput(o)??{},...parseToolArgs(o)}}export function parseToolArgs(o){const t={};let r=0;for(;r<o.length&&!o[r]?.startsWith("--");)r++;for(;r<o.length;){const e=o[r];if(!e?.startsWith("--")){r++;continue}const n=e.slice(2),s=o[r+1];if(y.has(n))r++;else if(v.has(n))r+=s&&!s.startsWith("--")?2:1;else if(!s||s.startsWith("--"))t[n]=!0,r++;else{const o=Number(s);t[n]=Number.isNaN(o)?s:o,r+=2}}return t}
1
+ import{readFileSync as o}from"node:fs";import{defineCommand as t}from"citty";import{loadConfig as e}from"../../config/loader.js";import{getAgentEnv as r,getMissingAgentEnvRuntimeIssues as s,inspectAgentEnvRequirements as n}from"../../config/helpers.js";import{AgentStore as i}from"../../registry/store.js";import{McpClientManager as l}from"../../mcp/client-manager.js";import{resolveTransportWithDevSpawnSpec as a}from"../../registry/dev-spawn.js";import{createProviderModel as c}from"../../llm/providers.js";import{formatValidationIssuesMessage as f}from"../../tool-runtime/messages.js";import{preflightToolCall as p}from"../../tool-runtime/preflight.js";import{formatMissingToolMessage as u,normalizeListedTools as m}from"../utils/agent-tools.js";import{extractTextContent as g,formatToolResultForJsonOutput as d,isToolErrorResult as h}from"../utils/tool-results.js";import{log as j,redactToolArgsForLog as v}from"../utils/output.js";import{shouldSkipRuntimeReadinessForTool as y}from"../../config/runtime-env.js";export default t({meta:{description:"声明式调用 Agent 的指定 tool"},args:{agent:{type:"positional",description:"Agent 名称",required:!0},tool:{type:"positional",description:"Tool 名称",required:!0},json:{type:"boolean",description:"JSON 格式输出",default:!1},verbose:{type:"boolean",alias:"v",description:"输出调试日志",default:!1},"input-json":{type:"string",description:"以 JSON 字符串提供完整 tool 输入对象"},"input-file":{type:"string",description:"从 JSON 文件读取完整 tool 输入对象"}},async run({args:o,rawArgs:t}){const{config:w}=e(),S=new i(w.agents.dataDir).findByName(o.agent);if(!S)return j.error(`Agent "${o.agent}" 未注册。使用 \`roll agent list\` 查看已注册 Agent。`),void(process.exitCode=1);let $;try{$=resolveToolArgs(t)}catch(o){return j.error(o instanceof Error?o.message:String(o)),void(process.exitCode=1)}const A=new l;try{const t=w.llm.defaultProvider,e=w.llm.providers[t],i=e?c(t,w.llm.defaultModel,e.apiKey,e.baseUrl):void 0;j.info(`连接 Agent "${S.skill.name}"...`);const l=r(w,S.skill.name),N=a(S),x=await A.connect(S.skill.name,N,S.installPath,{...i?{samplingModel:i}:{},...l?{env:l}:{}}),E=m((await x.listTools()).tools),b=E.find(t=>t.name===o.tool);if(!b)return j.error(u(S.skill.name,o.tool,E)),void(process.exitCode=1);const k=n(S.skill.name,S.skill.env,w.agents.env),T=y(b.name)?[]:s(k),J=p(b,$,{runtimeIssues:T});if(!J.ok)return j.error(f(S.skill.name,o.tool,J.issues,J.runtimeIssues)),void(process.exitCode=1);j.info(`调用 ${S.skill.name}.${o.tool}`),j.debug(`调用参数: ${JSON.stringify(v($))}`);const O=await x.callTool({name:o.tool,arguments:$});if(o.json)console.log(JSON.stringify(d(O),null,2));else for(const o of g(O.content))console.log(o);if(h(O))return j.error("tool 返回 isError=true"),void(process.exitCode=1);j.success("调用完成")}catch(o){const t=o instanceof Error?o.message:String(o),e=o instanceof Error&&o.cause?`\n cause: ${String(o.cause)}`:"";j.error(`${t}${e}`),process.exitCode=1}finally{await A.disconnectAll()}}});const w=new Set(["json","verbose","v","help","h","version"]),S=new Set(["config","input-json","input-file"]);function $(o){return"object"==typeof o&&null!==o&&!Array.isArray(o)}function A(o,t){let e;try{e=JSON.parse(o)}catch(o){throw new Error(`${t} 不是合法 JSON: ${o instanceof Error?o.message:String(o)}`)}if(!$(e))throw new Error(`${t} 必须是 JSON object`);return e}function N(o,t){let e=0;for(;e<o.length&&!o[e]?.startsWith("--");)e++;for(;e<o.length;){if(o[e]!==`--${t}`){e++;continue}const r=o[e+1];if(!r||r.startsWith("--"))throw new Error(`选项 --${t} 需要提供值`);return r}}export function parseExplicitToolInput(t){const e=N(t,"input-json"),r=N(t,"input-file");if(e&&r)throw new Error("不能同时使用 --input-json 和 --input-file");if(e)return A(e,"--input-json");if(r){return A(o(r,"utf-8"),`输入文件 ${r}`)}}export function resolveToolArgs(o){return{...parseExplicitToolInput(o)??{},...parseToolArgs(o)}}export function parseToolArgs(o){const t={};let e=0;for(;e<o.length&&!o[e]?.startsWith("--");)e++;for(;e<o.length;){const r=o[e];if(!r?.startsWith("--")){e++;continue}const s=r.slice(2),n=o[e+1];if(w.has(s))e++;else if(S.has(s))e+=n&&!n.startsWith("--")?2:1;else if(!n||n.startsWith("--"))t[s]=!0,e++;else{const o=Number(n);t[s]=Number.isNaN(o)?n:o,e+=2}}return t}
package/dist/cli/index.js CHANGED
@@ -1 +1 @@
1
- var t=this&&this.__rewriteRelativeImportExtension||function(t,e){return"string"==typeof t&&/^\.\.?\//.test(t)?t.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(t,r,n,o,a){return r?e?".jsx":".js":!n||o&&a?n+o+"."+a.toLowerCase()+"js":t}):t};import{defineCommand as e,runMain as r}from"citty";import n from"chalk";import{checkForUpdate as o,getCurrentVersion as a}from"./utils/update-checker.js";const s=a(),c=import.meta.url.endsWith(".ts")?"ts":"js";function i(e){const r=new URL(`./commands/${e}.${c}`,import.meta.url).href;return import(t(r)).then(t=>t.default)}const l=e({meta:{name:"roll",version:s,description:"花卷 Agent — 轻量级 Agent 编排系统"},subCommands:{agent:()=>i("agent"),run:()=>i("run"),ask:()=>i("ask"),chat:()=>i("chat"),config:()=>i("config"),doctor:()=>i("doctor"),update:()=>i("update")}}),u=o({allowNetwork:!1}).catch(()=>{});r(l).then(()=>{u.then(t=>{t?.hasUpdate&&console.error(`\n${n.yellow("⬆")} roll ${n.green(`v${t.latest}`)} available (current: v${t.current}). Run ${n.cyan("roll update")} to upgrade.`)}).catch(()=>{})});
1
+ var t=this&&this.__rewriteRelativeImportExtension||function(t,e){return"string"==typeof t&&/^\.\.?\//.test(t)?t.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(t,r,o,n,a){return r?e?".jsx":".js":!o||n&&a?o+n+"."+a.toLowerCase()+"js":t}):t};import{defineCommand as e,runMain as r}from"citty";import o from"chalk";import{checkForUpdate as n,getCurrentVersion as a}from"./utils/update-checker.js";import{resolveLogLevelFromArgv as s,setLogLevel as c}from"./utils/output.js";const i=a(),l=import.meta.url.endsWith(".ts")?"ts":"js";function u(e){const r=new URL(`./commands/${e}.${l}`,import.meta.url).href;return import(t(r)).then(t=>t.default)}const m=e({meta:{name:"roll",version:i,description:"花卷 Agent — 轻量级 Agent 编排系统"},args:{verbose:{type:"boolean",alias:"v",description:"输出调试日志",default:!1}},subCommands:{agent:()=>u("agent"),run:()=>u("run"),ask:()=>u("ask"),chat:()=>u("chat"),config:()=>u("config"),doctor:()=>u("doctor"),update:()=>u("update")}}),p=n({allowNetwork:!1}).catch(()=>{});c(s(process.argv.slice(2))),r(m).then(()=>{p.then(t=>{t?.hasUpdate&&console.error(`\n${o.yellow("⬆")} roll ${o.green(`v${t.latest}`)} available (current: v${t.current}). Run ${o.cyan("roll update")} to upgrade.`)}).catch(()=>{})});
@@ -7,9 +7,11 @@ declare const LOG_LEVELS: {
7
7
  readonly error: 3;
8
8
  readonly silent: 4;
9
9
  };
10
- type LogLevel = keyof typeof LOG_LEVELS;
10
+ export type LogLevel = keyof typeof LOG_LEVELS;
11
11
  /** 设置全局日志级别 */
12
12
  export declare function setLogLevel(level: LogLevel): void;
13
+ export declare function resolveLogLevelFromArgv(argv: readonly string[]): LogLevel;
14
+ export declare function redactToolArgsForLog(value: unknown): unknown;
13
15
  /** 结构化日志输出(写入 stderr,不干扰 stdout 数据流) */
14
16
  export declare const log: {
15
17
  debug(message: string): void;
@@ -1 +1 @@
1
- import r from"chalk";import e from"ora";const o={debug:0,info:1,warn:2,error:3,silent:4};let n="info";export function setLogLevel(r){n=r}function t(r){return o[r]>=o[n]}export const log={debug(e){t("debug")&&console.error(r.gray(`[debug] ${e}`))},info(e){t("info")&&console.error(r.blue("→")+` ${e}`)},success(e){t("info")&&console.error(r.green("✓")+` ${e}`)},warn(e){t("warn")&&console.error(r.yellow("⚠")+` ${e}`)},error(e){t("error")&&console.error(r.red("✗")+` ${e}`)}};export function createSpinner(r){return e({text:r,stream:process.stderr})}
1
+ import r from"chalk";import e from"ora";const o={debug:0,info:1,warn:2,error:3,silent:4},n=new Set(["--verbose","-v"]),t=/signed[-_]?envelope|token|secret|password|cookie|authorization|api[-_]?key/i;let i="info";export function setLogLevel(r){i=r}export function resolveLogLevelFromArgv(r){return r.some(r=>n.has(r))?"debug":"info"}export function redactToolArgsForLog(r){return c(r)}function c(r,e){if(e&&t.test(e))return s(r);if(Array.isArray(r))return r.map(r=>c(r));if(f(r)){const e={};for(const[o,n]of Object.entries(r))e[o]=c(n,o);return e}return r}function s(r){if("string"==typeof r)return`[redacted,len=${r.length}]`;const e=u(r);return void 0===e?"[redacted]":`[redacted,len=${e.length}]`}function u(r){try{return JSON.stringify(r)}catch{return}}function f(r){return"object"==typeof r&&null!==r&&!Array.isArray(r)}function a(r){return o[r]>=o[i]}export const log={debug(e){a("debug")&&console.error(r.gray(`[debug] ${e}`))},info(e){a("info")&&console.error(r.blue("→")+` ${e}`)},success(e){a("info")&&console.error(r.green("✓")+` ${e}`)},warn(e){a("warn")&&console.error(r.yellow("⚠")+` ${e}`)},error(e){a("error")&&console.error(r.red("✗")+` ${e}`)}};export function createSpinner(r){return e({text:r,stream:process.stderr})}
@@ -1,4 +1,5 @@
1
1
  export declare function extractTextContent(content: unknown): string[];
2
+ export declare function formatToolResultForJsonOutput(result: unknown): unknown;
2
3
  export declare function isToolErrorResult(result: unknown): result is {
3
4
  readonly isError: true;
4
5
  readonly content?: unknown;
@@ -1 +1 @@
1
- export function extractTextContent(t){if(!Array.isArray(t))return[];const r=[];for(const e of t)"object"==typeof e&&null!==e&&"type"in e&&"text"===e.type&&"text"in e&&"string"==typeof e.text&&r.push(e.text);return r}export function isToolErrorResult(t){return"object"==typeof t&&null!==t&&"isError"in t&&!0===t.isError}
1
+ export function extractTextContent(t){if(!Array.isArray(t))return[];const r=[];for(const e of t)"object"==typeof e&&null!==e&&"type"in e&&"text"===e.type&&"text"in e&&"string"==typeof e.text&&r.push(e.text);return r}export function formatToolResultForJsonOutput(t){if("object"!=typeof t||null===t||!("content"in t))return t;const r=extractTextContent(t.content);if(1!==r.length)return t;const[e]=r;if(void 0===e)return t;try{return JSON.parse(e)}catch{return t}}export function isToolErrorResult(t){return"object"==typeof t&&null!==t&&"isError"in t&&!0===t.isError}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roll-agent/core",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",