@grackle-ai/server 0.0.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.
Files changed (110) hide show
  1. package/README.md +5 -0
  2. package/dist/adapter-manager.d.ts +18 -0
  3. package/dist/adapter-manager.d.ts.map +1 -0
  4. package/dist/adapter-manager.js +67 -0
  5. package/dist/adapter-manager.js.map +1 -0
  6. package/dist/adapters/adapter.d.ts +40 -0
  7. package/dist/adapters/adapter.d.ts.map +1 -0
  8. package/dist/adapters/adapter.js +2 -0
  9. package/dist/adapters/adapter.js.map +1 -0
  10. package/dist/adapters/docker.d.ts +26 -0
  11. package/dist/adapters/docker.d.ts.map +1 -0
  12. package/dist/adapters/docker.js +274 -0
  13. package/dist/adapters/docker.js.map +1 -0
  14. package/dist/adapters/local.d.ts +15 -0
  15. package/dist/adapters/local.d.ts.map +1 -0
  16. package/dist/adapters/local.js +57 -0
  17. package/dist/adapters/local.js.map +1 -0
  18. package/dist/adapters/powerline-transport.d.ts +7 -0
  19. package/dist/adapters/powerline-transport.d.ts.map +1 -0
  20. package/dist/adapters/powerline-transport.js +22 -0
  21. package/dist/adapters/powerline-transport.js.map +1 -0
  22. package/dist/api-key.d.ts +8 -0
  23. package/dist/api-key.d.ts.map +1 -0
  24. package/dist/api-key.js +58 -0
  25. package/dist/api-key.js.map +1 -0
  26. package/dist/crypto.d.ts +5 -0
  27. package/dist/crypto.d.ts.map +1 -0
  28. package/dist/crypto.js +74 -0
  29. package/dist/crypto.js.map +1 -0
  30. package/dist/db.d.ts +11 -0
  31. package/dist/db.d.ts.map +1 -0
  32. package/dist/db.js +140 -0
  33. package/dist/db.js.map +1 -0
  34. package/dist/env-registry.d.ts +20 -0
  35. package/dist/env-registry.d.ts.map +1 -0
  36. package/dist/env-registry.js +55 -0
  37. package/dist/env-registry.js.map +1 -0
  38. package/dist/finding-store.d.ts +9 -0
  39. package/dist/finding-store.d.ts.map +1 -0
  40. package/dist/finding-store.js +68 -0
  41. package/dist/finding-store.js.map +1 -0
  42. package/dist/grpc-service.d.ts +4 -0
  43. package/dist/grpc-service.d.ts.map +1 -0
  44. package/dist/grpc-service.js +594 -0
  45. package/dist/grpc-service.js.map +1 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +108 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/json-helpers.d.ts +7 -0
  51. package/dist/json-helpers.d.ts.map +1 -0
  52. package/dist/json-helpers.js +22 -0
  53. package/dist/json-helpers.js.map +1 -0
  54. package/dist/log-writer.d.ts +18 -0
  55. package/dist/log-writer.d.ts.map +1 -0
  56. package/dist/log-writer.js +44 -0
  57. package/dist/log-writer.js.map +1 -0
  58. package/dist/logger.d.ts +4 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +10 -0
  61. package/dist/logger.js.map +1 -0
  62. package/dist/paths.d.ts +7 -0
  63. package/dist/paths.d.ts.map +1 -0
  64. package/dist/paths.js +12 -0
  65. package/dist/paths.js.map +1 -0
  66. package/dist/project-store.d.ts +11 -0
  67. package/dist/project-store.d.ts.map +1 -0
  68. package/dist/project-store.js +32 -0
  69. package/dist/project-store.js.map +1 -0
  70. package/dist/schema.d.ts +1199 -0
  71. package/dist/schema.d.ts.map +1 -0
  72. package/dist/schema.js +82 -0
  73. package/dist/schema.js.map +1 -0
  74. package/dist/session-store.d.ts +22 -0
  75. package/dist/session-store.d.ts.map +1 -0
  76. package/dist/session-store.js +73 -0
  77. package/dist/session-store.js.map +1 -0
  78. package/dist/stream-hub.d.ts +14 -0
  79. package/dist/stream-hub.d.ts.map +1 -0
  80. package/dist/stream-hub.js +95 -0
  81. package/dist/stream-hub.js.map +1 -0
  82. package/dist/task-store.d.ts +28 -0
  83. package/dist/task-store.d.ts.map +1 -0
  84. package/dist/task-store.js +121 -0
  85. package/dist/task-store.js.map +1 -0
  86. package/dist/token-broker.d.ts +27 -0
  87. package/dist/token-broker.d.ts.map +1 -0
  88. package/dist/token-broker.js +76 -0
  89. package/dist/token-broker.js.map +1 -0
  90. package/dist/transcript.d.ts +5 -0
  91. package/dist/transcript.d.ts.map +1 -0
  92. package/dist/transcript.js +51 -0
  93. package/dist/transcript.js.map +1 -0
  94. package/dist/utils/exec.d.ts +17 -0
  95. package/dist/utils/exec.d.ts.map +1 -0
  96. package/dist/utils/exec.js +21 -0
  97. package/dist/utils/exec.js.map +1 -0
  98. package/dist/utils/ports.d.ts +3 -0
  99. package/dist/utils/ports.d.ts.map +1 -0
  100. package/dist/utils/ports.js +19 -0
  101. package/dist/utils/ports.js.map +1 -0
  102. package/dist/utils/sleep.d.ts +3 -0
  103. package/dist/utils/sleep.d.ts.map +1 -0
  104. package/dist/utils/sleep.js +5 -0
  105. package/dist/utils/sleep.js.map +1 -0
  106. package/dist/ws-bridge.d.ts +10 -0
  107. package/dist/ws-bridge.d.ts.map +1 -0
  108. package/dist/ws-bridge.js +846 -0
  109. package/dist/ws-bridge.js.map +1 -0
  110. package/package.json +50 -0
