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.
Files changed (274) hide show
  1. package/README.md +75 -0
  2. package/dist/cli/commands/dev.d.ts +3 -0
  3. package/dist/cli/commands/dev.d.ts.map +1 -0
  4. package/dist/cli/commands/dev.js +13 -0
  5. package/dist/cli/commands/dev.js.map +1 -0
  6. package/dist/cli/commands/eval.d.ts +3 -0
  7. package/dist/cli/commands/eval.d.ts.map +1 -0
  8. package/dist/cli/commands/eval.js +28 -0
  9. package/dist/cli/commands/eval.js.map +1 -0
  10. package/dist/cli/commands/generate.d.ts +3 -0
  11. package/dist/cli/commands/generate.d.ts.map +1 -0
  12. package/dist/cli/commands/generate.js +10 -0
  13. package/dist/cli/commands/generate.js.map +1 -0
  14. package/dist/cli/commands/init.d.ts +3 -0
  15. package/dist/cli/commands/init.d.ts.map +1 -0
  16. package/dist/cli/commands/init.js +9 -0
  17. package/dist/cli/commands/init.js.map +1 -0
  18. package/dist/cli/index.d.ts +3 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +17 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cloud/sammy-cloud.d.ts +10 -0
  23. package/dist/cloud/sammy-cloud.d.ts.map +1 -0
  24. package/dist/cloud/sammy-cloud.js +113 -0
  25. package/dist/cloud/sammy-cloud.js.map +1 -0
  26. package/dist/dev/chat-ui.d.ts +6 -0
  27. package/dist/dev/chat-ui.d.ts.map +1 -0
  28. package/dist/dev/chat-ui.js +95 -0
  29. package/dist/dev/chat-ui.js.map +1 -0
  30. package/dist/dev/server.d.ts +5 -0
  31. package/dist/dev/server.d.ts.map +1 -0
  32. package/dist/dev/server.js +87 -0
  33. package/dist/dev/server.js.map +1 -0
  34. package/dist/dev/watcher.d.ts +2 -0
  35. package/dist/dev/watcher.d.ts.map +1 -0
  36. package/dist/dev/watcher.js +19 -0
  37. package/dist/dev/watcher.js.map +1 -0
  38. package/dist/discovery/ast/call-route-finder.d.ts +16 -0
  39. package/dist/discovery/ast/call-route-finder.d.ts.map +1 -0
  40. package/dist/discovery/ast/call-route-finder.js +106 -0
  41. package/dist/discovery/ast/call-route-finder.js.map +1 -0
  42. package/dist/discovery/ast/handler-detector.d.ts +8 -0
  43. package/dist/discovery/ast/handler-detector.d.ts.map +1 -0
  44. package/dist/discovery/ast/handler-detector.js +56 -0
  45. package/dist/discovery/ast/handler-detector.js.map +1 -0
  46. package/dist/discovery/ast/named-export-finder.d.ts +7 -0
  47. package/dist/discovery/ast/named-export-finder.d.ts.map +1 -0
  48. package/dist/discovery/ast/named-export-finder.js +21 -0
  49. package/dist/discovery/ast/named-export-finder.js.map +1 -0
  50. package/dist/discovery/ast/param-extractor.d.ts +7 -0
  51. package/dist/discovery/ast/param-extractor.d.ts.map +1 -0
  52. package/dist/discovery/ast/param-extractor.js +236 -0
  53. package/dist/discovery/ast/param-extractor.js.map +1 -0
  54. package/dist/discovery/ast/project.d.ts +8 -0
  55. package/dist/discovery/ast/project.d.ts.map +1 -0
  56. package/dist/discovery/ast/project.js +66 -0
  57. package/dist/discovery/ast/project.js.map +1 -0
  58. package/dist/discovery/ast/resolve.d.ts +5 -0
  59. package/dist/discovery/ast/resolve.d.ts.map +1 -0
  60. package/dist/discovery/ast/resolve.js +60 -0
  61. package/dist/discovery/ast/resolve.js.map +1 -0
  62. package/dist/discovery/ast/side-effect-tracer.d.ts +4 -0
  63. package/dist/discovery/ast/side-effect-tracer.d.ts.map +1 -0
  64. package/dist/discovery/ast/side-effect-tracer.js +100 -0
  65. package/dist/discovery/ast/side-effect-tracer.js.map +1 -0
  66. package/dist/discovery/ast/source-files.d.ts +3 -0
  67. package/dist/discovery/ast/source-files.d.ts.map +1 -0
  68. package/dist/discovery/ast/source-files.js +37 -0
  69. package/dist/discovery/ast/source-files.js.map +1 -0
  70. package/dist/discovery/config-generator.d.ts +5 -0
  71. package/dist/discovery/config-generator.d.ts.map +1 -0
  72. package/dist/discovery/config-generator.js +71 -0
  73. package/dist/discovery/config-generator.js.map +1 -0
  74. package/dist/discovery/extractors/auth-detector.d.ts +3 -0
  75. package/dist/discovery/extractors/auth-detector.d.ts.map +1 -0
  76. package/dist/discovery/extractors/auth-detector.js +97 -0
  77. package/dist/discovery/extractors/auth-detector.js.map +1 -0
  78. package/dist/discovery/extractors/http-call-extractor.d.ts +5 -0
  79. package/dist/discovery/extractors/http-call-extractor.d.ts.map +1 -0
  80. package/dist/discovery/extractors/http-call-extractor.js +122 -0
  81. package/dist/discovery/extractors/http-call-extractor.js.map +1 -0
  82. package/dist/discovery/extractors/model-extractor.d.ts +4 -0
  83. package/dist/discovery/extractors/model-extractor.d.ts.map +1 -0
  84. package/dist/discovery/extractors/model-extractor.js +256 -0
  85. package/dist/discovery/extractors/model-extractor.js.map +1 -0
  86. package/dist/discovery/extractors/nestjs-extractor.d.ts +4 -0
  87. package/dist/discovery/extractors/nestjs-extractor.d.ts.map +1 -0
  88. package/dist/discovery/extractors/nestjs-extractor.js +156 -0
  89. package/dist/discovery/extractors/nestjs-extractor.js.map +1 -0
  90. package/dist/discovery/extractors/remix-extractor.d.ts +5 -0
  91. package/dist/discovery/extractors/remix-extractor.d.ts.map +1 -0
  92. package/dist/discovery/extractors/remix-extractor.js +118 -0
  93. package/dist/discovery/extractors/remix-extractor.js.map +1 -0
  94. package/dist/discovery/extractors/route-extractor.d.ts +4 -0
  95. package/dist/discovery/extractors/route-extractor.d.ts.map +1 -0
  96. package/dist/discovery/extractors/route-extractor.js +108 -0
  97. package/dist/discovery/extractors/route-extractor.js.map +1 -0
  98. package/dist/discovery/extractors/server-action-extractor.d.ts +4 -0
  99. package/dist/discovery/extractors/server-action-extractor.d.ts.map +1 -0
  100. package/dist/discovery/extractors/server-action-extractor.js +129 -0
  101. package/dist/discovery/extractors/server-action-extractor.js.map +1 -0
  102. package/dist/discovery/extractors/service-detector.d.ts +3 -0
  103. package/dist/discovery/extractors/service-detector.d.ts.map +1 -0
  104. package/dist/discovery/extractors/service-detector.js +114 -0
  105. package/dist/discovery/extractors/service-detector.js.map +1 -0
  106. package/dist/discovery/extractors/sveltekit-extractor.d.ts +5 -0
  107. package/dist/discovery/extractors/sveltekit-extractor.d.ts.map +1 -0
  108. package/dist/discovery/extractors/sveltekit-extractor.js +129 -0
  109. package/dist/discovery/extractors/sveltekit-extractor.js.map +1 -0
  110. package/dist/discovery/extractors/trpc-extractor.d.ts +4 -0
  111. package/dist/discovery/extractors/trpc-extractor.d.ts.map +1 -0
  112. package/dist/discovery/extractors/trpc-extractor.js +191 -0
  113. package/dist/discovery/extractors/trpc-extractor.js.map +1 -0
  114. package/dist/discovery/framework-detector.d.ts +9 -0
  115. package/dist/discovery/framework-detector.d.ts.map +1 -0
  116. package/dist/discovery/framework-detector.js +68 -0
  117. package/dist/discovery/framework-detector.js.map +1 -0
  118. package/dist/discovery/init.d.ts +4 -0
  119. package/dist/discovery/init.d.ts.map +1 -0
  120. package/dist/discovery/init.js +102 -0
  121. package/dist/discovery/init.js.map +1 -0
  122. package/dist/discovery/llm-analyzer.d.ts +32 -0
  123. package/dist/discovery/llm-analyzer.d.ts.map +1 -0
  124. package/dist/discovery/llm-analyzer.js +162 -0
  125. package/dist/discovery/llm-analyzer.js.map +1 -0
  126. package/dist/discovery/orchestrator.d.ts +4 -0
  127. package/dist/discovery/orchestrator.d.ts.map +1 -0
  128. package/dist/discovery/orchestrator.js +47 -0
  129. package/dist/discovery/orchestrator.js.map +1 -0
  130. package/dist/discovery/scanners/express-scanner.d.ts +3 -0
  131. package/dist/discovery/scanners/express-scanner.d.ts.map +1 -0
  132. package/dist/discovery/scanners/express-scanner.js +10 -0
  133. package/dist/discovery/scanners/express-scanner.js.map +1 -0
  134. package/dist/discovery/scanners/fastify-scanner.d.ts +3 -0
  135. package/dist/discovery/scanners/fastify-scanner.d.ts.map +1 -0
  136. package/dist/discovery/scanners/fastify-scanner.js +10 -0
  137. package/dist/discovery/scanners/fastify-scanner.js.map +1 -0
  138. package/dist/discovery/scanners/hono-scanner.d.ts +3 -0
  139. package/dist/discovery/scanners/hono-scanner.d.ts.map +1 -0
  140. package/dist/discovery/scanners/hono-scanner.js +10 -0
  141. package/dist/discovery/scanners/hono-scanner.js.map +1 -0
  142. package/dist/discovery/scanners/nestjs-scanner.d.ts +3 -0
  143. package/dist/discovery/scanners/nestjs-scanner.d.ts.map +1 -0
  144. package/dist/discovery/scanners/nestjs-scanner.js +10 -0
  145. package/dist/discovery/scanners/nestjs-scanner.js.map +1 -0
  146. package/dist/discovery/scanners/nextjs-scanner.d.ts +3 -0
  147. package/dist/discovery/scanners/nextjs-scanner.d.ts.map +1 -0
  148. package/dist/discovery/scanners/nextjs-scanner.js +15 -0
  149. package/dist/discovery/scanners/nextjs-scanner.js.map +1 -0
  150. package/dist/discovery/scanners/registry.d.ts +3 -0
  151. package/dist/discovery/scanners/registry.d.ts.map +1 -0
  152. package/dist/discovery/scanners/registry.js +22 -0
  153. package/dist/discovery/scanners/registry.js.map +1 -0
  154. package/dist/discovery/scanners/remix-scanner.d.ts +3 -0
  155. package/dist/discovery/scanners/remix-scanner.d.ts.map +1 -0
  156. package/dist/discovery/scanners/remix-scanner.js +13 -0
  157. package/dist/discovery/scanners/remix-scanner.js.map +1 -0
  158. package/dist/discovery/scanners/sveltekit-scanner.d.ts +3 -0
  159. package/dist/discovery/scanners/sveltekit-scanner.d.ts.map +1 -0
  160. package/dist/discovery/scanners/sveltekit-scanner.js +10 -0
  161. package/dist/discovery/scanners/sveltekit-scanner.js.map +1 -0
  162. package/dist/discovery/scanners/trpc-scanner.d.ts +3 -0
  163. package/dist/discovery/scanners/trpc-scanner.d.ts.map +1 -0
  164. package/dist/discovery/scanners/trpc-scanner.js +21 -0
  165. package/dist/discovery/scanners/trpc-scanner.js.map +1 -0
  166. package/dist/discovery/scanners/types.d.ts +18 -0
  167. package/dist/discovery/scanners/types.d.ts.map +1 -0
  168. package/dist/discovery/scanners/types.js +2 -0
  169. package/dist/discovery/scanners/types.js.map +1 -0
  170. package/dist/discovery/types.d.ts +60 -0
  171. package/dist/discovery/types.d.ts.map +1 -0
  172. package/dist/discovery/types.js +2 -0
  173. package/dist/discovery/types.js.map +1 -0
  174. package/dist/eval/diagnoser.d.ts +4 -0
  175. package/dist/eval/diagnoser.d.ts.map +1 -0
  176. package/dist/eval/diagnoser.js +97 -0
  177. package/dist/eval/diagnoser.js.map +1 -0
  178. package/dist/eval/judge.d.ts +8 -0
  179. package/dist/eval/judge.d.ts.map +1 -0
  180. package/dist/eval/judge.js +71 -0
  181. package/dist/eval/judge.js.map +1 -0
  182. package/dist/eval/loop-guard.d.ts +12 -0
  183. package/dist/eval/loop-guard.d.ts.map +1 -0
  184. package/dist/eval/loop-guard.js +45 -0
  185. package/dist/eval/loop-guard.js.map +1 -0
  186. package/dist/eval/refiner.d.ts +5 -0
  187. package/dist/eval/refiner.d.ts.map +1 -0
  188. package/dist/eval/refiner.js +149 -0
  189. package/dist/eval/refiner.js.map +1 -0
  190. package/dist/eval/runner.d.ts +27 -0
  191. package/dist/eval/runner.d.ts.map +1 -0
  192. package/dist/eval/runner.js +198 -0
  193. package/dist/eval/runner.js.map +1 -0
  194. package/dist/eval/scenario-generator.d.ts +5 -0
  195. package/dist/eval/scenario-generator.d.ts.map +1 -0
  196. package/dist/eval/scenario-generator.js +185 -0
  197. package/dist/eval/scenario-generator.js.map +1 -0
  198. package/dist/eval/scorer.d.ts +9 -0
  199. package/dist/eval/scorer.d.ts.map +1 -0
  200. package/dist/eval/scorer.js +189 -0
  201. package/dist/eval/scorer.js.map +1 -0
  202. package/dist/eval/types.d.ts +135 -0
  203. package/dist/eval/types.d.ts.map +1 -0
  204. package/dist/eval/types.js +37 -0
  205. package/dist/eval/types.js.map +1 -0
  206. package/dist/generator/agent-generator.d.ts +3 -0
  207. package/dist/generator/agent-generator.d.ts.map +1 -0
  208. package/dist/generator/agent-generator.js +29 -0
  209. package/dist/generator/agent-generator.js.map +1 -0
  210. package/dist/generator/generate.d.ts +5 -0
  211. package/dist/generator/generate.d.ts.map +1 -0
  212. package/dist/generator/generate.js +119 -0
  213. package/dist/generator/generate.js.map +1 -0
  214. package/dist/generator/handler-generator.d.ts +3 -0
  215. package/dist/generator/handler-generator.d.ts.map +1 -0
  216. package/dist/generator/handler-generator.js +66 -0
  217. package/dist/generator/handler-generator.js.map +1 -0
  218. package/dist/generator/index-generator.d.ts +3 -0
  219. package/dist/generator/index-generator.d.ts.map +1 -0
  220. package/dist/generator/index-generator.js +28 -0
  221. package/dist/generator/index-generator.js.map +1 -0
  222. package/dist/generator/merge-logic.d.ts +15 -0
  223. package/dist/generator/merge-logic.d.ts.map +1 -0
  224. package/dist/generator/merge-logic.js +52 -0
  225. package/dist/generator/merge-logic.js.map +1 -0
  226. package/dist/generator/router-generator.d.ts +3 -0
  227. package/dist/generator/router-generator.d.ts.map +1 -0
  228. package/dist/generator/router-generator.js +55 -0
  229. package/dist/generator/router-generator.js.map +1 -0
  230. package/dist/generator/schema-generator.d.ts +3 -0
  231. package/dist/generator/schema-generator.d.ts.map +1 -0
  232. package/dist/generator/schema-generator.js +58 -0
  233. package/dist/generator/schema-generator.js.map +1 -0
  234. package/dist/index.d.ts +4 -0
  235. package/dist/index.d.ts.map +1 -0
  236. package/dist/index.js +2 -0
  237. package/dist/index.js.map +1 -0
  238. package/dist/runtime/agent-orchestrator.d.ts +19 -0
  239. package/dist/runtime/agent-orchestrator.d.ts.map +1 -0
  240. package/dist/runtime/agent-orchestrator.js +96 -0
  241. package/dist/runtime/agent-orchestrator.js.map +1 -0
  242. package/dist/runtime/agent-runner.d.ts +22 -0
  243. package/dist/runtime/agent-runner.d.ts.map +1 -0
  244. package/dist/runtime/agent-runner.js +59 -0
  245. package/dist/runtime/agent-runner.js.map +1 -0
  246. package/dist/runtime/config-loader.d.ts +12 -0
  247. package/dist/runtime/config-loader.d.ts.map +1 -0
  248. package/dist/runtime/config-loader.js +42 -0
  249. package/dist/runtime/config-loader.js.map +1 -0
  250. package/dist/runtime/conversation-manager.d.ts +16 -0
  251. package/dist/runtime/conversation-manager.d.ts.map +1 -0
  252. package/dist/runtime/conversation-manager.js +33 -0
  253. package/dist/runtime/conversation-manager.js.map +1 -0
  254. package/dist/runtime/sammy.d.ts +17 -0
  255. package/dist/runtime/sammy.d.ts.map +1 -0
  256. package/dist/runtime/sammy.js +97 -0
  257. package/dist/runtime/sammy.js.map +1 -0
  258. package/dist/runtime/tool-executor.d.ts +14 -0
  259. package/dist/runtime/tool-executor.d.ts.map +1 -0
  260. package/dist/runtime/tool-executor.js +58 -0
  261. package/dist/runtime/tool-executor.js.map +1 -0
  262. package/dist/runtime/tool-types.d.ts +26 -0
  263. package/dist/runtime/tool-types.d.ts.map +1 -0
  264. package/dist/runtime/tool-types.js +2 -0
  265. package/dist/runtime/tool-types.js.map +1 -0
  266. package/dist/runtime/types.d.ts +100 -0
  267. package/dist/runtime/types.d.ts.map +1 -0
  268. package/dist/runtime/types.js +2 -0
  269. package/dist/runtime/types.js.map +1 -0
  270. package/dist/runtime/zod-to-json-schema.d.ts +3 -0
  271. package/dist/runtime/zod-to-json-schema.d.ts.map +1 -0
  272. package/dist/runtime/zod-to-json-schema.js +82 -0
  273. package/dist/runtime/zod-to-json-schema.js.map +1 -0
  274. 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,3 @@
