@yuaone/core 0.9.7 → 0.9.9

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 (193) hide show
  1. package/dist/__tests__/context-manager.test.js +5 -9
  2. package/dist/__tests__/context-manager.test.js.map +1 -1
  3. package/dist/agent-coordinator.d.ts +172 -0
  4. package/dist/agent-coordinator.d.ts.map +1 -0
  5. package/dist/agent-coordinator.js +390 -0
  6. package/dist/agent-coordinator.js.map +1 -0
  7. package/dist/agent-loop.d.ts +83 -29
  8. package/dist/agent-loop.d.ts.map +1 -1
  9. package/dist/agent-loop.js +697 -335
  10. package/dist/agent-loop.js.map +1 -1
  11. package/dist/agent-reputation.d.ts +72 -0
  12. package/dist/agent-reputation.d.ts.map +1 -0
  13. package/dist/agent-reputation.js +222 -0
  14. package/dist/agent-reputation.js.map +1 -0
  15. package/dist/arch-summarizer.d.ts +48 -0
  16. package/dist/arch-summarizer.d.ts.map +1 -0
  17. package/dist/arch-summarizer.js +239 -0
  18. package/dist/arch-summarizer.js.map +1 -0
  19. package/dist/autonomous/explicit-planner.d.ts +45 -0
  20. package/dist/autonomous/explicit-planner.d.ts.map +1 -0
  21. package/dist/autonomous/explicit-planner.js +99 -0
  22. package/dist/autonomous/explicit-planner.js.map +1 -0
  23. package/dist/autonomous/incident-debugger.d.ts +78 -0
  24. package/dist/autonomous/incident-debugger.d.ts.map +1 -0
  25. package/dist/autonomous/incident-debugger.js +324 -0
  26. package/dist/autonomous/incident-debugger.js.map +1 -0
  27. package/dist/autonomous/index.d.ts +15 -0
  28. package/dist/autonomous/index.d.ts.map +1 -0
  29. package/dist/autonomous/index.js +10 -0
  30. package/dist/autonomous/index.js.map +1 -0
  31. package/dist/autonomous/patch-tournament.d.ts +82 -0
  32. package/dist/autonomous/patch-tournament.d.ts.map +1 -0
  33. package/dist/autonomous/patch-tournament.js +150 -0
  34. package/dist/autonomous/patch-tournament.js.map +1 -0
  35. package/dist/autonomous/research-agent.d.ts +66 -0
  36. package/dist/autonomous/research-agent.d.ts.map +1 -0
  37. package/dist/autonomous/research-agent.js +210 -0
  38. package/dist/autonomous/research-agent.js.map +1 -0
  39. package/dist/autonomous/task-memory.d.ts +63 -0
  40. package/dist/autonomous/task-memory.d.ts.map +1 -0
  41. package/dist/autonomous/task-memory.js +143 -0
  42. package/dist/autonomous/task-memory.js.map +1 -0
  43. package/dist/budget-governor-v2.d.ts +93 -0
  44. package/dist/budget-governor-v2.d.ts.map +1 -0
  45. package/dist/budget-governor-v2.js +345 -0
  46. package/dist/budget-governor-v2.js.map +1 -0
  47. package/dist/capability-graph.d.ts +102 -0
  48. package/dist/capability-graph.d.ts.map +1 -0
  49. package/dist/capability-graph.js +397 -0
  50. package/dist/capability-graph.js.map +1 -0
  51. package/dist/capability-self-model.d.ts +144 -0
  52. package/dist/capability-self-model.d.ts.map +1 -0
  53. package/dist/capability-self-model.js +312 -0
  54. package/dist/capability-self-model.js.map +1 -0
  55. package/dist/checkpoint-manager.d.ts +94 -0
  56. package/dist/checkpoint-manager.d.ts.map +1 -0
  57. package/dist/checkpoint-manager.js +225 -0
  58. package/dist/checkpoint-manager.js.map +1 -0
  59. package/dist/continuation-engine.js +1 -1
  60. package/dist/continuation-engine.js.map +1 -1
  61. package/dist/dag-orchestrator.d.ts +0 -3
  62. package/dist/dag-orchestrator.d.ts.map +1 -1
  63. package/dist/dag-orchestrator.js +0 -1
  64. package/dist/dag-orchestrator.js.map +1 -1
  65. package/dist/evidence-chain.d.ts +99 -0
  66. package/dist/evidence-chain.d.ts.map +1 -0
  67. package/dist/evidence-chain.js +200 -0
  68. package/dist/evidence-chain.js.map +1 -0
  69. package/dist/execution-engine.d.ts.map +1 -1
  70. package/dist/execution-engine.js +0 -1
  71. package/dist/execution-engine.js.map +1 -1
  72. package/dist/failure-signature-memory.d.ts +61 -0
  73. package/dist/failure-signature-memory.d.ts.map +1 -0
  74. package/dist/failure-signature-memory.js +278 -0
  75. package/dist/failure-signature-memory.js.map +1 -0
  76. package/dist/index.d.ts +52 -5
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +48 -7
  79. package/dist/index.js.map +1 -1
  80. package/dist/language-detector.d.ts.map +1 -1
  81. package/dist/language-detector.js +122 -43
  82. package/dist/language-detector.js.map +1 -1
  83. package/dist/llm-client.d.ts +0 -7
  84. package/dist/llm-client.d.ts.map +1 -1
  85. package/dist/llm-client.js +15 -122
  86. package/dist/llm-client.js.map +1 -1
  87. package/dist/mcp-client.js +1 -1
  88. package/dist/mcp-client.js.map +1 -1
  89. package/dist/memory.d.ts.map +1 -1
  90. package/dist/memory.js +0 -15
  91. package/dist/memory.js.map +1 -1
  92. package/dist/meta-learning-collector.d.ts +64 -0
  93. package/dist/meta-learning-collector.d.ts.map +1 -0
  94. package/dist/meta-learning-collector.js +169 -0
  95. package/dist/meta-learning-collector.js.map +1 -0
  96. package/dist/meta-learning-engine.d.ts +61 -0
  97. package/dist/meta-learning-engine.d.ts.map +1 -0
  98. package/dist/meta-learning-engine.js +250 -0
  99. package/dist/meta-learning-engine.js.map +1 -0
  100. package/dist/overhead-governor.d.ts +105 -0
  101. package/dist/overhead-governor.d.ts.map +1 -0
  102. package/dist/overhead-governor.js +239 -0
  103. package/dist/overhead-governor.js.map +1 -0
  104. package/dist/playbook-library.d.ts +75 -0
  105. package/dist/playbook-library.d.ts.map +1 -0
  106. package/dist/playbook-library.js +241 -0
  107. package/dist/playbook-library.js.map +1 -0
  108. package/dist/project-executive.d.ts +97 -0
  109. package/dist/project-executive.d.ts.map +1 -0
  110. package/dist/project-executive.js +223 -0
  111. package/dist/project-executive.js.map +1 -0
  112. package/dist/research-loop.d.ts +79 -0
  113. package/dist/research-loop.d.ts.map +1 -0
  114. package/dist/research-loop.js +363 -0
  115. package/dist/research-loop.js.map +1 -0
  116. package/dist/resolve-memory-path.d.ts +32 -0
  117. package/dist/resolve-memory-path.d.ts.map +1 -0
  118. package/dist/resolve-memory-path.js +97 -0
  119. package/dist/resolve-memory-path.js.map +1 -0
  120. package/dist/safe-bounds.d.ts +101 -0
  121. package/dist/safe-bounds.d.ts.map +1 -0
  122. package/dist/safe-bounds.js +140 -0
  123. package/dist/safe-bounds.js.map +1 -0
  124. package/dist/sandbox-tiers.d.ts +5 -0
  125. package/dist/sandbox-tiers.d.ts.map +1 -1
  126. package/dist/sandbox-tiers.js +14 -6
  127. package/dist/sandbox-tiers.js.map +1 -1
  128. package/dist/security.d.ts.map +1 -1
  129. package/dist/security.js +3 -0
  130. package/dist/security.js.map +1 -1
  131. package/dist/self-improvement-loop.d.ts +64 -0
  132. package/dist/self-improvement-loop.d.ts.map +1 -0
  133. package/dist/self-improvement-loop.js +156 -0
  134. package/dist/self-improvement-loop.js.map +1 -0
  135. package/dist/session-persistence.d.ts +5 -0
  136. package/dist/session-persistence.d.ts.map +1 -1
  137. package/dist/session-persistence.js +19 -3
  138. package/dist/session-persistence.js.map +1 -1
  139. package/dist/skill-loader.d.ts +16 -9
  140. package/dist/skill-loader.d.ts.map +1 -1
  141. package/dist/skill-loader.js +52 -116
  142. package/dist/skill-loader.js.map +1 -1
  143. package/dist/skill-registry.d.ts +60 -0
  144. package/dist/skill-registry.d.ts.map +1 -0
  145. package/dist/skill-registry.js +162 -0
  146. package/dist/skill-registry.js.map +1 -0
  147. package/dist/stall-detector.d.ts +56 -0
  148. package/dist/stall-detector.d.ts.map +1 -0
  149. package/dist/stall-detector.js +142 -0
  150. package/dist/stall-detector.js.map +1 -0
  151. package/dist/strategy-learner.d.ts +57 -0
  152. package/dist/strategy-learner.d.ts.map +1 -0
  153. package/dist/strategy-learner.js +160 -0
  154. package/dist/strategy-learner.js.map +1 -0
  155. package/dist/strategy-market.d.ts +73 -0
  156. package/dist/strategy-market.d.ts.map +1 -0
  157. package/dist/strategy-market.js +200 -0
  158. package/dist/strategy-market.js.map +1 -0
  159. package/dist/sub-agent.d.ts +0 -3
  160. package/dist/sub-agent.d.ts.map +1 -1
  161. package/dist/sub-agent.js +0 -10
  162. package/dist/sub-agent.js.map +1 -1
  163. package/dist/system-prompt.d.ts +0 -2
  164. package/dist/system-prompt.d.ts.map +1 -1
  165. package/dist/system-prompt.js +97 -490
  166. package/dist/system-prompt.js.map +1 -1
  167. package/dist/task-classifier.d.ts.map +1 -1
  168. package/dist/task-classifier.js +2 -54
  169. package/dist/task-classifier.js.map +1 -1
  170. package/dist/tool-synthesizer.d.ts +149 -0
  171. package/dist/tool-synthesizer.d.ts.map +1 -0
  172. package/dist/tool-synthesizer.js +455 -0
  173. package/dist/tool-synthesizer.js.map +1 -0
  174. package/dist/trace-pattern-extractor.d.ts +76 -0
  175. package/dist/trace-pattern-extractor.d.ts.map +1 -0
  176. package/dist/trace-pattern-extractor.js +321 -0
  177. package/dist/trace-pattern-extractor.js.map +1 -0
  178. package/dist/trace-recorder.d.ts +38 -0
  179. package/dist/trace-recorder.d.ts.map +1 -0
  180. package/dist/trace-recorder.js +94 -0
  181. package/dist/trace-recorder.js.map +1 -0
  182. package/dist/trust-economics.d.ts +50 -0
  183. package/dist/trust-economics.d.ts.map +1 -0
  184. package/dist/trust-economics.js +148 -0
  185. package/dist/trust-economics.js.map +1 -0
  186. package/dist/types.d.ts +272 -3
  187. package/dist/types.d.ts.map +1 -1
  188. package/dist/types.js.map +1 -1
  189. package/dist/yuan-md-loader.d.ts +22 -0
  190. package/dist/yuan-md-loader.d.ts.map +1 -0
  191. package/dist/yuan-md-loader.js +75 -0
  192. package/dist/yuan-md-loader.js.map +1 -0
  193. package/package.json +1 -1
