grexal 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 (75) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +180 -0
  3. package/dist/commands/deploy.d.ts +2 -0
  4. package/dist/commands/deploy.d.ts.map +1 -0
  5. package/dist/commands/deploy.js +161 -0
  6. package/dist/commands/deploy.js.map +1 -0
  7. package/dist/commands/dev.d.ts +4 -0
  8. package/dist/commands/dev.d.ts.map +1 -0
  9. package/dist/commands/dev.js +232 -0
  10. package/dist/commands/dev.js.map +1 -0
  11. package/dist/commands/init.d.ts +2 -0
  12. package/dist/commands/init.d.ts.map +1 -0
  13. package/dist/commands/init.js +76 -0
  14. package/dist/commands/init.js.map +1 -0
  15. package/dist/commands/login.d.ts +2 -0
  16. package/dist/commands/login.d.ts.map +1 -0
  17. package/dist/commands/login.js +96 -0
  18. package/dist/commands/login.js.map +1 -0
  19. package/dist/commands/logout.d.ts +2 -0
  20. package/dist/commands/logout.d.ts.map +1 -0
  21. package/dist/commands/logout.js +12 -0
  22. package/dist/commands/logout.js.map +1 -0
  23. package/dist/commands/validate.d.ts +2 -0
  24. package/dist/commands/validate.d.ts.map +1 -0
  25. package/dist/commands/validate.js +55 -0
  26. package/dist/commands/validate.js.map +1 -0
  27. package/dist/dev-server/server.d.ts +31 -0
  28. package/dist/dev-server/server.d.ts.map +1 -0
  29. package/dist/dev-server/server.js +89 -0
  30. package/dist/dev-server/server.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +63 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manifest/constants.d.ts +31 -0
  36. package/dist/manifest/constants.d.ts.map +1 -0
  37. package/dist/manifest/constants.js +54 -0
  38. package/dist/manifest/constants.js.map +1 -0
  39. package/dist/manifest/types.d.ts +66 -0
  40. package/dist/manifest/types.d.ts.map +1 -0
  41. package/dist/manifest/types.js +3 -0
  42. package/dist/manifest/types.js.map +1 -0
  43. package/dist/manifest/validator.d.ts +7 -0
  44. package/dist/manifest/validator.d.ts.map +1 -0
  45. package/dist/manifest/validator.js +435 -0
  46. package/dist/manifest/validator.js.map +1 -0
  47. package/dist/templates/python.d.ts +4 -0
  48. package/dist/templates/python.d.ts.map +1 -0
  49. package/dist/templates/python.js +35 -0
  50. package/dist/templates/python.js.map +1 -0
  51. package/dist/templates/shared.d.ts +3 -0
  52. package/dist/templates/shared.d.ts.map +1 -0
  53. package/dist/templates/shared.js +29 -0
  54. package/dist/templates/shared.js.map +1 -0
  55. package/dist/templates/typescript.d.ts +5 -0
  56. package/dist/templates/typescript.d.ts.map +1 -0
  57. package/dist/templates/typescript.js +55 -0
  58. package/dist/templates/typescript.js.map +1 -0
  59. package/dist/utils/api.d.ts +12 -0
  60. package/dist/utils/api.d.ts.map +1 -0
  61. package/dist/utils/api.js +23 -0
  62. package/dist/utils/api.js.map +1 -0
  63. package/dist/utils/auth.d.ts +10 -0
  64. package/dist/utils/auth.d.ts.map +1 -0
  65. package/dist/utils/auth.js +46 -0
  66. package/dist/utils/auth.js.map +1 -0
  67. package/dist/utils/manifest.d.ts +3 -0
  68. package/dist/utils/manifest.d.ts.map +1 -0
  69. package/dist/utils/manifest.js +32 -0
  70. package/dist/utils/manifest.js.map +1 -0
  71. package/dist/utils/process.d.ts +18 -0
  72. package/dist/utils/process.d.ts.map +1 -0
  73. package/dist/utils/process.js +30 -0
  74. package/dist/utils/process.js.map +1 -0
  75. package/package.json +29 -0
