@yuaone/core 0.1.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.
Files changed (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,125 @@
1
+ /**
2
+ * @module parallel-executor
3
+ * @description 병렬 실행 관리자 — 다수의 서브 에이전트를 동시성 제한 내에서 병렬 실행.
4
+ *
5
+ * DAGOrchestrator가 의존성 순서를 결정하고, ParallelExecutor는
6
+ * 독립적인 태스크 배치를 maxParallel 제한 내에서 동시에 실행한다.
7
+ *
8
+ * 각 태스크는 격리된 SubAgent로 실행되며,
9
+ * 하나가 실패해도 나머지는 계속 진행한다 (fault isolation).
10
+ */
11
+ import { EventEmitter } from "node:events";
12
+ import type { BYOKConfig, ToolExecutor } from "./types.js";
13
+ import { type SubAgentResult, type DAGContextLike } from "./sub-agent.js";
14
+ /** Configuration for the ParallelExecutor */
15
+ export interface ParallelExecutorConfig {
16
+ /** Maximum number of sub-agents running concurrently */
17
+ maxParallel: number;
18
+ /** Default BYOK configuration for LLM calls (used when no per-task override) */
19
+ byokConfig: BYOKConfig;
20
+ /** Absolute path to the project root */
21
+ projectPath: string;
22
+ /** Factory to create a ToolExecutor scoped to a working directory */
23
+ createToolExecutor: (workDir: string, enabledTools?: string[]) => ToolExecutor;
24
+ /**
25
+ * Optional callback to resolve a per-task BYOK configuration.
26
+ * Called for each task before execution. If it returns a config, that config
27
+ * is used instead of the default `byokConfig`. If not provided or returns
28
+ * undefined, the task's `byokOverride` or the default config is used.
29
+ *
30
+ * Resolution order: task.byokOverride > modelResolver(task) > byokConfig
31
+ */
32
+ modelResolver?: (task: PlannedTaskLike) => BYOKConfig | undefined;
33
+ }
34
+ /** Task input compatible with PlannedTask from types.ts */
35
+ export interface PlannedTaskLike {
36
+ /** Unique task identifier */
37
+ id: string;
38
+ /** Task goal description */
39
+ goal: string;
40
+ /** Files this task is allowed to write */
41
+ targetFiles: string[];
42
+ /** Files this task may read (read-only) */
43
+ readFiles: string[];
44
+ /** Tool names to enable */
45
+ tools: string[];
46
+ /** Estimated number of iterations */
47
+ estimatedIterations: number;
48
+ /** Priority (0–10, higher = more urgent) */
49
+ priority: number;
50
+ /** Optional per-task BYOK config override */
51
+ byokOverride?: BYOKConfig;
52
+ }
53
+ export interface ParallelExecutorEvents {
54
+ "parallel:start": (taskIds: string[], maxParallel: number) => void;
55
+ "parallel:task_start": (taskId: string) => void;
56
+ "parallel:task_complete": (result: SubAgentResult) => void;
57
+ "parallel:all_complete": (results: SubAgentResult[]) => void;
58
+ }
59
+ /**
60
+ * ParallelExecutor — coordinates multiple sub-agents with concurrency control.
61
+ *
62
+ * Uses a semaphore pattern: maintains a count of running tasks and spawns
63
+ * new ones as slots become available. Tasks within a batch are independent
64
+ * (dependency ordering is handled by the DAGOrchestrator layer above).
65
+ *
66
+ * @example
67
+ * ```typescript
68
+ * const executor = new ParallelExecutor({
69
+ * maxParallel: 3,
70
+ * byokConfig: { provider: "anthropic", apiKey: "..." },
71
+ * projectPath: "/project",
72
+ * createToolExecutor: (dir, tools) => createExecutor(dir, tools),
73
+ * });
74
+ *
75
+ * executor.on("parallel:task_complete", (result) => {
76
+ * console.log(`${result.taskId}: ${result.success ? "OK" : "FAIL"}`);
77
+ * });
78
+ *
79
+ * const results = await executor.executeBatch(tasks, dagContext);
80
+ * ```
81
+ */
82
+ export declare class ParallelExecutor extends EventEmitter {
83
+ private readonly config;
84
+ private readonly runningAgents;
85
+ private abortedAll;
86
+ constructor(config: ParallelExecutorConfig);
87
+ /**
88
+ * Execute multiple tasks in parallel, respecting the max concurrency limit.
89
+ *
90
+ * Tasks are independent — no dependency ordering is performed here
91
+ * (that is the DAGOrchestrator's responsibility). Tasks are sorted by
92
+ * priority (highest first) and launched as concurrency slots open.
93
+ *
94
+ * If one task fails, others continue to completion (fault isolation).
95
+ *
96
+ * @param tasks Array of planned tasks to execute
97
+ * @param dagContext DAG-level context passed to each sub-agent
98
+ * @returns Array of results, one per task, in completion order
99
+ */
100
+ executeBatch(tasks: PlannedTaskLike[], dagContext: DAGContextLike): Promise<SubAgentResult[]>;
101
+ /**
102
+ * Get the task IDs of currently running sub-agents.
103
+ * @returns Array of task ID strings
104
+ */
105
+ getRunningTasks(): string[];
106
+ /**
107
+ * Abort all running sub-agents.
108
+ * Each sub-agent will finish its current iteration and then stop.
109
+ */
110
+ abortAll(): void;
111
+ /**
112
+ * Run a single task as a SubAgent and return the result.
113
+ */
114
+ /**
115
+ * Resolve the BYOK configuration for a specific task.
116
+ *
117
+ * Resolution order (first non-undefined wins):
118
+ * 1. task.byokOverride — explicit per-task override
119
+ * 2. config.modelResolver(task) — dynamic callback resolution
120
+ * 3. config.byokConfig — batch-level default
121
+ */
122
+ private resolveByokConfig;
123
+ private runTask;
124
+ }
125
+ //# sourceMappingURL=parallel-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-executor.d.ts","sourceRoot":"","sources":["../src/parallel-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAIxB,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,EAAE,UAAU,CAAC;IACvB,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,kBAAkB,EAAE,CAClB,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EAAE,KACpB,YAAY,CAAC;IAClB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,UAAU,GAAG,SAAS,CAAC;CACnE;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAID,MAAM,WAAW,sBAAsB;IACrC,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,qBAAqB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,wBAAwB,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC3D,uBAAuB,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC9D;AAID;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,EAAE,sBAAsB;IAK1C;;;;;;;;;;;;OAYG;IACG,YAAY,CAChB,KAAK,EAAE,eAAe,EAAE,EACxB,UAAU,EAAE,cAAc,GACzB,OAAO,CAAC,cAAc,EAAE,CAAC;IAsF5B;;;OAGG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAShB;;OAEG;IACH;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;YAMX,OAAO;CAiDtB"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * @module parallel-executor
3
+ * @description 병렬 실행 관리자 — 다수의 서브 에이전트를 동시성 제한 내에서 병렬 실행.
4
+ *
5
+ * DAGOrchestrator가 의존성 순서를 결정하고, ParallelExecutor는
6
+ * 독립적인 태스크 배치를 maxParallel 제한 내에서 동시에 실행한다.
7
+ *
8
+ * 각 태스크는 격리된 SubAgent로 실행되며,
9
+ * 하나가 실패해도 나머지는 계속 진행한다 (fault isolation).
10
+ */
11
+ import { EventEmitter } from "node:events";
12
+ import { SubAgent, } from "./sub-agent.js";
13
+ // ─── ParallelExecutor Class ───
14
+ /**
15
+ * ParallelExecutor — coordinates multiple sub-agents with concurrency control.
16
+ *
17
+ * Uses a semaphore pattern: maintains a count of running tasks and spawns
18
+ * new ones as slots become available. Tasks within a batch are independent
19
+ * (dependency ordering is handled by the DAGOrchestrator layer above).
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const executor = new ParallelExecutor({
24
+ * maxParallel: 3,
25
+ * byokConfig: { provider: "anthropic", apiKey: "..." },
26
+ * projectPath: "/project",
27
+ * createToolExecutor: (dir, tools) => createExecutor(dir, tools),
28
+ * });
29
+ *
30
+ * executor.on("parallel:task_complete", (result) => {
31
+ * console.log(`${result.taskId}: ${result.success ? "OK" : "FAIL"}`);
32
+ * });
33
+ *
34
+ * const results = await executor.executeBatch(tasks, dagContext);
35
+ * ```
36
+ */
37
+ export class ParallelExecutor extends EventEmitter {
38
+ config;
39
+ runningAgents = new Map();
40
+ abortedAll = false;
41
+ constructor(config) {
42
+ super();
43
+ this.config = config;
44
+ }
45
+ /**
46
+ * Execute multiple tasks in parallel, respecting the max concurrency limit.
47
+ *
48
+ * Tasks are independent — no dependency ordering is performed here
49
+ * (that is the DAGOrchestrator's responsibility). Tasks are sorted by
50
+ * priority (highest first) and launched as concurrency slots open.
51
+ *
52
+ * If one task fails, others continue to completion (fault isolation).
53
+ *
54
+ * @param tasks Array of planned tasks to execute
55
+ * @param dagContext DAG-level context passed to each sub-agent
56
+ * @returns Array of results, one per task, in completion order
57
+ */
58
+ async executeBatch(tasks, dagContext) {
59
+ if (tasks.length === 0)
60
+ return [];
61
+ this.abortedAll = false;
62
+ const taskIds = tasks.map((t) => t.id);
63
+ this.emit("parallel:start", taskIds, this.config.maxParallel);
64
+ // Sort by priority descending (higher priority first)
65
+ const sortedTasks = [...tasks].sort((a, b) => b.priority - a.priority);
66
+ const results = [];
67
+ const pending = [...sortedTasks];
68
+ // Use a promise-based semaphore pattern
69
+ const inFlight = new Set();
70
+ while (pending.length > 0 || inFlight.size > 0) {
71
+ if (this.abortedAll) {
72
+ // Drain pending without executing
73
+ for (const task of pending) {
74
+ results.push({
75
+ taskId: task.id,
76
+ success: false,
77
+ summary: "Aborted: parallel executor was cancelled",
78
+ changedFiles: [],
79
+ tokensUsed: { input: 0, output: 0 },
80
+ iterations: 0,
81
+ phase: "cleanup",
82
+ error: "Aborted by orchestrator",
83
+ });
84
+ }
85
+ pending.length = 0;
86
+ // Wait for in-flight to finish (they were already aborted)
87
+ if (inFlight.size > 0) {
88
+ const remaining = await Promise.allSettled([...inFlight]);
89
+ for (const settled of remaining) {
90
+ if (settled.status === "fulfilled") {
91
+ results.push(settled.value);
92
+ }
93
+ }
94
+ inFlight.clear();
95
+ }
96
+ break;
97
+ }
98
+ // Fill up to maxParallel slots
99
+ while (pending.length > 0 &&
100
+ inFlight.size < this.config.maxParallel &&
101
+ !this.abortedAll) {
102
+ const task = pending.shift();
103
+ const promise = this.runTask(task, dagContext);
104
+ inFlight.add(promise);
105
+ // When this task completes, remove from in-flight and collect result
106
+ promise.then((result) => {
107
+ inFlight.delete(promise);
108
+ results.push(result);
109
+ this.runningAgents.delete(task.id);
110
+ this.emit("parallel:task_complete", result);
111
+ }).catch((err) => {
112
+ inFlight.delete(promise);
113
+ this.runningAgents.delete(task.id);
114
+ this.emit("parallel:task_error", { taskId: task.id, error: err });
115
+ });
116
+ }
117
+ // Wait for at least one task to complete before continuing
118
+ if (inFlight.size > 0) {
119
+ await Promise.race([...inFlight]);
120
+ }
121
+ }
122
+ this.emit("parallel:all_complete", results);
123
+ return results;
124
+ }
125
+ /**
126
+ * Get the task IDs of currently running sub-agents.
127
+ * @returns Array of task ID strings
128
+ */
129
+ getRunningTasks() {
130
+ return [...this.runningAgents.keys()];
131
+ }
132
+ /**
133
+ * Abort all running sub-agents.
134
+ * Each sub-agent will finish its current iteration and then stop.
135
+ */
136
+ abortAll() {
137
+ this.abortedAll = true;
138
+ for (const [, agent] of this.runningAgents) {
139
+ agent.abort();
140
+ }
141
+ }
142
+ // ─── Private ───
143
+ /**
144
+ * Run a single task as a SubAgent and return the result.
145
+ */
146
+ /**
147
+ * Resolve the BYOK configuration for a specific task.
148
+ *
149
+ * Resolution order (first non-undefined wins):
150
+ * 1. task.byokOverride — explicit per-task override
151
+ * 2. config.modelResolver(task) — dynamic callback resolution
152
+ * 3. config.byokConfig — batch-level default
153
+ */
154
+ resolveByokConfig(task) {
155
+ return task.byokOverride
156
+ ?? this.config.modelResolver?.(task)
157
+ ?? this.config.byokConfig;
158
+ }
159
+ async runTask(task, dagContext) {
160
+ const taskByokConfig = this.resolveByokConfig(task);
161
+ const subAgentConfig = {
162
+ taskId: task.id,
163
+ goal: task.goal,
164
+ targetFiles: task.targetFiles,
165
+ readFiles: task.readFiles,
166
+ maxIterations: task.estimatedIterations,
167
+ projectPath: this.config.projectPath,
168
+ byokConfig: taskByokConfig,
169
+ tools: task.tools,
170
+ createToolExecutor: this.config.createToolExecutor,
171
+ priority: task.priority,
172
+ };
173
+ const agent = new SubAgent(subAgentConfig);
174
+ this.runningAgents.set(task.id, agent);
175
+ // Forward sub-agent events
176
+ agent.on("subagent:phase", (taskId, phase) => {
177
+ this.emit("subagent:phase", taskId, phase);
178
+ });
179
+ agent.on("subagent:iteration", (taskId, index, tokens) => {
180
+ this.emit("subagent:iteration", taskId, index, tokens);
181
+ });
182
+ this.emit("parallel:task_start", task.id);
183
+ try {
184
+ return await agent.run(dagContext);
185
+ }
186
+ catch (err) {
187
+ const errorMessage = err instanceof Error ? err.message : String(err);
188
+ return {
189
+ taskId: task.id,
190
+ success: false,
191
+ summary: `Unexpected error: ${errorMessage}`,
192
+ changedFiles: [],
193
+ tokensUsed: { input: 0, output: 0 },
194
+ iterations: 0,
195
+ phase: "cleanup",
196
+ error: errorMessage,
197
+ };
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=parallel-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parallel-executor.js","sourceRoot":"","sources":["../src/parallel-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EACL,QAAQ,GAIT,MAAM,gBAAgB,CAAC;AAyDxB,iCAAiC;AAEjC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAC/B,MAAM,CAAyB;IAC/B,aAAa,GAA0B,IAAI,GAAG,EAAE,CAAC;IAC1D,UAAU,GAAG,KAAK,CAAC;IAE3B,YAAY,MAA8B;QACxC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,YAAY,CAChB,KAAwB,EACxB,UAA0B;QAE1B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAI,CACP,gBAAgB,EAChB,OAAO,EACP,IAAI,CAAC,MAAM,CAAC,WAAW,CACxB,CAAC;QAEF,sDAAsD;QACtD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAClC,CAAC;QAEF,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;QAEjC,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;QAEpD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,kCAAkC;gBAClC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC;wBACX,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,OAAO,EAAE,KAAK;wBACd,OAAO,EAAE,0CAA0C;wBACnD,YAAY,EAAE,EAAE;wBAChB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;wBACnC,UAAU,EAAE,CAAC;wBACb,KAAK,EAAE,SAAS;wBAChB,KAAK,EAAE,yBAAyB;qBACjC,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;gBAEnB,2DAA2D;gBAC3D,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACtB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;oBAC1D,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;wBAChC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;4BACnC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;oBACD,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;gBACD,MAAM;YACR,CAAC;YAED,+BAA+B;YAC/B,OACE,OAAO,CAAC,MAAM,GAAG,CAAC;gBAClB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;gBACvC,CAAC,IAAI,CAAC,UAAU,EAChB,CAAC;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAG,CAAC;gBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEtB,qEAAqE;gBACrE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBACtB,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACf,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACzB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpE,CAAC,CAAC,CAAC;YACL,CAAC;YAED,2DAA2D;YAC3D,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,kBAAkB;IAElB;;OAEG;IACH;;;;;;;OAOG;IACK,iBAAiB,CAAC,IAAqB;QAC7C,OAAO,IAAI,CAAC,YAAY;eACnB,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC;eACjC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAqB,EACrB,UAA0B;QAE1B,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAEpD,MAAM,cAAc,GAAmB;YACrC,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,aAAa,EAAE,IAAI,CAAC,mBAAmB;YACvC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACpC,UAAU,EAAE,cAAc;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAClD,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEvC,2BAA2B;QAC3B,KAAK,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAc,EAAE,KAAK,EAAE,EAAE;YACnD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,MAAc,EAAE,EAAE;YAC/E,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,OAAO,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAChB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,qBAAqB,YAAY,EAAE;gBAC5C,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;gBACnC,UAAU,EAAE,CAAC;gBACb,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,YAAY;aACpB,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * @module perf-optimizer
3
+ * @description YUAN Performance Optimizer — monitors and optimizes agent execution performance.
4
+ *
5
+ * Provides:
6
+ * - Execution timing per phase and tool call
7
+ * - Token budget tracking and waste detection
8
+ * - Parallelization hint generation from task dependency graphs
9
+ * - Content-addressable caching for tool calls and LLM responses
10
+ * - Human-readable performance reports with efficiency scoring
11
+ *
12
+ * Only depends on Node builtins (crypto for cache keys).
13
+ */
14
+ /** A single performance metric sample */
15
+ export interface PerfMetric {
16
+ name: string;
17
+ category: "timing" | "tokens" | "cache" | "parallel";
18
+ value: number;
19
+ unit: string;
20
+ timestamp: number;
21
+ }
22
+ /** Aggregated metrics for a single execution phase */
23
+ export interface PhaseMetrics {
24
+ phase: string;
25
+ startTime: number;
26
+ endTime: number;
27
+ durationMs: number;
28
+ tokensUsed: {
29
+ input: number;
30
+ output: number;
31
+ };
32
+ toolCalls: number;
33
+ cacheHits: number;
34
+ cacheMisses: number;
35
+ }
36
+ /** Identified performance bottleneck with actionable suggestion */
37
+ export interface BottleneckInfo {
38
+ phase: string;
39
+ issue: string;
40
+ impact: "high" | "medium" | "low";
41
+ suggestion: string;
42
+ estimatedSavingMs?: number;
43
+ }
44
+ /** A single entry in the tool/response cache */
45
+ export interface CacheEntry {
46
+ key: string;
47
+ value: unknown;
48
+ hits: number;
49
+ createdAt: number;
50
+ lastAccessedAt: number;
51
+ sizeBytes: number;
52
+ }
53
+ /** Suggestion for tasks that could benefit from parallel execution */
54
+ export interface ParallelHint {
55
+ taskIds: string[];
56
+ currentSequentialMs: number;
57
+ estimatedParallelMs: number;
58
+ speedupFactor: number;
59
+ }
60
+ /** Complete performance report for a session */
61
+ export interface PerfReport {
62
+ sessionId: string;
63
+ totalDurationMs: number;
64
+ phases: PhaseMetrics[];
65
+ bottlenecks: BottleneckInfo[];
66
+ cacheStats: {
67
+ hits: number;
68
+ misses: number;
69
+ hitRate: number;
70
+ savedMs: number;
71
+ };
72
+ parallelHints: ParallelHint[];
73
+ tokenSummary: {
74
+ total: number;
75
+ byPhase: Record<string, number>;
76
+ wasteEstimate: number;
77
+ };
78
+ efficiencyScore: number;
79
+ suggestions: string[];
80
+ }
81
+ /** Configuration for PerfOptimizer */
82
+ export interface PerfOptimizerConfig {
83
+ /** Enable tool call caching (default: true) */
84
+ enableCaching?: boolean;
85
+ /** Maximum number of cache entries (default: 500) */
86
+ maxCacheSize?: number;
87
+ /** Maximum cache memory in bytes (default: 50MB) */
88
+ maxCacheMemory?: number;
89
+ /** Track parallelization opportunities (default: true) */
90
+ trackParallelHints?: boolean;
91
+ /** Phase is a bottleneck if it takes > X% of total time (default: 40) */
92
+ bottleneckThresholdPercent?: number;
93
+ }
94
+ /**
95
+ * Monitors and optimizes agent execution performance.
96
+ *
97
+ * Tracks phase timing, token usage, tool call durations, and caching.
98
+ * Generates actionable performance reports with bottleneck identification,
99
+ * parallelization hints, and an overall efficiency score.
100
+ */
101
+ export declare class PerfOptimizer {
102
+ private readonly config;
103
+ private activePhases;
104
+ private completedPhases;
105
+ private toolCallRecords;
106
+ private metrics;
107
+ private cache;
108
+ private totalCacheMemory;
109
+ private globalCacheHits;
110
+ private globalCacheMisses;
111
+ private previousRunDurations;
112
+ constructor(config?: PerfOptimizerConfig);
113
+ /**
114
+ * Mark the start of an execution phase.
115
+ * @param phase - Phase name (e.g. "analyze", "plan", "implement", "verify", "fix")
116
+ */
117
+ startPhase(phase: string): void;
118
+ /**
119
+ * Mark the end of an execution phase.
120
+ * @param phase - Phase name that was previously started
121
+ * @param tokens - Optional token usage for this phase
122
+ */
123
+ endPhase(phase: string, tokens?: {
124
+ input: number;
125
+ output: number;
126
+ }): void;
127
+ /**
128
+ * Record a tool call with its duration.
129
+ * Automatically tracks cache hits/misses for the active phase.
130
+ * @param tool - Tool name
131
+ * @param input - Tool input (used for cache key generation)
132
+ * @param durationMs - How long the tool call took
133
+ */
134
+ recordToolCall(tool: string, input: unknown, durationMs: number): void;
135
+ /**
136
+ * Record token usage for a specific phase.
137
+ * @param phase - Phase name
138
+ * @param input - Input tokens consumed
139
+ * @param output - Output tokens generated
140
+ */
141
+ recordTokenUsage(phase: string, input: number, output: number): void;
142
+ /**
143
+ * Retrieve a cached tool call result.
144
+ * @param tool - Tool name
145
+ * @param input - Tool input
146
+ * @returns Cached result or undefined if not found
147
+ */
148
+ getCached(tool: string, input: unknown): unknown | undefined;
149
+ /**
150
+ * Store a tool call result in the cache.
151
+ * Automatically evicts LRU entries when limits are exceeded.
152
+ * @param tool - Tool name
153
+ * @param input - Tool input
154
+ * @param result - Result to cache
155
+ */
156
+ setCached(tool: string, input: unknown, result: unknown): void;
157
+ /**
158
+ * Clear all cached entries.
159
+ */
160
+ clearCache(): void;
161
+ /**
162
+ * Identify execution bottlenecks based on phase timing and token usage.
163
+ * @returns Array of bottleneck descriptions with suggestions
164
+ */
165
+ getBottlenecks(): BottleneckInfo[];
166
+ /**
167
+ * Analyze a task dependency graph and identify parallelization opportunities.
168
+ * @param taskDeps - Map of taskId → array of dependency taskIds
169
+ * @returns Array of parallelization hints with estimated speedup
170
+ */
171
+ getParallelHints(taskDeps: Map<string, string[]>): ParallelHint[];
172
+ /**
173
+ * Calculate an overall efficiency score (0-100) based on multiple factors.
174
+ * @returns Efficiency score where 100 is optimal
175
+ */
176
+ getEfficiencyScore(): number;
177
+ /**
178
+ * Generate a complete performance report for the session.
179
+ * @param sessionId - Session identifier
180
+ * @returns Structured performance report
181
+ */
182
+ generateReport(sessionId: string): PerfReport;
183
+ /**
184
+ * Format a performance report as a human-readable string.
185
+ * @param report - Report to format
186
+ * @returns Multi-line formatted string
187
+ */
188
+ formatReport(report: PerfReport): string;
189
+ /**
190
+ * Store current run duration for future historical comparison, then reset all state.
191
+ */
192
+ reset(): void;
193
+ /** Add a metric, bounded by MAX_METRICS */
194
+ private addMetric;
195
+ /** Compute total duration from completed phases */
196
+ private getTotalDuration;
197
+ /** Generate a content-addressable hash for tool+input */
198
+ private hashInput;
199
+ /** Evict LRU cache entries until there's room */
200
+ private evictIfNeeded;
201
+ /** Remove the least recently used cache entry */
202
+ private evictLRU;
203
+ /** Count tool calls with duplicate inputs */
204
+ private countDuplicateToolCalls;
205
+ /** Estimate wasted tokens from redundant tool calls */
206
+ private estimateTokenWaste;
207
+ /** Generate actionable suggestions from bottleneck analysis */
208
+ private generateSuggestions;
209
+ /** Format milliseconds as human-readable string */
210
+ private formatMs;
211
+ }
212
+ //# sourceMappingURL=perf-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perf-optimizer.d.ts","sourceRoot":"","sources":["../src/perf-optimizer.ts"],"names":[],"mappings":"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"}