@@ -0,0 +1,51 @@
1
+ import { readLog } from "./log-writer.js";
2
+ import { writeFileSync, mkdirSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ function renderEntry(entry) {
5
+ switch (entry.type) {
6
+ case "system":
7
+ return `> _${entry.content}_\n`;
8
+ case "text":
9
+ return `${entry.content}\n`;
10
+ case "tool_use": {
11
+ try {
12
+ const parsed = JSON.parse(entry.content);
13
+ return `\`\`\`\n${parsed.tool}: ${JSON.stringify(parsed.args, null, 2)}\n\`\`\`\n`;
14
+ }
15
+ catch {
16
+ return `\`\`\`\n${entry.content}\n\`\`\`\n`;
17
+ }
18
+ }
19
+ case "tool_result":
20
+ return `<details>\n<summary>Tool output</summary>\n\n\`\`\`\n${entry.content}\n\`\`\`\n</details>\n`;
21
+ case "error":
22
+ return `**Error:** ${entry.content}\n`;
23
+ case "status":
24
+ return `---\n*Status: ${entry.content}*\n`;
25
+ default:
26
+ return `${entry.content}\n`;
27
+ }
28
+ }
29
+ /** Generate a Markdown transcript from a session's JSONL log. */
30
+ export function generateTranscript(logPath) {
31
+ const entries = readLog(logPath);
32
+ if (entries.length === 0)
33
+ return "*(empty session)*\n";
34
+ const lines = [];
35
+ lines.push(`# Session Transcript\n`);
36
+ lines.push(`*Started: ${entries[0].timestamp}*\n`);
37
+ for (const entry of entries) {
38
+ lines.push(renderEntry(entry));
39
+ }
40
+ const last = entries[entries.length - 1];
41
+ lines.push(`\n*Ended: ${last.timestamp}*\n`);
42
+ return lines.join("\n");
43
+ }
44
+ /** Generate and write a Markdown transcript file alongside the session log. */
45
+ export function writeTranscript(logPath) {
46
+ const md = generateTranscript(logPath);
47
+ const transcriptPath = join(logPath, "transcript.md");
48
+ mkdirSync(dirname(transcriptPath), { recursive: true });
49
+ writeFileSync(transcriptPath, md, "utf8");
50
+ }
51
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAiB,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,SAAS,WAAW,CAAC,KAAe;IAClC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,CAAC,OAAO,KAAK,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;QAC9B,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACzC,OAAO,WAAW,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,CAAC;YACrF,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,WAAW,KAAK,CAAC,OAAO,YAAY,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,KAAK,aAAa;YAChB,OAAO,wDAAwD,KAAK,CAAC,OAAO,wBAAwB,CAAC;QACvG,KAAK,OAAO;YACV,OAAO,cAAc,KAAK,CAAC,OAAO,IAAI,CAAC;QACzC,KAAK,QAAQ;YACX,OAAO,iBAAiB,KAAK,CAAC,OAAO,KAAK,CAAC;QAC7C;YACE,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;IAChC,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,qBAAqB,CAAC;IAEvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC;IAEnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACtD,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,aAAa,CAAC,cAAc,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Trimmed stdout/stderr from a child process execution. */
2
+ export interface ExecResult {
3
+ stdout: string;
4
+ stderr: string;
5
+ }
6
+ /**
7
+ * Execute a command as a child process and return its trimmed output.
8
+ * @param cmd - Executable name or path.
9
+ * @param args - Arguments to pass to the executable.
10
+ * @param opts - Optional timeout, cwd, and env overrides.
11
+ */
12
+ export declare function exec(cmd: string, args: string[], opts?: {
13
+ timeout?: number;
14
+ cwd?: string;
15
+ env?: NodeJS.ProcessEnv;
16
+ }): Promise<ExecResult>;
17
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAQA,4DAA4D;AAC5D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,IAAI,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,GACjE,OAAO,CAAC,UAAU,CAAC,CAQrB"}
@@ -0,0 +1,21 @@
1
+ import { execFile as _execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(_execFile);
4
+ const DEFAULT_EXEC_TIMEOUT_MS = 60_000;
5
+ const EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
6
+ /**
7
+ * Execute a command as a child process and return its trimmed output.
8
+ * @param cmd - Executable name or path.
9
+ * @param args - Arguments to pass to the executable.
10
+ * @param opts - Optional timeout, cwd, and env overrides.
11
+ */
12
+ export async function exec(cmd, args, opts) {
13
+ const { stdout, stderr } = await execFileAsync(cmd, args, {
14
+ timeout: opts?.timeout ?? DEFAULT_EXEC_TIMEOUT_MS,
15
+ cwd: opts?.cwd,
16
+ env: opts?.env ?? process.env,
17
+ maxBuffer: EXEC_MAX_BUFFER_BYTES,
18
+ });
19
+ return { stdout: stdout.trim(), stderr: stderr.trim() };
20
+ }
21
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAmC,SAAS,CAAC,SAAS,CAAC,CAAC;AAE3E,MAAM,uBAAuB,GAAW,MAAM,CAAC;AAC/C,MAAM,qBAAqB,GAAW,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAQvD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,GAAW,EACX,IAAc,EACd,IAAkE;IAElE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,IAAI,EAAE;QACxD,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,uBAAuB;QACjD,GAAG,EAAE,IAAI,EAAE,GAAG;QACd,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;QAC7B,SAAS,EAAE,qBAAqB;KACjC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Find and return an available TCP port by briefly binding to port 0. */
2
+ export declare function findFreePort(): Promise<number>;
3
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/utils/ports.ts"],"names":[],"mappings":"AAEA,0EAA0E;AAC1E,wBAAgB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAc9C"}
@@ -0,0 +1,19 @@
1
+ import { createServer } from "node:net";
2
+ /** Find and return an available TCP port by briefly binding to port 0. */
3
+ export function findFreePort() {
4
+ return new Promise((resolve, reject) => {
5
+ const server = createServer();
6
+ server.listen(0, () => {
7
+ const addr = server.address();
8
+ if (addr && typeof addr === "object") {
9
+ const port = addr.port;
10
+ server.close(() => resolve(port));
11
+ }
12
+ else {
13
+ server.close(() => reject(new Error("Failed to get port")));
14
+ }
15
+ });
16
+ server.on("error", reject);
17
+ });
18
+ }
19
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/utils/ports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,0EAA0E;AAC1E,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Return a promise that resolves after the specified number of milliseconds. */
2
+ export declare function sleep(ms: number): Promise<void>;
3
+ //# sourceMappingURL=sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -0,0 +1,5 @@
1
+ /** Return a promise that resolves after the specified number of milliseconds. */
2
+ export function sleep(ms) {
3
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
+ }
5
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { WebSocketServer } from "ws";
2
+ import type { Server as HttpServer } from "node:http";
3
+ /** Broadcast a message to all connected WS clients. */
4
+ export declare function broadcast(msg: {
5
+ type: string;
6
+ payload?: Record<string, unknown>;
7
+ }): void;
8
+ /** Create a WebSocket server on top of an HTTP server that bridges JSON messages to gRPC operations. */
9
+ export declare function createWsBridge(httpServer: HttpServer, verifyApiKey: (token: string) => boolean): WebSocketServer;
10
+ //# sourceMappingURL=ws-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-bridge.d.ts","sourceRoot":"","sources":["../src/ws-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAoCtD,uDAAuD;AACvD,wBAAgB,SAAS,CAAC,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAQxF;AAED,wGAAwG;AACxG,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,eAAe,CAuChH"}