discord-agent-bridge 0.1.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 +195 -0
- package/dist/app.js +210 -0
- package/dist/app.js.map +1 -0
- package/dist/app.test.js +117 -0
- package/dist/app.test.js.map +1 -0
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.js +91 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/core/auditLog.js +65 -0
- package/dist/core/auditLog.js.map +1 -0
- package/dist/core/auditLog.test.js +124 -0
- package/dist/core/auditLog.test.js.map +1 -0
- package/dist/core/auth.js +106 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/auth.test.js +216 -0
- package/dist/core/auth.test.js.map +1 -0
- package/dist/core/channelRegistry.js +119 -0
- package/dist/core/channelRegistry.js.map +1 -0
- package/dist/core/channelRegistry.test.js +114 -0
- package/dist/core/channelRegistry.test.js.map +1 -0
- package/dist/core/commandPolicy.js +6 -0
- package/dist/core/commandPolicy.js.map +1 -0
- package/dist/core/commandRouter.js +9 -0
- package/dist/core/commandRouter.js.map +1 -0
- package/dist/core/config.js +141 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/config.test.js +149 -0
- package/dist/core/config.test.js.map +1 -0
- package/dist/core/configResolver.js +90 -0
- package/dist/core/configResolver.js.map +1 -0
- package/dist/core/configResolver.test.js +138 -0
- package/dist/core/configResolver.test.js.map +1 -0
- package/dist/core/configSchema.js +164 -0
- package/dist/core/configSchema.js.map +1 -0
- package/dist/core/contracts.js +5 -0
- package/dist/core/contracts.js.map +1 -0
- package/dist/core/eventBus.js +42 -0
- package/dist/core/eventBus.js.map +1 -0
- package/dist/core/eventBus.test.js +72 -0
- package/dist/core/eventBus.test.js.map +1 -0
- package/dist/core/hookBridge.js +11 -0
- package/dist/core/hookBridge.js.map +1 -0
- package/dist/core/logger.js +116 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/logger.test.js +88 -0
- package/dist/core/logger.test.js.map +1 -0
- package/dist/core/modeRegistry.js +33 -0
- package/dist/core/modeRegistry.js.map +1 -0
- package/dist/core/permissionResolver.js +43 -0
- package/dist/core/permissionResolver.js.map +1 -0
- package/dist/core/permissionResolver.test.js +136 -0
- package/dist/core/permissionResolver.test.js.map +1 -0
- package/dist/core/providerCatalog.js +240 -0
- package/dist/core/providerCatalog.js.map +1 -0
- package/dist/core/providerCatalog.test.js +230 -0
- package/dist/core/providerCatalog.test.js.map +1 -0
- package/dist/core/sessionOrchestrator.js +463 -0
- package/dist/core/sessionOrchestrator.js.map +1 -0
- package/dist/core/sessionOrchestrator.test.js +344 -0
- package/dist/core/sessionOrchestrator.test.js.map +1 -0
- package/dist/core/state/schema.js +49 -0
- package/dist/core/state/schema.js.map +1 -0
- package/dist/core/state/store.js +86 -0
- package/dist/core/state/store.js.map +1 -0
- package/dist/core/state/store.test.js +99 -0
- package/dist/core/state/store.test.js.map +1 -0
- package/dist/core/usageService.js +310 -0
- package/dist/core/usageService.js.map +1 -0
- package/dist/core/usageService.test.js +234 -0
- package/dist/core/usageService.test.js.map +1 -0
- package/dist/discord/alwaysAllow.test.js +181 -0
- package/dist/discord/alwaysAllow.test.js.map +1 -0
- package/dist/discord/client.js +666 -0
- package/dist/discord/client.js.map +1 -0
- package/dist/discord/client.test.js +256 -0
- package/dist/discord/client.test.js.map +1 -0
- package/dist/discord/configPanel.js +270 -0
- package/dist/discord/configPanel.js.map +1 -0
- package/dist/discord/configPanel.test.js +332 -0
- package/dist/discord/configPanel.test.js.map +1 -0
- package/dist/discord/directoryBrowser.js +151 -0
- package/dist/discord/directoryBrowser.js.map +1 -0
- package/dist/discord/directoryBrowser.test.js +163 -0
- package/dist/discord/directoryBrowser.test.js.map +1 -0
- package/dist/discord/favorites.js +10 -0
- package/dist/discord/favorites.js.map +1 -0
- package/dist/discord/fileDownload.js +94 -0
- package/dist/discord/fileDownload.js.map +1 -0
- package/dist/discord/fileDownload.test.js +59 -0
- package/dist/discord/fileDownload.test.js.map +1 -0
- package/dist/discord/format.js +104 -0
- package/dist/discord/format.js.map +1 -0
- package/dist/discord/format.test.js +40 -0
- package/dist/discord/format.test.js.map +1 -0
- package/dist/discord/guildChannels.js +97 -0
- package/dist/discord/guildChannels.js.map +1 -0
- package/dist/discord/guildChannels.test.js +231 -0
- package/dist/discord/guildChannels.test.js.map +1 -0
- package/dist/discord/i18n.js +207 -0
- package/dist/discord/i18n.js.map +1 -0
- package/dist/discord/i18n.test.js +31 -0
- package/dist/discord/i18n.test.js.map +1 -0
- package/dist/discord/interactionRouter.js +954 -0
- package/dist/discord/interactionRouter.js.map +1 -0
- package/dist/discord/interactionRouter.test.js +1245 -0
- package/dist/discord/interactionRouter.test.js.map +1 -0
- package/dist/discord/messageRouter.js +221 -0
- package/dist/discord/messageRouter.js.map +1 -0
- package/dist/discord/messageRouter.test.js +360 -0
- package/dist/discord/messageRouter.test.js.map +1 -0
- package/dist/discord/ports.js +12 -0
- package/dist/discord/ports.js.map +1 -0
- package/dist/discord/renderers/defaultSet.test.js +97 -0
- package/dist/discord/renderers/defaultSet.test.js.map +1 -0
- package/dist/discord/renderers/diffView.js +73 -0
- package/dist/discord/renderers/diffView.js.map +1 -0
- package/dist/discord/renderers/diffView.test.js +54 -0
- package/dist/discord/renderers/diffView.test.js.map +1 -0
- package/dist/discord/renderers/index.js +143 -0
- package/dist/discord/renderers/index.js.map +1 -0
- package/dist/discord/renderers/index.test.js +124 -0
- package/dist/discord/renderers/index.test.js.map +1 -0
- package/dist/discord/renderers/mentionOnComplete.js +19 -0
- package/dist/discord/renderers/mentionOnComplete.js.map +1 -0
- package/dist/discord/renderers/mentionOnComplete.test.js +35 -0
- package/dist/discord/renderers/mentionOnComplete.test.js.map +1 -0
- package/dist/discord/renderers/permissionButtons.js +150 -0
- package/dist/discord/renderers/permissionButtons.js.map +1 -0
- package/dist/discord/renderers/permissionButtons.test.js +108 -0
- package/dist/discord/renderers/permissionButtons.test.js.map +1 -0
- package/dist/discord/renderers/resultLine.js +25 -0
- package/dist/discord/renderers/resultLine.js.map +1 -0
- package/dist/discord/renderers/statusEmbed.js +20 -0
- package/dist/discord/renderers/statusEmbed.js.map +1 -0
- package/dist/discord/renderers/statusEmbed.test.js +32 -0
- package/dist/discord/renderers/statusEmbed.test.js.map +1 -0
- package/dist/discord/renderers/streamEmbed.js +134 -0
- package/dist/discord/renderers/streamEmbed.js.map +1 -0
- package/dist/discord/renderers/streamEmbed.test.js +97 -0
- package/dist/discord/renderers/streamEmbed.test.js.map +1 -0
- package/dist/discord/renderers/toolThread.js +65 -0
- package/dist/discord/renderers/toolThread.js.map +1 -0
- package/dist/discord/renderers/toolThread.test.js +54 -0
- package/dist/discord/renderers/toolThread.test.js.map +1 -0
- package/dist/discord/renderers/transcriptFeed.js +33 -0
- package/dist/discord/renderers/transcriptFeed.js.map +1 -0
- package/dist/discord/renderers/usageEmbed.js +78 -0
- package/dist/discord/renderers/usageEmbed.js.map +1 -0
- package/dist/discord/renderers/usageEmbed.test.js +42 -0
- package/dist/discord/renderers/usageEmbed.test.js.map +1 -0
- package/dist/discord/wiring.js +214 -0
- package/dist/discord/wiring.js.map +1 -0
- package/dist/discord/wiring.test.js +252 -0
- package/dist/discord/wiring.test.js.map +1 -0
- package/dist/discord/wizard/channelWizard.js +305 -0
- package/dist/discord/wizard/channelWizard.js.map +1 -0
- package/dist/discord/wizard/channelWizard.test.js +298 -0
- package/dist/discord/wizard/channelWizard.test.js.map +1 -0
- package/dist/discord/wizard/resumeWizard.js +123 -0
- package/dist/discord/wizard/resumeWizard.js.map +1 -0
- package/dist/modes/claude/index.js +80 -0
- package/dist/modes/claude/index.js.map +1 -0
- package/dist/modes/claude/listResumable.test.js +72 -0
- package/dist/modes/claude/listResumable.test.js.map +1 -0
- package/dist/modes/claude/mcpFileTool.js +82 -0
- package/dist/modes/claude/mcpFileTool.js.map +1 -0
- package/dist/modes/claude/permissions.js +35 -0
- package/dist/modes/claude/permissions.js.map +1 -0
- package/dist/modes/claude/plugins.js +56 -0
- package/dist/modes/claude/plugins.js.map +1 -0
- package/dist/modes/claude/session.js +324 -0
- package/dist/modes/claude/session.js.map +1 -0
- package/dist/modes/claude/session.test.js +415 -0
- package/dist/modes/claude/session.test.js.map +1 -0
- package/dist/modes/codex/discovery.js +221 -0
- package/dist/modes/codex/discovery.js.map +1 -0
- package/dist/modes/codex/discovery.test.js +213 -0
- package/dist/modes/codex/discovery.test.js.map +1 -0
- package/dist/modes/codex/eventMapper.js +262 -0
- package/dist/modes/codex/eventMapper.js.map +1 -0
- package/dist/modes/codex/index.js +132 -0
- package/dist/modes/codex/index.js.map +1 -0
- package/dist/modes/codex/index.test.js +170 -0
- package/dist/modes/codex/index.test.js.map +1 -0
- package/dist/modes/codex/runner.js +207 -0
- package/dist/modes/codex/runner.js.map +1 -0
- package/dist/modes/codex/runner.test.js +587 -0
- package/dist/modes/codex/runner.test.js.map +1 -0
- package/dist/modes/codex/sqliteReader.js +171 -0
- package/dist/modes/codex/sqliteReader.js.map +1 -0
- package/dist/modes/codex/sqliteReader.test.js +137 -0
- package/dist/modes/codex/sqliteReader.test.js.map +1 -0
- package/dist/setup/wizard.js +115 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/setup/wizard.test.js +216 -0
- package/dist/setup/wizard.test.js.map +1 -0
- package/dist/startBot.test.js +78 -0
- package/dist/startBot.test.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { query as realQuery, } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import { makeCanUseTool } from './permissions.js';
|
|
3
|
+
import { createMcpFileTool, ATTACH_FILE_TOOL_NAME } from './mcpFileTool.js';
|
|
4
|
+
import { resolvePlugins } from './plugins.js';
|
|
5
|
+
// Map our PermMode straight onto the SDK's native `permissionMode` (§7A). PermMode is
|
|
6
|
+
// now DERIVED from the SDK's PermissionMode (contracts.ts), so every value — including
|
|
7
|
+
// 'dontAsk'/'auto' — is a valid SDK value and passes through verbatim, faithful to
|
|
8
|
+
// terminal `claude`, instead of collapsing everything to 'default' and emulating. The
|
|
9
|
+
// config-driven canUseTool auto-allow (permissions.ts) still governs the 'default'
|
|
10
|
+
// mode's gate (fixes A8). 'bypassPermissions' additionally requires
|
|
11
|
+
// allowDangerouslySkipPermissions (see options below). An unknown value (should not
|
|
12
|
+
// happen given the schema) degrades to 'default'.
|
|
13
|
+
function toSdkPermissionMode(permMode) {
|
|
14
|
+
switch (permMode) {
|
|
15
|
+
case 'acceptEdits':
|
|
16
|
+
case 'bypassPermissions':
|
|
17
|
+
case 'plan':
|
|
18
|
+
case 'dontAsk':
|
|
19
|
+
case 'auto':
|
|
20
|
+
return permMode;
|
|
21
|
+
case 'default':
|
|
22
|
+
default:
|
|
23
|
+
// A Codex sandbox mode never reaches a Claude session, but degrade safely if so.
|
|
24
|
+
return 'default';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// A running Claude session (§9): one persistent query() whose prompt is an async
|
|
28
|
+
// stream we feed user turns into. The SDK message iterable is consumed in the
|
|
29
|
+
// background and each message is mapped to a normalized AgentEvent via ctx.emit.
|
|
30
|
+
export class ClaudeSession {
|
|
31
|
+
sessionId = null;
|
|
32
|
+
ctx;
|
|
33
|
+
query;
|
|
34
|
+
abortController;
|
|
35
|
+
// Prompt-stream handoff: turns are enqueued and handed to the SDK's async
|
|
36
|
+
// prompt generator one at a time. Unlike A4D's single resolveNext (which drops
|
|
37
|
+
// a turn pushed before the generator is waiting), a buffer + optional waiter
|
|
38
|
+
// makes the handoff safe regardless of ordering.
|
|
39
|
+
pending = [];
|
|
40
|
+
waiter = null;
|
|
41
|
+
closed = false;
|
|
42
|
+
constructor(ctx, deps = {}) {
|
|
43
|
+
this.ctx = ctx;
|
|
44
|
+
this.abortController = new AbortController();
|
|
45
|
+
const queryFn = deps.queryFn ?? realQuery;
|
|
46
|
+
const mcpServers = {};
|
|
47
|
+
const allowedTools = [...(ctx.config.allowedTools ?? [])];
|
|
48
|
+
if (deps.sendFile) {
|
|
49
|
+
mcpServers.discord = createMcpFileTool(ctx.cwd, deps.sendFile);
|
|
50
|
+
if (!allowedTools.includes(ATTACH_FILE_TOOL_NAME)) {
|
|
51
|
+
allowedTools.push(ATTACH_FILE_TOOL_NAME);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const permissionMode = toSdkPermissionMode(ctx.permMode);
|
|
55
|
+
const options = {
|
|
56
|
+
cwd: ctx.cwd,
|
|
57
|
+
// Pin the model's write target to the selected folder. The SDK forwards `cwd`
|
|
58
|
+
// to the CLI subprocess (verified: process.cwd() and the init `cwd` both equal
|
|
59
|
+
// ctx.cwd), but with an unqualified prompt like "create test.txt" the model
|
|
60
|
+
// resolves the path against $HOME, not process.cwd() — so files landed in HOME
|
|
61
|
+
// regardless of cwd/additionalDirectories/permissionMode. Appending the working
|
|
62
|
+
// directory to the claude_code preset (empirically: 0/N honored without it,
|
|
63
|
+
// N/N with it) makes relative writes land in ctx.cwd. Codex does not need this —
|
|
64
|
+
// it passes the dir to its CLI explicitly via `--cd` (codex/runner.ts).
|
|
65
|
+
systemPrompt: {
|
|
66
|
+
type: 'preset',
|
|
67
|
+
preset: 'claude_code',
|
|
68
|
+
append: `Your working directory is ${ctx.cwd}. Unless the user gives an absolute path, create and edit all files relative to this working directory, NOT the home directory.`,
|
|
69
|
+
},
|
|
70
|
+
permissionMode,
|
|
71
|
+
// The SDK REQUIRES this flag to be true when permissionMode is
|
|
72
|
+
// 'bypassPermissions' (sdk.d.ts: "Must be set to true when using
|
|
73
|
+
// permissionMode: 'bypassPermissions'"). Set it only for that mode so the
|
|
74
|
+
// dangerous bypass is never enabled implicitly.
|
|
75
|
+
...(permissionMode === 'bypassPermissions' ? { allowDangerouslySkipPermissions: true } : {}),
|
|
76
|
+
includePartialMessages: true,
|
|
77
|
+
abortController: this.abortController,
|
|
78
|
+
canUseTool: makeCanUseTool(ctx),
|
|
79
|
+
// Load the project's .claude/ (subagents, hooks, MCP, CLAUDE.md) plus user
|
|
80
|
+
// and local settings, exactly like the terminal `claude`. 'project' is
|
|
81
|
+
// required for CLAUDE.md; all three cover subagents/hooks/skills/MCP.
|
|
82
|
+
settingSources: ['user', 'project', 'local'],
|
|
83
|
+
plugins: resolvePlugins(ctx.logger),
|
|
84
|
+
...(ctx.model !== undefined ? { model: ctx.model } : {}),
|
|
85
|
+
// Reasoning effort chosen in the wizard (§9). The wizard only sets a valid Claude
|
|
86
|
+
// EffortLevel for the Claude backend; empty/absent lets the SDK use its default.
|
|
87
|
+
...(ctx.effort !== undefined && ctx.effort.length > 0
|
|
88
|
+
? { effort: ctx.effort }
|
|
89
|
+
: {}),
|
|
90
|
+
...(Object.keys(mcpServers).length > 0 ? { mcpServers } : {}),
|
|
91
|
+
...(allowedTools.length > 0 ? { allowedTools } : {}),
|
|
92
|
+
...(deps.resumeId !== undefined ? { resume: deps.resumeId } : {}),
|
|
93
|
+
};
|
|
94
|
+
if (deps.resumeId !== undefined) {
|
|
95
|
+
this.sessionId = deps.resumeId;
|
|
96
|
+
}
|
|
97
|
+
// Log the working directory actually handed to the SDK so a live run shows the
|
|
98
|
+
// effective cwd (must match the status-embed cwd and the folder files land in).
|
|
99
|
+
ctx.logger.info('claude session cwd', { cwd: options.cwd, ctxCwd: ctx.cwd, permissionMode });
|
|
100
|
+
this.query = queryFn({ prompt: this.promptStream(), options });
|
|
101
|
+
void this.consume();
|
|
102
|
+
}
|
|
103
|
+
// The SDK pulls user turns from this generator. It yields a buffered turn
|
|
104
|
+
// immediately, otherwise parks until send() pushes one. Ends when the session
|
|
105
|
+
// is closed so the SDK can wind down cleanly.
|
|
106
|
+
async *promptStream() {
|
|
107
|
+
while (!this.closed) {
|
|
108
|
+
const next = this.pending.shift();
|
|
109
|
+
if (next) {
|
|
110
|
+
yield next;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const msg = await new Promise((resolve) => {
|
|
114
|
+
this.waiter = resolve;
|
|
115
|
+
this.closeResolve = () => resolve(null);
|
|
116
|
+
});
|
|
117
|
+
this.waiter = null;
|
|
118
|
+
this.closeResolve = null;
|
|
119
|
+
if (msg === null)
|
|
120
|
+
return; // closed while waiting
|
|
121
|
+
yield msg;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
closeResolve = null;
|
|
125
|
+
// Consume the SDK message stream and map each message to a normalized
|
|
126
|
+
// AgentEvent (§5a). A stream/SDK error becomes a single retryable error event
|
|
127
|
+
// rather than an unhandled rejection (the consume loop owns error handling).
|
|
128
|
+
async consume() {
|
|
129
|
+
try {
|
|
130
|
+
for await (const msg of this.query) {
|
|
131
|
+
this.mapMessage(msg);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
// An abort (from stop()) is expected shutdown, not a failure to surface.
|
|
136
|
+
if (this.closed || this.abortController.signal.aborted)
|
|
137
|
+
return;
|
|
138
|
+
this.ctx.emit({
|
|
139
|
+
kind: 'error',
|
|
140
|
+
message: err instanceof Error ? err.message : String(err),
|
|
141
|
+
retryable: true,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// One SDK message → zero or more AgentEvents. Unknown/other message types are
|
|
146
|
+
// ignored (with a debug log) so a new SDK message kind never crashes the loop.
|
|
147
|
+
mapMessage(msg) {
|
|
148
|
+
switch (msg.type) {
|
|
149
|
+
case 'system': {
|
|
150
|
+
if (msg.subtype === 'init' && msg.session_id) {
|
|
151
|
+
this.sessionId = msg.session_id;
|
|
152
|
+
}
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
case 'stream_event': {
|
|
156
|
+
this.mapStreamEvent(msg);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
case 'assistant': {
|
|
160
|
+
this.mapAssistant(msg);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
case 'user': {
|
|
164
|
+
this.mapUser(msg);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
case 'result': {
|
|
168
|
+
this.mapResult(msg);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
case 'rate_limit_event': {
|
|
172
|
+
const info = msg.rate_limit_info;
|
|
173
|
+
this.ctx.emit({
|
|
174
|
+
kind: 'error',
|
|
175
|
+
message: 'Rate limit updated.',
|
|
176
|
+
retryable: true,
|
|
177
|
+
rateLimit: {
|
|
178
|
+
...(info.resetsAt !== undefined
|
|
179
|
+
? { resetAt: new Date(info.resetsAt * 1000).toISOString() }
|
|
180
|
+
: {}),
|
|
181
|
+
...(info.rateLimitType !== undefined ? { rateLimitType: info.rateLimitType } : {}),
|
|
182
|
+
...(info.utilization !== undefined ? { utilization: info.utilization } : {}),
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
default: {
|
|
188
|
+
this.ctx.logger.debug('claude: unmapped SDK message', { type: msg.type });
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// stream_event content_block_delta → text/thinking deltas (§5a). The SDK wraps
|
|
194
|
+
// the raw Anthropic stream event; delta shapes vary by version, so we navigate
|
|
195
|
+
// structurally and defensively (mirrors A4D eventHandler.ts:175-184).
|
|
196
|
+
mapStreamEvent(msg) {
|
|
197
|
+
const event = msg.event;
|
|
198
|
+
if (!event || event.type !== 'content_block_delta' || !event.delta)
|
|
199
|
+
return;
|
|
200
|
+
const delta = event.delta;
|
|
201
|
+
if (delta.type === 'text_delta' && typeof delta.text === 'string') {
|
|
202
|
+
this.ctx.emit({ kind: 'text', text: delta.text, delta: true });
|
|
203
|
+
}
|
|
204
|
+
else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {
|
|
205
|
+
this.ctx.emit({ kind: 'thinking', text: delta.thinking, delta: true });
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// assistant tool_use blocks → tool_use events (§5a). Text blocks arrive via
|
|
209
|
+
// stream_event deltas, so they are not re-emitted here.
|
|
210
|
+
mapAssistant(msg) {
|
|
211
|
+
const content = msg.message.content;
|
|
212
|
+
if (!Array.isArray(content))
|
|
213
|
+
return;
|
|
214
|
+
for (const block of content) {
|
|
215
|
+
if (block.type === 'tool_use') {
|
|
216
|
+
this.ctx.emit({
|
|
217
|
+
kind: 'tool_use',
|
|
218
|
+
id: String(block.id ?? ''),
|
|
219
|
+
name: String(block.name ?? 'unknown'),
|
|
220
|
+
input: block.input ?? {},
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// user tool_result blocks → tool_result events (§5a). is_error flips ok=false;
|
|
226
|
+
// content is flattened to a string for the normalized event.
|
|
227
|
+
mapUser(msg) {
|
|
228
|
+
const content = msg.message.content;
|
|
229
|
+
if (!Array.isArray(content))
|
|
230
|
+
return;
|
|
231
|
+
for (const block of content) {
|
|
232
|
+
if (block.type !== 'tool_result')
|
|
233
|
+
continue;
|
|
234
|
+
this.ctx.emit({
|
|
235
|
+
kind: 'tool_result',
|
|
236
|
+
id: String(block.tool_use_id ?? ''),
|
|
237
|
+
ok: block.is_error !== true,
|
|
238
|
+
content: flattenToolResult(block.content),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// result → result event with cost/tokens/duration, then context_usage from
|
|
243
|
+
// query.getContextUsage() (§5a, §7.4). getContextUsage is best-effort: a
|
|
244
|
+
// failure never turns a completed turn into an error.
|
|
245
|
+
mapResult(msg) {
|
|
246
|
+
const usage = msg.usage ?? {};
|
|
247
|
+
const resultText = msg.subtype === 'success' ? msg.result : undefined;
|
|
248
|
+
this.ctx.emit({
|
|
249
|
+
kind: 'result',
|
|
250
|
+
...(resultText !== undefined ? { text: resultText } : {}),
|
|
251
|
+
...(msg.total_cost_usd !== undefined ? { costUsd: msg.total_cost_usd } : {}),
|
|
252
|
+
...(usage.input_tokens !== undefined ? { tokensIn: usage.input_tokens } : {}),
|
|
253
|
+
...(usage.output_tokens !== undefined ? { tokensOut: usage.output_tokens } : {}),
|
|
254
|
+
...(msg.duration_ms !== undefined ? { durationMs: msg.duration_ms } : {}),
|
|
255
|
+
});
|
|
256
|
+
void this.query
|
|
257
|
+
.getContextUsage()
|
|
258
|
+
.then((ctx) => {
|
|
259
|
+
this.ctx.emit({
|
|
260
|
+
kind: 'context_usage',
|
|
261
|
+
totalTokens: ctx.totalTokens,
|
|
262
|
+
maxTokens: ctx.maxTokens,
|
|
263
|
+
percentage: ctx.percentage,
|
|
264
|
+
});
|
|
265
|
+
})
|
|
266
|
+
.catch(() => {
|
|
267
|
+
// Best-effort: no context panel this turn if the SDK cannot report it.
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// Deliver a user turn: enqueue it and hand it to the prompt stream. A turn
|
|
271
|
+
// pushed while the generator is parked wakes it; otherwise it buffers until the
|
|
272
|
+
// generator pulls next (fixes A4D's drop-if-not-waiting race).
|
|
273
|
+
async send(turn) {
|
|
274
|
+
if (this.closed)
|
|
275
|
+
throw new Error('Claude session is closed.');
|
|
276
|
+
const message = {
|
|
277
|
+
type: 'user',
|
|
278
|
+
message: { role: 'user', content: turn.text },
|
|
279
|
+
parent_tool_use_id: null,
|
|
280
|
+
};
|
|
281
|
+
if (this.waiter) {
|
|
282
|
+
const resolve = this.waiter;
|
|
283
|
+
this.waiter = null;
|
|
284
|
+
resolve(message);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.pending.push(message);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Abort the underlying query and wind down the prompt stream (§7.5 kill switch).
|
|
291
|
+
async stop() {
|
|
292
|
+
if (this.closed)
|
|
293
|
+
return;
|
|
294
|
+
this.closed = true;
|
|
295
|
+
this.abortController.abort();
|
|
296
|
+
this.closeResolve?.();
|
|
297
|
+
try {
|
|
298
|
+
this.query.close();
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
// Closing an already-finished query is a no-op we can ignore.
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// Flatten a tool_result `content` (string, or an array of text blocks, or other)
|
|
306
|
+
// into a plain string for the normalized tool_result event.
|
|
307
|
+
function flattenToolResult(content) {
|
|
308
|
+
if (typeof content === 'string')
|
|
309
|
+
return content;
|
|
310
|
+
if (Array.isArray(content)) {
|
|
311
|
+
return content
|
|
312
|
+
.map((b) => {
|
|
313
|
+
if (typeof b === 'string')
|
|
314
|
+
return b;
|
|
315
|
+
if (b && typeof b === 'object' && typeof b.text === 'string') {
|
|
316
|
+
return b.text;
|
|
317
|
+
}
|
|
318
|
+
return '';
|
|
319
|
+
})
|
|
320
|
+
.join('');
|
|
321
|
+
}
|
|
322
|
+
return content == null ? '' : String(content);
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/modes/claude/session.ts"],"names":[],"mappings":"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"}
|