@nahisaho/katashiro-analyzer 2.0.13 → 2.1.1

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 (73) hide show
  1. package/dist/index.d.ts +3 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/research/agent/ActionRouter.d.ts +101 -0
  6. package/dist/research/agent/ActionRouter.d.ts.map +1 -0
  7. package/dist/research/agent/ActionRouter.js +284 -0
  8. package/dist/research/agent/ActionRouter.js.map +1 -0
  9. package/dist/research/agent/ActionTracker.d.ts +105 -0
  10. package/dist/research/agent/ActionTracker.d.ts.map +1 -0
  11. package/dist/research/agent/ActionTracker.js +219 -0
  12. package/dist/research/agent/ActionTracker.js.map +1 -0
  13. package/dist/research/agent/AnswerEvaluator.d.ts +156 -0
  14. package/dist/research/agent/AnswerEvaluator.d.ts.map +1 -0
  15. package/dist/research/agent/AnswerEvaluator.js +626 -0
  16. package/dist/research/agent/AnswerEvaluator.js.map +1 -0
  17. package/dist/research/agent/DeepResearchAgent.d.ts +136 -0
  18. package/dist/research/agent/DeepResearchAgent.d.ts.map +1 -0
  19. package/dist/research/agent/DeepResearchAgent.js +381 -0
  20. package/dist/research/agent/DeepResearchAgent.js.map +1 -0
  21. package/dist/research/agent/KnowledgeStore.d.ts +95 -0
  22. package/dist/research/agent/KnowledgeStore.d.ts.map +1 -0
  23. package/dist/research/agent/KnowledgeStore.js +189 -0
  24. package/dist/research/agent/KnowledgeStore.js.map +1 -0
  25. package/dist/research/agent/QueryRewriter.d.ts +111 -0
  26. package/dist/research/agent/QueryRewriter.d.ts.map +1 -0
  27. package/dist/research/agent/QueryRewriter.js +350 -0
  28. package/dist/research/agent/QueryRewriter.js.map +1 -0
  29. package/dist/research/agent/TokenTracker.d.ts +100 -0
  30. package/dist/research/agent/TokenTracker.d.ts.map +1 -0
  31. package/dist/research/agent/TokenTracker.js +150 -0
  32. package/dist/research/agent/TokenTracker.js.map +1 -0
  33. package/dist/research/agent/actions/AnswerActionHandler.d.ts +44 -0
  34. package/dist/research/agent/actions/AnswerActionHandler.d.ts.map +1 -0
  35. package/dist/research/agent/actions/AnswerActionHandler.js +158 -0
  36. package/dist/research/agent/actions/AnswerActionHandler.js.map +1 -0
  37. package/dist/research/agent/actions/BaseActionHandler.d.ts +87 -0
  38. package/dist/research/agent/actions/BaseActionHandler.d.ts.map +1 -0
  39. package/dist/research/agent/actions/BaseActionHandler.js +67 -0
  40. package/dist/research/agent/actions/BaseActionHandler.js.map +1 -0
  41. package/dist/research/agent/actions/CodingActionHandler.d.ts +66 -0
  42. package/dist/research/agent/actions/CodingActionHandler.d.ts.map +1 -0
  43. package/dist/research/agent/actions/CodingActionHandler.js +233 -0
  44. package/dist/research/agent/actions/CodingActionHandler.js.map +1 -0
  45. package/dist/research/agent/actions/ReflectActionHandler.d.ts +32 -0
  46. package/dist/research/agent/actions/ReflectActionHandler.d.ts.map +1 -0
  47. package/dist/research/agent/actions/ReflectActionHandler.js +107 -0
  48. package/dist/research/agent/actions/ReflectActionHandler.js.map +1 -0
  49. package/dist/research/agent/actions/SearchActionHandler.d.ts +30 -0
  50. package/dist/research/agent/actions/SearchActionHandler.d.ts.map +1 -0
  51. package/dist/research/agent/actions/SearchActionHandler.js +73 -0
  52. package/dist/research/agent/actions/SearchActionHandler.js.map +1 -0
  53. package/dist/research/agent/actions/VisitActionHandler.d.ts +33 -0
  54. package/dist/research/agent/actions/VisitActionHandler.d.ts.map +1 -0
  55. package/dist/research/agent/actions/VisitActionHandler.js +83 -0
  56. package/dist/research/agent/actions/VisitActionHandler.js.map +1 -0
  57. package/dist/research/agent/actions/index.d.ts +10 -0
  58. package/dist/research/agent/actions/index.d.ts.map +1 -0
  59. package/dist/research/agent/actions/index.js +10 -0
  60. package/dist/research/agent/actions/index.js.map +1 -0
  61. package/dist/research/agent/index.d.ts +62 -0
  62. package/dist/research/agent/index.d.ts.map +1 -0
  63. package/dist/research/agent/index.js +57 -0
  64. package/dist/research/agent/index.js.map +1 -0
  65. package/dist/research/agent/types.d.ts +421 -0
  66. package/dist/research/agent/types.d.ts.map +1 -0
  67. package/dist/research/agent/types.js +45 -0
  68. package/dist/research/agent/types.js.map +1 -0
  69. package/dist/research/index.d.ts +1 -0
  70. package/dist/research/index.d.ts.map +1 -1
  71. package/dist/research/index.js +2 -0
  72. package/dist/research/index.js.map +1 -1
  73. package/package.json +2 -1
