@ai-support-agent/cli 0.0.1 → 0.0.3-beta.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.
Files changed (96) hide show
  1. package/dist/agent-runner.d.ts +7 -4
  2. package/dist/agent-runner.d.ts.map +1 -1
  3. package/dist/agent-runner.js +49 -121
  4. package/dist/agent-runner.js.map +1 -1
  5. package/dist/api-client.d.ts +9 -5
  6. package/dist/api-client.d.ts.map +1 -1
  7. package/dist/api-client.js +46 -8
  8. package/dist/api-client.js.map +1 -1
  9. package/dist/appsync-subscriber.d.ts +36 -0
  10. package/dist/appsync-subscriber.d.ts.map +1 -0
  11. package/dist/appsync-subscriber.js +234 -0
  12. package/dist/appsync-subscriber.js.map +1 -0
  13. package/dist/auto-updater.d.ts +15 -0
  14. package/dist/auto-updater.d.ts.map +1 -0
  15. package/dist/auto-updater.js +110 -0
  16. package/dist/auto-updater.js.map +1 -0
  17. package/dist/chat-mode-detector.d.ts +19 -0
  18. package/dist/chat-mode-detector.d.ts.map +1 -0
  19. package/dist/chat-mode-detector.js +83 -0
  20. package/dist/chat-mode-detector.js.map +1 -0
  21. package/dist/cli/auth-commands.d.ts +3 -0
  22. package/dist/cli/auth-commands.d.ts.map +1 -0
  23. package/dist/cli/auth-commands.js +123 -0
  24. package/dist/cli/auth-commands.js.map +1 -0
  25. package/dist/cli/status-command.d.ts +5 -0
  26. package/dist/cli/status-command.d.ts.map +1 -0
  27. package/dist/cli/status-command.js +57 -0
  28. package/dist/cli/status-command.js.map +1 -0
  29. package/dist/cli/validators.d.ts +4 -0
  30. package/dist/cli/validators.d.ts.map +1 -0
  31. package/dist/cli/validators.js +26 -0
  32. package/dist/cli/validators.js.map +1 -0
  33. package/dist/command-executor.d.ts +2 -2
  34. package/dist/command-executor.d.ts.map +1 -1
  35. package/dist/command-executor.js +15 -303
  36. package/dist/command-executor.js.map +1 -1
  37. package/dist/commands/api-chat-executor.d.ts +8 -0
  38. package/dist/commands/api-chat-executor.d.ts.map +1 -0
  39. package/dist/commands/api-chat-executor.js +117 -0
  40. package/dist/commands/api-chat-executor.js.map +1 -0
  41. package/dist/commands/chat-executor.d.ts +11 -0
  42. package/dist/commands/chat-executor.d.ts.map +1 -0
  43. package/dist/commands/chat-executor.js +127 -0
  44. package/dist/commands/chat-executor.js.map +1 -0
  45. package/dist/commands/file-executor.d.ts +5 -0
  46. package/dist/commands/file-executor.d.ts.map +1 -0
  47. package/dist/commands/file-executor.js +97 -0
  48. package/dist/commands/file-executor.js.map +1 -0
  49. package/dist/commands/index.d.ts +16 -0
  50. package/dist/commands/index.d.ts.map +1 -0
  51. package/dist/commands/index.js +80 -0
  52. package/dist/commands/index.js.map +1 -0
  53. package/dist/commands/process-executor.d.ts +4 -0
  54. package/dist/commands/process-executor.d.ts.map +1 -0
  55. package/dist/commands/process-executor.js +66 -0
  56. package/dist/commands/process-executor.js.map +1 -0
  57. package/dist/commands/shared-chat-utils.d.ts +20 -0
  58. package/dist/commands/shared-chat-utils.d.ts.map +1 -0
  59. package/dist/commands/shared-chat-utils.js +35 -0
  60. package/dist/commands/shared-chat-utils.js.map +1 -0
  61. package/dist/commands/shell-executor.d.ts +3 -0
  62. package/dist/commands/shell-executor.d.ts.map +1 -0
  63. package/dist/commands/shell-executor.js +125 -0
  64. package/dist/commands/shell-executor.js.map +1 -0
  65. package/dist/config-manager.d.ts.map +1 -1
  66. package/dist/config-manager.js +5 -0
  67. package/dist/config-manager.js.map +1 -1
  68. package/dist/constants.d.ts +9 -2
  69. package/dist/constants.d.ts.map +1 -1
  70. package/dist/constants.js +50 -3
  71. package/dist/constants.js.map +1 -1
  72. package/dist/index.js +12 -160
  73. package/dist/index.js.map +1 -1
  74. package/dist/locales/en.json +19 -1
  75. package/dist/locales/ja.json +19 -1
  76. package/dist/locales/locales/en.json +19 -1
  77. package/dist/locales/locales/ja.json +19 -1
  78. package/dist/project-agent.d.ts +32 -0
  79. package/dist/project-agent.d.ts.map +1 -0
  80. package/dist/project-agent.js +296 -0
  81. package/dist/project-agent.js.map +1 -0
  82. package/dist/security.d.ts +13 -0
  83. package/dist/security.d.ts.map +1 -0
  84. package/dist/security.js +123 -0
  85. package/dist/security.js.map +1 -0
  86. package/dist/system-info.d.ts +4 -0
  87. package/dist/system-info.d.ts.map +1 -0
  88. package/dist/system-info.js +60 -0
  89. package/dist/system-info.js.map +1 -0
  90. package/dist/types.d.ts +80 -1
  91. package/dist/types.d.ts.map +1 -1
  92. package/dist/update-checker.d.ts +24 -0
  93. package/dist/update-checker.d.ts.map +1 -0
  94. package/dist/update-checker.js +89 -0
  95. package/dist/update-checker.js.map +1 -0
  96. package/package.json +5 -3
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AppSyncSubscriber = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const logger_1 = require("./logger");
9
+ const utils_1 = require("./utils");
10
+ const SUBSCRIPTION_QUERY = `subscription OnMessage($tenantCode: String!) {
11
+ onMessage(tenantCode: $tenantCode) {
12
+ id
13
+ table
14
+ pk
15
+ sk
16
+ tenantCode
17
+ action
18
+ content
19
+ }
20
+ }`;
21
+ const MAX_RECONNECT_RETRIES = 5;
22
+ const RECONNECT_BASE_DELAY_MS = 1000;
23
+ class AppSyncSubscriber {
24
+ ws = null;
25
+ realtimeUrl;
26
+ host;
27
+ apiKey;
28
+ subscriptionId = null;
29
+ tenantCode = null;
30
+ messageHandler = null;
31
+ reconnectCallback = null;
32
+ reconnectAttempts = 0;
33
+ closed = false;
34
+ keepAliveTimer = null;
35
+ keepAliveTimeoutMs = 0;
36
+ constructor(appsyncUrl, apiKey) {
37
+ this.apiKey = apiKey;
38
+ const url = new URL(appsyncUrl);
39
+ this.host = url.host;
40
+ this.realtimeUrl = appsyncUrl
41
+ .replace('https://', 'wss://')
42
+ .replace('http://', 'ws://')
43
+ + '/realtime';
44
+ }
45
+ connect() {
46
+ this.closed = false;
47
+ this.reconnectAttempts = 0;
48
+ return this.doConnect();
49
+ }
50
+ subscribe(tenantCode, onMessage) {
51
+ this.tenantCode = tenantCode;
52
+ this.messageHandler = onMessage;
53
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
54
+ this.sendSubscription(tenantCode);
55
+ }
56
+ }
57
+ onReconnect(callback) {
58
+ this.reconnectCallback = callback;
59
+ }
60
+ disconnect() {
61
+ this.closed = true;
62
+ this.clearKeepAliveTimer();
63
+ if (this.ws) {
64
+ if (this.subscriptionId) {
65
+ const stopMessage = {
66
+ id: this.subscriptionId,
67
+ type: 'stop',
68
+ };
69
+ try {
70
+ this.ws.send(JSON.stringify(stopMessage));
71
+ }
72
+ catch {
73
+ // ignore send errors during disconnect
74
+ }
75
+ }
76
+ this.ws.close();
77
+ this.ws = null;
78
+ }
79
+ this.subscriptionId = null;
80
+ }
81
+ buildConnectionUrl() {
82
+ const header = {
83
+ host: this.host,
84
+ 'x-api-key': this.apiKey,
85
+ 'content-type': 'application/json',
86
+ };
87
+ const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64');
88
+ const encodedPayload = Buffer.from(JSON.stringify({})).toString('base64');
89
+ return `${this.realtimeUrl}?header=${encodedHeader}&payload=${encodedPayload}`;
90
+ }
91
+ doConnect() {
92
+ return new Promise((resolve, reject) => {
93
+ const url = this.buildConnectionUrl();
94
+ const ws = new ws_1.default(url, ['graphql-ws']);
95
+ ws.on('open', () => {
96
+ const initMessage = { type: 'connection_init' };
97
+ ws.send(JSON.stringify(initMessage));
98
+ });
99
+ ws.on('message', (data) => {
100
+ let msg;
101
+ try {
102
+ msg = JSON.parse(data.toString());
103
+ }
104
+ catch {
105
+ logger_1.logger.debug('AppSync: Failed to parse message');
106
+ return;
107
+ }
108
+ this.handleMessage(msg, resolve);
109
+ });
110
+ ws.on('error', (error) => {
111
+ logger_1.logger.debug(`AppSync WebSocket error: ${(0, utils_1.getErrorMessage)(error)}`);
112
+ if (this.reconnectAttempts === 0 && !this.ws) {
113
+ reject(error);
114
+ }
115
+ });
116
+ ws.on('close', () => {
117
+ this.clearKeepAliveTimer();
118
+ if (!this.closed) {
119
+ logger_1.logger.debug('AppSync WebSocket closed unexpectedly');
120
+ void this.attemptReconnect();
121
+ }
122
+ });
123
+ this.ws = ws;
124
+ });
125
+ }
126
+ handleMessage(msg, resolveConnect) {
127
+ switch (msg.type) {
128
+ case 'connection_ack': {
129
+ const timeoutMs = msg.payload?.connectionTimeoutMs ?? 300000;
130
+ this.keepAliveTimeoutMs = timeoutMs;
131
+ this.resetKeepAliveTimer();
132
+ logger_1.logger.debug(`AppSync: Connection acknowledged (timeout: ${timeoutMs}ms)`);
133
+ if (resolveConnect) {
134
+ resolveConnect();
135
+ }
136
+ if (this.tenantCode && this.messageHandler) {
137
+ this.sendSubscription(this.tenantCode);
138
+ }
139
+ break;
140
+ }
141
+ case 'start_ack':
142
+ logger_1.logger.debug(`AppSync: Subscription started (id: ${msg.id})`);
143
+ break;
144
+ case 'data': {
145
+ this.resetKeepAliveTimer();
146
+ const onMessageData = msg.payload?.data?.onMessage;
147
+ if (onMessageData && this.messageHandler) {
148
+ this.messageHandler(onMessageData);
149
+ }
150
+ break;
151
+ }
152
+ case 'ka':
153
+ this.resetKeepAliveTimer();
154
+ break;
155
+ case 'error':
156
+ logger_1.logger.warn(`AppSync error: ${JSON.stringify(msg.payload)}`);
157
+ break;
158
+ case 'complete':
159
+ logger_1.logger.debug(`AppSync: Subscription completed (id: ${msg.id})`);
160
+ this.subscriptionId = null;
161
+ break;
162
+ }
163
+ }
164
+ sendSubscription(tenantCode) {
165
+ if (!this.ws || this.ws.readyState !== ws_1.default.OPEN)
166
+ return;
167
+ const id = `sub-${Date.now()}`;
168
+ this.subscriptionId = id;
169
+ const extensions = {
170
+ authorization: {
171
+ host: this.host,
172
+ 'x-api-key': this.apiKey,
173
+ 'content-type': 'application/json',
174
+ },
175
+ };
176
+ const startMessage = {
177
+ id,
178
+ type: 'start',
179
+ payload: {
180
+ data: JSON.stringify({
181
+ query: SUBSCRIPTION_QUERY,
182
+ variables: { tenantCode },
183
+ }),
184
+ extensions,
185
+ },
186
+ };
187
+ this.ws.send(JSON.stringify(startMessage));
188
+ }
189
+ async attemptReconnect() {
190
+ if (this.closed || this.reconnectAttempts >= MAX_RECONNECT_RETRIES) {
191
+ if (this.reconnectAttempts >= MAX_RECONNECT_RETRIES) {
192
+ logger_1.logger.error('AppSync: Max reconnect attempts reached');
193
+ }
194
+ return;
195
+ }
196
+ this.reconnectAttempts++;
197
+ const delay = RECONNECT_BASE_DELAY_MS * Math.pow(2, this.reconnectAttempts - 1);
198
+ logger_1.logger.info(`AppSync: Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${MAX_RECONNECT_RETRIES})`);
199
+ await new Promise((resolve) => setTimeout(resolve, delay));
200
+ if (this.closed)
201
+ return;
202
+ try {
203
+ await this.doConnect();
204
+ logger_1.logger.info('AppSync: Reconnected successfully');
205
+ this.reconnectAttempts = 0;
206
+ if (this.reconnectCallback) {
207
+ this.reconnectCallback();
208
+ }
209
+ }
210
+ catch (error) {
211
+ logger_1.logger.warn(`AppSync: Reconnect failed: ${(0, utils_1.getErrorMessage)(error)}`);
212
+ void this.attemptReconnect();
213
+ }
214
+ }
215
+ resetKeepAliveTimer() {
216
+ this.clearKeepAliveTimer();
217
+ if (this.keepAliveTimeoutMs > 0) {
218
+ this.keepAliveTimer = setTimeout(() => {
219
+ logger_1.logger.warn('AppSync: Keep-alive timeout, reconnecting...');
220
+ if (this.ws) {
221
+ this.ws.close();
222
+ }
223
+ }, this.keepAliveTimeoutMs);
224
+ }
225
+ }
226
+ clearKeepAliveTimer() {
227
+ if (this.keepAliveTimer) {
228
+ clearTimeout(this.keepAliveTimer);
229
+ this.keepAliveTimer = null;
230
+ }
231
+ }
232
+ }
233
+ exports.AppSyncSubscriber = AppSyncSubscriber;
234
+ //# sourceMappingURL=appsync-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appsync-subscriber.js","sourceRoot":"","sources":["../src/appsync-subscriber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { ApiClient } from './api-client';
2
+ import type { AutoUpdateConfig } from './types';
3
+ export interface AutoUpdaterHandle {
4
+ stop: () => void;
5
+ }
6
+ /**
7
+ * Start the auto-updater that periodically checks for new versions.
8
+ *
9
+ * @param clients - ApiClient instances (any one is used for version check)
10
+ * @param config - Auto-update configuration
11
+ * @param stopAllAgents - Function to gracefully stop all running agents
12
+ * @param sendUpdateError - Function to report update errors via heartbeat
13
+ */
14
+ export declare function startAutoUpdater(clients: ApiClient[], config: AutoUpdateConfig, stopAllAgents: () => void, sendUpdateError?: (error: string) => void): AutoUpdaterHandle;
15
+ //# sourceMappingURL=auto-updater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-updater.d.ts","sourceRoot":"","sources":["../src/auto-updater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAI/C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,EAAE,EACpB,MAAM,EAAE,gBAAgB,EACxB,aAAa,EAAE,MAAM,IAAI,EACzB,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GACxC,iBAAiB,CA4GnB"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startAutoUpdater = startAutoUpdater;
4
+ const constants_1 = require("./constants");
5
+ const i18n_1 = require("./i18n");
6
+ const logger_1 = require("./logger");
7
+ const utils_1 = require("./utils");
8
+ const update_checker_1 = require("./update-checker");
9
+ /**
10
+ * Start the auto-updater that periodically checks for new versions.
11
+ *
12
+ * @param clients - ApiClient instances (any one is used for version check)
13
+ * @param config - Auto-update configuration
14
+ * @param stopAllAgents - Function to gracefully stop all running agents
15
+ * @param sendUpdateError - Function to report update errors via heartbeat
16
+ */
17
+ function startAutoUpdater(clients, config, stopAllAgents, sendUpdateError) {
18
+ let initialTimer = null;
19
+ let intervalTimer = null;
20
+ let lastFailedVersion = null;
21
+ let checking = false;
22
+ const check = async () => {
23
+ if (checking)
24
+ return;
25
+ checking = true;
26
+ try {
27
+ // Use the first available client
28
+ const client = clients[0];
29
+ if (!client)
30
+ return;
31
+ const versionInfo = await client.getVersionInfo(config.channel);
32
+ if (!(0, update_checker_1.isValidVersion)(versionInfo.latestVersion)) {
33
+ logger_1.logger.debug(`Invalid version from server: ${versionInfo.latestVersion}`);
34
+ return;
35
+ }
36
+ // Check if forced update is needed (below minimumVersion)
37
+ const forcedUpdate = (0, update_checker_1.isValidVersion)(versionInfo.minimumVersion) &&
38
+ (0, update_checker_1.isNewerVersion)(constants_1.AGENT_VERSION, versionInfo.minimumVersion);
39
+ if (!(0, update_checker_1.isNewerVersion)(constants_1.AGENT_VERSION, versionInfo.latestVersion) && !forcedUpdate) {
40
+ logger_1.logger.debug((0, i18n_1.t)('update.upToDate', { version: constants_1.AGENT_VERSION }));
41
+ return;
42
+ }
43
+ const targetVersion = versionInfo.latestVersion;
44
+ // Skip if we already failed to update to this version
45
+ if (lastFailedVersion === targetVersion && !forcedUpdate) {
46
+ logger_1.logger.debug(`Skipping update to ${targetVersion} (previously failed)`);
47
+ return;
48
+ }
49
+ if (forcedUpdate) {
50
+ logger_1.logger.warn((0, i18n_1.t)('update.forced', { version: targetVersion, minimumVersion: versionInfo.minimumVersion }));
51
+ }
52
+ else {
53
+ logger_1.logger.info((0, i18n_1.t)('update.available', { current: constants_1.AGENT_VERSION, latest: targetVersion }));
54
+ }
55
+ // If autoRestart is disabled and it's not a forced update, just notify
56
+ if (!config.autoRestart && !forcedUpdate) {
57
+ logger_1.logger.info((0, i18n_1.t)('update.manualHint', { version: targetVersion }));
58
+ return;
59
+ }
60
+ // Perform the update
61
+ logger_1.logger.info((0, i18n_1.t)('update.installing', { version: targetVersion }));
62
+ const result = await (0, update_checker_1.performUpdate)(targetVersion);
63
+ if (!result.success) {
64
+ lastFailedVersion = targetVersion;
65
+ const errorMsg = result.error ?? 'Unknown error';
66
+ logger_1.logger.error((0, i18n_1.t)('update.installFailed', { message: errorMsg }));
67
+ if (errorMsg.includes('Permission denied')) {
68
+ logger_1.logger.info((0, i18n_1.t)('update.permissionHint', { version: targetVersion }));
69
+ }
70
+ // Report error to server
71
+ sendUpdateError?.(errorMsg);
72
+ return;
73
+ }
74
+ logger_1.logger.success((0, i18n_1.t)('update.installSuccess', { version: targetVersion }));
75
+ // Graceful restart
76
+ logger_1.logger.info((0, i18n_1.t)('update.stoppingAgents'));
77
+ stopAllAgents();
78
+ stop();
79
+ logger_1.logger.info((0, i18n_1.t)('update.restarting'));
80
+ (0, update_checker_1.reExecProcess)();
81
+ }
82
+ catch (error) {
83
+ logger_1.logger.debug(`Update check failed: ${(0, utils_1.getErrorMessage)(error)}`);
84
+ }
85
+ finally {
86
+ checking = false;
87
+ }
88
+ };
89
+ const stop = () => {
90
+ if (initialTimer) {
91
+ clearTimeout(initialTimer);
92
+ initialTimer = null;
93
+ }
94
+ if (intervalTimer) {
95
+ clearInterval(intervalTimer);
96
+ intervalTimer = null;
97
+ }
98
+ };
99
+ // Schedule: initial delay, then periodic checks
100
+ initialTimer = setTimeout(() => {
101
+ initialTimer = null;
102
+ void check();
103
+ intervalTimer = setInterval(() => {
104
+ void check();
105
+ }, constants_1.UPDATE_CHECK_INTERVAL);
106
+ }, constants_1.UPDATE_CHECK_INITIAL_DELAY);
107
+ logger_1.logger.debug(`Auto-updater started (channel: ${config.channel}, interval: ${constants_1.UPDATE_CHECK_INTERVAL / 1000}s)`);
108
+ return { stop };
109
+ }
110
+ //# sourceMappingURL=auto-updater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-updater.js","sourceRoot":"","sources":["../src/auto-updater.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AgentChatMode } from './types';
2
+ /**
3
+ * 利用可能なチャットモードを検出する
4
+ * - claude CLI の存在確認(5秒タイムアウト)
5
+ * - ANTHROPIC_API_KEY 環境変数の存在確認
6
+ */
7
+ export declare function detectAvailableChatModes(): Promise<AgentChatMode[]>;
8
+ /**
9
+ * アクティブなチャットモードを決定する
10
+ *
11
+ * 優先順位:
12
+ * 1. ローカル設定(config.json の agentChatMode)
13
+ * 2. サーバー設定(defaultAgentChatMode)
14
+ * 3. 自動検出(claude_code 優先)
15
+ *
16
+ * 指定されたモードが利用不可の場合は利用可能なモードにフォールバック
17
+ */
18
+ export declare function resolveActiveChatMode(available: AgentChatMode[], localOverride?: AgentChatMode, serverDefault?: AgentChatMode): AgentChatMode | undefined;
19
+ //# sourceMappingURL=chat-mode-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-mode-detector.d.ts","sourceRoot":"","sources":["../src/chat-mode-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAI5C;;;;GAIG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAgBzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,aAAa,EAAE,EAC1B,aAAa,CAAC,EAAE,aAAa,EAC7B,aAAa,CAAC,EAAE,aAAa,GAC5B,aAAa,GAAG,SAAS,CAkC3B"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectAvailableChatModes = detectAvailableChatModes;
4
+ exports.resolveActiveChatMode = resolveActiveChatMode;
5
+ const child_process_1 = require("child_process");
6
+ const logger_1 = require("./logger");
7
+ const CLAUDE_DETECT_TIMEOUT_MS = 5_000;
8
+ /**
9
+ * 利用可能なチャットモードを検出する
10
+ * - claude CLI の存在確認(5秒タイムアウト)
11
+ * - ANTHROPIC_API_KEY 環境変数の存在確認
12
+ */
13
+ async function detectAvailableChatModes() {
14
+ const modes = [];
15
+ // Claude Code CLI の検出
16
+ const claudeAvailable = await isClaudeCodeAvailable();
17
+ if (claudeAvailable) {
18
+ modes.push('claude_code');
19
+ }
20
+ // Anthropic API Key の検出
21
+ if (process.env.ANTHROPIC_API_KEY) {
22
+ modes.push('api');
23
+ }
24
+ logger_1.logger.debug(`[chat-mode-detector] Available modes: ${JSON.stringify(modes)}`);
25
+ return modes;
26
+ }
27
+ /**
28
+ * アクティブなチャットモードを決定する
29
+ *
30
+ * 優先順位:
31
+ * 1. ローカル設定(config.json の agentChatMode)
32
+ * 2. サーバー設定(defaultAgentChatMode)
33
+ * 3. 自動検出(claude_code 優先)
34
+ *
35
+ * 指定されたモードが利用不可の場合は利用可能なモードにフォールバック
36
+ */
37
+ function resolveActiveChatMode(available, localOverride, serverDefault) {
38
+ if (available.length === 0) {
39
+ logger_1.logger.warn('[chat-mode-detector] No chat modes available');
40
+ return undefined;
41
+ }
42
+ // 1. ローカル設定
43
+ if (localOverride && available.includes(localOverride)) {
44
+ logger_1.logger.debug(`[chat-mode-detector] Using local override: ${localOverride}`);
45
+ return localOverride;
46
+ }
47
+ if (localOverride) {
48
+ logger_1.logger.warn(`[chat-mode-detector] Local override "${localOverride}" not available, falling back`);
49
+ }
50
+ // 2. サーバー設定
51
+ if (serverDefault && available.includes(serverDefault)) {
52
+ logger_1.logger.debug(`[chat-mode-detector] Using server default: ${serverDefault}`);
53
+ return serverDefault;
54
+ }
55
+ if (serverDefault) {
56
+ logger_1.logger.warn(`[chat-mode-detector] Server default "${serverDefault}" not available, falling back`);
57
+ }
58
+ // 3. 自動検出(claude_code 優先)
59
+ const resolved = available.includes('claude_code')
60
+ ? 'claude_code'
61
+ : available[0];
62
+ logger_1.logger.debug(`[chat-mode-detector] Auto-detected: ${resolved}`);
63
+ return resolved;
64
+ }
65
+ /**
66
+ * Claude Code CLI が利用可能かチェックする
67
+ */
68
+ async function isClaudeCodeAvailable() {
69
+ return new Promise((resolve) => {
70
+ try {
71
+ const child = (0, child_process_1.execFile)('claude', ['--version'], { timeout: CLAUDE_DETECT_TIMEOUT_MS }, (error) => {
72
+ resolve(!error);
73
+ });
74
+ child.on('error', () => {
75
+ resolve(false);
76
+ });
77
+ }
78
+ catch {
79
+ resolve(false);
80
+ }
81
+ });
82
+ }
83
+ //# sourceMappingURL=chat-mode-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-mode-detector.js","sourceRoot":"","sources":["../src/chat-mode-detector.ts"],"names":[],"mappings":";;AAYA,4DAgBC;AAYD,sDAsCC;AA9ED,iDAAwC;AAExC,qCAAiC;AAGjC,MAAM,wBAAwB,GAAG,KAAK,CAAA;AAEtC;;;;GAIG;AACI,KAAK,UAAU,wBAAwB;IAC5C,MAAM,KAAK,GAAoB,EAAE,CAAA;IAEjC,sBAAsB;IACtB,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAA;IACrD,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC3B,CAAC;IAED,wBAAwB;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,yCAAyC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC9E,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,qBAAqB,CACnC,SAA0B,EAC1B,aAA6B,EAC7B,aAA6B;IAE7B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,eAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;QAC3D,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,YAAY;IACZ,IAAI,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,eAAM,CAAC,KAAK,CAAC,8CAA8C,aAAa,EAAE,CAAC,CAAA;QAC3E,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,eAAM,CAAC,IAAI,CACT,wCAAwC,aAAa,+BAA+B,CACrF,CAAA;IACH,CAAC;IAED,YAAY;IACZ,IAAI,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,eAAM,CAAC,KAAK,CAAC,8CAA8C,aAAa,EAAE,CAAC,CAAA;QAC3E,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,eAAM,CAAC,IAAI,CACT,wCAAwC,aAAa,+BAA+B,CACrF,CAAA;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC;QAChD,CAAC,CAAC,aAAa;QACf,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAChB,eAAM,CAAC,KAAK,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAA;IAC/D,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB;IAClC,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAA,wBAAQ,EACpB,QAAQ,EACR,CAAC,WAAW,CAAC,EACb,EAAE,OAAO,EAAE,wBAAwB,EAAE,EACrC,CAAC,KAAK,EAAE,EAAE;gBACR,OAAO,CAAC,CAAC,KAAK,CAAC,CAAA;YACjB,CAAC,CACF,CAAA;YACD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACrB,OAAO,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=auth-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-commands.d.ts","sourceRoot":"","sources":["../../src/cli/auth-commands.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuExC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyC3D"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerAuthCommands = registerAuthCommands;
37
+ const auth_server_1 = require("../auth-server");
38
+ const constants_1 = require("../constants");
39
+ const config_manager_1 = require("../config-manager");
40
+ const i18n_1 = require("../i18n");
41
+ const logger_1 = require("../logger");
42
+ const utils_1 = require("../utils");
43
+ async function performBrowserAuth(opts) {
44
+ const port = opts.port ? (() => {
45
+ const parsed = parseInt(opts.port, 10);
46
+ if (isNaN(parsed) || parsed < 1 || parsed > 65535) {
47
+ logger_1.logger.error((0, i18n_1.t)('auth.invalidPort', { port: opts.port }));
48
+ process.exit(1);
49
+ }
50
+ return parsed;
51
+ })() : undefined;
52
+ const urlError = (0, utils_1.validateApiUrl)(opts.url);
53
+ if (urlError) {
54
+ logger_1.logger.error((0, i18n_1.t)('auth.invalidProtocol'));
55
+ process.exit(1);
56
+ }
57
+ const origin = new URL(opts.url).origin;
58
+ const { url: serverUrl, nonce, waitForCallback, stop } = await (0, auth_server_1.startAuthServer)(port, origin);
59
+ const callbackUrl = `${serverUrl}/callback`;
60
+ const webUrl = `${opts.url}/admin/agent-callback?callbackUrl=${encodeURIComponent(callbackUrl)}&nonce=${nonce}`;
61
+ logger_1.logger.info((0, i18n_1.t)('auth.openingBrowser'));
62
+ logger_1.logger.info((0, i18n_1.t)('auth.url', { url: webUrl }));
63
+ const open = (await Promise.resolve().then(() => __importStar(require('open')))).default;
64
+ await open(webUrl);
65
+ logger_1.logger.info((0, i18n_1.t)('auth.selectProject'));
66
+ const result = await waitForCallback();
67
+ stop();
68
+ const apiUrl = opts.apiUrl ?? result.apiUrl;
69
+ if (!apiUrl) {
70
+ logger_1.logger.error((0, i18n_1.t)('auth.noApiUrl'));
71
+ process.exit(1);
72
+ }
73
+ const projectCode = result.projectCode ?? constants_1.PROJECT_CODE_DEFAULT;
74
+ (0, config_manager_1.addProject)({ projectCode, token: result.token, apiUrl });
75
+ return { projectCode };
76
+ }
77
+ async function handleBrowserAuthCommand(opts, successMessageKey) {
78
+ try {
79
+ const { projectCode } = await performBrowserAuth(opts);
80
+ logger_1.logger.success((0, i18n_1.t)(successMessageKey, { projectCode }));
81
+ }
82
+ catch (error) {
83
+ logger_1.logger.error((0, i18n_1.t)('auth.failed', { message: (0, utils_1.getErrorMessage)(error) }));
84
+ process.exit(1);
85
+ }
86
+ }
87
+ function registerAuthCommands(program) {
88
+ program
89
+ .command('login')
90
+ .description((0, i18n_1.t)('cmd.login'))
91
+ .requiredOption('--url <url>', (0, i18n_1.t)('cmd.login.url'))
92
+ .option('--api-url <url>', (0, i18n_1.t)('cmd.login.apiUrl'))
93
+ .option('--port <port>', (0, i18n_1.t)('cmd.login.port'))
94
+ .action((opts) => handleBrowserAuthCommand(opts, 'project.registered'));
95
+ program
96
+ .command('add-project')
97
+ .description((0, i18n_1.t)('cmd.addProject'))
98
+ .requiredOption('--url <url>', (0, i18n_1.t)('cmd.login.url'))
99
+ .option('--api-url <url>', (0, i18n_1.t)('cmd.login.apiUrl'))
100
+ .option('--port <port>', (0, i18n_1.t)('cmd.login.port'))
101
+ .action((opts) => handleBrowserAuthCommand(opts, 'project.added'));
102
+ program
103
+ .command('configure')
104
+ .description((0, i18n_1.t)('cmd.configure'))
105
+ .requiredOption('--token <token>', (0, i18n_1.t)('cmd.configure.token'))
106
+ .requiredOption('--api-url <url>', (0, i18n_1.t)('cmd.configure.apiUrl'))
107
+ .option('--project-code <code>', (0, i18n_1.t)('cmd.configure.projectCode'))
108
+ .action((opts) => {
109
+ const apiUrlError = (0, utils_1.validateApiUrl)(opts.apiUrl);
110
+ if (apiUrlError) {
111
+ logger_1.logger.error(apiUrlError);
112
+ process.exit(1);
113
+ }
114
+ const projectCode = opts.projectCode ?? constants_1.PROJECT_CODE_DEFAULT;
115
+ (0, config_manager_1.addProject)({
116
+ projectCode,
117
+ token: opts.token,
118
+ apiUrl: opts.apiUrl,
119
+ });
120
+ logger_1.logger.success((0, i18n_1.t)('config.projectSaved', { projectCode }));
121
+ });
122
+ }
123
+ //# sourceMappingURL=auth-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-commands.js","sourceRoot":"","sources":["../../src/cli/auth-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { AgentConfig } from '../types';
3
+ export declare function formatStatus(config: AgentConfig): string;
4
+ export declare function registerStatusCommand(program: Command): void;
5
+ //# sourceMappingURL=status-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-command.d.ts","sourceRoot":"","sources":["../../src/cli/status-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAoCxD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAY5D"}