@ai-support-agent/cli 0.0.5 → 0.0.6

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.
Files changed (63) hide show
  1. package/dist/agent-runner.d.ts +2 -2
  2. package/dist/agent-runner.d.ts.map +1 -1
  3. package/dist/agent-runner.js +2 -2
  4. package/dist/agent-runner.js.map +1 -1
  5. package/dist/appsync-subscriber.d.ts +15 -9
  6. package/dist/appsync-subscriber.d.ts.map +1 -1
  7. package/dist/appsync-subscriber.js +47 -89
  8. package/dist/appsync-subscriber.js.map +1 -1
  9. package/dist/base-websocket.d.ts +40 -0
  10. package/dist/base-websocket.d.ts.map +1 -0
  11. package/dist/base-websocket.js +95 -0
  12. package/dist/base-websocket.js.map +1 -0
  13. package/dist/child-process-manager.d.ts +20 -0
  14. package/dist/child-process-manager.d.ts.map +1 -0
  15. package/dist/child-process-manager.js +125 -0
  16. package/dist/child-process-manager.js.map +1 -0
  17. package/dist/commands/api-chat-executor.d.ts.map +1 -1
  18. package/dist/commands/api-chat-executor.js +46 -56
  19. package/dist/commands/api-chat-executor.js.map +1 -1
  20. package/dist/commands/chat-executor.d.ts.map +1 -1
  21. package/dist/commands/chat-executor.js +1 -2
  22. package/dist/commands/chat-executor.js.map +1 -1
  23. package/dist/commands/claude-code-args.d.ts +12 -0
  24. package/dist/commands/claude-code-args.d.ts.map +1 -0
  25. package/dist/commands/claude-code-args.js +78 -0
  26. package/dist/commands/claude-code-args.js.map +1 -0
  27. package/dist/commands/claude-code-runner.d.ts +3 -72
  28. package/dist/commands/claude-code-runner.d.ts.map +1 -1
  29. package/dist/commands/claude-code-runner.js +24 -288
  30. package/dist/commands/claude-code-runner.js.map +1 -1
  31. package/dist/commands/claude-code-stream.d.ts +63 -0
  32. package/dist/commands/claude-code-stream.d.ts.map +1 -0
  33. package/dist/commands/claude-code-stream.js +179 -0
  34. package/dist/commands/claude-code-stream.js.map +1 -0
  35. package/dist/commands/shared-chat-utils.d.ts +4 -0
  36. package/dist/commands/shared-chat-utils.d.ts.map +1 -1
  37. package/dist/commands/shared-chat-utils.js +7 -0
  38. package/dist/commands/shared-chat-utils.js.map +1 -1
  39. package/dist/constants.d.ts +2 -0
  40. package/dist/constants.d.ts.map +1 -1
  41. package/dist/constants.js +4 -1
  42. package/dist/constants.js.map +1 -1
  43. package/dist/process-manager.d.ts +1 -19
  44. package/dist/process-manager.d.ts.map +1 -1
  45. package/dist/process-manager.js +3 -121
  46. package/dist/process-manager.js.map +1 -1
  47. package/dist/terminal/terminal-websocket.d.ts +8 -9
  48. package/dist/terminal/terminal-websocket.d.ts.map +1 -1
  49. package/dist/terminal/terminal-websocket.js +30 -70
  50. package/dist/terminal/terminal-websocket.js.map +1 -1
  51. package/dist/utils/activity-timeout.d.ts +19 -0
  52. package/dist/utils/activity-timeout.d.ts.map +1 -0
  53. package/dist/utils/activity-timeout.js +28 -0
  54. package/dist/utils/activity-timeout.js.map +1 -0
  55. package/dist/utils/json-parse.d.ts +5 -0
  56. package/dist/utils/json-parse.d.ts.map +1 -0
  57. package/dist/utils/json-parse.js +15 -0
  58. package/dist/utils/json-parse.js.map +1 -0
  59. package/dist/utils/stream-parser.d.ts +14 -0
  60. package/dist/utils/stream-parser.d.ts.map +1 -0
  61. package/dist/utils/stream-parser.js +31 -0
  62. package/dist/utils/stream-parser.js.map +1 -0
  63. package/package.json +1 -1
@@ -1,87 +1,23 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.buildCleanEnv = buildCleanEnv;
7
- exports._resetCleanEnvCache = _resetCleanEnvCache;
8
- exports.buildClaudeArgs = buildClaudeArgs;
3
+ exports.parseFileUploadResult = exports.processStreamJsonLine = exports._resetCleanEnvCache = exports.buildCleanEnv = exports.buildClaudeArgs = void 0;
9
4
  exports.runClaudeCode = runClaudeCode;
