@grackle-ai/database 0.73.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.
- package/README.md +34 -0
- package/dist/credential-providers.d.ts +41 -0
- package/dist/credential-providers.d.ts.map +1 -0
- package/dist/credential-providers.js +97 -0
- package/dist/credential-providers.js.map +1 -0
- package/dist/crypto.d.ts +5 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +75 -0
- package/dist/crypto.js.map +1 -0
- package/dist/db-seed.d.ts +16 -0
- package/dist/db-seed.d.ts.map +1 -0
- package/dist/db-seed.js +176 -0
- package/dist/db-seed.js.map +1 -0
- package/dist/db.d.ts +43 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +478 -0
- package/dist/db.js.map +1 -0
- package/dist/env-registry.d.ts +29 -0
- package/dist/env-registry.d.ts.map +1 -0
- package/dist/env-registry.js +78 -0
- package/dist/env-registry.js.map +1 -0
- package/dist/event-store.d.ts +19 -0
- package/dist/event-store.d.ts.map +1 -0
- package/dist/event-store.js +16 -0
- package/dist/event-store.js.map +1 -0
- package/dist/finding-store.d.ts +7 -0
- package/dist/finding-store.d.ts.map +1 -0
- package/dist/finding-store.js +45 -0
- package/dist/finding-store.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -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/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/persona-store.d.ts +15 -0
- package/dist/persona-store.d.ts.map +1 -0
- package/dist/persona-store.js +57 -0
- package/dist/persona-store.js.map +1 -0
- package/dist/schema.d.ts +1784 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +152 -0
- package/dist/schema.js.map +1 -0
- package/dist/session-store.d.ts +57 -0
- package/dist/session-store.d.ts.map +1 -0
- package/dist/session-store.js +204 -0
- package/dist/session-store.js.map +1 -0
- package/dist/settings-store.d.ts +14 -0
- package/dist/settings-store.d.ts.map +1 -0
- package/dist/settings-store.js +30 -0
- package/dist/settings-store.js.map +1 -0
- package/dist/task-store.d.ts +71 -0
- package/dist/task-store.d.ts.map +1 -0
- package/dist/task-store.js +301 -0
- package/dist/task-store.js.map +1 -0
- package/dist/test-db.d.ts +13 -0
- package/dist/test-db.d.ts.map +1 -0
- package/dist/test-db.js +14 -0
- package/dist/test-db.js.map +1 -0
- package/dist/token-store.d.ts +25 -0
- package/dist/token-store.d.ts.map +1 -0
- package/dist/token-store.js +58 -0
- package/dist/token-store.js.map +1 -0
- package/dist/utils/slugify.d.ts +20 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +22 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/workspace-store.d.ts +29 -0
- package/dist/workspace-store.d.ts.map +1 -0
- package/dist/workspace-store.js +74 -0
- package/dist/workspace-store.js.map +1 -0
- package/package.json +48 -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,152 @@
|
|
|
1
|
+
import { sqliteTable, text, integer, real } 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" })
|
|
12
|
+
.notNull()
|
|
13
|
+
.default(false),
|
|
14
|
+
status: text("status").notNull().default("disconnected"),
|
|
15
|
+
lastSeen: text("last_seen"),
|
|
16
|
+
envInfo: text("env_info"),
|
|
17
|
+
createdAt: text("created_at")
|
|
18
|
+
.notNull()
|
|
19
|
+
.default(sql `(datetime('now'))`),
|
|
20
|
+
powerlineToken: text("powerline_token").notNull().default(""),
|
|
21
|
+
});
|
|
22
|
+
// ─── Sessions ──────────────────────────────────────────────
|
|
23
|
+
export const sessions = sqliteTable("sessions", {
|
|
24
|
+
id: text("id").primaryKey(),
|
|
25
|
+
environmentId: text("env_id")
|
|
26
|
+
.notNull()
|
|
27
|
+
.references(() => environments.id),
|
|
28
|
+
runtime: text("runtime").notNull(),
|
|
29
|
+
runtimeSessionId: text("runtime_session_id"),
|
|
30
|
+
prompt: text("prompt").notNull(),
|
|
31
|
+
model: text("model").notNull(),
|
|
32
|
+
status: text("status").notNull().default("pending"),
|
|
33
|
+
logPath: text("log_path"),
|
|
34
|
+
turns: integer("turns").notNull().default(0),
|
|
35
|
+
startedAt: text("started_at")
|
|
36
|
+
.notNull()
|
|
37
|
+
.default(sql `(datetime('now'))`),
|
|
38
|
+
suspendedAt: text("suspended_at"),
|
|
39
|
+
endedAt: text("ended_at"),
|
|
40
|
+
endReason: text("end_reason"),
|
|
41
|
+
error: text("error"),
|
|
42
|
+
taskId: text("task_id").notNull().default(""),
|
|
43
|
+
personaId: text("persona_id").notNull().default(""),
|
|
44
|
+
parentSessionId: text("parent_session_id").notNull().default(""),
|
|
45
|
+
pipeMode: text("pipe_mode").notNull().default(""),
|
|
46
|
+
inputTokens: integer("input_tokens").notNull().default(0),
|
|
47
|
+
outputTokens: integer("output_tokens").notNull().default(0),
|
|
48
|
+
costUsd: real("cost_usd").notNull().default(0),
|
|
49
|
+
});
|
|
50
|
+
// ─── Tokens ────────────────────────────────────────────────
|
|
51
|
+
export const tokens = sqliteTable("tokens", {
|
|
52
|
+
id: text("id").primaryKey(),
|
|
53
|
+
config: text("config").notNull(),
|
|
54
|
+
createdAt: text("created_at")
|
|
55
|
+
.notNull()
|
|
56
|
+
.default(sql `(datetime('now'))`),
|
|
57
|
+
});
|
|
58
|
+
// ─── Workspaces ───────────────────────────────────────────
|
|
59
|
+
export const workspaces = sqliteTable("workspaces", {
|
|
60
|
+
id: text("id").primaryKey(),
|
|
61
|
+
name: text("name").notNull(),
|
|
62
|
+
description: text("description").notNull().default(""),
|
|
63
|
+
repoUrl: text("repo_url").notNull().default(""),
|
|
64
|
+
environmentId: text("environment_id").notNull().references(() => environments.id),
|
|
65
|
+
status: text("status").notNull().default("active"),
|
|
66
|
+
useWorktrees: integer("use_worktrees", { mode: "boolean" })
|
|
67
|
+
.notNull()
|
|
68
|
+
.default(true),
|
|
69
|
+
worktreeBasePath: text("worktree_base_path").notNull().default(""),
|
|
70
|
+
defaultPersonaId: text("default_persona_id").notNull().default(""),
|
|
71
|
+
createdAt: text("created_at")
|
|
72
|
+
.notNull()
|
|
73
|
+
.default(sql `(datetime('now'))`),
|
|
74
|
+
updatedAt: text("updated_at")
|
|
75
|
+
.notNull()
|
|
76
|
+
.default(sql `(datetime('now'))`),
|
|
77
|
+
});
|
|
78
|
+
// ─── Tasks ────────────────────────────────────────────────
|
|
79
|
+
export const tasks = sqliteTable("tasks", {
|
|
80
|
+
id: text("id").primaryKey(),
|
|
81
|
+
workspaceId: text("workspace_id")
|
|
82
|
+
.references(() => workspaces.id),
|
|
83
|
+
title: text("title").notNull(),
|
|
84
|
+
description: text("description").notNull().default(""),
|
|
85
|
+
status: text("status").notNull().default("not_started"),
|
|
86
|
+
branch: text("branch").notNull().default(""),
|
|
87
|
+
dependsOn: text("depends_on").notNull().default("[]"),
|
|
88
|
+
startedAt: text("started_at"),
|
|
89
|
+
completedAt: text("completed_at"),
|
|
90
|
+
createdAt: text("created_at")
|
|
91
|
+
.notNull()
|
|
92
|
+
.default(sql `(datetime('now'))`),
|
|
93
|
+
updatedAt: text("updated_at")
|
|
94
|
+
.notNull()
|
|
95
|
+
.default(sql `(datetime('now'))`),
|
|
96
|
+
sortOrder: integer("sort_order").notNull().default(0),
|
|
97
|
+
parentTaskId: text("parent_task_id").notNull().default(""),
|
|
98
|
+
depth: integer("depth").notNull().default(0),
|
|
99
|
+
canDecompose: integer("can_decompose", { mode: "boolean" })
|
|
100
|
+
.notNull()
|
|
101
|
+
.default(false),
|
|
102
|
+
defaultPersonaId: text("default_persona_id").notNull().default(""),
|
|
103
|
+
});
|
|
104
|
+
// ─── Findings ─────────────────────────────────────────────
|
|
105
|
+
export const findings = sqliteTable("findings", {
|
|
106
|
+
id: text("id").primaryKey(),
|
|
107
|
+
workspaceId: text("workspace_id")
|
|
108
|
+
.notNull()
|
|
109
|
+
.references(() => workspaces.id),
|
|
110
|
+
taskId: text("task_id").notNull().default(""),
|
|
111
|
+
sessionId: text("session_id").notNull().default(""),
|
|
112
|
+
category: text("category").notNull().default("general"),
|
|
113
|
+
title: text("title").notNull(),
|
|
114
|
+
content: text("content").notNull(),
|
|
115
|
+
tags: text("tags").notNull().default("[]"),
|
|
116
|
+
createdAt: text("created_at")
|
|
117
|
+
.notNull()
|
|
118
|
+
.default(sql `(datetime('now'))`),
|
|
119
|
+
});
|
|
120
|
+
// ─── Settings ─────────────────────────────────────────────
|
|
121
|
+
export const settings = sqliteTable("settings", {
|
|
122
|
+
key: text("key").primaryKey(),
|
|
123
|
+
value: text("value").notNull(),
|
|
124
|
+
});
|
|
125
|
+
// ─── Personas ─────────────────────────────────────────────
|
|
126
|
+
export const personas = sqliteTable("personas", {
|
|
127
|
+
id: text("id").primaryKey(),
|
|
128
|
+
name: text("name").notNull().unique(),
|
|
129
|
+
description: text("description").notNull().default(""),
|
|
130
|
+
systemPrompt: text("system_prompt").notNull(),
|
|
131
|
+
toolConfig: text("tool_config").notNull().default("{}"),
|
|
132
|
+
runtime: text("runtime").notNull().default(""),
|
|
133
|
+
model: text("model").notNull().default(""),
|
|
134
|
+
maxTurns: integer("max_turns").notNull().default(0),
|
|
135
|
+
mcpServers: text("mcp_servers").notNull().default("[]"),
|
|
136
|
+
type: text("type").notNull().default("agent"),
|
|
137
|
+
script: text("script").notNull().default(""),
|
|
138
|
+
createdAt: text("created_at")
|
|
139
|
+
.notNull()
|
|
140
|
+
.default(sql `(datetime('now'))`),
|
|
141
|
+
updatedAt: text("updated_at")
|
|
142
|
+
.notNull()
|
|
143
|
+
.default(sql `(datetime('now'))`),
|
|
144
|
+
});
|
|
145
|
+
// ─── Domain Events ───────────────────────────────────────
|
|
146
|
+
export const domainEvents = sqliteTable("domain_events", {
|
|
147
|
+
id: text("id").primaryKey(),
|
|
148
|
+
type: text("type").notNull(),
|
|
149
|
+
timestamp: text("timestamp").notNull(),
|
|
150
|
+
payload: text("payload").notNull(),
|
|
151
|
+
});
|
|
152
|
+
//# 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,57 @@
|
|
|
1
|
+
import { type SessionRow } from "./schema.js";
|
|
2
|
+
import type { SessionStatus, PipeMode, EndReason } 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, taskId?: string, personaId?: string, parentSessionId?: string, pipeMode?: PipeMode): 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 and error; auto-sets `endedAt` for terminal states.
|
|
13
|
+
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
14
|
+
* `endReason` is only meaningful when status is STOPPED — it records why the session ended. */
|
|
15
|
+
export declare function updateSession(id: string, status: SessionStatus, runtimeSessionId?: string, error?: string, endReason?: EndReason): void;
|
|
16
|
+
/** Update only the status column of a session. */
|
|
17
|
+
export declare function updateSessionStatus(id: string, status: SessionStatus): void;
|
|
18
|
+
/** Get the currently active (pending/running/waiting_input) session for an environment, if any. */
|
|
19
|
+
export declare function getActiveForEnv(environmentId: string): SessionRow | undefined;
|
|
20
|
+
/** Increment the turn counter for a session. */
|
|
21
|
+
export declare function incrementTurns(id: string): void;
|
|
22
|
+
/** Accumulate token usage and cost for a session (additive — call once per usage event). */
|
|
23
|
+
export declare function updateSessionUsage(id: string, inputTokens: number, outputTokens: number, costUsd: number): void;
|
|
24
|
+
/** Aggregate usage stats across sessions matching the given filter. */
|
|
25
|
+
export declare function aggregateUsage(filter: {
|
|
26
|
+
taskId?: string;
|
|
27
|
+
taskIds?: string[];
|
|
28
|
+
environmentId?: string;
|
|
29
|
+
}): {
|
|
30
|
+
inputTokens: number;
|
|
31
|
+
outputTokens: number;
|
|
32
|
+
costUsd: number;
|
|
33
|
+
sessionCount: number;
|
|
34
|
+
};
|
|
35
|
+
/** Delete all sessions belonging to a specific environment. */
|
|
36
|
+
export declare function deleteByEnvironment(environmentId: string): void;
|
|
37
|
+
/** Update the taskId for an existing session (late-bind). */
|
|
38
|
+
export declare function setSessionTask(id: string, taskId: string): void;
|
|
39
|
+
/** Persist the runtime-native session ID returned by the PowerLine. */
|
|
40
|
+
export declare function updateRuntimeSessionId(id: string, runtimeSessionId: string): void;
|
|
41
|
+
/** Transition a session to SUSPENDED — transport lost, pending auto-recovery on reconnect. */
|
|
42
|
+
export declare function suspendSession(id: string): void;
|
|
43
|
+
/** Get all SUSPENDED sessions for an environment, ordered by startedAt (oldest first). */
|
|
44
|
+
export declare function getSuspendedForEnv(environmentId: string): SessionRow[];
|
|
45
|
+
/** Clear terminal state for reanimate — reset status to running, clear endedAt/endReason/error/suspendedAt. */
|
|
46
|
+
export declare function reanimateSession(id: string): void;
|
|
47
|
+
/** List all sessions for a specific task, ordered chronologically (oldest first). */
|
|
48
|
+
export declare function listSessionsForTask(taskId: string): SessionRow[];
|
|
49
|
+
/** Get the most recent session for a task (by startedAt DESC, id DESC). */
|
|
50
|
+
export declare function getLatestSessionForTask(taskId: string): SessionRow | undefined;
|
|
51
|
+
/** Get all active (non-terminal) sessions for a task. */
|
|
52
|
+
export declare function getActiveSessionsForTask(taskId: string): SessionRow[];
|
|
53
|
+
/** Batch-fetch all sessions for a set of task IDs. Avoids N+1 queries for listTasks. */
|
|
54
|
+
export declare function listSessionsByTaskIds(taskIds: string[]): SessionRow[];
|
|
55
|
+
/** List all child sessions spawned by a parent session. */
|
|
56
|
+
export declare function getChildSessions(parentSessionId: string): SessionRow[];
|
|
57
|
+
//# 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":"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"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import db from "./db.js";
|
|
2
|
+
import { sessions } from "./schema.js";
|
|
3
|
+
import { eq, and, inArray, desc, asc, sql } from "drizzle-orm";
|
|
4
|
+
import { SESSION_STATUS } from "@grackle-ai/common";
|
|
5
|
+
/** Insert a new session record into the database. */
|
|
6
|
+
export function createSession(id, environmentId, runtime, prompt, model, logPath, taskId = "", personaId = "", parentSessionId = "", pipeMode = "") {
|
|
7
|
+
db.insert(sessions).values({
|
|
8
|
+
id,
|
|
9
|
+
environmentId,
|
|
10
|
+
runtime,
|
|
11
|
+
prompt,
|
|
12
|
+
model,
|
|
13
|
+
logPath,
|
|
14
|
+
taskId,
|
|
15
|
+
personaId,
|
|
16
|
+
parentSessionId,
|
|
17
|
+
pipeMode,
|
|
18
|
+
// We always set startedAt explicitly (ISO 8601 format with milliseconds).
|
|
19
|
+
// The schema default also produces ISO format via strftime, but we set it
|
|
20
|
+
// here for consistency. ISO format sorts lexicographically correctly.
|
|
21
|
+
startedAt: new Date().toISOString(),
|
|
22
|
+
}).run();
|
|
23
|
+
}
|
|
24
|
+
/** Retrieve a single session by ID. */
|
|
25
|
+
export function getSession(id) {
|
|
26
|
+
return db.select().from(sessions).where(eq(sessions.id, id)).get();
|
|
27
|
+
}
|
|
28
|
+
/** List sessions, optionally filtered by environment and/or status. */
|
|
29
|
+
export function listSessions(environmentId, status) {
|
|
30
|
+
const conditions = [];
|
|
31
|
+
if (environmentId) {
|
|
32
|
+
conditions.push(eq(sessions.environmentId, environmentId));
|
|
33
|
+
}
|
|
34
|
+
if (status) {
|
|
35
|
+
conditions.push(eq(sessions.status, status));
|
|
36
|
+
}
|
|
37
|
+
const query = db.select().from(sessions);
|
|
38
|
+
if (conditions.length > 0) {
|
|
39
|
+
return query.where(and(...conditions)).orderBy(desc(sessions.startedAt)).all();
|
|
40
|
+
}
|
|
41
|
+
return query.orderBy(desc(sessions.startedAt)).all();
|
|
42
|
+
}
|
|
43
|
+
/** List all sessions belonging to a specific environment. */
|
|
44
|
+
export function listByEnv(environmentId) {
|
|
45
|
+
return db.select().from(sessions)
|
|
46
|
+
.where(eq(sessions.environmentId, environmentId))
|
|
47
|
+
.orderBy(desc(sessions.startedAt))
|
|
48
|
+
.all();
|
|
49
|
+
}
|
|
50
|
+
/** Update a session's status and error; auto-sets `endedAt` for terminal states.
|
|
51
|
+
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
52
|
+
* `endReason` is only meaningful when status is STOPPED — it records why the session ended. */
|
|
53
|
+
export function updateSession(id, status, runtimeSessionId, error, endReason) {
|
|
54
|
+
const endedAt = status === SESSION_STATUS.STOPPED
|
|
55
|
+
? new Date().toISOString()
|
|
56
|
+
: null;
|
|
57
|
+
const patch = {
|
|
58
|
+
status,
|
|
59
|
+
endedAt,
|
|
60
|
+
endReason: endReason ?? null,
|
|
61
|
+
error: error ?? null,
|
|
62
|
+
};
|
|
63
|
+
if (runtimeSessionId !== undefined) {
|
|
64
|
+
patch.runtimeSessionId = runtimeSessionId;
|
|
65
|
+
}
|
|
66
|
+
db.update(sessions)
|
|
67
|
+
.set(patch)
|
|
68
|
+
.where(eq(sessions.id, id))
|
|
69
|
+
.run();
|
|
70
|
+
}
|
|
71
|
+
/** Update only the status column of a session. */
|
|
72
|
+
export function updateSessionStatus(id, status) {
|
|
73
|
+
db.update(sessions)
|
|
74
|
+
.set({ status })
|
|
75
|
+
.where(eq(sessions.id, id))
|
|
76
|
+
.run();
|
|
77
|
+
}
|
|
78
|
+
/** Get the currently active (pending/running/waiting_input) session for an environment, if any. */
|
|
79
|
+
export function getActiveForEnv(environmentId) {
|
|
80
|
+
return db.select().from(sessions)
|
|
81
|
+
.where(and(eq(sessions.environmentId, environmentId), inArray(sessions.status, [SESSION_STATUS.PENDING, SESSION_STATUS.RUNNING, SESSION_STATUS.IDLE])))
|
|
82
|
+
.get();
|
|
83
|
+
}
|
|
84
|
+
/** Increment the turn counter for a session. */
|
|
85
|
+
export function incrementTurns(id) {
|
|
86
|
+
db.update(sessions)
|
|
87
|
+
.set({ turns: sql `${sessions.turns} + 1` })
|
|
88
|
+
.where(eq(sessions.id, id))
|
|
89
|
+
.run();
|
|
90
|
+
}
|
|
91
|
+
/** Accumulate token usage and cost for a session (additive — call once per usage event). */
|
|
92
|
+
export function updateSessionUsage(id, inputTokens, outputTokens, costUsd) {
|
|
93
|
+
db.update(sessions)
|
|
94
|
+
.set({
|
|
95
|
+
inputTokens: sql `${sessions.inputTokens} + ${inputTokens}`,
|
|
96
|
+
outputTokens: sql `${sessions.outputTokens} + ${outputTokens}`,
|
|
97
|
+
costUsd: sql `${sessions.costUsd} + ${costUsd}`,
|
|
98
|
+
})
|
|
99
|
+
.where(eq(sessions.id, id))
|
|
100
|
+
.run();
|
|
101
|
+
}
|
|
102
|
+
/** Aggregate usage stats across sessions matching the given filter. */
|
|
103
|
+
export function aggregateUsage(filter) {
|
|
104
|
+
const conditions = [];
|
|
105
|
+
if (filter.taskId) {
|
|
106
|
+
conditions.push(eq(sessions.taskId, filter.taskId));
|
|
107
|
+
}
|
|
108
|
+
if (filter.taskIds && filter.taskIds.length > 0) {
|
|
109
|
+
conditions.push(inArray(sessions.taskId, filter.taskIds));
|
|
110
|
+
}
|
|
111
|
+
if (filter.environmentId) {
|
|
112
|
+
conditions.push(eq(sessions.environmentId, filter.environmentId));
|
|
113
|
+
}
|
|
114
|
+
const where = conditions.length > 0 ? and(...conditions) : undefined;
|
|
115
|
+
const result = db.select({
|
|
116
|
+
inputTokens: sql `COALESCE(SUM(${sessions.inputTokens}), 0)`,
|
|
117
|
+
outputTokens: sql `COALESCE(SUM(${sessions.outputTokens}), 0)`,
|
|
118
|
+
costUsd: sql `COALESCE(SUM(${sessions.costUsd}), 0)`,
|
|
119
|
+
sessionCount: sql `COUNT(*)`,
|
|
120
|
+
}).from(sessions).where(where).get();
|
|
121
|
+
return result ?? { inputTokens: 0, outputTokens: 0, costUsd: 0, sessionCount: 0 };
|
|
122
|
+
}
|
|
123
|
+
/** Delete all sessions belonging to a specific environment. */
|
|
124
|
+
export function deleteByEnvironment(environmentId) {
|
|
125
|
+
db.delete(sessions).where(eq(sessions.environmentId, environmentId)).run();
|
|
126
|
+
}
|
|
127
|
+
/** Update the taskId for an existing session (late-bind). */
|
|
128
|
+
export function setSessionTask(id, taskId) {
|
|
129
|
+
db.update(sessions)
|
|
130
|
+
.set({ taskId })
|
|
131
|
+
.where(eq(sessions.id, id))
|
|
132
|
+
.run();
|
|
133
|
+
}
|
|
134
|
+
/** Persist the runtime-native session ID returned by the PowerLine. */
|
|
135
|
+
export function updateRuntimeSessionId(id, runtimeSessionId) {
|
|
136
|
+
db.update(sessions)
|
|
137
|
+
.set({ runtimeSessionId })
|
|
138
|
+
.where(eq(sessions.id, id))
|
|
139
|
+
.run();
|
|
140
|
+
}
|
|
141
|
+
/** Transition a session to SUSPENDED — transport lost, pending auto-recovery on reconnect. */
|
|
142
|
+
export function suspendSession(id) {
|
|
143
|
+
db.update(sessions)
|
|
144
|
+
.set({
|
|
145
|
+
status: SESSION_STATUS.SUSPENDED,
|
|
146
|
+
suspendedAt: new Date().toISOString(),
|
|
147
|
+
error: null,
|
|
148
|
+
})
|
|
149
|
+
.where(eq(sessions.id, id))
|
|
150
|
+
.run();
|
|
151
|
+
}
|
|
152
|
+
/** Get all SUSPENDED sessions for an environment, ordered by startedAt (oldest first). */
|
|
153
|
+
export function getSuspendedForEnv(environmentId) {
|
|
154
|
+
return db.select().from(sessions)
|
|
155
|
+
.where(and(eq(sessions.environmentId, environmentId), eq(sessions.status, SESSION_STATUS.SUSPENDED)))
|
|
156
|
+
.orderBy(asc(sessions.startedAt))
|
|
157
|
+
.all();
|
|
158
|
+
}
|
|
159
|
+
/** Clear terminal state for reanimate — reset status to running, clear endedAt/endReason/error/suspendedAt. */
|
|
160
|
+
export function reanimateSession(id) {
|
|
161
|
+
db.update(sessions)
|
|
162
|
+
.set({ status: SESSION_STATUS.RUNNING, endedAt: null, endReason: null, error: null, suspendedAt: null })
|
|
163
|
+
.where(eq(sessions.id, id))
|
|
164
|
+
.run();
|
|
165
|
+
}
|
|
166
|
+
/** List all sessions for a specific task, ordered chronologically (oldest first). */
|
|
167
|
+
export function listSessionsForTask(taskId) {
|
|
168
|
+
return db.select().from(sessions)
|
|
169
|
+
.where(eq(sessions.taskId, taskId))
|
|
170
|
+
.orderBy(asc(sessions.startedAt), asc(sessions.id))
|
|
171
|
+
.all();
|
|
172
|
+
}
|
|
173
|
+
/** Get the most recent session for a task (by startedAt DESC, id DESC). */
|
|
174
|
+
export function getLatestSessionForTask(taskId) {
|
|
175
|
+
return db.select().from(sessions)
|
|
176
|
+
.where(eq(sessions.taskId, taskId))
|
|
177
|
+
.orderBy(desc(sessions.startedAt), desc(sessions.id))
|
|
178
|
+
.limit(1)
|
|
179
|
+
.get();
|
|
180
|
+
}
|
|
181
|
+
/** Get all active (non-terminal) sessions for a task. */
|
|
182
|
+
export function getActiveSessionsForTask(taskId) {
|
|
183
|
+
return db.select().from(sessions)
|
|
184
|
+
.where(and(eq(sessions.taskId, taskId), inArray(sessions.status, [SESSION_STATUS.PENDING, SESSION_STATUS.RUNNING, SESSION_STATUS.IDLE])))
|
|
185
|
+
.all();
|
|
186
|
+
}
|
|
187
|
+
/** Batch-fetch all sessions for a set of task IDs. Avoids N+1 queries for listTasks. */
|
|
188
|
+
export function listSessionsByTaskIds(taskIds) {
|
|
189
|
+
if (taskIds.length === 0) {
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
return db.select().from(sessions)
|
|
193
|
+
.where(inArray(sessions.taskId, taskIds))
|
|
194
|
+
.orderBy(asc(sessions.startedAt), asc(sessions.id))
|
|
195
|
+
.all();
|
|
196
|
+
}
|
|
197
|
+
/** List all child sessions spawned by a parent session. */
|
|
198
|
+
export function getChildSessions(parentSessionId) {
|
|
199
|
+
return db.select().from(sessions)
|
|
200
|
+
.where(eq(sessions.parentSessionId, parentSessionId))
|
|
201
|
+
.orderBy(asc(sessions.startedAt), asc(sessions.id))
|
|
202
|
+
.all();
|
|
203
|
+
}
|
|
204
|
+
//# 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
|
+
/**
|
|
2
|
+
* Setting keys that clients are allowed to read and write via the public API.
|
|
3
|
+
*
|
|
4
|
+
* Keys outside this set (e.g. credential provider config) are internal and
|
|
5
|
+
* must not be exposed to WebSocket or gRPC callers.
|
|
6
|
+
*/
|
|
7
|
+
export declare const WRITABLE_SETTING_KEYS: ReadonlySet<string>;
|
|
8
|
+
/** Check whether a setting key is allowed for public read/write access. */
|
|
9
|
+
export declare function isAllowedSettingKey(key: string): boolean;
|
|
10
|
+
/** Retrieve a setting value by key. Returns undefined if the key does not exist. */
|
|
11
|
+
export declare function getSetting(key: string): string | undefined;
|
|
12
|
+
/** Set a setting value by key. Creates or overwrites the value. */
|
|
13
|
+
export declare function setSetting(key: string, value: string): void;
|
|
14
|
+
//# sourceMappingURL=settings-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../src/settings-store.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAGpD,CAAC;AAEH,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1D;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAK3D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import db from "./db.js";
|
|
2
|
+
import { settings } from "./schema.js";
|
|
3
|
+
import { eq } from "drizzle-orm";
|
|
4
|
+
/**
|
|
5
|
+
* Setting keys that clients are allowed to read and write via the public API.
|
|
6
|
+
*
|
|
7
|
+
* Keys outside this set (e.g. credential provider config) are internal and
|
|
8
|
+
* must not be exposed to WebSocket or gRPC callers.
|
|
9
|
+
*/
|
|
10
|
+
export const WRITABLE_SETTING_KEYS = new Set([
|
|
11
|
+
"default_persona_id",
|
|
12
|
+
"onboarding_completed",
|
|
13
|
+
]);
|
|
14
|
+
/** Check whether a setting key is allowed for public read/write access. */
|
|
15
|
+
export function isAllowedSettingKey(key) {
|
|
16
|
+
return WRITABLE_SETTING_KEYS.has(key);
|
|
17
|
+
}
|
|
18
|
+
/** Retrieve a setting value by key. Returns undefined if the key does not exist. */
|
|
19
|
+
export function getSetting(key) {
|
|
20
|
+
const row = db.select().from(settings).where(eq(settings.key, key)).get();
|
|
21
|
+
return row?.value;
|
|
22
|
+
}
|
|
23
|
+
/** Set a setting value by key. Creates or overwrites the value. */
|
|
24
|
+
export function setSetting(key, value) {
|
|
25
|
+
db.insert(settings)
|
|
26
|
+
.values({ key, value })
|
|
27
|
+
.onConflictDoUpdate({ target: settings.key, set: { value } })
|
|
28
|
+
.run();
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=settings-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store.js","sourceRoot":"","sources":["../src/settings-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC;IAChE,oBAAoB;IACpB,sBAAsB;CACvB,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1E,OAAO,GAAG,EAAE,KAAK,CAAC;AACpB,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,KAAa;IACnD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;SACtB,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;SAC5D,GAAG,EAAE,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { type TaskRow } from "./schema.js";
|
|
2
|
+
import type { TaskStatus } from "@grackle-ai/common";
|
|
3
|
+
export type { TaskRow };
|
|
4
|
+
/** Fields required to insert a task row directly (no business logic). */
|
|
5
|
+
export interface InsertTaskFields {
|
|
6
|
+
id: string;
|
|
7
|
+
workspaceId?: string;
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
branch: string;
|
|
11
|
+
dependsOn: string[];
|
|
12
|
+
parentTaskId: string;
|
|
13
|
+
depth: number;
|
|
14
|
+
canDecompose: boolean;
|
|
15
|
+
defaultPersonaId: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Low-level insert — writes a task row with all fields pre-computed.
|
|
19
|
+
* Auto-assigns `sortOrder` based on the workspace's current max.
|
|
20
|
+
* No business logic (parent validation, branch generation, depth limits).
|
|
21
|
+
*/
|
|
22
|
+
export declare function insertTask(fields: InsertTaskFields): void;
|
|
23
|
+
/**
|
|
24
|
+
* Create a task with business logic: validates parent, enforces depth limits,
|
|
25
|
+
* auto-generates branch name, and derives canDecompose.
|
|
26
|
+
* Delegates the actual insert to {@link insertTask}.
|
|
27
|
+
*/
|
|
28
|
+
export declare function createTask(id: string, workspaceId: string | undefined, title: string, description: string, dependsOn: string[], workspaceSlug: string, parentTaskId?: string, canDecompose?: boolean, defaultPersonaId?: string): void;
|
|
29
|
+
/** Retrieve a single task by ID. */
|
|
30
|
+
export declare function getTask(id: string): TaskRow | undefined;
|
|
31
|
+
/** Options for filtering the task list. */
|
|
32
|
+
export interface ListTasksOptions {
|
|
33
|
+
/** Case-insensitive substring filter on title or description. Case folding is ASCII-only (SQLite LIKE default). */
|
|
34
|
+
search?: string;
|
|
35
|
+
/** Exact match filter on task status (e.g. "not_started", "in_progress"). */
|
|
36
|
+
status?: string;
|
|
37
|
+
}
|
|
38
|
+
/** Return tasks for a workspace (or all tasks when workspaceId is omitted), with optional search/status filters, ordered by sort_order then created_at. */
|
|
39
|
+
export declare function listTasks(workspaceId?: string, options?: ListTasksOptions): TaskRow[];
|
|
40
|
+
/** Update multiple task fields at once. */
|
|
41
|
+
export declare function updateTask(id: string, title: string, description: string, status: string, dependsOn: string[], defaultPersonaId?: string): void;
|
|
42
|
+
/** Assign a workspace to a task. */
|
|
43
|
+
export declare function setTaskWorkspace(id: string, workspaceId: string): void;
|
|
44
|
+
/** Update only the dependsOn array of a task. */
|
|
45
|
+
export declare function setTaskDependsOn(id: string, dependsOn: string[]): void;
|
|
46
|
+
/** Update only the task status. */
|
|
47
|
+
export declare function updateTaskStatus(id: string, status: TaskStatus): void;
|
|
48
|
+
/**
|
|
49
|
+
* Mark a task as complete with a completed_at timestamp.
|
|
50
|
+
* Used only for human-authoritative status transitions (complete).
|
|
51
|
+
*/
|
|
52
|
+
export declare function markTaskComplete(id: string, status?: "complete" | "failed"): void;
|
|
53
|
+
/** Delete a task by ID. Returns the number of rows affected. */
|
|
54
|
+
export declare function deleteTask(id: string): number;
|
|
55
|
+
/** Return all not_started tasks whose dependencies are fully met. */
|
|
56
|
+
export declare function getUnblockedTasks(workspaceId?: string): TaskRow[];
|
|
57
|
+
/** Alias for getUnblockedTasks — check which pending tasks are now unblocked. */
|
|
58
|
+
export declare function checkAndUnblock(workspaceId?: string): TaskRow[];
|
|
59
|
+
/** Check whether all dependencies of a task are in "complete" status. */
|
|
60
|
+
export declare function areDependenciesMet(taskId: string): boolean;
|
|
61
|
+
/** Build a map from parentTaskId to child IDs from a pre-fetched list of rows. Avoids N+1 queries. */
|
|
62
|
+
export declare function buildChildIdsMap(rows: TaskRow[]): Map<string, string[]>;
|
|
63
|
+
/** Get direct children of a task, ordered by sort_order. */
|
|
64
|
+
export declare function getChildren(taskId: string): TaskRow[];
|
|
65
|
+
/** Get all descendants of a task (full subtree) via in-memory BFS. Fetches all workspace tasks once to avoid N+1 queries. */
|
|
66
|
+
export declare function getDescendants(taskId: string): TaskRow[];
|
|
67
|
+
/** Get ancestor chain from task up to root, ordered root-first. */
|
|
68
|
+
export declare function getAncestors(taskId: string): TaskRow[];
|
|
69
|
+
/** Count children by status for a parent task. */
|
|
70
|
+
export declare function getChildStatusCounts(taskId: string): Record<string, number>;
|
|
71
|
+
//# 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":"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"}
|