@claudebuddy/claudebuddy-agent-sdk 0.4.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/LICENSE +21 -0
- package/README.md +501 -0
- package/dist/agent.d.ts +137 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +573 -0
- package/dist/agent.js.map +1 -0
- package/dist/engine.d.ts +70 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +552 -0
- package/dist/engine.js.map +1 -0
- package/dist/hooks.d.ts +111 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +179 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +141 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +19 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +126 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/providers/anthropic.d.ts +17 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +47 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/index.d.ts +20 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +26 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +26 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +243 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +84 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +11 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/sdk-mcp-server.d.ts +52 -0
- package/dist/sdk-mcp-server.d.ts.map +1 -0
- package/dist/sdk-mcp-server.js +57 -0
- package/dist/sdk-mcp-server.js.map +1 -0
- package/dist/session.d.ts +73 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +159 -0
- package/dist/session.js.map +1 -0
- package/dist/skills/bundled/commit.d.ts +7 -0
- package/dist/skills/bundled/commit.d.ts.map +1 -0
- package/dist/skills/bundled/commit.js +35 -0
- package/dist/skills/bundled/commit.js.map +1 -0
- package/dist/skills/bundled/debug.d.ts +7 -0
- package/dist/skills/bundled/debug.d.ts.map +1 -0
- package/dist/skills/bundled/debug.js +46 -0
- package/dist/skills/bundled/debug.js.map +1 -0
- package/dist/skills/bundled/index.d.ts +11 -0
- package/dist/skills/bundled/index.d.ts.map +1 -0
- package/dist/skills/bundled/index.js +26 -0
- package/dist/skills/bundled/index.js.map +1 -0
- package/dist/skills/bundled/review.d.ts +7 -0
- package/dist/skills/bundled/review.d.ts.map +1 -0
- package/dist/skills/bundled/review.js +38 -0
- package/dist/skills/bundled/review.js.map +1 -0
- package/dist/skills/bundled/simplify.d.ts +8 -0
- package/dist/skills/bundled/simplify.d.ts.map +1 -0
- package/dist/skills/bundled/simplify.js +48 -0
- package/dist/skills/bundled/simplify.js.map +1 -0
- package/dist/skills/bundled/test.d.ts +7 -0
- package/dist/skills/bundled/test.d.ts.map +1 -0
- package/dist/skills/bundled/test.js +40 -0
- package/dist/skills/bundled/test.js.map +1 -0
- package/dist/skills/index.d.ts +7 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +8 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/registry.d.ts +43 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +111 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/types.d.ts +83 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +8 -0
- package/dist/skills/types.js.map +1 -0
- package/dist/tool-helper.d.ts +73 -0
- package/dist/tool-helper.d.ts.map +1 -0
- package/dist/tool-helper.js +86 -0
- package/dist/tool-helper.js.map +1 -0
- package/dist/tools/agent-tool.d.ts +17 -0
- package/dist/tools/agent-tool.d.ts.map +1 -0
- package/dist/tools/agent-tool.js +150 -0
- package/dist/tools/agent-tool.js.map +1 -0
- package/dist/tools/ask-user.d.ts +18 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +72 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/bash.d.ts +5 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +67 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/config-tool.d.ts +20 -0
- package/dist/tools/config-tool.d.ts.map +1 -0
- package/dist/tools/config-tool.js +83 -0
- package/dist/tools/config-tool.js.map +1 -0
- package/dist/tools/cron-tools.d.ts +33 -0
- package/dist/tools/cron-tools.d.ts.map +1 -0
- package/dist/tools/cron-tools.js +128 -0
- package/dist/tools/cron-tools.js.map +1 -0
- package/dist/tools/edit.d.ts +5 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +70 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +5 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +75 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +5 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +168 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +45 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +162 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lsp-tool.d.ts +9 -0
- package/dist/tools/lsp-tool.d.ts.map +1 -0
- package/dist/tools/lsp-tool.js +137 -0
- package/dist/tools/lsp-tool.js.map +1 -0
- package/dist/tools/mcp-resource-tools.d.ts +14 -0
- package/dist/tools/mcp-resource-tools.d.ts.map +1 -0
- package/dist/tools/mcp-resource-tools.js +117 -0
- package/dist/tools/mcp-resource-tools.js.map +1 -0
- package/dist/tools/notebook-edit.d.ts +5 -0
- package/dist/tools/notebook-edit.d.ts.map +1 -0
- package/dist/tools/notebook-edit.js +85 -0
- package/dist/tools/notebook-edit.js.map +1 -0
- package/dist/tools/plan-tools.d.ts +12 -0
- package/dist/tools/plan-tools.d.ts.map +1 -0
- package/dist/tools/plan-tools.js +77 -0
- package/dist/tools/plan-tools.js.map +1 -0
- package/dist/tools/read.d.ts +5 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +66 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/send-message.d.ts +31 -0
- package/dist/tools/send-message.d.ts.map +1 -0
- package/dist/tools/send-message.js +77 -0
- package/dist/tools/send-message.js.map +1 -0
- package/dist/tools/skill-tool.d.ts +9 -0
- package/dist/tools/skill-tool.d.ts.map +1 -0
- package/dist/tools/skill-tool.js +115 -0
- package/dist/tools/skill-tool.js.map +1 -0
- package/dist/tools/task-tools.d.ts +48 -0
- package/dist/tools/task-tools.d.ts.map +1 -0
- package/dist/tools/task-tools.js +242 -0
- package/dist/tools/task-tools.js.map +1 -0
- package/dist/tools/team-tools.d.ts +34 -0
- package/dist/tools/team-tools.d.ts.map +1 -0
- package/dist/tools/team-tools.js +103 -0
- package/dist/tools/team-tools.js.map +1 -0
- package/dist/tools/todo-tool.d.ts +22 -0
- package/dist/tools/todo-tool.d.ts.map +1 -0
- package/dist/tools/todo-tool.js +93 -0
- package/dist/tools/todo-tool.js.map +1 -0
- package/dist/tools/tool-search.d.ts +13 -0
- package/dist/tools/tool-search.d.ts.map +1 -0
- package/dist/tools/tool-search.js +76 -0
- package/dist/tools/tool-search.js.map +1 -0
- package/dist/tools/types.d.ts +29 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +52 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/update-goal.d.ts +38 -0
- package/dist/tools/update-goal.d.ts.map +1 -0
- package/dist/tools/update-goal.js +109 -0
- package/dist/tools/update-goal.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +5 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +60 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +5 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +77 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/worktree-tools.d.ts +10 -0
- package/dist/tools/worktree-tools.d.ts.map +1 -0
- package/dist/tools/worktree-tools.js +130 -0
- package/dist/tools/worktree-tools.js.map +1 -0
- package/dist/tools/write.d.ts +5 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +40 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +485 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/compact.d.ts +44 -0
- package/dist/utils/compact.d.ts.map +1 -0
- package/dist/utils/compact.js +162 -0
- package/dist/utils/compact.js.map +1 -0
- package/dist/utils/context.d.ts +35 -0
- package/dist/utils/context.d.ts.map +1 -0
- package/dist/utils/context.js +174 -0
- package/dist/utils/context.js.map +1 -0
- package/dist/utils/fileCache.d.ts +64 -0
- package/dist/utils/fileCache.d.ts.map +1 -0
- package/dist/utils/fileCache.js +117 -0
- package/dist/utils/fileCache.js.map +1 -0
- package/dist/utils/messages.d.ts +57 -0
- package/dist/utils/messages.d.ts.map +1 -0
- package/dist/utils/messages.js +152 -0
- package/dist/utils/messages.js.map +1 -0
- package/dist/utils/retry.d.ts +48 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +111 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/spill.d.ts +100 -0
- package/dist/utils/spill.d.ts.map +1 -0
- package/dist/utils/spill.js +126 -0
- package/dist/utils/spill.js.map +1 -0
- package/dist/utils/tokens.d.ts +60 -0
- package/dist/utils/tokens.d.ts.map +1 -0
- package/dist/utils/tokens.js +140 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +71 -0
package/dist/agent.js
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent - High-level API
|
|
3
|
+
*
|
|
4
|
+
* Provides createAgent() and query() interfaces compatible with
|
|
5
|
+
* open-agent-sdk.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { createAgent } from 'open-agent-sdk'
|
|
9
|
+
* const agent = createAgent({ model: 'claude-sonnet-4-6' })
|
|
10
|
+
* for await (const event of agent.query('Hello')) { ... }
|
|
11
|
+
*
|
|
12
|
+
* // OpenAI-compatible models
|
|
13
|
+
* const agent = createAgent({
|
|
14
|
+
* apiType: 'openai-completions',
|
|
15
|
+
* model: 'gpt-4o',
|
|
16
|
+
* apiKey: 'sk-...',
|
|
17
|
+
* baseURL: 'https://api.openai.com/v1',
|
|
18
|
+
* })
|
|
19
|
+
*/
|
|
20
|
+
import { QueryEngine } from './engine.js';
|
|
21
|
+
import { getAllBaseTools, filterTools } from './tools/index.js';
|
|
22
|
+
import { connectMCPServer } from './mcp/client.js';
|
|
23
|
+
import { isSdkServerConfig } from './sdk-mcp-server.js';
|
|
24
|
+
import { registerAgents } from './tools/agent-tool.js';
|
|
25
|
+
import { saveSession, loadSession, } from './session.js';
|
|
26
|
+
import { createHookRegistry } from './hooks.js';
|
|
27
|
+
import { initBundledSkills } from './skills/index.js';
|
|
28
|
+
import { createProvider } from './providers/index.js';
|
|
29
|
+
import { createUpdateGoalTool, buildGoalSystemPrompt, getGoalState, resetGoalState, } from './tools/update-goal.js';
|
|
30
|
+
// --------------------------------------------------------------------------
|
|
31
|
+
// Agent class
|
|
32
|
+
// --------------------------------------------------------------------------
|
|
33
|
+
export class Agent {
|
|
34
|
+
cfg;
|
|
35
|
+
toolPool;
|
|
36
|
+
modelId;
|
|
37
|
+
apiType;
|
|
38
|
+
apiCredentials;
|
|
39
|
+
provider;
|
|
40
|
+
mcpLinks = [];
|
|
41
|
+
history = [];
|
|
42
|
+
messageLog = [];
|
|
43
|
+
setupDone;
|
|
44
|
+
sid;
|
|
45
|
+
abortCtrl = null;
|
|
46
|
+
currentEngine = null;
|
|
47
|
+
hookRegistry;
|
|
48
|
+
constructor(options = {}) {
|
|
49
|
+
// Shallow copy to avoid mutating caller's object
|
|
50
|
+
this.cfg = { ...options };
|
|
51
|
+
// Merge credentials from options.env map, direct options, and process.env
|
|
52
|
+
this.apiCredentials = this.pickCredentials();
|
|
53
|
+
this.modelId = this.cfg.model ?? this.readEnv('MODEL') ?? 'claude-sonnet-4-6';
|
|
54
|
+
this.sid = this.cfg.sessionId ?? crypto.randomUUID();
|
|
55
|
+
// Resolve API type
|
|
56
|
+
this.apiType = this.resolveApiType();
|
|
57
|
+
// Create LLM provider
|
|
58
|
+
this.provider = createProvider(this.apiType, {
|
|
59
|
+
apiKey: this.apiCredentials.key,
|
|
60
|
+
baseURL: this.apiCredentials.baseUrl,
|
|
61
|
+
});
|
|
62
|
+
// Initialize bundled skills
|
|
63
|
+
initBundledSkills();
|
|
64
|
+
// Build hook registry from options
|
|
65
|
+
this.hookRegistry = createHookRegistry();
|
|
66
|
+
if (this.cfg.hooks) {
|
|
67
|
+
// Convert AgentOptions hooks format to HookConfig
|
|
68
|
+
for (const [event, defs] of Object.entries(this.cfg.hooks)) {
|
|
69
|
+
for (const def of defs) {
|
|
70
|
+
for (const handler of def.hooks) {
|
|
71
|
+
this.hookRegistry.register(event, {
|
|
72
|
+
matcher: def.matcher,
|
|
73
|
+
timeout: def.timeout,
|
|
74
|
+
handler: async (input) => {
|
|
75
|
+
const result = await handler(input, input.toolUseId || '', {
|
|
76
|
+
signal: this.abortCtrl?.signal || new AbortController().signal,
|
|
77
|
+
});
|
|
78
|
+
return result || undefined;
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Build tool pool from options (supports ToolDefinition[], string[], or preset)
|
|
86
|
+
this.toolPool = this.buildToolPool();
|
|
87
|
+
// Kick off async setup (MCP connections, agent registration, session resume)
|
|
88
|
+
this.setupDone = this.setup();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resolve API type from options, env, or model name heuristic.
|
|
92
|
+
*/
|
|
93
|
+
resolveApiType() {
|
|
94
|
+
// Explicit option
|
|
95
|
+
if (this.cfg.apiType)
|
|
96
|
+
return this.cfg.apiType;
|
|
97
|
+
// Env var
|
|
98
|
+
const envType = this.envMapValue('API_TYPE') ??
|
|
99
|
+
this.readEnv('API_TYPE');
|
|
100
|
+
if (envType === 'openai-completions' || envType === 'anthropic-messages') {
|
|
101
|
+
return envType;
|
|
102
|
+
}
|
|
103
|
+
// Heuristic from model name
|
|
104
|
+
const model = this.modelId.toLowerCase();
|
|
105
|
+
if (model.includes('gpt-') ||
|
|
106
|
+
model.includes('o1') ||
|
|
107
|
+
model.includes('o3') ||
|
|
108
|
+
model.includes('o4') ||
|
|
109
|
+
model.includes('deepseek') ||
|
|
110
|
+
model.includes('qwen') ||
|
|
111
|
+
model.includes('yi-') ||
|
|
112
|
+
model.includes('glm') ||
|
|
113
|
+
model.includes('mistral') ||
|
|
114
|
+
model.includes('gemma')) {
|
|
115
|
+
return 'openai-completions';
|
|
116
|
+
}
|
|
117
|
+
return 'anthropic-messages';
|
|
118
|
+
}
|
|
119
|
+
/** Pick API key and base URL from options or CLAUDEBUDDY_* env vars. */
|
|
120
|
+
pickCredentials() {
|
|
121
|
+
return {
|
|
122
|
+
key: this.cfg.apiKey ??
|
|
123
|
+
this.envMapValue('API_KEY') ??
|
|
124
|
+
this.envMapValue('AUTH_TOKEN') ??
|
|
125
|
+
this.readEnv('API_KEY') ??
|
|
126
|
+
this.readEnv('AUTH_TOKEN'),
|
|
127
|
+
baseUrl: this.cfg.baseURL ??
|
|
128
|
+
this.envMapValue('BASE_URL') ??
|
|
129
|
+
this.readEnv('BASE_URL'),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Read an env var by its short key using the CLAUDEBUDDY_ prefix.
|
|
134
|
+
* e.g. readEnv('MODEL') checks CLAUDEBUDDY_MODEL.
|
|
135
|
+
*/
|
|
136
|
+
readEnv(shortKey) {
|
|
137
|
+
return process.env[`CLAUDEBUDDY_${shortKey}`] || undefined;
|
|
138
|
+
}
|
|
139
|
+
/** Read a value from the options `env` map using the CLAUDEBUDDY_ prefix. */
|
|
140
|
+
envMapValue(shortKey) {
|
|
141
|
+
return this.cfg.env?.[`CLAUDEBUDDY_${shortKey}`];
|
|
142
|
+
}
|
|
143
|
+
/** Assemble the available tool set based on options. */
|
|
144
|
+
buildToolPool() {
|
|
145
|
+
const raw = this.cfg.tools;
|
|
146
|
+
let pool;
|
|
147
|
+
if (!raw || (typeof raw === 'object' && !Array.isArray(raw) && 'type' in raw)) {
|
|
148
|
+
pool = getAllBaseTools();
|
|
149
|
+
}
|
|
150
|
+
else if (Array.isArray(raw) && raw.length > 0 && typeof raw[0] === 'string') {
|
|
151
|
+
pool = filterTools(getAllBaseTools(), raw);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
pool = raw;
|
|
155
|
+
}
|
|
156
|
+
return filterTools(pool, this.cfg.allowedTools, this.cfg.disallowedTools);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Async initialization: connect MCP servers, register agents, resume sessions.
|
|
160
|
+
*/
|
|
161
|
+
async setup() {
|
|
162
|
+
// Register custom agent definitions
|
|
163
|
+
if (this.cfg.agents) {
|
|
164
|
+
registerAgents(this.cfg.agents);
|
|
165
|
+
}
|
|
166
|
+
// Connect MCP servers (supports stdio, SSE, HTTP, and in-process SDK servers)
|
|
167
|
+
if (this.cfg.mcpServers) {
|
|
168
|
+
for (const [name, config] of Object.entries(this.cfg.mcpServers)) {
|
|
169
|
+
try {
|
|
170
|
+
if (isSdkServerConfig(config)) {
|
|
171
|
+
// In-process SDK MCP server - directly add tools
|
|
172
|
+
this.toolPool = [...this.toolPool, ...config.tools];
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// External MCP server
|
|
176
|
+
const connection = await connectMCPServer(name, config);
|
|
177
|
+
this.mcpLinks.push(connection);
|
|
178
|
+
if (connection.status === 'connected' && connection.tools.length > 0) {
|
|
179
|
+
this.toolPool = [...this.toolPool, ...connection.tools];
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
console.error(`[MCP] Failed to connect to "${name}": ${err.message}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Resume or continue session. An explicitly supplied history wins: hosts
|
|
189
|
+
// that keep sessions in their own store (a database) pass it here and the
|
|
190
|
+
// session files are never read.
|
|
191
|
+
if (this.cfg.history?.length) {
|
|
192
|
+
this.history = [...this.cfg.history];
|
|
193
|
+
if (this.cfg.resume)
|
|
194
|
+
this.sid = this.cfg.resume;
|
|
195
|
+
}
|
|
196
|
+
else if (this.cfg.resume) {
|
|
197
|
+
const sessionData = await loadSession(this.cfg.resume);
|
|
198
|
+
if (sessionData) {
|
|
199
|
+
this.history = sessionData.messages;
|
|
200
|
+
this.sid = this.cfg.resume;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Run a query with streaming events.
|
|
206
|
+
*/
|
|
207
|
+
async *query(prompt, overrides) {
|
|
208
|
+
await this.setupDone;
|
|
209
|
+
// Goal auto-takeover: when configured with goal.enabledOnQuery and the
|
|
210
|
+
// prompt is a plain string goal, route this query through the goal-driven
|
|
211
|
+
// loop instead of a single turn. Non-string prompts (message arrays) are
|
|
212
|
+
// always handled as a normal single-turn query.
|
|
213
|
+
const goalOpts = typeof this.cfg.goal === 'object' ? this.cfg.goal : undefined;
|
|
214
|
+
const overrideGoal = typeof overrides?.goal === 'object' ? overrides.goal : undefined;
|
|
215
|
+
// Explicit override (e.g. runGoal disabling re-entry) wins over the config.
|
|
216
|
+
const autoGoalFlag = overrideGoal?.enabledOnQuery !== undefined
|
|
217
|
+
? overrideGoal.enabledOnQuery
|
|
218
|
+
: (goalOpts?.enabledOnQuery ?? false);
|
|
219
|
+
if (autoGoalFlag && typeof prompt === 'string') {
|
|
220
|
+
yield* this.runGoal(prompt, {});
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const opts = { ...this.cfg, ...overrides };
|
|
224
|
+
const cwd = opts.cwd || process.cwd();
|
|
225
|
+
// Create abort controller for this query
|
|
226
|
+
this.abortCtrl = opts.abortController || new AbortController();
|
|
227
|
+
if (opts.abortSignal) {
|
|
228
|
+
opts.abortSignal.addEventListener('abort', () => this.abortCtrl?.abort(), { once: true });
|
|
229
|
+
}
|
|
230
|
+
// Resolve systemPrompt (handle preset object)
|
|
231
|
+
let systemPrompt;
|
|
232
|
+
let appendSystemPrompt = opts.appendSystemPrompt;
|
|
233
|
+
if (typeof opts.systemPrompt === 'object' && opts.systemPrompt?.type === 'preset') {
|
|
234
|
+
systemPrompt = undefined; // Use engine default (default style)
|
|
235
|
+
if (opts.systemPrompt.append) {
|
|
236
|
+
appendSystemPrompt = (appendSystemPrompt || '') + '\n' + opts.systemPrompt.append;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
systemPrompt = opts.systemPrompt;
|
|
241
|
+
}
|
|
242
|
+
// Build canUseTool based on permission mode
|
|
243
|
+
const permMode = opts.permissionMode ?? 'bypassPermissions';
|
|
244
|
+
const canUseTool = opts.canUseTool ?? (async (_tool, _input) => {
|
|
245
|
+
if (permMode === 'bypassPermissions' || permMode === 'dontAsk' || permMode === 'auto') {
|
|
246
|
+
return { behavior: 'allow' };
|
|
247
|
+
}
|
|
248
|
+
if (permMode === 'acceptEdits') {
|
|
249
|
+
return { behavior: 'allow' };
|
|
250
|
+
}
|
|
251
|
+
return { behavior: 'allow' };
|
|
252
|
+
});
|
|
253
|
+
// Resolve tools with overrides
|
|
254
|
+
let tools = this.toolPool;
|
|
255
|
+
if (overrides?.allowedTools || overrides?.disallowedTools) {
|
|
256
|
+
tools = filterTools(tools, overrides.allowedTools, overrides.disallowedTools);
|
|
257
|
+
}
|
|
258
|
+
if (overrides?.tools) {
|
|
259
|
+
const ot = overrides.tools;
|
|
260
|
+
if (Array.isArray(ot) && ot.length > 0 && typeof ot[0] === 'string') {
|
|
261
|
+
tools = filterTools(this.toolPool, ot);
|
|
262
|
+
}
|
|
263
|
+
else if (Array.isArray(ot)) {
|
|
264
|
+
tools = ot;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Recreate provider if overrides change credentials or apiType
|
|
268
|
+
let provider = this.provider;
|
|
269
|
+
if (overrides?.apiType || overrides?.apiKey || overrides?.baseURL) {
|
|
270
|
+
const resolvedApiType = overrides.apiType ?? this.apiType;
|
|
271
|
+
provider = createProvider(resolvedApiType, {
|
|
272
|
+
apiKey: overrides.apiKey ?? this.apiCredentials.key,
|
|
273
|
+
baseURL: overrides.baseURL ?? this.apiCredentials.baseUrl,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
// Create query engine with current conversation state
|
|
277
|
+
const engine = new QueryEngine({
|
|
278
|
+
cwd,
|
|
279
|
+
model: opts.model || this.modelId,
|
|
280
|
+
provider,
|
|
281
|
+
tools,
|
|
282
|
+
systemPrompt,
|
|
283
|
+
appendSystemPrompt,
|
|
284
|
+
maxTurns: opts.maxTurns ?? 10,
|
|
285
|
+
maxBudgetUsd: opts.maxBudgetUsd,
|
|
286
|
+
maxTokens: opts.maxTokens ?? 16384,
|
|
287
|
+
thinking: opts.thinking,
|
|
288
|
+
jsonSchema: opts.jsonSchema,
|
|
289
|
+
canUseTool,
|
|
290
|
+
includePartialMessages: opts.includePartialMessages ?? false,
|
|
291
|
+
abortSignal: this.abortCtrl.signal,
|
|
292
|
+
agents: opts.agents,
|
|
293
|
+
hookRegistry: this.hookRegistry,
|
|
294
|
+
sessionId: this.sid,
|
|
295
|
+
contextWindowSize: opts.contextWindowSize,
|
|
296
|
+
pricingPerMillion: opts.pricingPerMillion,
|
|
297
|
+
spill: opts.spill,
|
|
298
|
+
});
|
|
299
|
+
this.currentEngine = engine;
|
|
300
|
+
// Inject existing conversation history
|
|
301
|
+
for (const msg of this.history) {
|
|
302
|
+
engine.messages.push(msg);
|
|
303
|
+
}
|
|
304
|
+
// Run the engine
|
|
305
|
+
for await (const event of engine.submitMessage(prompt)) {
|
|
306
|
+
yield event;
|
|
307
|
+
// Track assistant messages for multi-turn persistence
|
|
308
|
+
if (event.type === 'assistant') {
|
|
309
|
+
const uuid = crypto.randomUUID();
|
|
310
|
+
const timestamp = new Date().toISOString();
|
|
311
|
+
this.messageLog.push({
|
|
312
|
+
type: 'assistant',
|
|
313
|
+
message: event.message,
|
|
314
|
+
uuid,
|
|
315
|
+
timestamp,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Persist conversation state for multi-turn
|
|
320
|
+
this.history = engine.getMessages();
|
|
321
|
+
// Add user message to tracked messages
|
|
322
|
+
const userUuid = crypto.randomUUID();
|
|
323
|
+
this.messageLog.push({
|
|
324
|
+
type: 'user',
|
|
325
|
+
message: { role: 'user', content: prompt },
|
|
326
|
+
uuid: userUuid,
|
|
327
|
+
timestamp: new Date().toISOString(),
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Convenience method: send a prompt and collect the final answer as a single object.
|
|
332
|
+
* Internally iterates through the streaming query and aggregates the outcome.
|
|
333
|
+
*/
|
|
334
|
+
async prompt(text, overrides) {
|
|
335
|
+
const t0 = performance.now();
|
|
336
|
+
const collected = { text: '', turns: 0, tokens: { in: 0, out: 0 } };
|
|
337
|
+
for await (const ev of this.query(text, overrides)) {
|
|
338
|
+
switch (ev.type) {
|
|
339
|
+
case 'assistant': {
|
|
340
|
+
// Extract the last assistant text (multi-turn: only final answer matters)
|
|
341
|
+
const fragments = ev.message.content
|
|
342
|
+
.filter((c) => c.type === 'text')
|
|
343
|
+
.map((c) => c.text);
|
|
344
|
+
if (fragments.length)
|
|
345
|
+
collected.text = fragments.join('');
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
case 'result':
|
|
349
|
+
collected.turns = ev.num_turns ?? 0;
|
|
350
|
+
collected.tokens.in = ev.usage?.input_tokens ?? 0;
|
|
351
|
+
collected.tokens.out = ev.usage?.output_tokens ?? 0;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return {
|
|
356
|
+
text: collected.text,
|
|
357
|
+
usage: { input_tokens: collected.tokens.in, output_tokens: collected.tokens.out },
|
|
358
|
+
num_turns: collected.turns,
|
|
359
|
+
duration_ms: Math.round(performance.now() - t0),
|
|
360
|
+
messages: [...this.messageLog],
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Goal-driven autonomous loop.
|
|
365
|
+
*
|
|
366
|
+
* Runs the agent toward `goal` over up to `maxRounds` rounds. Unlike a single
|
|
367
|
+
* `query`, the agent keeps working ("give it a task and let it run until done")
|
|
368
|
+
* and only stops when:
|
|
369
|
+
* - it calls the injected `update_goal` tool with goal_status="complete", or
|
|
370
|
+
* - it reports goal_status="blocked", or
|
|
371
|
+
* - `maxRounds` is exhausted (returns with a helpful error event), or
|
|
372
|
+
* - it is aborted.
|
|
373
|
+
*
|
|
374
|
+
* The `update_goal` internal tool is injected into the tool pool and a
|
|
375
|
+
* goal-mode system prompt is appended, so the agent knows it should keep
|
|
376
|
+
* working autonomously and how to signal completion.
|
|
377
|
+
*/
|
|
378
|
+
async *runGoal(goal, overrides) {
|
|
379
|
+
const goalOpts = this.cfg.goal;
|
|
380
|
+
const maxRounds = overrides?.maxGoalRounds ??
|
|
381
|
+
(typeof goalOpts === 'object' ? goalOpts.maxGoalRounds : undefined) ??
|
|
382
|
+
10;
|
|
383
|
+
const turnsPerRound = overrides?.turnsPerRound ??
|
|
384
|
+
(typeof goalOpts === 'object' ? goalOpts.turnsPerRound : undefined);
|
|
385
|
+
const maxConsecutiveStalls = typeof goalOpts === 'object'
|
|
386
|
+
? goalOpts.maxConsecutiveStalls
|
|
387
|
+
: undefined;
|
|
388
|
+
// Reset the shared goal-state record for this run.
|
|
389
|
+
resetGoalState();
|
|
390
|
+
// Inject the internal update_goal tool and the goal-mode system prompt.
|
|
391
|
+
const goalTool = createUpdateGoalTool();
|
|
392
|
+
// Build a base tool pool: if the caller restricts tools, respect it; else
|
|
393
|
+
// use the agent's resolved pool. Always append the internal tool.
|
|
394
|
+
const baseTools = this.toolPool;
|
|
395
|
+
const toolOverrides = {
|
|
396
|
+
tools: [...baseTools, goalTool],
|
|
397
|
+
};
|
|
398
|
+
// Track consecutive rounds without a status update (stall detection).
|
|
399
|
+
let lastRevision = getGoalState().revision;
|
|
400
|
+
let consecutiveStalls = 0;
|
|
401
|
+
let roundsDone = 0;
|
|
402
|
+
for (; roundsDone < maxRounds; roundsDone++) {
|
|
403
|
+
const roundTarget = roundsDone === 0
|
|
404
|
+
? goal
|
|
405
|
+
: `Continue working toward the goal. Stay on task and do not stop until the goal is complete or you are truly blocked. Call update_goal with goal_status="complete" when done.`;
|
|
406
|
+
const roundOverrides = {
|
|
407
|
+
...toolOverrides,
|
|
408
|
+
appendSystemPrompt: [
|
|
409
|
+
this.cfg.appendSystemPrompt,
|
|
410
|
+
buildGoalSystemPrompt(goal, maxRounds),
|
|
411
|
+
].filter(Boolean).join('\n\n'),
|
|
412
|
+
maxTurns: turnsPerRound,
|
|
413
|
+
// Never re-enter the goal guard from inside a goal round.
|
|
414
|
+
goal: {
|
|
415
|
+
...(typeof this.cfg.goal === 'object' ? this.cfg.goal : {}),
|
|
416
|
+
enabledOnQuery: false,
|
|
417
|
+
},
|
|
418
|
+
};
|
|
419
|
+
for await (const ev of this.query(roundTarget, roundOverrides)) {
|
|
420
|
+
yield ev;
|
|
421
|
+
}
|
|
422
|
+
const state = getGoalState();
|
|
423
|
+
// If the model reported complete/blocked, stop.
|
|
424
|
+
if (state.revision > lastRevision) {
|
|
425
|
+
consecutiveStalls = 0;
|
|
426
|
+
if (state.status === 'complete' || state.status === 'blocked') {
|
|
427
|
+
yield {
|
|
428
|
+
type: 'result',
|
|
429
|
+
subtype: state.status === 'complete' ? 'success' : 'goal_blocked',
|
|
430
|
+
num_turns: roundsDone + 1,
|
|
431
|
+
errors: state.status === 'blocked' ? [state.summary || 'Goal blocked'] : undefined,
|
|
432
|
+
};
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
lastRevision = state.revision;
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
// No status update this round.
|
|
439
|
+
consecutiveStalls++;
|
|
440
|
+
if (maxConsecutiveStalls && consecutiveStalls >= maxConsecutiveStalls) {
|
|
441
|
+
yield {
|
|
442
|
+
type: 'result',
|
|
443
|
+
subtype: 'goal_blocked',
|
|
444
|
+
num_turns: roundsDone + 1,
|
|
445
|
+
errors: [`No progress reported for ${consecutiveStalls} consecutive rounds.`],
|
|
446
|
+
};
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Rounds exhausted without completion.
|
|
452
|
+
yield {
|
|
453
|
+
type: 'result',
|
|
454
|
+
subtype: 'error_max_rounds',
|
|
455
|
+
num_turns: roundsDone,
|
|
456
|
+
errors: [`Goal not completed after ${maxRounds} rounds.`],
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get conversation messages.
|
|
461
|
+
*/
|
|
462
|
+
getMessages() {
|
|
463
|
+
return [...this.messageLog];
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Reset conversation history.
|
|
467
|
+
*/
|
|
468
|
+
clear() {
|
|
469
|
+
this.history = [];
|
|
470
|
+
this.messageLog = [];
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Interrupt the current query.
|
|
474
|
+
*/
|
|
475
|
+
async interrupt() {
|
|
476
|
+
this.abortCtrl?.abort();
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Change the model during a session.
|
|
480
|
+
*/
|
|
481
|
+
async setModel(model) {
|
|
482
|
+
if (model) {
|
|
483
|
+
this.modelId = model;
|
|
484
|
+
this.cfg.model = model;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Change the permission mode during a session.
|
|
489
|
+
*/
|
|
490
|
+
async setPermissionMode(mode) {
|
|
491
|
+
this.cfg.permissionMode = mode;
|
|
492
|
+
}
|
|
493
|
+
/**
|
|
494
|
+
* Set maximum thinking tokens.
|
|
495
|
+
*/
|
|
496
|
+
async setMaxThinkingTokens(maxThinkingTokens) {
|
|
497
|
+
if (maxThinkingTokens === null) {
|
|
498
|
+
this.cfg.thinking = { type: 'disabled' };
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
this.cfg.thinking = { type: 'enabled', budgetTokens: maxThinkingTokens };
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Get the session ID.
|
|
506
|
+
*/
|
|
507
|
+
getSessionId() {
|
|
508
|
+
return this.sid;
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Get the current API type.
|
|
512
|
+
*/
|
|
513
|
+
getApiType() {
|
|
514
|
+
return this.apiType;
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Stop a background task.
|
|
518
|
+
*/
|
|
519
|
+
async stopTask(taskId) {
|
|
520
|
+
const { getTask } = await import('./tools/task-tools.js');
|
|
521
|
+
const task = getTask(taskId);
|
|
522
|
+
if (task) {
|
|
523
|
+
task.status = 'cancelled';
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Close MCP connections and clean up.
|
|
528
|
+
* Optionally persist session to disk.
|
|
529
|
+
*/
|
|
530
|
+
async close() {
|
|
531
|
+
// Persist session if enabled
|
|
532
|
+
if (this.cfg.persistSession !== false && this.history.length > 0) {
|
|
533
|
+
try {
|
|
534
|
+
await saveSession(this.sid, this.history, {
|
|
535
|
+
cwd: this.cfg.cwd || process.cwd(),
|
|
536
|
+
model: this.modelId,
|
|
537
|
+
summary: undefined,
|
|
538
|
+
});
|
|
539
|
+
}
|
|
540
|
+
catch {
|
|
541
|
+
// Session persistence is best-effort
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
for (const conn of this.mcpLinks) {
|
|
545
|
+
await conn.close();
|
|
546
|
+
}
|
|
547
|
+
this.mcpLinks = [];
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
// --------------------------------------------------------------------------
|
|
551
|
+
// Factory function
|
|
552
|
+
// --------------------------------------------------------------------------
|
|
553
|
+
/** Factory: shorthand for `new Agent(options)`. */
|
|
554
|
+
export function createAgent(options = {}) {
|
|
555
|
+
return new Agent(options);
|
|
556
|
+
}
|
|
557
|
+
// --------------------------------------------------------------------------
|
|
558
|
+
// Standalone query — one-shot convenience wrapper
|
|
559
|
+
// --------------------------------------------------------------------------
|
|
560
|
+
/**
|
|
561
|
+
* Execute a single agentic query without managing an Agent instance.
|
|
562
|
+
* The agent is created, used, and cleaned up automatically.
|
|
563
|
+
*/
|
|
564
|
+
export async function* query(params) {
|
|
565
|
+
const ephemeral = createAgent(params.options);
|
|
566
|
+
try {
|
|
567
|
+
yield* ephemeral.query(params.prompt);
|
|
568
|
+
}
|
|
569
|
+
finally {
|
|
570
|
+
await ephemeral.close();
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryEngine - Core agentic loop
|
|
3
|
+
*
|
|
4
|
+
* Manages the full conversation lifecycle:
|
|
5
|
+
* 1. Take user prompt
|
|
6
|
+
* 2. Build system prompt with context (git status, project context, tools)
|
|
7
|
+
* 3. Call LLM API with tools (via provider abstraction)
|
|
8
|
+
* 4. Stream response
|
|
9
|
+
* 5. Execute tool calls (concurrent for read-only, serial for mutations)
|
|
10
|
+
* 6. Send results back, repeat until done
|
|
11
|
+
* 7. Auto-compact when context exceeds threshold
|
|
12
|
+
* 8. Retry with exponential backoff on transient errors
|
|
13
|
+
*/
|
|
14
|
+
import type { SDKMessage, QueryEngineConfig, TokenUsage } from './types.js';
|
|
15
|
+
import type { NormalizedMessageParam } from './providers/types.js';
|
|
16
|
+
export declare class QueryEngine {
|
|
17
|
+
private config;
|
|
18
|
+
private provider;
|
|
19
|
+
messages: NormalizedMessageParam[];
|
|
20
|
+
private totalUsage;
|
|
21
|
+
private totalCost;
|
|
22
|
+
private turnCount;
|
|
23
|
+
private compactState;
|
|
24
|
+
private sessionId;
|
|
25
|
+
private apiTimeMs;
|
|
26
|
+
private hookRegistry?;
|
|
27
|
+
private spillStore?;
|
|
28
|
+
constructor(config: QueryEngineConfig);
|
|
29
|
+
/**
|
|
30
|
+
* Execute hooks for a lifecycle event.
|
|
31
|
+
* Returns hook outputs; never throws.
|
|
32
|
+
*/
|
|
33
|
+
private executeHooks;
|
|
34
|
+
/**
|
|
35
|
+
* Submit a user message and run the agentic loop.
|
|
36
|
+
* Yields SDKMessage events as the agent works.
|
|
37
|
+
*/
|
|
38
|
+
submitMessage(prompt: string | any[]): AsyncGenerator<SDKMessage>;
|
|
39
|
+
/**
|
|
40
|
+
* Execute tool calls with concurrency control.
|
|
41
|
+
*
|
|
42
|
+
* Read-only tools run concurrently (up to 10 at a time).
|
|
43
|
+
* Mutation tools run sequentially.
|
|
44
|
+
*/
|
|
45
|
+
private executeTools;
|
|
46
|
+
/**
|
|
47
|
+
* Apply the spill policy to each tool result that exceeds the inline cap.
|
|
48
|
+
* Best-effort: a spill failure leaves the original content untouched and
|
|
49
|
+
* never turns a success into an error. Reading tools are skipped to avoid a
|
|
50
|
+
* read -> spill -> read loop.
|
|
51
|
+
*/
|
|
52
|
+
private applySpillToResults;
|
|
53
|
+
/**
|
|
54
|
+
* Execute a single tool with permission checking.
|
|
55
|
+
*/
|
|
56
|
+
private executeSingleTool;
|
|
57
|
+
/**
|
|
58
|
+
* Get current messages for session persistence.
|
|
59
|
+
*/
|
|
60
|
+
getMessages(): NormalizedMessageParam[];
|
|
61
|
+
/**
|
|
62
|
+
* Get total usage across all turns.
|
|
63
|
+
*/
|
|
64
|
+
getUsage(): TokenUsage;
|
|
65
|
+
/**
|
|
66
|
+
* Get total cost.
|
|
67
|
+
*/
|
|
68
|
+
getCost(): number;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAIjB,UAAU,EACX,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAGV,sBAAsB,EAEvB,MAAM,sBAAsB,CAAA;AAwH7B,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAa;IACtB,QAAQ,EAAE,sBAAsB,EAAE,CAAK;IAC9C,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,UAAU,CAAC,CAAY;gBAEnB,MAAM,EAAE,iBAAiB;IAWrC;;;OAGG;YACW,YAAY;IAiB1B;;;OAGG;IACI,aAAa,CAClB,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GACrB,cAAc,CAAC,UAAU,CAAC;IAkR7B;;;;;OAKG;YACW,YAAY;IAkD1B;;;;;OAKG;YACW,mBAAmB;IAiDjC;;OAEG;YACW,iBAAiB;IAuG/B;;OAEG;IACH,WAAW,IAAI,sBAAsB,EAAE;IAIvC;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB"}
|