@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.
Files changed (41) hide show
  1. package/package.json +49 -0
  2. package/src/db/schema.d.ts +1329 -0
  3. package/src/db/schema.d.ts.map +1 -0
  4. package/src/db/schema.js +146 -0
  5. package/src/db/schema.js.map +1 -0
  6. package/src/index.d.ts +13 -0
  7. package/src/index.d.ts.map +1 -0
  8. package/src/index.js +11 -0
  9. package/src/index.js.map +1 -0
  10. package/src/logger.d.ts +10 -0
  11. package/src/logger.d.ts.map +1 -0
  12. package/src/logger.js +19 -0
  13. package/src/logger.js.map +1 -0
  14. package/src/runtime/usage-client.d.ts +25 -0
  15. package/src/runtime/usage-client.d.ts.map +1 -0
  16. package/src/runtime/usage-client.js +156 -0
  17. package/src/runtime/usage-client.js.map +1 -0
  18. package/src/store/session-store.d.ts +24 -0
  19. package/src/store/session-store.d.ts.map +1 -0
  20. package/src/store/session-store.js +183 -0
  21. package/src/store/session-store.js.map +1 -0
  22. package/src/store/task-store.d.ts +36 -0
  23. package/src/store/task-store.d.ts.map +1 -0
  24. package/src/store/task-store.js +160 -0
  25. package/src/store/task-store.js.map +1 -0
  26. package/src/utils/ids.d.ts +2 -0
  27. package/src/utils/ids.d.ts.map +1 -0
  28. package/src/utils/ids.js +5 -0
  29. package/src/utils/ids.js.map +1 -0
  30. package/src/utils/timestamps.d.ts +2 -0
  31. package/src/utils/timestamps.d.ts.map +1 -0
  32. package/src/utils/timestamps.js +4 -0
  33. package/src/utils/timestamps.js.map +1 -0
  34. package/src/validation/errors.d.ts +8 -0
  35. package/src/validation/errors.d.ts.map +1 -0
  36. package/src/validation/errors.js +11 -0
  37. package/src/validation/errors.js.map +1 -0
  38. package/src/validation/schemas.d.ts +88 -0
  39. package/src/validation/schemas.d.ts.map +1 -0
  40. package/src/validation/schemas.js +67 -0
  41. 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"}
@@ -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
@@ -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"}
@@ -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