@roll-agent/core 0.11.0 → 0.12.0
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/bin/roll.js +18 -1
- package/dist/cli/chat/ink/app.d.ts +15 -0
- package/dist/cli/chat/ink/app.js +1 -0
- package/dist/cli/chat/ink/commands.d.ts +6 -0
- package/dist/cli/chat/ink/commands.js +1 -0
- package/dist/cli/chat/ink/confirm-select.d.ts +6 -0
- package/dist/cli/chat/ink/confirm-select.js +1 -0
- package/dist/cli/chat/ink/history-from-messages.d.ts +3 -0
- package/dist/cli/chat/ink/history-from-messages.js +1 -0
- package/dist/cli/chat/ink/history-item.d.ts +5 -0
- package/dist/cli/chat/ink/history-item.js +1 -0
- package/dist/cli/chat/ink/live-region.d.ts +5 -0
- package/dist/cli/chat/ink/live-region.js +1 -0
- package/dist/cli/chat/ink/markdown.d.ts +4 -0
- package/dist/cli/chat/ink/markdown.js +1 -0
- package/dist/cli/chat/ink/run-ink-repl.d.ts +13 -0
- package/dist/cli/chat/ink/run-ink-repl.js +1 -0
- package/dist/cli/chat/ink/slash-popup.d.ts +7 -0
- package/dist/cli/chat/ink/slash-popup.js +1 -0
- package/dist/cli/chat/ink/spinner.d.ts +2 -0
- package/dist/cli/chat/ink/spinner.js +1 -0
- package/dist/cli/chat/ink/state.d.ts +95 -0
- package/dist/cli/chat/ink/state.js +1 -0
- package/dist/cli/chat/ink/status-line.d.ts +5 -0
- package/dist/cli/chat/ink/status-line.js +1 -0
- package/dist/cli/chat/ink/text-prompt.d.ts +12 -0
- package/dist/cli/chat/ink/text-prompt.js +1 -0
- package/dist/cli/chat/ink/thinking-text.d.ts +9 -0
- package/dist/cli/chat/ink/thinking-text.js +1 -0
- package/dist/cli/chat/ink/thinking.d.ts +3 -0
- package/dist/cli/chat/ink/thinking.js +1 -0
- package/dist/cli/chat/ink/tool-label.d.ts +4 -0
- package/dist/cli/chat/ink/tool-label.js +1 -0
- package/dist/cli/chat/ink/use-session.d.ts +20 -0
- package/dist/cli/chat/ink/use-session.js +1 -0
- package/dist/cli/chat/title.d.ts +1 -0
- package/dist/cli/chat/title.js +1 -0
- package/dist/cli/commands/browser-stop.d.ts +4 -4
- package/dist/cli/commands/chat.d.ts +9 -0
- package/dist/cli/commands/chat.js +1 -1
- package/dist/cli/commands/config-guidance.d.ts +2 -2
- package/dist/cli/utils/chat-renderer.d.ts +7 -1
- package/dist/cli/utils/chat-renderer.js +1 -1
- package/dist/cli/utils/output.d.ts +1 -0
- package/dist/cli/utils/output.js +1 -1
- package/dist/cli/utils/package-manager.d.ts +5 -0
- package/dist/cli/utils/package-manager.js +1 -1
- package/dist/cli/utils/token-format.d.ts +18 -0
- package/dist/cli/utils/token-format.js +1 -0
- package/dist/cli/utils/tool-format.d.ts +1 -0
- package/dist/cli/utils/tool-format.js +1 -0
- package/dist/config/defaults.js +1 -1
- package/dist/config/key-codec.js +1 -1
- package/dist/config/schema.d.ts +164 -40
- package/dist/config/schema.js +1 -1
- package/dist/llm/providers.d.ts +5 -2
- package/dist/llm/providers.js +1 -1
- package/dist/mcp/client-manager.d.ts +2 -0
- package/dist/mcp/client-manager.js +1 -1
- package/dist/types/chat.d.ts +12 -0
- package/package.json +9 -4
package/dist/llm/providers.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { LanguageModelV3, SharedV3ProviderOptions } from "@ai-sdk/provider";
|
|
2
|
+
import { runtimeThinkingLevels } from "../config/schema.ts";
|
|
3
|
+
export type ThinkingLevel = (typeof runtimeThinkingLevels)[number];
|
|
4
|
+
export declare function thinkingProviderOptions(providerName: string, modelName: string, level: ThinkingLevel): SharedV3ProviderOptions | undefined;
|
|
2
5
|
/**
|
|
3
6
|
* 根据 provider 名称创建 AI SDK LanguageModel 实例。
|
|
4
7
|
*
|
|
@@ -6,7 +9,7 @@ import type { LanguageModelV3, SharedV3ProviderOptions } from "@ai-sdk/provider"
|
|
|
6
9
|
*/
|
|
7
10
|
export declare function createProviderModel(providerName: string, modelName: string, apiKey: string, baseURL?: string): LanguageModelV3;
|
|
8
11
|
/** generateText 调用目的 */
|
|
9
|
-
export type LLMCallPurpose = "structured-output" | "text" | "sampling";
|
|
12
|
+
export type LLMCallPurpose = "structured-output" | "text" | "sampling" | "chat";
|
|
10
13
|
/** resolveLLMCall 的返回值 */
|
|
11
14
|
export interface ResolvedLLMCall {
|
|
12
15
|
readonly model: LanguageModelV3;
|
|
@@ -18,4 +21,4 @@ export interface ResolvedLLMCall {
|
|
|
18
21
|
* structured-output 场景下,对 qwen provider 自动注入 enableThinking: false,
|
|
19
22
|
* 因为阿里云 thinking mode 不支持 structured output。
|
|
20
23
|
*/
|
|
21
|
-
export declare function resolveLLMCall(providerName: string, modelName: string, apiKey: string, purpose: LLMCallPurpose, baseURL?: string): ResolvedLLMCall;
|
|
24
|
+
export declare function resolveLLMCall(providerName: string, modelName: string, apiKey: string, purpose: LLMCallPurpose, baseURL?: string, thinkingLevel?: ThinkingLevel): ResolvedLLMCall;
|
package/dist/llm/providers.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createAlibaba as e}from"@ai-sdk/alibaba";import{createAnthropic as
|
|
1
|
+
import{createAlibaba as e}from"@ai-sdk/alibaba";import{createAnthropic as i}from"@ai-sdk/anthropic";import{createOpenAI as n}from"@ai-sdk/openai";import{createDeepSeek as o}from"@ai-sdk/deepseek";import{runtimeThinkingLevels as t}from"../config/schema.js";const r={low:2048,medium:8192,high:16384},a=["gpt-5.1","gpt-5.2","gpt-5.3","gpt-5.4"];function p(e){return a.some(i=>e.startsWith(i))}function s(e){const i=/^claude-(?:sonnet|opus)-(\d+)-(\d+)(?:\b|-)/.exec(e),n=i?.[1],o=i?.[2];if(!n||!o)return!1;const t=Number(n),r=Number(o);return t>4||4===t&&r>=6}export function thinkingProviderOptions(e,i,n){return"openai"===e?"off"===n?p(i)?{openai:{reasoningEffort:"none"}}:void 0:{openai:{reasoningEffort:n}}:"anthropic"===e?"off"===n?{anthropic:{thinking:{type:"disabled"}}}:s(i)?{anthropic:{thinking:{type:"adaptive"},effort:n}}:{anthropic:{thinking:{type:"enabled",budgetTokens:r[n]}}}:"qwen"===e?"off"===n?{alibaba:{enableThinking:!1}}:{alibaba:{enableThinking:!0,thinkingBudget:r[n]}}:"deepseek"===e?{deepseek:{thinking:{type:"off"===n?"disabled":"enabled"}}}:void 0}const d="https://dashscope.aliyuncs.com/compatible-mode/v1",c={anthropic:(e,{apiKey:n,baseURL:o})=>i({apiKey:n,...o?{baseURL:o}:{}})(e),openai:(e,{apiKey:i,baseURL:o})=>n({apiKey:i,...o?{baseURL:o}:{}})(e),deepseek:(e,{apiKey:i,baseURL:n})=>o({apiKey:i,...n?{baseURL:n}:{}})(e),qwen:(i,{apiKey:n,baseURL:o})=>e({apiKey:n,baseURL:o??d})(i)};export function createProviderModel(e,i,n,o){const t=c[e];if(!t){const i=Object.keys(c).join(", ");throw new Error(`Unknown LLM provider "${e}". Supported: ${i}`)}return t(i,{apiKey:n,baseURL:o})}export function resolveLLMCall(e,i,n,o,t,r="medium"){const a=createProviderModel(e,i,n,t);if("structured-output"===o&&"qwen"===e)return{model:a,providerOptions:{alibaba:{enableThinking:!1}}};if("chat"===o){const n=thinkingProviderOptions(e,i,r);return n?{model:a,providerOptions:n}:{model:a}}return{model:a}}
|
|
@@ -9,6 +9,8 @@ export interface ConnectOptions {
|
|
|
9
9
|
/** 注入到 stdio 子进程的环境变量(与 process.env 合并) */
|
|
10
10
|
readonly env?: Readonly<Record<string, string>>;
|
|
11
11
|
}
|
|
12
|
+
export declare function buildStdioChildEnv(env?: Readonly<Record<string, string>>): Record<string, string>;
|
|
13
|
+
export declare function shouldSuppressStdioChildStderrLine(line: string): boolean;
|
|
12
14
|
/**
|
|
13
15
|
* MCP Client Manager — 管理到子 Agent MCP Server 的连接。
|
|
14
16
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Client as
|
|
1
|
+
import{Client as n}from"@modelcontextprotocol/sdk/client/index.js";import{StdioClientTransport as t}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as e}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{registerSamplingHandler as o}from"./sampling-handler.js";const s=3e4,i="--disable-warning=ExperimentalWarning";export function buildStdioChildEnv(n){const t=n?{...process.env,...n}:{};return{...t,NODE_OPTIONS:r(t.NODE_OPTIONS,i),ROLL_AGENT_LOG_LEVEL:t.ROLL_AGENT_LOG_LEVEL??"warn"}}function r(n,t){const e=n?.trim();if(!e)return t;const o=e.split(/\s+/);return o.includes("--no-warnings")||o.includes(t)?e:`${e} ${t}`}export function shouldSuppressStdioChildStderrLine(n){const t=n.trim();return t.includes("ExperimentalWarning:")||t.startsWith("(Use `node --trace-warnings")||/\[INFO\s*\]\s*\[[^\]]+\]\s*MCP Server running on stdio$/.test(t)}function c(n,e,o){const s=new t({command:n.command,args:[...n.args??[]],cwd:e,env:buildStdioChildEnv(o),stderr:"pipe"});return l(s),s}function l(n){const t=n.stderr;if(!t)return;let e="";const o=n=>{shouldSuppressStdioChildStderrLine(n)||process.stderr.write(`${n}\n`)};t.on("data",n=>{e+=n.toString();const t=e.split(/\r?\n/);e=t.pop()??"";for(const n of t)o(n)}),t.on("end",()=>{e.length>0&&(o(e),e="")})}export class McpClientManager{connections=new Map;async connect(t,i,r,l={}){const a=this.connections.get(t);if(a)return a.client;const d=l.timeoutMs??s,p=l.samplingModel?{sampling:{}}:{},m=new n({name:`roll-client-${t}`,version:"0.0.1"},{capabilities:p});l.samplingModel&&o(m,l.samplingModel);const u="streamable-http"===i.type?new e(new URL(i.endpoint)):c(i,r,l.env),h=m.connect(u);let g;const w=new Promise((n,e)=>{g=setTimeout(()=>e(new Error(`Connection to "${t}" timed out after ${d}ms`)),d)});try{await Promise.race([h,w])}catch(n){throw await m.close().catch(()=>{}),n}finally{clearTimeout(g)}return this.connections.set(t,{client:m,transportType:i.type}),m}async disconnect(n){const t=this.connections.get(n);t&&(await t.client.close(),this.connections.delete(n))}async disconnectAll(){const n=[...this.connections.keys()];await Promise.all(n.map(n=>this.disconnect(n)))}isConnected(n){return this.connections.has(n)}}
|
package/dist/types/chat.d.ts
CHANGED
|
@@ -16,6 +16,14 @@ export interface ChatStepUsage {
|
|
|
16
16
|
readonly finishReason: string;
|
|
17
17
|
readonly usage?: ChatTokenUsage;
|
|
18
18
|
}
|
|
19
|
+
export interface ChatCompactionSummary {
|
|
20
|
+
readonly reason: "auto" | "manual";
|
|
21
|
+
readonly strategy: "summarize" | "truncate";
|
|
22
|
+
readonly removed: number;
|
|
23
|
+
readonly kept: number;
|
|
24
|
+
readonly truncatedTools?: number;
|
|
25
|
+
readonly beforeInputTokens?: number;
|
|
26
|
+
}
|
|
19
27
|
export interface ChatInputRequirement {
|
|
20
28
|
readonly name: string;
|
|
21
29
|
readonly description: string;
|
|
@@ -36,6 +44,10 @@ export interface ChatCompletedResult {
|
|
|
36
44
|
readonly steps: ReadonlyArray<ChatStepSummary>;
|
|
37
45
|
readonly stepUsages?: ReadonlyArray<ChatStepUsage>;
|
|
38
46
|
readonly totalUsage?: ChatTokenUsage;
|
|
47
|
+
readonly sessionUsage?: ChatTokenUsage;
|
|
48
|
+
readonly contextWindow?: number;
|
|
49
|
+
readonly contextInputTokens?: number;
|
|
50
|
+
readonly compactions?: ReadonlyArray<ChatCompactionSummary>;
|
|
39
51
|
}
|
|
40
52
|
export interface ChatNeedsInputResult {
|
|
41
53
|
readonly status: "needs_input";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@roll-agent/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -70,16 +70,21 @@
|
|
|
70
70
|
"citty": "^0.1.6",
|
|
71
71
|
"cli-table3": "^0.6.5",
|
|
72
72
|
"gray-matter": "^4.0.3",
|
|
73
|
+
"ink": "7.0.1",
|
|
74
|
+
"marked": "18.0.5",
|
|
73
75
|
"ora": "^8.1.0",
|
|
76
|
+
"react": "19.2.7",
|
|
74
77
|
"yaml": "^2.7.0",
|
|
75
78
|
"zod": "^3.25.76",
|
|
76
|
-
"@roll-agent/runtime": "0.
|
|
79
|
+
"@roll-agent/runtime": "0.2.0"
|
|
77
80
|
},
|
|
78
81
|
"devDependencies": {
|
|
79
|
-
"@types/node": "^22.0.0"
|
|
82
|
+
"@types/node": "^22.0.0",
|
|
83
|
+
"@types/react": "19.2.16",
|
|
84
|
+
"ink-testing-library": "4.0.0"
|
|
80
85
|
},
|
|
81
86
|
"scripts": {
|
|
82
|
-
"dev": "node --experimental-strip-types --experimental-sqlite src/cli/index.ts",
|
|
87
|
+
"dev": "node --disable-warning=ExperimentalWarning --experimental-strip-types --experimental-sqlite src/cli/index.ts",
|
|
83
88
|
"build": "rm -rf dist && tsc -p tsconfig.build.json && node ../../scripts/obfuscate.mjs",
|
|
84
89
|
"typecheck": "tsc --noEmit",
|
|
85
90
|
"test": "node --experimental-strip-types --experimental-sqlite --test \"src/**/*.test.ts\"",
|