micro-models-agent 0.2.50 → 0.2.52

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 (150) hide show
  1. package/dist/agent/loop.d.ts.map +1 -1
  2. package/dist/agent/loop.js +87 -303
  3. package/dist/agent/loop.js.map +1 -1
  4. package/dist/agent/modes/applier.d.ts +43 -0
  5. package/dist/agent/modes/applier.d.ts.map +1 -0
  6. package/dist/agent/modes/applier.js +30 -0
  7. package/dist/agent/modes/applier.js.map +1 -0
  8. package/dist/agent/modes/registry.d.ts +35 -0
  9. package/dist/agent/modes/registry.d.ts.map +1 -0
  10. package/dist/agent/modes/registry.js +169 -0
  11. package/dist/agent/modes/registry.js.map +1 -0
  12. package/dist/agent/modes/types.d.ts +54 -0
  13. package/dist/agent/modes/types.d.ts.map +1 -0
  14. package/dist/agent/modes/types.js +13 -0
  15. package/dist/agent/modes/types.js.map +1 -0
  16. package/dist/agent/react-loop.d.ts +61 -0
  17. package/dist/agent/react-loop.d.ts.map +1 -0
  18. package/dist/agent/react-loop.js +119 -0
  19. package/dist/agent/react-loop.js.map +1 -0
  20. package/dist/agent/tool-executor.d.ts +44 -0
  21. package/dist/agent/tool-executor.d.ts.map +1 -0
  22. package/dist/agent/tool-executor.js +186 -0
  23. package/dist/agent/tool-executor.js.map +1 -0
  24. package/dist/config/types.d.ts +5 -2
  25. package/dist/config/types.d.ts.map +1 -1
  26. package/dist/plugins/adapters/hooks-adapter.d.ts +12 -0
  27. package/dist/plugins/adapters/hooks-adapter.d.ts.map +1 -0
  28. package/dist/plugins/adapters/hooks-adapter.js +23 -0
  29. package/dist/plugins/adapters/hooks-adapter.js.map +1 -0
  30. package/dist/plugins/loader.d.ts +13 -0
  31. package/dist/plugins/loader.d.ts.map +1 -0
  32. package/dist/plugins/loader.js +145 -0
  33. package/dist/plugins/loader.js.map +1 -0
  34. package/dist/plugins/manager.d.ts +52 -0
  35. package/dist/plugins/manager.d.ts.map +1 -0
  36. package/dist/plugins/manager.js +183 -0
  37. package/dist/plugins/manager.js.map +1 -0
  38. package/dist/plugins/types.d.ts +73 -0
  39. package/dist/plugins/types.d.ts.map +1 -0
  40. package/dist/plugins/types.js +8 -0
  41. package/dist/plugins/types.js.map +1 -0
  42. package/dist/repl/commands.d.ts +1 -0
  43. package/dist/repl/commands.d.ts.map +1 -1
  44. package/dist/repl/commands.js.map +1 -1
  45. package/dist/repl/index.d.ts.map +1 -1
  46. package/dist/repl/index.js +3 -2
  47. package/dist/repl/index.js.map +1 -1
  48. package/dist/session/store.d.ts +4 -2
  49. package/dist/session/store.d.ts.map +1 -1
  50. package/dist/session/store.js +4 -2
  51. package/dist/session/store.js.map +1 -1
  52. package/dist/tools/bash.d.ts +4 -0
  53. package/dist/tools/bash.d.ts.map +1 -1
  54. package/dist/tools/bash.js +24 -0
  55. package/dist/tools/bash.js.map +1 -1
  56. package/dist/tools/fs/copy-file.d.ts +2 -0
  57. package/dist/tools/fs/copy-file.d.ts.map +1 -1
  58. package/dist/tools/fs/copy-file.js +7 -0
  59. package/dist/tools/fs/copy-file.js.map +1 -1
  60. package/dist/tools/fs/create-dir.d.ts +2 -0
  61. package/dist/tools/fs/create-dir.d.ts.map +1 -1
  62. package/dist/tools/fs/create-dir.js +7 -0
  63. package/dist/tools/fs/create-dir.js.map +1 -1
  64. package/dist/tools/fs/delete-file.d.ts +2 -0
  65. package/dist/tools/fs/delete-file.d.ts.map +1 -1
  66. package/dist/tools/fs/delete-file.js +7 -0
  67. package/dist/tools/fs/delete-file.js.map +1 -1
  68. package/dist/tools/fs/edit-file.d.ts +2 -0
  69. package/dist/tools/fs/edit-file.d.ts.map +1 -1
  70. package/dist/tools/fs/edit-file.js +7 -0
  71. package/dist/tools/fs/edit-file.js.map +1 -1
  72. package/dist/tools/fs/file-info.d.ts +2 -0
  73. package/dist/tools/fs/file-info.d.ts.map +1 -1
  74. package/dist/tools/fs/file-info.js +7 -0
  75. package/dist/tools/fs/file-info.js.map +1 -1
  76. package/dist/tools/fs/glob-search.d.ts +2 -0
  77. package/dist/tools/fs/glob-search.d.ts.map +1 -1
  78. package/dist/tools/fs/glob-search.js +7 -0
  79. package/dist/tools/fs/glob-search.js.map +1 -1
  80. package/dist/tools/fs/grep-search.d.ts +2 -0
  81. package/dist/tools/fs/grep-search.d.ts.map +1 -1
  82. package/dist/tools/fs/grep-search.js +7 -0
  83. package/dist/tools/fs/grep-search.js.map +1 -1
  84. package/dist/tools/fs/list-dir.d.ts +2 -0
  85. package/dist/tools/fs/list-dir.d.ts.map +1 -1
  86. package/dist/tools/fs/list-dir.js +7 -0
  87. package/dist/tools/fs/list-dir.js.map +1 -1
  88. package/dist/tools/fs/move-file.d.ts +2 -0
  89. package/dist/tools/fs/move-file.d.ts.map +1 -1
  90. package/dist/tools/fs/move-file.js +7 -0
  91. package/dist/tools/fs/move-file.js.map +1 -1
  92. package/dist/tools/fs/read-file.d.ts +2 -0
  93. package/dist/tools/fs/read-file.d.ts.map +1 -1
  94. package/dist/tools/fs/read-file.js +7 -0
  95. package/dist/tools/fs/read-file.js.map +1 -1
  96. package/dist/tools/fs/tree.d.ts +2 -0
  97. package/dist/tools/fs/tree.d.ts.map +1 -1
  98. package/dist/tools/fs/tree.js +7 -0
  99. package/dist/tools/fs/tree.js.map +1 -1
  100. package/dist/tools/fs/write-file.d.ts +2 -0
  101. package/dist/tools/fs/write-file.d.ts.map +1 -1
  102. package/dist/tools/fs/write-file.js +7 -0
  103. package/dist/tools/fs/write-file.js.map +1 -1
  104. package/dist/tools/native/approve.d.ts +11 -0
  105. package/dist/tools/native/approve.d.ts.map +1 -0
  106. package/dist/tools/native/approve.js +39 -0
  107. package/dist/tools/native/approve.js.map +1 -0
  108. package/dist/tools/native/plan.d.ts +10 -0
  109. package/dist/tools/native/plan.d.ts.map +1 -0
  110. package/dist/tools/native/plan.js +46 -0
  111. package/dist/tools/native/plan.js.map +1 -0
  112. package/dist/tools/native/question.d.ts +11 -0
  113. package/dist/tools/native/question.d.ts.map +1 -0
  114. package/dist/tools/native/question.js +41 -0
  115. package/dist/tools/native/question.js.map +1 -0
  116. package/dist/tools/native/theme.d.ts +10 -0
  117. package/dist/tools/native/theme.d.ts.map +1 -0
  118. package/dist/tools/native/theme.js +106 -0
  119. package/dist/tools/native/theme.js.map +1 -0
  120. package/dist/tools/native/todo.d.ts +10 -0
  121. package/dist/tools/native/todo.d.ts.map +1 -0
  122. package/dist/tools/native/todo.js +58 -0
  123. package/dist/tools/native/todo.js.map +1 -0
  124. package/dist/tools/native/user-profile.d.ts +10 -0
  125. package/dist/tools/native/user-profile.d.ts.map +1 -0
  126. package/dist/tools/native/user-profile.js +58 -0
  127. package/dist/tools/native/user-profile.js.map +1 -0
  128. package/dist/tools/registry.d.ts +11 -10
  129. package/dist/tools/registry.d.ts.map +1 -1
  130. package/dist/tools/registry.js +40 -147
  131. package/dist/tools/registry.js.map +1 -1
  132. package/dist/tools/subagent.d.ts +2 -1
  133. package/dist/tools/subagent.d.ts.map +1 -1
  134. package/dist/tools/subagent.js +7 -4
  135. package/dist/tools/subagent.js.map +1 -1
  136. package/dist/tools/types.d.ts +59 -0
  137. package/dist/tools/types.d.ts.map +1 -0
  138. package/dist/tools/types.js +2 -0
  139. package/dist/tools/types.js.map +1 -0
  140. package/dist/tools/web-fetch.d.ts +2 -0
  141. package/dist/tools/web-fetch.d.ts.map +1 -1
  142. package/dist/tools/web-fetch.js +7 -0
  143. package/dist/tools/web-fetch.js.map +1 -1
  144. package/dist/tools/web-search.d.ts +2 -0
  145. package/dist/tools/web-search.d.ts.map +1 -1
  146. package/dist/tools/web-search.js +7 -0
  147. package/dist/tools/web-search.js.map +1 -1
  148. package/dist/updater.js +1 -1
  149. package/dist/updater.js.map +1 -1
  150. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ import { jsonrepair } from 'jsonrepair';
