@ai-support-agent/cli 0.0.5-beta.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 (207) hide show
  1. package/dist/agent-config-sync.d.ts +49 -0
  2. package/dist/agent-config-sync.d.ts.map +1 -0
  3. package/dist/agent-config-sync.js +168 -0
  4. package/dist/agent-config-sync.js.map +1 -0
  5. package/dist/agent-runner.d.ts +11 -3
  6. package/dist/agent-runner.d.ts.map +1 -1
  7. package/dist/agent-runner.js +48 -24
  8. package/dist/agent-runner.js.map +1 -1
  9. package/dist/agent-transport.d.ts +59 -0
  10. package/dist/agent-transport.d.ts.map +1 -0
  11. package/dist/agent-transport.js +225 -0
  12. package/dist/agent-transport.js.map +1 -0
  13. package/dist/api-client.d.ts +2 -1
  14. package/dist/api-client.d.ts.map +1 -1
  15. package/dist/api-client.js +4 -0
  16. package/dist/api-client.js.map +1 -1
  17. package/dist/appsync-subscriber.d.ts +15 -9
  18. package/dist/appsync-subscriber.d.ts.map +1 -1
  19. package/dist/appsync-subscriber.js +50 -111
  20. package/dist/appsync-subscriber.js.map +1 -1
  21. package/dist/aws-profile.d.ts.map +1 -1
  22. package/dist/aws-profile.js +3 -6
  23. package/dist/aws-profile.js.map +1 -1
  24. package/dist/base-websocket.d.ts +40 -0
  25. package/dist/base-websocket.d.ts.map +1 -0
  26. package/dist/base-websocket.js +95 -0
  27. package/dist/base-websocket.js.map +1 -0
  28. package/dist/child-process-manager.d.ts +20 -0
  29. package/dist/child-process-manager.d.ts.map +1 -0
  30. package/dist/child-process-manager.js +125 -0
  31. package/dist/child-process-manager.js.map +1 -0
  32. package/dist/commands/api-chat-executor.d.ts +10 -1
  33. package/dist/commands/api-chat-executor.d.ts.map +1 -1
  34. package/dist/commands/api-chat-executor.js +83 -58
  35. package/dist/commands/api-chat-executor.js.map +1 -1
  36. package/dist/commands/chat-executor.d.ts +13 -2
  37. package/dist/commands/chat-executor.d.ts.map +1 -1
  38. package/dist/commands/chat-executor.js +66 -16
  39. package/dist/commands/chat-executor.js.map +1 -1
  40. package/dist/commands/claude-code-args.d.ts +12 -0
  41. package/dist/commands/claude-code-args.d.ts.map +1 -0
  42. package/dist/commands/claude-code-args.js +78 -0
  43. package/dist/commands/claude-code-args.js.map +1 -0
  44. package/dist/commands/claude-code-runner.d.ts +17 -36
  45. package/dist/commands/claude-code-runner.d.ts.map +1 -1
  46. package/dist/commands/claude-code-runner.js +49 -221
  47. package/dist/commands/claude-code-runner.js.map +1 -1
  48. package/dist/commands/claude-code-stream.d.ts +63 -0
  49. package/dist/commands/claude-code-stream.d.ts.map +1 -0
  50. package/dist/commands/claude-code-stream.js +179 -0
  51. package/dist/commands/claude-code-stream.js.map +1 -0
  52. package/dist/commands/file-executor.d.ts +1 -1
  53. package/dist/commands/file-executor.d.ts.map +1 -1
  54. package/dist/commands/file-executor.js +59 -70
  55. package/dist/commands/file-executor.js.map +1 -1
  56. package/dist/commands/file-path-guard.d.ts +9 -0
  57. package/dist/commands/file-path-guard.d.ts.map +1 -0
  58. package/dist/commands/file-path-guard.js +15 -0
  59. package/dist/commands/file-path-guard.js.map +1 -0
  60. package/dist/commands/file-transfer.d.ts +5 -0
  61. package/dist/commands/file-transfer.d.ts.map +1 -1
  62. package/dist/commands/file-transfer.js +16 -39
  63. package/dist/commands/file-transfer.js.map +1 -1
  64. package/dist/commands/index.d.ts +1 -1
  65. package/dist/commands/index.d.ts.map +1 -1
  66. package/dist/commands/index.js +18 -7
  67. package/dist/commands/index.js.map +1 -1
  68. package/dist/commands/process-executor.d.ts +1 -1
  69. package/dist/commands/process-executor.d.ts.map +1 -1
  70. package/dist/commands/process-executor.js +24 -6
  71. package/dist/commands/process-executor.js.map +1 -1
  72. package/dist/commands/process-manager.d.ts +22 -0
  73. package/dist/commands/process-manager.d.ts.map +1 -0
  74. package/dist/commands/process-manager.js +36 -0
  75. package/dist/commands/process-manager.js.map +1 -0
  76. package/dist/commands/shared-chat-utils.d.ts +10 -1
  77. package/dist/commands/shared-chat-utils.d.ts.map +1 -1
  78. package/dist/commands/shared-chat-utils.js +18 -0
  79. package/dist/commands/shared-chat-utils.js.map +1 -1
  80. package/dist/commands/shell-executor.d.ts +1 -1
  81. package/dist/commands/shell-executor.d.ts.map +1 -1
  82. package/dist/commands/shell-executor.js +9 -12
  83. package/dist/commands/shell-executor.js.map +1 -1
  84. package/dist/config-manager.d.ts.map +1 -1
  85. package/dist/config-manager.js +2 -3
  86. package/dist/config-manager.js.map +1 -1
  87. package/dist/constants.d.ts +21 -0
  88. package/dist/constants.d.ts.map +1 -1
  89. package/dist/constants.js +26 -1
  90. package/dist/constants.js.map +1 -1
  91. package/dist/docker/docker-runner.d.ts.map +1 -1
  92. package/dist/docker/docker-runner.js +5 -3
  93. package/dist/docker/docker-runner.js.map +1 -1
  94. package/dist/ipc-types.d.ts +36 -0
  95. package/dist/ipc-types.d.ts.map +1 -0
  96. package/dist/ipc-types.js +34 -0
  97. package/dist/ipc-types.js.map +1 -0
  98. package/dist/mcp/config-writer.d.ts +5 -1
  99. package/dist/mcp/config-writer.d.ts.map +1 -1
  100. package/dist/mcp/config-writer.js +14 -1
  101. package/dist/mcp/config-writer.js.map +1 -1
  102. package/dist/mcp/server.d.ts.map +1 -1
  103. package/dist/mcp/server.js +2 -0
  104. package/dist/mcp/server.js.map +1 -1
  105. package/dist/mcp/tools/credentials.d.ts.map +1 -1
  106. package/dist/mcp/tools/credentials.js +36 -9
  107. package/dist/mcp/tools/credentials.js.map +1 -1
  108. package/dist/mcp/tools/db-query.d.ts.map +1 -1
  109. package/dist/mcp/tools/db-query.js +13 -18
  110. package/dist/mcp/tools/db-query.js.map +1 -1
  111. package/dist/mcp/tools/db-schemas.d.ts.map +1 -1
  112. package/dist/mcp/tools/db-schemas.js +8 -13
  113. package/dist/mcp/tools/db-schemas.js.map +1 -1
  114. package/dist/mcp/tools/file-upload.d.ts.map +1 -1
  115. package/dist/mcp/tools/file-upload.js +12 -17
  116. package/dist/mcp/tools/file-upload.js.map +1 -1
  117. package/dist/mcp/tools/mcp-response.d.ts +29 -1
  118. package/dist/mcp/tools/mcp-response.d.ts.map +1 -1
  119. package/dist/mcp/tools/mcp-response.js +51 -3
  120. package/dist/mcp/tools/mcp-response.js.map +1 -1
  121. package/dist/mcp/tools/project-info.d.ts.map +1 -1
  122. package/dist/mcp/tools/project-info.js +28 -33
  123. package/dist/mcp/tools/project-info.js.map +1 -1
  124. package/dist/mcp/tools/read-conversation-file.d.ts +4 -0
  125. package/dist/mcp/tools/read-conversation-file.d.ts.map +1 -0
  126. package/dist/mcp/tools/read-conversation-file.js +92 -0
  127. package/dist/mcp/tools/read-conversation-file.js.map +1 -0
  128. package/dist/process-manager.d.ts +2 -0
  129. package/dist/process-manager.d.ts.map +1 -0
  130. package/dist/process-manager.js +7 -0
  131. package/dist/process-manager.js.map +1 -0
  132. package/dist/project-agent.d.ts +5 -25
  133. package/dist/project-agent.d.ts.map +1 -1
  134. package/dist/project-agent.js +67 -313
  135. package/dist/project-agent.js.map +1 -1
  136. package/dist/project-config-sync.d.ts.map +1 -1
  137. package/dist/project-config-sync.js +9 -3
  138. package/dist/project-config-sync.js.map +1 -1
  139. package/dist/project-worker.d.ts +2 -0
  140. package/dist/project-worker.d.ts.map +1 -0
  141. package/dist/project-worker.js +85 -0
  142. package/dist/project-worker.js.map +1 -0
  143. package/dist/repo-sync.d.ts +23 -0
  144. package/dist/repo-sync.d.ts.map +1 -0
  145. package/dist/repo-sync.js +191 -0
  146. package/dist/repo-sync.js.map +1 -0
  147. package/dist/terminal/terminal-websocket.d.ts +8 -9
  148. package/dist/terminal/terminal-websocket.d.ts.map +1 -1
  149. package/dist/terminal/terminal-websocket.js +30 -87
  150. package/dist/terminal/terminal-websocket.js.map +1 -1
  151. package/dist/types/chat.d.ts +28 -0
  152. package/dist/types/chat.d.ts.map +1 -0
  153. package/dist/types/chat.js +3 -0
  154. package/dist/types/chat.js.map +1 -0
  155. package/dist/types/command.d.ts +100 -0
  156. package/dist/types/command.d.ts.map +1 -0
  157. package/dist/types/command.js +11 -0
  158. package/dist/types/command.js.map +1 -0
  159. package/dist/types/config.d.ts +44 -0
  160. package/dist/types/config.d.ts.map +1 -0
  161. package/dist/types/config.js +3 -0
  162. package/dist/types/config.js.map +1 -0
  163. package/dist/types/index.d.ts +6 -0
  164. package/dist/types/index.d.ts.map +1 -0
  165. package/dist/types/index.js +22 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/types/project.d.ts +112 -0
  168. package/dist/types/project.d.ts.map +1 -0
  169. package/dist/types/project.js +3 -0
  170. package/dist/types/project.js.map +1 -0
  171. package/dist/types/server.d.ts +58 -0
  172. package/dist/types/server.d.ts.map +1 -0
  173. package/dist/types/server.js +3 -0
  174. package/dist/types/server.js.map +1 -0
  175. package/dist/types.d.ts +1 -295
  176. package/dist/types.d.ts.map +1 -1
  177. package/dist/types.js +15 -0
  178. package/dist/types.js.map +1 -1
  179. package/dist/utils/activity-timeout.d.ts +19 -0
  180. package/dist/utils/activity-timeout.d.ts.map +1 -0
  181. package/dist/utils/activity-timeout.js +28 -0
  182. package/dist/utils/activity-timeout.js.map +1 -0
  183. package/dist/utils/claude-config-validator.d.ts +16 -0
  184. package/dist/utils/claude-config-validator.d.ts.map +1 -0
  185. package/dist/utils/claude-config-validator.js +94 -0
  186. package/dist/utils/claude-config-validator.js.map +1 -0
  187. package/dist/utils/content-type.d.ts +10 -0
  188. package/dist/utils/content-type.d.ts.map +1 -0
  189. package/dist/utils/content-type.js +120 -0
  190. package/dist/utils/content-type.js.map +1 -0
  191. package/dist/utils/json-parse.d.ts +5 -0
  192. package/dist/utils/json-parse.d.ts.map +1 -0
  193. package/dist/utils/json-parse.js +15 -0
  194. package/dist/utils/json-parse.js.map +1 -0
  195. package/dist/utils/stream-parser.d.ts +14 -0
  196. package/dist/utils/stream-parser.d.ts.map +1 -0
  197. package/dist/utils/stream-parser.js +31 -0
  198. package/dist/utils/stream-parser.js.map +1 -0
  199. package/dist/utils.d.ts +1 -0
  200. package/dist/utils.d.ts.map +1 -1
  201. package/dist/utils.js +40 -0
  202. package/dist/utils.js.map +1 -1
  203. package/dist/ws-reconnect.d.ts +12 -0
  204. package/dist/ws-reconnect.d.ts.map +1 -0
  205. package/dist/ws-reconnect.js +32 -0
  206. package/dist/ws-reconnect.js.map +1 -0
  207. package/package.json +2 -2
