@nahisaho/katashiro-orchestrator 0.4.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/README.md +152 -0
- package/dist/action-observation-types.d.ts +239 -0
- package/dist/action-observation-types.d.ts.map +1 -0
- package/dist/action-observation-types.js +22 -0
- package/dist/action-observation-types.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/multi-agent-orchestrator.d.ts +147 -0
- package/dist/multi-agent-orchestrator.d.ts.map +1 -0
- package/dist/multi-agent-orchestrator.js +409 -0
- package/dist/multi-agent-orchestrator.js.map +1 -0
- package/dist/task-decomposer.d.ts +113 -0
- package/dist/task-decomposer.d.ts.map +1 -0
- package/dist/task-decomposer.js +530 -0
- package/dist/task-decomposer.js.map +1 -0
- package/dist/tool-registry.d.ts +153 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +416 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/types.d.ts +272 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry - Action-Observation Pattern Implementation
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview REQ-010: Action-Observation型安全ツールシステムの実装
|
|
5
|
+
* @module @nahisaho/katashiro-orchestrator
|
|
6
|
+
* @since 0.4.0
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { type Result } from '@nahisaho/katashiro-core';
|
|
10
|
+
import type { Action, Observation, ToolDefinition, ToolRegistryConfig, SecurityAssessment } from './action-observation-types';
|
|
11
|
+
/**
|
|
12
|
+
* 承認リクエストイベントペイロード
|
|
13
|
+
*/
|
|
14
|
+
export interface ApprovalRequestEvent {
|
|
15
|
+
/** アクションID */
|
|
16
|
+
readonly actionId: string;
|
|
17
|
+
/** ツール名 */
|
|
18
|
+
readonly toolName: string;
|
|
19
|
+
/** リスク評価 */
|
|
20
|
+
readonly assessment: SecurityAssessment;
|
|
21
|
+
/** アクション詳細 */
|
|
22
|
+
readonly action: Action;
|
|
23
|
+
/** タイムアウト(ミリ秒) */
|
|
24
|
+
readonly timeoutMs: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 承認解決イベントペイロード
|
|
28
|
+
*/
|
|
29
|
+
export interface ApprovalResolvedEvent {
|
|
30
|
+
/** アクションID */
|
|
31
|
+
readonly actionId: string;
|
|
32
|
+
/** 承認されたか */
|
|
33
|
+
readonly approved: boolean;
|
|
34
|
+
/** 解決元('user' | 'timeout' | 'api') */
|
|
35
|
+
readonly resolvedBy: 'user' | 'timeout' | 'api';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* ToolRegistryイベントマップ
|
|
39
|
+
*/
|
|
40
|
+
export interface ToolRegistryEvents {
|
|
41
|
+
'approval:required': (event: ApprovalRequestEvent) => void;
|
|
42
|
+
'approval:resolved': (event: ApprovalResolvedEvent) => void;
|
|
43
|
+
'action:created': (action: Action) => void;
|
|
44
|
+
'action:executed': (observation: Observation) => void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* ツールレジストリエラー
|
|
48
|
+
*/
|
|
49
|
+
export declare class ToolRegistryError extends Error {
|
|
50
|
+
readonly code: string;
|
|
51
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
52
|
+
constructor(message: string, code: string, details?: Record<string, unknown> | undefined);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* アクション作成オプション
|
|
56
|
+
*/
|
|
57
|
+
export interface CreateActionOptions<TParams extends Record<string, unknown>> {
|
|
58
|
+
/** ツール名 */
|
|
59
|
+
toolName: string;
|
|
60
|
+
/** パラメータ */
|
|
61
|
+
params: TParams;
|
|
62
|
+
/** リクエスト元エージェントID */
|
|
63
|
+
requestedBy: string;
|
|
64
|
+
/** タイムアウト上書き(秒) */
|
|
65
|
+
timeout?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* ツールレジストリ
|
|
69
|
+
*
|
|
70
|
+
* EARS Requirements:
|
|
71
|
+
* - Ubiquitous: The system shall maintain a registry of available tools
|
|
72
|
+
* - Event-Driven: When a tool is invoked, the system shall validate input against Action schema
|
|
73
|
+
* - Event-Driven: When a tool execution completes, the system shall return a typed Observation
|
|
74
|
+
* - State-Driven: While action risk level is 'critical', the system shall require explicit approval
|
|
75
|
+
*/
|
|
76
|
+
export declare class ToolRegistry extends EventEmitter {
|
|
77
|
+
private readonly config;
|
|
78
|
+
private readonly tools;
|
|
79
|
+
private readonly pendingApprovals;
|
|
80
|
+
constructor(config?: Partial<ToolRegistryConfig>);
|
|
81
|
+
/**
|
|
82
|
+
* 型安全なイベントリスナー登録
|
|
83
|
+
*/
|
|
84
|
+
on<E extends keyof ToolRegistryEvents>(event: E, listener: ToolRegistryEvents[E]): this;
|
|
85
|
+
/**
|
|
86
|
+
* 型安全なイベント発火
|
|
87
|
+
*/
|
|
88
|
+
emit<E extends keyof ToolRegistryEvents>(event: E, ...args: Parameters<ToolRegistryEvents[E]>): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* ツールを登録
|
|
91
|
+
*/
|
|
92
|
+
register<TParams, TResult>(tool: ToolDefinition<TParams, TResult>): Result<void, ToolRegistryError>;
|
|
93
|
+
/**
|
|
94
|
+
* ツールを取得
|
|
95
|
+
*/
|
|
96
|
+
get(name: string): ToolDefinition | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* 登録済みツール一覧を取得
|
|
99
|
+
*/
|
|
100
|
+
list(): ToolDefinition[];
|
|
101
|
+
/**
|
|
102
|
+
* ツールが登録されているか確認
|
|
103
|
+
*/
|
|
104
|
+
has(name: string): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Actionを作成
|
|
107
|
+
*/
|
|
108
|
+
createAction<TParams extends Record<string, unknown>>(options: CreateActionOptions<TParams>): Result<Action<TParams>, ToolRegistryError>;
|
|
109
|
+
/**
|
|
110
|
+
* Actionを実行してObservationを返す
|
|
111
|
+
*/
|
|
112
|
+
execute<TParams extends Record<string, unknown>, TResult>(action: Action<TParams>, signal?: AbortSignal): Promise<Result<Observation<TResult>, ToolRegistryError>>;
|
|
113
|
+
/**
|
|
114
|
+
* リスク評価
|
|
115
|
+
*/
|
|
116
|
+
assessRisk(action: Action): SecurityAssessment;
|
|
117
|
+
/**
|
|
118
|
+
* 承認をリクエスト
|
|
119
|
+
*/
|
|
120
|
+
private requestApproval;
|
|
121
|
+
/**
|
|
122
|
+
* 承認を解決(外部から呼び出し)
|
|
123
|
+
*/
|
|
124
|
+
resolveApproval(actionId: string, approved: boolean, resolvedBy?: 'user' | 'api'): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* 承認待ちアクションを取得
|
|
127
|
+
*/
|
|
128
|
+
getPendingApprovals(): ReadonlyArray<{
|
|
129
|
+
actionId: string;
|
|
130
|
+
action: Action;
|
|
131
|
+
}>;
|
|
132
|
+
/**
|
|
133
|
+
* 全承認待ちをクリア
|
|
134
|
+
*/
|
|
135
|
+
clearPendingApprovals(): void;
|
|
136
|
+
/**
|
|
137
|
+
* パラメータをバリデーション(簡易版)
|
|
138
|
+
*/
|
|
139
|
+
private validateParams;
|
|
140
|
+
/**
|
|
141
|
+
* Observationを作成
|
|
142
|
+
*/
|
|
143
|
+
private createObservation;
|
|
144
|
+
/**
|
|
145
|
+
* ロガーを作成
|
|
146
|
+
*/
|
|
147
|
+
private createLogger;
|
|
148
|
+
/**
|
|
149
|
+
* 重大度をリスクレベルに変換
|
|
150
|
+
*/
|
|
151
|
+
private severityToRiskLevel;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=tool-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tool Registry - Action-Observation Pattern Implementation
|
|
4
|
+
*
|
|
5
|
+
* @fileoverview REQ-010: Action-Observation型安全ツールシステムの実装
|
|
6
|
+
* @module @nahisaho/katashiro-orchestrator
|
|
7
|
+
* @since 0.4.0
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ToolRegistry = exports.ToolRegistryError = void 0;
|
|
11
|
+
const events_1 = require("events");
|
|
12
|
+
const katashiro_core_1 = require("@nahisaho/katashiro-core");
|
|
13
|
+
const action_observation_types_1 = require("./action-observation-types");
|
|
14
|
+
/**
|
|
15
|
+
* ツールレジストリエラー
|
|
16
|
+
*/
|
|
17
|
+
class ToolRegistryError extends Error {
|
|
18
|
+
code;
|
|
19
|
+
details;
|
|
20
|
+
constructor(message, code, details) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.code = code;
|
|
23
|
+
this.details = details;
|
|
24
|
+
this.name = 'ToolRegistryError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ToolRegistryError = ToolRegistryError;
|
|
28
|
+
/**
|
|
29
|
+
* ツールレジストリ
|
|
30
|
+
*
|
|
31
|
+
* EARS Requirements:
|
|
32
|
+
* - Ubiquitous: The system shall maintain a registry of available tools
|
|
33
|
+
* - Event-Driven: When a tool is invoked, the system shall validate input against Action schema
|
|
34
|
+
* - Event-Driven: When a tool execution completes, the system shall return a typed Observation
|
|
35
|
+
* - State-Driven: While action risk level is 'critical', the system shall require explicit approval
|
|
36
|
+
*/
|
|
37
|
+
class ToolRegistry extends events_1.EventEmitter {
|
|
38
|
+
config;
|
|
39
|
+
tools = new Map();
|
|
40
|
+
pendingApprovals = new Map();
|
|
41
|
+
constructor(config = {}) {
|
|
42
|
+
super();
|
|
43
|
+
this.config = { ...action_observation_types_1.DEFAULT_TOOL_REGISTRY_CONFIG, ...config };
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 型安全なイベントリスナー登録
|
|
47
|
+
*/
|
|
48
|
+
on(event, listener) {
|
|
49
|
+
return super.on(event, listener);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 型安全なイベント発火
|
|
53
|
+
*/
|
|
54
|
+
emit(event, ...args) {
|
|
55
|
+
return super.emit(event, ...args);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* ツールを登録
|
|
59
|
+
*/
|
|
60
|
+
register(tool) {
|
|
61
|
+
if (this.tools.has(tool.name)) {
|
|
62
|
+
return (0, katashiro_core_1.err)(new ToolRegistryError(`Tool '${tool.name}' is already registered`, 'TOOL_ALREADY_EXISTS'));
|
|
63
|
+
}
|
|
64
|
+
this.tools.set(tool.name, tool);
|
|
65
|
+
return (0, katashiro_core_1.ok)(undefined);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* ツールを取得
|
|
69
|
+
*/
|
|
70
|
+
get(name) {
|
|
71
|
+
return this.tools.get(name);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 登録済みツール一覧を取得
|
|
75
|
+
*/
|
|
76
|
+
list() {
|
|
77
|
+
return Array.from(this.tools.values());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* ツールが登録されているか確認
|
|
81
|
+
*/
|
|
82
|
+
has(name) {
|
|
83
|
+
return this.tools.has(name);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Actionを作成
|
|
87
|
+
*/
|
|
88
|
+
createAction(options) {
|
|
89
|
+
const tool = this.tools.get(options.toolName);
|
|
90
|
+
if (!tool && !this.config.allowUnregistered) {
|
|
91
|
+
return (0, katashiro_core_1.err)(new ToolRegistryError(`Tool '${options.toolName}' is not registered`, 'TOOL_NOT_FOUND'));
|
|
92
|
+
}
|
|
93
|
+
// スキーマバリデーション
|
|
94
|
+
if (tool && this.config.enforceSchemaValidation) {
|
|
95
|
+
const validationResult = this.validateParams(options.params, tool.paramsSchema);
|
|
96
|
+
if (!validationResult.valid) {
|
|
97
|
+
return (0, katashiro_core_1.err)(new ToolRegistryError(`Parameter validation failed: ${validationResult.errors.join(', ')}`, 'VALIDATION_FAILED', { errors: validationResult.errors }));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const action = {
|
|
101
|
+
id: (0, katashiro_core_1.generateId)(),
|
|
102
|
+
name: `${options.toolName}:${Date.now()}`,
|
|
103
|
+
toolName: options.toolName,
|
|
104
|
+
category: tool?.category ?? 'custom',
|
|
105
|
+
params: options.params,
|
|
106
|
+
paramsSchema: tool?.paramsSchema ?? {},
|
|
107
|
+
riskLevel: tool?.defaultRiskLevel ?? 'medium',
|
|
108
|
+
timeout: options.timeout ?? tool?.defaultTimeout ?? this.config.defaultTimeout,
|
|
109
|
+
createdAt: new Date().toISOString(),
|
|
110
|
+
requestedBy: options.requestedBy,
|
|
111
|
+
};
|
|
112
|
+
return (0, katashiro_core_1.ok)(action);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Actionを実行してObservationを返す
|
|
116
|
+
*/
|
|
117
|
+
async execute(action, signal) {
|
|
118
|
+
const tool = this.tools.get(action.toolName);
|
|
119
|
+
if (!tool && !this.config.allowUnregistered) {
|
|
120
|
+
return (0, katashiro_core_1.err)(new ToolRegistryError(`Tool '${action.toolName}' is not registered`, 'TOOL_NOT_FOUND'));
|
|
121
|
+
}
|
|
122
|
+
// リスク評価
|
|
123
|
+
if (this.config.enableRiskAssessment) {
|
|
124
|
+
const assessment = this.assessRisk(action);
|
|
125
|
+
if (assessment.requiresApproval) {
|
|
126
|
+
const approved = await this.requestApproval(action, assessment);
|
|
127
|
+
if (!approved) {
|
|
128
|
+
return (0, katashiro_core_1.ok)(this.createObservation(action, {
|
|
129
|
+
status: 'cancelled',
|
|
130
|
+
error: {
|
|
131
|
+
code: 'APPROVAL_REJECTED',
|
|
132
|
+
message: 'Action was rejected by user',
|
|
133
|
+
retryable: false,
|
|
134
|
+
},
|
|
135
|
+
duration: 0,
|
|
136
|
+
}));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// 実行
|
|
141
|
+
const startTime = Date.now();
|
|
142
|
+
const abortController = new AbortController();
|
|
143
|
+
const effectiveSignal = signal ?? abortController.signal;
|
|
144
|
+
// タイムアウト設定
|
|
145
|
+
const timeoutId = setTimeout(() => {
|
|
146
|
+
abortController.abort();
|
|
147
|
+
}, action.timeout * 1000);
|
|
148
|
+
try {
|
|
149
|
+
if (!tool) {
|
|
150
|
+
return (0, katashiro_core_1.err)(new ToolRegistryError(`Tool '${action.toolName}' not found`, 'TOOL_NOT_FOUND'));
|
|
151
|
+
}
|
|
152
|
+
const context = {
|
|
153
|
+
agentId: action.requestedBy,
|
|
154
|
+
actionId: action.id,
|
|
155
|
+
timeout: action.timeout,
|
|
156
|
+
signal: effectiveSignal,
|
|
157
|
+
logger: this.createLogger(action.id),
|
|
158
|
+
isSandboxed: false, // TODO: サンドボックス対応
|
|
159
|
+
};
|
|
160
|
+
const result = await tool.execute(action.params, context);
|
|
161
|
+
const duration = Date.now() - startTime;
|
|
162
|
+
return (0, katashiro_core_1.ok)(this.createObservation(action, {
|
|
163
|
+
status: 'success',
|
|
164
|
+
result: result,
|
|
165
|
+
duration,
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
const duration = Date.now() - startTime;
|
|
170
|
+
if (effectiveSignal.aborted) {
|
|
171
|
+
return (0, katashiro_core_1.ok)(this.createObservation(action, {
|
|
172
|
+
status: 'timeout',
|
|
173
|
+
error: {
|
|
174
|
+
code: 'TIMEOUT',
|
|
175
|
+
message: `Action timed out after ${action.timeout}s`,
|
|
176
|
+
retryable: true,
|
|
177
|
+
},
|
|
178
|
+
duration,
|
|
179
|
+
}));
|
|
180
|
+
}
|
|
181
|
+
return (0, katashiro_core_1.ok)(this.createObservation(action, {
|
|
182
|
+
status: 'error',
|
|
183
|
+
error: {
|
|
184
|
+
code: 'EXECUTION_ERROR',
|
|
185
|
+
message: error instanceof Error ? error.message : String(error),
|
|
186
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
187
|
+
retryable: true,
|
|
188
|
+
},
|
|
189
|
+
duration,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
clearTimeout(timeoutId);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* リスク評価
|
|
198
|
+
*/
|
|
199
|
+
assessRisk(action) {
|
|
200
|
+
const riskFactors = [];
|
|
201
|
+
// カテゴリベースのリスク評価
|
|
202
|
+
const categoryRisks = {
|
|
203
|
+
read: 0.1,
|
|
204
|
+
write: 0.4,
|
|
205
|
+
execute: 0.7,
|
|
206
|
+
network: 0.5,
|
|
207
|
+
system: 0.8,
|
|
208
|
+
browser: 0.4,
|
|
209
|
+
custom: 0.5,
|
|
210
|
+
};
|
|
211
|
+
const categoryRisk = categoryRisks[action.category] ?? 0.5;
|
|
212
|
+
if (categoryRisk > 0.3) {
|
|
213
|
+
riskFactors.push({
|
|
214
|
+
name: 'category_risk',
|
|
215
|
+
description: `Category '${action.category}' has elevated risk`,
|
|
216
|
+
severity: categoryRisk,
|
|
217
|
+
mitigation: 'Review action parameters carefully',
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
// パラメータベースのリスク評価
|
|
221
|
+
const params = action.params;
|
|
222
|
+
if (params) {
|
|
223
|
+
// ファイルパスの検査
|
|
224
|
+
for (const [key, value] of Object.entries(params)) {
|
|
225
|
+
if (typeof value === 'string') {
|
|
226
|
+
if (value.includes('/etc/') || value.includes('/root/')) {
|
|
227
|
+
riskFactors.push({
|
|
228
|
+
name: 'sensitive_path',
|
|
229
|
+
description: `Parameter '${key}' contains sensitive system path`,
|
|
230
|
+
severity: 0.9,
|
|
231
|
+
mitigation: 'Avoid accessing system directories',
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (value.includes('rm -rf') || value.includes('sudo')) {
|
|
235
|
+
riskFactors.push({
|
|
236
|
+
name: 'dangerous_command',
|
|
237
|
+
description: `Parameter '${key}' contains dangerous command`,
|
|
238
|
+
severity: 1.0,
|
|
239
|
+
mitigation: 'Review and sanitize command input',
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// 最終リスクレベルの計算
|
|
246
|
+
const maxSeverity = Math.max(...riskFactors.map((f) => f.severity), categoryRisk);
|
|
247
|
+
const finalRiskLevel = this.severityToRiskLevel(maxSeverity);
|
|
248
|
+
// 承認レベルの比較
|
|
249
|
+
const riskLevelOrder = {
|
|
250
|
+
low: 0,
|
|
251
|
+
medium: 1,
|
|
252
|
+
high: 2,
|
|
253
|
+
critical: 3,
|
|
254
|
+
};
|
|
255
|
+
const requiresApproval = riskLevelOrder[finalRiskLevel] >=
|
|
256
|
+
riskLevelOrder[this.config.approvalRequiredLevel];
|
|
257
|
+
return {
|
|
258
|
+
id: (0, katashiro_core_1.generateId)(),
|
|
259
|
+
actionId: action.id,
|
|
260
|
+
riskLevel: finalRiskLevel,
|
|
261
|
+
riskFactors,
|
|
262
|
+
requiresApproval,
|
|
263
|
+
recommendations: riskFactors.map((f) => f.mitigation).filter(Boolean),
|
|
264
|
+
assessedAt: new Date().toISOString(),
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* 承認をリクエスト
|
|
269
|
+
*/
|
|
270
|
+
async requestApproval(action, assessment) {
|
|
271
|
+
const timeoutMs = this.config.approvalTimeout * 1000;
|
|
272
|
+
return new Promise((resolve) => {
|
|
273
|
+
// タイムアウト処理
|
|
274
|
+
const timeoutId = setTimeout(() => {
|
|
275
|
+
const pending = this.pendingApprovals.get(action.id);
|
|
276
|
+
if (pending) {
|
|
277
|
+
this.pendingApprovals.delete(action.id);
|
|
278
|
+
this.emit('approval:resolved', {
|
|
279
|
+
actionId: action.id,
|
|
280
|
+
approved: false,
|
|
281
|
+
resolvedBy: 'timeout',
|
|
282
|
+
});
|
|
283
|
+
resolve(false);
|
|
284
|
+
}
|
|
285
|
+
}, timeoutMs);
|
|
286
|
+
// 承認待ちMapに追加
|
|
287
|
+
this.pendingApprovals.set(action.id, { action, resolve, timeoutId });
|
|
288
|
+
// 承認リクエストイベントを発火
|
|
289
|
+
this.emit('approval:required', {
|
|
290
|
+
actionId: action.id,
|
|
291
|
+
toolName: action.toolName,
|
|
292
|
+
assessment,
|
|
293
|
+
action,
|
|
294
|
+
timeoutMs,
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* 承認を解決(外部から呼び出し)
|
|
300
|
+
*/
|
|
301
|
+
resolveApproval(actionId, approved, resolvedBy = 'user') {
|
|
302
|
+
const pending = this.pendingApprovals.get(actionId);
|
|
303
|
+
if (pending) {
|
|
304
|
+
// タイムアウトをクリア
|
|
305
|
+
clearTimeout(pending.timeoutId);
|
|
306
|
+
pending.resolve(approved);
|
|
307
|
+
this.pendingApprovals.delete(actionId);
|
|
308
|
+
this.emit('approval:resolved', {
|
|
309
|
+
actionId,
|
|
310
|
+
approved,
|
|
311
|
+
resolvedBy,
|
|
312
|
+
});
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* 承認待ちアクションを取得
|
|
319
|
+
*/
|
|
320
|
+
getPendingApprovals() {
|
|
321
|
+
return Array.from(this.pendingApprovals.entries()).map(([actionId, pending]) => ({
|
|
322
|
+
actionId,
|
|
323
|
+
action: pending.action,
|
|
324
|
+
}));
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* 全承認待ちをクリア
|
|
328
|
+
*/
|
|
329
|
+
clearPendingApprovals() {
|
|
330
|
+
for (const [actionId, pending] of this.pendingApprovals) {
|
|
331
|
+
clearTimeout(pending.timeoutId);
|
|
332
|
+
pending.resolve(false);
|
|
333
|
+
this.emit('approval:resolved', {
|
|
334
|
+
actionId,
|
|
335
|
+
approved: false,
|
|
336
|
+
resolvedBy: 'api',
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
this.pendingApprovals.clear();
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* パラメータをバリデーション(簡易版)
|
|
343
|
+
*/
|
|
344
|
+
validateParams(params, schema) {
|
|
345
|
+
const errors = [];
|
|
346
|
+
// スキーマがundefinedの場合はバリデーションをスキップ
|
|
347
|
+
if (!schema) {
|
|
348
|
+
return { valid: true, errors: [] };
|
|
349
|
+
}
|
|
350
|
+
// paramsがnull/undefinedの場合は空オブジェクトとして扱う
|
|
351
|
+
const safeParams = params ?? {};
|
|
352
|
+
// required チェック
|
|
353
|
+
const required = schema.required ?? [];
|
|
354
|
+
for (const key of required) {
|
|
355
|
+
if (!(key in safeParams)) {
|
|
356
|
+
errors.push(`Missing required parameter: ${key}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
// type チェック(簡易版)
|
|
360
|
+
const properties = schema.properties ?? {};
|
|
361
|
+
for (const [key, value] of Object.entries(safeParams)) {
|
|
362
|
+
const propSchema = properties[key];
|
|
363
|
+
if (propSchema?.type) {
|
|
364
|
+
const actualType = typeof value;
|
|
365
|
+
const expectedType = propSchema.type;
|
|
366
|
+
if (expectedType === 'integer' && !Number.isInteger(value)) {
|
|
367
|
+
errors.push(`Parameter '${key}' must be an integer`);
|
|
368
|
+
}
|
|
369
|
+
else if (expectedType !== 'integer' && actualType !== expectedType) {
|
|
370
|
+
errors.push(`Parameter '${key}' must be of type ${expectedType}`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
return { valid: errors.length === 0, errors };
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Observationを作成
|
|
378
|
+
*/
|
|
379
|
+
createObservation(action, data) {
|
|
380
|
+
return {
|
|
381
|
+
id: (0, katashiro_core_1.generateId)(),
|
|
382
|
+
actionId: action.id,
|
|
383
|
+
status: data.status,
|
|
384
|
+
result: data.result,
|
|
385
|
+
error: data.error,
|
|
386
|
+
duration: data.duration,
|
|
387
|
+
completedAt: new Date().toISOString(),
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* ロガーを作成
|
|
392
|
+
*/
|
|
393
|
+
createLogger(actionId) {
|
|
394
|
+
const prefix = `[Action:${actionId}]`;
|
|
395
|
+
return {
|
|
396
|
+
debug: (msg, ...args) => console.debug(prefix, msg, ...args),
|
|
397
|
+
info: (msg, ...args) => console.info(prefix, msg, ...args),
|
|
398
|
+
warn: (msg, ...args) => console.warn(prefix, msg, ...args),
|
|
399
|
+
error: (msg, ...args) => console.error(prefix, msg, ...args),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* 重大度をリスクレベルに変換
|
|
404
|
+
*/
|
|
405
|
+
severityToRiskLevel(severity) {
|
|
406
|
+
if (severity >= 0.8)
|
|
407
|
+
return 'critical';
|
|
408
|
+
if (severity >= 0.5)
|
|
409
|
+
return 'high';
|
|
410
|
+
if (severity >= 0.3)
|
|
411
|
+
return 'medium';
|
|
412
|
+
return 'low';
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
exports.ToolRegistry = ToolRegistry;
|
|
416
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../src/tool-registry.ts"],"names":[],"mappings":"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"}
|