@ai-support-agent/cli 0.3.0-beta.1 → 0.3.1-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.
- package/ansible/callback_plugins/json.py +146 -0
- package/ansible/callback_plugins/tests/test_json_callback.py +171 -0
- package/ansible/playbook.yml +52 -0
- package/ansible/roles/database/tasks/main.yml +121 -0
- package/ansible/roles/dns_tls/tasks/main.yml +75 -0
- package/ansible/roles/dns_tls/templates/Caddyfile.j2 +4 -0
- package/ansible/roles/docker/tasks/main.yml +51 -0
- package/ansible/roles/os_init/tasks/main.yml +61 -0
- package/ansible/roles/web_server/tasks/main.yml +47 -0
- package/dist/api-client.d.ts +25 -1
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +33 -0
- package/dist/api-client.js.map +1 -1
- package/dist/commands/chat-executor.js +1 -1
- package/dist/commands/chat-executor.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +14 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -1
- package/dist/mcp/config-writer.d.ts +24 -1
- package/dist/mcp/config-writer.d.ts.map +1 -1
- package/dist/mcp/config-writer.js +27 -2
- package/dist/mcp/config-writer.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/update-system-knowledge.d.ts +29 -0
- package/dist/mcp/tools/update-system-knowledge.d.ts.map +1 -0
- package/dist/mcp/tools/update-system-knowledge.js +63 -0
- package/dist/mcp/tools/update-system-knowledge.js.map +1 -0
- package/dist/oneshot-runner.d.ts.map +1 -1
- package/dist/oneshot-runner.js +5 -2
- package/dist/oneshot-runner.js.map +1 -1
- package/dist/server-setup/known-hosts-store.d.ts +16 -0
- package/dist/server-setup/known-hosts-store.d.ts.map +1 -0
- package/dist/server-setup/known-hosts-store.js +89 -0
- package/dist/server-setup/known-hosts-store.js.map +1 -0
- package/dist/server-setup/server-setup-runner.d.ts +27 -0
- package/dist/server-setup/server-setup-runner.d.ts.map +1 -0
- package/dist/server-setup/server-setup-runner.js +576 -0
- package/dist/server-setup/server-setup-runner.js.map +1 -0
- package/dist/types/command.d.ts +5 -1
- package/dist/types/command.d.ts.map +1 -1
- package/dist/types/command.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/server-setup.d.ts +30 -0
- package/dist/types/server-setup.d.ts.map +1 -0
- package/dist/types/server-setup.js +12 -0
- package/dist/types/server-setup.js.map +1 -0
- package/dist/types/tool-output.d.ts +62 -0
- package/dist/types/tool-output.d.ts.map +1 -1
- package/docker/Dockerfile +30 -1
- package/package.json +2 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TASK_ID_ENV = exports.CONVERSATION_ID_ENV = exports.BROWSER_LOCAL_PORT_ENV = void 0;
|
|
3
|
+
exports.KNOWLEDGE_AGENT_ID_ENV = exports.KNOWLEDGE_COMMAND_ID_ENV = exports.TASK_ID_ENV = exports.CONVERSATION_ID_ENV = exports.BROWSER_LOCAL_PORT_ENV = void 0;
|
|
4
4
|
exports.getMcpConfigPath = getMcpConfigPath;
|
|
5
5
|
exports.buildMcpConfig = buildMcpConfig;
|
|
6
6
|
exports.writeMcpConfig = writeMcpConfig;
|
|
@@ -72,6 +72,29 @@ exports.CONVERSATION_ID_ENV = 'AI_SUPPORT_CONVERSATION_ID';
|
|
|
72
72
|
* 必要がある。
|
|
73
73
|
*/
|
|
74
74
|
exports.TASK_ID_ENV = 'AI_SUPPORT_TASK_ID';
|
|
75
|
+
/**
|
|
76
|
+
* このナレッジ登録依頼の元になったチャットコマンドのID の環境変数名。
|
|
77
|
+
*
|
|
78
|
+
* `update_system_knowledge` MCPツールが子プロセス側で
|
|
79
|
+
* `process.env[KNOWLEDGE_COMMAND_ID_ENV]` として読み取り、ナレッジ登録/改訂API
|
|
80
|
+
* (`POST /api/:tenantCode/agent/knowledge`)へ `commandId` として渡す。api側はこの
|
|
81
|
+
* `commandId` を使って `AgentCommandQueueService.getCommand(commandId, agentId, tenantCode)`
|
|
82
|
+
* によりコマンド生成時に刻印された本物の `knowledgeCanPublish`/`knowledgeRequesterUserId`
|
|
83
|
+
* を引き当てる(クライアント自己申告の値は信用しない)。LLM/モデルがツール呼び出し引数として
|
|
84
|
+
* 自由に指定できる値ではないため、ツールのスキーマには含めず、`CONVERSATION_ID_ENV`/
|
|
85
|
+
* `TASK_ID_ENV` と同じ理由(`StdioClientTransport` が呼び出し元プロセスの任意の環境変数を
|
|
86
|
+
* MCPサーバー子プロセスへ自動継承しない)により、per-command ファイルの `env` に明示的に
|
|
87
|
+
* 埋め込む必要がある。値は `writeCommandMcpConfig` の `commandId` 引数(呼び出し元が既に
|
|
88
|
+
* 持っている値)をそのまま使うため、常に埋め込まれる。
|
|
89
|
+
*/
|
|
90
|
+
exports.KNOWLEDGE_COMMAND_ID_ENV = 'AI_SUPPORT_AGENT_KNOWLEDGE_COMMAND_ID';
|
|
91
|
+
/**
|
|
92
|
+
* エージェント自身の agentId の環境変数名。`KNOWLEDGE_COMMAND_ID_ENV` と組み合わせて
|
|
93
|
+
* api側が `AgentCommandQueueService.getCommand(commandId, agentId, tenantCode)` で
|
|
94
|
+
* コマンドレコードを引き当てるために使う。`KNOWLEDGE_COMMAND_ID_ENV` と同じ理由・同じ経路で
|
|
95
|
+
* per-command ファイルの `env` に埋め込む必要がある。
|
|
96
|
+
*/
|
|
97
|
+
exports.KNOWLEDGE_AGENT_ID_ENV = 'AI_SUPPORT_AGENT_KNOWLEDGE_AGENT_ID';
|
|
75
98
|
/**
|
|
76
99
|
* MCP 設定ファイルを書き出す
|
|
77
100
|
*
|
|
@@ -159,7 +182,7 @@ function sanitizeCommandIdForFilename(commandId) {
|
|
|
159
182
|
* (claude/codex CLI)の任意の環境変数は自動継承されないため(`CONVERSATION_ID_ENV`
|
|
160
183
|
* の定義コメント参照)。
|
|
161
184
|
*/
|
|
162
|
-
function writeCommandMcpConfig(baseConfigPath, commandId, conversationId, taskId) {
|
|
185
|
+
function writeCommandMcpConfig(baseConfigPath, commandId, conversationId, taskId, agentId) {
|
|
163
186
|
const raw = (0, fs_1.readFileSync)(baseConfigPath, 'utf-8');
|
|
164
187
|
const config = JSON.parse(raw);
|
|
165
188
|
const server = config.mcpServers?.['ai-support-agent'];
|
|
@@ -168,6 +191,8 @@ function writeCommandMcpConfig(baseConfigPath, commandId, conversationId, taskId
|
|
|
168
191
|
...(server.env ?? {}),
|
|
169
192
|
[exports.CONVERSATION_ID_ENV]: conversationId,
|
|
170
193
|
...(taskId && { [exports.TASK_ID_ENV]: taskId }),
|
|
194
|
+
[exports.KNOWLEDGE_COMMAND_ID_ENV]: commandId,
|
|
195
|
+
...(agentId && { [exports.KNOWLEDGE_AGENT_ID_ENV]: agentId }),
|
|
171
196
|
};
|
|
172
197
|
}
|
|
173
198
|
const dir = (0, path_1.dirname)(baseConfigPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/mcp/config-writer.ts"],"names":[],"mappings":";;;AAeA,4CAEC;AAOD,wCAoBC;
|
|
1
|
+
{"version":3,"file":"config-writer.js","sourceRoot":"","sources":["../../src/mcp/config-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAIzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAIzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAc/E;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CA0BnI;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAsBpD"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -20,6 +20,7 @@ const send_slack_file_1 = require("./tools/send-slack-file");
|
|
|
20
20
|
const send_slack_message_1 = require("./tools/send-slack-message");
|
|
21
21
|
const trigger_alarm_1 = require("./tools/trigger-alarm");
|
|
22
22
|
const trigger_e2e_test_1 = require("./tools/trigger-e2e-test");
|
|
23
|
+
const update_system_knowledge_1 = require("./tools/update-system-knowledge");
|
|
23
24
|
/**
|
|
24
25
|
* MCP サーバーを作成する
|
|
25
26
|
*/
|
|
@@ -39,6 +40,7 @@ function createMcpServer(apiClient, projectCode, browserSessionManager) {
|
|
|
39
40
|
(0, trigger_alarm_1.registerTriggerAlarmTool)(server, apiClient);
|
|
40
41
|
(0, read_slack_thread_1.registerReadSlackThreadTool)(server, apiClient);
|
|
41
42
|
(0, trigger_e2e_test_1.registerTriggerE2eTestTool)(server, apiClient);
|
|
43
|
+
(0, update_system_knowledge_1.registerUpdateSystemKnowledgeTool)(server, apiClient);
|
|
42
44
|
// browser_navigate/browser_click等とreport_test_stepが同じBrowserSessionManagerを
|
|
43
45
|
// 参照するように、ここで一つだけ生成して両方に渡す(渡さないと、report_test_step が
|
|
44
46
|
// アクティブなセッションを解決できず、常に白紙のスクリーンショットを撮ってしまう)。
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { ApiClient } from '../../api-client';
|
|
3
|
+
/**
|
|
4
|
+
* update_system_knowledge ツールを MCP サーバーに登録する
|
|
5
|
+
*
|
|
6
|
+
* システムのナレッジベース(api側DB)へ実際に登録・改訂する唯一の手段。ローカルファイルへの
|
|
7
|
+
* 書き込みはナレッジ登録にはならないため、モデルが「ナレッジに反映して」という依頼をローカル
|
|
8
|
+
* ファイル書き込みだけで済ませてしまわないよう、description で明示的に誘導する。
|
|
9
|
+
*
|
|
10
|
+
* 依頼者の実際の権限(`knowledgeCanPublish`/`knowledgeRequesterUserId`)は、このツールの
|
|
11
|
+
* 呼び出し元では判定しない。旧設計ではリクエストボディの `canPublishHint` フィールドを
|
|
12
|
+
* クライアント自己申告のまま信用しており、有効なagentサービストークンさえあればこれを
|
|
13
|
+
* `true` に指定して承認ワークフローを完全にバイパスできてしまうCRITICALな脆弱性があった。
|
|
14
|
+
* 現在は `commandId`(このナレッジ登録依頼の元になったチャットコマンドのID)と
|
|
15
|
+
* `agentId`(エージェント自身のID)だけを渡し、api側で
|
|
16
|
+
* `AgentCommandQueueService.getCommand(commandId, agentId, tenantCode)` により、コマンド
|
|
17
|
+
* 生成時に刻印された本物の権限判定結果をサーバー側で引き当てる。省略時・レコード未検出時は
|
|
18
|
+
* 安全側のdraftになる。`commandId`/`agentId` は
|
|
19
|
+
* `AI_SUPPORT_AGENT_KNOWLEDGE_COMMAND_ID`/`AI_SUPPORT_AGENT_KNOWLEDGE_AGENT_ID` 環境変数
|
|
20
|
+
* (config-writer.ts の per-command MCP 設定経由でこの MCP サーバー子プロセスへ明示的に
|
|
21
|
+
* 渡される)から読み取る。LLM/モデルが自分で決めてよい値ではないため、ツールのスキーマ
|
|
22
|
+
* (引数)には一切含めない。
|
|
23
|
+
*
|
|
24
|
+
* `callId` は呼び出しごとに生成する冪等性キー(`newIdempotencyKey()`。send_slack_message や
|
|
25
|
+
* trigger_alarm と同じパターン)で、リトライ全体で同じ値を使うことで新規作成時の重複登録を
|
|
26
|
+
* api側で防ぐ。
|
|
27
|
+
*/
|
|
28
|
+
export declare function registerUpdateSystemKnowledgeTool(server: McpServer, apiClient: ApiClient): void;
|
|
29
|
+
//# sourceMappingURL=update-system-knowledge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-system-knowledge.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/update-system-knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAI5C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAqC/F"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerUpdateSystemKnowledgeTool = registerUpdateSystemKnowledgeTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const config_writer_1 = require("../config-writer");
|
|
6
|
+
const mcp_response_1 = require("./mcp-response");
|
|
7
|
+
/**
|
|
8
|
+
* update_system_knowledge ツールを MCP サーバーに登録する
|
|
9
|
+
*
|
|
10
|
+
* システムのナレッジベース(api側DB)へ実際に登録・改訂する唯一の手段。ローカルファイルへの
|
|
11
|
+
* 書き込みはナレッジ登録にはならないため、モデルが「ナレッジに反映して」という依頼をローカル
|
|
12
|
+
* ファイル書き込みだけで済ませてしまわないよう、description で明示的に誘導する。
|
|
13
|
+
*
|
|
14
|
+
* 依頼者の実際の権限(`knowledgeCanPublish`/`knowledgeRequesterUserId`)は、このツールの
|
|
15
|
+
* 呼び出し元では判定しない。旧設計ではリクエストボディの `canPublishHint` フィールドを
|
|
16
|
+
* クライアント自己申告のまま信用しており、有効なagentサービストークンさえあればこれを
|
|
17
|
+
* `true` に指定して承認ワークフローを完全にバイパスできてしまうCRITICALな脆弱性があった。
|
|
18
|
+
* 現在は `commandId`(このナレッジ登録依頼の元になったチャットコマンドのID)と
|
|
19
|
+
* `agentId`(エージェント自身のID)だけを渡し、api側で
|
|
20
|
+
* `AgentCommandQueueService.getCommand(commandId, agentId, tenantCode)` により、コマンド
|
|
21
|
+
* 生成時に刻印された本物の権限判定結果をサーバー側で引き当てる。省略時・レコード未検出時は
|
|
22
|
+
* 安全側のdraftになる。`commandId`/`agentId` は
|
|
23
|
+
* `AI_SUPPORT_AGENT_KNOWLEDGE_COMMAND_ID`/`AI_SUPPORT_AGENT_KNOWLEDGE_AGENT_ID` 環境変数
|
|
24
|
+
* (config-writer.ts の per-command MCP 設定経由でこの MCP サーバー子プロセスへ明示的に
|
|
25
|
+
* 渡される)から読み取る。LLM/モデルが自分で決めてよい値ではないため、ツールのスキーマ
|
|
26
|
+
* (引数)には一切含めない。
|
|
27
|
+
*
|
|
28
|
+
* `callId` は呼び出しごとに生成する冪等性キー(`newIdempotencyKey()`。send_slack_message や
|
|
29
|
+
* trigger_alarm と同じパターン)で、リトライ全体で同じ値を使うことで新規作成時の重複登録を
|
|
30
|
+
* api側で防ぐ。
|
|
31
|
+
*/
|
|
32
|
+
function registerUpdateSystemKnowledgeTool(server, apiClient) {
|
|
33
|
+
server.tool('update_system_knowledge', 'Register or revise an entry in the system knowledge base (persisted in the backend database). '
|
|
34
|
+
+ 'You MUST use this tool whenever a user asks you to add or update the knowledge base — '
|
|
35
|
+
+ 'writing to a local file is NOT knowledge base registration and does not satisfy that request. '
|
|
36
|
+
+ 'Pass `id` to revise an existing entry, or omit it to create a new one. '
|
|
37
|
+
+ 'Whether the entry is published immediately or saved as a draft pending approval is determined '
|
|
38
|
+
+ 'server-side based on the requester\'s actual permissions — this tool does not accept a publish flag.', {
|
|
39
|
+
id: zod_1.z.string().optional().describe('Existing knowledge entry ID to revise. Omit to create a new entry.'),
|
|
40
|
+
title: zod_1.z.string().describe('Title (1-200 characters)'),
|
|
41
|
+
content: zod_1.z.string().describe('Content in Markdown'),
|
|
42
|
+
category: zod_1.z.string().describe('Category (max 50 characters)'),
|
|
43
|
+
tags: zod_1.z.array(zod_1.z.string()).optional().describe('Tags'),
|
|
44
|
+
sourceIssue: zod_1.z.string().optional().describe('Related issue reference (max 50 characters)'),
|
|
45
|
+
}, async (args) => (0, mcp_response_1.withMcpErrorHandling)(async () => {
|
|
46
|
+
const commandId = process.env[config_writer_1.KNOWLEDGE_COMMAND_ID_ENV] || undefined;
|
|
47
|
+
const agentId = process.env[config_writer_1.KNOWLEDGE_AGENT_ID_ENV] || undefined;
|
|
48
|
+
const callId = (0, mcp_response_1.newIdempotencyKey)();
|
|
49
|
+
const result = await apiClient.updateSystemKnowledge({
|
|
50
|
+
id: args.id,
|
|
51
|
+
title: args.title,
|
|
52
|
+
content: args.content,
|
|
53
|
+
category: args.category,
|
|
54
|
+
tags: args.tags,
|
|
55
|
+
sourceIssue: args.sourceIssue,
|
|
56
|
+
commandId,
|
|
57
|
+
agentId,
|
|
58
|
+
callId,
|
|
59
|
+
});
|
|
60
|
+
return (0, mcp_response_1.mcpJsonResponse)(result);
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=update-system-knowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-system-knowledge.js","sourceRoot":"","sources":["../../../src/mcp/tools/update-system-knowledge.ts"],"names":[],"mappings":";;AAgCA,8EAqCC;AApED,6BAAuB;AAGvB,oDAAmF;AACnF,iDAAyF;AAEzF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,iCAAiC,CAAC,MAAiB,EAAE,SAAoB;IACvF,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,gGAAgG;UAC5F,wFAAwF;UACxF,gGAAgG;UAChG,yEAAyE;UACzE,gGAAgG;UAChG,sGAAsG,EAC1G;QACE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oEAAoE,CAAC;QACxG,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACtD,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC7D,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrD,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KAC3F,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAA,mCAAoB,EAAC,KAAK,IAAI,EAAE;QAC9C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,wCAAwB,CAAC,IAAI,SAAS,CAAA;QACpE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,sCAAsB,CAAC,IAAI,SAAS,CAAA;QAChE,MAAM,MAAM,GAAG,IAAA,gCAAiB,GAAE,CAAA;QAElC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,qBAAqB,CAAC;YACnD,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS;YACT,OAAO;YACP,MAAM;SACP,CAAC,CAAA;QAEF,OAAO,IAAA,8BAAe,EAAC,MAAM,CAAC,CAAA;IAChC,CAAC,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneshot-runner.d.ts","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"oneshot-runner.d.ts","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwCH,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,CAa/E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFtF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,GAAE,MAAM,OAAO,CAAC,MAAM,CAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CASjG"}
|
package/dist/oneshot-runner.js
CHANGED
|
@@ -21,8 +21,10 @@ const logger_1 = require("./logger");
|
|
|
21
21
|
const types_1 = require("./types");
|
|
22
22
|
const utils_1 = require("./utils");
|
|
23
23
|
/**
|
|
24
|
-
* Command types the ECS oneshot runner is allowed to execute (Phase 1
|
|
25
|
-
*
|
|
24
|
+
* Command types the ECS oneshot runner is allowed to execute (Phase 1:
|
|
25
|
+
* `execute_command`; Phase 3: `server_setup_exec` for the ECS dispatch mode
|
|
26
|
+
* of the server setup feature — see admin-docs `docs/features/server-setup.md`).
|
|
27
|
+
* The API only dispatches these types to ECS execution agents, but the
|
|
26
28
|
* runner enforces the same allowlist defensively: a mis-dispatched `chat` /
|
|
27
29
|
* `e2e_test` / `file_*` would otherwise run with a near-empty execution
|
|
28
30
|
* context (no projectDir/mcpConfigPath/serverConfig/browser callbacks) and
|
|
@@ -30,6 +32,7 @@ const utils_1 = require("./utils");
|
|
|
30
32
|
*/
|
|
31
33
|
const ONESHOT_SUPPORTED_COMMAND_TYPES = new Set([
|
|
32
34
|
'execute_command',
|
|
35
|
+
'server_setup_exec',
|
|
33
36
|
]);
|
|
34
37
|
/**
|
|
35
38
|
* Working directory for `execute_command` in the container. The ECS image
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oneshot-runner.js","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;
|
|
1
|
+
{"version":3,"file":"oneshot-runner.js","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Directory (under the persistent config dir) holding one known_hosts file per (tenantCode, sshHostId) pair. */
|
|
2
|
+
export declare function knownHostsDir(): string;
|
|
3
|
+
/**
|
|
4
|
+
* Resolve (and ensure exists) the persistent known_hosts file path for a
|
|
5
|
+
* given tenant/host pair.
|
|
6
|
+
*
|
|
7
|
+
* Creates an empty file (mode 0600 — not secret, but kept restrictive like
|
|
8
|
+
* the rest of this directory's contents) the first time a given tenant/host
|
|
9
|
+
* pair is seen; that first run is TOFU's legitimate "trust on first use".
|
|
10
|
+
* Every subsequent run against the same host reuses (and lets `ssh` append
|
|
11
|
+
* to) the same file, so a later host-key change is detected — via ssh's own
|
|
12
|
+
* `StrictHostKeyChecking=accept-new` behavior — rather than silently
|
|
13
|
+
* accepted.
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveKnownHostsPath(tenantCode: string, sshHostId: string): string;
|
|
16
|
+
//# sourceMappingURL=known-hosts-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-hosts-store.d.ts","sourceRoot":"","sources":["../../src/server-setup/known-hosts-store.ts"],"names":[],"mappings":"AA2BA,iHAAiH;AACjH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAUnF"}
|
|
@@ -0,0 +1,89 @@
|
|
|
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.knownHostsDir = knownHostsDir;
|
|
37
|
+
exports.resolveKnownHostsPath = resolveKnownHostsPath;
|
|
38
|
+
/**
|
|
39
|
+
* Persistent, per-SSH-host known_hosts file for `server_setup_exec`'s TOFU
|
|
40
|
+
* (Trust On First Use) host key checking.
|
|
41
|
+
*
|
|
42
|
+
* Unlike the SSH private key (fetched Just-In-Time and always removed with
|
|
43
|
+
* the rest of the per-run temp directory — see `server-setup-runner.ts`), a
|
|
44
|
+
* known_hosts entry is NOT secret: it only records the target host's public
|
|
45
|
+
* key fingerprint. Volatilizing it alongside the private key on every run
|
|
46
|
+
* defeats TOFU's entire purpose: `StrictHostKeyChecking=accept-new` only
|
|
47
|
+
* rejects a *changed* host key on a *later* connection if there is a
|
|
48
|
+
* *previously recorded* one to compare against. Starting from an empty file
|
|
49
|
+
* on every run means every run looks like a "first use", so a later
|
|
50
|
+
* DNS/route hijack presenting a different host key is silently accepted
|
|
51
|
+
* instead of rejected.
|
|
52
|
+
*
|
|
53
|
+
* This file is stored under the agent CLI's persistent config directory
|
|
54
|
+
* (`getConfigDir()`, e.g. `~/.ai-support-agent`), namespaced by tenantCode
|
|
55
|
+
* and sshHostId so distinct tenants/hosts never share (or clobber) each
|
|
56
|
+
* other's recorded host keys, and reused across every run against the same
|
|
57
|
+
* host.
|
|
58
|
+
*/
|
|
59
|
+
const fs = __importStar(require("fs"));
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
const config_manager_1 = require("../config-manager");
|
|
62
|
+
const utils_1 = require("../utils");
|
|
63
|
+
/** Directory (under the persistent config dir) holding one known_hosts file per (tenantCode, sshHostId) pair. */
|
|
64
|
+
function knownHostsDir() {
|
|
65
|
+
return path.join((0, config_manager_1.getConfigDir)(), 'server-setup', 'known-hosts');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Resolve (and ensure exists) the persistent known_hosts file path for a
|
|
69
|
+
* given tenant/host pair.
|
|
70
|
+
*
|
|
71
|
+
* Creates an empty file (mode 0600 — not secret, but kept restrictive like
|
|
72
|
+
* the rest of this directory's contents) the first time a given tenant/host
|
|
73
|
+
* pair is seen; that first run is TOFU's legitimate "trust on first use".
|
|
74
|
+
* Every subsequent run against the same host reuses (and lets `ssh` append
|
|
75
|
+
* to) the same file, so a later host-key change is detected — via ssh's own
|
|
76
|
+
* `StrictHostKeyChecking=accept-new` behavior — rather than silently
|
|
77
|
+
* accepted.
|
|
78
|
+
*/
|
|
79
|
+
function resolveKnownHostsPath(tenantCode, sshHostId) {
|
|
80
|
+
const dir = knownHostsDir();
|
|
81
|
+
(0, utils_1.ensureDir)(dir, 0o700);
|
|
82
|
+
const fileName = `${(0, utils_1.sanitizeNameSegment)(tenantCode)}__${(0, utils_1.sanitizeNameSegment)(sshHostId)}`;
|
|
83
|
+
const filePath = path.join(dir, fileName);
|
|
84
|
+
if (!fs.existsSync(filePath)) {
|
|
85
|
+
fs.writeFileSync(filePath, '', { mode: 0o600 });
|
|
86
|
+
}
|
|
87
|
+
return filePath;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=known-hosts-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-hosts-store.js","sourceRoot":"","sources":["../../src/server-setup/known-hosts-store.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,sCAEC;AAcD,sDAUC;AAtDD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,uCAAwB;AACxB,2CAA4B;AAE5B,sDAAgD;AAChD,oCAAyD;AAEzD,iHAAiH;AACjH,SAAgB,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAA,6BAAY,GAAE,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;AACjE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,qBAAqB,CAAC,UAAkB,EAAE,SAAiB;IACzE,MAAM,GAAG,GAAG,aAAa,EAAE,CAAA;IAC3B,IAAA,iBAAS,EAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAErB,MAAM,QAAQ,GAAG,GAAG,IAAA,2BAAmB,EAAC,UAAU,CAAC,KAAK,IAAA,2BAAmB,EAAC,SAAS,CAAC,EAAE,CAAA;IACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IACzC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACjD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runner for the `server_setup_exec` command.
|
|
3
|
+
*
|
|
4
|
+
* Fetches the target host's SSH private key Just-In-Time from the API,
|
|
5
|
+
* writes it to a process-local temp directory, runs the bundled Ansible
|
|
6
|
+
* playbook (`ansible/playbook.yml`) against it, and — critically — always
|
|
7
|
+
* removes the temp directory (private key included) afterwards, whether the
|
|
8
|
+
* run succeeded or failed. See admin-docs `docs/features/server-setup.md`
|
|
9
|
+
* ("秘密鍵の受け渡し設計") for the full design and its security rationale.
|
|
10
|
+
*
|
|
11
|
+
* SECURITY: the SSH private key must never be logged, and the temp
|
|
12
|
+
* directory holding it must never survive past this function's execution.
|
|
13
|
+
*/
|
|
14
|
+
import { type CommandResult, type ServerSetupExecPayload } from '../types';
|
|
15
|
+
import type { ApiClient } from '../api-client';
|
|
16
|
+
export interface RunServerSetupContext {
|
|
17
|
+
commandId: string;
|
|
18
|
+
client: ApiClient;
|
|
19
|
+
agentId?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Execute a `server_setup_exec` command: fetch the SSH credential, run the
|
|
23
|
+
* bundled playbook, and report per-step results. The temp directory holding
|
|
24
|
+
* the private key is always removed, on every exit path.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runServerSetup(payload: ServerSetupExecPayload, ctx: RunServerSetupContext): Promise<CommandResult>;
|
|
27
|
+
//# sourceMappingURL=server-setup-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-setup-runner.d.ts","sourceRoot":"","sources":["../../src/server-setup/server-setup-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAQH,OAAO,EAAE,KAAK,aAAa,EAAe,KAAK,sBAAsB,EAAwF,MAAM,UAAU,CAAA;AAK7K,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAoH9C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA8VD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,sBAAsB,EAC/B,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,aAAa,CAAC,CAkKxB"}
|