@@ -1,128 +1,86 @@
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.buildClaudeArgs = buildClaudeArgs;
3
+ exports.parseFileUploadResult = exports.processStreamJsonLine = exports._resetCleanEnvCache = exports.buildCleanEnv = exports.buildClaudeArgs = void 0;
8
4
  exports.runClaudeCode = runClaudeCode;
9
- exports.processStreamJsonLine = processStreamJsonLine;
10
- exports.parseFileUploadResult = parseFileUploadResult;
11
5
  const child_process_1 = require("child_process");
12
- const os_1 = __importDefault(require("os"));
13
6
  const constants_1 = require("../constants");
14
7
  const logger_1 = require("../logger");
15
- /** CLAUDECODE / CLAUDE_CODE_* 環境変数を除外した env を構築
16
- * ただし CLAUDE_CODE_OAUTH_TOKEN は認証に必要なため保持する */
17
- function buildCleanEnv() {
18
- const cleanEnv = {};
19
- for (const [key, value] of Object.entries(process.env)) {
20
- if (key === 'CLAUDECODE' || (key.startsWith('CLAUDE_CODE_') && key !== 'CLAUDE_CODE_OAUTH_TOKEN'))
21
- continue;
22
- if (value !== undefined)
23
- cleanEnv[key] = value;
24
- }
25
- return cleanEnv;
26
- }
27
- /** Claude CLI の引数配列を構築 */
28
- function buildClaudeArgs(message, options) {
29
- const args = ['-p', '--output-format', 'stream-json', '--verbose'];
30
- if (options?.allowedTools?.length) {
31
- for (const tool of options.allowedTools) {
32
- args.push('--allowedTools', tool);
33
- }
34
- }
35
- if (options?.addDirs?.length) {
36
- for (const dir of options.addDirs) {
37
- const resolved = dir.replace(/^~/, os_1.default.homedir());
38
- args.push('--add-dir', resolved);
39
- }
40
- }
41
- if (options?.mcpConfigPath) {
42
- args.push('--mcp-config', options.mcpConfigPath);
43
- }
44
- // システムプロンプトを構築: 言語設定 + サーバー設定 + file_upload 指示
45
- const promptParts = [];
46
- if (options?.locale) {
47
- promptParts.push(options.locale === 'ja'
48
- ? 'Always respond in Japanese. Use Japanese for all explanations and communications.'
49
- : 'Always respond in English. Use English for all explanations and communications.');
50
- }
51
- if (options?.systemPrompt) {
52
- promptParts.push(options.systemPrompt);
53
- }
54
- if (options?.mcpConfigPath) {
55
- promptParts.push([
56
- 'CRITICAL FILE DELIVERY RULE:',
57
- 'When you create or modify a file using the Write tool, the user CANNOT see or download the file unless you upload it.',
58
- 'You MUST call the mcp__ai-support-agent__file_upload tool AFTER every Write tool call.',
59
- 'Required parameters for file_upload:',
60
- '- filePath: the absolute path of the file you just wrote',
61
- '- filename: the display name (e.g., "mbc-logo.svg")',
62
- '- conversationId: from <message_metadata> in the user message',
63
- '- messageId: from <message_metadata> in the user message',
64
- '- projectCode: from <message_metadata> in the user message',
65
- 'If you skip the upload, the file is invisible to the user. Always upload.',
66
- ].join('\n'));
67
- }
68
- if (promptParts.length > 0) {
69
- args.push('--append-system-prompt', promptParts.join('\n\n'));
70
- }
71
- args.push(message);
72
- return args;
73
- }
8
+ const activity_timeout_1 = require("../utils/activity-timeout");
9
+ const claude_config_validator_1 = require("../utils/claude-config-validator");
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; } });
74
21
  /**
75
22
  * Claude Code CLI をサブプロセスとして実行し、出力をストリーミングで返す
23
+ * ClaudeCodeHandle を返す: result Promise と kill 関数
76
24
  */