2
+ import { ContextManager } from './context.js';
3
+ import { extractAllToolCalls, validateToolCall, doChat } from '../tools/subagent.js';
4
+ import { logDebug, logWarn } from '../logger.js';
5
+ /**
6
+ * Запуск минимального ReAct-цикла.
7
+ *
8
+ * @returns Результат с финальными messages и ответом
9
+ */
10
+ export async function reactLoop(config, handlers = {}) {
11
+ const { provider, systemPrompt, initialMessages, maxSteps, quiet, showThinking, caller } = config;
12
+ const messages = [
13
+ { role: 'system', content: systemPrompt },
14
+ ...(initialMessages || []),
15
+ ];
16
+ const ctx = new ContextManager(provider.contextWindow);
17
+ let consecutiveEmpty = 0;
18
+ let aborted = false;
19
+ let lastResponse = '';
20
+ for (let step = 0; step < maxSteps; step++) {
21
+ // Step start
22
+ await handlers.onStepStart?.(step, messages);
23
+ // Token counting
24
+ if (step === 0) {
25
+ await ctx.updateTokens(messages);
26
+ }
27
+ else {
28
+ await ctx.updateTokensIncremental(messages);
29
+ }
30
+ // Context compaction
31
+ if (ctx.needsCompact && messages.length > 6) {
32
+ const before = messages.length;
33
+ messages.splice(0, messages.length, ...ctx.compact(messages));
34
+ await ctx.updateTokens(messages);
35
+ handlers.onCompact?.(before, messages.length);
36
+ }
37
+ // Emergency compact
38
+ if (ctx.isOverflow) {
39
+ const before = messages.length;
40
+ messages.splice(0, messages.length, ...ctx.emergencyCompact(messages));
41
+ await ctx.updateTokens(messages);
42
+ handlers.onCompact?.(before, messages.length);
43
+ }
44
+ // LLM call
45
+ const { response } = await doChat(provider, messages, null, undefined, 1, showThinking, caller);
46
+ // Post-LLM hook (allows modification)
47
+ const modifiedResponse = await handlers.onAfterLLM?.(step, response);
48
+ const finalResponse = typeof modifiedResponse === 'string' ? modifiedResponse : response;
49
+ // Empty response handling
50
+ if (!finalResponse.trim()) {
51
+ consecutiveEmpty++;
52
+ handlers.onEmptyResponse?.(step, consecutiveEmpty);
53
+ if (consecutiveEmpty >= 3) {
54
+ logWarn(caller || 'REACT', `3 consecutive empty responses, stopping`);
55
+ break;
56
+ }
57
+ messages.push({ role: 'assistant', content: finalResponse });
58
+ messages.push({ role: 'user', content: 'Continue.' });
59
+ continue;
60
+ }
61
+ consecutiveEmpty = 0;
62
+ lastResponse = finalResponse;
63
+ messages.push({ role: 'assistant', content: finalResponse });
64
+ // Parse tool calls
65
+ const allJsonRaw = extractAllToolCalls(finalResponse);
66
+ const validCalls = [];
67
+ for (const jsonRaw of allJsonRaw) {
68
+ let p = null;
69
+ try {
70
+ p = JSON.parse(jsonrepair(jsonRaw));
71
+ }
72
+ catch {
73
+ try {
74
+ p = JSON.parse(jsonRaw);
75
+ }
76
+ catch { /* skip */ }
77
+ }
78
+ if (p) {
79
+ const v = validateToolCall(p);
80
+ if (v.valid)
81
+ validCalls.push({ parsed: p, cmd: v.cmd });
82
+ }
83
+ }
84
+ // No tool calls — done
85
+ if (validCalls.length === 0) {
86
+ logDebug(caller || 'REACT', `no valid tool calls at step ${step}, done`);
87
+ break;
88
+ }
89
+ // Process tool calls
90
+ let shouldBreak = false;
91
+ for (const call of validCalls) {
92
+ const { parsed, cmd } = call;
93
+ const isBash = parsed.name === 'bash';
94
+ const toolId = `${caller || 'react'}-${Date.now()}-${step}-${Math.random().toString(36).slice(2, 6)}`;
95
+ const result = await handlers.onToolCall?.(step, parsed, cmd, isBash, toolId);
96
+ if (result) {
97
+ messages.push({
98
+ role: 'tool',
99
+ content: result.output.slice(0, 8000),
100
+ tool_call_id: toolId,
101
+ });
102
+ if (result.breakLoop) {
103
+ shouldBreak = true;
104
+ break;
105
+ }
106
+ }
107
+ }
108
+ if (shouldBreak)
109
+ break;
110
+ await handlers.onStepEnd?.(step);
111
+ }
112
+ return {
113
+ messages,
114
+ response: lastResponse,
115
+ steps: messages.filter(m => m.role === 'assistant').length,
116
+ aborted,
117
+ };
118
+ }
119
+ //# sourceMappingURL=react-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-loop.js","sourceRoot":"","sources":["../../src/agent/react-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { ToolHandler, ToolResult, ToolContext, ParsedToolCall } from '../tools/types.js';
2
+ import type { PluginManager } from '../plugins/manager.js';
3
+ /** Результат выполнения ToolExecutor */
4
+ export interface ExecutorResult {
5
+ result: ToolResult;
6
+ /** Время выполнения в секундах */
7
+ elapsed: number;
8
+ }
9
+ /**
10
+ * Диспетчер инструментов.
11
+ *
12
+ * Пайплайн для каждого tool call:
13
+ * 1. pre-hooks (runPreToolUseHooks) — могут заблокировать выполнение
14
+ * 2. handler.execute() — выполнение инструмента
15
+ * 3. post-hooks (runPostToolUseHooks)
16
+ * 4. Уведомление indexer (для модифицирующих инструментов)
17
+ * 5. Обрезка вывода (truncateOutput)
18
+ */
19
+ export declare class ToolExecutor {
20
+ private handlers;
21
+ private pluginManager?;
22
+ /** Установка менеджера плагинов */
23
+ setPluginManager(pm: PluginManager): void;
24
+ /** Регистрация обработчика инструмента */
25
+ register(handler: ToolHandler): void;
26
+ /** Регистрация нескольких обработчиков */
27
+ registerAll(handlers: ToolHandler[]): void;
28
+ /** Проверка существования обработчика */
29
+ has(name: string): boolean;
30
+ /** Получение обработчика по имени */
31
+ get(name: string): ToolHandler | undefined;
32
+ /** Получение определений всех инструментов для LLM */
33
+ getDefinitions(): import("../tools/types.js").ToolDefinition[];
34
+ /**
35
+ * Выполнение tool call через пайплайн.
36
+ *
37
+ * @param call - инструментальный вызов из LLM
38
+ * @param context - контекст выполнения (cwd, renderer и т.д.)
39
+ * @param hookCmd - строка для хуков (bash command или tool name + args)
40
+ * @returns результат выполнения с обрезанным выводом
41
+ */
42
+ execute(call: ParsedToolCall, context: ToolContext, hookCmd: string): Promise<ExecutorResult>;
43
+ }
44
+ //# sourceMappingURL=tool-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../src/agent/tool-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAI9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAwD3D,wCAAwC;AACxC,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAuC;IACvD,OAAO,CAAC,aAAa,CAAC,CAAgB;IAEtC,mCAAmC;IACnC,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAIzC,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAIpC,0CAA0C;IAC1C,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI;IAM1C,yCAAyC;IACzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,qCAAqC;IACrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C,sDAAsD;IACtD,cAAc;IAId;;;;;;;OAOG;IACG,OAAO,CACX,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC;CA4F3B"}
@@ -0,0 +1,186 @@
1
+ import { runPreToolUseHooks, runPostToolUseHooks } from '../tools/hooks.js';
2
+ import { notifyFileChanged } from '../indexer/cache.js';
3
+ import { invalidateSystemPromptCache } from './system-prompt.js';
4
+ /**
5
+ * Диспетчер инструментов с пайплайном: pre-hooks → execute → post-hooks → truncate.
6
+ *
7
+ * ToolExecutor — чистый диспетчер. Никакой domain-логики.
8
+ * Вся поведенческая логика (plan enforcement, write streak, syntax check)
9
+ * остаётся в loop.ts.
10
+ *
11
+ * @module agent/tool-executor
12
+ */
13
+ /** Инструменты, которые модифицируют файловую систему */
14
+ const MODIFYING_TOOLS = new Set(['write_file', 'edit_file', 'delete_file', 'copy_file', 'move_file']);
15
+ /** Извлекает пути изменённых файлов из аргументов инструмента */
16
+ function getChangedFilePaths(toolName, args) {
17
+ const normalize = (p) => String(p ?? '').replace(/\\/g, '/');
18
+ switch (toolName) {
19
+ case 'write_file': return [normalize(args.path)];
20
+ case 'edit_file': return [normalize(args.path)];
21
+ case 'delete_file': return [normalize(args.path)];
22
+ case 'copy_file': return [normalize(args.destination)];
23
+ case 'move_file': return [normalize(args.source), normalize(args.destination)];
24
+ default: return [];
25
+ }
26
+ }
27
+ /** Лимиты обрезки вывода по инструментам (в символах) */
28
+ const TRUNCATION_LIMITS = {
29
+ read_file: 2000,
30
+ write_file: 200,
31
+ edit_file: 300,
32
+ bash: 1500,
33
+ list_dir: 1500,
34
+ glob_search: 1000,
35
+ grep_search: 1500,
36
+ tree: 1500,
37
+ subagent: 500,
38
+ web_search: 1000,
39
+ web_fetch: 1500,
40
+ };
41
+ const DEFAULT_LIMIT = 800;
42
+ const ERROR_LIMIT = 3000;
43
+ /** Обрезка вывода инструмента для экономии токенов */
44
+ function truncateOutput(toolName, output, exitCode) {
45
+ if (exitCode !== 0) {
46
+ return output.length > ERROR_LIMIT ? output.slice(0, ERROR_LIMIT) + '\n...[truncated]' : output;
47
+ }
48
+ const limit = TRUNCATION_LIMITS[toolName] ?? DEFAULT_LIMIT;
49
+ if (output.length <= limit)
50
+ return output;
51
+ return output.slice(0, limit) + '\n...[truncated]';
52
+ }
53
+ /**
54
+ * Диспетчер инструментов.
55
+ *
56
+ * Пайплайн для каждого tool call:
57
+ * 1. pre-hooks (runPreToolUseHooks) — могут заблокировать выполнение
58
+ * 2. handler.execute() — выполнение инструмента
59
+ * 3. post-hooks (runPostToolUseHooks)
60
+ * 4. Уведомление indexer (для модифицирующих инструментов)
61
+ * 5. Обрезка вывода (truncateOutput)
62
+ */
63
+ export class ToolExecutor {
64
+ handlers = new Map();
65
+ pluginManager;
66
+ /** Установка менеджера плагинов */
67
+ setPluginManager(pm) {
68
+ this.pluginManager = pm;
69
+ }
70
+ /** Регистрация обработчика инструмента */
71
+ register(handler) {
72
+ this.handlers.set(handler.name, handler);
73
+ }
74
+ /** Регистрация нескольких обработчиков */
75
+ registerAll(handlers) {
76
+ for (const h of handlers) {
77
+ this.register(h);
78
+ }
79
+ }
80
+ /** Проверка существования обработчика */
81
+ has(name) {
82
+ return this.handlers.has(name);
83
+ }
84
+ /** Получение обработчика по имени */
85
+ get(name) {
86
+ return this.handlers.get(name);
87
+ }
88
+ /** Получение определений всех инструментов для LLM */
89
+ getDefinitions() {
90
+ return Array.from(this.handlers.values()).map(h => h.definition);
91
+ }
92
+ /**
93
+ * Выполнение tool call через пайплайн.
94
+ *
95
+ * @param call - инструментальный вызов из LLM
96
+ * @param context - контекст выполнения (cwd, renderer и т.д.)
97
+ * @param hookCmd - строка для хуков (bash command или tool name + args)
98
+ * @returns результат выполнения с обрезанным выводом
99
+ */
100
+ async execute(call, context, hookCmd) {
101
+ const start = performance.now();
102
+ // 1. Pre-hooks
103
+ const preHook = runPreToolUseHooks(context.cwd, call.name, hookCmd);
104
+ if (!preHook.continue) {
105
+ return {
106
+ result: {
107
+ stdout: '',
108
+ stderr: `Hook blocked: ${preHook.message || ''}`,
109
+ exitCode: 1,
110
+ truncated: false,
111
+ },
112
+ elapsed: (performance.now() - start) / 1000,
113
+ };
114
+ }
115
+ // 1.5. Plugin: tool:before
116
+ if (this.pluginManager) {
117
+ try {
118
+ await this.pluginManager.emit('tool:before', call.name, call.arguments);
119
+ }
120
+ catch (e) {
121
+ if (e.name === 'PluginError') {
122
+ return {
123
+ result: { stdout: '', stderr: 'Plugin blocked: ' + e.message, exitCode: 1, truncated: false },
124
+ elapsed: (performance.now() - start) / 1000,
125
+ };
126
+ }
127
+ }
128
+ }
129
+ // 2. Execute handler
130
+ const handler = this.handlers.get(call.name);
131
+ if (!handler) {
132
+ return {
133
+ result: {
134
+ stdout: '',
135
+ stderr: `Unknown tool: ${call.name}`,
136
+ exitCode: 1,
137
+ truncated: false,
138
+ },
139
+ elapsed: (performance.now() - start) / 1000,
140
+ };
141
+ }
142
+ let result;
143
+ try {
144
+ result = await handler.execute(call.arguments, context);
145
+ }
146
+ catch (e) {
147
+ result = {
148
+ stdout: '',
149
+ stderr: `Tool error: ${e.message}`,
150
+ exitCode: 1,
151
+ truncated: false,
152
+ };
153
+ }
154
+ // 3. Post-hooks
155
+ runPostToolUseHooks(context.cwd, call.name, hookCmd, result.stdout, result.exitCode);
156
+ // 3.5. Plugin: tool:after
157
+ if (this.pluginManager) {
158
+ try {
159
+ await this.pluginManager.emit('tool:after', call.name, result);
160
+ }
161
+ catch { /* plugin errors non-fatal in post */ }
162
+ }
163
+ // 4. Notify indexer (для модифицирующих инструментов)
164
+ if (result.exitCode === 0 && MODIFYING_TOOLS.has(call.name)) {
165
+ const paths = getChangedFilePaths(call.name, call.arguments);
166
+ for (const p of paths) {
167
+ notifyFileChanged(p);
168
+ }
169
+ invalidateSystemPromptCache();
170
+ }
171
+ // 5. Truncate output
172
+ const truncatedStdout = truncateOutput(call.name, result.stdout, result.exitCode);
173
+ const truncatedStderr = truncateOutput(call.name, result.stderr, result.exitCode);
174
+ const elapsed = (performance.now() - start) / 1000;
175
+ return {
176
+ result: {
177
+ ...result,
178
+ stdout: truncatedStdout,
179
+ stderr: truncatedStderr,
180
+ truncated: result.truncated || truncatedStdout !== result.stdout || truncatedStderr !== result.stderr,
181
+ },
182
+ elapsed,
183
+ };
184
+ }
185
+ }
186
+ //# sourceMappingURL=tool-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.js","sourceRoot":"","sources":["../../src/agent/tool-executor.ts"],"names":[],"mappings":"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"}
@@ -45,12 +45,13 @@ export interface AgentConfig {
45
45
  toolTimeout: number;
46
46
  maxOutputLength: number;
47
47
  showThinking?: boolean;
48
+ /** @deprecated Используйте ModeRegistry вместо этого */
48
49
  mode?: AgentMode;
49
50
  /** Макс. токенов для загруженных скилов в system prompt (default: 4000) */
50
51
  skillTokenBudget?: number;
51
- /** Макс. количество скилов в base mode (default: 2, 0 = безлимит) */
52
+ /** @deprecated Используйте ModeRegistry.maxSkills вместо этого */
52
53
  maxSkillsBase?: number;
53
- /** Макс. количество скилов в pro mode (default: 0 = безлимит) */
54
+ /** @deprecated Используйте ModeRegistry.maxSkills вместо этого */
54
55
  maxSkillsPro?: number;
55
56
  }
