@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.
- package/README.md +5 -0
- package/dist/adapter-manager.d.ts +18 -0
- package/dist/adapter-manager.d.ts.map +1 -0
- package/dist/adapter-manager.js +67 -0
- package/dist/adapter-manager.js.map +1 -0
- package/dist/adapters/adapter.d.ts +40 -0
- package/dist/adapters/adapter.d.ts.map +1 -0
- package/dist/adapters/adapter.js +2 -0
- package/dist/adapters/adapter.js.map +1 -0
- package/dist/adapters/docker.d.ts +26 -0
- package/dist/adapters/docker.d.ts.map +1 -0
- package/dist/adapters/docker.js +274 -0
- package/dist/adapters/docker.js.map +1 -0
- package/dist/adapters/local.d.ts +15 -0
- package/dist/adapters/local.d.ts.map +1 -0
- package/dist/adapters/local.js +57 -0
- package/dist/adapters/local.js.map +1 -0
- package/dist/adapters/powerline-transport.d.ts +7 -0
- package/dist/adapters/powerline-transport.d.ts.map +1 -0
- package/dist/adapters/powerline-transport.js +22 -0
- package/dist/adapters/powerline-transport.js.map +1 -0
- package/dist/api-key.d.ts +8 -0
- package/dist/api-key.d.ts.map +1 -0
- package/dist/api-key.js +58 -0
- package/dist/api-key.js.map +1 -0
- package/dist/crypto.d.ts +5 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +74 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db.d.ts +11 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +140 -0
- package/dist/db.js.map +1 -0
- package/dist/env-registry.d.ts +20 -0
- package/dist/env-registry.d.ts.map +1 -0
- package/dist/env-registry.js +55 -0
- package/dist/env-registry.js.map +1 -0
- package/dist/finding-store.d.ts +9 -0
- package/dist/finding-store.d.ts.map +1 -0
- package/dist/finding-store.js +68 -0
- package/dist/finding-store.js.map +1 -0
- package/dist/grpc-service.d.ts +4 -0
- package/dist/grpc-service.d.ts.map +1 -0
- package/dist/grpc-service.js +594 -0
- package/dist/grpc-service.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +108 -0
- package/dist/index.js.map +1 -0
- package/dist/json-helpers.d.ts +7 -0
- package/dist/json-helpers.d.ts.map +1 -0
- package/dist/json-helpers.js +22 -0
- package/dist/json-helpers.js.map +1 -0
- package/dist/log-writer.d.ts +18 -0
- package/dist/log-writer.d.ts.map +1 -0
- package/dist/log-writer.js +44 -0
- package/dist/log-writer.js.map +1 -0
- package/dist/logger.d.ts +4 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +10 -0
- package/dist/logger.js.map +1 -0
- package/dist/paths.d.ts +7 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +12 -0
- package/dist/paths.js.map +1 -0
- package/dist/project-store.d.ts +11 -0
- package/dist/project-store.d.ts.map +1 -0
- package/dist/project-store.js +32 -0
- package/dist/project-store.js.map +1 -0
- package/dist/schema.d.ts +1199 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +82 -0
- package/dist/schema.js.map +1 -0
- package/dist/session-store.d.ts +22 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +73 -0
- package/dist/session-store.js.map +1 -0
- package/dist/stream-hub.d.ts +14 -0
- package/dist/stream-hub.d.ts.map +1 -0
- package/dist/stream-hub.js +95 -0
- package/dist/stream-hub.js.map +1 -0
- package/dist/task-store.d.ts +28 -0
- package/dist/task-store.d.ts.map +1 -0
- package/dist/task-store.js +121 -0
- package/dist/task-store.js.map +1 -0
- package/dist/token-broker.d.ts +27 -0
- package/dist/token-broker.d.ts.map +1 -0
- package/dist/token-broker.js +76 -0
- package/dist/token-broker.js.map +1 -0
- package/dist/transcript.d.ts +5 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +51 -0
- package/dist/transcript.js.map +1 -0
- package/dist/utils/exec.d.ts +17 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +21 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/ports.d.ts +3 -0
- package/dist/utils/ports.d.ts.map +1 -0
- package/dist/utils/ports.js +19 -0
- package/dist/utils/ports.js.map +1 -0
- package/dist/utils/sleep.d.ts +3 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +5 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/ws-bridge.d.ts +10 -0
- package/dist/ws-bridge.d.ts.map +1 -0
- package/dist/ws-bridge.js +846 -0
- package/dist/ws-bridge.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
|
2
|
+
import { sql } from "drizzle-orm";
|
|
3
|
+
// ─── Environments ──────────────────────────────────────────
|
|
4
|
+
/* eslint-disable @rushstack/typedef-var -- Drizzle table types are inferred from sqliteTable() */
|
|
5
|
+
export const environments = sqliteTable("environments", {
|
|
6
|
+
id: text("id").primaryKey(),
|
|
7
|
+
displayName: text("display_name").notNull(),
|
|
8
|
+
adapterType: text("adapter_type").notNull(),
|
|
9
|
+
adapterConfig: text("adapter_config").notNull(),
|
|
10
|
+
defaultRuntime: text("default_runtime").notNull().default("claude-code"),
|
|
11
|
+
bootstrapped: integer("bootstrapped", { mode: "boolean" }).notNull().default(false),
|
|
12
|
+
status: text("status").notNull().default("disconnected"),
|
|
13
|
+
lastSeen: text("last_seen"),
|
|
14
|
+
envInfo: text("env_info"),
|
|
15
|
+
createdAt: text("created_at").notNull().default(sql `(datetime('now'))`),
|
|
16
|
+
powerlineToken: text("powerline_token").notNull().default(""),
|
|
17
|
+
});
|
|
18
|
+
// ─── Sessions ──────────────────────────────────────────────
|
|
19
|
+
export const sessions = sqliteTable("sessions", {
|
|
20
|
+
id: text("id").primaryKey(),
|
|
21
|
+
environmentId: text("env_id").notNull().references(() => environments.id),
|
|
22
|
+
runtime: text("runtime").notNull(),
|
|
23
|
+
runtimeSessionId: text("runtime_session_id"),
|
|
24
|
+
prompt: text("prompt").notNull(),
|
|
25
|
+
model: text("model").notNull(),
|
|
26
|
+
status: text("status").notNull().default("pending"),
|
|
27
|
+
logPath: text("log_path"),
|
|
28
|
+
turns: integer("turns").notNull().default(0),
|
|
29
|
+
startedAt: text("started_at").notNull().default(sql `(datetime('now'))`),
|
|
30
|
+
suspendedAt: text("suspended_at"),
|
|
31
|
+
endedAt: text("ended_at"),
|
|
32
|
+
error: text("error"),
|
|
33
|
+
});
|
|
34
|
+
// ─── Tokens ────────────────────────────────────────────────
|
|
35
|
+
export const tokens = sqliteTable("tokens", {
|
|
36
|
+
id: text("id").primaryKey(),
|
|
37
|
+
config: text("config").notNull(),
|
|
38
|
+
createdAt: text("created_at").notNull().default(sql `(datetime('now'))`),
|
|
39
|
+
});
|
|
40
|
+
// ─── Projects ─────────────────────────────────────────────
|
|
41
|
+
export const projects = sqliteTable("projects", {
|
|
42
|
+
id: text("id").primaryKey(),
|
|
43
|
+
name: text("name").notNull(),
|
|
44
|
+
description: text("description").notNull().default(""),
|
|
45
|
+
repoUrl: text("repo_url").notNull().default(""),
|
|
46
|
+
defaultEnvironmentId: text("default_env_id").notNull().default(""),
|
|
47
|
+
status: text("status").notNull().default("active"),
|
|
48
|
+
createdAt: text("created_at").notNull().default(sql `(datetime('now'))`),
|
|
49
|
+
updatedAt: text("updated_at").notNull().default(sql `(datetime('now'))`),
|
|
50
|
+
});
|
|
51
|
+
// ─── Tasks ────────────────────────────────────────────────
|
|
52
|
+
export const tasks = sqliteTable("tasks", {
|
|
53
|
+
id: text("id").primaryKey(),
|
|
54
|
+
projectId: text("project_id").notNull().references(() => projects.id),
|
|
55
|
+
title: text("title").notNull(),
|
|
56
|
+
description: text("description").notNull().default(""),
|
|
57
|
+
status: text("status").notNull().default("pending"),
|
|
58
|
+
branch: text("branch").notNull().default(""),
|
|
59
|
+
environmentId: text("env_id").notNull().default(""),
|
|
60
|
+
sessionId: text("session_id").notNull().default(""),
|
|
61
|
+
dependsOn: text("depends_on").notNull().default("[]"),
|
|
62
|
+
assignedAt: text("assigned_at"),
|
|
63
|
+
startedAt: text("started_at"),
|
|
64
|
+
completedAt: text("completed_at"),
|
|
65
|
+
reviewNotes: text("review_notes").notNull().default(""),
|
|
66
|
+
createdAt: text("created_at").notNull().default(sql `(datetime('now'))`),
|
|
67
|
+
updatedAt: text("updated_at").notNull().default(sql `(datetime('now'))`),
|
|
68
|
+
sortOrder: integer("sort_order").notNull().default(0),
|
|
69
|
+
});
|
|
70
|
+
// ─── Findings ─────────────────────────────────────────────
|
|
71
|
+
export const findings = sqliteTable("findings", {
|
|
72
|
+
id: text("id").primaryKey(),
|
|
73
|
+
projectId: text("project_id").notNull().references(() => projects.id),
|
|
74
|
+
taskId: text("task_id").notNull().default(""),
|
|
75
|
+
sessionId: text("session_id").notNull().default(""),
|
|
76
|
+
category: text("category").notNull().default("general"),
|
|
77
|
+
title: text("title").notNull(),
|
|
78
|
+
content: text("content").notNull(),
|
|
79
|
+
tags: text("tags").notNull().default("[]"),
|
|
80
|
+
createdAt: text("created_at").notNull().default(sql `(datetime('now'))`),
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type SessionRow } from "./schema.js";
|
|
2
|
+
import type { SessionStatus } from "@grackle-ai/common";
|
|
3
|
+
export type { SessionRow };
|
|
4
|
+
/** Insert a new session record into the database. */
|
|
5
|
+
export declare function createSession(id: string, environmentId: string, runtime: string, prompt: string, model: string, logPath: string): void;
|
|
6
|
+
/** Retrieve a single session by ID. */
|
|
7
|
+
export declare function getSession(id: string): SessionRow | undefined;
|
|
8
|
+
/** List sessions, optionally filtered by environment and/or status. */
|
|
9
|
+
export declare function listSessions(environmentId?: string, status?: string): SessionRow[];
|
|
10
|
+
/** List all sessions belonging to a specific environment. */
|
|
11
|
+
export declare function listByEnv(environmentId: string): SessionRow[];
|
|
12
|
+
/** Update a session's status, runtime session ID, and error; auto-sets `endedAt` for terminal states. */
|
|
13
|
+
export declare function updateSession(id: string, status: SessionStatus, runtimeSessionId?: string, error?: string): void;
|
|
14
|
+
/** Update only the status column of a session. */
|
|
15
|
+
export declare function updateSessionStatus(id: string, status: SessionStatus): void;
|
|
16
|
+
/** Get the currently active (pending/running/waiting_input) session for an environment, if any. */
|
|
17
|
+
export declare function getActiveForEnv(environmentId: string): SessionRow | undefined;
|
|
18
|
+
/** Increment the turn counter for a session. */
|
|
19
|
+
export declare function incrementTurns(id: string): void;
|
|
20
|
+
/** Delete all sessions belonging to a specific environment. */
|
|
21
|
+
export declare function deleteByEnvironment(environmentId: string): void;
|
|
22
|
+
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,qDAAqD;AACrD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAE7D;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAclF;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,EAAE,CAK7D;AAED,yGAAyG;AACzG,wBAAgB,aAAa,CAC3B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,aAAa,EACrB,gBAAgB,CAAC,EAAE,MAAM,EACzB,KAAK,CAAC,EAAE,MAAM,GACb,IAAI,CAaN;AAED,kDAAkD;AAClD,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAK3E;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAS7E;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAE/D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import db from "./db.js";
|
|
2
|
+
import { sessions } from "./schema.js";
|
|
3
|
+
import { eq, and, inArray, desc, sql } from "drizzle-orm";
|
|
4
|
+
/** Insert a new session record into the database. */
|
|
5
|
+
export function createSession(id, environmentId, runtime, prompt, model, logPath) {
|
|
6
|
+
db.insert(sessions).values({ id, environmentId, runtime, prompt, model, logPath }).run();
|
|
7
|
+
}
|
|
8
|
+
/** Retrieve a single session by ID. */
|
|
9
|
+
export function getSession(id) {
|
|
10
|
+
return db.select().from(sessions).where(eq(sessions.id, id)).get();
|
|
11
|
+
}
|
|
12
|
+
/** List sessions, optionally filtered by environment and/or status. */
|
|
13
|
+
export function listSessions(environmentId, status) {
|
|
14
|
+
const conditions = [];
|
|
15
|
+
if (environmentId) {
|
|
16
|
+
conditions.push(eq(sessions.environmentId, environmentId));
|
|
17
|
+
}
|
|
18
|
+
if (status) {
|
|
19
|
+
conditions.push(eq(sessions.status, status));
|
|
20
|
+
}
|
|
21
|
+
const query = db.select().from(sessions);
|
|
22
|
+
if (conditions.length > 0) {
|
|
23
|
+
return query.where(and(...conditions)).orderBy(desc(sessions.startedAt)).all();
|
|
24
|
+
}
|
|
25
|
+
return query.orderBy(desc(sessions.startedAt)).all();
|
|
26
|
+
}
|
|
27
|
+
/** List all sessions belonging to a specific environment. */
|
|
28
|
+
export function listByEnv(environmentId) {
|
|
29
|
+
return db.select().from(sessions)
|
|
30
|
+
.where(eq(sessions.environmentId, environmentId))
|
|
31
|
+
.orderBy(desc(sessions.startedAt))
|
|
32
|
+
.all();
|
|
33
|
+
}
|
|
34
|
+
/** Update a session's status, runtime session ID, and error; auto-sets `endedAt` for terminal states. */
|
|
35
|
+
export function updateSession(id, status, runtimeSessionId, error) {
|
|
36
|
+
const endedAt = ["completed", "failed", "killed"].includes(status)
|
|
37
|
+
? new Date().toISOString()
|
|
38
|
+
: null;
|
|
39
|
+
db.update(sessions)
|
|
40
|
+
.set({
|
|
41
|
+
status,
|
|
42
|
+
runtimeSessionId: runtimeSessionId ?? null,
|
|
43
|
+
endedAt,
|
|
44
|
+
error: error ?? null,
|
|
45
|
+
})
|
|
46
|
+
.where(eq(sessions.id, id))
|
|
47
|
+
.run();
|
|
48
|
+
}
|
|
49
|
+
/** Update only the status column of a session. */
|
|
50
|
+
export function updateSessionStatus(id, status) {
|
|
51
|
+
db.update(sessions)
|
|
52
|
+
.set({ status })
|
|
53
|
+
.where(eq(sessions.id, id))
|
|
54
|
+
.run();
|
|
55
|
+
}
|
|
56
|
+
/** Get the currently active (pending/running/waiting_input) session for an environment, if any. */
|
|
57
|
+
export function getActiveForEnv(environmentId) {
|
|
58
|
+
return db.select().from(sessions)
|
|
59
|
+
.where(and(eq(sessions.environmentId, environmentId), inArray(sessions.status, ["pending", "running", "waiting_input"])))
|
|
60
|
+
.get();
|
|
61
|
+
}
|
|
62
|
+
/** Increment the turn counter for a session. */
|
|
63
|
+
export function incrementTurns(id) {
|
|
64
|
+
db.update(sessions)
|
|
65
|
+
.set({ turns: sql `${sessions.turns} + 1` })
|
|
66
|
+
.where(eq(sessions.id, id))
|
|
67
|
+
.run();
|
|
68
|
+
}
|
|
69
|
+
/** Delete all sessions belonging to a specific environment. */
|
|
70
|
+
export function deleteByEnvironment(environmentId) {
|
|
71
|
+
db.delete(sessions).where(eq(sessions.environmentId, environmentId)).run();
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=session-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { grackle } from "@grackle-ai/common";
|
|
2
|
+
type SessionEvent = grackle.SessionEvent;
|
|
3
|
+
/** Broadcast a session event to all session-specific and global subscribers. */
|
|
4
|
+
export declare function publish(event: SessionEvent): void;
|
|
5
|
+
/** Create a cancellable async iterable that yields events for a specific session. */
|
|
6
|
+
export declare function createStream(sessionId: string): AsyncIterable<SessionEvent> & {
|
|
7
|
+
cancel(): void;
|
|
8
|
+
};
|
|
9
|
+
/** Create a cancellable async iterable that yields events from all sessions. */
|
|
10
|
+
export declare function createGlobalStream(): AsyncIterable<SessionEvent> & {
|
|
11
|
+
cancel(): void;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=stream-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-hub.d.ts","sourceRoot":"","sources":["../src/stream-hub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;AAMzC,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAQjD;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,CAAC,YAAY,CAAC,GAAG;IAAE,MAAM,IAAI,IAAI,CAAA;CAAE,CA4ChG;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,IAAI,aAAa,CAAC,YAAY,CAAC,GAAG;IAAE,MAAM,IAAI,IAAI,CAAA;CAAE,CAqCrF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const sessionSubs = new Map();
|
|
2
|
+
const globalSubs = new Set();
|
|
3
|
+
/** Broadcast a session event to all session-specific and global subscribers. */
|
|
4
|
+
export function publish(event) {
|
|
5
|
+
// Notify session-specific subscribers
|
|
6
|
+
const subs = sessionSubs.get(event.sessionId);
|
|
7
|
+
if (subs) {
|
|
8
|
+
for (const sub of subs)
|
|
9
|
+
sub(event);
|
|
10
|
+
}
|
|
11
|
+
// Notify global subscribers
|
|
12
|
+
for (const sub of globalSubs)
|
|
13
|
+
sub(event);
|
|
14
|
+
}
|
|
15
|
+
/** Create a cancellable async iterable that yields events for a specific session. */
|
|
16
|
+
export function createStream(sessionId) {
|
|
17
|
+
const queue = [];
|
|
18
|
+
let waiting = undefined;
|
|
19
|
+
const state = { done: false };
|
|
20
|
+
const subscriber = (event) => {
|
|
21
|
+
queue.push(event);
|
|
22
|
+
if (waiting) {
|
|
23
|
+
waiting();
|
|
24
|
+
waiting = undefined;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
// Subscribe
|
|
28
|
+
let subs = sessionSubs.get(sessionId);
|
|
29
|
+
if (!subs) {
|
|
30
|
+
subs = new Set();
|
|
31
|
+
sessionSubs.set(sessionId, subs);
|
|
32
|
+
}
|
|
33
|
+
subs.add(subscriber);
|
|
34
|
+
const stream = {
|
|
35
|
+
cancel() {
|
|
36
|
+
state.done = true;
|
|
37
|
+
subs.delete(subscriber);
|
|
38
|
+
if (subs.size === 0)
|
|
39
|
+
sessionSubs.delete(sessionId);
|
|
40
|
+
if (waiting)
|
|
41
|
+
waiting();
|
|
42
|
+
},
|
|
43
|
+
[Symbol.asyncIterator]() {
|
|
44
|
+
return {
|
|
45
|
+
async next() {
|
|
46
|
+
while (queue.length === 0 && !state.done) {
|
|
47
|
+
await new Promise((resolve) => { waiting = resolve; });
|
|
48
|
+
}
|
|
49
|
+
if (queue.length > 0) {
|
|
50
|
+
return { value: queue.shift(), done: false };
|
|
51
|
+
}
|
|
52
|
+
return { value: undefined, done: true };
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return stream;
|
|
58
|
+
}
|
|
59
|
+
/** Create a cancellable async iterable that yields events from all sessions. */
|
|
60
|
+
export function createGlobalStream() {
|
|
61
|
+
const queue = [];
|
|
62
|
+
let waiting = undefined;
|
|
63
|
+
const state = { done: false };
|
|
64
|
+
const subscriber = (event) => {
|
|
65
|
+
queue.push(event);
|
|
66
|
+
if (waiting) {
|
|
67
|
+
waiting();
|
|
68
|
+
waiting = undefined;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
globalSubs.add(subscriber);
|
|
72
|
+
const stream = {
|
|
73
|
+
cancel() {
|
|
74
|
+
state.done = true;
|
|
75
|
+
globalSubs.delete(subscriber);
|
|
76
|
+
if (waiting)
|
|
77
|
+
waiting();
|
|
78
|
+
},
|
|
79
|
+
[Symbol.asyncIterator]() {
|
|
80
|
+
return {
|
|
81
|
+
async next() {
|
|
82
|
+
while (queue.length === 0 && !state.done) {
|
|
83
|
+
await new Promise((resolve) => { waiting = resolve; });
|
|
84
|
+
}
|
|
85
|
+
if (queue.length > 0) {
|
|
86
|
+
return { value: queue.shift(), done: false };
|
|
87
|
+
}
|
|
88
|
+
return { value: undefined, done: true };
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
return stream;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=stream-hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-hub.js","sourceRoot":"","sources":["../src/stream-hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type TaskRow } from "./schema.js";
|
|
2
|
+
import type { TaskStatus } from "@grackle-ai/common";
|
|
3
|
+
export type { TaskRow };
|
|
4
|
+
/** Insert a new task with auto-generated branch name and sort order. */
|
|
5
|
+
export declare function createTask(id: string, projectId: string, title: string, description: string, environmentId: string, dependsOn: string[], projectSlug: string): void;
|
|
6
|
+
/** Retrieve a single task by ID. */
|
|
7
|
+
export declare function getTask(id: string): TaskRow | undefined;
|
|
8
|
+
/** Return all tasks for a project, ordered by sort_order then created_at. */
|
|
9
|
+
export declare function listTasks(projectId: string): TaskRow[];
|
|
10
|
+
/** Update multiple task fields at once. */
|
|
11
|
+
export declare function updateTask(id: string, title: string, description: string, status: string, environmentId: string, dependsOn: string[], reviewNotes: string): void;
|
|
12
|
+
/** Update only the task status. */
|
|
13
|
+
export declare function updateTaskStatus(id: string, status: TaskStatus): void;
|
|
14
|
+
/** Set the session ID for a task. */
|
|
15
|
+
export declare function setTaskSession(id: string, sessionId: string): void;
|
|
16
|
+
/** Mark a task as in_progress with a started_at timestamp. */
|
|
17
|
+
export declare function markTaskStarted(id: string): void;
|
|
18
|
+
/** Mark a task as completed (review, done, or failed) with a completed_at timestamp. */
|
|
19
|
+
export declare function markTaskCompleted(id: string, status: "review" | "done" | "failed"): void;
|
|
20
|
+
/** Delete a task by ID. */
|
|
21
|
+
export declare function deleteTask(id: string): void;
|
|
22
|
+
/** Return all pending tasks whose dependencies are fully met. */
|
|
23
|
+
export declare function getUnblockedTasks(projectId: string): TaskRow[];
|
|
24
|
+
/** Alias for getUnblockedTasks — check which pending tasks are now unblocked. */
|
|
25
|
+
export declare function checkAndUnblock(projectId: string): TaskRow[];
|
|
26
|
+
/** Check whether all dependencies of a task are in "done" status. */
|
|
27
|
+
export declare function areDependenciesMet(taskId: string): boolean;
|
|
28
|
+
//# sourceMappingURL=task-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.d.ts","sourceRoot":"","sources":["../src/task-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,YAAY,EAAE,OAAO,EAAE,CAAC;AAMxB,wEAAwE;AACxE,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI,CAkBN;AAED,oCAAoC;AACpC,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEvD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAKtD;AAED,2CAA2C;AAC3C,wBAAgB,UAAU,CACxB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI,CAUN;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAKrE;AAED,qCAAqC;AACrC,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKlE;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMhD;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAMxF;AAED,2BAA2B;AAC3B,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAE3C;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAe9D;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAE5D;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAa1D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import db from "./db.js";
|
|
2
|
+
import { tasks } from "./schema.js";
|
|
3
|
+
import { eq, sql, asc } from "drizzle-orm";
|
|
4
|
+
import { safeParseJsonArray } from "./json-helpers.js";
|
|
5
|
+
function slugify(text) {
|
|
6
|
+
return text.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 40);
|
|
7
|
+
}
|
|
8
|
+
/** Insert a new task with auto-generated branch name and sort order. */
|
|
9
|
+
export function createTask(id, projectId, title, description, environmentId, dependsOn, projectSlug) {
|
|
10
|
+
const branch = `${projectSlug}/${slugify(title)}`;
|
|
11
|
+
const depsJson = JSON.stringify(dependsOn);
|
|
12
|
+
const maxRow = db.select({ maxOrder: sql `max(sort_order)` })
|
|
13
|
+
.from(tasks)
|
|
14
|
+
.where(eq(tasks.projectId, projectId))
|
|
15
|
+
.get();
|
|
16
|
+
const sortOrder = (maxRow?.maxOrder ?? -1) + 1;
|
|
17
|
+
db.insert(tasks).values({
|
|
18
|
+
id,
|
|
19
|
+
projectId,
|
|
20
|
+
title,
|
|
21
|
+
description,
|
|
22
|
+
branch,
|
|
23
|
+
environmentId,
|
|
24
|
+
dependsOn: depsJson,
|
|
25
|
+
sortOrder,
|
|
26
|
+
}).run();
|
|
27
|
+
}
|
|
28
|
+
/** Retrieve a single task by ID. */
|
|
29
|
+
export function getTask(id) {
|
|
30
|
+
return db.select().from(tasks).where(eq(tasks.id, id)).get();
|
|
31
|
+
}
|
|
32
|
+
/** Return all tasks for a project, ordered by sort_order then created_at. */
|
|
33
|
+
export function listTasks(projectId) {
|
|
34
|
+
return db.select().from(tasks)
|
|
35
|
+
.where(eq(tasks.projectId, projectId))
|
|
36
|
+
.orderBy(asc(tasks.sortOrder), asc(tasks.createdAt))
|
|
37
|
+
.all();
|
|
38
|
+
}
|
|
39
|
+
/** Update multiple task fields at once. */
|
|
40
|
+
export function updateTask(id, title, description, status, environmentId, dependsOn, reviewNotes) {
|
|
41
|
+
db.update(tasks).set({
|
|
42
|
+
title,
|
|
43
|
+
description,
|
|
44
|
+
status,
|
|
45
|
+
environmentId,
|
|
46
|
+
dependsOn: JSON.stringify(dependsOn),
|
|
47
|
+
reviewNotes,
|
|
48
|
+
updatedAt: sql `datetime('now')`,
|
|
49
|
+
}).where(eq(tasks.id, id)).run();
|
|
50
|
+
}
|
|
51
|
+
/** Update only the task status. */
|
|
52
|
+
export function updateTaskStatus(id, status) {
|
|
53
|
+
db.update(tasks).set({
|
|
54
|
+
status,
|
|
55
|
+
updatedAt: sql `datetime('now')`,
|
|
56
|
+
}).where(eq(tasks.id, id)).run();
|
|
57
|
+
}
|
|
58
|
+
/** Set the session ID for a task. */
|
|
59
|
+
export function setTaskSession(id, sessionId) {
|
|
60
|
+
db.update(tasks).set({
|
|
61
|
+
sessionId,
|
|
62
|
+
updatedAt: sql `datetime('now')`,
|
|
63
|
+
}).where(eq(tasks.id, id)).run();
|
|
64
|
+
}
|
|
65
|
+
/** Mark a task as in_progress with a started_at timestamp. */
|
|
66
|
+
export function markTaskStarted(id) {
|
|
67
|
+
db.update(tasks).set({
|
|
68
|
+
status: "in_progress",
|
|
69
|
+
startedAt: sql `datetime('now')`,
|
|
70
|
+
updatedAt: sql `datetime('now')`,
|
|
71
|
+
}).where(eq(tasks.id, id)).run();
|
|
72
|
+
}
|
|
73
|
+
/** Mark a task as completed (review, done, or failed) with a completed_at timestamp. */
|
|
74
|
+
export function markTaskCompleted(id, status) {
|
|
75
|
+
db.update(tasks).set({
|
|
76
|
+
status,
|
|
77
|
+
completedAt: sql `datetime('now')`,
|
|
78
|
+
updatedAt: sql `datetime('now')`,
|
|
79
|
+
}).where(eq(tasks.id, id)).run();
|
|
80
|
+
}
|
|
81
|
+
/** Delete a task by ID. */
|
|
82
|
+
export function deleteTask(id) {
|
|
83
|
+
db.delete(tasks).where(eq(tasks.id, id)).run();
|
|
84
|
+
}
|
|
85
|
+
/** Return all pending tasks whose dependencies are fully met. */
|
|
86
|
+
export function getUnblockedTasks(projectId) {
|
|
87
|
+
const all = listTasks(projectId);
|
|
88
|
+
return all.filter((task) => {
|
|
89
|
+
if (task.status !== "pending") {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
const deps = safeParseJsonArray(task.dependsOn);
|
|
93
|
+
if (deps.length === 0) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
return deps.every((depId) => {
|
|
97
|
+
const dep = all.find((t) => t.id === depId);
|
|
98
|
+
return dep?.status === "done";
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/** Alias for getUnblockedTasks — check which pending tasks are now unblocked. */
|
|
103
|
+
export function checkAndUnblock(projectId) {
|
|
104
|
+
return getUnblockedTasks(projectId);
|
|
105
|
+
}
|
|
106
|
+
/** Check whether all dependencies of a task are in "done" status. */
|
|
107
|
+
export function areDependenciesMet(taskId) {
|
|
108
|
+
const task = getTask(taskId);
|
|
109
|
+
if (!task) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const deps = safeParseJsonArray(task.dependsOn);
|
|
113
|
+
if (deps.length === 0) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
return deps.every((depId) => {
|
|
117
|
+
const dep = getTask(depId);
|
|
118
|
+
return dep?.status === "done";
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=task-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-store.js","sourceRoot":"","sources":["../src/task-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { powerline } from "@grackle-ai/common";
|
|
2
|
+
interface TokenConfig {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
envVar?: string;
|
|
6
|
+
filePath?: string;
|
|
7
|
+
value: string;
|
|
8
|
+
expiresAt?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Encrypt and store a token, then auto-push to all connected environments. */
|
|
11
|
+
export declare function setToken(entry: TokenConfig): Promise<void>;
|
|
12
|
+
/** List all stored tokens (values are omitted for security). */
|
|
13
|
+
export declare function listTokens(): Array<{
|
|
14
|
+
name: string;
|
|
15
|
+
type: string;
|
|
16
|
+
envVar?: string;
|
|
17
|
+
filePath?: string;
|
|
18
|
+
expiresAt?: string;
|
|
19
|
+
}>;
|
|
20
|
+
/** Build a decrypted token bundle suitable for pushing to a PowerLine. */
|
|
21
|
+
export declare function getBundle(): powerline.TokenBundle;
|
|
22
|
+
/** Push the current token bundle to a single connected environment. */
|
|
23
|
+
export declare function pushToEnv(environmentId: string): Promise<void>;
|
|
24
|
+
/** Push the current token bundle to all connected environments in parallel. */
|
|
25
|
+
export declare function pushToAll(): Promise<void>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=token-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-broker.d.ts","sourceRoot":"","sources":["../src/token-broker.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,wBAAsB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAehE;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY1H;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,IAAI,SAAS,CAAC,WAAW,CAcjD;AAED,uEAAuE;AACvE,wBAAsB,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYpE;AAED,+EAA+E;AAC/E,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAW/C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import db from "./db.js";
|
|
2
|
+
import { tokens } from "./schema.js";
|
|
3
|
+
import { encrypt, decrypt } from "./crypto.js";
|
|
4
|
+
import { create } from "@bufbuild/protobuf";
|
|
5
|
+
import { powerline } from "@grackle-ai/common";
|
|
6
|
+
import * as adapterManager from "./adapter-manager.js";
|
|
7
|
+
import { logger } from "./logger.js";
|
|
8
|
+
/** Encrypt and store a token, then auto-push to all connected environments. */
|
|
9
|
+
export async function setToken(entry) {
|
|
10
|
+
const encrypted = {
|
|
11
|
+
...entry,
|
|
12
|
+
value: encrypt(entry.value),
|
|
13
|
+
};
|
|
14
|
+
db.insert(tokens)
|
|
15
|
+
.values({ id: entry.name, config: JSON.stringify(encrypted) })
|
|
16
|
+
.onConflictDoUpdate({
|
|
17
|
+
target: tokens.id,
|
|
18
|
+
set: { config: JSON.stringify(encrypted) },
|
|
19
|
+
})
|
|
20
|
+
.run();
|
|
21
|
+
// Auto-push to all connected environments
|
|
22
|
+
await pushToAll();
|
|
23
|
+
}
|
|
24
|
+
/** List all stored tokens (values are omitted for security). */
|
|
25
|
+
export function listTokens() {
|
|
26
|
+
const rows = db.select().from(tokens).all();
|
|
27
|
+
return rows.map((row) => {
|
|
28
|
+
const cfg = JSON.parse(row.config);
|
|
29
|
+
return {
|
|
30
|
+
name: cfg.name,
|
|
31
|
+
type: cfg.type,
|
|
32
|
+
envVar: cfg.envVar,
|
|
33
|
+
filePath: cfg.filePath,
|
|
34
|
+
expiresAt: cfg.expiresAt,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Build a decrypted token bundle suitable for pushing to a PowerLine. */
|
|
39
|
+
export function getBundle() {
|
|
40
|
+
const rows = db.select().from(tokens).all();
|
|
41
|
+
const items = rows.map((row) => {
|
|
42
|
+
const cfg = JSON.parse(row.config);
|
|
43
|
+
return create(powerline.TokenItemSchema, {
|
|
44
|
+
name: cfg.name,
|
|
45
|
+
type: cfg.type,
|
|
46
|
+
envVar: cfg.envVar || "",
|
|
47
|
+
filePath: cfg.filePath || "",
|
|
48
|
+
value: decrypt(cfg.value),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
return create(powerline.TokenBundleSchema, { tokens: items });
|
|
52
|
+
}
|
|
53
|
+
/** Push the current token bundle to a single connected environment. */
|
|
54
|
+
export async function pushToEnv(environmentId) {
|
|
55
|
+
const conn = adapterManager.getConnection(environmentId);
|
|
56
|
+
if (!conn) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const bundle = getBundle();
|
|
60
|
+
if (bundle.tokens.length === 0) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
await conn.client.pushTokens(bundle);
|
|
64
|
+
}
|
|
65
|
+
/** Push the current token bundle to all connected environments in parallel. */
|
|
66
|
+
export async function pushToAll() {
|
|
67
|
+
const connections = adapterManager.listConnections();
|
|
68
|
+
const promises = [];
|
|
69
|
+
for (const [environmentId] of connections) {
|
|
70
|
+
promises.push(pushToEnv(environmentId).catch((err) => {
|
|
71
|
+
logger.error({ environmentId, err }, "Failed to push tokens");
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
await Promise.all(promises);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=token-broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-broker.js","sourceRoot":"","sources":["../src/token-broker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Generate a Markdown transcript from a session's JSONL log. */
|
|
2
|
+
export declare function generateTranscript(logPath: string): string;
|
|
3
|
+
/** Generate and write a Markdown transcript file alongside the session log. */
|
|
4
|
+
export declare function writeTranscript(logPath: string): void;
|
|
5
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AA6BA,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKrD"}
|