@@ -0,0 +1,455 @@
1
+ /**
2
+ * @module tool-synthesizer
3
+ * @description Proposes new tools based on repeated task patterns.
4
+ *
5
+ * Design:
6
+ * - TEMPLATE-BASED generation only — no LLM code generation, no dynamic eval.
7
+ * - All proposals go to a staging area only.
8
+ * - Human approval gate is MANDATORY before any activation.
9
+ * - Generated code is a TypeScript interface + async function signature stub
10
+ * (enough for tsc to type-check the shape, but NOT a full implementation).
11
+ *
12
+ * Safety constraints enforced here:
13
+ * - NO runtime tool installation.
14
+ * - NO dynamic require() or import() of generated code.
15
+ * - NO direct execution of generated code.
16
+ * - Sandbox compile: tsc --noEmit on generated file in /tmp.
17
+ * - Proposals are staging-only; approve/reject via human gate.
18
+ *
19
+ * Storage: ~/.yuan/proposals/tool-proposals.json — atomic write.
20
+ * Events: emitted on single "event" channel like all other modules.
21
+ */
22
+ import { execSync } from "child_process";
23
+ import { EventEmitter } from "events";
24
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "fs";
25
+ import { homedir } from "os";
26
+ import { join } from "path";
27
+ import { randomUUID } from "crypto";
28
+ // ─── Template Definitions ───
29
+ /**
30
+ * Built-in code templates.
31
+ * Each template generates a TypeScript interface + async function signature stub.
32
+ * Placeholders: {name}, {description}, {inputSchema}
33
+ *
34
+ * IMPORTANT: These are type stubs only — they are NOT full implementations
35
+ * and should NEVER be executed directly.
36
+ */
37
+ const TEMPLATES = {
38
+ "file-transformer": `/**
39
+ * Tool: {name}
40
+ * {description}
41
+ *
42
+ * Template: file-transformer
43
+ * WARNING: This is a generated stub. Human review and approval required before use.
44
+ */
45
+
46
+ interface {PascalName}Input {
47
+ /** Path to the file to transform */
48
+ filePath: string;
49
+ /** Regex pattern to search for */
50
+ pattern: string;
51
+ /** Replacement string */
52
+ replacement: string;
53
+ }
54
+
55
+ interface {PascalName}Output {
56
+ /** Transformed file content */
57
+ result: string;
58
+ /** Number of replacements made */
59
+ replacements: number;
60
+ }
61
+
62
+ /**
63
+ * Reads a file at args.filePath, applies args.pattern regex replacement
64
+ * with args.replacement, writes result back.
65
+ *
66
+ * Input schema: {inputSchema}
67
+ */
68
+ async function {camelName}(args: {PascalName}Input): Promise<{PascalName}Output> {
69
+ // STUB: implementation pending human approval and review
70
+ throw new Error("Not implemented — pending approval");
71
+ }
72
+
73
+ export type { {PascalName}Input, {PascalName}Output };
74
+ export { {camelName} };
75
+ `,
76
+ "bulk-runner": `/**
77
+ * Tool: {name}
78
+ * {description}
79
+ *
80
+ * Template: bulk-runner
81
+ * WARNING: This is a generated stub. Human review and approval required before use.
82
+ */
83
+
84
+ interface {PascalName}Input {
85
+ /** Glob pattern matching files to process */
86
+ glob: string;
87
+ /** Command to run on each matched file */
88
+ command: string;
89
+ /** Working directory for command execution */
90
+ cwd?: string;
91
+ }
92
+
93
+ interface {PascalName}Result {
94
+ /** File path processed */
95
+ file: string;
96
+ /** Command output */
97
+ output: string;
98
+ /** Whether command succeeded */
99
+ success: boolean;
100
+ }
101
+
102
+ interface {PascalName}Output {
103
+ /** Per-file results */
104
+ results: {PascalName}Result[];
105
+ /** Total files processed */
106
+ total: number;
107
+ /** Number of failures */
108
+ failures: number;
109
+ }
110
+
111
+ /**
112
+ * Globs files matching args.glob, runs args.command on each
113
+ * (with shell exec in cwd), collects results.
114
+ *
115
+ * Input schema: {inputSchema}
116
+ */
117
+ async function {camelName}(args: {PascalName}Input): Promise<{PascalName}Output> {
118
+ // STUB: implementation pending human approval and review
119
+ throw new Error("Not implemented — pending approval");
120
+ }
121
+
122
+ export type { {PascalName}Input, {PascalName}Output, {PascalName}Result };
123
+ export { {camelName} };
124
+ `,
125
+ "config-updater": `/**
126
+ * Tool: {name}
127
+ * {description}
128
+ *
129
+ * Template: config-updater
130
+ * WARNING: This is a generated stub. Human review and approval required before use.
131
+ */
132
+
133
+ interface {PascalName}Input {
134
+ /** Path to JSON or YAML config file */
135
+ configPath: string;
136
+ /** Updates to merge into the config (JSON object) */
137
+ updates: Record<string, unknown>;
138
+ }
139
+
140
+ interface {PascalName}Output {
141
+ /** Whether the write succeeded */
142
+ success: boolean;
143
+ /** Path written to */
144
+ configPath: string;
145
+ /** Keys that were updated */
146
+ updatedKeys: string[];
147
+ }
148
+
149
+ /**
150
+ * Reads JSON/YAML at args.configPath, merges args.updates (as JSON), writes back.
151
+ *
152
+ * Input schema: {inputSchema}
153
+ */
154
+ async function {camelName}(args: {PascalName}Input): Promise<{PascalName}Output> {
155
+ // STUB: implementation pending human approval and review
156
+ throw new Error("Not implemented — pending approval");
157
+ }
158
+
159
+ export type { {PascalName}Input, {PascalName}Output };
160
+ export { {camelName} };
161
+ `,
162
+ };
163
+ // ─── Helpers ───
164
+ /** Convert "bulk-fix-imports" → "BulkFixImports" */
165
+ function toPascalCase(name) {
166
+ return name
167
+ .replace(/[-_\s]+(.)/g, (_, c) => c.toUpperCase())
168
+ .replace(/^(.)/, (_, c) => c.toUpperCase());
169
+ }
170
+ /** Convert "bulk-fix-imports" → "bulkFixImports" */
171
+ function toCamelCase(name) {
172
+ const pascal = toPascalCase(name);
173
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
174
+ }
175
+ /** Infer estimatedCostClass from template type */
176
+ function inferCostClass(template) {
177
+ switch (template) {
178
+ case "file-transformer":
179
+ return "write";
180
+ case "bulk-runner":
181
+ return "shell";
182
+ case "config-updater":
183
+ return "write";
184
+ }
185
+ }
186
+ /** Infer whether sandbox is required based on cost class */
187
+ function inferSandboxRequired(template) {
188
+ return template === "bulk-runner";
189
+ }
190
+ // ─── ToolSynthesizer ───
191
+ /**
192
+ * ToolSynthesizer — proposes new tool stubs from repeated task patterns.
193
+ *
194
+ * Usage:
195
+ * ```ts
196
+ * const synth = new ToolSynthesizer();
197
+ * synth.on("event", (e) => console.log(e));
198
+ * const proposal = await synth.propose(
199
+ * "bulk-fix-imports",
200
+ * "Fix all import paths across TS files",
201
+ * "file-transformer",
202
+ * { filePath: "path to TS file", pattern: "old import", replacement: "new import" },
203
+ * "repeated-import-fix-pattern"
204
+ * );
205
+ * // ... human reviews proposal.generatedCode ...
206
+ * synth.approve(proposal.id);
207
+ * ```
208
+ *
209
+ * SAFETY: Generated code is NEVER executed, installed, or dynamically loaded.
210
+ * All generated code is stored as plain text in the proposals staging area only.
211
+ */
212
+ export class ToolSynthesizer extends EventEmitter {
213
+ storageDir;
214
+ storageFile;
215
+ requireSandboxPass;
216
+ proposals;
217
+ constructor(config) {
218
+ super();
219
+ this.storageDir =
220
+ config?.storageDir ?? join(homedir(), ".yuan", "proposals");
221
+ this.storageFile = join(this.storageDir, "tool-proposals.json");
222
+ this.requireSandboxPass = config?.requireSandboxPass ?? false;
223
+ this.proposals = this._loadProposals();
224
+ mkdirSync(this.storageDir, { recursive: true });
225
+ }
226
+ // ─── Public API ───
227
+ /**
228
+ * Propose a new tool from a SkillRegistry skill or trace pattern.
229
+ *
230
+ * Steps:
231
+ * 1. Build ToolCapabilityDescriptor from inputs + template metadata.
232
+ * 2. Generate TypeScript stub from template (fill placeholders).
233
+ * 3. Run sandbox compile check (tsc --noEmit in /tmp).
234
+ * 4. Persist proposal to staging storage.
235
+ * 5. Emit "agent:tool_proposed" event (gated by requireSandboxPass if set).
236
+ *
237
+ * @param name - Tool name, e.g. "bulk-fix-imports"
238
+ * @param description - Human-readable description
239
+ * @param template - Which built-in template to use
240
+ * @param inputHints - Free-form hints mapping field names to descriptions
241
+ * @param fromPattern - The skill/pattern ID that triggered this proposal
242
+ */
243
+ async propose(name, description, template, inputHints, fromPattern) {
244
+ const now = new Date().toISOString();
245
+ const proposalId = randomUUID();
246
+ const descriptorId = randomUUID();
247
+ // Build simplified inputSchema from hints (all values become "string" type by default)
248
+ const inputSchema = {};
249
+ for (const key of Object.keys(inputHints)) {
250
+ // Infer type from hint text heuristics
251
+ const hint = inputHints[key]?.toLowerCase() ?? "";
252
+ if (hint.includes("number") || hint.includes("count") || hint.includes("limit")) {
253
+ inputSchema[key] = "number";
254
+ }
255
+ else if (hint.includes("flag") || hint.includes("boolean") || hint.includes("enable")) {
256
+ inputSchema[key] = "boolean";
257
+ }
258
+ else if (hint.includes("list") || hint.includes("array") || hint.includes("files")) {
259
+ inputSchema[key] = "string[]";
260
+ }
261
+ else {
262
+ inputSchema[key] = "string";
263
+ }
264
+ }
265
+ const descriptor = {
266
+ id: descriptorId,
267
+ name,
268
+ description,
269
+ inputSchema,
270
+ outputSchema: { type: template === "bulk-runner" ? "object" : "string" },
271
+ estimatedCostClass: inferCostClass(template),
272
+ sandboxRequired: inferSandboxRequired(template),
273
+ proposedAt: now,
274
+ proposedFromPattern: fromPattern,
275
+ };
276
+ // Generate code from template
277
+ const generatedCode = this._generateCode(name, description, template, inputSchema, inputHints);
278
+ // Sandbox compile check
279
+ const { sandboxResult, sandboxError } = this._sandboxCheck(generatedCode, proposalId);
280
+ const proposal = {
281
+ id: proposalId,
282
+ descriptor,
283
+ generatedCode,
284
+ templateUsed: template,
285
+ sandboxResult,
286
+ sandboxError,
287
+ status: "pending",
288
+ proposedAt: now,
289
+ };
290
+ // Persist to staging
291
+ this.proposals.push(proposal);
292
+ this._saveProposals();
293
+ // Emit event — gated by requireSandboxPass setting
294
+ const shouldEmit = !this.requireSandboxPass || sandboxResult === "pass";
295
+ if (shouldEmit) {
296
+ this.emit("event", {
297
+ kind: "agent:tool_proposed",
298
+ proposalId: proposal.id,
299
+ toolName: name,
300
+ templateUsed: template,
301
+ sandboxResult,
302
+ timestamp: Date.now(),
303
+ });
304
+ }
305
+ return proposal;
306
+ }
307
+ /**
308
+ * Get all proposals (includes pending, approved, rejected).
309
+ */
310
+ getProposals() {
311
+ return [...this.proposals];
312
+ }
313
+ /**
314
+ * Approve a proposal — marks it as approved.
315
+ * NOTE: Approval does NOT install or activate the tool at runtime.
316
+ * The generated code stub remains in the staging area.
317
+ * Integration into the tool registry must be done separately by a human.
318
+ */
319
+ approve(proposalId) {
320
+ const proposal = this.proposals.find((p) => p.id === proposalId);
321
+ if (!proposal)
322
+ return;
323
+ if (proposal.status !== "pending")
324
+ return;
325
+ proposal.status = "approved";
326
+ proposal.approvedAt = new Date().toISOString();
327
+ this._saveProposals();
328
+ }
329
+ /**
330
+ * Reject a proposal.
331
+ */
332
+ reject(proposalId) {
333
+ const proposal = this.proposals.find((p) => p.id === proposalId);
334
+ if (!proposal)
335
+ return;
336
+ if (proposal.status !== "pending")
337
+ return;
338
+ proposal.status = "rejected";
339
+ this._saveProposals();
340
+ }
341
+ // ─── Private: Code Generation ───
342
+ /**
343
+ * Fill template placeholders with actual values.
344
+ * Placeholders: {name}, {PascalName}, {camelName}, {description}, {inputSchema}
345
+ *
346
+ * Generated code is a TypeScript stub only — NOT a full implementation.
347
+ * NEVER executed directly.
348
+ */
349
+ _generateCode(name, description, template, inputSchema, _inputHints) {
350
+ const pascalName = toPascalCase(name);
351
+ const camelName = toCamelCase(name);
352
+ const schemaStr = JSON.stringify(inputSchema);
353
+ let code = TEMPLATES[template];
354
+ code = code.replaceAll("{name}", name);
355
+ code = code.replaceAll("{PascalName}", pascalName);
356
+ code = code.replaceAll("{camelName}", camelName);
357
+ code = code.replaceAll("{description}", description);
358
+ code = code.replaceAll("{inputSchema}", schemaStr);
359
+ return code;
360
+ }
361
+ // ─── Private: Sandbox Compile Check ───
362
+ /**
363
+ * Write generated code to a temp file and run tsc --noEmit --strict.
364
+ * Always cleans up the temp file.
365
+ *
366
+ * Returns sandboxResult "pass" | "fail" | "skipped".
367
+ * "skipped" is returned when tsc is not available (ENOENT) — never throws.
368
+ */
369
+ _sandboxCheck(code, proposalId) {
370
+ const tmpFile = `/tmp/yuan-tool-synthesizer-${proposalId}.ts`;
371
+ try {
372
+ writeFileSync(tmpFile, code, "utf-8");
373
+ try {
374
+ execSync(`tsc --noEmit --strict "${tmpFile}"`, {
375
+ stdio: "pipe",
376
+ timeout: 15_000,
377
+ });
378
+ return { sandboxResult: "pass" };
379
+ }
380
+ catch (err) {
381
+ // tsc not found → skip gracefully
382
+ if (err &&
383
+ typeof err === "object" &&
384
+ "code" in err &&
385
+ err.code === "ENOENT") {
386
+ return { sandboxResult: "skipped" };
387
+ }
388
+ // tsc found but compilation failed
389
+ let sandboxError;
390
+ if (err &&
391
+ typeof err === "object" &&
392
+ "stderr" in err &&
393
+ err.stderr instanceof Buffer) {
394
+ sandboxError = err.stderr.toString("utf-8").slice(0, 1000);
395
+ }
396
+ else if (err &&
397
+ typeof err === "object" &&
398
+ "stdout" in err &&
399
+ err.stdout instanceof Buffer) {
400
+ sandboxError = err.stdout.toString("utf-8").slice(0, 1000);
401
+ }
402
+ else if (err instanceof Error) {
403
+ sandboxError = err.message.slice(0, 1000);
404
+ }
405
+ return { sandboxResult: "fail", sandboxError };
406
+ }
407
+ }
408
+ catch {
409
+ // File write or unexpected error — treat as skipped
410
+ return { sandboxResult: "skipped" };
411
+ }
412
+ finally {
413
+ // Always clean up temp file
414
+ try {
415
+ if (existsSync(tmpFile)) {
416
+ unlinkSync(tmpFile);
417
+ }
418
+ }
419
+ catch {
420
+ // Non-fatal cleanup failure
421
+ }
422
+ }
423
+ }
424
+ // ─── Private: Persistence ───
425
+ /**
426
+ * Load persisted proposals from disk.
427
+ */
428
+ _loadProposals() {
429
+ try {
430
+ if (!existsSync(this.storageFile))
431
+ return [];
432
+ const raw = readFileSync(this.storageFile, "utf-8");
433
+ return JSON.parse(raw);
434
+ }
435
+ catch {
436
+ return [];
437
+ }
438
+ }
439
+ /**
440
+ * Atomic write of proposals array to disk.
441
+ * Uses .tmp → rename pattern to prevent corruption.
442
+ */
443
+ _saveProposals() {
444
+ const tmpFile = `${this.storageFile}.tmp`;
445
+ try {
446
+ mkdirSync(this.storageDir, { recursive: true });
447
+ writeFileSync(tmpFile, JSON.stringify(this.proposals, null, 2), "utf-8");
448
+ renameSync(tmpFile, this.storageFile);
449
+ }
450
+ catch {
451
+ // Non-fatal: storage failures should not crash the agent loop
452
+ }
453
+ }
454
+ }
455
+ //# sourceMappingURL=tool-synthesizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-synthesizer.js","sourceRoot":"","sources":["../src/tool-synthesizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AA+CpC,+BAA+B;AAE/B;;;;;;;GAOG;AACH,MAAM,SAAS,GAAiC;IAC9C,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCrB;IAEC,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDhB;IAEC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCnB;CACA,CAAC;AAEF,kBAAkB;AAElB,oDAAoD;AACpD,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI;SACR,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzD,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,oDAAoD;AACpD,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,kDAAkD;AAClD,SAAS,cAAc,CAAC,QAAsB;IAC5C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,kBAAkB;YACrB,OAAO,OAAO,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,OAAO,CAAC;QACjB,KAAK,gBAAgB;YACnB,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,SAAS,oBAAoB,CAAC,QAAsB;IAClD,OAAO,QAAQ,KAAK,aAAa,CAAC;AACpC,CAAC;AAED,0BAA0B;AAE1B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC9B,UAAU,CAAS;IACnB,WAAW,CAAS;IACpB,kBAAkB,CAAU;IACrC,SAAS,CAAiB;IAElC,YAAY,MAA8B;QACxC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU;YACb,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC9D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QAChE,IAAI,CAAC,kBAAkB,GAAG,MAAM,EAAE,kBAAkB,IAAI,KAAK,CAAC;QAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,qBAAqB;IAErB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,WAAmB,EACnB,QAAsB,EACtB,UAAkC,EAClC,WAAoB;QAEpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,UAAU,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC;QAElC,uFAAuF;QACvF,MAAM,WAAW,GAA4C,EAAE,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1C,uCAAuC;YACvC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChF,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC9B,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxF,WAAW,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;YAC/B,CAAC;iBAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrF,WAAW,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAA6B;YAC3C,EAAE,EAAE,YAAY;YAChB,IAAI;YACJ,WAAW;YACX,WAAW;YACX,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,KAAK,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;YACxE,kBAAkB,EAAE,cAAc,CAAC,QAAQ,CAAC;YAC5C,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC;YAC/C,UAAU,EAAE,GAAG;YACf,mBAAmB,EAAE,WAAW;SACjC,CAAC;QAEF,8BAA8B;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAE/F,wBAAwB;QACxB,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAiB;YAC7B,EAAE,EAAE,UAAU;YACd,UAAU;YACV,aAAa;YACb,YAAY,EAAE,QAAQ;YACtB,aAAa;YACb,YAAY;YACZ,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,GAAG;SAChB,CAAC;QAEF,qBAAqB;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,mDAAmD;QACnD,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,aAAa,KAAK,MAAM,CAAC;QACxE,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,IAAI,EAAE,qBAAqB;gBAC3B,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,QAAQ;gBACtB,aAAa;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,UAAkB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAE1C,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;QAC7B,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAkB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QAE1C,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,mCAAmC;IAEnC;;;;;;OAMG;IACK,aAAa,CACnB,IAAY,EACZ,WAAmB,EACnB,QAAsB,EACtB,WAAoD,EACpD,WAAmC;QAEnC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAE9C,IAAI,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QACnD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QACjD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAEnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yCAAyC;IAEzC;;;;;;OAMG;IACK,aAAa,CACnB,IAAY,EACZ,UAAkB;QAElB,MAAM,OAAO,GAAG,8BAA8B,UAAU,KAAK,CAAC;QAE9D,IAAI,CAAC;YACH,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAEtC,IAAI,CAAC;gBACH,QAAQ,CAAC,0BAA0B,OAAO,GAAG,EAAE;oBAC7C,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;gBACH,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;YACnC,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,kCAAkC;gBAClC,IACE,GAAG;oBACH,OAAO,GAAG,KAAK,QAAQ;oBACvB,MAAM,IAAI,GAAG;oBACZ,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAChD,CAAC;oBACD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;gBACtC,CAAC;gBAED,mCAAmC;gBACnC,IAAI,YAAgC,CAAC;gBACrC,IACE,GAAG;oBACH,OAAO,GAAG,KAAK,QAAQ;oBACvB,QAAQ,IAAI,GAAG;oBACf,GAAG,CAAC,MAAM,YAAY,MAAM,EAC5B,CAAC;oBACD,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC7D,CAAC;qBAAM,IACL,GAAG;oBACH,OAAO,GAAG,KAAK,QAAQ;oBACvB,QAAQ,IAAI,GAAG;oBACf,GAAG,CAAC,MAAM,YAAY,MAAM,EAC5B,CAAC;oBACD,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC7D,CAAC;qBAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;oBAChC,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC5C,CAAC;gBACD,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;YACpD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;QACtC,CAAC;gBAAS,CAAC;YACT,4BAA4B;YAC5B,IAAI,CAAC;gBACH,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,UAAU,CAAC,OAAO,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,+BAA+B;IAE/B;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,WAAW,MAAM,CAAC;QAC1C,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACzE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @module trace-pattern-extractor
3
+ * @description Reads TraceRecorder JSONL files from ~/.yuan/traces/, detects repeated
4
+ * successful tool sequences, and produces Playbook proposals.
5
+ *
6
+ * Pattern detection rules:
7
+ * - A sequence = ordered list of tool names from tool_call events in a session
8
+ * - A pattern is a contiguous sub-sequence of 3..8 tools
9
+ * - Significant if: appears in 3+ distinct sessions AND success rate >= 60%
10
+ * AND not already proposed (tracked by patternHash)
11
+ *
12
+ * Storage: ~/.yuan/proposals/playbook-proposals.json — array of PlaybookProposal, atomic write
13
+ * Events: emits on single "event" channel like all other modules
14
+ */
15
+ import { EventEmitter } from "events";
16
+ export interface PlaybookProposal {
17
+ id: string;
18
+ taskType: string;
19
+ toolSequence: string[];
20
+ patternHash: string;
21
+ sessionCount: number;
22
+ successRate: number;
23
+ sourceSessionIds: string[];
24
+ proposedAt: string;
25
+ }
26
+ export interface TracePatternExtractorConfig {
27
+ tracesDir?: string;
28
+ storageDir?: string;
29
+ minSessions?: number;
30
+ minSuccessRate?: number;
31
+ }
32
+ export declare class TracePatternExtractor extends EventEmitter {
33
+ private readonly tracesDir;
34
+ private readonly storageDir;
35
+ private readonly storageFile;
36
+ private readonly minSessions;
37
+ private readonly minSuccessRate;
38
+ /** patternHashes of proposals already produced — prevents re-proposing */
39
+ private readonly proposedPatterns;
40
+ /** proposalIds marked as applied — excluded from getProposals() */
41
+ private readonly appliedProposals;
42
+ private proposals;
43
+ constructor(config?: TracePatternExtractorConfig);
44
+ /**
45
+ * Main: scan all JSONL files in tracesDir, extract significant patterns,
46
+ * persist and return newly discovered proposals.
47
+ */
48
+ extract(): Promise<PlaybookProposal[]>;
49
+ /**
50
+ * Get all stored proposals, excluding applied ones.
51
+ */
52
+ getProposals(): PlaybookProposal[];
53
+ /**
54
+ * Mark a proposal as applied so it won't be returned by getProposals().
55
+ * Applied state is in-memory only — not persisted.
56
+ */
57
+ markApplied(proposalId: string): void;
58
+ /**
59
+ * Parse all JSONL files in tracesDir into per-session SessionData.
60
+ */
61
+ private _parseSessions;
62
+ /**
63
+ * Infer the most common task type across a set of session IDs.
64
+ * Falls back to "general" if no goals found.
65
+ */
66
+ private _inferDominantTaskType;
67
+ /**
68
+ * Load persisted proposals from disk.
69
+ */
70
+ private _loadProposals;
71
+ /**
72
+ * Atomic write of proposals array to disk.
73
+ */
74
+ private _saveProposals;
75
+ }
76
+ //# sourceMappingURL=trace-pattern-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-pattern-extractor.d.ts","sourceRoot":"","sources":["../src/trace-pattern-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AActC,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAqBD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkDD,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAc;IAC/C,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAc;IAE/C,OAAO,CAAC,SAAS,CAAqB;gBAE1B,MAAM,CAAC,EAAE,2BAA2B;IAwBhD;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAsF5C;;OAEG;IACH,YAAY,IAAI,gBAAgB,EAAE;IAIlC;;;OAGG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAMrC;;OAEG;IACH,OAAO,CAAC,cAAc;IAiFtB;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IA0B9B;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,cAAc;CAUvB"}