@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.
@@ -0,0 +1,530 @@
1
+ "use strict";
2
+ /**
3
+ * Task Decomposer
4
+ *
5
+ * @fileoverview REQ-009: タスク分解・計画の実装
6
+ * @module @nahisaho/katashiro-orchestrator
7
+ * @since 0.4.0
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.TaskDecomposer = exports.DecompositionError = void 0;
11
+ const katashiro_core_1 = require("@nahisaho/katashiro-core");
12
+ const types_1 = require("./types");
13
+ /**
14
+ * タスク分解エラー
15
+ */
16
+ class DecompositionError extends Error {
17
+ code;
18
+ details;
19
+ constructor(message, code, details) {
20
+ super(message);
21
+ this.code = code;
22
+ this.details = details;
23
+ this.name = 'DecompositionError';
24
+ }
25
+ }
26
+ exports.DecompositionError = DecompositionError;
27
+ /**
28
+ * タスク分解器
29
+ *
30
+ * EARS Requirements:
31
+ * - Event-Driven: When a complex task is received, the system shall decompose it into subtasks
32
+ * - Ubiquitous: The system shall generate a DAG representing task dependencies
33
+ * - State-Driven: While decomposing, the system shall validate dependency constraints
34
+ */
35
+ class TaskDecomposer {
36
+ config;
37
+ strategies = [];
38
+ constructor(config = {}) {
39
+ this.config = { ...types_1.DEFAULT_DECOMPOSITION_CONFIG, ...config };
40
+ this.registerDefaultStrategies();
41
+ }
42
+ /**
43
+ * デフォルト戦略を登録
44
+ */
45
+ registerDefaultStrategies() {
46
+ // リサーチタスク戦略
47
+ this.registerStrategy({
48
+ name: 'research',
49
+ canApply: (task) => /調べ|リサーチ|調査|検索|探/.test(task) ||
50
+ /research|search|investigate/i.test(task),
51
+ decompose: async (task) => this.decomposeResearchTask(task),
52
+ });
53
+ // 分析タスク戦略
54
+ this.registerStrategy({
55
+ name: 'analysis',
56
+ canApply: (task) => /分析|解析|評価|比較/.test(task) ||
57
+ /analy|evaluat|compar/i.test(task),
58
+ decompose: async (task) => this.decomposeAnalysisTask(task),
59
+ });
60
+ // レポート作成戦略
61
+ this.registerStrategy({
62
+ name: 'report',
63
+ canApply: (task) => /レポート|報告|まとめ|文書/.test(task) ||
64
+ /report|document|summar/i.test(task),
65
+ decompose: async (task) => this.decomposeReportTask(task),
66
+ });
67
+ // 汎用戦略(フォールバック)
68
+ this.registerStrategy({
69
+ name: 'generic',
70
+ canApply: () => true,
71
+ decompose: async (task) => this.decomposeGenericTask(task),
72
+ });
73
+ }
74
+ /**
75
+ * 戦略を登録
76
+ */
77
+ registerStrategy(strategy) {
78
+ // 汎用戦略の前に挿入
79
+ const genericIndex = this.strategies.findIndex((s) => s.name === 'generic');
80
+ if (genericIndex >= 0) {
81
+ this.strategies.splice(genericIndex, 0, strategy);
82
+ }
83
+ else {
84
+ this.strategies.push(strategy);
85
+ }
86
+ }
87
+ /**
88
+ * タスクを分解して実行計画を生成
89
+ */
90
+ async decompose(task, context) {
91
+ try {
92
+ // 適用可能な戦略を選択
93
+ const strategy = this.strategies.find((s) => s.canApply(task, context));
94
+ if (!strategy) {
95
+ return (0, katashiro_core_1.err)(new DecompositionError('No applicable decomposition strategy found', 'NO_STRATEGY'));
96
+ }
97
+ // タスクを分解
98
+ const decomposed = await strategy.decompose(task, context);
99
+ // サブタスク数の検証
100
+ if (decomposed.length > this.config.maxSubTasks) {
101
+ return (0, katashiro_core_1.err)(new DecompositionError(`Too many subtasks: ${decomposed.length} > ${this.config.maxSubTasks}`, 'TOO_MANY_SUBTASKS', { count: decomposed.length, max: this.config.maxSubTasks }));
102
+ }
103
+ // SubTaskオブジェクトに変換
104
+ const now = new Date().toISOString();
105
+ const taskMap = new Map();
106
+ const subtasks = decomposed.map((dt) => {
107
+ const subtask = {
108
+ id: (0, katashiro_core_1.generateId)(),
109
+ name: dt.name,
110
+ description: dt.description,
111
+ input: { type: dt.inputType, content: null },
112
+ priority: dt.priority,
113
+ status: 'pending',
114
+ dependencies: [], // 後で解決
115
+ estimatedDuration: dt.estimatedDuration,
116
+ createdAt: now,
117
+ updatedAt: now,
118
+ };
119
+ taskMap.set(dt.name, subtask);
120
+ return subtask;
121
+ });
122
+ // 依存関係を解決
123
+ for (let i = 0; i < decomposed.length; i++) {
124
+ const dt = decomposed[i];
125
+ const deps = [];
126
+ for (const depName of dt.dependsOn) {
127
+ const depTask = taskMap.get(depName);
128
+ if (depTask) {
129
+ deps.push(depTask.id);
130
+ }
131
+ }
132
+ // TypeScriptの制約のため、新しいオブジェクトを作成
133
+ const existing = subtasks[i];
134
+ subtasks[i] = { ...existing, dependencies: deps };
135
+ }
136
+ // 依存関係の深さを検証
137
+ const depthResult = this.validateDependencyDepth(subtasks);
138
+ if (!depthResult.valid) {
139
+ return (0, katashiro_core_1.err)(new DecompositionError(`Dependency depth exceeds limit: ${depthResult.maxDepth} > ${this.config.maxDependencyDepth}`, 'DEPENDENCY_TOO_DEEP', { maxDepth: depthResult.maxDepth }));
140
+ }
141
+ // 循環依存をチェック
142
+ const cycleResult = this.detectCycles(subtasks);
143
+ if (cycleResult.hasCycle) {
144
+ return (0, katashiro_core_1.err)(new DecompositionError('Circular dependency detected', 'CIRCULAR_DEPENDENCY', { cycle: cycleResult.cycle }));
145
+ }
146
+ // 実行順序を計算(トポロジカルソート)
147
+ const executionOrder = this.topologicalSort(subtasks);
148
+ // 並列実行可能なグループを計算
149
+ const parallelGroups = this.config.allowParallel
150
+ ? this.computeParallelGroups(subtasks, executionOrder)
151
+ : executionOrder.map((id) => [id]);
152
+ // 総推定時間を計算
153
+ const estimatedTotalDuration = this.estimateTotalDuration(subtasks, parallelGroups);
154
+ const plan = {
155
+ id: (0, katashiro_core_1.generateId)(),
156
+ name: `Plan for: ${task.slice(0, 50)}${task.length > 50 ? '...' : ''}`,
157
+ originalTask: task,
158
+ tasks: subtasks,
159
+ executionOrder,
160
+ parallelGroups,
161
+ estimatedTotalDuration,
162
+ createdAt: now,
163
+ status: 'draft',
164
+ };
165
+ return (0, katashiro_core_1.ok)(plan);
166
+ }
167
+ catch (error) {
168
+ return (0, katashiro_core_1.err)(new DecompositionError(`Decomposition failed: ${error instanceof Error ? error.message : String(error)}`, 'DECOMPOSITION_FAILED', { originalError: error }));
169
+ }
170
+ }
171
+ /**
172
+ * リサーチタスクの分解
173
+ */
174
+ async decomposeResearchTask(task) {
175
+ // キーワード抽出(簡易版)
176
+ const keywords = this.extractKeywords(task);
177
+ return [
178
+ {
179
+ name: 'search',
180
+ description: `「${keywords.join('、')}」に関する情報を検索`,
181
+ inputType: 'text',
182
+ priority: 'high',
183
+ dependsOn: [],
184
+ estimatedDuration: 30,
185
+ },
186
+ {
187
+ name: 'scrape',
188
+ description: '検索結果から関連ページを取得',
189
+ inputType: 'url',
190
+ priority: 'high',
191
+ dependsOn: ['search'],
192
+ estimatedDuration: 60,
193
+ },
194
+ {
195
+ name: 'analyze',
196
+ description: '取得した情報を分析',
197
+ inputType: 'text',
198
+ priority: 'medium',
199
+ dependsOn: ['scrape'],
200
+ estimatedDuration: 30,
201
+ },
202
+ {
203
+ name: 'extract',
204
+ description: '重要なエンティティを抽出',
205
+ inputType: 'text',
206
+ priority: 'medium',
207
+ dependsOn: ['scrape'],
208
+ estimatedDuration: 20,
209
+ },
210
+ {
211
+ name: 'summarize',
212
+ description: '情報を要約',
213
+ inputType: 'text',
214
+ priority: 'medium',
215
+ dependsOn: ['analyze', 'extract'],
216
+ estimatedDuration: 20,
217
+ },
218
+ ];
219
+ }
220
+ /**
221
+ * 分析タスクの分解
222
+ */
223
+ async decomposeAnalysisTask(_task) {
224
+ return [
225
+ {
226
+ name: 'prepare',
227
+ description: 'データの前処理',
228
+ inputType: 'data',
229
+ priority: 'high',
230
+ dependsOn: [],
231
+ estimatedDuration: 15,
232
+ },
233
+ {
234
+ name: 'analyze_text',
235
+ description: 'テキスト分析(キーワード、複雑度)',
236
+ inputType: 'text',
237
+ priority: 'high',
238
+ dependsOn: ['prepare'],
239
+ estimatedDuration: 20,
240
+ },
241
+ {
242
+ name: 'analyze_structure',
243
+ description: '構造分析',
244
+ inputType: 'text',
245
+ priority: 'medium',
246
+ dependsOn: ['prepare'],
247
+ estimatedDuration: 15,
248
+ },
249
+ {
250
+ name: 'extract_entities',
251
+ description: 'エンティティ抽出',
252
+ inputType: 'text',
253
+ priority: 'medium',
254
+ dependsOn: ['prepare'],
255
+ estimatedDuration: 20,
256
+ },
257
+ {
258
+ name: 'synthesize',
259
+ description: '分析結果の統合',
260
+ inputType: 'data',
261
+ priority: 'high',
262
+ dependsOn: ['analyze_text', 'analyze_structure', 'extract_entities'],
263
+ estimatedDuration: 15,
264
+ },
265
+ ];
266
+ }
267
+ /**
268
+ * レポート作成タスクの分解
269
+ */
270
+ async decomposeReportTask(_task) {
271
+ return [
272
+ {
273
+ name: 'gather',
274
+ description: '情報収集',
275
+ inputType: 'mixed',
276
+ priority: 'high',
277
+ dependsOn: [],
278
+ estimatedDuration: 30,
279
+ },
280
+ {
281
+ name: 'outline',
282
+ description: 'アウトライン作成',
283
+ inputType: 'data',
284
+ priority: 'high',
285
+ dependsOn: ['gather'],
286
+ estimatedDuration: 10,
287
+ },
288
+ {
289
+ name: 'draft_sections',
290
+ description: '各セクションの下書き',
291
+ inputType: 'data',
292
+ priority: 'high',
293
+ dependsOn: ['outline'],
294
+ estimatedDuration: 45,
295
+ },
296
+ {
297
+ name: 'generate_citations',
298
+ description: '引用・参照の生成',
299
+ inputType: 'data',
300
+ priority: 'medium',
301
+ dependsOn: ['gather'],
302
+ estimatedDuration: 15,
303
+ },
304
+ {
305
+ name: 'finalize',
306
+ description: 'レポートの最終化',
307
+ inputType: 'data',
308
+ priority: 'high',
309
+ dependsOn: ['draft_sections', 'generate_citations'],
310
+ estimatedDuration: 20,
311
+ },
312
+ ];
313
+ }
314
+ /**
315
+ * 汎用タスクの分解
316
+ */
317
+ async decomposeGenericTask(_task) {
318
+ return [
319
+ {
320
+ name: 'understand',
321
+ description: 'タスクの理解と要件分析',
322
+ inputType: 'text',
323
+ priority: 'high',
324
+ dependsOn: [],
325
+ estimatedDuration: 10,
326
+ },
327
+ {
328
+ name: 'plan',
329
+ description: '実行計画の作成',
330
+ inputType: 'data',
331
+ priority: 'high',
332
+ dependsOn: ['understand'],
333
+ estimatedDuration: 10,
334
+ },
335
+ {
336
+ name: 'execute',
337
+ description: 'タスクの実行',
338
+ inputType: 'mixed',
339
+ priority: 'high',
340
+ dependsOn: ['plan'],
341
+ estimatedDuration: 60,
342
+ },
343
+ {
344
+ name: 'verify',
345
+ description: '結果の検証',
346
+ inputType: 'data',
347
+ priority: 'medium',
348
+ dependsOn: ['execute'],
349
+ estimatedDuration: 15,
350
+ },
351
+ ];
352
+ }
353
+ /**
354
+ * キーワード抽出(簡易版)
355
+ */
356
+ extractKeywords(text) {
357
+ // 助詞や一般的な動詞を除去
358
+ const stopWords = [
359
+ 'について',
360
+ 'に関して',
361
+ 'を',
362
+ 'の',
363
+ 'が',
364
+ 'は',
365
+ 'で',
366
+ 'と',
367
+ '調べ',
368
+ 'して',
369
+ 'まとめ',
370
+ 'ください',
371
+ ];
372
+ let processed = text;
373
+ for (const sw of stopWords) {
374
+ processed = processed.replace(new RegExp(sw, 'g'), ' ');
375
+ }
376
+ return processed
377
+ .split(/\s+/)
378
+ .filter((w) => w.length > 1)
379
+ .slice(0, 5);
380
+ }
381
+ /**
382
+ * 依存関係の深さを検証
383
+ */
384
+ validateDependencyDepth(tasks) {
385
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
386
+ let maxDepth = 0;
387
+ const calculateDepth = (taskId, visited) => {
388
+ if (visited.has(taskId))
389
+ return 0;
390
+ visited.add(taskId);
391
+ const task = taskMap.get(taskId);
392
+ if (!task || task.dependencies.length === 0)
393
+ return 0;
394
+ let max = 0;
395
+ for (const depId of task.dependencies) {
396
+ const depth = calculateDepth(depId, visited) + 1;
397
+ max = Math.max(max, depth);
398
+ }
399
+ return max;
400
+ };
401
+ for (const task of tasks) {
402
+ const depth = calculateDepth(task.id, new Set());
403
+ maxDepth = Math.max(maxDepth, depth);
404
+ }
405
+ return {
406
+ valid: maxDepth <= this.config.maxDependencyDepth,
407
+ maxDepth,
408
+ };
409
+ }
410
+ /**
411
+ * 循環依存を検出
412
+ */
413
+ detectCycles(tasks) {
414
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
415
+ const visited = new Set();
416
+ const recStack = new Set();
417
+ const path = [];
418
+ const dfs = (taskId) => {
419
+ visited.add(taskId);
420
+ recStack.add(taskId);
421
+ path.push(taskId);
422
+ const task = taskMap.get(taskId);
423
+ if (task) {
424
+ for (const depId of task.dependencies) {
425
+ if (!visited.has(depId)) {
426
+ if (dfs(depId))
427
+ return true;
428
+ }
429
+ else if (recStack.has(depId)) {
430
+ path.push(depId);
431
+ return true;
432
+ }
433
+ }
434
+ }
435
+ path.pop();
436
+ recStack.delete(taskId);
437
+ return false;
438
+ };
439
+ for (const task of tasks) {
440
+ if (!visited.has(task.id)) {
441
+ if (dfs(task.id)) {
442
+ return { hasCycle: true, cycle: [...path] };
443
+ }
444
+ }
445
+ }
446
+ return { hasCycle: false };
447
+ }
448
+ /**
449
+ * トポロジカルソート
450
+ */
451
+ topologicalSort(tasks) {
452
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
453
+ const visited = new Set();
454
+ const result = [];
455
+ const visit = (taskId) => {
456
+ if (visited.has(taskId))
457
+ return;
458
+ visited.add(taskId);
459
+ const task = taskMap.get(taskId);
460
+ if (task) {
461
+ for (const depId of task.dependencies) {
462
+ visit(depId);
463
+ }
464
+ }
465
+ result.push(taskId);
466
+ };
467
+ for (const task of tasks) {
468
+ visit(task.id);
469
+ }
470
+ return result;
471
+ }
472
+ /**
473
+ * 並列実行可能なグループを計算
474
+ *
475
+ * maxConcurrentTasks の制限を適用し、大きなグループを分割します。
476
+ */
477
+ computeParallelGroups(tasks, executionOrder) {
478
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
479
+ const completed = new Set();
480
+ const groups = [];
481
+ const maxConcurrent = this.config.maxConcurrentTasks;
482
+ while (completed.size < tasks.length) {
483
+ const readyTasks = [];
484
+ for (const taskId of executionOrder) {
485
+ if (completed.has(taskId))
486
+ continue;
487
+ const task = taskMap.get(taskId);
488
+ if (!task)
489
+ continue;
490
+ // すべての依存が完了しているか確認
491
+ const depsCompleted = task.dependencies.every((depId) => completed.has(depId));
492
+ if (depsCompleted) {
493
+ readyTasks.push(taskId);
494
+ }
495
+ }
496
+ if (readyTasks.length === 0)
497
+ break; // デッドロック防止
498
+ // maxConcurrentTasks の制限を適用してグループを分割
499
+ for (let i = 0; i < readyTasks.length; i += maxConcurrent) {
500
+ const chunk = readyTasks.slice(i, i + maxConcurrent);
501
+ groups.push(chunk);
502
+ for (const id of chunk) {
503
+ completed.add(id);
504
+ }
505
+ }
506
+ }
507
+ return groups;
508
+ }
509
+ /**
510
+ * 総推定時間を計算(並列実行を考慮)
511
+ */
512
+ estimateTotalDuration(tasks, parallelGroups) {
513
+ const taskMap = new Map(tasks.map((t) => [t.id, t]));
514
+ let total = 0;
515
+ for (const group of parallelGroups) {
516
+ // グループ内で最も長いタスクの時間
517
+ let maxDuration = 0;
518
+ for (const taskId of group) {
519
+ const task = taskMap.get(taskId);
520
+ if (task?.estimatedDuration) {
521
+ maxDuration = Math.max(maxDuration, task.estimatedDuration);
522
+ }
523
+ }
524
+ total += maxDuration;
525
+ }
526
+ return total;
527
+ }
528
+ }
529
+ exports.TaskDecomposer = TaskDecomposer;
530
+ //# sourceMappingURL=task-decomposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-decomposer.js","sourceRoot":"","sources":["../src/task-decomposer.ts"],"names":[],"mappings":"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"}