@adhd/agent-store-runtime 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +49 -0
- package/src/db/schema.d.ts +1329 -0
- package/src/db/schema.d.ts.map +1 -0
- package/src/db/schema.js +146 -0
- package/src/db/schema.js.map +1 -0
- package/src/index.d.ts +13 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +11 -0
- package/src/index.js.map +1 -0
- package/src/logger.d.ts +10 -0
- package/src/logger.d.ts.map +1 -0
- package/src/logger.js +19 -0
- package/src/logger.js.map +1 -0
- package/src/runtime/usage-client.d.ts +25 -0
- package/src/runtime/usage-client.d.ts.map +1 -0
- package/src/runtime/usage-client.js +156 -0
- package/src/runtime/usage-client.js.map +1 -0
- package/src/store/session-store.d.ts +24 -0
- package/src/store/session-store.d.ts.map +1 -0
- package/src/store/session-store.js +183 -0
- package/src/store/session-store.js.map +1 -0
- package/src/store/task-store.d.ts +36 -0
- package/src/store/task-store.d.ts.map +1 -0
- package/src/store/task-store.js +160 -0
- package/src/store/task-store.js.map +1 -0
- package/src/utils/ids.d.ts +2 -0
- package/src/utils/ids.d.ts.map +1 -0
- package/src/utils/ids.js +5 -0
- package/src/utils/ids.js.map +1 -0
- package/src/utils/timestamps.d.ts +2 -0
- package/src/utils/timestamps.d.ts.map +1 -0
- package/src/utils/timestamps.js +4 -0
- package/src/utils/timestamps.js.map +1 -0
- package/src/validation/errors.d.ts +8 -0
- package/src/validation/errors.d.ts.map +1 -0
- package/src/validation/errors.js +11 -0
- package/src/validation/errors.js.map +1 -0
- package/src/validation/schemas.d.ts +88 -0
- package/src/validation/schemas.d.ts.map +1 -0
- package/src/validation/schemas.js +67 -0
- package/src/validation/schemas.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-store-runtime/src/db/schema.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaxB,CAAC;AAKH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcxB,CAAC;AAKH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBrB,CAAC;AAKH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoB1B,CAAC;AAKH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBhC,CAAC;AAKF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQrC,CAAC;AAKH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoC1B,CAAC"}
|
package/src/db/schema.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { index, integer, sqliteTable, text, uniqueIndex } from "drizzle-orm/sqlite-core";
|
|
2
|
+
// ──────────────────────────────────────────────
|
|
3
|
+
// sessions
|
|
4
|
+
// ──────────────────────────────────────────────
|
|
5
|
+
export const sessionsTable = sqliteTable("sessions", {
|
|
6
|
+
id: text("id").primaryKey(),
|
|
7
|
+
agentName: text("agent_name")
|
|
8
|
+
.notNull(),
|
|
9
|
+
agentVersion: integer("agent_version").notNull(),
|
|
10
|
+
agentData: text("agent_data").notNull(),
|
|
11
|
+
status: text("status", {
|
|
12
|
+
enum: ["active", "closed"]
|
|
13
|
+
}).notNull().default("active"),
|
|
14
|
+
createdAt: text("created_at").notNull(),
|
|
15
|
+
updatedAt: text("updated_at").notNull(),
|
|
16
|
+
closedAt: text("closed_at"),
|
|
17
|
+
composedPromptId: text("composed_prompt_id"),
|
|
18
|
+
});
|
|
19
|
+
// ──────────────────────────────────────────────
|
|
20
|
+
// messages
|
|
21
|
+
// ──────────────────────────────────────────────
|
|
22
|
+
export const messagesTable = sqliteTable("messages", {
|
|
23
|
+
id: text("id").primaryKey(),
|
|
24
|
+
sessionId: text("session_id")
|
|
25
|
+
.notNull()
|
|
26
|
+
.references(() => sessionsTable.id, {
|
|
27
|
+
onDelete: "cascade"
|
|
28
|
+
}),
|
|
29
|
+
role: text("role", {
|
|
30
|
+
enum: ["system", "user", "assistant", "tool"]
|
|
31
|
+
}).notNull(),
|
|
32
|
+
content: text("content"),
|
|
33
|
+
toolCalls: text("tool_calls"),
|
|
34
|
+
toolResults: text("tool_results"),
|
|
35
|
+
createdAt: text("created_at").notNull(),
|
|
36
|
+
});
|
|
37
|
+
// ──────────────────────────────────────────────
|
|
38
|
+
// tasks
|
|
39
|
+
// ──────────────────────────────────────────────
|
|
40
|
+
export const tasksTable = sqliteTable("tasks", {
|
|
41
|
+
id: text("id").primaryKey(),
|
|
42
|
+
sessionId: text("session_id"),
|
|
43
|
+
parentTaskId: text("parent_task_id"),
|
|
44
|
+
isEphemeral: integer("is_ephemeral").notNull().default(0),
|
|
45
|
+
recursionDepth: integer("recursion_depth").notNull().default(0),
|
|
46
|
+
status: text("status", {
|
|
47
|
+
enum: ["pending", "running", "completed", "failed", "cancelled", "waiting", "awaiting_input"]
|
|
48
|
+
}).notNull().default("pending"),
|
|
49
|
+
prompt: text("prompt").notNull(),
|
|
50
|
+
result: text("result"),
|
|
51
|
+
error: text("error"),
|
|
52
|
+
createdAt: text("created_at").notNull(),
|
|
53
|
+
updatedAt: text("updated_at").notNull(),
|
|
54
|
+
completedAt: text("completed_at"),
|
|
55
|
+
cancelledAt: text("cancelled_at"),
|
|
56
|
+
depends_on: text("depends_on"),
|
|
57
|
+
on_upstream_failure: text("on_upstream_failure"),
|
|
58
|
+
inputs: text("inputs"),
|
|
59
|
+
resume_token: text("resume_token"),
|
|
60
|
+
});
|
|
61
|
+
// ──────────────────────────────────────────────
|
|
62
|
+
// task_events
|
|
63
|
+
// ──────────────────────────────────────────────
|
|
64
|
+
export const taskEventsTable = sqliteTable("task_events", {
|
|
65
|
+
id: text("id").primaryKey(),
|
|
66
|
+
taskId: text("task_id")
|
|
67
|
+
.notNull()
|
|
68
|
+
.references(() => tasksTable.id, {
|
|
69
|
+
onDelete: "cascade"
|
|
70
|
+
}),
|
|
71
|
+
type: text("type", {
|
|
72
|
+
enum: [
|
|
73
|
+
"MODEL_REQUEST",
|
|
74
|
+
"MODEL_RESPONSE",
|
|
75
|
+
"TOOL_CALL",
|
|
76
|
+
"TOOL_RESULT",
|
|
77
|
+
"TASK_COMPLETED",
|
|
78
|
+
"TASK_FAILED",
|
|
79
|
+
"TASK_CANCELLED"
|
|
80
|
+
]
|
|
81
|
+
}).notNull(),
|
|
82
|
+
payload: text("payload"),
|
|
83
|
+
createdAt: text("created_at").notNull(),
|
|
84
|
+
});
|
|
85
|
+
// ──────────────────────────────────────────────
|
|
86
|
+
// composed_prompts
|
|
87
|
+
// ──────────────────────────────────────────────
|
|
88
|
+
export const composedPromptsTable = sqliteTable("composed_prompts", {
|
|
89
|
+
id: text("id").primaryKey(),
|
|
90
|
+
agentSlug: text("agent_slug").notNull(),
|
|
91
|
+
contextHash: text("context_hash").notNull(),
|
|
92
|
+
content: text("content").notNull(),
|
|
93
|
+
componentVersions: text("component_versions").notNull(),
|
|
94
|
+
createdAt: text("created_at").notNull(),
|
|
95
|
+
}, (table) => [
|
|
96
|
+
uniqueIndex("idx_composed_prompts_agent_ctx").on(table.agentSlug, table.contextHash),
|
|
97
|
+
]);
|
|
98
|
+
// ──────────────────────────────────────────────
|
|
99
|
+
// experiment_assignments
|
|
100
|
+
// ──────────────────────────────────────────────
|
|
101
|
+
export const experimentAssignmentsTable = sqliteTable("experiment_assignments", {
|
|
102
|
+
id: text("id").primaryKey(),
|
|
103
|
+
sessionId: text("session_id")
|
|
104
|
+
.notNull()
|
|
105
|
+
.references(() => sessionsTable.id, { onDelete: "cascade" }),
|
|
106
|
+
experimentSlug: text("experiment_slug").notNull(),
|
|
107
|
+
variant: text("variant").notNull(),
|
|
108
|
+
createdAt: text("created_at").notNull(),
|
|
109
|
+
});
|
|
110
|
+
// ──────────────────────────────────────────────
|
|
111
|
+
// task_usage
|
|
112
|
+
// ──────────────────────────────────────────────
|
|
113
|
+
export const taskUsageTable = sqliteTable("task_usage", {
|
|
114
|
+
taskId: text("task_id").primaryKey(),
|
|
115
|
+
rootTaskId: text("root_task_id"),
|
|
116
|
+
agentName: text("agent_name").notNull(),
|
|
117
|
+
providerType: text("provider_type").notNull(),
|
|
118
|
+
model: text("model").notNull(),
|
|
119
|
+
// CUMULATIVE across the task's model calls (SUM). Because chat APIs are stateless,
|
|
120
|
+
// the whole history is re-sent every call, so this is billed spend — NOT a context
|
|
121
|
+
// size. Do not read it as one. See peakContextTokens. (FINDING-ORCH-007)
|
|
122
|
+
inputTokens: integer("input_tokens").notNull().default(0),
|
|
123
|
+
outputTokens: integer("output_tokens").notNull().default(0),
|
|
124
|
+
toolCallCount: integer("tool_call_count").notNull().default(0),
|
|
125
|
+
modelCalls: integer("model_calls").notNull().default(0),
|
|
126
|
+
latencyMs: integer("latency_ms").notNull().default(0),
|
|
127
|
+
isComplete: integer("is_complete").notNull().default(0),
|
|
128
|
+
stopReason: text("stop_reason"),
|
|
129
|
+
maxTokens: integer("max_tokens"),
|
|
130
|
+
cacheReadTokens: integer("cache_read_input_tokens"),
|
|
131
|
+
cacheCreationTokens: integer("cache_creation_input_tokens"),
|
|
132
|
+
// Full-price (cache-miss) input. Cache-hit vs cache-miss is a 50x price difference
|
|
133
|
+
// on deepseek-v4-flash, so this — not inputTokens — is what actually drives cost.
|
|
134
|
+
uncachedInputTokens: integer("uncached_input_tokens"),
|
|
135
|
+
// Reasoning tokens (reasoning models); billed as output.
|
|
136
|
+
reasoningTokens: integer("reasoning_tokens"),
|
|
137
|
+
// PEAK single-call input (MAX, not SUM) — the real context high-water mark, and the
|
|
138
|
+
// only number that may be compared against a model's context window.
|
|
139
|
+
peakContextTokens: integer("peak_context_tokens"),
|
|
140
|
+
// Which model call (1-based) hit that peak.
|
|
141
|
+
peakContextAt: integer("peak_context_at"),
|
|
142
|
+
createdAt: text("created_at").notNull(),
|
|
143
|
+
}, (table) => [
|
|
144
|
+
index("idx_task_usage_root_task_id").on(table.rootTaskId),
|
|
145
|
+
]);
|
|
146
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-store-runtime/src/db/schema.ts"],"names":[],"mappings":"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"}
|
package/src/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { SessionStore, estimateTokens, windowMessages } from './store/session-store.js';
|
|
2
|
+
export { TaskStore } from './store/task-store.js';
|
|
3
|
+
export { UsageClient } from './runtime/usage-client.js';
|
|
4
|
+
export type { Scope, UsageTotals } from './runtime/usage-client.js';
|
|
5
|
+
export * from './db/schema.js';
|
|
6
|
+
export { generateId } from './utils/ids.js';
|
|
7
|
+
export { nowIso } from './utils/timestamps.js';
|
|
8
|
+
export { ToolError } from './validation/errors.js';
|
|
9
|
+
export type { ErrorCode } from './validation/errors.js';
|
|
10
|
+
export { sessionSchema, agentDefinitionStoredSchema, taskSchema, } from './validation/schemas.js';
|
|
11
|
+
export type { SessionListInput, TaskListInput, } from './validation/schemas.js';
|
|
12
|
+
export { logger } from './logger.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/agent/agent-store-runtime/src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAEpE,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,UAAU,GACX,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,gBAAgB,EAChB,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @adhd/agent-store-runtime — public barrel
|
|
2
|
+
export { SessionStore, estimateTokens, windowMessages } from './store/session-store.js';
|
|
3
|
+
export { TaskStore } from './store/task-store.js';
|
|
4
|
+
export { UsageClient } from './runtime/usage-client.js';
|
|
5
|
+
export * from './db/schema.js';
|
|
6
|
+
export { generateId } from './utils/ids.js';
|
|
7
|
+
export { nowIso } from './utils/timestamps.js';
|
|
8
|
+
export { ToolError } from './validation/errors.js';
|
|
9
|
+
export { sessionSchema, agentDefinitionStoredSchema, taskSchema, } from './validation/schemas.js';
|
|
10
|
+
export { logger } from './logger.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/agent/agent-store-runtime/src/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAE5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,cAAc,gBAAgB,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,UAAU,GACX,MAAM,yBAAyB,CAAC;AAMjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
|
package/src/logger.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal structured logger written to stderr.
|
|
3
|
+
* Uses console.error so MCP stdio (stdout) is never corrupted.
|
|
4
|
+
*/
|
|
5
|
+
export declare const logger: {
|
|
6
|
+
info(obj: Record<string, unknown>, msg?: string): void;
|
|
7
|
+
warn(obj: Record<string, unknown>, msg?: string): void;
|
|
8
|
+
error(obj: Record<string, unknown>, msg?: string): void;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../packages/agent/agent-store-runtime/src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,MAAM;cACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,GAAG,IAAI;cAM5C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,GAAG,IAAI;eAM3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,MAAM,GAAG,IAAI;CAMxD,CAAC"}
|
package/src/logger.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal structured logger written to stderr.
|
|
3
|
+
* Uses console.error so MCP stdio (stdout) is never corrupted.
|
|
4
|
+
*/
|
|
5
|
+
export const logger = {
|
|
6
|
+
info(obj, msg) {
|
|
7
|
+
const ts = new Date().toISOString();
|
|
8
|
+
console.error(JSON.stringify({ level: 'info', time: ts, ...obj, ...(msg ? { msg } : {}) }));
|
|
9
|
+
},
|
|
10
|
+
warn(obj, msg) {
|
|
11
|
+
const ts = new Date().toISOString();
|
|
12
|
+
console.error(JSON.stringify({ level: 'warn', time: ts, ...obj, ...(msg ? { msg } : {}) }));
|
|
13
|
+
},
|
|
14
|
+
error(obj, msg) {
|
|
15
|
+
const ts = new Date().toISOString();
|
|
16
|
+
console.error(JSON.stringify({ level: 'error', time: ts, ...obj, ...(msg ? { msg } : {}) }));
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../../packages/agent/agent-store-runtime/src/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,CAAC,GAA4B,EAAE,GAAY;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAA4B,EAAE,GAAY;QAC7C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC7E,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,GAA4B,EAAE,GAAY;QAC9C,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC9E,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ExecutionContext, TokenUsage } from '@adhd/agent-base-types';
|
|
2
|
+
export type Scope = 'task' | 'session' | 'agent';
|
|
3
|
+
export interface UsageTotals {
|
|
4
|
+
inputTokens: number;
|
|
5
|
+
outputTokens: number;
|
|
6
|
+
cacheTokens: number;
|
|
7
|
+
modelCalls: number;
|
|
8
|
+
}
|
|
9
|
+
export declare class UsageClient {
|
|
10
|
+
private readonly db;
|
|
11
|
+
private readonly accumulators;
|
|
12
|
+
constructor(db: unknown);
|
|
13
|
+
create(taskId: string, _ctx: ExecutionContext): void;
|
|
14
|
+
remove(taskId: string): void;
|
|
15
|
+
recordModelCall(taskId: string, usage: TokenUsage | undefined): void;
|
|
16
|
+
markModelCallStart(taskId: string): void;
|
|
17
|
+
markModelCallEnd(taskId: string): void;
|
|
18
|
+
recordToolCall(taskId: string, toolName: string): void;
|
|
19
|
+
getToolCallCount(taskId: string, toolName: string): number;
|
|
20
|
+
getWallClockMs(taskId: string): number;
|
|
21
|
+
getModelMs(taskId: string): number;
|
|
22
|
+
getTotals(taskId: string, scope: Scope, sessionId?: string, agentName?: string): UsageTotals;
|
|
23
|
+
getUsageInWindow(scope: Scope, id: string, windowMs?: number, excludeTaskId?: string): number;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=usage-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-client.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-store-runtime/src/runtime/usage-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAcD,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;gBAElC,EAAE,EAAE,OAAO;IAIxC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAapD,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM5B,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAapE,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAOtC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOtD,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI1D,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKtC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAMlC,SAAS,CACP,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW;IAwEd,gBAAgB,CACd,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,GAAE,MAA4B,EACtC,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM;CA0CV"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
export class UsageClient {
|
|
2
|
+
db;
|
|
3
|
+
accumulators = new Map();
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
// ── Accumulator lifecycle ───────────────────────────────────────────
|
|
8
|
+
create(taskId, _ctx) {
|
|
9
|
+
this.accumulators.set(taskId, {
|
|
10
|
+
taskId,
|
|
11
|
+
startedAtMs: Date.now(),
|
|
12
|
+
inputTokens: 0,
|
|
13
|
+
outputTokens: 0,
|
|
14
|
+
cacheTokens: 0,
|
|
15
|
+
modelCalls: 0,
|
|
16
|
+
totalModelMs: 0,
|
|
17
|
+
toolCalls: new Map(),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
remove(taskId) {
|
|
21
|
+
this.accumulators.delete(taskId);
|
|
22
|
+
}
|
|
23
|
+
// ── Recording ───────────────────────────────────────────────────────
|
|
24
|
+
recordModelCall(taskId, usage) {
|
|
25
|
+
const acc = this.accumulators.get(taskId);
|
|
26
|
+
if (!acc)
|
|
27
|
+
return;
|
|
28
|
+
if (usage) {
|
|
29
|
+
acc.inputTokens += usage.inputTokens ?? 0;
|
|
30
|
+
acc.outputTokens += usage.outputTokens ?? 0;
|
|
31
|
+
acc.cacheTokens +=
|
|
32
|
+
(usage.cacheReadTokens ?? 0) + (usage.cacheCreationTokens ?? 0);
|
|
33
|
+
}
|
|
34
|
+
acc.modelCalls += 1;
|
|
35
|
+
}
|
|
36
|
+
markModelCallStart(taskId) {
|
|
37
|
+
const acc = this.accumulators.get(taskId);
|
|
38
|
+
if (acc)
|
|
39
|
+
acc.modelCallStartMs = Date.now();
|
|
40
|
+
}
|
|
41
|
+
markModelCallEnd(taskId) {
|
|
42
|
+
const acc = this.accumulators.get(taskId);
|
|
43
|
+
if (!acc || acc.modelCallStartMs === undefined)
|
|
44
|
+
return;
|
|
45
|
+
acc.totalModelMs += Date.now() - acc.modelCallStartMs;
|
|
46
|
+
acc.modelCallStartMs = undefined;
|
|
47
|
+
}
|
|
48
|
+
recordToolCall(taskId, toolName) {
|
|
49
|
+
const acc = this.accumulators.get(taskId);
|
|
50
|
+
if (!acc)
|
|
51
|
+
return;
|
|
52
|
+
const count = acc.toolCalls.get(toolName) ?? 0;
|
|
53
|
+
acc.toolCalls.set(toolName, count + 1);
|
|
54
|
+
}
|
|
55
|
+
getToolCallCount(taskId, toolName) {
|
|
56
|
+
return this.accumulators.get(taskId)?.toolCalls.get(toolName) ?? 0;
|
|
57
|
+
}
|
|
58
|
+
getWallClockMs(taskId) {
|
|
59
|
+
const acc = this.accumulators.get(taskId);
|
|
60
|
+
return acc ? Date.now() - acc.startedAtMs : 0;
|
|
61
|
+
}
|
|
62
|
+
getModelMs(taskId) {
|
|
63
|
+
return this.accumulators.get(taskId)?.totalModelMs ?? 0;
|
|
64
|
+
}
|
|
65
|
+
// ── Scope-aware totals ──────────────────────────────────────────────
|
|
66
|
+
getTotals(taskId, scope, sessionId, agentName) {
|
|
67
|
+
const acc = this.accumulators.get(taskId);
|
|
68
|
+
const inMem = acc
|
|
69
|
+
? {
|
|
70
|
+
inputTokens: acc.inputTokens,
|
|
71
|
+
outputTokens: acc.outputTokens,
|
|
72
|
+
cacheTokens: acc.cacheTokens,
|
|
73
|
+
modelCalls: acc.modelCalls,
|
|
74
|
+
}
|
|
75
|
+
: { inputTokens: 0, outputTokens: 0, cacheTokens: 0, modelCalls: 0 };
|
|
76
|
+
if (scope === 'task' || !this.db)
|
|
77
|
+
return inMem;
|
|
78
|
+
try {
|
|
79
|
+
const db = this.db;
|
|
80
|
+
let row;
|
|
81
|
+
if (scope === 'session' && sessionId) {
|
|
82
|
+
row = db
|
|
83
|
+
.prepare(`SELECT
|
|
84
|
+
COALESCE(SUM(tu.input_tokens), 0) AS input,
|
|
85
|
+
COALESCE(SUM(tu.output_tokens), 0) AS output,
|
|
86
|
+
COALESCE(SUM(COALESCE(tu.cache_read_input_tokens,0) + COALESCE(tu.cache_creation_input_tokens,0)), 0) AS cache,
|
|
87
|
+
COALESCE(SUM(tu.model_calls), 0) AS calls
|
|
88
|
+
FROM task_usage tu
|
|
89
|
+
JOIN tasks t ON tu.task_id = t.id
|
|
90
|
+
WHERE t.session_id = ? AND tu.task_id != ?`)
|
|
91
|
+
.get(sessionId, taskId);
|
|
92
|
+
}
|
|
93
|
+
else if (scope === 'agent') {
|
|
94
|
+
row = db
|
|
95
|
+
.prepare(`SELECT
|
|
96
|
+
COALESCE(SUM(input_tokens), 0) AS input,
|
|
97
|
+
COALESCE(SUM(output_tokens), 0) AS output,
|
|
98
|
+
COALESCE(SUM(COALESCE(cache_read_input_tokens,0) + COALESCE(cache_creation_input_tokens,0)), 0) AS cache,
|
|
99
|
+
COALESCE(SUM(model_calls), 0) AS calls
|
|
100
|
+
FROM task_usage
|
|
101
|
+
WHERE agent_name = ? AND task_id != ?`)
|
|
102
|
+
.get(agentName, taskId);
|
|
103
|
+
}
|
|
104
|
+
if (row) {
|
|
105
|
+
return {
|
|
106
|
+
inputTokens: (row.input ?? 0) + inMem.inputTokens,
|
|
107
|
+
outputTokens: (row.output ?? 0) + inMem.outputTokens,
|
|
108
|
+
cacheTokens: (row.cache ?? 0) + inMem.cacheTokens,
|
|
109
|
+
modelCalls: (row.calls ?? 0) + inMem.modelCalls,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// DB query failed — fall back to in-memory
|
|
115
|
+
}
|
|
116
|
+
return inMem;
|
|
117
|
+
}
|
|
118
|
+
// ── Time-window query ──────────────────────────────────────────────
|
|
119
|
+
getUsageInWindow(scope, id, windowMs = 24 * 60 * 60 * 1000, excludeTaskId) {
|
|
120
|
+
if (!this.db)
|
|
121
|
+
return 0;
|
|
122
|
+
try {
|
|
123
|
+
const db = this.db;
|
|
124
|
+
const since = new Date(Date.now() - windowMs).toISOString();
|
|
125
|
+
let row;
|
|
126
|
+
if (scope === 'session') {
|
|
127
|
+
const excludeClause = excludeTaskId ? ' AND tu.task_id != ?' : '';
|
|
128
|
+
const params = [id, since];
|
|
129
|
+
if (excludeTaskId)
|
|
130
|
+
params.push(excludeTaskId);
|
|
131
|
+
row = db
|
|
132
|
+
.prepare(`SELECT COALESCE(SUM(tu.input_tokens + tu.output_tokens + COALESCE(tu.cache_read_input_tokens,0) + COALESCE(tu.cache_creation_input_tokens,0)), 0) AS total
|
|
133
|
+
FROM task_usage tu
|
|
134
|
+
JOIN tasks t ON tu.task_id = t.id
|
|
135
|
+
WHERE t.session_id = ? AND tu.created_at >= ?${excludeClause}`)
|
|
136
|
+
.get(...params);
|
|
137
|
+
}
|
|
138
|
+
else if (scope === 'agent') {
|
|
139
|
+
const excludeClause = excludeTaskId ? ' AND task_id != ?' : '';
|
|
140
|
+
const params = [id, since];
|
|
141
|
+
if (excludeTaskId)
|
|
142
|
+
params.push(excludeTaskId);
|
|
143
|
+
row = db
|
|
144
|
+
.prepare(`SELECT COALESCE(SUM(input_tokens + output_tokens + COALESCE(cache_read_input_tokens,0) + COALESCE(cache_creation_input_tokens,0)), 0) AS total
|
|
145
|
+
FROM task_usage
|
|
146
|
+
WHERE agent_name = ? AND created_at >= ?${excludeClause}`)
|
|
147
|
+
.get(...params);
|
|
148
|
+
}
|
|
149
|
+
return row?.total ?? 0;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=usage-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-client.js","sourceRoot":"","sources":["../../../../../../packages/agent/agent-store-runtime/src/runtime/usage-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { BetterSQLite3Database } from 'drizzle-orm/better-sqlite3';
|
|
2
|
+
import type { AgentDefinition, Message, Session } from '../validation/schemas.js';
|
|
3
|
+
import type { SessionListInput } from '../validation/schemas.js';
|
|
4
|
+
import type { IHookRegistry } from '@adhd/agent-base-types';
|
|
5
|
+
export declare class SessionStore {
|
|
6
|
+
private readonly db;
|
|
7
|
+
private readonly hooks?;
|
|
8
|
+
constructor(db: BetterSQLite3Database<Record<string, never>>, hooks?: IHookRegistry | undefined);
|
|
9
|
+
create(input: {
|
|
10
|
+
agentName: string;
|
|
11
|
+
agentDefinition: AgentDefinition;
|
|
12
|
+
composedPromptId?: string;
|
|
13
|
+
}): Session;
|
|
14
|
+
read(id: string): Session;
|
|
15
|
+
getAgentDefinition(sessionId: string): AgentDefinition;
|
|
16
|
+
list(input: SessionListInput): Session[];
|
|
17
|
+
close(id: string): Session;
|
|
18
|
+
clearMessages(sessionId: string): number;
|
|
19
|
+
appendMessage(sessionId: string, message: Message): void;
|
|
20
|
+
getMessages(sessionId: string): Message[];
|
|
21
|
+
}
|
|
22
|
+
export declare function estimateTokens(messages: Message[]): number;
|
|
23
|
+
export declare function windowMessages(messages: Message[], tokenLimit: number): Message[];
|
|
24
|
+
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../../../../../packages/agent/agent-store-runtime/src/store/session-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,OAAO,KAAK,EACV,eAAe,EACf,OAAO,EACP,OAAO,EACR,MAAM,0BAA0B,CAAC;AAKlC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAIjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBADN,EAAE,EAAE,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAChD,KAAK,CAAC,EAAE,aAAa,YAAA;IAGxC,MAAM,CAAC,KAAK,EAAE;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,eAAe,CAAC;QACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO;IA4BX,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAsBzB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAiBtD,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,EAAE;IAiCxC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAyB1B,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAsBxC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAiBxD,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;CAiB1C;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAW1D;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,EAAE,CAsBX"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { and, eq } from 'drizzle-orm';
|
|
2
|
+
import { messagesTable, sessionsTable } from '../db/schema.js';
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
import { agentDefinitionStoredSchema, sessionSchema, } from '../validation/schemas.js';
|
|
5
|
+
import { ToolError } from '../validation/errors.js';
|
|
6
|
+
import { generateId } from '../utils/ids.js';
|
|
7
|
+
import { nowIso } from '../utils/timestamps.js';
|
|
8
|
+
export class SessionStore {
|
|
9
|
+
db;
|
|
10
|
+
hooks;
|
|
11
|
+
constructor(db, hooks) {
|
|
12
|
+
this.db = db;
|
|
13
|
+
this.hooks = hooks;
|
|
14
|
+
}
|
|
15
|
+
create(input) {
|
|
16
|
+
const now = nowIso();
|
|
17
|
+
const id = generateId();
|
|
18
|
+
this.db
|
|
19
|
+
.insert(sessionsTable)
|
|
20
|
+
.values({
|
|
21
|
+
id,
|
|
22
|
+
agentName: input.agentName,
|
|
23
|
+
agentVersion: input.agentDefinition.version,
|
|
24
|
+
agentData: JSON.stringify(input.agentDefinition),
|
|
25
|
+
status: 'active',
|
|
26
|
+
createdAt: now,
|
|
27
|
+
updatedAt: now,
|
|
28
|
+
composedPromptId: input.composedPromptId ?? null,
|
|
29
|
+
})
|
|
30
|
+
.run();
|
|
31
|
+
logger.info({ sessionId: id, agentName: input.agentName }, 'Session created');
|
|
32
|
+
const session = this.read(id);
|
|
33
|
+
void this.hooks?.emit('session:created', { session });
|
|
34
|
+
return session;
|
|
35
|
+
}
|
|
36
|
+
read(id) {
|
|
37
|
+
const row = this.db
|
|
38
|
+
.select()
|
|
39
|
+
.from(sessionsTable)
|
|
40
|
+
.where(eq(sessionsTable.id, id))
|
|
41
|
+
.get();
|
|
42
|
+
if (!row) {
|
|
43
|
+
throw new ToolError('SESSION_NOT_FOUND', `Session '${id}' not found`);
|
|
44
|
+
}
|
|
45
|
+
return sessionSchema.parse({
|
|
46
|
+
id: row.id,
|
|
47
|
+
agentName: row.agentName,
|
|
48
|
+
agentVersion: row.agentVersion,
|
|
49
|
+
status: row.status,
|
|
50
|
+
createdAt: row.createdAt,
|
|
51
|
+
updatedAt: row.updatedAt,
|
|
52
|
+
closedAt: row.closedAt ?? undefined,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
getAgentDefinition(sessionId) {
|
|
56
|
+
const row = this.db
|
|
57
|
+
.select()
|
|
58
|
+
.from(sessionsTable)
|
|
59
|
+
.where(eq(sessionsTable.id, sessionId))
|
|
60
|
+
.get();
|
|
61
|
+
if (!row) {
|
|
62
|
+
throw new ToolError('SESSION_NOT_FOUND', `Session '${sessionId}' not found`);
|
|
63
|
+
}
|
|
64
|
+
return agentDefinitionStoredSchema.parse(JSON.parse(row.agentData));
|
|
65
|
+
}
|
|
66
|
+
list(input) {
|
|
67
|
+
const conditions = [];
|
|
68
|
+
if (input.agentName) {
|
|
69
|
+
conditions.push(eq(sessionsTable.agentName, input.agentName));
|
|
70
|
+
}
|
|
71
|
+
if (input.status) {
|
|
72
|
+
conditions.push(eq(sessionsTable.status, input.status));
|
|
73
|
+
}
|
|
74
|
+
const rows = conditions.length > 0
|
|
75
|
+
? this.db
|
|
76
|
+
.select()
|
|
77
|
+
.from(sessionsTable)
|
|
78
|
+
.where(and(...conditions))
|
|
79
|
+
.all()
|
|
80
|
+
: this.db.select().from(sessionsTable).all();
|
|
81
|
+
return rows.map((row) => sessionSchema.parse({
|
|
82
|
+
id: row.id,
|
|
83
|
+
agentName: row.agentName,
|
|
84
|
+
agentVersion: row.agentVersion,
|
|
85
|
+
status: row.status,
|
|
86
|
+
createdAt: row.createdAt,
|
|
87
|
+
updatedAt: row.updatedAt,
|
|
88
|
+
closedAt: row.closedAt ?? undefined,
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
close(id) {
|
|
92
|
+
const session = this.read(id);
|
|
93
|
+
if (session.status === 'closed') {
|
|
94
|
+
throw new ToolError('SESSION_CLOSED', `Session '${id}' is already closed`);
|
|
95
|
+
}
|
|
96
|
+
const now = nowIso();
|
|
97
|
+
this.db
|
|
98
|
+
.update(sessionsTable)
|
|
99
|
+
.set({
|
|
100
|
+
status: 'closed',
|
|
101
|
+
closedAt: now,
|
|
102
|
+
updatedAt: now,
|
|
103
|
+
})
|
|
104
|
+
.where(eq(sessionsTable.id, id))
|
|
105
|
+
.run();
|
|
106
|
+
logger.info({ sessionId: id }, 'Session closed');
|
|
107
|
+
return this.read(id);
|
|
108
|
+
}
|
|
109
|
+
clearMessages(sessionId) {
|
|
110
|
+
const session = this.read(sessionId);
|
|
111
|
+
if (session.status === 'closed') {
|
|
112
|
+
throw new ToolError('SESSION_CLOSED', `Session '${sessionId}' is closed; cannot clear context`);
|
|
113
|
+
}
|
|
114
|
+
const result = this.db
|
|
115
|
+
.delete(messagesTable)
|
|
116
|
+
.where(eq(messagesTable.sessionId, sessionId))
|
|
117
|
+
.run();
|
|
118
|
+
logger.info({ sessionId, cleared: result.changes }, 'Session context cleared');
|
|
119
|
+
return result.changes;
|
|
120
|
+
}
|
|
121
|
+
appendMessage(sessionId, message) {
|
|
122
|
+
this.db
|
|
123
|
+
.insert(messagesTable)
|
|
124
|
+
.values({
|
|
125
|
+
id: message.id,
|
|
126
|
+
sessionId,
|
|
127
|
+
role: message.role,
|
|
128
|
+
content: message.content ?? null,
|
|
129
|
+
toolCalls: message.toolCalls ? JSON.stringify(message.toolCalls) : null,
|
|
130
|
+
toolResults: message.toolResults
|
|
131
|
+
? JSON.stringify(message.toolResults)
|
|
132
|
+
: null,
|
|
133
|
+
createdAt: message.createdAt,
|
|
134
|
+
})
|
|
135
|
+
.run();
|
|
136
|
+
}
|
|
137
|
+
getMessages(sessionId) {
|
|
138
|
+
const rows = this.db
|
|
139
|
+
.select()
|
|
140
|
+
.from(messagesTable)
|
|
141
|
+
.where(eq(messagesTable.sessionId, sessionId))
|
|
142
|
+
.all();
|
|
143
|
+
return rows.map((row) => ({
|
|
144
|
+
id: row.id,
|
|
145
|
+
sessionId: row.sessionId,
|
|
146
|
+
role: row.role,
|
|
147
|
+
content: row.content ?? undefined,
|
|
148
|
+
toolCalls: row.toolCalls ? JSON.parse(row.toolCalls) : undefined,
|
|
149
|
+
toolResults: row.toolResults ? JSON.parse(row.toolResults) : undefined,
|
|
150
|
+
createdAt: row.createdAt,
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function estimateTokens(messages) {
|
|
155
|
+
return Math.ceil(messages.reduce((sum, m) => {
|
|
156
|
+
return (sum +
|
|
157
|
+
(m.content?.length ?? 0) +
|
|
158
|
+
(m.toolCalls ? JSON.stringify(m.toolCalls).length : 0) +
|
|
159
|
+
(m.toolResults ? JSON.stringify(m.toolResults).length : 0));
|
|
160
|
+
}, 0) / 4);
|
|
161
|
+
}
|
|
162
|
+
export function windowMessages(messages, tokenLimit) {
|
|
163
|
+
if (tokenLimit <= 0)
|
|
164
|
+
return messages;
|
|
165
|
+
if (estimateTokens(messages) <= tokenLimit)
|
|
166
|
+
return messages;
|
|
167
|
+
const systemMessages = messages.filter((m) => m.role === 'system');
|
|
168
|
+
const nonSystemMessages = messages.filter((m) => m.role !== 'system');
|
|
169
|
+
const systemBudget = estimateTokens(systemMessages);
|
|
170
|
+
const remaining = Math.max(0, tokenLimit - systemBudget);
|
|
171
|
+
const selected = [];
|
|
172
|
+
let used = 0;
|
|
173
|
+
for (let i = nonSystemMessages.length - 1; i >= 0; i--) {
|
|
174
|
+
const msg = nonSystemMessages[i];
|
|
175
|
+
const cost = estimateTokens([msg]);
|
|
176
|
+
if (used + cost > remaining && selected.length > 0)
|
|
177
|
+
break;
|
|
178
|
+
selected.unshift(msg);
|
|
179
|
+
used += cost;
|
|
180
|
+
}
|
|
181
|
+
return [...systemMessages, ...selected];
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=session-store.js.map
|