@@ -0,0 +1,100 @@
1
+ /**
2
+ * TokenTracker - トークン使用量追跡
3
+ *
4
+ * @requirement REQ-DR-007
5
+ * @design DES-v2.1.0-DeepResearchAgent
6
+ */
7
+ import type { TokenUsage } from './types.js';
8
+ /**
9
+ * TokenTrackerオプション
10
+ */
11
+ export interface TokenTrackerOptions {
12
+ /** トークン予算 */
13
+ budget: number;
14
+ }
15
+ /**
16
+ * トークン使用量を追跡するクラス
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const tracker = new TokenTracker({ budget: 1_000_000 });
21
+ *
22
+ * tracker.trackUsage(100, 50); // promptTokens, completionTokens
23
+ *
24
+ * console.log(`Remaining: ${tracker.getRemainingBudget()}`);
25
+ * console.log(`Usage: ${(tracker.getUsageRatio() * 100).toFixed(1)}%`);
26
+ * ```
27
+ */
28
+ export declare class TokenTracker {
29
+ private budget;
30
+ private promptTokens;
31
+ private completionTokens;
32
+ private usage;
33
+ private history;
34
+ constructor(options: TokenTrackerOptions | number);
35
+ /**
36
+ * トークン使用量を記録(prompt/completionトークン)
37
+ */
38
+ trackUsage(promptTokens: number, completionTokens: number): void;
39
+ /**
40
+ * トークン使用量を記録(ツール名付き)
41
+ */
42
+ trackUsage(tool: string, usage: TokenUsage): void;
43
+ /**
44
+ * 総使用量を取得
45
+ */
46
+ getTotalUsage(): number;
47
+ /**
48
+ * トークン使用量を取得
49
+ */
50
+ getUsage(): TokenUsage;
51
+ /**
52
+ * 残り予算を取得
53
+ */
54
+ getRemainingBudget(): number;
55
+ /**
56
+ * ツール別の使用量を取得
57
+ */
58
+ getBreakdown(): Record<string, number>;
59
+ /**
60
+ * 予算を超過しているか
61
+ */
62
+ isExceeded(): boolean;
63
+ /**
64
+ * 使用率を取得(0-1)
65
+ */
66
+ getUsageRatio(): number;
67
+ /**
68
+ * 残り予算の比率を取得(0-1)
69
+ */
70
+ getRemainingRatio(): number;
71
+ /**
72
+ * 履歴を取得
73
+ */
74
+ getHistory(): Array<{
75
+ tool: string;
76
+ usage: TokenUsage;
77
+ timestamp: string;
78
+ }>;
79
+ /**
80
+ * 予算を更新
81
+ */
82
+ setBudget(budget: number): void;
83
+ /**
84
+ * リセット
85
+ */
86
+ reset(): void;
87
+ /**
88
+ * 現在の状態をサマリーとして取得
89
+ */
90
+ getSummary(): {
91
+ budget: number;
92
+ used: number;
93
+ remaining: number;
94
+ usageRatio: number;
95
+ isExceeded: boolean;
96
+ breakdown: Record<string, number>;
97
+ };
98
+ }
99
+ export type { TokenUsage };
100
+ //# sourceMappingURL=TokenTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenTracker.d.ts","sourceRoot":"","sources":["../../../src/research/agent/TokenTracker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,OAAO,CAAgE;gBAEnE,OAAO,EAAE,mBAAmB,GAAG,MAAM;IAUjD;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAChE;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IA8BjD;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,QAAQ,IAAI,UAAU;IAQtB;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQtC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,UAAU,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAI3E;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,UAAU,IAAI;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;CAUF;AAGD,YAAY,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * TokenTracker - トークン使用量追跡
3
+ *
4
+ * @requirement REQ-DR-007
5
+ * @design DES-v2.1.0-DeepResearchAgent
6
+ */
7
+ /**
8
+ * トークン使用量を追跡するクラス
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const tracker = new TokenTracker({ budget: 1_000_000 });
13
+ *
14
+ * tracker.trackUsage(100, 50); // promptTokens, completionTokens
15
+ *
16
+ * console.log(`Remaining: ${tracker.getRemainingBudget()}`);
17
+ * console.log(`Usage: ${(tracker.getUsageRatio() * 100).toFixed(1)}%`);
18
+ * ```
19
+ */
20
+ export class TokenTracker {
21
+ budget;
22
+ promptTokens = 0;
23
+ completionTokens = 0;
24
+ usage;
25
+ history;
26
+ constructor(options) {
27
+ if (typeof options === 'number') {
28
+ this.budget = options;
29
+ }
30
+ else {
31
+ this.budget = options.budget;
32
+ }
33
+ this.usage = new Map();
34
+ this.history = [];
35
+ }
36
+ trackUsage(arg1, arg2) {
37
+ if (typeof arg1 === 'number' && typeof arg2 === 'number') {
38
+ // trackUsage(promptTokens, completionTokens)
39
+ this.promptTokens += arg1;
40
+ this.completionTokens += arg2;
41
+ const total = arg1 + arg2;
42
+ const current = this.usage.get('llm') || 0;
43
+ this.usage.set('llm', current + total);
44
+ this.history.push({
45
+ tool: 'llm',
46
+ usage: { promptTokens: arg1, completionTokens: arg2, totalTokens: total },
47
+ timestamp: new Date().toISOString(),
48
+ });
49
+ }
50
+ else if (typeof arg1 === 'string' && typeof arg2 === 'object') {
51
+ // trackUsage(tool, usage)
52
+ const tool = arg1;
53
+ const usage = arg2;
54
+ this.promptTokens += usage.promptTokens;
55
+ this.completionTokens += usage.completionTokens;
56
+ const current = this.usage.get(tool) || 0;
57
+ this.usage.set(tool, current + usage.totalTokens);
58
+ this.history.push({
59
+ tool,
60
+ usage,
61
+ timestamp: new Date().toISOString(),
62
+ });
63
+ }
64
+ }
65
+ /**
66
+ * 総使用量を取得
67
+ */
68
+ getTotalUsage() {
69
+ return this.promptTokens + this.completionTokens;
70
+ }
71
+ /**
72
+ * トークン使用量を取得
73
+ */
74
+ getUsage() {
75
+ return {
76
+ promptTokens: this.promptTokens,
77
+ completionTokens: this.completionTokens,
78
+ totalTokens: this.promptTokens + this.completionTokens,
79
+ };
80
+ }
81
+ /**
82
+ * 残り予算を取得
83
+ */
84
+ getRemainingBudget() {
85
+ return Math.max(0, this.budget - this.getTotalUsage());
86
+ }
87
+ /**
88
+ * ツール別の使用量を取得
89
+ */
90
+ getBreakdown() {
91
+ const result = {};
92
+ for (const [tool, count] of this.usage.entries()) {
93
+ result[tool] = count;
94
+ }
95
+ return result;
96
+ }
97
+ /**
98
+ * 予算を超過しているか
99
+ */
100
+ isExceeded() {
101
+ return this.getTotalUsage() >= this.budget;
102
+ }
103
+ /**
104
+ * 使用率を取得(0-1)
105
+ */
106
+ getUsageRatio() {
107
+ return this.getTotalUsage() / this.budget;
108
+ }
109
+ /**
110
+ * 残り予算の比率を取得(0-1)
111
+ */
112
+ getRemainingRatio() {
113
+ return this.getRemainingBudget() / this.budget;
114
+ }
115
+ /**
116
+ * 履歴を取得
117
+ */
118
+ getHistory() {
119
+ return [...this.history];
120
+ }
121
+ /**
122
+ * 予算を更新
123
+ */
124
+ setBudget(budget) {
125
+ this.budget = budget;
126
+ }
127
+ /**
128
+ * リセット
129
+ */
130
+ reset() {
131
+ this.promptTokens = 0;
132
+ this.completionTokens = 0;
133
+ this.usage.clear();
134
+ this.history = [];
135
+ }
136
+ /**
137
+ * 現在の状態をサマリーとして取得
138
+ */
139
+ getSummary() {
140
+ return {
141
+ budget: this.budget,
142
+ used: this.getTotalUsage(),
143
+ remaining: this.getRemainingBudget(),
144
+ usageRatio: this.getUsageRatio(),
145
+ isExceeded: this.isExceeded(),
146
+ breakdown: this.getBreakdown(),
147
+ };
148
+ }
149
+ }
150
+ //# sourceMappingURL=TokenTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenTracker.js","sourceRoot":"","sources":["../../../src/research/agent/TokenTracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * AnswerActionHandler - 回答生成アクション
3
+ *
4
+ * @requirement REQ-DR-001
5
+ * @requirement REQ-DR-004
6
+ * @design DES-v2.1.0-DeepResearchAgent
7
+ */
8
+ import type { LLMClientInterface, AnswerParams, KnowledgeItem } from '../types.js';
9
+ import type { AnswerEvaluator } from '../AnswerEvaluator.js';
10
+ import { BaseActionHandler, type ExecutionContext, type ActionResult, type ActionHandlerOptions } from './BaseActionHandler.js';
11
+ /**
12
+ * 回答アクションハンドラのオプション
13
+ */
14
+ export interface AnswerActionHandlerOptions extends ActionHandlerOptions {
15
+ /** LLMクライアント */
16
+ llmClient: LLMClientInterface;
17
+ /** 回答評価器 */
18
+ evaluator: AnswerEvaluator;
19
+ }
20
+ /**
21
+ * 回答を生成するアクションハンドラ
22
+ */
23
+ export declare class AnswerActionHandler extends BaseActionHandler<AnswerParams> {
24
+ readonly actionType: "answer";
25
+ private llmClient;
26
+ private evaluator;
27
+ constructor(options: AnswerActionHandlerOptions);
28
+ /**
29
+ * 回答を生成
30
+ */
31
+ execute(params: AnswerParams, context: ExecutionContext): Promise<ActionResult>;
32
+ /**
33
+ * ナレッジから回答を生成
34
+ */
35
+ private generateAnswer;
36
+ /**
37
+ * Beastモード用の強制回答生成
38
+ */
39
+ generateForcedAnswer(question: string, knowledge: KnowledgeItem[]): Promise<{
40
+ answer: string;
41
+ references: string[];
42
+ }>;
43
+ }
44
+ //# sourceMappingURL=AnswerActionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnswerActionHandler.d.ts","sourceRoot":"","sources":["../../../../src/research/agent/actions/AnswerActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEhI;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,gBAAgB;IAChB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,YAAY;IACZ,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,YAAY,CAAC;IACtE,QAAQ,CAAC,UAAU,EAAG,QAAQ,CAAU;IAExC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAkB;gBAEvB,OAAO,EAAE,0BAA0B;IAM/C;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IA6CrF;;OAEG;YACW,cAAc;IA+D5B;;OAEG;IACG,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAyDrD"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * AnswerActionHandler - 回答生成アクション
3
+ *
4
+ * @requirement REQ-DR-001
5
+ * @requirement REQ-DR-004
6
+ * @design DES-v2.1.0-DeepResearchAgent
7
+ */
8
+ import { BaseActionHandler } from './BaseActionHandler.js';
9
+ /**
10
+ * 回答を生成するアクションハンドラ
11
+ */
12
+ export class AnswerActionHandler extends BaseActionHandler {
13
+ actionType = 'answer';
14
+ llmClient;
15
+ evaluator;
16
+ constructor(options) {
17
+ super(options);
18
+ this.llmClient = options.llmClient;
19
+ this.evaluator = options.evaluator;
20
+ }
21
+ /**
22
+ * 回答を生成
23
+ */
24
+ async execute(params, context) {
25
+ const { isFinal } = params;
26
+ try {
27
+ // ナレッジから回答を生成
28
+ const generatedAnswer = await this.generateAnswer(context.question, context.currentKnowledge);
29
+ // 回答を評価
30
+ const evaluation = await this.evaluator.evaluate(context.question, generatedAnswer.answer, context.currentKnowledge);
31
+ // 評価結果をナレッジアイテムとして保存
32
+ const item = this.createKnowledgeItem(`Answer Attempt:\n\n${generatedAnswer.answer}\n\nEvaluation: ${evaluation.pass ? 'PASS' : 'FAIL'}\nDetails: ${evaluation.think}`, {
33
+ type: 'reflection',
34
+ title: isFinal ? 'Final Answer' : 'Answer Attempt',
35
+ });
36
+ return {
37
+ success: evaluation.pass || isFinal === true,
38
+ knowledgeItems: [item],
39
+ metadata: {
40
+ answer: generatedAnswer.answer,
41
+ references: generatedAnswer.references,
42
+ evaluation,
43
+ isFinal: isFinal === true,
44
+ },
45
+ };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ success: false,
50
+ knowledgeItems: [],
51
+ error: error instanceof Error ? error.message : 'Answer generation failed',
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * ナレッジから回答を生成
57
+ */
58
+ async generateAnswer(question, knowledge) {
59
+ // ナレッジをコンテキストとして構築
60
+ const knowledgeContext = knowledge
61
+ .map((k) => `[${k.id}] ${k.summary}\nSource: ${k.sourceId}`)
62
+ .join('\n\n');
63
+ const prompt = `Based on the gathered knowledge, provide a comprehensive answer to the question.
64
+
65
+ Question: "${question}"
66
+
67
+ Available Knowledge:
68
+ ${knowledgeContext || 'No knowledge available.'}
69
+
70
+ Instructions:
71
+ 1. Synthesize information from multiple sources
72
+ 2. Provide a well-structured answer
73
+ 3. Cite sources using [source-id] format
74
+ 4. Acknowledge any gaps in the available information
75
+ 5. Be factual and avoid speculation
76
+
77
+ Respond in JSON format:
78
+ {
79
+ "answer": "Your comprehensive answer here...",
80
+ "references": ["source-id-1", "source-id-2"]
81
+ }`;
82
+ const response = await this.llmClient.chat({
83
+ messages: [{ role: 'user', content: prompt }],
84
+ temperature: 0.7,
85
+ maxTokens: 2000,
86
+ });
87
+ // トークン追跡
88
+ if (response.usage) {
89
+ this.tokenTracker.trackUsage(response.usage.promptTokens ?? 0, response.usage.completionTokens ?? 0);
90
+ }
91
+ try {
92
+ const jsonMatch = response.content.match(/\{[\s\S]*\}/);
93
+ if (jsonMatch) {
94
+ const parsed = JSON.parse(jsonMatch[0]);
95
+ return parsed;
96
+ }
97
+ }
98
+ catch {
99
+ // パース失敗
100
+ }
101
+ // デフォルト
102
+ return {
103
+ answer: response.content,
104
+ references: knowledge.map((k) => k.sourceId),
105
+ };
106
+ }
107
+ /**
108
+ * Beastモード用の強制回答生成
109
+ */
110
+ async generateForcedAnswer(question, knowledge) {
111
+ const knowledgeContext = knowledge
112
+ .map((k) => k.summary)
113
+ .join('\n')
114
+ .slice(0, 5000);
115
+ const prompt = `You MUST provide an answer now, even if incomplete.
116
+
117
+ Question: "${question}"
118
+
119
+ Available Information:
120
+ ${knowledgeContext || 'Limited information available.'}
121
+
122
+ Instructions:
123
+ 1. Provide the best possible answer with available information
124
+ 2. Clearly indicate what is known vs. unknown
125
+ 3. Suggest areas for further research if needed
126
+
127
+ Respond in JSON format:
128
+ {
129
+ "answer": "Your answer here...",
130
+ "references": [],
131
+ "limitations": "What is not covered..."
132
+ }`;
133
+ const response = await this.llmClient.chat({
134
+ messages: [{ role: 'user', content: prompt }],
135
+ temperature: 0.5,
136
+ maxTokens: 2000,
137
+ });
138
+ // トークン追跡
139
+ if (response.usage) {
140
+ this.tokenTracker.trackUsage(response.usage.promptTokens ?? 0, response.usage.completionTokens ?? 0);
141
+ }
142
+ try {
143
+ const jsonMatch = response.content.match(/\{[\s\S]*\}/);
144
+ if (jsonMatch) {
145
+ const parsed = JSON.parse(jsonMatch[0]);
146
+ return parsed;
147
+ }
148
+ }
149
+ catch {
150
+ // パース失敗
151
+ }
152
+ return {
153
+ answer: response.content,
154
+ references: [],
155
+ };
156
+ }
157
+ }
158
+ //# sourceMappingURL=AnswerActionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnswerActionHandler.js","sourceRoot":"","sources":["../../../../src/research/agent/actions/AnswerActionHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * アクションハンドラの基底クラスとインターフェース
3
+ *
4
+ * @requirement REQ-DR-001
5
+ * @design DES-v2.1.0-DeepResearchAgent
6
+ */
7
+ import type { ActionType, KnowledgeItem, AgentConfig } from '../types.js';
8
+ import type { TokenTracker } from '../TokenTracker.js';
9
+ /**
10
+ * アクション実行結果
11
+ */
12
+ export interface ActionResult {
13
+ /** 成功したか */
14
+ success: boolean;
15
+ /** 取得したナレッジアイテム */
16
+ knowledgeItems: KnowledgeItem[];
17
+ /** エラーメッセージ(失敗時) */
18
+ error?: string;
19
+ /** 追加のメタデータ */
20
+ metadata?: Record<string, unknown>;
21
+ }
22
+ /**
23
+ * アクションハンドラのオプション
24
+ */
25
+ export interface ActionHandlerOptions {
26
+ /** エージェント設定 */
27
+ config: AgentConfig;
28
+ /** トークントラッカー */
29
+ tokenTracker: TokenTracker;
30
+ }
31
+ /**
32
+ * アクションハンドラの基底インターフェース
33
+ */
34
+ export interface IActionHandler<TParams = unknown> {
35
+ /** アクションタイプ */
36
+ readonly actionType: ActionType;
37
+ /**
38
+ * アクションを実行
39
+ */
40
+ execute(params: TParams, context: ExecutionContext): Promise<ActionResult>;
41
+ }
42
+ /**
43
+ * アクション実行コンテキスト(簡易版)
44
+ */
45
+ export interface ExecutionContext {
46
+ /** 元の質問 */
47
+ question: string;
48
+ /** 現在のステップ番号 */
49
+ stepNumber: number;
50
+ /** 訪問済みURL */
51
+ visitedUrls: string[];
52
+ /** 検索結果からのURL候補 */
53
+ searchResultUrls: {
54
+ index: number;
55
+ url: string;
56
+ title: string;
57
+ }[];
58
+ /** 現在のナレッジ */
59
+ currentKnowledge: KnowledgeItem[];
60
+ }
61
+ /**
62
+ * アクションハンドラの基底抽象クラス
63
+ */
64
+ export declare abstract class BaseActionHandler<TParams = unknown> implements IActionHandler<TParams> {
65
+ abstract readonly actionType: ActionType;
66
+ protected config: AgentConfig;
67
+ protected tokenTracker: TokenTracker;
68
+ constructor(options: ActionHandlerOptions);
69
+ abstract execute(params: TParams, context: ExecutionContext): Promise<ActionResult>;
70
+ /**
71
+ * ナレッジアイテムを生成
72
+ */
73
+ protected createKnowledgeItem(content: string, source: {
74
+ url?: string;
75
+ title?: string;
76
+ type: 'web' | 'code' | 'reflection';
77
+ }): KnowledgeItem;
78
+ /**
79
+ * コンテンツから要約を生成
80
+ */
81
+ private createSummary;
82
+ /**
83
+ * コンテンツからキーワードを抽出
84
+ */
85
+ private extractKeywords;
86
+ }
87
+ //# sourceMappingURL=BaseActionHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseActionHandler.d.ts","sourceRoot":"","sources":["../../../../src/research/agent/actions/BaseActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,mBAAmB;IACnB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,eAAe;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,gBAAgB;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,OAAO,GAAG,OAAO;IAC/C,eAAe;IACf,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEhC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mBAAmB;IACnB,gBAAgB,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClE,cAAc;IACd,gBAAgB,EAAE,aAAa,EAAE,CAAC;CACnC;AAED;;GAEG;AACH,8BAAsB,iBAAiB,CAAC,OAAO,GAAG,OAAO,CAAE,YAAW,cAAc,CAAC,OAAO,CAAC;IAC3F,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAEzC,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC;IAC9B,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC;gBAEzB,OAAO,EAAE,oBAAoB;IAKzC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IAEnF;;OAEG;IACH,SAAS,CAAC,mBAAmB,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,YAAY,CAAA;KAAE,GAC5E,aAAa;IAmBhB;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB;;OAEG;IACH,OAAO,CAAC,eAAe;CAiBxB"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * アクションハンドラの基底クラスとインターフェース
3
+ *
4
+ * @requirement REQ-DR-001
5
+ * @design DES-v2.1.0-DeepResearchAgent
6
+ */
7
+ /**
8
+ * アクションハンドラの基底抽象クラス
9
+ */
10
+ export class BaseActionHandler {
11
+ config;
12
+ tokenTracker;
13
+ constructor(options) {
14
+ this.config = options.config;
15
+ this.tokenTracker = options.tokenTracker;
16
+ }
17
+ /**
18
+ * ナレッジアイテムを生成
19
+ */
20
+ createKnowledgeItem(content, source) {
21
+ const now = new Date();
22
+ const id = `ki-${now.getTime()}-${Math.random().toString(36).slice(2, 8)}`;
23
+ return {
24
+ id,
25
+ sourceId: source.url || `internal-${id}`,
26
+ sourceType: source.type,
27
+ summary: this.createSummary(content),
28
+ content,
29
+ keywords: this.extractKeywords(content),
30
+ timestamp: now.toISOString(),
31
+ metadata: {
32
+ title: source.title,
33
+ url: source.url,
34
+ },
35
+ };
36
+ }
37
+ /**
38
+ * コンテンツから要約を生成
39
+ */
40
+ createSummary(content) {
41
+ // 最初の300文字を要約として使用
42
+ const cleaned = content.replace(/\s+/g, ' ').trim();
43
+ if (cleaned.length <= 300) {
44
+ return cleaned;
45
+ }
46
+ return cleaned.slice(0, 297) + '...';
47
+ }
48
+ /**
49
+ * コンテンツからキーワードを抽出
50
+ */
51
+ extractKeywords(content) {
52
+ // 簡易的なキーワード抽出
53
+ const words = content
54
+ .toLowerCase()
55
+ .replace(/[^\w\s]/g, ' ')
56
+ .split(/\s+/)
57
+ .filter((w) => w.length > 3);
58
+ // 頻度でソート
59
+ const freq = new Map();
60
+ for (const word of words) {
61
+ freq.set(word, (freq.get(word) || 0) + 1);
62
+ }
63
+ const sorted = [...freq.entries()].sort((a, b) => b[1] - a[1]);
64
+ return sorted.slice(0, 10).map(([word]) => word);
65
+ }
66
+ }
67
+ //# sourceMappingURL=BaseActionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseActionHandler.js","sourceRoot":"","sources":["../../../../src/research/agent/actions/BaseActionHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0DH;;GAEG;AACH,MAAM,OAAgB,iBAAiB;IAG3B,MAAM,CAAc;IACpB,YAAY,CAAe;IAErC,YAAY,OAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;IAID;;OAEG;IACO,mBAAmB,CAC3B,OAAe,EACf,MAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAE3E,OAAO;YACL,EAAE;YACF,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAI,YAAY,EAAE,EAAE;YACxC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACpC,OAAO;YACP,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACvC,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;YAC5B,QAAQ,EAAE;gBACR,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,OAAe;QACnC,mBAAmB;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC1B,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAe;QACrC,cAAc;QACd,MAAM,KAAK,GAAG,OAAO;aAClB,WAAW,EAAE;aACb,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE/B,SAAS;QACT,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;CACF"}