agentenkit 0.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/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/adapters/inline.d.ts +27 -0
- package/dist/adapters/inline.d.ts.map +1 -0
- package/dist/adapters/inline.js +41 -0
- package/dist/adapters/inline.js.map +1 -0
- package/dist/adapters/memory.d.ts +74 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +194 -0
- package/dist/adapters/memory.js.map +1 -0
- package/dist/adapters/prisma.d.ts +176 -0
- package/dist/adapters/prisma.d.ts.map +1 -0
- package/dist/adapters/prisma.js +107 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/qstash.d.ts +36 -0
- package/dist/adapters/qstash.d.ts.map +1 -0
- package/dist/adapters/qstash.js +26 -0
- package/dist/adapters/qstash.js.map +1 -0
- package/dist/adapters/redis.d.ts +49 -0
- package/dist/adapters/redis.d.ts.map +1 -0
- package/dist/adapters/redis.js +60 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/adapters/sqlite.d.ts +67 -0
- package/dist/adapters/sqlite.d.ts.map +1 -0
- package/dist/adapters/sqlite.js +199 -0
- package/dist/adapters/sqlite.js.map +1 -0
- package/dist/adapters/upstash.d.ts +48 -0
- package/dist/adapters/upstash.d.ts.map +1 -0
- package/dist/adapters/upstash.js +46 -0
- package/dist/adapters/upstash.js.map +1 -0
- package/dist/admin/default.d.ts +15 -0
- package/dist/admin/default.d.ts.map +1 -0
- package/dist/admin/default.js +22 -0
- package/dist/admin/default.js.map +1 -0
- package/dist/admin/memory.d.ts +29 -0
- package/dist/admin/memory.d.ts.map +1 -0
- package/dist/admin/memory.js +83 -0
- package/dist/admin/memory.js.map +1 -0
- package/dist/admin/postgres.d.ts +43 -0
- package/dist/admin/postgres.d.ts.map +1 -0
- package/dist/admin/postgres.js +201 -0
- package/dist/admin/postgres.js.map +1 -0
- package/dist/admin/sqlite.d.ts +35 -0
- package/dist/admin/sqlite.d.ts.map +1 -0
- package/dist/admin/sqlite.js +187 -0
- package/dist/admin/sqlite.js.map +1 -0
- package/dist/core/admin.d.ts +88 -0
- package/dist/core/admin.d.ts.map +1 -0
- package/dist/core/admin.js +147 -0
- package/dist/core/admin.js.map +1 -0
- package/dist/core/agent.d.ts +29 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +41 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/cache.d.ts +37 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +68 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/context.d.ts +13 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +87 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/deleteThread.d.ts +14 -0
- package/dist/core/deleteThread.d.ts.map +1 -0
- package/dist/core/deleteThread.js +34 -0
- package/dist/core/deleteThread.js.map +1 -0
- package/dist/core/engine.d.ts +79 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +489 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/follow.d.ts +50 -0
- package/dist/core/follow.d.ts.map +1 -0
- package/dist/core/follow.js +153 -0
- package/dist/core/follow.js.map +1 -0
- package/dist/core/hitl.d.ts +98 -0
- package/dist/core/hitl.d.ts.map +1 -0
- package/dist/core/hitl.js +199 -0
- package/dist/core/hitl.js.map +1 -0
- package/dist/core/keys.d.ts +26 -0
- package/dist/core/keys.d.ts.map +1 -0
- package/dist/core/keys.js +32 -0
- package/dist/core/keys.js.map +1 -0
- package/dist/core/loop.d.ts +105 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +234 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/publish.d.ts +18 -0
- package/dist/core/publish.d.ts.map +1 -0
- package/dist/core/publish.js +34 -0
- package/dist/core/publish.js.map +1 -0
- package/dist/core/reclaim.d.ts +20 -0
- package/dist/core/reclaim.d.ts.map +1 -0
- package/dist/core/reclaim.js +56 -0
- package/dist/core/reclaim.js.map +1 -0
- package/dist/core/run.d.ts +8 -0
- package/dist/core/run.d.ts.map +1 -0
- package/dist/core/run.js +102 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/state.d.ts +50 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +39 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/stop.d.ts +7 -0
- package/dist/core/stop.d.ts.map +1 -0
- package/dist/core/stop.js +15 -0
- package/dist/core/stop.js.map +1 -0
- package/dist/core/stream.d.ts +12 -0
- package/dist/core/stream.d.ts.map +1 -0
- package/dist/core/stream.js +21 -0
- package/dist/core/stream.js.map +1 -0
- package/dist/core/subagent.d.ts +77 -0
- package/dist/core/subagent.d.ts.map +1 -0
- package/dist/core/subagent.js +261 -0
- package/dist/core/subagent.js.map +1 -0
- package/dist/core/tools.d.ts +36 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +22 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/core/types.d.ts +286 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +49 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/usage.d.ts +40 -0
- package/dist/core/usage.d.ts.map +1 -0
- package/dist/core/usage.js +43 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/ports/admin.d.ts +102 -0
- package/dist/ports/admin.d.ts.map +1 -0
- package/dist/ports/admin.js +2 -0
- package/dist/ports/admin.js.map +1 -0
- package/dist/ports/bus.d.ts +13 -0
- package/dist/ports/bus.d.ts.map +1 -0
- package/dist/ports/bus.js +2 -0
- package/dist/ports/bus.js.map +1 -0
- package/dist/ports/kv.d.ts +16 -0
- package/dist/ports/kv.d.ts.map +1 -0
- package/dist/ports/kv.js +2 -0
- package/dist/ports/kv.js.map +1 -0
- package/dist/ports/queue.d.ts +18 -0
- package/dist/ports/queue.d.ts.map +1 -0
- package/dist/ports/queue.js +2 -0
- package/dist/ports/queue.js.map +1 -0
- package/dist/ports/runtime.d.ts +260 -0
- package/dist/ports/runtime.d.ts.map +1 -0
- package/dist/ports/runtime.js +2 -0
- package/dist/ports/runtime.js.map +1 -0
- package/dist/ports/storage.d.ts +72 -0
- package/dist/ports/storage.d.ts.map +1 -0
- package/dist/ports/storage.js +2 -0
- package/dist/ports/storage.js.map +1 -0
- package/dist/runtime.d.ts +5 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +177 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
/** Open a SQLite handle with whichever driver the process has: `bun:sqlite`
|
|
3
|
+
* first, then `node:sqlite`. Preferring one and requiring it are different
|
|
4
|
+
* things — a Next.js server runs on Node even inside a Bun workspace, which
|
|
5
|
+
* is exactly where a bun-only store fails. Pass ':memory:' for a database
|
|
6
|
+
* that lives only as long as the process.
|
|
7
|
+
*
|
|
8
|
+
* Imported dynamically so neither driver enters the module graph until asked
|
|
9
|
+
* for: importing this file is safe anywhere, only calling this needs one. */
|
|
10
|
+
export async function openSqlite(filename = 'agentic-kit.sqlite') {
|
|
11
|
+
const tried = [];
|
|
12
|
+
for (const specifier of ['bun:sqlite', 'node:sqlite']) {
|
|
13
|
+
try {
|
|
14
|
+
// webpackIgnore keeps this a real runtime import. Bundlers otherwise
|
|
15
|
+
// turn a variable specifier into a context module and fail to resolve
|
|
16
|
+
// `node:sqlite` even on a Node that ships it — which is what happens
|
|
17
|
+
// inside a Next.js server build.
|
|
18
|
+
const mod = await import(/* webpackIgnore: true */ /* @vite-ignore */ specifier);
|
|
19
|
+
const Ctor = mod.Database ?? mod.DatabaseSync;
|
|
20
|
+
if (Ctor)
|
|
21
|
+
return new Ctor(filename);
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
tried.push(`${specifier}: ${err instanceof Error ? err.message : String(err)}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error('No SQLite driver available. Run under Bun, or Node 22+ for node:sqlite, ' +
|
|
28
|
+
`or construct the store with your own handle. Tried — ${tried.join('; ')}`);
|
|
29
|
+
}
|
|
30
|
+
// SQLite has no date or JSON type: times are epoch milliseconds so they sort
|
|
31
|
+
// and compare as integers, and structured columns are TEXT holding JSON.
|
|
32
|
+
const json = (v) => (v === undefined ? null : JSON.stringify(v));
|
|
33
|
+
const parse = (v) => (typeof v === 'string' ? JSON.parse(v) : v ?? null);
|
|
34
|
+
const SCHEMA = `
|
|
35
|
+
CREATE TABLE IF NOT EXISTS threads (
|
|
36
|
+
id TEXT PRIMARY KEY, title TEXT NOT NULL DEFAULT 'New Thread',
|
|
37
|
+
state TEXT NOT NULL DEFAULT 'IDLE', model TEXT NOT NULL DEFAULT 'gpt-4o',
|
|
38
|
+
createdAt INTEGER NOT NULL, updatedAt INTEGER NOT NULL
|
|
39
|
+
);
|
|
40
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
41
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, agentId TEXT,
|
|
42
|
+
role TEXT NOT NULL, content TEXT NOT NULL, createdAt INTEGER NOT NULL,
|
|
43
|
+
seq INTEGER NOT NULL
|
|
44
|
+
);
|
|
45
|
+
CREATE INDEX IF NOT EXISTS messages_thread ON messages(threadId, seq);
|
|
46
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
47
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, seq INTEGER NOT NULL,
|
|
48
|
+
type TEXT NOT NULL, payload TEXT, createdAt INTEGER NOT NULL
|
|
49
|
+
);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS events_thread_seq ON events(threadId, seq);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS events_thread_type ON events(threadId, type, seq);
|
|
52
|
+
CREATE TABLE IF NOT EXISTS usage (
|
|
53
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, agentId TEXT,
|
|
54
|
+
inputTokens INTEGER NOT NULL, cachedInputTokens INTEGER NOT NULL,
|
|
55
|
+
outputTokens INTEGER NOT NULL, totalTokens INTEGER NOT NULL, createdAt INTEGER NOT NULL
|
|
56
|
+
);
|
|
57
|
+
CREATE INDEX IF NOT EXISTS usage_thread ON usage(threadId);
|
|
58
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
59
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, parentRunId TEXT,
|
|
60
|
+
depth INTEGER NOT NULL DEFAULT 0, agent TEXT NOT NULL, model TEXT NOT NULL,
|
|
61
|
+
state TEXT NOT NULL DEFAULT 'RUNNING', stopReason TEXT, error TEXT,
|
|
62
|
+
startedAt INTEGER NOT NULL, endedAt INTEGER, durationMs INTEGER, queuedMs INTEGER,
|
|
63
|
+
attempts INTEGER NOT NULL DEFAULT 0, steps INTEGER NOT NULL DEFAULT 0,
|
|
64
|
+
inputTokens INTEGER NOT NULL DEFAULT 0, cachedInputTokens INTEGER NOT NULL DEFAULT 0,
|
|
65
|
+
outputTokens INTEGER NOT NULL DEFAULT 0, totalTokens INTEGER NOT NULL DEFAULT 0,
|
|
66
|
+
result TEXT
|
|
67
|
+
);
|
|
68
|
+
CREATE INDEX IF NOT EXISTS runs_thread ON runs(threadId, startedAt);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS runs_state ON runs(state, startedAt);
|
|
70
|
+
CREATE INDEX IF NOT EXISTS runs_parent ON runs(parentRunId);
|
|
71
|
+
`;
|
|
72
|
+
/** A complete Storage over SQLite (§3.2) — every table the platform needs,
|
|
73
|
+
* created on construction. This is what `dev: true` wires up: a working
|
|
74
|
+
* agent platform with no infrastructure to stand up first. */
|
|
75
|
+
export class SqliteStorage {
|
|
76
|
+
db;
|
|
77
|
+
constructor(db) {
|
|
78
|
+
this.db = db;
|
|
79
|
+
for (const stmt of SCHEMA.split(';')) {
|
|
80
|
+
const sql = stmt.trim();
|
|
81
|
+
if (sql)
|
|
82
|
+
this.db.prepare(sql).run();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
all(sql, ...p) {
|
|
86
|
+
return this.db.prepare(sql).all(...p);
|
|
87
|
+
}
|
|
88
|
+
one(sql, ...p) {
|
|
89
|
+
return this.db.prepare(sql).all(...p)[0] ?? null;
|
|
90
|
+
}
|
|
91
|
+
write(sql, ...p) {
|
|
92
|
+
this.db.prepare(sql).run(...p);
|
|
93
|
+
}
|
|
94
|
+
toThread = (r) => ({
|
|
95
|
+
id: r.id, state: r.state, model: r.model,
|
|
96
|
+
createdAt: new Date(r.createdAt), updatedAt: new Date(r.updatedAt),
|
|
97
|
+
});
|
|
98
|
+
toMessage = (r) => ({
|
|
99
|
+
id: r.id, threadId: r.threadId, agentId: r.agentId ?? null,
|
|
100
|
+
role: r.role, content: parse(r.content), createdAt: new Date(r.createdAt),
|
|
101
|
+
});
|
|
102
|
+
toEvent = (r) => ({
|
|
103
|
+
threadId: r.threadId, seq: r.seq, type: r.type,
|
|
104
|
+
payload: parse(r.payload), createdAt: new Date(r.createdAt),
|
|
105
|
+
});
|
|
106
|
+
threads = {
|
|
107
|
+
get: async (threadId) => {
|
|
108
|
+
const r = this.one('SELECT * FROM threads WHERE id = ?', threadId);
|
|
109
|
+
return r ? this.toThread(r) : null;
|
|
110
|
+
},
|
|
111
|
+
create: async (init) => {
|
|
112
|
+
const now = Date.now();
|
|
113
|
+
const id = randomUUID();
|
|
114
|
+
this.write('INSERT INTO threads (id,title,state,model,createdAt,updatedAt) VALUES (?,?,?,?,?,?)', id, 'New Thread', 'IDLE', init?.model ?? 'gpt-4o', now, now);
|
|
115
|
+
return this.toThread({
|
|
116
|
+
id, state: 'IDLE', model: init?.model ?? 'gpt-4o', createdAt: now, updatedAt: now,
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
list: async () => this.all('SELECT * FROM threads ORDER BY updatedAt DESC').map(this.toThread),
|
|
120
|
+
setState: async (threadId, state) => {
|
|
121
|
+
this.write('UPDATE threads SET state = ?, updatedAt = ? WHERE id = ?', state, Date.now(), threadId);
|
|
122
|
+
},
|
|
123
|
+
delete: async (threadId) => {
|
|
124
|
+
// No FK cascade here: the schema is created by this adapter and the
|
|
125
|
+
// cascade is spelled out, so a caller can read exactly what is removed.
|
|
126
|
+
for (const t of ['messages', 'events', 'usage', 'runs']) {
|
|
127
|
+
this.write(`DELETE FROM ${t} WHERE threadId = ?`, threadId);
|
|
128
|
+
}
|
|
129
|
+
this.write('DELETE FROM threads WHERE id = ?', threadId);
|
|
130
|
+
},
|
|
131
|
+
claimState: async (threadId, from, to) => {
|
|
132
|
+
// The §3.4 compare-and-set: one conditional UPDATE, so exactly one
|
|
133
|
+
// caller can win. SQLite serialises writers, which is enough.
|
|
134
|
+
const before = this.one('SELECT state FROM threads WHERE id = ?', threadId);
|
|
135
|
+
if (!before || before.state !== from)
|
|
136
|
+
return false;
|
|
137
|
+
this.write('UPDATE threads SET state = ?, updatedAt = ? WHERE id = ? AND state = ?', to, Date.now(), threadId, from);
|
|
138
|
+
const after = this.one('SELECT state FROM threads WHERE id = ?', threadId);
|
|
139
|
+
return after?.state === to;
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
messages = {
|
|
143
|
+
append: async (threadId, m) => {
|
|
144
|
+
const now = Date.now();
|
|
145
|
+
const id = randomUUID();
|
|
146
|
+
// An explicit seq keeps insertion order stable: several messages land
|
|
147
|
+
// inside the same millisecond, so createdAt alone cannot order them.
|
|
148
|
+
const seq = (this.one('SELECT COALESCE(MAX(seq),0) AS n FROM messages WHERE threadId = ?', threadId)?.n ?? 0) + 1;
|
|
149
|
+
this.write('INSERT INTO messages (id,threadId,agentId,role,content,createdAt,seq) VALUES (?,?,?,?,?,?,?)', id, threadId, m.agentId ?? null, m.role, json(m.content), now, seq);
|
|
150
|
+
return this.toMessage({
|
|
151
|
+
id, threadId, agentId: m.agentId ?? null, role: m.role,
|
|
152
|
+
content: json(m.content), createdAt: now,
|
|
153
|
+
});
|
|
154
|
+
},
|
|
155
|
+
list: async (threadId, opts) => {
|
|
156
|
+
if (opts && 'agentId' in opts) {
|
|
157
|
+
return this.all(opts.agentId === null
|
|
158
|
+
? 'SELECT * FROM messages WHERE threadId = ? AND agentId IS NULL ORDER BY seq'
|
|
159
|
+
: 'SELECT * FROM messages WHERE threadId = ? AND agentId = ? ORDER BY seq', ...(opts.agentId === null ? [threadId] : [threadId, opts.agentId])).map(this.toMessage);
|
|
160
|
+
}
|
|
161
|
+
return this.all('SELECT * FROM messages WHERE threadId = ? ORDER BY seq', threadId)
|
|
162
|
+
.map(this.toMessage);
|
|
163
|
+
},
|
|
164
|
+
deleteFrom: async (threadId, messageId) => {
|
|
165
|
+
const target = this.one('SELECT seq FROM messages WHERE id = ? AND threadId = ?', messageId, threadId);
|
|
166
|
+
if (!target)
|
|
167
|
+
return 0;
|
|
168
|
+
const doomed = this.all('SELECT id FROM messages WHERE threadId = ? AND seq >= ?', threadId, target.seq);
|
|
169
|
+
this.write('DELETE FROM messages WHERE threadId = ? AND seq >= ?', threadId, target.seq);
|
|
170
|
+
return doomed.length;
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
events = {
|
|
174
|
+
append: async (threadId, e) => {
|
|
175
|
+
this.write('INSERT INTO events (id,threadId,seq,type,payload,createdAt) VALUES (?,?,?,?,?,?)', randomUUID(), threadId, e.seq, e.type, json(e.payload), new Date(e.createdAt).getTime());
|
|
176
|
+
},
|
|
177
|
+
listSince: async (threadId, sinceSeq) => this.all('SELECT * FROM events WHERE threadId = ? AND seq > ? ORDER BY seq', threadId, sinceSeq).map(this.toEvent),
|
|
178
|
+
latest: async (threadId, type) => {
|
|
179
|
+
const r = this.one('SELECT * FROM events WHERE threadId = ? AND type = ? ORDER BY seq DESC LIMIT 1', threadId, type);
|
|
180
|
+
return r ? this.toEvent(r) : null;
|
|
181
|
+
},
|
|
182
|
+
listByType: async (threadId, type) => this.all('SELECT * FROM events WHERE threadId = ? AND type = ? ORDER BY seq', threadId, type).map(this.toEvent),
|
|
183
|
+
};
|
|
184
|
+
usage = {
|
|
185
|
+
record: async (threadId, u) => {
|
|
186
|
+
this.write('INSERT INTO usage (id,threadId,agentId,inputTokens,cachedInputTokens,outputTokens,totalTokens,createdAt) VALUES (?,?,?,?,?,?,?,?)', randomUUID(), threadId, u.agentId ?? null, u.inputTokens, u.cachedInputTokens, u.outputTokens, u.totalTokens, Date.now());
|
|
187
|
+
},
|
|
188
|
+
total: async (threadId) => {
|
|
189
|
+
const r = this.one(`SELECT COALESCE(SUM(inputTokens),0) AS i, COALESCE(SUM(cachedInputTokens),0) AS c,
|
|
190
|
+
COALESCE(SUM(outputTokens),0) AS o, COALESCE(SUM(totalTokens),0) AS t
|
|
191
|
+
FROM usage WHERE threadId = ?`, threadId);
|
|
192
|
+
return {
|
|
193
|
+
inputTokens: r?.i ?? 0, cachedInputTokens: r?.c ?? 0,
|
|
194
|
+
outputTokens: r?.o ?? 0, totalTokens: r?.t ?? 0,
|
|
195
|
+
};
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/adapters/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { AgentEvent } from '../core/types.js';
|
|
2
|
+
import type { Kv } from '../ports/kv.js';
|
|
3
|
+
import type { EventBus } from '../ports/bus.js';
|
|
4
|
+
/** Minimal structural type of the @upstash/redis client we use — the real
|
|
5
|
+
* client satisfies it without importing the SDK here. */
|
|
6
|
+
export interface UpstashRedisLike {
|
|
7
|
+
get(key: string): Promise<string | null>;
|
|
8
|
+
set(key: string, value: string, opts?: {
|
|
9
|
+
ex?: number;
|
|
10
|
+
nx?: boolean;
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
del(...keys: string[]): Promise<unknown>;
|
|
13
|
+
incr(key: string): Promise<number>;
|
|
14
|
+
publish(channel: string, value: string): Promise<unknown>;
|
|
15
|
+
}
|
|
16
|
+
/** Reference Kv adapter over Upstash Redis. */
|
|
17
|
+
export declare class UpstashKv implements Kv {
|
|
18
|
+
private readonly redis;
|
|
19
|
+
constructor(redis: UpstashRedisLike);
|
|
20
|
+
get(key: string): Promise<string | null>;
|
|
21
|
+
set(key: string, value: string, opts?: {
|
|
22
|
+
exSeconds?: number;
|
|
23
|
+
onlyIfNotExists?: boolean;
|
|
24
|
+
}): Promise<boolean>;
|
|
25
|
+
del(key: string): Promise<undefined>;
|
|
26
|
+
incr(key: string): Promise<number>;
|
|
27
|
+
}
|
|
28
|
+
/** Upstash Pub/Sub over REST requires a WebSocket-based subscriber; the Redis
|
|
29
|
+
* REST client's `subscribe` differs per SDK version. Wire it in explicitly:
|
|
30
|
+
*
|
|
31
|
+
* new UpstashBus(publisherRedis, {
|
|
32
|
+
* subscribe: (threadId, handler) => {
|
|
33
|
+
* // e.g. `redis.subscribe(channel, cb)` from a WS-enabled client
|
|
34
|
+
* },
|
|
35
|
+
* })
|
|
36
|
+
*/
|
|
37
|
+
export interface UpstashSubscriberLike {
|
|
38
|
+
subscribe(threadId: string, handler: (raw: string) => void): Promise<() => void>;
|
|
39
|
+
}
|
|
40
|
+
export declare const THREAD_CHANNEL: (threadId: string) => string;
|
|
41
|
+
export declare class UpstashBus implements EventBus {
|
|
42
|
+
private readonly redis;
|
|
43
|
+
private readonly subscriber?;
|
|
44
|
+
constructor(redis: UpstashRedisLike, subscriber?: UpstashSubscriberLike | undefined);
|
|
45
|
+
publish(threadId: string, event: AgentEvent): Promise<void>;
|
|
46
|
+
subscribe(threadId: string, handler: (event: AgentEvent) => void): Promise<() => void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=upstash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstash.d.ts","sourceRoot":"","sources":["../../src/adapters/upstash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD;0DAC0D;AAC1D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxF,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AAED,+CAA+C;AAC/C,qBAAa,SAAU,YAAW,EAAE;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,gBAAgB;IAEpD,GAAG,CAAC,GAAG,EAAE,MAAM;IACT,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACvD,OAAO,CAAC,OAAO,CAAC;IAanB,GAAG,CAAC,GAAG,EAAE,MAAM;IACf,IAAI,CAAC,GAAG,EAAE,MAAM;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;CAClF;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,WAAgC,CAAC;AAEhF,qBAAa,UAAW,YAAW,QAAQ;IAEvC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBADX,KAAK,EAAE,gBAAgB,EACvB,UAAU,CAAC,EAAE,qBAAqB,YAAA;IAG/C,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAI3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,iBAfK,IAAI;CA8BhF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Reference Kv adapter over Upstash Redis. */
|
|
2
|
+
export class UpstashKv {
|
|
3
|
+
redis;
|
|
4
|
+
constructor(redis) {
|
|
5
|
+
this.redis = redis;
|
|
6
|
+
}
|
|
7
|
+
get(key) { return this.redis.get(key); }
|
|
8
|
+
async set(key, value, opts) {
|
|
9
|
+
const res = await this.redis.set(key, value, opts?.onlyIfNotExists
|
|
10
|
+
? { nx: true, ex: opts.exSeconds }
|
|
11
|
+
: opts?.exSeconds
|
|
12
|
+
? { ex: opts.exSeconds }
|
|
13
|
+
: undefined);
|
|
14
|
+
// SET NX returns null when the key exists
|
|
15
|
+
return opts?.onlyIfNotExists ? res === 'OK' : true;
|
|
16
|
+
}
|
|
17
|
+
del(key) { return this.redis.del(key).then(() => undefined); }
|
|
18
|
+
incr(key) { return this.redis.incr(key); }
|
|
19
|
+
}
|
|
20
|
+
export const THREAD_CHANNEL = (threadId) => `thread:${threadId}:events`;
|
|
21
|
+
export class UpstashBus {
|
|
22
|
+
redis;
|
|
23
|
+
subscriber;
|
|
24
|
+
constructor(redis, subscriber) {
|
|
25
|
+
this.redis = redis;
|
|
26
|
+
this.subscriber = subscriber;
|
|
27
|
+
}
|
|
28
|
+
async publish(threadId, event) {
|
|
29
|
+
await this.redis.publish(THREAD_CHANNEL(threadId), JSON.stringify(event));
|
|
30
|
+
}
|
|
31
|
+
async subscribe(threadId, handler) {
|
|
32
|
+
if (!this.subscriber) {
|
|
33
|
+
throw new Error('UpstashBus requires a subscriber (WebSocket-based) for live tailing — ' +
|
|
34
|
+
'see the UpstashSubscriberLike docblock. Replay-only usage works without one.');
|
|
35
|
+
}
|
|
36
|
+
return this.subscriber.subscribe(threadId, (raw) => {
|
|
37
|
+
try {
|
|
38
|
+
handler(JSON.parse(raw));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// malformed frame — never kill the subscription
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=upstash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstash.js","sourceRoot":"","sources":["../../src/adapters/upstash.ts"],"names":[],"mappings":"AAcA,+CAA+C;AAC/C,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,KAAuB;QAAvB,UAAK,GAAL,KAAK,CAAkB;IAAG,CAAC;IAExD,GAAG,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,GAAG,CACP,GAAW,EACX,KAAa,EACb,IAAwD;QAExD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAC9B,GAAG,EACH,KAAK,EACL,IAAI,EAAE,eAAe;YACnB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;YAClC,CAAC,CAAC,IAAI,EAAE,SAAS;gBACf,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE;gBACxB,CAAC,CAAC,SAAS,CAChB,CAAC;QACF,0CAA0C;QAC1C,OAAO,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IACD,GAAG,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,GAAW,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACnD;AAeD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,UAAU,QAAQ,SAAS,CAAC;AAEhF,MAAM,OAAO,UAAU;IAEF;IACA;IAFnB,YACmB,KAAuB,EACvB,UAAkC;QADlC,UAAK,GAAL,KAAK,CAAkB;QACvB,eAAU,GAAV,UAAU,CAAwB;IAClD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,KAAiB;QAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,OAAoC;QACpE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,wEAAwE;gBACtE,8EAA8E,CACjF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YACjD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AdminStore } from '../ports/admin.js';
|
|
2
|
+
/** Where the default store writes when no Postgres URL is set. */
|
|
3
|
+
export declare const DEFAULT_ADMIN_DB = "agentic-kit-admin.sqlite";
|
|
4
|
+
/** The store `setupAgentCore` uses when none is configured (§2.9).
|
|
5
|
+
*
|
|
6
|
+
* `AGENTIC_KIT_ADMIN_DATABASE_URL` selects Postgres — point it at its own
|
|
7
|
+
* database or the one you already have, the `agentic_` prefix keeps them
|
|
8
|
+
* apart. Without it, SQLite on disk at `AGENTIC_KIT_ADMIN_DB`, with whichever
|
|
9
|
+
* driver the process has.
|
|
10
|
+
*
|
|
11
|
+
* Opened eagerly. A store that cannot be opened is a configuration problem
|
|
12
|
+
* worth failing on at startup: degrading quietly would lose every run record,
|
|
13
|
+
* and a dashboard showing nothing looks the same as no traffic. */
|
|
14
|
+
export declare function openDefaultAdminStore(): Promise<AdminStore>;
|
|
15
|
+
//# sourceMappingURL=default.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.d.ts","sourceRoot":"","sources":["../../src/admin/default.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAE3D;;;;;;;;;oEASoE;AACpE,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,UAAU,CAAC,CAMjE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { openSqlite } from '../adapters/sqlite.js';
|
|
2
|
+
import { SqliteAdminStore } from './sqlite.js';
|
|
3
|
+
import { PostgresAdminStore, openPostgres } from './postgres.js';
|
|
4
|
+
/** Where the default store writes when no Postgres URL is set. */
|
|
5
|
+
export const DEFAULT_ADMIN_DB = 'agentic-kit-admin.sqlite';
|
|
6
|
+
/** The store `setupAgentCore` uses when none is configured (§2.9).
|
|
7
|
+
*
|
|
8
|
+
* `AGENTIC_KIT_ADMIN_DATABASE_URL` selects Postgres — point it at its own
|
|
9
|
+
* database or the one you already have, the `agentic_` prefix keeps them
|
|
10
|
+
* apart. Without it, SQLite on disk at `AGENTIC_KIT_ADMIN_DB`, with whichever
|
|
11
|
+
* driver the process has.
|
|
12
|
+
*
|
|
13
|
+
* Opened eagerly. A store that cannot be opened is a configuration problem
|
|
14
|
+
* worth failing on at startup: degrading quietly would lose every run record,
|
|
15
|
+
* and a dashboard showing nothing looks the same as no traffic. */
|
|
16
|
+
export async function openDefaultAdminStore() {
|
|
17
|
+
const url = process.env.AGENTIC_KIT_ADMIN_DATABASE_URL;
|
|
18
|
+
if (url)
|
|
19
|
+
return PostgresAdminStore.connect(await openPostgres(url));
|
|
20
|
+
return new SqliteAdminStore(await openSqlite(process.env.AGENTIC_KIT_ADMIN_DB ?? DEFAULT_ADMIN_DB));
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=default.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default.js","sourceRoot":"","sources":["../../src/admin/default.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjE,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,0BAA0B,CAAC;AAE3D;;;;;;;;;oEASoE;AACpE,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IACvD,IAAI,GAAG;QAAE,OAAO,kBAAkB,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,IAAI,gBAAgB,CACzB,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,gBAAgB,CAAC,CACvE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ExecutionState, NewRunRecord, RunPatch, RunRecord } from '../core/types.js';
|
|
2
|
+
import type { AdminStore, AdminThread, AdminThreadFilter, NewAdminThread, NewStepRecord, RunFilter, StepRecord } from '../ports/admin.js';
|
|
3
|
+
/** Operational history held in memory — tests, and the default when nothing
|
|
4
|
+
* durable is configured. Loses everything on restart, which is exactly what
|
|
5
|
+
* the SQLite and Postgres stores exist to fix. */
|
|
6
|
+
export declare class MemoryAdminStore implements AdminStore {
|
|
7
|
+
readonly runRows: Map<string, RunRecord>;
|
|
8
|
+
readonly stepRows: StepRecord[];
|
|
9
|
+
readonly threadRows: Map<string, AdminThread>;
|
|
10
|
+
threads: {
|
|
11
|
+
upsert: (t: NewAdminThread) => Promise<void>;
|
|
12
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
13
|
+
list: (f: AdminThreadFilter) => Promise<AdminThread[]>;
|
|
14
|
+
};
|
|
15
|
+
runs: {
|
|
16
|
+
start: (r: NewRunRecord) => Promise<RunRecord>;
|
|
17
|
+
patch: (runId: string, patch: RunPatch) => Promise<void>;
|
|
18
|
+
get: (runId: string) => Promise<RunRecord | null>;
|
|
19
|
+
listByThread: (threadId: string) => Promise<RunRecord[]>;
|
|
20
|
+
list: (f: RunFilter) => Promise<RunRecord[]>;
|
|
21
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
22
|
+
};
|
|
23
|
+
steps: {
|
|
24
|
+
record: (s: NewStepRecord) => Promise<void>;
|
|
25
|
+
listByRun: (runId: string) => Promise<StepRecord[]>;
|
|
26
|
+
listByThread: (threadId: string) => Promise<StepRecord[]>;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/admin/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAC1D,aAAa,EAAE,SAAS,EAAE,UAAU,EACrC,MAAM,mBAAmB,CAAC;AAE3B;;mDAEmD;AACnD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,QAAQ,CAAC,OAAO,yBAAgC;IAChD,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAM;IAErC,QAAQ,CAAC,UAAU,2BAAkC;IAErD,OAAO;oBACa,cAAc;;kBAUhB,iBAAiB;MAQjC;IAEF,IAAI;mBACe,YAAY;uBASR,MAAM,SAAS,QAAQ;qBAIzB,MAAM;iCACM,MAAM;kBAIrB,SAAS;;MAgBzB;IAEF,KAAK;oBACe,aAAa;2BAGN,MAAM;iCAEA,MAAM;MAIrC;CACH"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** Operational history held in memory — tests, and the default when nothing
|
|
2
|
+
* durable is configured. Loses everything on restart, which is exactly what
|
|
3
|
+
* the SQLite and Postgres stores exist to fix. */
|
|
4
|
+
export class MemoryAdminStore {
|
|
5
|
+
runRows = new Map();
|
|
6
|
+
stepRows = [];
|
|
7
|
+
threadRows = new Map();
|
|
8
|
+
threads = {
|
|
9
|
+
upsert: async (t) => {
|
|
10
|
+
const now = new Date();
|
|
11
|
+
const prior = this.threadRows.get(t.id);
|
|
12
|
+
this.threadRows.set(t.id, { ...t, firstSeenAt: prior?.firstSeenAt ?? now, updatedAt: now });
|
|
13
|
+
},
|
|
14
|
+
countByState: async () => {
|
|
15
|
+
const out = {};
|
|
16
|
+
for (const t of this.threadRows.values())
|
|
17
|
+
out[t.state] = (out[t.state] ?? 0) + 1;
|
|
18
|
+
return out;
|
|
19
|
+
},
|
|
20
|
+
list: async (f) => {
|
|
21
|
+
let rows = [...this.threadRows.values()];
|
|
22
|
+
if (f.state?.length)
|
|
23
|
+
rows = rows.filter((t) => f.state.includes(t.state));
|
|
24
|
+
if (f.since)
|
|
25
|
+
rows = rows.filter((t) => t.updatedAt >= f.since);
|
|
26
|
+
return rows
|
|
27
|
+
.sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())
|
|
28
|
+
.slice(0, f.limit ?? 100);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
runs = {
|
|
32
|
+
start: async (r) => {
|
|
33
|
+
const rec = {
|
|
34
|
+
parentRunId: null, depth: 0, prompt: null, tokenBudget: null, runState: null, ...r,
|
|
35
|
+
state: 'RUNNING', startedAt: new Date(), steps: 0, attempts: 0,
|
|
36
|
+
inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0,
|
|
37
|
+
};
|
|
38
|
+
this.runRows.set(rec.id, rec);
|
|
39
|
+
return rec;
|
|
40
|
+
},
|
|
41
|
+
patch: async (runId, patch) => {
|
|
42
|
+
const cur = this.runRows.get(runId);
|
|
43
|
+
if (cur)
|
|
44
|
+
this.runRows.set(runId, { ...cur, ...patch });
|
|
45
|
+
},
|
|
46
|
+
get: async (runId) => this.runRows.get(runId) ?? null,
|
|
47
|
+
listByThread: async (threadId) => [...this.runRows.values()]
|
|
48
|
+
.filter((r) => r.threadId === threadId)
|
|
49
|
+
.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime()),
|
|
50
|
+
list: async (f) => {
|
|
51
|
+
let rows = [...this.runRows.values()];
|
|
52
|
+
if (f.state?.length)
|
|
53
|
+
rows = rows.filter((r) => f.state.includes(r.state));
|
|
54
|
+
if (f.agent)
|
|
55
|
+
rows = rows.filter((r) => r.agent === f.agent);
|
|
56
|
+
if (f.threadId)
|
|
57
|
+
rows = rows.filter((r) => r.threadId === f.threadId);
|
|
58
|
+
if (f.since)
|
|
59
|
+
rows = rows.filter((r) => r.startedAt >= f.since);
|
|
60
|
+
if (f.until)
|
|
61
|
+
rows = rows.filter((r) => r.startedAt <= f.until);
|
|
62
|
+
return rows
|
|
63
|
+
.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime())
|
|
64
|
+
.slice(0, f.limit ?? 100);
|
|
65
|
+
},
|
|
66
|
+
countByState: async () => {
|
|
67
|
+
const out = {};
|
|
68
|
+
for (const r of this.runRows.values())
|
|
69
|
+
out[r.state] = (out[r.state] ?? 0) + 1;
|
|
70
|
+
return out;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
steps = {
|
|
74
|
+
record: async (s) => {
|
|
75
|
+
this.stepRows.push({ ...s, at: s.at ?? new Date() });
|
|
76
|
+
},
|
|
77
|
+
listByRun: async (runId) => this.stepRows.filter((s) => s.runId === runId).sort((a, b) => a.index - b.index),
|
|
78
|
+
listByThread: async (threadId) => this.stepRows
|
|
79
|
+
.filter((s) => s.threadId === threadId)
|
|
80
|
+
.sort((a, b) => a.at.getTime() - b.at.getTime()),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/admin/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ExecutionState, NewRunRecord, RunPatch, RunRecord } from '../core/types.js';
|
|
2
|
+
import type { AdminStore, AdminThread, AdminThreadFilter, NewAdminThread, NewStepRecord, RunFilter, StepRecord } from '../ports/admin.js';
|
|
3
|
+
/** Minimal structural type over a Postgres client. Both `pg`'s `Pool` and its
|
|
4
|
+
* `Client` satisfy it, so the package never imports the driver (§3.4). */
|
|
5
|
+
export interface PgLike {
|
|
6
|
+
query(text: string, params?: unknown[]): Promise<{
|
|
7
|
+
rows: any[];
|
|
8
|
+
}>;
|
|
9
|
+
}
|
|
10
|
+
/** Open a `pg` Pool from a connection string. Dynamically imported so the
|
|
11
|
+
* driver only loads for callers who actually use Postgres, and marked
|
|
12
|
+
* webpackIgnore so a bundler leaves it as a runtime import. */
|
|
13
|
+
export declare function openPostgres(url: string): Promise<PgLike>;
|
|
14
|
+
/** Operational history in Postgres — the production store (§2.9), reached
|
|
15
|
+
* through AGENTIC_KIT_ADMIN_DATABASE_URL. Point it at its own database or the
|
|
16
|
+
* one you already have; the prefix keeps them apart either way. */
|
|
17
|
+
export declare class PostgresAdminStore implements AdminStore {
|
|
18
|
+
private readonly db;
|
|
19
|
+
private constructor();
|
|
20
|
+
/** Creates the tables if they are missing, then returns the store. A factory
|
|
21
|
+
* rather than a constructor because that first step is asynchronous — and
|
|
22
|
+
* `setupAgentCore` awaits its store precisely so this can fail at startup. */
|
|
23
|
+
static connect(db: PgLike): Promise<PostgresAdminStore>;
|
|
24
|
+
threads: {
|
|
25
|
+
upsert: (t: NewAdminThread) => Promise<void>;
|
|
26
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
27
|
+
list: (f: AdminThreadFilter) => Promise<AdminThread[]>;
|
|
28
|
+
};
|
|
29
|
+
runs: {
|
|
30
|
+
start: (run: NewRunRecord) => Promise<RunRecord>;
|
|
31
|
+
patch: (runId: string, patch: RunPatch) => Promise<void>;
|
|
32
|
+
get: (runId: string) => Promise<RunRecord | null>;
|
|
33
|
+
listByThread: (threadId: string) => Promise<RunRecord[]>;
|
|
34
|
+
list: (f: RunFilter) => Promise<RunRecord[]>;
|
|
35
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
36
|
+
};
|
|
37
|
+
steps: {
|
|
38
|
+
record: (s: NewStepRecord) => Promise<void>;
|
|
39
|
+
listByRun: (runId: string) => Promise<StepRecord[]>;
|
|
40
|
+
listByThread: (threadId: string) => Promise<StepRecord[]>;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/admin/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAC1D,aAAa,EAAE,SAAS,EAAE,UAAU,EACrC,MAAM,mBAAmB,CAAC;AAE3B;2EAC2E;AAC3E,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC,CAAC;CACnE;AAED;;gEAEgE;AAChE,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY/D;AA4DD;;oEAEoE;AACpE,qBAAa,kBAAmB,YAAW,UAAU;IAC/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP;;mFAE+E;WAClE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAK7D,OAAO;oBACa,cAAc;;kBAgBhB,iBAAiB,KAAG,OAAO,CAAC,WAAW,EAAE,CAAC;MAiB1D;IAEF,IAAI;qBACiB,YAAY;uBAcV,MAAM,SAAS,QAAQ;qBAczB,MAAM;iCAIM,MAAM;kBAOrB,SAAS;;MAuBzB;IAEF,KAAK;oBACe,aAAa;2BAgBN,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;iCAOxB,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;MAO7D;CACH"}
|