@grackle-ai/cli 0.18.1 → 0.18.3

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/dist/client.js CHANGED
@@ -24,7 +24,7 @@ function loadApiKey() {
24
24
  }
25
25
  /** Create an authenticated ConnectRPC client for the central Grackle server. */
26
26
  export function createGrackleClient(serverUrl) {
27
- const url = serverUrl || process.env.GRACKLE_URL || `http://localhost:${DEFAULT_SERVER_PORT}`;
27
+ const url = serverUrl || process.env.GRACKLE_URL || `http://127.0.0.1:${DEFAULT_SERVER_PORT}`;
28
28
  const apiKey = process.env.GRACKLE_API_KEY || loadApiKey();
29
29
  const transport = createGrpcTransport({
30
30
  baseUrl: url,
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ // Mock dependencies before importing the module under test
3
+ vi.mock("@connectrpc/connect", () => ({
4
+ createClient: vi.fn(() => ({})),
5
+ }));
6
+ vi.mock("@connectrpc/connect-node", () => ({
7
+ createGrpcTransport: vi.fn((opts) => ({ baseUrl: opts.baseUrl })),
8
+ }));
9
+ vi.mock("@grackle-ai/common", () => ({
10
+ grackle: { Grackle: {} },
11
+ DEFAULT_SERVER_PORT: 7434,
12
+ GRACKLE_DIR: ".grackle",
13
+ API_KEY_FILENAME: "api_key",
14
+ }));
15
+ vi.mock("node:fs", () => ({
16
+ readFileSync: vi.fn(() => "test-api-key"),
17
+ }));
18
+ vi.mock("node:path", () => ({
19
+ join: (...parts) => parts.join("/"),
20
+ }));
21
+ vi.mock("node:os", () => ({
22
+ homedir: () => "/home/user",
23
+ }));
24
+ describe("createGrackleClient", () => {
25
+ afterEach(() => {
26
+ // Clean up env overrides between tests
27
+ delete process.env.GRACKLE_URL;
28
+ delete process.env.GRACKLE_API_KEY;
29
+ vi.resetModules();
30
+ });
31
+ it("UT-1: defaults to http://127.0.0.1:7434 (not localhost)", async () => {
32
+ const { createGrpcTransport } = await import("@connectrpc/connect-node");
33
+ const { createGrackleClient } = await import("./client.js");
34
+ createGrackleClient();
35
+ expect(createGrpcTransport).toHaveBeenCalledWith(expect.objectContaining({ baseUrl: "http://127.0.0.1:7434" }));
36
+ });
37
+ it("UT-2: uses GRACKLE_URL env var when set", async () => {
38
+ process.env.GRACKLE_URL = "http://192.168.1.10:7434";
39
+ const { createGrpcTransport } = await import("@connectrpc/connect-node");
40
+ const { createGrackleClient } = await import("./client.js");
41
+ createGrackleClient();
42
+ expect(createGrpcTransport).toHaveBeenCalledWith(expect.objectContaining({ baseUrl: "http://192.168.1.10:7434" }));
43
+ });
44
+ it("UT-1b: explicit serverUrl argument overrides default", async () => {
45
+ const { createGrpcTransport } = await import("@connectrpc/connect-node");
46
+ const { createGrackleClient } = await import("./client.js");
47
+ createGrackleClient("http://[::1]:9000");
48
+ expect(createGrpcTransport).toHaveBeenCalledWith(expect.objectContaining({ baseUrl: "http://[::1]:9000" }));
49
+ });
50
+ });
51
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB3D"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB3D"}
@@ -1,3 +1,12 @@
1
+ /** Loopback addresses accepted by `--host`. Security policy: bind to loopback only. */
2
+ const LOOPBACK_HOSTS = new Set(["127.0.0.1", "::1"]);
3
+ /**
4
+ * Format a bind host for embedding in a URL.
5
+ * IPv6 literals (containing `:`) must be bracketed per RFC 2732.
6
+ */
7
+ function formatHostForUrl(host) {
8
+ return host.includes(":") ? `[${host}]` : host;
9
+ }
1
10
  /** Register the `serve` command that starts the Grackle server and web UI. */
2
11
  export function registerServeCommand(program) {
3
12
  program
@@ -5,11 +14,19 @@ export function registerServeCommand(program) {
5
14
  .description("Start the Grackle server")
6
15
  .option("--port <port>", "Server port", "7434")
7
16
  .option("--web-port <port>", "Web UI port", "3000")
17
+ .option("--host <address>", "Bind address — must be a loopback address (127.0.0.1 or ::1)", "127.0.0.1")
8
18
  .action(async (opts) => {
19
+ if (!LOOPBACK_HOSTS.has(opts.host)) {
20
+ console.error(`Error: --host must be a loopback address (127.0.0.1 or ::1). Got: ${opts.host}`);
21
+ console.error("Binding to non-loopback addresses would expose the API key to the network.");
22
+ process.exit(1);
23
+ }
9
24
  process.env.GRACKLE_PORT = opts.port;
10
25
  process.env.GRACKLE_WEB_PORT = opts.webPort;
11
- console.log(`Starting Grackle server on port ${opts.port}...`);
12
- console.log(`Web UI will be available at http://localhost:${opts.webPort}`);
26
+ process.env.GRACKLE_HOST = opts.host;
27
+ const urlHost = formatHostForUrl(opts.host);
28
+ console.log(`Starting Grackle server on ${opts.host}:${opts.port}...`);
29
+ console.log(`Web UI will be available at http://${urlHost}:${opts.webPort}`);
13
30
  // Dynamic import to start the server
14
31
  await import("@grackle-ai/server");
15
32
  });
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,MAAM,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE5E,qCAAqC;QACrC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,MAAM,cAAc,GAAgB,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;AAElE;;;GAGG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,MAAM,CAAC;SAC9C,MAAM,CAAC,mBAAmB,EAAE,aAAa,EAAE,MAAM,CAAC;SAClD,MAAM,CAAC,kBAAkB,EAAE,8DAA8D,EAAE,WAAW,CAAC;SACvG,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,qEAAqE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAChG,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QAErC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,sCAAsC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE7E,qCAAqC;QACrC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serve.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.test.d.ts","sourceRoot":"","sources":["../../src/commands/serve.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, vi, afterEach, beforeEach } from "vitest";
2
+ import { Command } from "commander";
3
+ // Mock the server import so the real action can run without starting an actual server
4
+ vi.mock("@grackle-ai/server", () => ({}));
5
+ describe("registerServeCommand", () => {
6
+ beforeEach(() => {
7
+ vi.spyOn(process, "exit").mockImplementation((() => {
8
+ throw new Error("process.exit called");
9
+ }));
10
+ });
11
+ afterEach(() => {
12
+ delete process.env.GRACKLE_PORT;
13
+ delete process.env.GRACKLE_WEB_PORT;
14
+ delete process.env.GRACKLE_HOST;
15
+ vi.restoreAllMocks();
16
+ vi.resetModules();
17
+ });
18
+ it("UT-3: --host ::1 (IPv6 loopback) is accepted and sets GRACKLE_HOST", async () => {
19
+ const { registerServeCommand } = await import("./serve.js");
20
+ const program = new Command();
21
+ program.exitOverride();
22
+ registerServeCommand(program);
23
+ await program.parseAsync(["serve", "--host", "::1", "--port", "7434", "--web-port", "3000"], { from: "user" });
24
+ expect(process.env.GRACKLE_HOST).toBe("::1");
25
+ expect(process.env.GRACKLE_PORT).toBe("7434");
26
+ expect(process.env.GRACKLE_WEB_PORT).toBe("3000");
27
+ });
28
+ it("UT-3b: --host defaults to 127.0.0.1 when not specified", async () => {
29
+ const { registerServeCommand } = await import("./serve.js");
30
+ const program = new Command();
31
+ program.exitOverride();
32
+ registerServeCommand(program);
33
+ await program.parseAsync(["serve"], { from: "user" });
34
+ expect(process.env.GRACKLE_HOST).toBe("127.0.0.1");
35
+ });
36
+ it("UT-3c: rejects non-loopback --host to enforce security policy", async () => {
37
+ // Suppress console.error so the expected rejection message does not pollute test output
38
+ const errorSpy = vi.spyOn(console, "error").mockImplementation(() => undefined);
39
+ const { registerServeCommand } = await import("./serve.js");
40
+ const program = new Command();
41
+ program.exitOverride();
42
+ registerServeCommand(program);
43
+ // The real action should call process.exit(1) for non-loopback addresses
44
+ await expect(program.parseAsync(["serve", "--host", "0.0.0.0"], { from: "user" })).rejects.toThrow("process.exit called");
45
+ expect(process.exit).toHaveBeenCalledWith(1);
46
+ expect(errorSpy).toHaveBeenCalledWith(expect.stringContaining("loopback address"));
47
+ });
48
+ });
49
+ //# sourceMappingURL=serve.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.test.js","sourceRoot":"","sources":["../../src/commands/serve.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@grackle-ai/cli",
3
- "version": "0.18.1",
3
+ "version": "0.18.3",
4
4
  "description": "Command-line interface for managing Grackle environments and agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,8 +33,8 @@
33
33
  "cli-table3": "^0.6.0",
34
34
  "commander": "^13.0.0",
35
35
  "ora": "^8.0.0",
36
- "@grackle-ai/common": "0.18.1",
37
- "@grackle-ai/server": "0.18.1"
36
+ "@grackle-ai/common": "0.18.3",
37
+ "@grackle-ai/server": "0.18.3"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@rushstack/heft": "1.2.4",