77
- async function runClaudeCode(message, sendChunk, allowedTools, addDirs, locale, awsEnv, mcpConfigPath, cwd, systemPrompt) {
78
- return new Promise((resolve, reject) => {
25
+ function runClaudeCode(options) {
26
+ const { message, sendChunk, allowedTools, addDirs, locale, awsEnv, mcpConfigPath, cwd, systemPrompt } = options;
27
+ let killFn = () => { };
28
+ const result = new Promise((resolve, reject) => {
79
29
  const startTime = Date.now();
80
30
  // claude CLI が利用可能か確認し、print モードで実行
81
31
  // Claude Code セッション内からの起動時にネスト検出やSSEポート干渉を回避するため、
82
32
  // CLAUDECODE および CLAUDE_CODE_* 環境変数を除外
83
- const cleanEnv = buildCleanEnv();
33
+ const cleanEnv = (0, claude_code_args_1.buildCleanEnv)();
84
34
  const env = awsEnv ? { ...cleanEnv, ...awsEnv } : cleanEnv;
85
- const args = buildClaudeArgs(message, { allowedTools, addDirs, locale, mcpConfigPath, systemPrompt });
35
+ const args = (0, claude_code_args_1.buildClaudeArgs)(message, { allowedTools, addDirs, locale, mcpConfigPath, systemPrompt });
36
+ (0, claude_config_validator_1.ensureClaudeJsonIntegrity)();
86
37
  const child = (0, child_process_1.spawn)('claude', args, {
87
38
  stdio: ['ignore', 'pipe', 'pipe'],
88
39
  env,
89
40
  ...(cwd ? { cwd } : {}),
90
41
  });
91
42
  logger_1.logger.debug(`[chat] claude CLI spawned (pid=${child.pid}, cmd=claude ${args.map(a => a.includes(' ') ? `"${a}"` : a).join(' ')})`);
43
+ // kill 関数を設定: SIGTERM → SIGKILL パターン
44
+ killFn = () => {
45
+ if (child.killed)
46
+ return;
47
+ logger_1.logger.info(`[chat] Killing claude CLI process (pid=${child.pid})`);
48
+ child.kill('SIGTERM');
49
+ setTimeout(() => {
50
+ if (!child.killed) {
51
+ logger_1.logger.warn(`[chat] claude CLI still running after SIGTERM, sending SIGKILL (pid=${child.pid})`);
52
+ child.kill('SIGKILL');
53
+ }
54
+ }, constants_1.CHAT_SIGKILL_DELAY);
55
+ };
92
56
  let resultText = '';
93
- let stdoutBuffer = '';
57
+ const streamParser = new stream_parser_1.StreamLineParser();
94
58
  // テキストチャンクの重複送信を防ぐため、前回送信済みテキスト長を追跡
95
59
  let sentTextLength = 0;
96
60
  // file_upload ツールの tool_use_id を追跡して tool_result から file_attachment を生成
97
61
  const pendingFileUploadIds = new Set();
98
- // タイムアウト: 120秒で応答がなければ強制終了
62
+ // tool_use_id → ツール名のマッピング(tool_result で toolName を復元するため)
63
+ const pendingToolNames = new Map();
64
+ // アクティビティベースタイムアウト: 最後の stdout 出力から CHAT_TIMEOUT 経過で強制終了
99
65
  let sigkillTimer;
100
- const timeout = setTimeout(() => {
101
- logger_1.logger.warn(`[chat] claude CLI timed out after ${constants_1.CHAT_TIMEOUT / 1000}s (pid=${child.pid}), sending SIGTERM`);
66
+ const activityTimeout = (0, activity_timeout_1.createActivityTimeout)(constants_1.CHAT_TIMEOUT, () => {
67
+ logger_1.logger.warn(`[chat] claude CLI timed out after ${constants_1.CHAT_TIMEOUT / 1000}s of inactivity (pid=${child.pid}), sending SIGTERM`);
102
68
  child.kill('SIGTERM');
103
- // SIGTERM後5秒で応答なければSIGKILL
104
69
  sigkillTimer = setTimeout(() => {
105
70
  if (!child.killed) {
106
71
  logger_1.logger.warn(`[chat] claude CLI still running after SIGTERM, sending SIGKILL (pid=${child.pid})`);
107
72
  child.kill('SIGKILL');
108
73
  }
109
74
  }, constants_1.CHAT_SIGKILL_DELAY);
110
- }, constants_1.CHAT_TIMEOUT);
75
+ });
111
76
  child.stdout.on('data', (data) => {
112
- stdoutBuffer += data.toString();
113
- // NDJSON: 改行で分割して各行をパース
114
- const lines = stdoutBuffer.split('\n');
115
- // 最後の不完全な行はバッファに残す
116
- stdoutBuffer = lines.pop() ?? '';
117
- for (const line of lines) {
118
- const trimmed = line.trim();
119
- if (!trimmed)
120
- continue;
121
- const { newSentTextLength, text } = processStreamJsonLine(trimmed, sendChunk, child.pid ?? 0, { sentTextLength, pendingFileUploadIds });
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 });
122
80
  sentTextLength = newSentTextLength;
123
81
  if (text !== undefined)
124
82
  resultText = text;
125
- }
83
+ });
126
84
  });
127
85
  child.stderr.on('data', (data) => {
128
86
  // --verbose モードでは stderr にも NDJSON が出力されるので、デバッグログのみ
@@ -130,7 +88,7 @@ async function runClaudeCode(message, sendChunk, allowedTools, addDirs, locale,
130
88
  logger_1.logger.debug(`[chat] claude CLI stderr: ${text.substring(0, constants_1.LOG_DEBUG_LIMIT)}`);
131
89
  });
132
90
  child.on('error', (error) => {
133
- clearTimeout(timeout);
91
+ activityTimeout.clear();
134
92
  if (sigkillTimer)
135
93
  clearTimeout(sigkillTimer);
136
94
  if (error.code === 'ENOENT') {
@@ -141,7 +99,7 @@ async function runClaudeCode(message, sendChunk, allowedTools, addDirs, locale,
141
99
  }
142
100
  });
143
101
  child.on('close', (code) => {
144
- clearTimeout(timeout);
102
+ activityTimeout.clear();
145
103
  if (sigkillTimer)
146
104
  clearTimeout(sigkillTimer);
147
105
  const durationMs = Date.now() - startTime;
@@ -164,136 +122,6 @@ async function runClaudeCode(message, sendChunk, allowedTools, addDirs, locale,
164
122
  }
165
123
  });
166
124
  });
167
- }
168
- /** file_upload ツール結果を file_attachment チャンクに変換する */
169
- const FILE_UPLOAD_TOOL_NAME = 'mcp__ai-support-agent__file_upload';
170
- /**
171
- * stream-json の NDJSON 1行をパースし、テキストやツール呼び出し情報を処理する
172
- * sendChunk は fire-and-forget で呼び出される(同期的に状態を返すため)
173
- *
174
- * @returns newSentTextLength: 送信済みテキスト長, text: resultイベントのテキスト(undefinedなら未取得)
175
- */
176
- function processStreamJsonLine(line, sendChunk, pid, state) {
177
- let parsed;
178
- try {
179
- parsed = JSON.parse(line);
180
- }
181
- catch {
182
- // JSON パースに失敗した場合はスキップ
183
- logger_1.logger.debug(`[chat] stream-json parse error (pid=${pid}): ${line.substring(0, constants_1.LOG_DEBUG_LIMIT)}`);
184
- return { newSentTextLength: state.sentTextLength };
185
- }
186
- if (parsed.type === 'assistant' && parsed.message?.content) {
187
- let newSentTextLength = state.sentTextLength;
188
- // assistant メッセージからテキストとツール呼び出しを抽出
189
- let fullText = '';
190
- for (const block of parsed.message.content) {
191
- if (block.type === 'text' && block.text) {
192
- fullText += block.text;
193
- }
194
- else if (block.type === 'tool_use' && block.name) {
195
- // ツール呼び出し情報をログ出力
196
- logger_1.logger.info(`[chat] tool_use: ${block.name} (pid=${pid})`);
197
- // tool_call チャンクとして送信
198
- void sendChunk('tool_call', JSON.stringify({
199
- name: block.name,
200
- id: block.id,
201
- }));
202
- // file_upload ツールの呼び出しを追跡(tool_result から file_attachment を生成するため)
203
- if (block.name === FILE_UPLOAD_TOOL_NAME && block.id) {
204
- if (!state.pendingFileUploadIds)
205
- state.pendingFileUploadIds = new Set();
206
- state.pendingFileUploadIds.add(block.id);
207
- }
208
- }
209
- }
210
- // 新しいテキスト部分のみ delta チャンクとして送信(重複防止)
211
- if (fullText.length > newSentTextLength) {
212
- const newText = fullText.substring(newSentTextLength);
213
- void sendChunk('delta', newText);
214
- newSentTextLength = fullText.length;
215
- }
216
- return { newSentTextLength };
217
- }
218
- // user メッセージ内の tool_result から file_upload の結果を検出し、file_attachment チャンクを送信
219
- // MCP ツールの tool_result は2回来る: 1回目は tool_reference(スキップ)、2回目が実際の結果
220
- if (parsed.type === 'user' && parsed.message?.content && state.pendingFileUploadIds?.size) {
221
- for (const block of parsed.message.content) {
222
- if (block.type === 'tool_result' && block.tool_use_id && state.pendingFileUploadIds.has(block.tool_use_id)) {
223
- const fileData = parseFileUploadResult(block.content);
224
- if (fileData) {
225
- state.pendingFileUploadIds.delete(block.tool_use_id);
226
- logger_1.logger.info(`[chat] file_upload result: fileId=${fileData.fileId}, filename=${fileData.filename} (pid=${pid})`);
227
- void sendChunk('file_attachment', JSON.stringify(fileData));
228
- }
229
- }
230
- }
231
- return { newSentTextLength: state.sentTextLength };
232
- }
233
- if (parsed.type === 'result' && parsed.result !== undefined) {
234
- return { newSentTextLength: state.sentTextLength, text: parsed.result };
235
- }
236
- if (parsed.type === 'system' && parsed.subtype === 'init') {
237
- // MCP サーバー接続状態とツール一覧をログ出力(デバッグ用)
238
- if (parsed.mcp_servers?.length) {
239
- for (const mcp of parsed.mcp_servers) {
240
- if (mcp.status === 'connected') {
241
- logger_1.logger.info(`[chat] MCP server "${mcp.name}" connected (pid=${pid})`);
242
- }
243
- else {
244
- logger_1.logger.warn(`[chat] MCP server "${mcp.name}" status=${mcp.status}${mcp.error ? ` error=${mcp.error}` : ''} (pid=${pid})`);
245
- }
246
- }
247
- }
248
- if (parsed.tools?.length) {
249
- const mcpTools = parsed.tools.filter(t => t.startsWith('mcp__'));
250
- logger_1.logger.info(`[chat] stream-json init: ${parsed.tools.length} tools available, MCP tools: [${mcpTools.join(', ')}] (pid=${pid})`);
251
- }
252
- else {
253
- logger_1.logger.info(`[chat] stream-json init received, no tools listed (pid=${pid})`);
254
- }
255
- }
256
- return { newSentTextLength: state.sentTextLength };
257
- }
258
- /**
259
- * file_upload ツールの結果をパースし、file_attachment チャンク用データを返す
260
- *
261
- * MCP ツールの tool_result.content は配列形式: [{type: "text", text: "..."}]
262
- * 組み込みツールの tool_result.content は文字列形式
263
- */
264
- function parseFileUploadResult(content) {
265
- if (!content)
266
- return null;
267
- // content からテキストを抽出
268
- let textContent;
269
- if (typeof content === 'string') {
270
- textContent = content;
271
- }
272
- else if (Array.isArray(content)) {
273
- // MCP ツール形式: [{type: "text", text: "..."}, ...]
274
- const textBlock = content.find(b => b.type === 'text' && b.text);
275
- if (!textBlock?.text)
276
- return null;
277
- textContent = textBlock.text;
278
- }
279
- else {
280
- return null;
281
- }
282
- try {
283
- const data = JSON.parse(textContent);
284
- if (data.success && typeof data.fileId === 'string' && typeof data.s3Key === 'string' && typeof data.filename === 'string') {
285
- return {
286
- fileId: data.fileId,
287
- s3Key: data.s3Key,
288
- filename: data.filename,
289
- contentType: data.contentType ?? 'application/octet-stream',
290
- fileSize: typeof data.fileSize === 'number' ? data.fileSize : 0,
291
- };
292
- }
293
- }
294
- catch {
295
- // パース失敗は無視
296
- }
297
- return null;
125
+ return { result, cancel: () => killFn() };
298
126
  }
299
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":";;;AAmDA,sCAgHC;AAnKD,iDAAqC;AAErC,4CAA0G;AAC1G,sCAAkC;AAElC,gEAAiE;AACjE,8EAA4E;AAC5E,0DAAyD;AAEzD,yDAAmE;AACnE,6DAA4D;AAE5D,uCAAuC;AACvC,uDAAwF;AAA/E,mHAAA,eAAe,OAAA;AAAE,iHAAA,aAAa,OAAA;AAAE,uHAAA,mBAAmB,OAAA;AAC5D,2DAAmF;AAA1E,2HAAA,qBAAqB,OAAA;AAAE,2HAAA,qBAAqB,OAAA;AAiCrD;;;GAGG;AACH,SAAgB,aAAa,CAAC,OAA6B;IACzD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;IAE/G,IAAI,MAAM,GAAe,GAAG,EAAE,GAAqC,CAAC,CAAA;IAEpE,MAAM,MAAM,GAAG,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,oCAAoC;QACpC,kDAAkD;QAClD,uCAAuC;QACvC,MAAM,QAAQ,GAAG,IAAA,gCAAa,GAAE,CAAA;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAA;QAC1D,MAAM,IAAI,GAAG,IAAA,kCAAe,EAAC,OAAO,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAA;QAErG,IAAA,mDAAyB,GAAE,CAAA;QAE3B,MAAM,KAAK,GAAG,IAAA,qBAAK,EAAC,QAAQ,EAAE,IAAI,EAAE;YAClC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG;YACH,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxB,CAAC,CAAA;QAEF,eAAM,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAAC,GAAG,gBAAgB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEnI,qCAAqC;QACrC,MAAM,GAAG,GAAG,EAAE;YACZ,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAM;YACxB,eAAM,CAAC,IAAI,CAAC,0CAA0C,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;YACnE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClB,eAAM,CAAC,IAAI,CAAC,uEAAuE,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;oBAChG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC,EAAE,8BAAkB,CAAC,CAAA;QACxB,CAAC,CAAA;QAED,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,MAAM,YAAY,GAAG,IAAI,gCAAgB,EAAE,CAAA;QAC3C,oCAAoC;QACpC,IAAI,cAAc,GAAG,CAAC,CAAA;QACtB,wEAAwE;QACxE,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAA;QAC9C,2DAA2D;QAC3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAkB,CAAA;QAElD,yDAAyD;QACzD,IAAI,YAAwC,CAAA;QAC5C,MAAM,eAAe,GAAG,IAAA,wCAAqB,EAAC,wBAAY,EAAE,GAAG,EAAE;YAC/D,eAAM,CAAC,IAAI,CAAC,qCAAqC,wBAAY,GAAG,IAAI,wBAAwB,KAAK,CAAC,GAAG,oBAAoB,CAAC,CAAA;YAC1H,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACrB,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;oBAClB,eAAM,CAAC,IAAI,CAAC,uEAAuE,KAAK,CAAC,GAAG,GAAG,CAAC,CAAA;oBAChG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC,EAAE,8BAAkB,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,eAAe,CAAC,KAAK,EAAE,CAAA;YACvB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC1C,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,IAAA,0CAAqB,EAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,CAAC,CAAA;gBACtJ,cAAc,GAAG,iBAAiB,CAAA;gBAClC,IAAI,IAAI,KAAK,SAAS;oBAAE,UAAU,GAAG,IAAI,CAAA;YAC3C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACvC,qDAAqD;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;YAC5B,eAAM,CAAC,KAAK,CAAC,6BAA6B,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,2BAAe,CAAC,EAAE,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,eAAe,CAAC,KAAK,EAAE,CAAA;YACvB,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAA;YAC5C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAwB,CAAC,CAAC,CAAA;YAC7C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,CAAA;YACf,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,eAAe,CAAC,KAAK,EAAE,CAAA;YACvB,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACzC,qBAAqB;YACrB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtC,eAAM,CAAC,KAAK,CAAC,iCAAiC,KAAK,CAAC,GAAG,UAAU,IAAI,cAAc,UAAU,KAAK,CAAC,CAAA;YACnG,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC;oBACN,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,IAAI;wBACd,SAAS,EAAE,KAAK;wBAChB,UAAU;qBACX;iBACF,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CACJ,IAAI,KAAK,CACP,mBAAmB,IAAI,UAAU,CAClC,CACF,CAAA;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAA;AAC3C,CAAC"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-stream.js","sourceRoot":"","sources":["../../src/commands/claude-code-stream.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { CommandResult, FileDeletePayload, FileListPayload, FileMkdirPayload, FileReadPayload, FileRenamePayload, FileWritePayload } from '../types';
1
+ import { type CommandResult, type FileDeletePayload, type FileListPayload, type FileMkdirPayload, type FileReadPayload, type FileRenamePayload, type FileWritePayload } from '../types';
2
2
  export declare function fileRead(payload: FileReadPayload): Promise<CommandResult>;
3
3
  export declare function fileWrite(payload: FileWritePayload): Promise<CommandResult>;
4
4
  export declare function fileList(payload: FileListPayload): Promise<CommandResult>;