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
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# sammy-sdk
|
|
2
|
+
|
|
3
|
+
> Auto-configuring AI agent framework that learns your codebase and builds itself.
|
|
4
|
+
|
|
5
|
+
`sammy-sdk` is the official TypeScript SDK and CLI for [Sammy](https://sammy.dev). It scans your Next.js (or any TypeScript) project, builds typed agent tools from your real server actions and route handlers, and gives you a chat-style runtime that calls them safely.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install sammy-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Get an API key at [sammy.dev](https://sammy.dev), add it to your project's `.env.local`:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
SAMMY_API_KEY=sk_sammy_...
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The SDK defaults to the public Sammy Cloud API at `https://sammyapi-production.up.railway.app`. To point at a self-hosted instance or a preview deployment, set:
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
SAMMY_API_URL=https://your-sammy-api.example.com
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## CLI
|
|
26
|
+
|
|
27
|
+
The `sammy` binary ships with the package, so once `sammy-sdk` is installed you can run:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# 1. Scan your codebase and write sammy.config.ts
|
|
31
|
+
npx sammy init
|
|
32
|
+
|
|
33
|
+
# 2. Generate typed tool wrappers around the things Sammy found
|
|
34
|
+
npx sammy generate
|
|
35
|
+
|
|
36
|
+
# 3. Boot the local dev chat UI
|
|
37
|
+
npx sammy dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
There's also `npx sammy eval` for running deterministic evals against your agent.
|
|
41
|
+
|
|
42
|
+
## Programmatic usage
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
import { Sammy } from "sammy-sdk";
|
|
46
|
+
|
|
47
|
+
const sammy = new Sammy({
|
|
48
|
+
apiKey: process.env.SAMMY_API_KEY!,
|
|
49
|
+
tier: "balanced", // "fast" | "balanced" | "powerful"
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const reply = await sammy.chat([
|
|
53
|
+
{ role: "user", content: "Create a new deal for Acme Corp at $50k." },
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
console.log(reply.content);
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Sub-paths
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import { runtimeFromConfig } from "sammy-sdk/runtime";
|
|
63
|
+
import { SammyCloudClient } from "sammy-sdk/cloud";
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Environment variables
|
|
67
|
+
|
|
68
|
+
| Var | Purpose | Default |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `SAMMY_API_KEY` | Your Sammy Cloud API key | (required) |
|
|
71
|
+
| `SAMMY_API_URL` | Override the Cloud API base URL | `https://sammyapi-production.up.railway.app` |
|
|
72
|
+
|
|
73
|
+
## License
|
|
74
|
+
|
|
75
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,UAAU,SAUnB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export const devCommand = new Command("dev")
|
|
3
|
+
.description("Start Sammy dev server with hot-reload")
|
|
4
|
+
.option("--port <port>", "Port for the dev server", "3100")
|
|
5
|
+
.option("--no-open", "Don't open browser automatically")
|
|
6
|
+
.action(async (options) => {
|
|
7
|
+
const { runDev } = await import("../../dev/server.js");
|
|
8
|
+
await runDev({
|
|
9
|
+
port: parseInt(options.port, 10),
|
|
10
|
+
open: options.open,
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../src/cli/commands/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,eAAe,EAAE,yBAAyB,EAAE,MAAM,CAAC;KAC1D,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;KACvD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACvD,MAAM,MAAM,CAAC;QACX,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,WAAW,SAyBpB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export const evalCommand = new Command("eval")
|
|
3
|
+
.description("Run evaluation loop to test and refine agents")
|
|
4
|
+
.option("--no-refine", "Skip auto-refinement, only evaluate")
|
|
5
|
+
.option("--max-iterations <n>", "Maximum refinement iterations", "5")
|
|
6
|
+
.option("--ci", "Run in CI mode with strict pass/fail")
|
|
7
|
+
.option("--dimensions <dims>", "Comma-separated dimensions to evaluate")
|
|
8
|
+
.option("--agent <name>", "Evaluate a specific agent only")
|
|
9
|
+
.option("--budget <tokens>", "Token budget for eval run")
|
|
10
|
+
.option("--generate-only", "Generate scenarios without running eval")
|
|
11
|
+
.option("--from-iteration <n>", "Resume from a specific iteration")
|
|
12
|
+
.option("--dry-run", "Show what would be refined, don't apply changes")
|
|
13
|
+
.action(async (options) => {
|
|
14
|
+
const { EvalRunner } = await import("../../eval/runner.js");
|
|
15
|
+
const runner = new EvalRunner();
|
|
16
|
+
await runner.run({
|
|
17
|
+
noRefine: !options.refine,
|
|
18
|
+
maxIterations: parseInt(options.maxIterations, 10),
|
|
19
|
+
ci: options.ci,
|
|
20
|
+
dimensions: options.dimensions?.split(","),
|
|
21
|
+
agent: options.agent,
|
|
22
|
+
budget: options.budget ? parseInt(options.budget, 10) : undefined,
|
|
23
|
+
generateOnly: options.generateOnly,
|
|
24
|
+
fromIteration: options.fromIteration ? parseInt(options.fromIteration, 10) : undefined,
|
|
25
|
+
dryRun: options.dryRun,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/cli/commands/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;KAC5D,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,EAAE,GAAG,CAAC;KACpE,MAAM,CAAC,MAAM,EAAE,sCAAsC,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,wCAAwC,CAAC;KACvE,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;KAC1D,MAAM,CAAC,mBAAmB,EAAE,2BAA2B,CAAC;KACxD,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;KACpE,MAAM,CAAC,sBAAsB,EAAE,kCAAkC,CAAC;KAClE,MAAM,CAAC,WAAW,EAAE,iDAAiD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;IAChC,MAAM,MAAM,CAAC,GAAG,CAAC;QACf,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM;QACzB,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAClD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC;QAC1C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACjE,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,aAAa,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACtF,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,eAAe,SAOxB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export const generateCommand = new Command("generate")
|
|
3
|
+
.description("Generate tools and agents from sammy.config.json")
|
|
4
|
+
.option("--dry-run", "Preview generated files without writing")
|
|
5
|
+
.option("--domain <domain>", "Generate tools for a specific domain only")
|
|
6
|
+
.action(async (options) => {
|
|
7
|
+
const { runGenerate } = await import("../../generator/generate.js");
|
|
8
|
+
await runGenerate(options);
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC;KACnD,WAAW,CAAC,kDAAkD,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;KAC9D,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,CAAC;KACxE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC;IACpE,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,WAAW,SAMpB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export const initCommand = new Command("init")
|
|
3
|
+
.description("Scan your codebase and generate sammy.config.json")
|
|
4
|
+
.option("--force", "Overwrite existing config")
|
|
5
|
+
.action(async (options) => {
|
|
6
|
+
const { runInit } = await import("../../discovery/init.js");
|
|
7
|
+
await runInit(options);
|
|
8
|
+
});
|
|
9
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,2BAA2B,CAAC;KAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAC5D,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { initCommand } from "./commands/init.js";
|
|
4
|
+
import { generateCommand } from "./commands/generate.js";
|
|
5
|
+
import { evalCommand } from "./commands/eval.js";
|
|
6
|
+
import { devCommand } from "./commands/dev.js";
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name("sammy")
|
|
10
|
+
.description("Auto-configuring AI agent framework")
|
|
11
|
+
.version("0.1.0");
|
|
12
|
+
program.addCommand(initCommand);
|
|
13
|
+
program.addCommand(generateCommand);
|
|
14
|
+
program.addCommand(evalCommand);
|
|
15
|
+
program.addCommand(devCommand);
|
|
16
|
+
program.parse();
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,qCAAqC,CAAC;KAClD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AACpC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CompletionRequest, CompletionResponse, KeyValidationResponse, StreamChunk } from "sammy-sdk-shared";
|
|
2
|
+
export declare class SammyCloudClient {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
constructor(apiKey: string, baseUrl?: string);
|
|
6
|
+
completion(request: CompletionRequest): Promise<CompletionResponse>;
|
|
7
|
+
completionStream(request: CompletionRequest): AsyncIterable<StreamChunk>;
|
|
8
|
+
validateKey(): Promise<KeyValidationResponse>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sammy-cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sammy-cloud.d.ts","sourceRoot":"","sources":["../../src/cloud/sammy-cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG7G,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAqB;IAKpD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmClE,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC,WAAW,CAAC;IAiEzE,WAAW,IAAI,OAAO,CAAC,qBAAqB,CAAC;CAWpD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { SDK_VERSION, API_BASE_URL } from "sammy-sdk-shared";
|
|
2
|
+
export class SammyCloudClient {
|
|
3
|
+
apiKey;
|
|
4
|
+
baseUrl;
|
|
5
|
+
constructor(apiKey, baseUrl = API_BASE_URL) {
|
|
6
|
+
this.apiKey = apiKey;
|
|
7
|
+
this.baseUrl = baseUrl;
|
|
8
|
+
}
|
|
9
|
+
async completion(request) {
|
|
10
|
+
const response = await fetch(`${this.baseUrl}/v1/completions`, {
|
|
11
|
+
method: "POST",
|
|
12
|
+
headers: {
|
|
13
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
14
|
+
"Content-Type": "application/json",
|
|
15
|
+
"X-Sammy-SDK-Version": SDK_VERSION,
|
|
16
|
+
"X-Sammy-Purpose": request.purpose,
|
|
17
|
+
},
|
|
18
|
+
body: JSON.stringify({
|
|
19
|
+
tier: request.tier,
|
|
20
|
+
messages: request.messages,
|
|
21
|
+
maxTokens: request.maxTokens,
|
|
22
|
+
temperature: request.temperature,
|
|
23
|
+
responseFormat: request.responseFormat,
|
|
24
|
+
stream: false,
|
|
25
|
+
tools: request.tools,
|
|
26
|
+
toolChoice: request.toolChoice,
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
31
|
+
try {
|
|
32
|
+
const error = await response.json();
|
|
33
|
+
errorMessage = `[${error.code}] ${error.message}`;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
errorMessage = `HTTP ${response.status}: ${response.statusText}`;
|
|
37
|
+
}
|
|
38
|
+
throw new Error(errorMessage);
|
|
39
|
+
}
|
|
40
|
+
return response.json();
|
|
41
|
+
}
|
|
42
|
+
async *completionStream(request) {
|
|
43
|
+
const response = await fetch(`${this.baseUrl}/v1/completions`, {
|
|
44
|
+
method: "POST",
|
|
45
|
+
headers: {
|
|
46
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
47
|
+
"Content-Type": "application/json",
|
|
48
|
+
Accept: "text/event-stream",
|
|
49
|
+
"X-Sammy-SDK-Version": SDK_VERSION,
|
|
50
|
+
"X-Sammy-Purpose": request.purpose,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
tier: request.tier,
|
|
54
|
+
messages: request.messages,
|
|
55
|
+
maxTokens: request.maxTokens,
|
|
56
|
+
temperature: request.temperature,
|
|
57
|
+
responseFormat: request.responseFormat,
|
|
58
|
+
stream: true,
|
|
59
|
+
tools: request.tools,
|
|
60
|
+
toolChoice: request.toolChoice,
|
|
61
|
+
}),
|
|
62
|
+
});
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
let errorMessage = `HTTP ${response.status}`;
|
|
65
|
+
try {
|
|
66
|
+
const error = await response.json();
|
|
67
|
+
errorMessage = `[${error.code}] ${error.message}`;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
errorMessage = `HTTP ${response.status}: ${response.statusText}`;
|
|
71
|
+
}
|
|
72
|
+
throw new Error(errorMessage);
|
|
73
|
+
}
|
|
74
|
+
if (!response.body) {
|
|
75
|
+
throw new Error("No response body for stream");
|
|
76
|
+
}
|
|
77
|
+
const reader = response.body.getReader();
|
|
78
|
+
const decoder = new TextDecoder();
|
|
79
|
+
let buffer = "";
|
|
80
|
+
while (true) {
|
|
81
|
+
const { done, value } = await reader.read();
|
|
82
|
+
if (done)
|
|
83
|
+
break;
|
|
84
|
+
buffer += decoder.decode(value, { stream: true });
|
|
85
|
+
const lines = buffer.split("\n");
|
|
86
|
+
buffer = lines.pop() || "";
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
if (line.startsWith("data: ")) {
|
|
89
|
+
const data = line.slice(6).trim();
|
|
90
|
+
if (!data || data === "[DONE]")
|
|
91
|
+
continue;
|
|
92
|
+
try {
|
|
93
|
+
const chunk = JSON.parse(data);
|
|
94
|
+
yield chunk;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
// Skip malformed events
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async validateKey() {
|
|
104
|
+
const response = await fetch(`${this.baseUrl}/v1/auth/validate`, {
|
|
105
|
+
headers: { Authorization: `Bearer ${this.apiKey}` },
|
|
106
|
+
});
|
|
107
|
+
if (!response.ok) {
|
|
108
|
+
throw new Error("Invalid API key");
|
|
109
|
+
}
|
|
110
|
+
return response.json();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=sammy-cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sammy-cloud.js","sourceRoot":"","sources":["../../src/cloud/sammy-cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-ui.d.ts","sourceRoot":"","sources":["../../src/dev/chat-ui.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA6FjG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export function getChatHTML(info) {
|
|
2
|
+
return `<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Sammy Dev</title>
|
|
8
|
+
<style>
|
|
9
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
10
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0f172a; color: #e2e8f0; height: 100vh; display: flex; flex-direction: column; }
|
|
11
|
+
header { padding: 16px 24px; border-bottom: 1px solid #1e293b; display: flex; justify-content: space-between; align-items: center; }
|
|
12
|
+
header h1 { font-size: 18px; font-weight: 600; }
|
|
13
|
+
header span { font-size: 13px; color: #64748b; }
|
|
14
|
+
#messages { flex: 1; overflow-y: auto; padding: 24px; display: flex; flex-direction: column; gap: 16px; }
|
|
15
|
+
.msg { max-width: 75%; padding: 12px 16px; border-radius: 12px; font-size: 14px; line-height: 1.5; white-space: pre-wrap; }
|
|
16
|
+
.msg.user { align-self: flex-end; background: #2563eb; color: white; border-bottom-right-radius: 4px; }
|
|
17
|
+
.msg.assistant { align-self: flex-start; background: #1e293b; border-bottom-left-radius: 4px; }
|
|
18
|
+
.msg.tool { align-self: flex-start; background: #1a1a2e; border: 1px solid #334155; font-family: monospace; font-size: 12px; color: #94a3b8; max-width: 90%; }
|
|
19
|
+
.msg.tool .label { color: #38bdf8; font-weight: 600; margin-bottom: 4px; }
|
|
20
|
+
.msg.agent-badge { align-self: center; background: transparent; color: #64748b; font-size: 12px; padding: 4px 12px; }
|
|
21
|
+
.streaming { opacity: 0.7; }
|
|
22
|
+
#input-area { padding: 16px 24px; border-top: 1px solid #1e293b; display: flex; gap: 12px; }
|
|
23
|
+
#input { flex: 1; padding: 12px 16px; border-radius: 10px; border: 1px solid #334155; background: #1e293b; color: #e2e8f0; font-size: 14px; outline: none; }
|
|
24
|
+
#input:focus { border-color: #2563eb; }
|
|
25
|
+
#send { padding: 12px 24px; border-radius: 10px; border: none; background: #2563eb; color: white; font-size: 14px; font-weight: 600; cursor: pointer; }
|
|
26
|
+
#send:hover { background: #1d4ed8; }
|
|
27
|
+
#send:disabled { background: #334155; cursor: not-allowed; }
|
|
28
|
+
</style>
|
|
29
|
+
</head>
|
|
30
|
+
<body>
|
|
31
|
+
<header>
|
|
32
|
+
<h1>Sammy Dev</h1>
|
|
33
|
+
<span>${info.tools} tools · ${info.agents} agents · ${info.architecture}</span>
|
|
34
|
+
</header>
|
|
35
|
+
<div id="messages"></div>
|
|
36
|
+
<div id="input-area">
|
|
37
|
+
<input id="input" type="text" placeholder="Type a message..." autofocus />
|
|
38
|
+
<button id="send">Send</button>
|
|
39
|
+
</div>
|
|
40
|
+
<script>
|
|
41
|
+
const messages = document.getElementById('messages');
|
|
42
|
+
const input = document.getElementById('input');
|
|
43
|
+
const sendBtn = document.getElementById('send');
|
|
44
|
+
let conversationId = null;
|
|
45
|
+
|
|
46
|
+
function addMessage(role, text, cls) {
|
|
47
|
+
const div = document.createElement('div');
|
|
48
|
+
div.className = 'msg ' + (cls || role);
|
|
49
|
+
div.textContent = text;
|
|
50
|
+
messages.appendChild(div);
|
|
51
|
+
messages.scrollTop = messages.scrollHeight;
|
|
52
|
+
return div;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function send() {
|
|
56
|
+
const text = input.value.trim();
|
|
57
|
+
if (!text) return;
|
|
58
|
+
input.value = '';
|
|
59
|
+
sendBtn.disabled = true;
|
|
60
|
+
|
|
61
|
+
addMessage('user', text);
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
const res = await fetch('/chat', {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'Content-Type': 'application/json' },
|
|
67
|
+
body: JSON.stringify({ message: text, conversationId }),
|
|
68
|
+
});
|
|
69
|
+
const data = await res.json();
|
|
70
|
+
conversationId = data.conversationId;
|
|
71
|
+
|
|
72
|
+
if (data.agentUsed && data.agentUsed !== 'none') {
|
|
73
|
+
addMessage('', data.agentUsed, 'agent-badge');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const tool of data.toolsUsed || []) {
|
|
77
|
+
addMessage('', tool.name + '(' + JSON.stringify(tool.params) + ')\\n→ ' + JSON.stringify(tool.result), 'tool');
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
addMessage('assistant', data.message);
|
|
81
|
+
} catch (err) {
|
|
82
|
+
addMessage('assistant', 'Error: ' + err.message);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
sendBtn.disabled = false;
|
|
86
|
+
input.focus();
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
sendBtn.addEventListener('click', send);
|
|
90
|
+
input.addEventListener('keydown', (e) => { if (e.key === 'Enter') send(); });
|
|
91
|
+
</script>
|
|
92
|
+
</body>
|
|
93
|
+
</html>`;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=chat-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-ui.js","sourceRoot":"","sources":["../../src/dev/chat-ui.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,IAA6D;IACvF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA+BG,IAAI,CAAC,KAAK,mBAAmB,IAAI,CAAC,MAAM,oBAAoB,IAAI,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4DjF,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dev/server.ts"],"names":[],"mappings":"AAQA,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,iBAyFpE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import express from "express";
|
|
5
|
+
import { Sammy } from "../runtime/sammy.js";
|
|
6
|
+
import { getChatHTML } from "./chat-ui.js";
|
|
7
|
+
import { watchForChanges } from "./watcher.js";
|
|
8
|
+
export async function runDev(options) {
|
|
9
|
+
const projectRoot = process.cwd();
|
|
10
|
+
const configPath = path.join(projectRoot, "sammy.config.json");
|
|
11
|
+
if (!fs.existsSync(configPath)) {
|
|
12
|
+
console.log(chalk.red("\n No sammy.config.json found. Run `npx sammy init` first.\n"));
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const sammyDir = path.join(projectRoot, ".sammy");
|
|
16
|
+
if (!fs.existsSync(sammyDir)) {
|
|
17
|
+
console.log(chalk.red("\n No .sammy/ directory found. Run `npx sammy generate` first.\n"));
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
console.log(chalk.bold("\n Sammy Dev Server\n"));
|
|
21
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
22
|
+
let sammy;
|
|
23
|
+
try {
|
|
24
|
+
sammy = new Sammy({
|
|
25
|
+
configPath,
|
|
26
|
+
systemPrompt: "You are a helpful AI assistant in development mode. Show detailed responses.",
|
|
27
|
+
});
|
|
28
|
+
// Wait for async initialization
|
|
29
|
+
await sammy.initPromise;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
console.log(chalk.red(` Failed to initialize: ${err.message}\n`));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const toolCount = config.domains?.reduce((sum, d) => sum + (d.tools?.length || 0), 0) || 0;
|
|
36
|
+
const agentCount = config.architecture?.agents?.length || 0;
|
|
37
|
+
const archType = config.architecture?.type || "single-agent";
|
|
38
|
+
console.log(chalk.dim(` ✓ Loaded sammy.config.json`));
|
|
39
|
+
console.log(chalk.dim(` ✓ ${toolCount} tools across ${config.domains?.length || 0} domains`));
|
|
40
|
+
console.log(chalk.dim(` ✓ ${agentCount} agents (${archType})`));
|
|
41
|
+
console.log();
|
|
42
|
+
const app = express();
|
|
43
|
+
app.use(express.json());
|
|
44
|
+
app.get("/", (_req, res) => {
|
|
45
|
+
res.type("html").send(getChatHTML({ tools: toolCount, agents: agentCount, architecture: archType }));
|
|
46
|
+
});
|
|
47
|
+
app.post("/chat", async (req, res) => {
|
|
48
|
+
try {
|
|
49
|
+
const { message, conversationId } = req.body;
|
|
50
|
+
const response = await sammy.chat({ message, conversationId });
|
|
51
|
+
res.json(response);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
res.status(500).json({ error: err.message });
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
app.post("/chat/stream", async (req, res) => {
|
|
58
|
+
try {
|
|
59
|
+
const { message, conversationId } = req.body;
|
|
60
|
+
const stream = sammy.chatStream({ message, conversationId });
|
|
61
|
+
res.setHeader("Content-Type", "text/event-stream");
|
|
62
|
+
res.setHeader("Cache-Control", "no-cache");
|
|
63
|
+
res.setHeader("Connection", "keep-alive");
|
|
64
|
+
res.flushHeaders();
|
|
65
|
+
const reader = stream.getReader();
|
|
66
|
+
while (true) {
|
|
67
|
+
const { done, value } = await reader.read();
|
|
68
|
+
if (done)
|
|
69
|
+
break;
|
|
70
|
+
res.write(value);
|
|
71
|
+
}
|
|
72
|
+
res.end();
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
res.status(500).json({ error: err.message });
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Watch for changes and reload
|
|
79
|
+
watchForChanges(projectRoot, () => {
|
|
80
|
+
console.log(chalk.dim(" Detected changes, restart to reload..."));
|
|
81
|
+
});
|
|
82
|
+
app.listen(options.port, () => {
|
|
83
|
+
console.log(chalk.green(` ✓ Dev server running at http://localhost:${options.port}`));
|
|
84
|
+
console.log(chalk.dim(` Open in browser to chat with your agents\n`));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dev/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAAwC;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAChE,IAAI,KAAY,CAAC;IAEjB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,KAAK,CAAC;YAChB,UAAU;YACV,YAAY,EAAE,8EAA8E;SAC7F,CAAC,CAAC;QACH,gCAAgC;QAChC,MAAO,KAAa,CAAC,WAAW,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,cAAc,CAAC;IAE7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,SAAS,iBAAiB,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,UAAU,YAAY,QAAQ,GAAG,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACzB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YAC/D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAC7C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YAE7D,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;YACnD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC3C,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;YAC1C,GAAG,CAAC,YAAY,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;YAClC,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YACD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,eAAe,CAAC,WAAW,EAAE,GAAG,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE;QAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8CAA8C,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/dev/watcher.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,IAAI,GACnB,IAAI,CAkBN"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
export function watchForChanges(projectRoot, onChange) {
|
|
4
|
+
const sammyDir = path.join(projectRoot, ".sammy");
|
|
5
|
+
const configPath = path.join(projectRoot, "sammy.config.json");
|
|
6
|
+
let debounceTimer = null;
|
|
7
|
+
const debounced = () => {
|
|
8
|
+
if (debounceTimer)
|
|
9
|
+
clearTimeout(debounceTimer);
|
|
10
|
+
debounceTimer = setTimeout(onChange, 300);
|
|
11
|
+
};
|
|
12
|
+
if (fs.existsSync(sammyDir)) {
|
|
13
|
+
fs.watch(sammyDir, { recursive: true }, debounced);
|
|
14
|
+
}
|
|
15
|
+
if (fs.existsSync(configPath)) {
|
|
16
|
+
fs.watch(configPath, debounced);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/dev/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,QAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAE/D,IAAI,aAAa,GAAyC,IAAI,CAAC;IAE/D,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,IAAI,aAAa;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QAC/C,aAAa,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC;IAEF,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Node, SourceFile } from "ts-morph";
|
|
2
|
+
export interface FoundCallRoute {
|
|
3
|
+
method: string;
|
|
4
|
+
path: string;
|
|
5
|
+
handlerBody: Node | undefined;
|
|
6
|
+
args: Node[];
|
|
7
|
+
}
|
|
8
|
+
export declare function findCallRoutes(sourceFile: SourceFile): FoundCallRoute[];
|
|
9
|
+
export interface FoundRouteObject {
|
|
10
|
+
methods: string[];
|
|
11
|
+
path: string;
|
|
12
|
+
handlerBody: Node | undefined;
|
|
13
|
+
schemaBody: Node | undefined;
|
|
14
|
+
}
|
|
15
|
+
export declare function findRouteObjects(sourceFile: SourceFile): FoundRouteObject[];
|
|
16
|
+
//# sourceMappingURL=call-route-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-route-finder.d.ts","sourceRoot":"","sources":["../../../src/discovery/ast/call-route-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAc,MAAM,UAAU,CAAC;AAOxD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,IAAI,EAAE,CAAC;CACd;AAKD,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,EAAE,CAuBvE;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;CAC9B;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,gBAAgB,EAAE,CAwB3E"}
|