10
- exports.processStreamJsonLine = processStreamJsonLine;
11
- exports.parseFileUploadResult = parseFileUploadResult;
12
5
  const child_process_1 = require("child_process");
13
- const os_1 = __importDefault(require("os"));
14
6
  const constants_1 = require("../constants");
15
7
  const logger_1 = require("../logger");
8
+ const activity_timeout_1 = require("../utils/activity-timeout");
16
9
  const claude_config_validator_1 = require("../utils/claude-config-validator");
17
- /** CLAUDECODE / CLAUDE_CODE_* 環境変数を除外した env を構築
18
- * ただし CLAUDE_CODE_OAUTH_TOKEN は認証に必要なため保持する
19
- * プロセス生存中は結果不変のためキャッシュする */
20
- let cachedCleanEnv = null;
21
- function buildCleanEnv() {
22
- if (cachedCleanEnv)
23
- return { ...cachedCleanEnv };
24
- const cleanEnv = {};
25
- for (const [key, value] of Object.entries(process.env)) {
26
- if (key === 'CLAUDECODE' || (key.startsWith('CLAUDE_CODE_') && key !== 'CLAUDE_CODE_OAUTH_TOKEN'))
27
- continue;
28
- if (value !== undefined)
29
- cleanEnv[key] = value;
30
- }
31
- cachedCleanEnv = cleanEnv;
32
- return { ...cleanEnv };
33
- }
34
- /** テスト用のキャッシュリセット */
35
- function _resetCleanEnvCache() {
36
- cachedCleanEnv = null;
37
- }
38
- /** Claude CLI の引数配列を構築 */
39
- function buildClaudeArgs(message, options) {
40
- const args = ['-p', '--output-format', 'stream-json', '--verbose'];
41
- if (options?.allowedTools?.length) {
42
- for (const tool of options.allowedTools) {
43
- args.push('--allowedTools', tool);
44
- }
45
- }
46
- if (options?.addDirs?.length) {
47
- for (const dir of options.addDirs) {
48
- const resolved = dir.replace(/^~/, os_1.default.homedir());
49
- args.push('--add-dir', resolved);
50
- }
51
- }
52
- if (options?.mcpConfigPath) {
53
- args.push('--mcp-config', options.mcpConfigPath);
54
- }
55
- // システムプロンプトを構築: 言語設定 + サーバー設定 + file_upload 指示
56
- const promptParts = [];
57
- if (options?.locale) {
58
- promptParts.push(options.locale === 'ja'
59
- ? 'Always respond in Japanese. Use Japanese for all explanations and communications.'
60
- : 'Always respond in English. Use English for all explanations and communications.');
61
- }
62
- if (options?.systemPrompt) {
63
- promptParts.push(options.systemPrompt);
64
- }
65
- if (options?.mcpConfigPath) {
66
- promptParts.push([
67
- 'CRITICAL FILE DELIVERY RULE:',
68
- 'When you create or modify a file using the Write tool, the user CANNOT see or download the file unless you upload it.',
69
- 'You MUST call the mcp__ai-support-agent__file_upload tool AFTER every Write tool call.',
70
- 'Required parameters for file_upload:',
71
- '- filePath: the absolute path of the file you just wrote',
72
- '- filename: the display name (e.g., "mbc-logo.svg")',
73
- '- conversationId: from <message_metadata> in the user message',
74
- '- messageId: from <message_metadata> in the user message',
75
- '- projectCode: from <message_metadata> in the user message',
76
- 'If you skip the upload, the file is invisible to the user. Always upload.',
77
- ].join('\n'));
78
- }
79
- if (promptParts.length > 0) {
80
- args.push('--append-system-prompt', promptParts.join('\n\n'));
81
- }
82
- args.push(message);
83
- return args;
84
- }
10
+ const stream_parser_1 = require("../utils/stream-parser");
11
+ const claude_code_args_1 = require("./claude-code-args");
12
+ const claude_code_stream_1 = require("./claude-code-stream");
13
+ // Re-export for backward compatibility
14
+ var claude_code_args_2 = require("./claude-code-args");
15
+ Object.defineProperty(exports, "buildClaudeArgs", { enumerable: true, get: function () { return claude_code_args_2.buildClaudeArgs; } });
16
+ Object.defineProperty(exports, "buildCleanEnv", { enumerable: true, get: function () { return claude_code_args_2.buildCleanEnv; } });
17
+ Object.defineProperty(exports, "_resetCleanEnvCache", { enumerable: true, get: function () { return claude_code_args_2._resetCleanEnvCache; } });
18
+ var claude_code_stream_2 = require("./claude-code-stream");
19
+ Object.defineProperty(exports, "processStreamJsonLine", { enumerable: true, get: function () { return claude_code_stream_2.processStreamJsonLine; } });
20
+ Object.defineProperty(exports, "parseFileUploadResult", { enumerable: true, get: function () { return claude_code_stream_2.parseFileUploadResult; } });
85
21
  /**
86
22
  * Claude Code CLI をサブプロセスとして実行し、出力をストリーミングで返す
87
23
  * ClaudeCodeHandle を返す: result Promise と kill 関数
@@ -94,9 +30,9 @@ function runClaudeCode(options) {
94
30
  // claude CLI が利用可能か確認し、print モードで実行
95
31
  // Claude Code セッション内からの起動時にネスト検出やSSEポート干渉を回避するため、
96
32
  // CLAUDECODE および CLAUDE_CODE_* 環境変数を除外
97
- const cleanEnv = buildCleanEnv();
33
+ const cleanEnv = (0, claude_code_args_1.buildCleanEnv)();
98
34
  const env = awsEnv ? { ...cleanEnv, ...awsEnv } : cleanEnv;
99
- const args = buildClaudeArgs(message, { allowedTools, addDirs, locale, mcpConfigPath, systemPrompt });
35
+ const args = (0, claude_code_args_1.buildClaudeArgs)(message, { allowedTools, addDirs, locale, mcpConfigPath, systemPrompt });
100
36
  (0, claude_config_validator_1.ensureClaudeJsonIntegrity)();
101
37
  const child = (0, child_process_1.spawn)('claude', args, {
102
38
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -118,7 +54,7 @@ function runClaudeCode(options) {
118
54
  }, constants_1.CHAT_SIGKILL_DELAY);
119
55
  };
120
56
  let resultText = '';
121
- let stdoutBuffer = '';
57
+ const streamParser = new stream_parser_1.StreamLineParser();
122
58
  // テキストチャンクの重複送信を防ぐため、前回送信済みテキスト長を追跡
123
59
  let sentTextLength = 0;
124
60
  // file_upload ツールの tool_use_id を追跡して tool_result から file_attachment を生成
@@ -127,7 +63,7 @@ function runClaudeCode(options) {
127
63
  const pendingToolNames = new Map();
128
64
  // アクティビティベースタイムアウト: 最後の stdout 出力から CHAT_TIMEOUT 経過で強制終了
129
65
  let sigkillTimer;
130
- const killOnTimeout = () => {
66
+ const activityTimeout = (0, activity_timeout_1.createActivityTimeout)(constants_1.CHAT_TIMEOUT, () => {
131
67
  logger_1.logger.warn(`[chat] claude CLI timed out after ${constants_1.CHAT_TIMEOUT / 1000}s of inactivity (pid=${child.pid}), sending SIGTERM`);
132
68
  child.kill('SIGTERM');
133
69
  sigkillTimer = setTimeout(() => {
@@ -136,29 +72,15 @@ function runClaudeCode(options) {
136
72
  child.kill('SIGKILL');
137
73
  }
138
74
  }, constants_1.CHAT_SIGKILL_DELAY);
139
- };
140
- let timeout = setTimeout(killOnTimeout, constants_1.CHAT_TIMEOUT);
141
- /** stdout 受信時にタイムアウトをリセット */
142
- const resetTimeout = () => {
143
- clearTimeout(timeout);
144
- timeout = setTimeout(killOnTimeout, constants_1.CHAT_TIMEOUT);
145
- };
75
+ });
146
76
  child.stdout.on('data', (data) => {
147
- resetTimeout();
148
- stdoutBuffer += data.toString();
149
- // NDJSON: 改行で分割して各行をパース
150
- const lines = stdoutBuffer.split('\n');
151
- // 最後の不完全な行はバッファに残す
152
- stdoutBuffer = lines.pop() ?? '';
153
- for (const line of lines) {
154
- const trimmed = line.trim();
155
- if (!trimmed)
156
- continue;
157
- const { newSentTextLength, text } = processStreamJsonLine(trimmed, sendChunk, child.pid ?? 0, { sentTextLength, pendingFileUploadIds, pendingToolNames });
77
+ activityTimeout.reset();
78
+ streamParser.push(data.toString(), (line) => {
79
+ const { newSentTextLength, text } = (0, claude_code_stream_1.processStreamJsonLine)(line, sendChunk, child.pid ?? 0, { sentTextLength, pendingFileUploadIds, pendingToolNames });
158
80
  sentTextLength = newSentTextLength;
159
81
  if (text !== undefined)
160
82
  resultText = text;
161
- }
83
+ });
162
84
  });