@@ -0,0 +1,55 @@
1
+ export function tsManifest(name) {
2
+ return JSON.stringify({
3
+ name,
4
+ description: `TODO: Describe what ${name} does`,
5
+ entrypoint: "index.ts",
6
+ runtime: {
7
+ language: "typescript",
8
+ },
9
+ pricing: {
10
+ price_per_task: 0.01,
11
+ },
12
+ }, null, 2);
13
+ }
14
+ export function tsEntrypoint() {
15
+ return `import { AgentContext } from "@grexal/sdk";
16
+
17
+ export default async function run(ctx: AgentContext) {
18
+ const task = await ctx.task();
19
+ await ctx.log("Hello from Grexal!");
20
+ await ctx.progress(0.5);
21
+
22
+ // Your agent logic here
23
+ const result = { received: task };
24
+
25
+ await ctx.log("Done!");
26
+ await ctx.progress(1.0);
27
+ return result;
28
+ }
29
+ `;
30
+ }
31
+ export function tsPackageJson(name) {
32
+ return JSON.stringify({
33
+ name,
34
+ version: "0.0.1",
35
+ type: "module",
36
+ private: true,
37
+ dependencies: {
38
+ "@grexal/sdk": "latest",
39
+ },
40
+ }, null, 2);
41
+ }
42
+ export function tsTsconfig() {
43
+ return JSON.stringify({
44
+ compilerOptions: {
45
+ target: "ES2022",
46
+ module: "ESNext",
47
+ moduleResolution: "bundler",
48
+ strict: true,
49
+ esModuleInterop: true,
50
+ skipLibCheck: true,
51
+ },
52
+ include: ["*.ts"],
53
+ }, null, 2);
54
+ }
55
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../src/templates/typescript.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI;QACJ,WAAW,EAAE,uBAAuB,IAAI,OAAO;QAC/C,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE;YACP,QAAQ,EAAE,YAAY;SACvB;QACD,OAAO,EAAE;YACP,cAAc,EAAE,IAAI;SACrB;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;QACb,YAAY,EAAE;YACZ,aAAa,EAAE,QAAQ;SACxB;KACF,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;SACnB;QACD,OAAO,EAAE,CAAC,MAAM,CAAC;KAClB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Platform HTTP utilities for CLI-to-Convex communication.
3
+ *
4
+ * The platform URL points to the Convex deployment's HTTP actions endpoint.
5
+ * In production this is the Convex HTTP actions endpoint for the deployment.
6
+ * Developers can override it via GREXAL_API_URL for local testing.
7
+ */
8
+ export declare function getPlatformUrl(): string;
9
+ export declare function platformFetch(path: string, options?: RequestInit & {
10
+ token?: string;
11
+ }): Promise<Response>;
12
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC7C,OAAO,CAAC,QAAQ,CAAC,CAanB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Platform HTTP utilities for CLI-to-Convex communication.
3
+ *
4
+ * The platform URL points to the Convex deployment's HTTP actions endpoint.
5
+ * In production this is the Convex HTTP actions endpoint for the deployment.
6
+ * Developers can override it via GREXAL_API_URL for local testing.
7
+ */
8
+ export function getPlatformUrl() {
9
+ return (process.env.GREXAL_API_URL ?? "https://impartial-sockeye-413.convex.site");
10
+ }
11
+ export async function platformFetch(path, options = {}) {
12
+ const { token, ...fetchOptions } = options;
13
+ const url = `${getPlatformUrl()}${path}`;
14
+ const headers = new Headers(fetchOptions.headers);
15
+ if (token) {
16
+ headers.set("Authorization", `Bearer ${token}`);
17
+ }
18
+ return await fetch(url, {
19
+ ...fetchOptions,
20
+ headers,
21
+ });
22
+ }
23
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,cAAc;IAC5B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,2CAA2C,CAC1E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,UAA4C,EAAE;IAE9C,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC3C,MAAM,GAAG,GAAG,GAAG,cAAc,EAAE,GAAG,IAAI,EAAE,CAAC;IAEzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE;QACtB,GAAG,YAAY;QACf,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface Credentials {
2
+ token: string;
3
+ email: string;
4
+ }
5
+ export declare function getCredentialsPath(): string;
6
+ export declare function loadCredentials(): Promise<Credentials | null>;
7
+ export declare function saveCredentials(creds: Credentials): Promise<void>;
8
+ export declare function clearCredentials(): Promise<void>;
9
+ export declare function requireAuth(): Promise<Credentials>;
10
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAWnE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMtD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAOxD"}
@@ -0,0 +1,46 @@
1
+ import { readFile, writeFile, mkdir, unlink } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ export function getCredentialsPath() {
5
+ return join(homedir(), ".grexal", "credentials.json");
6
+ }
7
+ export async function loadCredentials() {
8
+ try {
9
+ const raw = await readFile(getCredentialsPath(), "utf-8");
10
+ const parsed = JSON.parse(raw);
11
+ if (parsed.token && parsed.email) {
12
+ return { token: parsed.token, email: parsed.email };
13
+ }
14
+ return null;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export async function saveCredentials(creds) {
21
+ const dir = join(homedir(), ".grexal");
22
+ try {
23
+ await mkdir(dir, { recursive: true });
24
+ }
25
+ catch {
26
+ // Directory may already exist
27
+ }
28
+ await writeFile(getCredentialsPath(), JSON.stringify(creds, null, 2) + "\n", "utf-8");
29
+ }
30
+ export async function clearCredentials() {
31
+ try {
32
+ await unlink(getCredentialsPath());
33
+ }
34
+ catch {
35
+ // File may not exist
36
+ }
37
+ }
38
+ export async function requireAuth() {
39
+ const creds = await loadCredentials();
40
+ if (!creds) {
41
+ console.error(" Not authenticated. Run `npx grexal login` first.");
42
+ process.exit(1);
43
+ }
44
+ return creds;
45
+ }
46
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/utils/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAOlC,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAkB;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IACD,MAAM,SAAS,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentManifest } from "../manifest/types.js";
2
+ export declare function loadManifest(path: string): Promise<AgentManifest>;
3
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/utils/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA+BvE"}
@@ -0,0 +1,32 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { validateManifest } from "../manifest/validator.js";
3
+ export async function loadManifest(path) {
4
+ let raw;
5
+ try {
6
+ raw = await readFile(path, "utf-8");
7
+ }
8
+ catch {
9
+ console.error(" Error: grexal.json not found in current directory");
10
+ process.exit(1);
11
+ }
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(raw);
15
+ }
16
+ catch (err) {
17
+ console.error(` Error: grexal.json contains invalid JSON — ${err instanceof Error ? err.message : err}`);
18
+ process.exit(1);
19
+ }
20
+ const errors = validateManifest(parsed);
21
+ if (errors.length > 0) {
22
+ console.error(" Manifest validation failed:\n");
23
+ for (const err of errors) {
24
+ const p = err.path ? `${err.path} — ` : "";
25
+ console.error(` ${p}${err.message}`);
26
+ }
27
+ console.error("");
28
+ process.exit(1);
29
+ }
30
+ return parsed;
31
+ }
32
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/utils/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,gDAAgD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAC3F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,MAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type ChildProcess } from "node:child_process";
2
+ export interface AgentProcess {
3
+ child: ChildProcess;
4
+ kill: () => void;
5
+ onExit: (callback: (code: number | null) => void) => void;
6
+ }
7
+ export interface SpawnOptions {
8
+ command: string;
9
+ args: string[];
10
+ env: Record<string, string>;
11
+ cwd?: string;
12
+ }
13
+ /**
14
+ * Spawn an agent process with the given environment variables.
15
+ * stdout/stderr are piped to the parent process.
16
+ */
17
+ export declare function spawnAgent(options: SpawnOptions): AgentProcess;
18
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CA0B9D"}
@@ -0,0 +1,30 @@
1
+ import { spawn } from "node:child_process";
2
+ /**
3
+ * Spawn an agent process with the given environment variables.
4
+ * stdout/stderr are piped to the parent process.
5
+ */
6
+ export function spawnAgent(options) {
7
+ const child = spawn(options.command, options.args, {
8
+ env: { ...process.env, ...options.env },
9
+ cwd: options.cwd ?? process.cwd(),
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ });
12
+ child.stdout?.on("data", (data) => {
13
+ process.stdout.write(data);
14
+ });
15
+ child.stderr?.on("data", (data) => {
16
+ process.stderr.write(data);
17
+ });
18
+ return {
19
+ child,
20
+ kill: () => {
21
+ if (!child.killed) {
22
+ child.kill("SIGTERM");
23
+ }
24
+ },
25
+ onExit: (callback) => {
26
+ child.on("exit", (code) => callback(code));
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAe9D;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;QACjD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QACvC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACjC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE;YACnB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "grexal",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "license": "MIT",
6
+ "description": "Grexal CLI for building and deploying agents",
7
+ "bin": {
8
+ "grexal": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "devDependencies": {
15
+ "@types/node": "^22",
16
+ "typescript": "^5"
17
+ },
18
+ "dependencies": {
19
+ "chokidar": "^5.0.0",
20
+ "commander": "^14.0.3",
21
+ "tsx": "^4.21.0",
22
+ "@grexal/sdk": "^0.0.2"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc",
26
+ "dev": "tsc --watch",
27
+ "typecheck": "tsc --noEmit"
28
+ }
29
+ }