@soulcraft/sdk 1.6.2 → 2.0.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/dist/client/create-client-sdk.d.ts +16 -2
- package/dist/client/create-client-sdk.d.ts.map +1 -1
- package/dist/client/create-client-sdk.js +2 -7
- package/dist/client/create-client-sdk.js.map +1 -1
- package/dist/client/index.d.ts +48 -37
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +61 -42
- package/dist/client/index.js.map +1 -1
- package/dist/client/namespace-proxy.d.ts +108 -0
- package/dist/client/namespace-proxy.d.ts.map +1 -0
- package/dist/client/namespace-proxy.js +151 -0
- package/dist/client/namespace-proxy.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/app-context/index.d.ts +214 -0
- package/dist/modules/app-context/index.d.ts.map +1 -0
- package/dist/modules/app-context/index.js +569 -0
- package/dist/modules/app-context/index.js.map +1 -0
- package/dist/modules/auth/products.d.ts +208 -0
- package/dist/modules/auth/products.d.ts.map +1 -0
- package/dist/modules/auth/products.js +165 -0
- package/dist/modules/auth/products.js.map +1 -0
- package/dist/namespaces.d.ts +2942 -0
- package/dist/namespaces.d.ts.map +1 -0
- package/dist/namespaces.js +37 -0
- package/dist/namespaces.js.map +1 -0
- package/dist/rpc.d.ts +156 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +26 -0
- package/dist/rpc.js.map +1 -0
- package/dist/server/create-sdk.d.ts.map +1 -1
- package/dist/server/create-sdk.js +3 -13
- package/dist/server/create-sdk.js.map +1 -1
- package/dist/server/handlers/annotations.d.ts +52 -0
- package/dist/server/handlers/annotations.d.ts.map +1 -0
- package/dist/server/handlers/annotations.js +204 -0
- package/dist/server/handlers/annotations.js.map +1 -0
- package/dist/server/handlers/auth.d.ts +53 -0
- package/dist/server/handlers/auth.d.ts.map +1 -0
- package/dist/server/handlers/auth.js +66 -0
- package/dist/server/handlers/auth.js.map +1 -0
- package/dist/server/handlers/certification.d.ts +32 -0
- package/dist/server/handlers/certification.d.ts.map +1 -0
- package/dist/server/handlers/certification.js +253 -0
- package/dist/server/handlers/certification.js.map +1 -0
- package/dist/server/handlers/chat/conversations.d.ts +91 -0
- package/dist/server/handlers/chat/conversations.d.ts.map +1 -0
- package/dist/server/handlers/chat/conversations.js +314 -0
- package/dist/server/handlers/chat/conversations.js.map +1 -0
- package/dist/server/handlers/chat/delegator.d.ts +144 -0
- package/dist/server/handlers/chat/delegator.d.ts.map +1 -0
- package/dist/server/handlers/chat/delegator.js +431 -0
- package/dist/server/handlers/chat/delegator.js.map +1 -0
- package/dist/server/handlers/chat/engine.d.ts +81 -0
- package/dist/server/handlers/chat/engine.d.ts.map +1 -0
- package/dist/server/handlers/chat/engine.js +442 -0
- package/dist/server/handlers/chat/engine.js.map +1 -0
- package/dist/server/handlers/chat/executor.d.ts +65 -0
- package/dist/server/handlers/chat/executor.d.ts.map +1 -0
- package/dist/server/handlers/chat/executor.js +375 -0
- package/dist/server/handlers/chat/executor.js.map +1 -0
- package/dist/server/handlers/chat/index.d.ts +62 -0
- package/dist/server/handlers/chat/index.d.ts.map +1 -0
- package/dist/server/handlers/chat/index.js +182 -0
- package/dist/server/handlers/chat/index.js.map +1 -0
- package/dist/server/handlers/chat/memory.d.ts +91 -0
- package/dist/server/handlers/chat/memory.d.ts.map +1 -0
- package/dist/server/handlers/chat/memory.js +293 -0
- package/dist/server/handlers/chat/memory.js.map +1 -0
- package/dist/server/handlers/chat/models.d.ts +180 -0
- package/dist/server/handlers/chat/models.d.ts.map +1 -0
- package/dist/server/handlers/chat/models.js +304 -0
- package/dist/server/handlers/chat/models.js.map +1 -0
- package/dist/server/handlers/chat/planner.d.ts +116 -0
- package/dist/server/handlers/chat/planner.d.ts.map +1 -0
- package/dist/server/handlers/chat/planner.js +344 -0
- package/dist/server/handlers/chat/planner.js.map +1 -0
- package/dist/server/handlers/chat/types.d.ts +500 -0
- package/dist/server/handlers/chat/types.d.ts.map +1 -0
- package/dist/server/handlers/chat/types.js +11 -0
- package/dist/server/handlers/chat/types.js.map +1 -0
- package/dist/server/handlers/collections.d.ts +67 -0
- package/dist/server/handlers/collections.d.ts.map +1 -0
- package/dist/server/handlers/collections.js +484 -0
- package/dist/server/handlers/collections.js.map +1 -0
- package/dist/server/handlers/commerce.d.ts +106 -0
- package/dist/server/handlers/commerce.d.ts.map +1 -0
- package/dist/server/handlers/commerce.js +62 -0
- package/dist/server/handlers/commerce.js.map +1 -0
- package/dist/server/handlers/config.d.ts +112 -0
- package/dist/server/handlers/config.d.ts.map +1 -0
- package/dist/server/handlers/config.js +122 -0
- package/dist/server/handlers/config.js.map +1 -0
- package/dist/server/handlers/export.d.ts +72 -0
- package/dist/server/handlers/export.d.ts.map +1 -0
- package/dist/server/handlers/export.js +175 -0
- package/dist/server/handlers/export.js.map +1 -0
- package/dist/server/handlers/formats.d.ts +77 -0
- package/dist/server/handlers/formats.d.ts.map +1 -0
- package/dist/server/handlers/formats.js +65 -0
- package/dist/server/handlers/formats.js.map +1 -0
- package/dist/server/handlers/graph.d.ts +31 -0
- package/dist/server/handlers/graph.d.ts.map +1 -0
- package/dist/server/handlers/graph.js +490 -0
- package/dist/server/handlers/graph.js.map +1 -0
- package/dist/server/handlers/import.d.ts +96 -0
- package/dist/server/handlers/import.d.ts.map +1 -0
- package/dist/server/handlers/import.js +108 -0
- package/dist/server/handlers/import.js.map +1 -0
- package/dist/server/handlers/index.d.ts +68 -0
- package/dist/server/handlers/index.d.ts.map +1 -0
- package/dist/server/handlers/index.js +71 -0
- package/dist/server/handlers/index.js.map +1 -0
- package/dist/server/handlers/media.d.ts +76 -0
- package/dist/server/handlers/media.d.ts.map +1 -0
- package/dist/server/handlers/media.js +53 -0
- package/dist/server/handlers/media.js.map +1 -0
- package/dist/server/handlers/project.d.ts +45 -0
- package/dist/server/handlers/project.d.ts.map +1 -0
- package/dist/server/handlers/project.js +181 -0
- package/dist/server/handlers/project.js.map +1 -0
- package/dist/server/handlers/publish.d.ts +102 -0
- package/dist/server/handlers/publish.d.ts.map +1 -0
- package/dist/server/handlers/publish.js +130 -0
- package/dist/server/handlers/publish.js.map +1 -0
- package/dist/server/handlers/pulse.d.ts +39 -0
- package/dist/server/handlers/pulse.d.ts.map +1 -0
- package/dist/server/handlers/pulse.js +78 -0
- package/dist/server/handlers/pulse.js.map +1 -0
- package/dist/server/handlers/realtime.d.ts +55 -0
- package/dist/server/handlers/realtime.d.ts.map +1 -0
- package/dist/server/handlers/realtime.js +49 -0
- package/dist/server/handlers/realtime.js.map +1 -0
- package/dist/server/handlers/search.d.ts +21 -0
- package/dist/server/handlers/search.d.ts.map +1 -0
- package/dist/server/handlers/search.js +237 -0
- package/dist/server/handlers/search.js.map +1 -0
- package/dist/server/handlers/session.d.ts +47 -0
- package/dist/server/handlers/session.d.ts.map +1 -0
- package/dist/server/handlers/session.js +286 -0
- package/dist/server/handlers/session.js.map +1 -0
- package/dist/server/handlers/settings.d.ts +97 -0
- package/dist/server/handlers/settings.d.ts.map +1 -0
- package/dist/server/handlers/settings.js +131 -0
- package/dist/server/handlers/settings.js.map +1 -0
- package/dist/server/handlers/workspace.d.ts +78 -0
- package/dist/server/handlers/workspace.d.ts.map +1 -0
- package/dist/server/handlers/workspace.js +270 -0
- package/dist/server/handlers/workspace.js.map +1 -0
- package/dist/server/hono-router.d.ts +66 -0
- package/dist/server/hono-router.d.ts.map +1 -0
- package/dist/server/hono-router.js +203 -0
- package/dist/server/hono-router.js.map +1 -0
- package/dist/server/index.d.ts +29 -19
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +33 -19
- package/dist/server/index.js.map +1 -1
- package/dist/server/namespace-router.d.ts +204 -0
- package/dist/server/namespace-router.d.ts.map +1 -0
- package/dist/server/namespace-router.js +262 -0
- package/dist/server/namespace-router.js.map +1 -0
- package/dist/transports/http-namespace.d.ts +210 -0
- package/dist/transports/http-namespace.d.ts.map +1 -0
- package/dist/transports/http-namespace.js +514 -0
- package/dist/transports/http-namespace.js.map +1 -0
- package/dist/transports/workshop.d.ts +173 -0
- package/dist/transports/workshop.d.ts.map +1 -0
- package/dist/transports/workshop.js +307 -0
- package/dist/transports/workshop.js.map +1 -0
- package/dist/types.d.ts +65 -67
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -3
- package/dist/types.js.map +1 -1
- package/docs/ADR-004-product-registry.md +108 -0
- package/package.json +1 -1
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/chat/engine
|
|
3
|
+
* @description The core streaming chat engine — agentic tool-use loop with
|
|
4
|
+
* stuck detection, timeout protection, and fire-and-forget persistence.
|
|
5
|
+
*
|
|
6
|
+
* The engine is transport-agnostic: it yields `ChatStreamChunk` frames via
|
|
7
|
+
* an `AsyncGenerator`. The transport layer (SSE, WebSocket, PostMessage)
|
|
8
|
+
* delivers those chunks to the client.
|
|
9
|
+
*
|
|
10
|
+
* ## Agentic Loop
|
|
11
|
+
*
|
|
12
|
+
* When Claude calls a tool, the engine:
|
|
13
|
+
* 1. Executes the tool via the injected {@link ToolExecutor}
|
|
14
|
+
* 2. Feeds the result back to Claude as a `tool_result` message
|
|
15
|
+
* 3. Claude continues (more text, more tool calls, or `message_stop`)
|
|
16
|
+
* 4. Repeat until no more tool calls, max iterations, or timeout
|
|
17
|
+
*
|
|
18
|
+
* ## Stuck Detection
|
|
19
|
+
*
|
|
20
|
+
* If the same tool with the same input is called 3 times consecutively,
|
|
21
|
+
* the engine breaks the loop to prevent infinite spinning.
|
|
22
|
+
*
|
|
23
|
+
* ## Fire-and-Forget
|
|
24
|
+
*
|
|
25
|
+
* Message storage, auto-titling, and background learning happen async
|
|
26
|
+
* without blocking the stream.
|
|
27
|
+
*/
|
|
28
|
+
import { retrieveRelevantMemory, loadUserExpertiseProfile, generateExpertisePromptAdditions, learnFromConversation, updateUserExpertiseProfile } from './memory.js';
|
|
29
|
+
import { createConversation, storeMessage, loadConversationHistory, autoTitleConversation } from './conversations.js';
|
|
30
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
31
|
+
// Default System Prompt
|
|
32
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
33
|
+
/**
|
|
34
|
+
* Minimal system prompt used when no {@link SystemPromptBuilder} is provided.
|
|
35
|
+
*
|
|
36
|
+
* Products should always inject their own prompt builder for full functionality.
|
|
37
|
+
*/
|
|
38
|
+
const DEFAULT_SYSTEM_PROMPT = `You are a helpful AI assistant with access to a knowledge graph. Use the available tools to help the user manage their workspace.`;
|
|
39
|
+
/**
|
|
40
|
+
* Default system prompt builder — returns the static default prompt.
|
|
41
|
+
*/
|
|
42
|
+
const defaultPromptBuilder = {
|
|
43
|
+
async build() {
|
|
44
|
+
return { staticPart: DEFAULT_SYSTEM_PROMPT, dynamicPart: '' };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Run the streaming chat engine for a single message.
|
|
49
|
+
*
|
|
50
|
+
* Yields {@link ChatStreamChunk} frames: `text`, `tool_use`, `tool_result`,
|
|
51
|
+
* `status`, `thinking_start`, `thinking_delta`, `thinking_end`, and
|
|
52
|
+
* terminal `done` or `error`.
|
|
53
|
+
*
|
|
54
|
+
* This is the core of the chat system — the full agentic loop with
|
|
55
|
+
* tool use, stuck detection, timeout, and fire-and-forget persistence.
|
|
56
|
+
*
|
|
57
|
+
* @param opts - Message options.
|
|
58
|
+
* @param handlerCtx - Handler context with brain, user, workspace.
|
|
59
|
+
* @param config - Chat handler configuration (injected dependencies).
|
|
60
|
+
* @yields ChatStreamChunk frames.
|
|
61
|
+
*/
|
|
62
|
+
export async function* streamMessage(opts, handlerCtx, config) {
|
|
63
|
+
const { brain } = handlerCtx;
|
|
64
|
+
const { aiClient, tools, toolExecutor, systemPromptBuilder = defaultPromptBuilder, billing, events, maxIterations = 100, maxDurationMs = 300_000, enableThinking = true, thinkingBudget = 8000, } = config;
|
|
65
|
+
const userId = handlerCtx.user?.id ?? 'anonymous';
|
|
66
|
+
const billingId = handlerCtx.user?.email ?? userId;
|
|
67
|
+
// ─── Billing Check ───────────────────────────────────────────────────
|
|
68
|
+
let billingTier = 'subscriber';
|
|
69
|
+
if (billing) {
|
|
70
|
+
const limitCheck = await billing.checkLimit(billingId, handlerCtx);
|
|
71
|
+
if (!limitCheck.ok) {
|
|
72
|
+
yield {
|
|
73
|
+
type: 'error',
|
|
74
|
+
error: limitCheck.tier === 'free'
|
|
75
|
+
? 'Free message limit reached. Subscribe for more.'
|
|
76
|
+
: 'Monthly message limit reached.',
|
|
77
|
+
};
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
billingTier = limitCheck.tier;
|
|
81
|
+
}
|
|
82
|
+
// ─── Conversation Setup ──────────────────────────────────────────────
|
|
83
|
+
let conversationId = opts.conversationId;
|
|
84
|
+
if (!conversationId) {
|
|
85
|
+
conversationId = await createConversation(brain, userId);
|
|
86
|
+
}
|
|
87
|
+
// Yield conversation ID immediately
|
|
88
|
+
yield { type: 'status', status: `conversation:${conversationId}` };
|
|
89
|
+
// ─── Fire-and-Forget: Store user message + auto-title ────────────────
|
|
90
|
+
storeMessage(brain, conversationId, 'user', opts.message, events).catch(() => { });
|
|
91
|
+
autoTitleConversation(brain, conversationId, opts.message).catch(() => { });
|
|
92
|
+
// ─── Parallel Context Loading ────────────────────────────────────────
|
|
93
|
+
const [conversationHistory, retrievedMemory, expertise] = await Promise.all([
|
|
94
|
+
loadConversationHistory(brain, conversationId, 20).catch(() => []),
|
|
95
|
+
retrieveRelevantMemory(brain, opts.message).catch(() => null),
|
|
96
|
+
loadUserExpertiseProfile(brain).catch(() => null),
|
|
97
|
+
]);
|
|
98
|
+
// ─── Build System Prompt ─────────────────────────────────────────────
|
|
99
|
+
const promptCtx = {
|
|
100
|
+
brain,
|
|
101
|
+
handlerCtx,
|
|
102
|
+
conversationHistory,
|
|
103
|
+
memory: retrievedMemory,
|
|
104
|
+
expertise,
|
|
105
|
+
...(opts.productContext != null ? { productContext: opts.productContext } : {}),
|
|
106
|
+
};
|
|
107
|
+
const { staticPart, dynamicPart } = await systemPromptBuilder.build(promptCtx);
|
|
108
|
+
// Add expertise adaptations
|
|
109
|
+
let fullDynamicPart = dynamicPart;
|
|
110
|
+
if (expertise) {
|
|
111
|
+
const expertiseAdditions = generateExpertisePromptAdditions(expertise);
|
|
112
|
+
if (expertiseAdditions) {
|
|
113
|
+
fullDynamicPart += '\n\n# User Partnership Profile\n' + expertiseAdditions;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// System prompt array for prompt caching
|
|
117
|
+
const systemPromptBlocks = [
|
|
118
|
+
{ type: 'text', text: staticPart, cache_control: { type: 'ephemeral' } },
|
|
119
|
+
{ type: 'text', text: fullDynamicPart },
|
|
120
|
+
];
|
|
121
|
+
// ─── Build Messages Array ────────────────────────────────────────────
|
|
122
|
+
// Current message isn't in history yet (fire-and-forget), so append it
|
|
123
|
+
const messages = [
|
|
124
|
+
...conversationHistory.map(msg => ({ role: msg.role, content: msg.content })),
|
|
125
|
+
{ role: 'user', content: opts.message },
|
|
126
|
+
];
|
|
127
|
+
// ─── Select Model ───────────────────────────────────────────────────
|
|
128
|
+
const selectedModel = opts.model
|
|
129
|
+
?? (billingTier === 'free' ? (config.freeTierModel ?? 'claude-3-5-haiku-latest') : (config.defaultModel ?? 'claude-3-5-haiku-latest'));
|
|
130
|
+
// ─── Initial Claude Call ─────────────────────────────────────────────
|
|
131
|
+
const apiStream = await aiClient.createStream({
|
|
132
|
+
model: selectedModel,
|
|
133
|
+
maxTokens: enableThinking ? 16000 : 4096,
|
|
134
|
+
system: systemPromptBlocks,
|
|
135
|
+
messages,
|
|
136
|
+
tools,
|
|
137
|
+
...(enableThinking ? { thinking: { type: 'enabled', budget_tokens: thinkingBudget } } : {}),
|
|
138
|
+
});
|
|
139
|
+
let fullResponse = '';
|
|
140
|
+
let toolUseBlock = null;
|
|
141
|
+
let thinkingActive = false;
|
|
142
|
+
let assistantMessageId = null;
|
|
143
|
+
let totalInputTokens = 0;
|
|
144
|
+
let totalOutputTokens = 0;
|
|
145
|
+
let agentStep = 0;
|
|
146
|
+
// ─── Process Initial Stream ──────────────────────────────────────────
|
|
147
|
+
for await (const event of apiStream) {
|
|
148
|
+
const chunks = processStreamEvent(event, toolUseBlock, thinkingActive);
|
|
149
|
+
for (const action of chunks) {
|
|
150
|
+
switch (action.type) {
|
|
151
|
+
case 'text':
|
|
152
|
+
fullResponse += action.text;
|
|
153
|
+
yield { type: 'text', text: action.text };
|
|
154
|
+
break;
|
|
155
|
+
case 'thinking_start':
|
|
156
|
+
thinkingActive = true;
|
|
157
|
+
yield { type: 'status', status: 'thinking_start' };
|
|
158
|
+
break;
|
|
159
|
+
case 'thinking_delta':
|
|
160
|
+
yield { type: 'status', status: `thinking:${action.text}` };
|
|
161
|
+
break;
|
|
162
|
+
case 'thinking_end':
|
|
163
|
+
thinkingActive = false;
|
|
164
|
+
yield { type: 'status', status: 'thinking_end' };
|
|
165
|
+
break;
|
|
166
|
+
case 'tool_block_start':
|
|
167
|
+
toolUseBlock = { id: action.id, name: action.name, inputJson: '' };
|
|
168
|
+
break;
|
|
169
|
+
case 'tool_input_delta':
|
|
170
|
+
if (toolUseBlock)
|
|
171
|
+
toolUseBlock.inputJson += action.text ?? '';
|
|
172
|
+
break;
|
|
173
|
+
case 'tool_block_stop':
|
|
174
|
+
// Handled below after loop iteration
|
|
175
|
+
break;
|
|
176
|
+
case 'usage_input':
|
|
177
|
+
totalInputTokens = action.tokens;
|
|
178
|
+
break;
|
|
179
|
+
case 'usage_output':
|
|
180
|
+
totalOutputTokens = action.tokens;
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// ─── Tool Execution ──────────────────────────────────────────────
|
|
185
|
+
if (event.type === 'content_block_stop' && toolUseBlock) {
|
|
186
|
+
const parsedInput = safeParseJson(toolUseBlock.inputJson);
|
|
187
|
+
agentStep++;
|
|
188
|
+
yield {
|
|
189
|
+
type: 'tool_use',
|
|
190
|
+
toolCall: { id: toolUseBlock.id, name: toolUseBlock.name, input: parsedInput },
|
|
191
|
+
};
|
|
192
|
+
// Store assistant message for tool context
|
|
193
|
+
if (!assistantMessageId) {
|
|
194
|
+
assistantMessageId = await storeMessage(brain, conversationId, 'assistant', fullResponse || '[Tool use]', events);
|
|
195
|
+
}
|
|
196
|
+
const toolCtx = {
|
|
197
|
+
brain,
|
|
198
|
+
conversationId,
|
|
199
|
+
assistantMessageId,
|
|
200
|
+
handlerCtx,
|
|
201
|
+
...(opts.productContext != null ? { productContext: opts.productContext } : {}),
|
|
202
|
+
};
|
|
203
|
+
try {
|
|
204
|
+
const toolResult = await toolExecutor.execute(toolUseBlock.name, parsedInput, toolCtx);
|
|
205
|
+
yield {
|
|
206
|
+
type: 'tool_result',
|
|
207
|
+
toolResult: { toolUseId: toolUseBlock.id, content: JSON.stringify(toolResult) },
|
|
208
|
+
};
|
|
209
|
+
// ─── Agentic Loop ──────────────────────────────────────────
|
|
210
|
+
let conversationMessages = [
|
|
211
|
+
...messages,
|
|
212
|
+
{ role: 'assistant', content: [{ type: 'tool_use', id: toolUseBlock.id, name: toolUseBlock.name, input: parsedInput }] },
|
|
213
|
+
{ role: 'user', content: [{ type: 'tool_result', tool_use_id: toolUseBlock.id, content: JSON.stringify(toolResult) }] },
|
|
214
|
+
];
|
|
215
|
+
const loopStartTime = Date.now();
|
|
216
|
+
const recentToolCalls = [];
|
|
217
|
+
let continueLoop = true;
|
|
218
|
+
let loopCount = 0;
|
|
219
|
+
while (continueLoop && loopCount < maxIterations) {
|
|
220
|
+
loopCount++;
|
|
221
|
+
// Timeout check
|
|
222
|
+
if (Date.now() - loopStartTime > maxDurationMs) {
|
|
223
|
+
yield { type: 'text', text: '\n\n*Task taking longer than expected. Pausing here.*' };
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
const followUpStream = await aiClient.createStream({
|
|
227
|
+
model: selectedModel,
|
|
228
|
+
maxTokens: 4096,
|
|
229
|
+
system: systemPromptBlocks,
|
|
230
|
+
messages: conversationMessages,
|
|
231
|
+
tools,
|
|
232
|
+
});
|
|
233
|
+
let followUpToolBlock = null;
|
|
234
|
+
let hasToolUse = false;
|
|
235
|
+
for await (const followUpEvent of followUpStream) {
|
|
236
|
+
if (followUpEvent.type === 'content_block_start' && followUpEvent.content_block?.type === 'tool_use') {
|
|
237
|
+
followUpToolBlock = {
|
|
238
|
+
id: followUpEvent.content_block.id || '',
|
|
239
|
+
name: followUpEvent.content_block.name || '',
|
|
240
|
+
inputJson: '',
|
|
241
|
+
};
|
|
242
|
+
hasToolUse = true;
|
|
243
|
+
}
|
|
244
|
+
if (followUpEvent.type === 'content_block_delta') {
|
|
245
|
+
if (followUpEvent.delta?.type === 'text_delta' && followUpEvent.delta.text) {
|
|
246
|
+
fullResponse += followUpEvent.delta.text;
|
|
247
|
+
yield { type: 'text', text: followUpEvent.delta.text };
|
|
248
|
+
}
|
|
249
|
+
if (followUpEvent.delta?.type === 'input_json_delta' && followUpToolBlock) {
|
|
250
|
+
followUpToolBlock.inputJson += followUpEvent.delta.partial_json ?? '';
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (followUpEvent.type === 'message_start' && followUpEvent.message?.usage?.input_tokens) {
|
|
254
|
+
totalInputTokens += followUpEvent.message.usage.input_tokens;
|
|
255
|
+
}
|
|
256
|
+
if (followUpEvent.type === 'message_delta' && followUpEvent.usage?.output_tokens) {
|
|
257
|
+
totalOutputTokens += followUpEvent.usage.output_tokens;
|
|
258
|
+
}
|
|
259
|
+
// Tool block stop in follow-up
|
|
260
|
+
if (followUpEvent.type === 'content_block_stop' && followUpToolBlock) {
|
|
261
|
+
const parsedFollowUpInput = safeParseJson(followUpToolBlock.inputJson);
|
|
262
|
+
agentStep++;
|
|
263
|
+
// Stuck detection
|
|
264
|
+
const inputHash = JSON.stringify(parsedFollowUpInput);
|
|
265
|
+
recentToolCalls.push({ name: followUpToolBlock.name, inputHash });
|
|
266
|
+
if (recentToolCalls.length >= 3) {
|
|
267
|
+
const last3 = recentToolCalls.slice(-3);
|
|
268
|
+
if (last3.every(c => c.name === last3[0].name && c.inputHash === last3[0].inputHash)) {
|
|
269
|
+
yield { type: 'text', text: '\n\n*I seem to be repeating the same action. Let me stop here.*' };
|
|
270
|
+
continueLoop = false;
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
yield {
|
|
275
|
+
type: 'tool_use',
|
|
276
|
+
toolCall: { id: followUpToolBlock.id, name: followUpToolBlock.name, input: parsedFollowUpInput },
|
|
277
|
+
};
|
|
278
|
+
const followUpToolResult = await toolExecutor.execute(followUpToolBlock.name, parsedFollowUpInput, toolCtx);
|
|
279
|
+
yield {
|
|
280
|
+
type: 'tool_result',
|
|
281
|
+
toolResult: { toolUseId: followUpToolBlock.id, content: JSON.stringify(followUpToolResult) },
|
|
282
|
+
};
|
|
283
|
+
conversationMessages = [
|
|
284
|
+
...conversationMessages,
|
|
285
|
+
{ role: 'assistant', content: [{ type: 'tool_use', id: followUpToolBlock.id, name: followUpToolBlock.name, input: parsedFollowUpInput }] },
|
|
286
|
+
{ role: 'user', content: [{ type: 'tool_result', tool_use_id: followUpToolBlock.id, content: JSON.stringify(followUpToolResult) }] },
|
|
287
|
+
];
|
|
288
|
+
followUpToolBlock = null;
|
|
289
|
+
}
|
|
290
|
+
if (followUpEvent.type === 'message_stop') {
|
|
291
|
+
if (!hasToolUse)
|
|
292
|
+
continueLoop = false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Max iterations warning
|
|
297
|
+
if (loopCount >= maxIterations) {
|
|
298
|
+
yield { type: 'text', text: '\n\n*Reached maximum tool call limit.*' };
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch (toolError) {
|
|
302
|
+
const errMsg = toolError instanceof Error ? toolError.message : String(toolError);
|
|
303
|
+
yield { type: 'error', error: `Tool error: ${errMsg}` };
|
|
304
|
+
}
|
|
305
|
+
toolUseBlock = null;
|
|
306
|
+
}
|
|
307
|
+
// ─── Message Complete ────────────────────────────────────────────
|
|
308
|
+
if (event.type === 'message_stop') {
|
|
309
|
+
// Store or update assistant message
|
|
310
|
+
if (fullResponse && !assistantMessageId) {
|
|
311
|
+
assistantMessageId = await storeMessage(brain, conversationId, 'assistant', fullResponse, events);
|
|
312
|
+
}
|
|
313
|
+
else if (fullResponse && assistantMessageId) {
|
|
314
|
+
try {
|
|
315
|
+
const existing = await brain.get(assistantMessageId);
|
|
316
|
+
if (existing) {
|
|
317
|
+
await brain.update({ id: assistantMessageId, data: { ...existing.data, content: fullResponse } });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch { /* non-fatal */ }
|
|
321
|
+
}
|
|
322
|
+
// Background learning (fire-and-forget)
|
|
323
|
+
backgroundLearn(brain, conversationId).catch(() => { });
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// ─── Record Usage ──────────────────────────────────────────────────
|
|
327
|
+
if (billing) {
|
|
328
|
+
billing.recordUsage(billingId, totalInputTokens, totalOutputTokens, selectedModel);
|
|
329
|
+
}
|
|
330
|
+
// ─── Terminal Done Frame ───────────────────────────────────────────
|
|
331
|
+
yield {
|
|
332
|
+
type: 'done',
|
|
333
|
+
usage: { inputTokens: totalInputTokens, outputTokens: totalOutputTokens, model: selectedModel },
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
337
|
+
// Non-Streaming Send
|
|
338
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
339
|
+
/**
|
|
340
|
+
* Send a message and collect the full response (non-streaming).
|
|
341
|
+
*
|
|
342
|
+
* Internally uses the streaming engine and collects all text chunks.
|
|
343
|
+
*
|
|
344
|
+
* @param opts - Message options.
|
|
345
|
+
* @param handlerCtx - Handler context.
|
|
346
|
+
* @param config - Chat handler configuration.
|
|
347
|
+
* @returns Complete response with conversation ID and usage.
|
|
348
|
+
*/
|
|
349
|
+
export async function sendMessage(opts, handlerCtx, config) {
|
|
350
|
+
let fullText = '';
|
|
351
|
+
let conversationId = opts.conversationId ?? '';
|
|
352
|
+
let usage = { inputTokens: 0, outputTokens: 0, model: '' };
|
|
353
|
+
for await (const chunk of streamMessage(opts, handlerCtx, config)) {
|
|
354
|
+
if (chunk.type === 'text' && chunk.text)
|
|
355
|
+
fullText += chunk.text;
|
|
356
|
+
if (chunk.type === 'status' && chunk.status?.startsWith('conversation:')) {
|
|
357
|
+
conversationId = chunk.status.slice('conversation:'.length);
|
|
358
|
+
}
|
|
359
|
+
if (chunk.type === 'done' && chunk.usage)
|
|
360
|
+
usage = chunk.usage;
|
|
361
|
+
if (chunk.type === 'error')
|
|
362
|
+
throw new Error(chunk.error);
|
|
363
|
+
}
|
|
364
|
+
return { response: fullText, conversationId, usage };
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Process a single Anthropic stream event into internal actions.
|
|
368
|
+
*
|
|
369
|
+
* @param event - Raw stream event from the AI client.
|
|
370
|
+
* @param toolUseBlock - Current tool use block (if in progress).
|
|
371
|
+
* @param thinkingActive - Whether thinking mode is active.
|
|
372
|
+
* @returns Array of actions to process.
|
|
373
|
+
*/
|
|
374
|
+
function processStreamEvent(event, toolUseBlock, thinkingActive) {
|
|
375
|
+
const actions = [];
|
|
376
|
+
if (event.type === 'content_block_start') {
|
|
377
|
+
if (event.content_block?.type === 'tool_use') {
|
|
378
|
+
actions.push({
|
|
379
|
+
type: 'tool_block_start',
|
|
380
|
+
id: event.content_block.id ?? '',
|
|
381
|
+
name: event.content_block.name ?? '',
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
if (event.content_block?.type === 'thinking') {
|
|
385
|
+
actions.push({ type: 'thinking_start' });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (event.type === 'content_block_delta') {
|
|
389
|
+
if (event.delta?.type === 'text_delta' && event.delta.text) {
|
|
390
|
+
actions.push({ type: 'text', text: event.delta.text });
|
|
391
|
+
}
|
|
392
|
+
if (event.delta?.type === 'thinking_delta' && event.delta.thinking) {
|
|
393
|
+
actions.push({ type: 'thinking_delta', text: event.delta.thinking });
|
|
394
|
+
}
|
|
395
|
+
if (event.delta?.type === 'input_json_delta' && toolUseBlock) {
|
|
396
|
+
actions.push({ type: 'tool_input_delta', text: event.delta.partial_json ?? '' });
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
if (event.type === 'content_block_stop') {
|
|
400
|
+
if (thinkingActive) {
|
|
401
|
+
actions.push({ type: 'thinking_end' });
|
|
402
|
+
}
|
|
403
|
+
if (toolUseBlock) {
|
|
404
|
+
actions.push({ type: 'tool_block_stop' });
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (event.type === 'message_start' && event.message?.usage?.input_tokens) {
|
|
408
|
+
actions.push({ type: 'usage_input', tokens: event.message.usage.input_tokens });
|
|
409
|
+
}
|
|
410
|
+
if (event.type === 'message_delta' && event.usage?.output_tokens) {
|
|
411
|
+
actions.push({ type: 'usage_output', tokens: event.usage.output_tokens });
|
|
412
|
+
}
|
|
413
|
+
return actions;
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Safely parse JSON, returning an empty object on failure.
|
|
417
|
+
*
|
|
418
|
+
* @param json - JSON string to parse.
|
|
419
|
+
* @returns Parsed object or empty object.
|
|
420
|
+
*/
|
|
421
|
+
function safeParseJson(json) {
|
|
422
|
+
try {
|
|
423
|
+
return json ? JSON.parse(json) : {};
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return {};
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Background learning — extract insights and update expertise profile.
|
|
431
|
+
*
|
|
432
|
+
* @param brain - Brainy instance.
|
|
433
|
+
* @param conversationId - Conversation to learn from.
|
|
434
|
+
*/
|
|
435
|
+
async function backgroundLearn(brain, conversationId) {
|
|
436
|
+
const messages = await loadConversationHistory(brain, conversationId, 10);
|
|
437
|
+
await Promise.all([
|
|
438
|
+
learnFromConversation(brain, conversationId, messages),
|
|
439
|
+
updateUserExpertiseProfile(brain, messages),
|
|
440
|
+
]);
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../../src/server/handlers/chat/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module server/handlers/chat/executor
|
|
3
|
+
* @description Plan step execution with dependency resolution and auto-escalation.
|
|
4
|
+
*
|
|
5
|
+
* The executor runs approved plans step-by-step:
|
|
6
|
+
* 1. Topologically sorts steps by dependencies
|
|
7
|
+
* 2. Executes each step using the executor model (Haiku)
|
|
8
|
+
* 3. Auto-escalates to the fallback model (Sonnet) on step failure
|
|
9
|
+
* 4. Skips steps whose dependencies failed
|
|
10
|
+
* 5. Tracks cost and reports progress via callbacks
|
|
11
|
+
*
|
|
12
|
+
* Each step is sent to Claude with its description, the plan's goal, and
|
|
13
|
+
* completed step context. Claude uses the product's tool set to execute.
|
|
14
|
+
*/
|
|
15
|
+
import type { Brainy } from '@soulcraft/brainy';
|
|
16
|
+
import type { ChatAIClient, ToolDefinition, ToolExecutor, ToolExecutionContext, AIPlan, StepProgress, PlanExecutionResult } from './types.js';
|
|
17
|
+
/** Callback for plan execution progress. */
|
|
18
|
+
export type ProgressCallback = (progress: StepProgress) => Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Options for executing a plan.
|
|
21
|
+
*/
|
|
22
|
+
export interface ExecutePlanOptions {
|
|
23
|
+
/** The approved plan to execute. */
|
|
24
|
+
plan: AIPlan;
|
|
25
|
+
/** Brainy entity ID of the plan. */
|
|
26
|
+
planId: string;
|
|
27
|
+
/** Brainy instance. */
|
|
28
|
+
brain: Brainy;
|
|
29
|
+
/** AI client for calling Claude. */
|
|
30
|
+
aiClient: ChatAIClient;
|
|
31
|
+
/** Available tool definitions. */
|
|
32
|
+
tools: ToolDefinition[];
|
|
33
|
+
/** Tool executor. */
|
|
34
|
+
toolExecutor: ToolExecutor;
|
|
35
|
+
/** Tool execution context. */
|
|
36
|
+
toolContext: ToolExecutionContext;
|
|
37
|
+
/** Progress callback. */
|
|
38
|
+
onProgress?: ProgressCallback;
|
|
39
|
+
/** Executor model. Defaults to Haiku. */
|
|
40
|
+
executeModel?: string;
|
|
41
|
+
/** Fallback model for escalation. Defaults to Sonnet. */
|
|
42
|
+
fallbackModel?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Execute an approved plan step-by-step.
|
|
46
|
+
*
|
|
47
|
+
* Steps are topologically sorted by dependencies. Each step is executed with
|
|
48
|
+
* the executor model; on failure, auto-escalates to the fallback model.
|
|
49
|
+
* Steps whose dependencies failed are skipped.
|
|
50
|
+
*
|
|
51
|
+
* @param options - Plan execution configuration.
|
|
52
|
+
* @returns Execution result with per-step details and total cost.
|
|
53
|
+
*/
|
|
54
|
+
export declare function executePlan(options: ExecutePlanOptions): Promise<PlanExecutionResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Resume execution of a partially completed plan.
|
|
57
|
+
*
|
|
58
|
+
* Finds pending/failed steps and re-executes them.
|
|
59
|
+
*
|
|
60
|
+
* @param options - Execution options (without plan — loaded from Brainy).
|
|
61
|
+
* @param planId - Brainy entity ID of the plan.
|
|
62
|
+
* @returns Execution result for the remaining steps.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resumePlanExecution(options: Omit<ExecutePlanOptions, 'plan'>, planId: string): Promise<PlanExecutionResult>;
|
|
65
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../../src/server/handlers/chat/executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,MAAM,EAEN,YAAY,EACZ,mBAAmB,EACpB,MAAM,YAAY,CAAA;AAmBnB,4CAA4C;AAC5C,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAExE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,QAAQ,EAAE,YAAY,CAAA;IACtB,kCAAkC;IAClC,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,qBAAqB;IACrB,YAAY,EAAE,YAAY,CAAA;IAC1B,8BAA8B;IAC9B,WAAW,EAAE,oBAAoB,CAAA;IACjC,yBAAyB;IACzB,UAAU,CAAC,EAAE,gBAAgB,CAAA;IAC7B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AA0BD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoJ3F;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,EACzC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,mBAAmB,CAAC,CA6B9B"}
|