163
85
  child.stderr.on('data', (data) => {
164
86
  // --verbose モードでは stderr にも NDJSON が出力されるので、デバッグログのみ
@@ -166,7 +88,7 @@ function runClaudeCode(options) {
166
88
  logger_1.logger.debug(`[chat] claude CLI stderr: ${text.substring(0, constants_1.LOG_DEBUG_LIMIT)}`);
167
89
  });
168
90
  child.on('error', (error) => {
169
- clearTimeout(timeout);
91
+ activityTimeout.clear();
170
92
  if (sigkillTimer)
171
93
  clearTimeout(sigkillTimer);
172
94
  if (error.code === 'ENOENT') {
@@ -177,7 +99,7 @@ function runClaudeCode(options) {
177
99
  }
178
100
  });
179
101
  child.on('close', (code) => {
180
- clearTimeout(timeout);
102
+ activityTimeout.clear();
181
103
  if (sigkillTimer)
182
104
  clearTimeout(sigkillTimer);
183
105
  const durationMs = Date.now() - startTime;
@@ -202,190 +124,4 @@ function runClaudeCode(options) {
202
124
  });
203
125
  return { result, cancel: () => killFn() };
204
126
  }
205
- /** file_upload ツール結果を file_attachment チャンクに変換する */
206
- const FILE_UPLOAD_TOOL_NAME = 'mcp__ai-support-agent__file_upload';
207
- /**
208
- * stream-json の NDJSON 1行をパースし、テキストやツール呼び出し情報を処理する
209
- * sendChunk は fire-and-forget で呼び出される(同期的に状態を返すため)
210
- *
211
- * @returns newSentTextLength: 送信済みテキスト長, text: resultイベントのテキスト(undefinedなら未取得)
212
- */
213
- function processStreamJsonLine(line, sendChunk, pid, state) {
214
- let parsed;
215
- try {
216
- parsed = JSON.parse(line);
217
- }
218
- catch {
219
- // JSON パースに失敗した場合はスキップ
220
- logger_1.logger.debug(`[chat] stream-json parse error (pid=${pid}): ${line.substring(0, constants_1.LOG_DEBUG_LIMIT)}`);
221
- return { newSentTextLength: state.sentTextLength };
222
- }
223
- if (parsed.type === 'assistant' && parsed.message?.content) {
224
- let newSentTextLength = state.sentTextLength;
225
- // assistant メッセージからテキストとツール呼び出しを抽出
226
- let fullText = '';
227
- for (const block of parsed.message.content) {
228
- if (block.type === 'text' && block.text) {
229
- fullText += block.text;
230
- }
231
- else if (block.type === 'tool_use' && block.name) {
232
- // ツール呼び出し情報をログ出力
233
- logger_1.logger.info(`[chat] tool_use: ${block.name} (pid=${pid})`);
234
- // tool_call チャンクとして送信(input は大きすぎる場合があるため省略可)
235
- void sendChunk('tool_call', JSON.stringify({
236
- toolName: block.name,
237
- name: block.name,
238
- id: block.id,
239
- input: block.input ?? {},
240
- }));
241
- // tool_use_id → ツール名のマッピングを追跡(tool_result で toolName を復元するため)
242
- if (block.id) {
243
- if (!state.pendingToolNames)
244
- state.pendingToolNames = new Map();
245
- state.pendingToolNames.set(block.id, block.name);
246
- }
247
- // file_upload ツールの呼び出しを追跡(tool_result から file_attachment を生成するため)
248
- if (block.name === FILE_UPLOAD_TOOL_NAME && block.id) {
249
- if (!state.pendingFileUploadIds)
250
- state.pendingFileUploadIds = new Set();
251
- state.pendingFileUploadIds.add(block.id);
252
- }
253
- }
254
- }
255
- // 新しいテキスト部分のみ delta チャンクとして送信(重複防止)
256
- if (fullText.length > newSentTextLength) {
257
- const newText = fullText.substring(newSentTextLength);
258
- void sendChunk('delta', newText);
259
- newSentTextLength = fullText.length;
260
- }
261
- return { newSentTextLength };
262
- }
263
- // user メッセージ内の tool_result を処理
264
- // 1. 全ツールの tool_result を tool_result チャンクとして送信(RDS保存・UI表示用)
265
- // 2. file_upload ツールの結果は追加で file_attachment チャンクも送信
266
- // MCP ツールの tool_result は2回来る: 1回目は tool_reference(スキップ)、2回目が実際の結果
267
- //
268
- // 重要: user メッセージ(tool_result)の後に来る次の assistant メッセージは
269
- // 新しいメッセージなので、sentTextLength をリセットする。
270
- // リセットしないと、新メッセージのテキストが前メッセージより短い場合に
271
- // delta チャンクが送信されず、テキストが欠落する。
272
- if (parsed.type === 'user' && parsed.message?.content) {
273
- for (const block of parsed.message.content) {
274
- if (block.type !== 'tool_result' || !block.tool_use_id)
275
- continue;
276
- // tool_reference ブロックはスキップ(MCP ツールの1回目)
277
- if (Array.isArray(block.content) && block.content.length > 0 && block.content[0].type === 'tool_reference') {
278
- continue;
279
- }
280
- // ツール名を復元
281
- const toolName = state.pendingToolNames?.get(block.tool_use_id) ?? 'unknown';
282
- // tool_result の内容をテキストとして抽出
283
- let resultText;
284
- if (typeof block.content === 'string') {
285
- resultText = block.content;
286
- }
287
- else if (Array.isArray(block.content)) {
288
- const textBlock = block.content.find(b => b.type === 'text' && b.text);
289
- resultText = textBlock?.text ?? '';
290
- }
291
- else {
292
- resultText = '';
293
- }
294
- // tool_result チャンクを送信
295
- const isError = resultText.startsWith('Error:') || resultText.startsWith('error:');
296
- let output;
297
- try {
298
- output = JSON.parse(resultText);
299
- }
300
- catch {
301
- output = { text: resultText };
302
- }
303
- void sendChunk('tool_result', JSON.stringify({
304
- toolName,
305
- success: !isError,
306
- output,
307
- }));
308
- logger_1.logger.info(`[chat] tool_result: ${toolName} success=${!isError} (pid=${pid})`);
309
- // file_upload ツールの場合は追加で file_attachment チャンクも送信
310
- if (state.pendingFileUploadIds?.has(block.tool_use_id)) {
311
- const fileData = parseFileUploadResult(block.content);
312
- if (fileData) {
313
- state.pendingFileUploadIds.delete(block.tool_use_id);
314
- logger_1.logger.info(`[chat] file_upload result: fileId=${fileData.fileId}, filename=${fileData.filename} (pid=${pid})`);
315
- void sendChunk('file_attachment', JSON.stringify(fileData));
316
- }
317
- }
318
- // マッピングをクリーンアップ
319
- state.pendingToolNames?.delete(block.tool_use_id);
320
- }
321
- // sentTextLength をリセット: 次の assistant メッセージは新しいメッセージなので
322
- // 前メッセージのテキスト長に基づく重複防止は不要
323
- return { newSentTextLength: 0 };
324
- }
325
- if (parsed.type === 'result' && parsed.result !== undefined) {
326
- return { newSentTextLength: state.sentTextLength, text: parsed.result };
327
- }
328
- if (parsed.type === 'system' && parsed.subtype === 'init') {
329
- // MCP サーバー接続状態とツール一覧をログ出力(デバッグ用)
330
- if (parsed.mcp_servers?.length) {
331
- for (const mcp of parsed.mcp_servers) {
332
- if (mcp.status === 'connected') {
333
- logger_1.logger.info(`[chat] MCP server "${mcp.name}" connected (pid=${pid})`);
334
- }
335
- else {
336
- logger_1.logger.warn(`[chat] MCP server "${mcp.name}" status=${mcp.status}${mcp.error ? ` error=${mcp.error}` : ''} (pid=${pid})`);
337
- }
338
- }
339
- }
340
- if (parsed.tools?.length) {
341
- const mcpTools = parsed.tools.filter(t => t.startsWith('mcp__'));
342
- logger_1.logger.info(`[chat] stream-json init: ${parsed.tools.length} tools available, MCP tools: [${mcpTools.join(', ')}] (pid=${pid})`);
343
- }
344
- else {
345
- logger_1.logger.info(`[chat] stream-json init received, no tools listed (pid=${pid})`);
346
- }
347
- }
348
- return { newSentTextLength: state.sentTextLength };
349
- }
350
- /**
351
- * file_upload ツールの結果をパースし、file_attachment チャンク用データを返す
352
- *
353
- * MCP ツールの tool_result.content は配列形式: [{type: "text", text: "..."}]
354
- * 組み込みツールの tool_result.content は文字列形式
355
- */
356
- function parseFileUploadResult(content) {
357
- if (!content)
358
- return null;
359
- // content からテキストを抽出
360
- let textContent;
361
- if (typeof content === 'string') {
362
- textContent = content;
363
- }
364
- else if (Array.isArray(content)) {
365
- // MCP ツール形式: [{type: "text", text: "..."}, ...]
366
- const textBlock = content.find(b => b.type === 'text' && b.text);
367
- if (!textBlock?.text)
368
- return null;
369
- textContent = textBlock.text;
370
- }
371
- else {
372
- return null;
373
- }
374
- try {
375
- const data = JSON.parse(textContent);
376
- if (data.success && typeof data.fileId === 'string' && typeof data.s3Key === 'string' && typeof data.filename === 'string') {
377
- return {
378
- fileId: data.fileId,
379
- s3Key: data.s3Key,
380
- filename: data.filename,
381
- contentType: data.contentType ?? 'application/octet-stream',
382
- fileSize: typeof data.fileSize === 'number' ? data.fileSize : 0,
383
- };
384
- }
385
- }
386
- catch {
387
- // パース失敗は無視
388
- }
389
- return null;
390
- }
391
127
  //# sourceMappingURL=claude-code-runner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-runner.js","sourceRoot":"","sources":["../../src/commands/claude-code-runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code-runner.js","sourceRoot":"","sources":["../../src/commands/claude-code-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { ChatChunkType } from '../types';
2
+ /** stream-json の assistant/user メッセージ内のコンテンツブロック */
3
+ export interface StreamJsonContentBlock {
4
+ type: 'text' | 'tool_use' | 'tool_result' | 'tool_reference';
5
+ text?: string;
6
+ name?: string;
7
+ id?: string;
8
+ input?: Record<string, unknown>;
9
+ tool_use_id?: string;
10
+ /** 組み込みツールでは string、MCP ツールでは {type, text}[] の配列 */
11
+ content?: string | Array<{
12
+ type: string;
13
+ text?: string;
14
+ }>;
15
+ }
16
+ /** stream-json の MCP サーバー接続情報 */
17
+ export interface StreamJsonMcpServer {
18
+ name: string;
19
+ status: string;
20
+ error?: string;
21
+ }
22
+ /** stream-json の1行(NDJSON)の型定義 */
23
+ export interface StreamJsonLine {
24
+ type: string;
25
+ subtype?: string;
26
+ message?: {
27
+ content?: StreamJsonContentBlock[];
28
+ };
29
+ result?: string;
30
+ tools?: string[];
31
+ mcp_servers?: StreamJsonMcpServer[];
32
+ }
33
+ /**
34
+ * stream-json の NDJSON 1行をパースし、テキストやツール呼び出し情報を処理する
35
+ * sendChunk は fire-and-forget で呼び出される(同期的に状態を返すため)
36
+ *
37
+ * @returns newSentTextLength: 送信済みテキスト長, text: resultイベントのテキスト(undefinedなら未取得)
38
+ */
39
+ export declare function processStreamJsonLine(line: string, sendChunk: (type: ChatChunkType, content: string) => Promise<void>, pid: number, state: {
40
+ sentTextLength: number;
41
+ pendingFileUploadIds?: Set<string>;
42
+ pendingToolNames?: Map<string, string>;
43
+ }): {
44
+ newSentTextLength: number;
45
+ text?: string;
46
+ };
47
+ /**
48
+ * file_upload ツールの結果をパースし、file_attachment チャンク用データを返す
49
+ *
50
+ * MCP ツールの tool_result.content は配列形式: [{type: "text", text: "..."}]
51
+ * 組み込みツールの tool_result.content は文字列形式
52
+ */
53
+ export declare function parseFileUploadResult(content: string | Array<{
54
+ type: string;
55
+ text?: string;
56
+ }> | undefined): {
57
+ fileId: string;
58
+ s3Key: string;
59
+ filename: string;
60
+ contentType: string;
61
+ fileSize: number;
62
+ } | null;
63
+ //# sourceMappingURL=claude-code-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-stream.d.ts","sourceRoot":"","sources":["../../src/commands/claude-code-stream.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAG7C,oDAAoD;AACpD,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,gBAAgB,CAAA;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1D;AAED,iCAAiC;AACjC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,sBAAsB,EAAE,CAAA;KACnC,CAAA;IACD,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAA;CACpC;AAKD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAClE,GAAG,EAAE,MAAM,EACX,KAAK,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5G;IAAE,iBAAiB,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAiI9C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,GAAG;IAC3G,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB,GAAG,IAAI,CA2BP"}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processStreamJsonLine = processStreamJsonLine;
4
+ exports.parseFileUploadResult = parseFileUploadResult;
5
+ const constants_1 = require("../constants");
6
+ const logger_1 = require("../logger");
7
+ const json_parse_1 = require("../utils/json-parse");
8
+ /** file_upload ツール結果を file_attachment チャンクに変換する */
9
+ const FILE_UPLOAD_TOOL_NAME = 'mcp__ai-support-agent__file_upload';
10
+ /**
11
+ * stream-json の NDJSON 1行をパースし、テキストやツール呼び出し情報を処理する
12
+ * sendChunk は fire-and-forget で呼び出される(同期的に状態を返すため)
13
+ *
14
+ * @returns newSentTextLength: 送信済みテキスト長, text: resultイベントのテキスト(undefinedなら未取得)
15
+ */
16
+ function processStreamJsonLine(line, sendChunk, pid, state) {
17
+ const parsed = (0, json_parse_1.safeJsonParse)(line);
18
+ if (!parsed) {
19
+ logger_1.logger.debug(`[chat] stream-json parse error (pid=${pid}): ${line.substring(0, constants_1.LOG_DEBUG_LIMIT)}`);
20
+ return { newSentTextLength: state.sentTextLength };
21
+ }
22
+ if (parsed.type === 'assistant' && parsed.message?.content) {
23
+ let newSentTextLength = state.sentTextLength;
24
+ // assistant メッセージからテキストとツール呼び出しを抽出
25
+ let fullText = '';
26
+ for (const block of parsed.message.content) {
27
+ if (block.type === 'text' && block.text) {
28
+ fullText += block.text;
29
+ }
30
+ else if (block.type === 'tool_use' && block.name) {
31
+ // ツール呼び出し情報をログ出力
32
+ logger_1.logger.info(`[chat] tool_use: ${block.name} (pid=${pid})`);
33
+ // tool_call チャンクとして送信(input は大きすぎる場合があるため省略可)
34
+ void sendChunk('tool_call', JSON.stringify({
35
+ toolName: block.name,
36
+ name: block.name,
37
+ id: block.id,
38
+ input: block.input ?? {},
39
+ }));
40
+ // tool_use_id → ツール名のマッピングを追跡(tool_result で toolName を復元するため)
41
+ if (block.id) {
42
+ if (!state.pendingToolNames)
43
+ state.pendingToolNames = new Map();
44
+ state.pendingToolNames.set(block.id, block.name);
45
+ }
46
+ // file_upload ツールの呼び出しを追跡(tool_result から file_attachment を生成するため)
47
+ if (block.name === FILE_UPLOAD_TOOL_NAME && block.id) {
48
+ if (!state.pendingFileUploadIds)
49
+ state.pendingFileUploadIds = new Set();
50
+ state.pendingFileUploadIds.add(block.id);
51
+ }
52
+ }
53
+ }
54
+ // 新しいテキスト部分のみ delta チャンクとして送信(重複防止)
55
+ if (fullText.length > newSentTextLength) {
56
+ const newText = fullText.substring(newSentTextLength);
57
+ void sendChunk('delta', newText);
58
+ newSentTextLength = fullText.length;
59
+ }
60
+ return { newSentTextLength };
61
+ }
62
+ // user メッセージ内の tool_result を処理
63
+ // 1. 全ツールの tool_result を tool_result チャンクとして送信(RDS保存・UI表示用)
64
+ // 2. file_upload ツールの結果は追加で file_attachment チャンクも送信
65
+ // MCP ツールの tool_result は2回来る: 1回目は tool_reference(スキップ)、2回目が実際の結果
66
+ //
67
+ // 重要: user メッセージ(tool_result)の後に来る次の assistant メッセージは
68
+ // 新しいメッセージなので、sentTextLength をリセットする。
69
+ // リセットしないと、新メッセージのテキストが前メッセージより短い場合に
70
+ // delta チャンクが送信されず、テキストが欠落する。
71
+ if (parsed.type === 'user' && parsed.message?.content) {
72
+ for (const block of parsed.message.content) {
73
+ if (block.type !== 'tool_result' || !block.tool_use_id)
74
+ continue;
75
+ // tool_reference ブロックはスキップ(MCP ツールの1回目)
76
+ if (Array.isArray(block.content) && block.content.length > 0 && block.content[0].type === 'tool_reference') {
77
+ continue;
78
+ }
79
+ // ツール名を復元
80
+ const toolName = state.pendingToolNames?.get(block.tool_use_id) ?? 'unknown';
81
+ // tool_result の内容をテキストとして抽出
82
+ let resultText;
83
+ if (typeof block.content === 'string') {
84
+ resultText = block.content;
85
+ }
86
+ else if (Array.isArray(block.content)) {
87
+ const textBlock = block.content.find(b => b.type === 'text' && b.text);
88
+ resultText = textBlock?.text ?? '';
89
+ }
90
+ else {
91
+ resultText = '';
92
+ }
93
+ // tool_result チャンクを送信
94
+ const isError = resultText.startsWith('Error:') || resultText.startsWith('error:');
95
+ const output = (0, json_parse_1.safeJsonParse)(resultText) ?? { text: resultText };
96
+ void sendChunk('tool_result', JSON.stringify({
97
+ toolName,
98
+ success: !isError,
99
+ output,
100
+ }));
101
+ logger_1.logger.info(`[chat] tool_result: ${toolName} success=${!isError} (pid=${pid})`);
102
+ // file_upload ツールの場合は追加で file_attachment チャンクも送信
103
+ if (state.pendingFileUploadIds?.has(block.tool_use_id)) {
104
+ const fileData = parseFileUploadResult(block.content);
105
+ if (fileData) {
106
+ state.pendingFileUploadIds.delete(block.tool_use_id);
107
+ logger_1.logger.info(`[chat] file_upload result: fileId=${fileData.fileId}, filename=${fileData.filename} (pid=${pid})`);
108
+ void sendChunk('file_attachment', JSON.stringify(fileData));
109
+ }
110
+ }
111
+ // マッピングをクリーンアップ
112
+ state.pendingToolNames?.delete(block.tool_use_id);
113
+ }
114
+ // sentTextLength をリセット: 次の assistant メッセージは新しいメッセージなので
115
+ // 前メッセージのテキスト長に基づく重複防止は不要
116
+ return { newSentTextLength: 0 };
117
+ }
118
+ if (parsed.type === 'result' && parsed.result !== undefined) {
119
+ return { newSentTextLength: state.sentTextLength, text: parsed.result };
120
+ }
121
+ if (parsed.type === 'system' && parsed.subtype === 'init') {
122
+ // MCP サーバー接続状態とツール一覧をログ出力(デバッグ用)
123
+ if (parsed.mcp_servers?.length) {
124
+ for (const mcp of parsed.mcp_servers) {
125
+ if (mcp.status === 'connected') {
126
+ logger_1.logger.info(`[chat] MCP server "${mcp.name}" connected (pid=${pid})`);
127
+ }
128
+ else {
129
+ logger_1.logger.warn(`[chat] MCP server "${mcp.name}" status=${mcp.status}${mcp.error ? ` error=${mcp.error}` : ''} (pid=${pid})`);
130
+ }
131
+ }
132
+ }
133
+ if (parsed.tools?.length) {
134
+ const mcpTools = parsed.tools.filter(t => t.startsWith('mcp__'));
135
+ logger_1.logger.info(`[chat] stream-json init: ${parsed.tools.length} tools available, MCP tools: [${mcpTools.join(', ')}] (pid=${pid})`);
136
+ }
137
+ else {
138
+ logger_1.logger.info(`[chat] stream-json init received, no tools listed (pid=${pid})`);
139
+ }
140
+ }
141
+ return { newSentTextLength: state.sentTextLength };
142
+ }
143
+ /**
144
+ * file_upload ツールの結果をパースし、file_attachment チャンク用データを返す
145
+ *
146
+ * MCP ツールの tool_result.content は配列形式: [{type: "text", text: "..."}]
147
+ * 組み込みツールの tool_result.content は文字列形式
148
+ */
149
+ function parseFileUploadResult(content) {
150
+ if (!content)
151
+ return null;
152
+ // content からテキストを抽出
153
+ let textContent;
154
+ if (typeof content === 'string') {
155
+ textContent = content;
156
+ }
157
+ else if (Array.isArray(content)) {
158
+ // MCP ツール形式: [{type: "text", text: "..."}, ...]
159
+ const textBlock = content.find(b => b.type === 'text' && b.text);
160
+ if (!textBlock?.text)
161
+ return null;
162
+ textContent = textBlock.text;
163
+ }
164
+ else {
165
+ return null;
166
+ }
167
+ const data = (0, json_parse_1.safeJsonParse)(textContent);
168
+ if (data?.success && typeof data.fileId === 'string' && typeof data.s3Key === 'string' && typeof data.filename === 'string') {
169
+ return {
170
+ fileId: data.fileId,
171
+ s3Key: data.s3Key,
172
+ filename: data.filename,
173
+ contentType: data.contentType ?? 'application/octet-stream',
174
+ fileSize: typeof data.fileSize === 'number' ? data.fileSize : 0,
175
+ };
176
+ }
177
+ return null;
178
+ }
179
+ //# sourceMappingURL=claude-code-stream.js.map