56
57
  /** Режимы работы агента: fast (без скилов), base (обычный), pro (с grill-me) */
@@ -61,5 +62,7 @@ export interface AppConfig {
61
62
  active: ActiveConfig;
62
63
  agent: AgentConfig;
63
64
  theme?: string;
65
+ /** Кастомные режимы (overrides для ModeRegistry) */
66
+ modes?: Record<string, Record<string, unknown>>;
64
67
  }
65
68
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACrC;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,0BAA0B;AAC1B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACrC;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uBAAuB;AACvB,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wDAAwD;IACxD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,gFAAgF;AAChF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEhD,qCAAqC;AACrC,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACjD"}
@@ -0,0 +1,12 @@
1
+ import type { AgentPlugin } from '../types.js';
2
+ /**
3
+ * Адаптер: оборачивает существующие hooks (.mma/hooks.json) как плагин.
4
+ *
5
+ * Позволяет перейти от hooks к plugin system без потери совместимости.
6
+ * preToolUse → tool:before event
7
+ * postToolUse → tool:after event
8
+ *
9
+ * @module plugins/adapters/hooks-adapter
10
+ */
11
+ export declare function createHooksAdapter(): AgentPlugin;
12
+ //# sourceMappingURL=hooks-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-adapter.d.ts","sourceRoot":"","sources":["../../../src/plugins/adapters/hooks-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AAG9D;;;;;;;;GAQG;AAEH,wBAAgB,kBAAkB,IAAI,WAAW,CAchD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Адаптер: оборачивает существующие hooks (.mma/hooks.json) как плагин.
3
+ *
4
+ * Позволяет перейти от hooks к plugin system без потери совместимости.
5
+ * preToolUse → tool:before event
6
+ * postToolUse → tool:after event
7
+ *
8
+ * @module plugins/adapters/hooks-adapter
9
+ */
10
+ export function createHooksAdapter() {
11
+ return {
12
+ name: 'hooks-adapter',
13
+ version: '1.0.0',
14
+ description: 'Wraps .mma/hooks.json as a plugin',
15
+ on(_event, handler) {
16
+ // Not used — we register via the plugin's on() method
17
+ },
18
+ async onActivate(ctx) {
19
+ ctx.logger.info('hooks-adapter: active (legacy hooks will run via ToolExecutor)');
20
+ },
21
+ };
22
+ }
23
+ //# sourceMappingURL=hooks-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-adapter.js","sourceRoot":"","sources":["../../../src/plugins/adapters/hooks-adapter.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,mCAAmC;QAEhD,EAAE,CAAC,MAAM,EAAE,OAAO;YAChB,sDAAsD;QACxD,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,GAAkB;YACjC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { PluginManifest } from './types.js';
2
+ import type { PluginManager } from './manager.js';
3
+ /**
4
+ * Загружает все плагины из директорий поиска.
5
+ */
6
+ export declare function loadAllPlugins(manager: PluginManager): Promise<void>;
7
+ /**
8
+ * Включает hot-reload для плагина.
9
+ *
10
+ * При изменении entry point файла — деактивирует и перезагружает плагин.
11
+ */
12
+ export declare function enableHotReload(pluginDir: string, manifest: PluginManifest, manager: PluginManager, reloadCallback?: (name: string) => void): () => void;
13
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgGlD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,aAAa,EACtB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GACtC,MAAM,IAAI,CAkCZ"}
@@ -0,0 +1,145 @@
1
+ import { existsSync, readFileSync, readdirSync, watch } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { logInfo, logWarn, logError } from '../logger.js';
5
+ /**
6
+ * Загрузчик плагинов.
7
+ *
8
+ * Discovery:
9
+ * - ~/.mma/plugins/ — глобальные
10
+ * - .mma/plugins/ — проектные
11
+ *
12
+ * Hot-reload: fs.watch на директорию плагина.
13
+ *
14
+ * @module plugins/loader
15
+ */
16
+ /** Директории поиска плагинов */
17
+ const PLUGIN_DIRS = [
18
+ join(process.env.HOME || process.env.USERPROFILE || '', '.mma', 'plugins'),
19
+ '.mma/plugins',
20
+ ];
21
+ /**
22
+ * Сканирует директорию на наличие плагинов.
23
+ * Плагин = директория с manifest.json.
24
+ */
25
+ function scanPluginDir(dir) {
26
+ if (!existsSync(dir))
27
+ return [];
28
+ const plugins = [];
29
+ try {
30
+ const entries = readdirSync(dir, { withFileTypes: true });
31
+ for (const entry of entries) {
32
+ if (!entry.isDirectory())
33
+ continue;
34
+ const manifestPath = join(dir, entry.name, 'manifest.json');
35
+ if (existsSync(manifestPath)) {
36
+ plugins.push(join(dir, entry.name));
37
+ }
38
+ }
39
+ }
40
+ catch { /* ignore */ }
41
+ return plugins;
42
+ }
43
+ /**
44
+ * Загружает манифест плагина.
45
+ */
46
+ function loadManifest(pluginDir) {
47
+ const manifestPath = join(pluginDir, 'manifest.json');
48
+ try {
49
+ const content = readFileSync(manifestPath, 'utf-8');
50
+ const manifest = JSON.parse(content);
51
+ if (!manifest.name || !manifest.entry) {
52
+ logWarn('PLUGIN', `Invalid manifest in ${pluginDir}: missing name or entry`);
53
+ return null;
54
+ }
55
+ return manifest;
56
+ }
57
+ catch (e) {
58
+ logError('PLUGIN', `Failed to load manifest ${manifestPath}: ${e.message}`);
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * Загружает плагин из директории.
64
+ *
65
+ * Entry point может быть .ts (загружается через tsx) или .js/.mjs.
66
+ */
67
+ async function loadPluginFromDir(pluginDir) {
68
+ const manifest = loadManifest(pluginDir);
69
+ if (!manifest)
70
+ return null;
71
+ const entryPath = join(pluginDir, manifest.entry);
72
+ try {
73
+ // Используем dynamic import для загрузки модуля
74
+ const moduleUrl = pathToFileURL(entryPath).href;
75
+ const mod = await import(moduleUrl);
76
+ // Экспорт по умолчанию — фабрика плагина
77
+ const createPlugin = mod.default || mod;
78
+ const plugin = typeof createPlugin === 'function'
79
+ ? createPlugin()
80
+ : createPlugin;
81
+ if (!plugin.name) {
82
+ logWarn('PLUGIN', `Plugin from ${pluginDir} has no name`);
83
+ return null;
84
+ }
85
+ return plugin;
86
+ }
87
+ catch (e) {
88
+ logError('PLUGIN', `Failed to load plugin from ${pluginDir}: ${e.message}`);
89
+ return null;
90
+ }
91
+ }
92
+ /**
93
+ * Загружает все плагины из директорий поиска.
94
+ */
95
+ export async function loadAllPlugins(manager) {
96
+ for (const dir of PLUGIN_DIRS) {
97
+ const pluginDirs = scanPluginDir(dir);
98
+ for (const pluginDir of pluginDirs) {
99
+ const plugin = await loadPluginFromDir(pluginDir);
100
+ if (plugin) {
101
+ manager.register(plugin);
102
+ }
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Включает hot-reload для плагина.
108
+ *
109
+ * При изменении entry point файла — деактивирует и перезагружает плагин.
110
+ */
111
+ export function enableHotReload(pluginDir, manifest, manager, reloadCallback) {
112
+ const entryPath = join(pluginDir, manifest.entry);
113
+ let debounceTimer = null;
114
+ try {
115
+ const watcher = watch(entryPath, async (eventType) => {
116
+ if (eventType !== 'change')
117
+ return;
118
+ // Debounce — ждём 500ms после последнего изменения
119
+ if (debounceTimer)
120
+ clearTimeout(debounceTimer);
121
+ debounceTimer = setTimeout(async () => {
122
+ logInfo('PLUGIN', `hot-reload: ${manifest.name} changed, reloading...`);
123
+ // Деактивируем старый
124
+ await manager.deactivate(manifest.name);
125
+ // Перезагружаем
126
+ const plugin = await loadPluginFromDir(pluginDir);
127
+ if (plugin) {
128
+ manager.register(plugin);
129
+ reloadCallback?.(manifest.name);
130
+ logInfo('PLUGIN', `hot-reload: ${manifest.name} reloaded`);
131
+ }
132
+ }, 500);
133
+ });
134
+ return () => {
135
+ if (debounceTimer)
136
+ clearTimeout(debounceTimer);
137
+ watcher.close();
138
+ };
139
+ }
140
+ catch (e) {
141
+ logWarn('PLUGIN', `hot-reload not available for ${pluginDir}: ${e.message}`);
142
+ return () => { };
143
+ }
144
+ }
145
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}