1
+ import type { ToolConfig, DomainConfig } from "../runtime/types.js";
2
+ export declare function generateToolFile(tool: ToolConfig, domain: DomainConfig, projectRoot: string): string;
3
+ //# sourceMappingURL=handler-generator.d.ts.map
@@ -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,3 @@
1
+ import type { SammyConfig } from "../runtime/types.js";
2
+ export declare function generateIndexFile(config: SammyConfig): string;
3
+ //# sourceMappingURL=index-generator.d.ts.map
@@ -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,3 @@
1
+ import type { ArchitectureConfig, DomainConfig } from "../runtime/types.js";
2
+ export declare function generateRouterFile(architecture: ArchitectureConfig, domains: DomainConfig[]): string | null;
3
+ //# sourceMappingURL=router-generator.d.ts.map
@@ -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,3 @@
1
+ import type { DomainConfig } from "../runtime/types.js";
2
+ export declare function generateSchemaFile(domain: DomainConfig): string;
3
+ //# sourceMappingURL=schema-generator.d.ts.map
@@ -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"}
@@ -0,0 +1,4 @@
1
+ export { Sammy } from "./runtime/sammy.js";
2
+ export type { SammyConfig, SammyOptions } from "./runtime/types.js";
3
+ export type { SammyTool, ToolHandler, ToolContext } from "./runtime/tool-types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { Sammy } from "./runtime/sammy.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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":"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"}