sammy-sdk 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.
- package/README.md +75 -0
- package/dist/cli/commands/dev.d.ts +3 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +13 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/eval.d.ts +3 -0
- package/dist/cli/commands/eval.d.ts.map +1 -0
- package/dist/cli/commands/eval.js +28 -0
- package/dist/cli/commands/eval.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +10 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +9 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +17 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cloud/sammy-cloud.d.ts +10 -0
- package/dist/cloud/sammy-cloud.d.ts.map +1 -0
- package/dist/cloud/sammy-cloud.js +113 -0
- package/dist/cloud/sammy-cloud.js.map +1 -0
- package/dist/dev/chat-ui.d.ts +6 -0
- package/dist/dev/chat-ui.d.ts.map +1 -0
- package/dist/dev/chat-ui.js +95 -0
- package/dist/dev/chat-ui.js.map +1 -0
- package/dist/dev/server.d.ts +5 -0
- package/dist/dev/server.d.ts.map +1 -0
- package/dist/dev/server.js +87 -0
- package/dist/dev/server.js.map +1 -0
- package/dist/dev/watcher.d.ts +2 -0
- package/dist/dev/watcher.d.ts.map +1 -0
- package/dist/dev/watcher.js +19 -0
- package/dist/dev/watcher.js.map +1 -0
- package/dist/discovery/ast/call-route-finder.d.ts +16 -0
- package/dist/discovery/ast/call-route-finder.d.ts.map +1 -0
- package/dist/discovery/ast/call-route-finder.js +106 -0
- package/dist/discovery/ast/call-route-finder.js.map +1 -0
- package/dist/discovery/ast/handler-detector.d.ts +8 -0
- package/dist/discovery/ast/handler-detector.d.ts.map +1 -0
- package/dist/discovery/ast/handler-detector.js +56 -0
- package/dist/discovery/ast/handler-detector.js.map +1 -0
- package/dist/discovery/ast/named-export-finder.d.ts +7 -0
- package/dist/discovery/ast/named-export-finder.d.ts.map +1 -0
- package/dist/discovery/ast/named-export-finder.js +21 -0
- package/dist/discovery/ast/named-export-finder.js.map +1 -0
- package/dist/discovery/ast/param-extractor.d.ts +7 -0
- package/dist/discovery/ast/param-extractor.d.ts.map +1 -0
- package/dist/discovery/ast/param-extractor.js +236 -0
- package/dist/discovery/ast/param-extractor.js.map +1 -0
- package/dist/discovery/ast/project.d.ts +8 -0
- package/dist/discovery/ast/project.d.ts.map +1 -0
- package/dist/discovery/ast/project.js +66 -0
- package/dist/discovery/ast/project.js.map +1 -0
- package/dist/discovery/ast/resolve.d.ts +5 -0
- package/dist/discovery/ast/resolve.d.ts.map +1 -0
- package/dist/discovery/ast/resolve.js +60 -0
- package/dist/discovery/ast/resolve.js.map +1 -0
- package/dist/discovery/ast/side-effect-tracer.d.ts +4 -0
- package/dist/discovery/ast/side-effect-tracer.d.ts.map +1 -0
- package/dist/discovery/ast/side-effect-tracer.js +100 -0
- package/dist/discovery/ast/side-effect-tracer.js.map +1 -0
- package/dist/discovery/ast/source-files.d.ts +3 -0
- package/dist/discovery/ast/source-files.d.ts.map +1 -0
- package/dist/discovery/ast/source-files.js +37 -0
- package/dist/discovery/ast/source-files.js.map +1 -0
- package/dist/discovery/config-generator.d.ts +5 -0
- package/dist/discovery/config-generator.d.ts.map +1 -0
- package/dist/discovery/config-generator.js +71 -0
- package/dist/discovery/config-generator.js.map +1 -0
- package/dist/discovery/extractors/auth-detector.d.ts +3 -0
- package/dist/discovery/extractors/auth-detector.d.ts.map +1 -0
- package/dist/discovery/extractors/auth-detector.js +97 -0
- package/dist/discovery/extractors/auth-detector.js.map +1 -0
- package/dist/discovery/extractors/http-call-extractor.d.ts +5 -0
- package/dist/discovery/extractors/http-call-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/http-call-extractor.js +122 -0
- package/dist/discovery/extractors/http-call-extractor.js.map +1 -0
- package/dist/discovery/extractors/model-extractor.d.ts +4 -0
- package/dist/discovery/extractors/model-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/model-extractor.js +256 -0
- package/dist/discovery/extractors/model-extractor.js.map +1 -0
- package/dist/discovery/extractors/nestjs-extractor.d.ts +4 -0
- package/dist/discovery/extractors/nestjs-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/nestjs-extractor.js +156 -0
- package/dist/discovery/extractors/nestjs-extractor.js.map +1 -0
- package/dist/discovery/extractors/remix-extractor.d.ts +5 -0
- package/dist/discovery/extractors/remix-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/remix-extractor.js +118 -0
- package/dist/discovery/extractors/remix-extractor.js.map +1 -0
- package/dist/discovery/extractors/route-extractor.d.ts +4 -0
- package/dist/discovery/extractors/route-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/route-extractor.js +108 -0
- package/dist/discovery/extractors/route-extractor.js.map +1 -0
- package/dist/discovery/extractors/server-action-extractor.d.ts +4 -0
- package/dist/discovery/extractors/server-action-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/server-action-extractor.js +129 -0
- package/dist/discovery/extractors/server-action-extractor.js.map +1 -0
- package/dist/discovery/extractors/service-detector.d.ts +3 -0
- package/dist/discovery/extractors/service-detector.d.ts.map +1 -0
- package/dist/discovery/extractors/service-detector.js +114 -0
- package/dist/discovery/extractors/service-detector.js.map +1 -0
- package/dist/discovery/extractors/sveltekit-extractor.d.ts +5 -0
- package/dist/discovery/extractors/sveltekit-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/sveltekit-extractor.js +129 -0
- package/dist/discovery/extractors/sveltekit-extractor.js.map +1 -0
- package/dist/discovery/extractors/trpc-extractor.d.ts +4 -0
- package/dist/discovery/extractors/trpc-extractor.d.ts.map +1 -0
- package/dist/discovery/extractors/trpc-extractor.js +191 -0
- package/dist/discovery/extractors/trpc-extractor.js.map +1 -0
- package/dist/discovery/framework-detector.d.ts +9 -0
- package/dist/discovery/framework-detector.d.ts.map +1 -0
- package/dist/discovery/framework-detector.js +68 -0
- package/dist/discovery/framework-detector.js.map +1 -0
- package/dist/discovery/init.d.ts +4 -0
- package/dist/discovery/init.d.ts.map +1 -0
- package/dist/discovery/init.js +102 -0
- package/dist/discovery/init.js.map +1 -0
- package/dist/discovery/llm-analyzer.d.ts +32 -0
- package/dist/discovery/llm-analyzer.d.ts.map +1 -0
- package/dist/discovery/llm-analyzer.js +162 -0
- package/dist/discovery/llm-analyzer.js.map +1 -0
- package/dist/discovery/orchestrator.d.ts +4 -0
- package/dist/discovery/orchestrator.d.ts.map +1 -0
- package/dist/discovery/orchestrator.js +47 -0
- package/dist/discovery/orchestrator.js.map +1 -0
- package/dist/discovery/scanners/express-scanner.d.ts +3 -0
- package/dist/discovery/scanners/express-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/express-scanner.js +10 -0
- package/dist/discovery/scanners/express-scanner.js.map +1 -0
- package/dist/discovery/scanners/fastify-scanner.d.ts +3 -0
- package/dist/discovery/scanners/fastify-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/fastify-scanner.js +10 -0
- package/dist/discovery/scanners/fastify-scanner.js.map +1 -0
- package/dist/discovery/scanners/hono-scanner.d.ts +3 -0
- package/dist/discovery/scanners/hono-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/hono-scanner.js +10 -0
- package/dist/discovery/scanners/hono-scanner.js.map +1 -0
- package/dist/discovery/scanners/nestjs-scanner.d.ts +3 -0
- package/dist/discovery/scanners/nestjs-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/nestjs-scanner.js +10 -0
- package/dist/discovery/scanners/nestjs-scanner.js.map +1 -0
- package/dist/discovery/scanners/nextjs-scanner.d.ts +3 -0
- package/dist/discovery/scanners/nextjs-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/nextjs-scanner.js +15 -0
- package/dist/discovery/scanners/nextjs-scanner.js.map +1 -0
- package/dist/discovery/scanners/registry.d.ts +3 -0
- package/dist/discovery/scanners/registry.d.ts.map +1 -0
- package/dist/discovery/scanners/registry.js +22 -0
- package/dist/discovery/scanners/registry.js.map +1 -0
- package/dist/discovery/scanners/remix-scanner.d.ts +3 -0
- package/dist/discovery/scanners/remix-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/remix-scanner.js +13 -0
- package/dist/discovery/scanners/remix-scanner.js.map +1 -0
- package/dist/discovery/scanners/sveltekit-scanner.d.ts +3 -0
- package/dist/discovery/scanners/sveltekit-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/sveltekit-scanner.js +10 -0
- package/dist/discovery/scanners/sveltekit-scanner.js.map +1 -0
- package/dist/discovery/scanners/trpc-scanner.d.ts +3 -0
- package/dist/discovery/scanners/trpc-scanner.d.ts.map +1 -0
- package/dist/discovery/scanners/trpc-scanner.js +21 -0
- package/dist/discovery/scanners/trpc-scanner.js.map +1 -0
- package/dist/discovery/scanners/types.d.ts +18 -0
- package/dist/discovery/scanners/types.d.ts.map +1 -0
- package/dist/discovery/scanners/types.js +2 -0
- package/dist/discovery/scanners/types.js.map +1 -0
- package/dist/discovery/types.d.ts +60 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +2 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/eval/diagnoser.d.ts +4 -0
- package/dist/eval/diagnoser.d.ts.map +1 -0
- package/dist/eval/diagnoser.js +97 -0
- package/dist/eval/diagnoser.js.map +1 -0
- package/dist/eval/judge.d.ts +8 -0
- package/dist/eval/judge.d.ts.map +1 -0
- package/dist/eval/judge.js +71 -0
- package/dist/eval/judge.js.map +1 -0
- package/dist/eval/loop-guard.d.ts +12 -0
- package/dist/eval/loop-guard.d.ts.map +1 -0
- package/dist/eval/loop-guard.js +45 -0
- package/dist/eval/loop-guard.js.map +1 -0
- package/dist/eval/refiner.d.ts +5 -0
- package/dist/eval/refiner.d.ts.map +1 -0
- package/dist/eval/refiner.js +149 -0
- package/dist/eval/refiner.js.map +1 -0
- package/dist/eval/runner.d.ts +27 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +198 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/scenario-generator.d.ts +5 -0
- package/dist/eval/scenario-generator.d.ts.map +1 -0
- package/dist/eval/scenario-generator.js +185 -0
- package/dist/eval/scenario-generator.js.map +1 -0
- package/dist/eval/scorer.d.ts +9 -0
- package/dist/eval/scorer.d.ts.map +1 -0
- package/dist/eval/scorer.js +189 -0
- package/dist/eval/scorer.js.map +1 -0
- package/dist/eval/types.d.ts +135 -0
- package/dist/eval/types.d.ts.map +1 -0
- package/dist/eval/types.js +37 -0
- package/dist/eval/types.js.map +1 -0
- package/dist/generator/agent-generator.d.ts +3 -0
- package/dist/generator/agent-generator.d.ts.map +1 -0
- package/dist/generator/agent-generator.js +29 -0
- package/dist/generator/agent-generator.js.map +1 -0
- package/dist/generator/generate.d.ts +5 -0
- package/dist/generator/generate.d.ts.map +1 -0
- package/dist/generator/generate.js +119 -0
- package/dist/generator/generate.js.map +1 -0
- package/dist/generator/handler-generator.d.ts +3 -0
- package/dist/generator/handler-generator.d.ts.map +1 -0
- package/dist/generator/handler-generator.js +66 -0
- package/dist/generator/handler-generator.js.map +1 -0
- package/dist/generator/index-generator.d.ts +3 -0
- package/dist/generator/index-generator.d.ts.map +1 -0
- package/dist/generator/index-generator.js +28 -0
- package/dist/generator/index-generator.js.map +1 -0
- package/dist/generator/merge-logic.d.ts +15 -0
- package/dist/generator/merge-logic.d.ts.map +1 -0
- package/dist/generator/merge-logic.js +52 -0
- package/dist/generator/merge-logic.js.map +1 -0
- package/dist/generator/router-generator.d.ts +3 -0
- package/dist/generator/router-generator.d.ts.map +1 -0
- package/dist/generator/router-generator.js +55 -0
- package/dist/generator/router-generator.js.map +1 -0
- package/dist/generator/schema-generator.d.ts +3 -0
- package/dist/generator/schema-generator.d.ts.map +1 -0
- package/dist/generator/schema-generator.js +58 -0
- package/dist/generator/schema-generator.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/agent-orchestrator.d.ts +19 -0
- package/dist/runtime/agent-orchestrator.d.ts.map +1 -0
- package/dist/runtime/agent-orchestrator.js +96 -0
- package/dist/runtime/agent-orchestrator.js.map +1 -0
- package/dist/runtime/agent-runner.d.ts +22 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -0
- package/dist/runtime/agent-runner.js +59 -0
- package/dist/runtime/agent-runner.js.map +1 -0
- package/dist/runtime/config-loader.d.ts +12 -0
- package/dist/runtime/config-loader.d.ts.map +1 -0
- package/dist/runtime/config-loader.js +42 -0
- package/dist/runtime/config-loader.js.map +1 -0
- package/dist/runtime/conversation-manager.d.ts +16 -0
- package/dist/runtime/conversation-manager.d.ts.map +1 -0
- package/dist/runtime/conversation-manager.js +33 -0
- package/dist/runtime/conversation-manager.js.map +1 -0
- package/dist/runtime/sammy.d.ts +17 -0
- package/dist/runtime/sammy.d.ts.map +1 -0
- package/dist/runtime/sammy.js +97 -0
- package/dist/runtime/sammy.js.map +1 -0
- package/dist/runtime/tool-executor.d.ts +14 -0
- package/dist/runtime/tool-executor.d.ts.map +1 -0
- package/dist/runtime/tool-executor.js +58 -0
- package/dist/runtime/tool-executor.js.map +1 -0
- package/dist/runtime/tool-types.d.ts +26 -0
- package/dist/runtime/tool-types.d.ts.map +1 -0
- package/dist/runtime/tool-types.js +2 -0
- package/dist/runtime/tool-types.js.map +1 -0
- package/dist/runtime/types.d.ts +100 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/zod-to-json-schema.d.ts +3 -0
- package/dist/runtime/zod-to-json-schema.d.ts.map +1 -0
- package/dist/runtime/zod-to-json-schema.js +82 -0
- package/dist/runtime/zod-to-json-schema.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import { generateSchemaFile } from "./schema-generator.js";
|
|
6
|
+
import { generateToolFile } from "./handler-generator.js";
|
|
7
|
+
import { generateAgentFile } from "./agent-generator.js";
|
|
8
|
+
import { generateRouterFile } from "./router-generator.js";
|
|
9
|
+
import { generateIndexFile } from "./index-generator.js";
|
|
10
|
+
import { MergeManager } from "./merge-logic.js";
|
|
11
|
+
export async function runGenerate(options) {
|
|
12
|
+
const projectRoot = process.cwd();
|
|
13
|
+
const configPath = path.join(projectRoot, "sammy.config.json");
|
|
14
|
+
console.log(chalk.bold("\n Sammy Generate\n"));
|
|
15
|
+
if (!fs.existsSync(configPath)) {
|
|
16
|
+
console.log(chalk.red(" No sammy.config.json found. Run `npx sammy init` first.\n"));
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
20
|
+
const sammyDir = path.join(projectRoot, ".sammy");
|
|
21
|
+
const merge = new MergeManager(sammyDir, !options.dryRun);
|
|
22
|
+
// Filter domains if --domain specified
|
|
23
|
+
const domains = options.domain
|
|
24
|
+
? config.domains.filter((d) => d.name === options.domain)
|
|
25
|
+
: config.domains;
|
|
26
|
+
if (options.domain && domains.length === 0) {
|
|
27
|
+
console.log(chalk.red(` Domain "${options.domain}" not found in config.\n`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
let toolCount = 0;
|
|
31
|
+
let agentCount = 0;
|
|
32
|
+
let schemaCount = 0;
|
|
33
|
+
const manualWiring = [];
|
|
34
|
+
// Generate schemas
|
|
35
|
+
const schemaSpinner = ora("Generating schemas...").start();
|
|
36
|
+
for (const domain of domains) {
|
|
37
|
+
const content = generateSchemaFile(domain);
|
|
38
|
+
const filePath = path.join(sammyDir, "schemas", `${domain.name}.schemas.ts`);
|
|
39
|
+
if (!options.dryRun) {
|
|
40
|
+
merge.writeFile(filePath, content);
|
|
41
|
+
}
|
|
42
|
+
schemaCount++;
|
|
43
|
+
}
|
|
44
|
+
schemaSpinner.succeed(`Generated ${schemaCount} schema files`);
|
|
45
|
+
// Generate tools
|
|
46
|
+
const toolSpinner = ora("Generating tools...").start();
|
|
47
|
+
for (const domain of domains) {
|
|
48
|
+
for (const tool of domain.tools) {
|
|
49
|
+
const content = generateToolFile(tool, domain, projectRoot);
|
|
50
|
+
const filePath = path.join(sammyDir, "tools", domain.name, `${tool.name}.ts`);
|
|
51
|
+
if (!options.dryRun) {
|
|
52
|
+
merge.writeFile(filePath, content);
|
|
53
|
+
}
|
|
54
|
+
toolCount++;
|
|
55
|
+
if (!tool.handler || !tool.handler.includes(":")) {
|
|
56
|
+
manualWiring.push(`${domain.name}/${tool.name}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
toolSpinner.succeed(`Generated ${toolCount} tools`);
|
|
61
|
+
// Generate agents
|
|
62
|
+
const agentSpinner = ora("Generating agents...").start();
|
|
63
|
+
const agentsToGenerate = options.domain
|
|
64
|
+
? config.architecture.agents.filter((a) => a.domains.some((d) => d === options.domain))
|
|
65
|
+
: config.architecture.agents;
|
|
66
|
+
for (const agent of agentsToGenerate) {
|
|
67
|
+
const content = generateAgentFile(agent, config.domains);
|
|
68
|
+
const filePath = path.join(sammyDir, "agents", `${agent.name}.ts`);
|
|
69
|
+
if (!options.dryRun) {
|
|
70
|
+
merge.writeFile(filePath, content);
|
|
71
|
+
}
|
|
72
|
+
agentCount++;
|
|
73
|
+
}
|
|
74
|
+
// Generate router
|
|
75
|
+
if (!options.domain) {
|
|
76
|
+
const routerContent = generateRouterFile(config.architecture, config.domains);
|
|
77
|
+
if (routerContent) {
|
|
78
|
+
const filePath = path.join(sammyDir, "agents", "router.ts");
|
|
79
|
+
if (!options.dryRun) {
|
|
80
|
+
merge.writeFile(filePath, routerContent);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
agentSpinner.succeed(`Generated ${agentCount} agents${config.architecture.type !== "single-agent" ? " + router" : ""}`);
|
|
85
|
+
// Generate index
|
|
86
|
+
if (!options.domain && !options.dryRun) {
|
|
87
|
+
const indexContent = generateIndexFile(config);
|
|
88
|
+
merge.writeFile(path.join(sammyDir, "index.ts"), indexContent);
|
|
89
|
+
}
|
|
90
|
+
// Save checksums
|
|
91
|
+
if (!options.dryRun) {
|
|
92
|
+
merge.save();
|
|
93
|
+
}
|
|
94
|
+
// Print results
|
|
95
|
+
const skipped = merge.getSkipped();
|
|
96
|
+
if (skipped.length > 0) {
|
|
97
|
+
console.log(chalk.yellow(`\n ⚠ ${skipped.length} files skipped (local edits detected):`));
|
|
98
|
+
for (const f of skipped) {
|
|
99
|
+
console.log(chalk.dim(` └── ${path.relative(projectRoot, f)}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (manualWiring.length > 0) {
|
|
103
|
+
console.log(chalk.yellow(`\n ⚠ ${manualWiring.length} tools need manual wiring:`));
|
|
104
|
+
for (const t of manualWiring) {
|
|
105
|
+
console.log(chalk.dim(` └── .sammy/tools/${t}.ts`));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
console.log(chalk.green(`\n ✓ Generated ${toolCount} tools, ${agentCount} agents, ${schemaCount} schemas`));
|
|
109
|
+
console.log(chalk.dim(" Files written to .sammy/\n"));
|
|
110
|
+
if (options.dryRun) {
|
|
111
|
+
console.log(chalk.dim(" (dry run — no files were written)\n"));
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
console.log(" Next steps:");
|
|
115
|
+
console.log(chalk.dim(" 1. Wire any flagged tools in .sammy/tools/"));
|
|
116
|
+
console.log(chalk.dim(" 2. Run: npx sammy eval\n"));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/generator/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-generator.d.ts","sourceRoot":"","sources":["../../src/generator/handler-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CA2CpG"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
export function generateToolFile(tool, domain, projectRoot) {
|
|
3
|
+
const { filePath, functionName } = parseHandler(tool.handler);
|
|
4
|
+
const relativeImport = computeRelativeImport(domain.name, filePath, projectRoot);
|
|
5
|
+
const schemaName = `${tool.name}Schema`;
|
|
6
|
+
const permissionKey = `${domain.name}:${tool.permission}`;
|
|
7
|
+
return `// Auto-generated by Sammy — safe to edit, will not be overwritten unless you run 'sammy generate --force'
|
|
8
|
+
import { ${schemaName} } from "../../schemas/${domain.name}.schemas.js";
|
|
9
|
+
|
|
10
|
+
export const ${tool.name} = {
|
|
11
|
+
name: "${tool.name}",
|
|
12
|
+
description: ${JSON.stringify(tool.description)},
|
|
13
|
+
domain: "${domain.name}",
|
|
14
|
+
permission: "${tool.permission}",
|
|
15
|
+
parameters: ${schemaName},
|
|
16
|
+
|
|
17
|
+
handler: async (params, context) => {
|
|
18
|
+
if (!context.permissions.includes("${permissionKey}")) {
|
|
19
|
+
return { success: false, error: "Insufficient permissions for ${domain.name} ${tool.permission} operations" };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const mod = await import("${relativeImport}");
|
|
24
|
+
const fn = mod.${functionName} || mod.default;
|
|
25
|
+
if (!fn) {
|
|
26
|
+
return { success: false, error: "Handler function '${functionName}' not found in ${filePath}" };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const result = await fn(params);
|
|
30
|
+
return {
|
|
31
|
+
success: true,
|
|
32
|
+
data: result,
|
|
33
|
+
summary: \`${tool.name} completed successfully\`,
|
|
34
|
+
};
|
|
35
|
+
} catch (error) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
`;
|
|
44
|
+
}
|
|
45
|
+
function parseHandler(handler) {
|
|
46
|
+
const colonIndex = handler.lastIndexOf(':');
|
|
47
|
+
if (colonIndex === -1) {
|
|
48
|
+
return { filePath: handler, functionName: 'default' };
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
filePath: handler.slice(0, colonIndex),
|
|
52
|
+
functionName: handler.slice(colonIndex + 1),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function computeRelativeImport(domainName, handlerPath, projectRoot) {
|
|
56
|
+
// From .sammy/tools/<domain>/<tool>.ts to the handler file
|
|
57
|
+
const fromDir = path.join(projectRoot, '.sammy', 'tools', domainName);
|
|
58
|
+
const toFile = path.join(projectRoot, handlerPath);
|
|
59
|
+
let relative = path.relative(fromDir, toFile).replace(/\\/g, '/');
|
|
60
|
+
if (!relative.startsWith('.'))
|
|
61
|
+
relative = './' + relative;
|
|
62
|
+
// Remove .ts extension for import
|
|
63
|
+
relative = relative.replace(/\.ts$/, '.js');
|
|
64
|
+
return relative;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=handler-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler-generator.js","sourceRoot":"","sources":["../../src/generator/handler-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,MAAM,UAAU,gBAAgB,CAAC,IAAgB,EAAE,MAAoB,EAAE,WAAmB;IAC1F,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAC;IACxC,MAAM,aAAa,GAAG,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;IAE1D,OAAO;WACE,UAAU,0BAA0B,MAAM,CAAC,IAAI;;eAE3C,IAAI,CAAC,IAAI;WACb,IAAI,CAAC,IAAI;iBACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;aACpC,MAAM,CAAC,IAAI;iBACP,IAAI,CAAC,UAAU;gBAChB,UAAU;;;yCAGe,aAAa;sEACgB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU;;;;kCAIlE,cAAc;uBACzB,YAAY;;6DAE0B,YAAY,kBAAkB,QAAQ;;;;;;;qBAO9E,IAAI,CAAC,IAAI;;;;;;;;;;CAU7B,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;QACtC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,UAAkB,EAAE,WAAmB,EAAE,WAAmB;IACzF,2DAA2D;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC1D,kCAAkC;IAClC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-generator.d.ts","sourceRoot":"","sources":["../../src/generator/index-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CA8B7D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export function generateIndexFile(config) {
|
|
2
|
+
const imports = [];
|
|
3
|
+
const toolExports = [];
|
|
4
|
+
const agentExports = [];
|
|
5
|
+
for (const domain of config.domains) {
|
|
6
|
+
for (const tool of domain.tools) {
|
|
7
|
+
imports.push(`import { ${tool.name} } from "./tools/${domain.name}/${tool.name}.js";`);
|
|
8
|
+
toolExports.push(tool.name);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
for (const agent of config.architecture.agents) {
|
|
12
|
+
const varName = agent.name.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
13
|
+
imports.push(`import { ${varName} } from "./agents/${agent.name}.js";`);
|
|
14
|
+
agentExports.push(varName);
|
|
15
|
+
}
|
|
16
|
+
if (config.architecture.type !== "single-agent") {
|
|
17
|
+
imports.push('import { router } from "./agents/router.js";');
|
|
18
|
+
agentExports.push('router');
|
|
19
|
+
}
|
|
20
|
+
return `// Auto-generated by Sammy — entry point for all generated tools and agents
|
|
21
|
+
${imports.join('\n')}
|
|
22
|
+
|
|
23
|
+
export const tools = [${toolExports.join(', ')}];
|
|
24
|
+
export const agents = [${agentExports.join(', ')}];
|
|
25
|
+
export const architectureType = "${config.architecture.type}";
|
|
26
|
+
`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=index-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-generator.js","sourceRoot":"","sources":["../../src/generator/index-generator.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,MAAmB;IACnD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,oBAAoB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YACvF,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,YAAY,OAAO,qBAAqB,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC;QACxE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;EACP,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;wBAEI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;yBACrB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;mCACb,MAAM,CAAC,YAAY,CAAC,IAAI;CAC1D,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class MergeManager {
|
|
2
|
+
private checksumsPath;
|
|
3
|
+
private checksums;
|
|
4
|
+
private force;
|
|
5
|
+
private skipped;
|
|
6
|
+
private written;
|
|
7
|
+
constructor(sammyDir: string, force: boolean);
|
|
8
|
+
writeFile(filePath: string, content: string): boolean;
|
|
9
|
+
save(): void;
|
|
10
|
+
getSkipped(): string[];
|
|
11
|
+
getWritten(): string[];
|
|
12
|
+
private loadChecksums;
|
|
13
|
+
private hash;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=merge-logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-logic.d.ts","sourceRoot":"","sources":["../../src/generator/merge-logic.ts"],"names":[],"mappings":"AAQA,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAgB;gBAEnB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;IAM5C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAuBrD,IAAI,IAAI,IAAI;IAMZ,UAAU,IAAI,MAAM,EAAE;IACtB,UAAU,IAAI,MAAM,EAAE;IAEtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import crypto from "node:crypto";
|
|
4
|
+
export class MergeManager {
|
|
5
|
+
checksumsPath;
|
|
6
|
+
checksums;
|
|
7
|
+
force;
|
|
8
|
+
skipped = [];
|
|
9
|
+
written = [];
|
|
10
|
+
constructor(sammyDir, force) {
|
|
11
|
+
this.checksumsPath = path.join(sammyDir, '.generated-checksums.json');
|
|
12
|
+
this.checksums = this.loadChecksums();
|
|
13
|
+
this.force = force;
|
|
14
|
+
}
|
|
15
|
+
writeFile(filePath, content) {
|
|
16
|
+
const dir = path.dirname(filePath);
|
|
17
|
+
if (!fs.existsSync(dir)) {
|
|
18
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
if (!this.force && fs.existsSync(filePath)) {
|
|
21
|
+
const existingContent = fs.readFileSync(filePath, 'utf-8');
|
|
22
|
+
const existingHash = this.hash(existingContent);
|
|
23
|
+
const storedHash = this.checksums[filePath];
|
|
24
|
+
if (storedHash && existingHash !== storedHash) {
|
|
25
|
+
this.skipped.push(filePath);
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
fs.writeFileSync(filePath, content);
|
|
30
|
+
this.checksums[filePath] = this.hash(content);
|
|
31
|
+
this.written.push(filePath);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
save() {
|
|
35
|
+
const dir = path.dirname(this.checksumsPath);
|
|
36
|
+
if (!fs.existsSync(dir))
|
|
37
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
38
|
+
fs.writeFileSync(this.checksumsPath, JSON.stringify(this.checksums, null, 2));
|
|
39
|
+
}
|
|
40
|
+
getSkipped() { return this.skipped; }
|
|
41
|
+
getWritten() { return this.written; }
|
|
42
|
+
loadChecksums() {
|
|
43
|
+
if (fs.existsSync(this.checksumsPath)) {
|
|
44
|
+
return JSON.parse(fs.readFileSync(this.checksumsPath, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
hash(content) {
|
|
49
|
+
return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=merge-logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-logic.js","sourceRoot":"","sources":["../../src/generator/merge-logic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-generator.d.ts","sourceRoot":"","sources":["../../src/generator/router-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE5E,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CAuD3G"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export function generateRouterFile(architecture, domains) {
|
|
2
|
+
if (architecture.type === "single-agent")
|
|
3
|
+
return null;
|
|
4
|
+
const agentDescriptions = architecture.agents.map(a => {
|
|
5
|
+
const agentDomains = domains.filter(d => a.domains.includes(d.name));
|
|
6
|
+
const desc = agentDomains.map(d => d.description).join('; ');
|
|
7
|
+
return `- ${a.name}: ${desc}`;
|
|
8
|
+
}).join('\n');
|
|
9
|
+
const agentNames = architecture.agents.map(a => `"${a.name}"`).join(', ');
|
|
10
|
+
const systemPrompt = architecture.router.systemPrompt || `You are the router agent. Analyze the user's message and delegate to the appropriate specialist agent.
|
|
11
|
+
|
|
12
|
+
Available agents:
|
|
13
|
+
${agentDescriptions}
|
|
14
|
+
|
|
15
|
+
If the request spans multiple domains, call delegate_to_agent for each in sequence.
|
|
16
|
+
If the request is unclear, use ask_clarification.`;
|
|
17
|
+
return `// Auto-generated by Sammy
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
|
|
20
|
+
export const router = {
|
|
21
|
+
name: "router",
|
|
22
|
+
model: "${architecture.router.model}",
|
|
23
|
+
systemPrompt: ${JSON.stringify(systemPrompt)},
|
|
24
|
+
tools: [
|
|
25
|
+
{
|
|
26
|
+
name: "delegate_to_agent",
|
|
27
|
+
description: "Delegate the user's request to a specialist agent",
|
|
28
|
+
domain: "_router",
|
|
29
|
+
permission: "read",
|
|
30
|
+
parameters: z.object({
|
|
31
|
+
agentName: z.enum([${agentNames}]).describe("Which agent to delegate to"),
|
|
32
|
+
reason: z.string().describe("Why this agent was chosen"),
|
|
33
|
+
message: z.string().describe("The message to send to the agent"),
|
|
34
|
+
}),
|
|
35
|
+
handler: async (params) => {
|
|
36
|
+
return { success: true, data: params };
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "ask_clarification",
|
|
41
|
+
description: "Ask the user to clarify their request when the intent is ambiguous",
|
|
42
|
+
domain: "_router",
|
|
43
|
+
permission: "read",
|
|
44
|
+
parameters: z.object({
|
|
45
|
+
question: z.string().describe("The clarification question to ask"),
|
|
46
|
+
}),
|
|
47
|
+
handler: async (params) => {
|
|
48
|
+
return { success: true, data: params };
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=router-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router-generator.js","sourceRoot":"","sources":["../../src/generator/router-generator.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,YAAgC,EAAE,OAAuB;IAC1F,IAAI,YAAY,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAEtD,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACpD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,YAAY,IAAI;;;EAGzD,iBAAiB;;;kDAG+B,CAAC;IAEjD,OAAO;;;;;YAKG,YAAY,CAAC,MAAM,CAAC,KAAK;kBACnB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;;;;;;;6BAQjB,UAAU;;;;;;;;;;;;;;;;;;;;;;CAsBtC,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.d.ts","sourceRoot":"","sources":["../../src/generator/schema-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoB/D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function generateSchemaFile(domain) {
|
|
2
|
+
const lines = [
|
|
3
|
+
'// Auto-generated by Sammy — safe to edit',
|
|
4
|
+
'import { z } from "zod";',
|
|
5
|
+
'',
|
|
6
|
+
];
|
|
7
|
+
for (const tool of domain.tools) {
|
|
8
|
+
const schemaName = `${tool.name}Schema`;
|
|
9
|
+
const fields = Object.entries(tool.parameters).map(([name, param]) => {
|
|
10
|
+
return ` ${name}: ${zodTypeFromParam(param)},`;
|
|
11
|
+
});
|
|
12
|
+
lines.push(`export const ${schemaName} = z.object({`);
|
|
13
|
+
lines.push(...fields);
|
|
14
|
+
lines.push('});');
|
|
15
|
+
lines.push('');
|
|
16
|
+
}
|
|
17
|
+
return lines.join('\n');
|
|
18
|
+
}
|
|
19
|
+
function zodTypeFromParam(param) {
|
|
20
|
+
let base;
|
|
21
|
+
if (param.enum && param.enum.length > 0) {
|
|
22
|
+
base = `z.enum([${param.enum.map(v => `"${v}"`).join(', ')}])`;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
switch (param.type) {
|
|
26
|
+
case 'string':
|
|
27
|
+
base = 'z.string()';
|
|
28
|
+
break;
|
|
29
|
+
case 'number':
|
|
30
|
+
base = 'z.number()';
|
|
31
|
+
break;
|
|
32
|
+
case 'boolean':
|
|
33
|
+
base = 'z.boolean()';
|
|
34
|
+
break;
|
|
35
|
+
case 'array':
|
|
36
|
+
base = 'z.array(z.unknown())';
|
|
37
|
+
break;
|
|
38
|
+
case 'object':
|
|
39
|
+
base = 'z.record(z.unknown())';
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
base = 'z.unknown()';
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (param.format === 'email')
|
|
47
|
+
base += '.email()';
|
|
48
|
+
if (param.format === 'url')
|
|
49
|
+
base += '.url()';
|
|
50
|
+
if (param.format === 'date')
|
|
51
|
+
base += '.date()';
|
|
52
|
+
if (param.description)
|
|
53
|
+
base += `.describe(${JSON.stringify(param.description)})`;
|
|
54
|
+
if (!param.required)
|
|
55
|
+
base += '.optional()';
|
|
56
|
+
return base;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=schema-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-generator.js","sourceRoot":"","sources":["../../src/generator/schema-generator.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,KAAK,GAAa;QACtB,2CAA2C;QAC3C,0BAA0B;QAC1B,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;YACnE,OAAO,KAAK,IAAI,KAAK,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,eAAe,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAsB;IAC9C,IAAI,IAAY,CAAC;IAEjB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,GAAG,WAAW,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,QAAQ;gBAAE,IAAI,GAAG,YAAY,CAAC;gBAAC,MAAM;YAC1C,KAAK,QAAQ;gBAAE,IAAI,GAAG,YAAY,CAAC;gBAAC,MAAM;YAC1C,KAAK,SAAS;gBAAE,IAAI,GAAG,aAAa,CAAC;gBAAC,MAAM;YAC5C,KAAK,OAAO;gBAAE,IAAI,GAAG,sBAAsB,CAAC;gBAAC,MAAM;YACnD,KAAK,QAAQ;gBAAE,IAAI,GAAG,uBAAuB,CAAC;gBAAC,MAAM;YACrD;gBAAS,IAAI,GAAG,aAAa,CAAC;gBAAC,MAAM;QACvC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;QAAE,IAAI,IAAI,UAAU,CAAC;IACjD,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK;QAAE,IAAI,IAAI,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;QAAE,IAAI,IAAI,SAAS,CAAC;IAC/C,IAAI,KAAK,CAAC,WAAW;QAAE,IAAI,IAAI,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;IACjF,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,IAAI,IAAI,aAAa,CAAC;IAE3C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ToolContext } from "./tool-types.js";
|
|
2
|
+
import type { ToolExecutor } from "./tool-executor.js";
|
|
3
|
+
import type { SammyCloudClient } from "../cloud/sammy-cloud.js";
|
|
4
|
+
import type { SammyConfig } from "./types.js";
|
|
5
|
+
import type { ChatMessage } from "sammy-sdk-shared";
|
|
6
|
+
import { type AgentRunResult } from "./agent-runner.js";
|
|
7
|
+
export declare class AgentOrchestrator {
|
|
8
|
+
private config;
|
|
9
|
+
private toolExecutor;
|
|
10
|
+
private cloudClient;
|
|
11
|
+
private systemPrompt;
|
|
12
|
+
private agentConfigs;
|
|
13
|
+
constructor(config: SammyConfig, toolExecutor: ToolExecutor, cloudClient: SammyCloudClient, systemPrompt?: string);
|
|
14
|
+
private buildAgentConfigs;
|
|
15
|
+
run(userMessage: string, conversationHistory: ChatMessage[], toolContext: ToolContext): Promise<AgentRunResult>;
|
|
16
|
+
private runSingleAgent;
|
|
17
|
+
private runMultiAgent;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=agent-orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-orchestrator.d.ts","sourceRoot":"","sources":["../../src/runtime/agent-orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAiC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEvF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAA0C;gBAG5D,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,gBAAgB,EAC7B,YAAY,CAAC,EAAE,MAAM;IASvB,OAAO,CAAC,iBAAiB;IAsBnB,GAAG,CACP,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,WAAW,EAAE,EAClC,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,cAAc,CAAC;YAOZ,cAAc;YAiBd,aAAa;CAqD5B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { runAgent } from "./agent-runner.js";
|
|
2
|
+
export class AgentOrchestrator {
|
|
3
|
+
config;
|
|
4
|
+
toolExecutor;
|
|
5
|
+
cloudClient;
|
|
6
|
+
systemPrompt;
|
|
7
|
+
agentConfigs = new Map();
|
|
8
|
+
constructor(config, toolExecutor, cloudClient, systemPrompt) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.toolExecutor = toolExecutor;
|
|
11
|
+
this.cloudClient = cloudClient;
|
|
12
|
+
this.systemPrompt = systemPrompt || "You are a helpful AI assistant.";
|
|
13
|
+
this.buildAgentConfigs();
|
|
14
|
+
}
|
|
15
|
+
buildAgentConfigs() {
|
|
16
|
+
for (const agent of this.config.architecture.agents) {
|
|
17
|
+
const agentTools = [];
|
|
18
|
+
for (const domainName of agent.domains) {
|
|
19
|
+
agentTools.push(...this.toolExecutor.getToolsForDomain(domainName));
|
|
20
|
+
}
|
|
21
|
+
const domainDescs = this.config.domains
|
|
22
|
+
.filter((d) => agent.domains.includes(d.name))
|
|
23
|
+
.map((d) => `${d.name}: ${d.description}`)
|
|
24
|
+
.join("; ");
|
|
25
|
+
this.agentConfigs.set(agent.name, {
|
|
26
|
+
name: agent.name,
|
|
27
|
+
systemPrompt: agent.systemPrompt || `${this.systemPrompt}\n\nYou specialize in: ${domainDescs}. Use the available tools to help the user.`,
|
|
28
|
+
tools: agentTools,
|
|
29
|
+
model: agent.model,
|
|
30
|
+
maxToolCalls: agent.maxToolCalls,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async run(userMessage, conversationHistory, toolContext) {
|
|
35
|
+
if (this.config.architecture.type === "single-agent") {
|
|
36
|
+
return this.runSingleAgent(userMessage, conversationHistory, toolContext);
|
|
37
|
+
}
|
|
38
|
+
return this.runMultiAgent(userMessage, conversationHistory, toolContext);
|
|
39
|
+
}
|
|
40
|
+
async runSingleAgent(userMessage, history, context) {
|
|
41
|
+
const agentConfig = this.agentConfigs.values().next().value;
|
|
42
|
+
if (!agentConfig) {
|
|
43
|
+
return { response: "No agents configured.", toolsUsed: [], agentName: "none" };
|
|
44
|
+
}
|
|
45
|
+
// In single-agent mode, give the agent ALL tools
|
|
46
|
+
const allTools = this.toolExecutor.getAllTools();
|
|
47
|
+
const config = { ...agentConfig, tools: allTools };
|
|
48
|
+
return runAgent(config, userMessage, history, this.toolExecutor, this.cloudClient, context);
|
|
49
|
+
}
|
|
50
|
+
async runMultiAgent(userMessage, history, context) {
|
|
51
|
+
// Step 1: Run router to classify intent
|
|
52
|
+
const agentNames = Array.from(this.agentConfigs.keys());
|
|
53
|
+
const agentDescriptions = agentNames.map((name) => {
|
|
54
|
+
const config = this.agentConfigs.get(name);
|
|
55
|
+
return `- ${name}: handles ${config.tools.map((t) => t.name).join(", ")}`;
|
|
56
|
+
}).join("\n");
|
|
57
|
+
const routerPrompt = `${this.systemPrompt}
|
|
58
|
+
|
|
59
|
+
You are a routing agent. Analyze the user's message and decide which specialist agent should handle it.
|
|
60
|
+
|
|
61
|
+
Available agents:
|
|
62
|
+
${agentDescriptions}
|
|
63
|
+
|
|
64
|
+
Respond with the agent name and your reasoning. If the request is unclear, ask for clarification.
|
|
65
|
+
Pick the single best agent. Respond in this exact JSON format:
|
|
66
|
+
{"agent": "<agent-name>", "reasoning": "<why>"}`;
|
|
67
|
+
const routerResponse = await this.cloudClient.completion({
|
|
68
|
+
tier: this.config.architecture.router.model,
|
|
69
|
+
purpose: "runtime",
|
|
70
|
+
messages: [
|
|
71
|
+
{ role: "system", content: routerPrompt },
|
|
72
|
+
...history,
|
|
73
|
+
{ role: "user", content: userMessage },
|
|
74
|
+
],
|
|
75
|
+
responseFormat: "json",
|
|
76
|
+
});
|
|
77
|
+
// Parse router decision
|
|
78
|
+
let targetAgentName;
|
|
79
|
+
try {
|
|
80
|
+
const decision = JSON.parse(routerResponse.content);
|
|
81
|
+
targetAgentName = decision.agent;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Fallback: use first agent
|
|
85
|
+
targetAgentName = agentNames[0];
|
|
86
|
+
}
|
|
87
|
+
const agentConfig = this.agentConfigs.get(targetAgentName);
|
|
88
|
+
if (!agentConfig) {
|
|
89
|
+
// Fallback to first agent
|
|
90
|
+
const fallback = this.agentConfigs.values().next().value;
|
|
91
|
+
return runAgent(fallback, userMessage, history, this.toolExecutor, this.cloudClient, context);
|
|
92
|
+
}
|
|
93
|
+
return runAgent(agentConfig, userMessage, history, this.toolExecutor, this.cloudClient, context);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=agent-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-orchestrator.js","sourceRoot":"","sources":["../../src/runtime/agent-orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAA4C,MAAM,mBAAmB,CAAC;AAEvF,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAc;IACpB,YAAY,CAAe;IAC3B,WAAW,CAAmB;IAC9B,YAAY,CAAS;IACrB,YAAY,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE9D,YACE,MAAmB,EACnB,YAA0B,EAC1B,WAA6B,EAC7B,YAAqB;QAErB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,iCAAiC,CAAC;QACtE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,UAAU,GAAgB,EAAE,CAAC;YACnC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACvC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;iBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBAC7C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;iBACzC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEd,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;gBAChC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,GAAG,IAAI,CAAC,YAAY,0BAA0B,WAAW,6CAA6C;gBAC1I,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CACP,WAAmB,EACnB,mBAAkC,EAClC,WAAwB;QAExB,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;IAC3E,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,WAAmB,EACnB,OAAsB,EACtB,OAAoB;QAEpB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QACjF,CAAC;QAED,iDAAiD;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;QAEnD,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC9F,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,WAAmB,EACnB,OAAsB,EACtB,OAAoB;QAEpB,wCAAwC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YAC5C,OAAO,KAAK,IAAI,aAAa,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5E,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,YAAY;;;;;EAK3C,iBAAiB;;;;gDAI6B,CAAC;QAE7C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK;YAC3C,OAAO,EAAE,SAAS;YAClB,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE;gBACzC,GAAG,OAAO;gBACV,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;aACvC;YACD,cAAc,EAAE,MAAM;SACvB,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,eAAuB,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACpD,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;YAC5B,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,0BAA0B;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC1D,OAAO,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChG,CAAC;QAED,OAAO,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnG,CAAC;CACF"}
|