@reallyartificial/grain 0.3.0 → 0.3.2

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.
@@ -0,0 +1,2 @@
1
+ export declare function startBuilder(port?: number): void;
2
+ //# sourceMappingURL=builder-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-server.d.ts","sourceRoot":"","sources":["../src/builder-server.ts"],"names":[],"mappings":"AAwFA,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,QA6EzC"}
@@ -0,0 +1,156 @@
1
+ import { createServer } from "node:http";
2
+ import { readFileSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { exec } from "node:child_process";
6
+ import { validateSpec } from "./validate.js";
7
+ import { resolveDefaults } from "./defaults.js";
8
+ import { generateSystemPrompt } from "./prompt-generator.js";
9
+ import { stringify } from "yaml";
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ let _html = null;
13
+ function getHtml() {
14
+ if (!_html) {
15
+ const distPath = join(__dirname, "builder.html");
16
+ const srcPath = join(__dirname, "..", "src", "builder.html");
17
+ try {
18
+ _html = readFileSync(distPath, "utf-8");
19
+ }
20
+ catch {
21
+ _html = readFileSync(srcPath, "utf-8");
22
+ }
23
+ }
24
+ return _html;
25
+ }
26
+ let _schema = null;
27
+ function getSchemaJson() {
28
+ if (!_schema) {
29
+ const packageLocal = join(__dirname, "..", "agentspec.schema.json");
30
+ const monorepo = join(__dirname, "..", "..", "..", "spec", "agentspec.schema.json");
31
+ try {
32
+ _schema = readFileSync(packageLocal, "utf-8");
33
+ }
34
+ catch {
35
+ _schema = readFileSync(monorepo, "utf-8");
36
+ }
37
+ }
38
+ return _schema;
39
+ }
40
+ function openBrowser(url) {
41
+ const cmd = process.platform === "darwin"
42
+ ? `open "${url}"`
43
+ : process.platform === "win32"
44
+ ? `start "${url}"`
45
+ : `xdg-open "${url}"`;
46
+ exec(cmd);
47
+ }
48
+ function generateCodeTs(spec) {
49
+ const id = spec.id || "my-agent";
50
+ return `import { Grain } from "@reallyartificial/grain"
51
+ import OpenAI from "openai"
52
+
53
+ const agent = Grain.load("./${id}.agent.yaml")
54
+ const openai = new OpenAI()
55
+
56
+ const response = await openai.chat.completions.create({
57
+ model: "gpt-4o",
58
+ messages: [
59
+ { role: "system", content: agent.toPrompt() },
60
+ { role: "user", content: "Hello!" }
61
+ ]
62
+ })
63
+
64
+ console.log(response.choices[0].message.content)`;
65
+ }
66
+ function generateCodePy(spec) {
67
+ const id = spec.id || "my-agent";
68
+ return `from grain import Grain
69
+ from openai import OpenAI
70
+
71
+ agent = Grain.load("./${id}.agent.yaml")
72
+ client = OpenAI()
73
+
74
+ response = client.chat.completions.create(
75
+ model="gpt-4o",
76
+ messages=[
77
+ {"role": "system", "content": agent.to_prompt()},
78
+ {"role": "user", "content": "Hello!"}
79
+ ]
80
+ )
81
+
82
+ print(response.choices[0].message.content)`;
83
+ }
84
+ export function startBuilder(port) {
85
+ const startPort = port || 4460;
86
+ const maxPort = port || 4470;
87
+ function tryListen(p) {
88
+ const server = createServer((req, res) => {
89
+ const url = new URL(req.url || "/", `http://localhost:${p}`);
90
+ if (req.method === "GET" && url.pathname === "/") {
91
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
92
+ res.end(getHtml());
93
+ return;
94
+ }
95
+ if (req.method === "GET" && url.pathname === "/schema.json") {
96
+ res.writeHead(200, { "Content-Type": "application/json" });
97
+ res.end(getSchemaJson());
98
+ return;
99
+ }
100
+ if (req.method === "POST" && url.pathname === "/api/build") {
101
+ let body = "";
102
+ req.on("data", chunk => { body += chunk; });
103
+ req.on("end", () => {
104
+ try {
105
+ const { spec, channel } = JSON.parse(body);
106
+ const resolved = resolveDefaults(spec);
107
+ const errors = validateSpec(spec);
108
+ const yaml = stringify(spec, { lineWidth: 0 });
109
+ const prompt = generateSystemPrompt(resolved, channel || undefined);
110
+ const codeTs = generateCodeTs(spec);
111
+ const codePy = generateCodePy(spec);
112
+ res.writeHead(200, { "Content-Type": "application/json" });
113
+ res.end(JSON.stringify({
114
+ valid: errors.length === 0,
115
+ errors,
116
+ yaml,
117
+ prompt,
118
+ codeTs,
119
+ codePy
120
+ }));
121
+ }
122
+ catch (e) {
123
+ res.writeHead(400, { "Content-Type": "application/json" });
124
+ res.end(JSON.stringify({
125
+ valid: false,
126
+ errors: [{ path: "/", message: e instanceof Error ? e.message : String(e), severity: "error" }],
127
+ yaml: "",
128
+ prompt: "",
129
+ codeTs: "",
130
+ codePy: ""
131
+ }));
132
+ }
133
+ });
134
+ return;
135
+ }
136
+ res.writeHead(404);
137
+ res.end("Not found");
138
+ });
139
+ server.on("error", (err) => {
140
+ if (err.code === "EADDRINUSE" && p < maxPort) {
141
+ tryListen(p + 1);
142
+ }
143
+ else {
144
+ console.error(`Failed to start builder server: ${err.message}`);
145
+ process.exit(1);
146
+ }
147
+ });
148
+ server.listen(p, () => {
149
+ const url = `http://localhost:${p}`;
150
+ console.log(`Grain Builder running at ${url}`);
151
+ openBrowser(url);
152
+ });
153
+ }
154
+ tryListen(startPort);
155
+ }
156
+ //# sourceMappingURL=builder-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder-server.js","sourceRoot":"","sources":["../src/builder-server.ts"],"names":[],"mappings":"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"}