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,201 @@
|
|
|
1
|
+
/** Open a `pg` Pool from a connection string. Dynamically imported so the
|
|
2
|
+
* driver only loads for callers who actually use Postgres, and marked
|
|
3
|
+
* webpackIgnore so a bundler leaves it as a runtime import. */
|
|
4
|
+
export async function openPostgres(url) {
|
|
5
|
+
const specifier = 'pg';
|
|
6
|
+
try {
|
|
7
|
+
const pg = await import(/* webpackIgnore: true */ /* @vite-ignore */ specifier);
|
|
8
|
+
const Pool = pg.Pool ?? pg.default?.Pool;
|
|
9
|
+
return new Pool({ connectionString: url });
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
throw new Error('Could not load `pg`. Install it (`bun add pg`) to use the Postgres ' +
|
|
13
|
+
`admin store. (${err instanceof Error ? err.message : String(err)})`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// Tables are prefixed `agentic_` because this frequently shares a database
|
|
17
|
+
// with the caller's own schema — AGENTIC_KIT_ADMIN_DATABASE_URL may well point
|
|
18
|
+
// at the database they already have. Nothing here should collide with theirs.
|
|
19
|
+
const SCHEMA = [
|
|
20
|
+
`CREATE TABLE IF NOT EXISTS agentic_threads (
|
|
21
|
+
id TEXT PRIMARY KEY, state TEXT NOT NULL, model TEXT NOT NULL,
|
|
22
|
+
"firstSeenAt" TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
23
|
+
"updatedAt" TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
24
|
+
)`,
|
|
25
|
+
`CREATE INDEX IF NOT EXISTS agentic_threads_state ON agentic_threads(state, "updatedAt")`,
|
|
26
|
+
`CREATE TABLE IF NOT EXISTS agentic_runs (
|
|
27
|
+
id TEXT PRIMARY KEY, "threadId" TEXT NOT NULL, "parentRunId" TEXT,
|
|
28
|
+
depth INT NOT NULL DEFAULT 0, agent TEXT NOT NULL, model TEXT NOT NULL,
|
|
29
|
+
state TEXT NOT NULL DEFAULT 'RUNNING', "stopReason" TEXT, error TEXT,
|
|
30
|
+
"startedAt" TIMESTAMPTZ NOT NULL DEFAULT now(), "endedAt" TIMESTAMPTZ,
|
|
31
|
+
"durationMs" INT, "queuedMs" INT,
|
|
32
|
+
attempts INT NOT NULL DEFAULT 0, steps INT NOT NULL DEFAULT 0,
|
|
33
|
+
"inputTokens" INT NOT NULL DEFAULT 0, "cachedInputTokens" INT NOT NULL DEFAULT 0,
|
|
34
|
+
"outputTokens" INT NOT NULL DEFAULT 0, "totalTokens" INT NOT NULL DEFAULT 0,
|
|
35
|
+
result JSONB, prompt TEXT, "tokenBudget" INT, "runState" JSONB
|
|
36
|
+
)`,
|
|
37
|
+
`ALTER TABLE agentic_runs ADD COLUMN IF NOT EXISTS prompt TEXT`,
|
|
38
|
+
`ALTER TABLE agentic_runs ADD COLUMN IF NOT EXISTS "tokenBudget" INT`,
|
|
39
|
+
`ALTER TABLE agentic_runs ADD COLUMN IF NOT EXISTS "runState" JSONB`,
|
|
40
|
+
`CREATE INDEX IF NOT EXISTS agentic_runs_thread ON agentic_runs("threadId", "startedAt" DESC)`,
|
|
41
|
+
`CREATE INDEX IF NOT EXISTS agentic_runs_state ON agentic_runs(state, "startedAt" DESC)`,
|
|
42
|
+
`CREATE INDEX IF NOT EXISTS agentic_runs_parent ON agentic_runs("parentRunId")`,
|
|
43
|
+
`CREATE TABLE IF NOT EXISTS agentic_steps (
|
|
44
|
+
"runId" TEXT NOT NULL, "threadId" TEXT, "agentId" TEXT, "index" INT NOT NULL,
|
|
45
|
+
"durationMs" INT NOT NULL, "finishReason" TEXT NOT NULL,
|
|
46
|
+
"inputTokens" INT NOT NULL DEFAULT 0, "cachedInputTokens" INT NOT NULL DEFAULT 0,
|
|
47
|
+
"outputTokens" INT NOT NULL DEFAULT 0, "totalTokens" INT NOT NULL DEFAULT 0,
|
|
48
|
+
tools JSONB, text TEXT, "toolCalls" JSONB,
|
|
49
|
+
at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
50
|
+
)`,
|
|
51
|
+
// CREATE TABLE IF NOT EXISTS leaves an existing table alone, so newer
|
|
52
|
+
// columns are added separately.
|
|
53
|
+
`ALTER TABLE agentic_steps ADD COLUMN IF NOT EXISTS text TEXT`,
|
|
54
|
+
`ALTER TABLE agentic_steps ADD COLUMN IF NOT EXISTS "threadId" TEXT`,
|
|
55
|
+
`CREATE INDEX IF NOT EXISTS agentic_steps_thread ON agentic_steps("threadId", at)`,
|
|
56
|
+
`ALTER TABLE agentic_steps ADD COLUMN IF NOT EXISTS "toolCalls" JSONB`,
|
|
57
|
+
`CREATE INDEX IF NOT EXISTS agentic_steps_run ON agentic_steps("runId", "index")`,
|
|
58
|
+
];
|
|
59
|
+
const toRun = (r) => ({
|
|
60
|
+
id: r.id, threadId: r.threadId, parentRunId: r.parentRunId ?? null, depth: r.depth,
|
|
61
|
+
agent: r.agent, model: r.model, state: r.state,
|
|
62
|
+
stopReason: r.stopReason ?? null, error: r.error ?? null,
|
|
63
|
+
startedAt: new Date(r.startedAt), endedAt: r.endedAt ? new Date(r.endedAt) : null,
|
|
64
|
+
durationMs: r.durationMs ?? null, queuedMs: r.queuedMs ?? null,
|
|
65
|
+
attempts: r.attempts, steps: r.steps,
|
|
66
|
+
inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
|
|
67
|
+
outputTokens: r.outputTokens, totalTokens: r.totalTokens,
|
|
68
|
+
result: r.result ?? null,
|
|
69
|
+
prompt: r.prompt ?? null, tokenBudget: r.tokenBudget ?? null,
|
|
70
|
+
runState: r.runState ?? null,
|
|
71
|
+
});
|
|
72
|
+
/** Operational history in Postgres — the production store (§2.9), reached
|
|
73
|
+
* through AGENTIC_KIT_ADMIN_DATABASE_URL. Point it at its own database or the
|
|
74
|
+
* one you already have; the prefix keeps them apart either way. */
|
|
75
|
+
export class PostgresAdminStore {
|
|
76
|
+
db;
|
|
77
|
+
constructor(db) {
|
|
78
|
+
this.db = db;
|
|
79
|
+
}
|
|
80
|
+
/** Creates the tables if they are missing, then returns the store. A factory
|
|
81
|
+
* rather than a constructor because that first step is asynchronous — and
|
|
82
|
+
* `setupAgentCore` awaits its store precisely so this can fail at startup. */
|
|
83
|
+
static async connect(db) {
|
|
84
|
+
for (const stmt of SCHEMA)
|
|
85
|
+
await db.query(stmt);
|
|
86
|
+
return new PostgresAdminStore(db);
|
|
87
|
+
}
|
|
88
|
+
threads = {
|
|
89
|
+
upsert: async (t) => {
|
|
90
|
+
await this.db.query(`INSERT INTO agentic_threads (id, state, model) VALUES ($1, $2, $3)
|
|
91
|
+
ON CONFLICT (id) DO UPDATE
|
|
92
|
+
SET state = EXCLUDED.state, model = EXCLUDED.model, "updatedAt" = now()`, [t.id, t.state, t.model]);
|
|
93
|
+
},
|
|
94
|
+
countByState: async () => {
|
|
95
|
+
const { rows } = await this.db.query('SELECT state, COUNT(*)::int AS n FROM agentic_threads GROUP BY state');
|
|
96
|
+
return Object.fromEntries(rows.map((r) => [r.state, r.n]));
|
|
97
|
+
},
|
|
98
|
+
list: async (f) => {
|
|
99
|
+
const where = [];
|
|
100
|
+
const vals = [];
|
|
101
|
+
if (f.state?.length) {
|
|
102
|
+
where.push(`state = ANY($${vals.push(f.state)})`);
|
|
103
|
+
}
|
|
104
|
+
if (f.since)
|
|
105
|
+
where.push(`"updatedAt" >= $${vals.push(f.since)}`);
|
|
106
|
+
const { rows } = await this.db.query(`SELECT * FROM agentic_threads${where.length ? ` WHERE ${where.join(' AND ')}` : ''}
|
|
107
|
+
ORDER BY "updatedAt" DESC LIMIT $${vals.push(f.limit ?? 100)}`, vals);
|
|
108
|
+
return rows.map((r) => ({
|
|
109
|
+
id: r.id, state: r.state, model: r.model,
|
|
110
|
+
firstSeenAt: new Date(r.firstSeenAt), updatedAt: new Date(r.updatedAt),
|
|
111
|
+
}));
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
runs = {
|
|
115
|
+
start: async (run) => {
|
|
116
|
+
const { rows } = await this.db.query(`INSERT INTO agentic_runs
|
|
117
|
+
(id, "threadId", "parentRunId", depth, agent, model, state,
|
|
118
|
+
prompt, "tokenBudget", "runState")
|
|
119
|
+
VALUES ($1, $2, $3, $4, $5, $6, 'RUNNING', $7, $8, $9) RETURNING *`, [
|
|
120
|
+
run.id, run.threadId, run.parentRunId ?? null, run.depth ?? 0,
|
|
121
|
+
run.agent, run.model, run.prompt ?? null, run.tokenBudget ?? null,
|
|
122
|
+
run.runState ? JSON.stringify(run.runState) : null,
|
|
123
|
+
]);
|
|
124
|
+
return toRun(rows[0]);
|
|
125
|
+
},
|
|
126
|
+
patch: async (runId, patch) => {
|
|
127
|
+
const sets = [];
|
|
128
|
+
const vals = [];
|
|
129
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
130
|
+
if (v === undefined)
|
|
131
|
+
continue;
|
|
132
|
+
// JSON columns need the value serialised; everything else pg handles.
|
|
133
|
+
sets.push(`"${k}" = $${vals.push(k === 'result' ? JSON.stringify(v) : v)}`);
|
|
134
|
+
}
|
|
135
|
+
if (sets.length === 0)
|
|
136
|
+
return;
|
|
137
|
+
await this.db.query(`UPDATE agentic_runs SET ${sets.join(', ')} WHERE id = $${vals.push(runId)}`, vals);
|
|
138
|
+
},
|
|
139
|
+
get: async (runId) => {
|
|
140
|
+
const { rows } = await this.db.query('SELECT * FROM agentic_runs WHERE id = $1', [runId]);
|
|
141
|
+
return rows[0] ? toRun(rows[0]) : null;
|
|
142
|
+
},
|
|
143
|
+
listByThread: async (threadId) => {
|
|
144
|
+
const { rows } = await this.db.query('SELECT * FROM agentic_runs WHERE "threadId" = $1 ORDER BY "startedAt" DESC', [threadId]);
|
|
145
|
+
return rows.map(toRun);
|
|
146
|
+
},
|
|
147
|
+
list: async (f) => {
|
|
148
|
+
const where = [];
|
|
149
|
+
const vals = [];
|
|
150
|
+
if (f.state?.length)
|
|
151
|
+
where.push(`state = ANY($${vals.push(f.state)})`);
|
|
152
|
+
if (f.agent)
|
|
153
|
+
where.push(`agent = $${vals.push(f.agent)}`);
|
|
154
|
+
if (f.threadId)
|
|
155
|
+
where.push(`"threadId" = $${vals.push(f.threadId)}`);
|
|
156
|
+
if (f.since)
|
|
157
|
+
where.push(`"startedAt" >= $${vals.push(f.since)}`);
|
|
158
|
+
if (f.until)
|
|
159
|
+
where.push(`"startedAt" <= $${vals.push(f.until)}`);
|
|
160
|
+
const { rows } = await this.db.query(`SELECT * FROM agentic_runs${where.length ? ` WHERE ${where.join(' AND ')}` : ''}
|
|
161
|
+
ORDER BY "startedAt" DESC LIMIT $${vals.push(f.limit ?? 100)}`, vals);
|
|
162
|
+
return rows.map(toRun);
|
|
163
|
+
},
|
|
164
|
+
countByState: async () => {
|
|
165
|
+
const { rows } = await this.db.query('SELECT state, COUNT(*)::int AS n FROM agentic_runs GROUP BY state');
|
|
166
|
+
return Object.fromEntries(rows.map((r) => [r.state, r.n]));
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
steps = {
|
|
170
|
+
record: async (s) => {
|
|
171
|
+
await this.db.query(`INSERT INTO agentic_steps
|
|
172
|
+
("runId", "threadId", "agentId", "index", "durationMs", "finishReason",
|
|
173
|
+
"inputTokens", "cachedInputTokens", "outputTokens", "totalTokens",
|
|
174
|
+
tools, text, "toolCalls", at)
|
|
175
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)`, [
|
|
176
|
+
s.runId, s.threadId, s.agentId, s.index, s.durationMs, s.finishReason,
|
|
177
|
+
s.inputTokens, s.cachedInputTokens, s.outputTokens, s.totalTokens,
|
|
178
|
+
JSON.stringify(s.tools), s.text ?? null,
|
|
179
|
+
s.toolCalls ? JSON.stringify(s.toolCalls) : null,
|
|
180
|
+
s.at ?? new Date(),
|
|
181
|
+
]);
|
|
182
|
+
},
|
|
183
|
+
listByRun: async (runId) => {
|
|
184
|
+
const { rows } = await this.db.query('SELECT * FROM agentic_steps WHERE "runId" = $1 ORDER BY "index"', [runId]);
|
|
185
|
+
return rows.map(toStep);
|
|
186
|
+
},
|
|
187
|
+
listByThread: async (threadId) => {
|
|
188
|
+
const { rows } = await this.db.query('SELECT * FROM agentic_steps WHERE "threadId" = $1 ORDER BY at', [threadId]);
|
|
189
|
+
return rows.map(toStep);
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const toStep = (r) => ({
|
|
194
|
+
runId: r.runId, threadId: r.threadId ?? '', agentId: r.agentId ?? null, index: r.index,
|
|
195
|
+
durationMs: r.durationMs, finishReason: r.finishReason,
|
|
196
|
+
inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
|
|
197
|
+
outputTokens: r.outputTokens, totalTokens: r.totalTokens,
|
|
198
|
+
tools: r.tools ?? [], text: r.text ?? null,
|
|
199
|
+
toolCalls: r.toolCalls ?? [], at: new Date(r.at),
|
|
200
|
+
});
|
|
201
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../src/admin/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
import type { SqliteLike } from '../adapters/sqlite.js';
|
|
4
|
+
/** Operational history in SQLite — what `dev: true` uses (§2.9).
|
|
5
|
+
*
|
|
6
|
+
* Tables are prefixed `agentic_` because this may well share a database with
|
|
7
|
+
* the caller's own schema; nothing here should collide with a table they own. */
|
|
8
|
+
export declare class SqliteAdminStore implements AdminStore {
|
|
9
|
+
private readonly db;
|
|
10
|
+
constructor(db: SqliteLike);
|
|
11
|
+
private all;
|
|
12
|
+
private one;
|
|
13
|
+
private write;
|
|
14
|
+
private toRun;
|
|
15
|
+
threads: {
|
|
16
|
+
upsert: (t: NewAdminThread) => Promise<void>;
|
|
17
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
18
|
+
list: (f: AdminThreadFilter) => Promise<AdminThread[]>;
|
|
19
|
+
};
|
|
20
|
+
runs: {
|
|
21
|
+
start: (run: NewRunRecord) => Promise<RunRecord>;
|
|
22
|
+
patch: (runId: string, patch: RunPatch) => Promise<void>;
|
|
23
|
+
get: (runId: string) => Promise<RunRecord | null>;
|
|
24
|
+
listByThread: (threadId: string) => Promise<RunRecord[]>;
|
|
25
|
+
list: (f: RunFilter) => Promise<RunRecord[]>;
|
|
26
|
+
countByState: () => Promise<Partial<Record<ExecutionState, number>>>;
|
|
27
|
+
};
|
|
28
|
+
steps: {
|
|
29
|
+
record: (s: NewStepRecord) => Promise<void>;
|
|
30
|
+
listByRun: (runId: string) => Promise<StepRecord[]>;
|
|
31
|
+
listByThread: (threadId: string) => Promise<StepRecord[]>;
|
|
32
|
+
};
|
|
33
|
+
private toStep;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/admin/sqlite.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;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAoCxD;;;kFAGkF;AAClF,qBAAa,gBAAiB,YAAW,UAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,UAAU;IAwB3C,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK,CAYV;IAEH,OAAO;oBACa,cAAc;;kBAehB,iBAAiB,KAAG,OAAO,CAAC,WAAW,EAAE,CAAC;MAiB1D;IAEF,IAAI;qBACiB,YAAY;uBAcV,MAAM,SAAS,QAAQ;qBAWzB,MAAM;iCAIM,MAAM;kBAGrB,SAAS;;MAsBzB;IAEF,KAAK;oBACe,aAAa;2BASN,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;iCAGxB,MAAM,KAAG,OAAO,CAAC,UAAU,EAAE,CAAC;MAG7D;IAEF,OAAO,CAAC,MAAM,CAOX;CACJ"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const date = (n) => (n == null ? null : new Date(n));
|
|
2
|
+
const json = (v) => (v === undefined ? null : JSON.stringify(v));
|
|
3
|
+
const parse = (v) => (typeof v === 'string' ? JSON.parse(v) : (v ?? null));
|
|
4
|
+
const SCHEMA = `
|
|
5
|
+
CREATE TABLE IF NOT EXISTS agentic_runs (
|
|
6
|
+
id TEXT PRIMARY KEY, threadId TEXT NOT NULL, parentRunId TEXT,
|
|
7
|
+
depth INTEGER NOT NULL DEFAULT 0, agent TEXT NOT NULL, model TEXT NOT NULL,
|
|
8
|
+
state TEXT NOT NULL DEFAULT 'RUNNING', stopReason TEXT, error TEXT,
|
|
9
|
+
startedAt INTEGER NOT NULL, endedAt INTEGER, durationMs INTEGER, queuedMs INTEGER,
|
|
10
|
+
attempts INTEGER NOT NULL DEFAULT 0, steps INTEGER NOT NULL DEFAULT 0,
|
|
11
|
+
inputTokens INTEGER NOT NULL DEFAULT 0, cachedInputTokens INTEGER NOT NULL DEFAULT 0,
|
|
12
|
+
outputTokens INTEGER NOT NULL DEFAULT 0, totalTokens INTEGER NOT NULL DEFAULT 0,
|
|
13
|
+
result TEXT, prompt TEXT, tokenBudget INTEGER, runState TEXT
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX IF NOT EXISTS agentic_runs_thread ON agentic_runs(threadId, startedAt);
|
|
16
|
+
CREATE INDEX IF NOT EXISTS agentic_runs_state ON agentic_runs(state, startedAt);
|
|
17
|
+
CREATE INDEX IF NOT EXISTS agentic_runs_parent ON agentic_runs(parentRunId);
|
|
18
|
+
CREATE TABLE IF NOT EXISTS agentic_threads (
|
|
19
|
+
id TEXT PRIMARY KEY, state TEXT NOT NULL, model TEXT NOT NULL,
|
|
20
|
+
firstSeenAt INTEGER NOT NULL, updatedAt INTEGER NOT NULL
|
|
21
|
+
);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS agentic_threads_state ON agentic_threads(state, updatedAt);
|
|
23
|
+
CREATE TABLE IF NOT EXISTS agentic_steps (
|
|
24
|
+
runId TEXT NOT NULL, threadId TEXT, agentId TEXT, "index" INTEGER NOT NULL,
|
|
25
|
+
durationMs INTEGER NOT NULL, finishReason TEXT NOT NULL,
|
|
26
|
+
inputTokens INTEGER NOT NULL DEFAULT 0, cachedInputTokens INTEGER NOT NULL DEFAULT 0,
|
|
27
|
+
outputTokens INTEGER NOT NULL DEFAULT 0, totalTokens INTEGER NOT NULL DEFAULT 0,
|
|
28
|
+
tools TEXT, text TEXT, toolCalls TEXT, at INTEGER NOT NULL
|
|
29
|
+
);
|
|
30
|
+
CREATE INDEX IF NOT EXISTS agentic_steps_run ON agentic_steps(runId, "index");
|
|
31
|
+
CREATE INDEX IF NOT EXISTS agentic_steps_thread ON agentic_steps(threadId, at);
|
|
32
|
+
`;
|
|
33
|
+
/** Operational history in SQLite — what `dev: true` uses (§2.9).
|
|
34
|
+
*
|
|
35
|
+
* Tables are prefixed `agentic_` because this may well share a database with
|
|
36
|
+
* the caller's own schema; nothing here should collide with a table they own. */
|
|
37
|
+
export class SqliteAdminStore {
|
|
38
|
+
db;
|
|
39
|
+
constructor(db) {
|
|
40
|
+
this.db = db;
|
|
41
|
+
for (const stmt of SCHEMA.split(';')) {
|
|
42
|
+
const sql = stmt.trim();
|
|
43
|
+
if (sql)
|
|
44
|
+
this.db.prepare(sql).run();
|
|
45
|
+
}
|
|
46
|
+
// CREATE TABLE IF NOT EXISTS never adds a column to a database that already
|
|
47
|
+
// exists, so newer fields are added separately. SQLite has no
|
|
48
|
+
// ADD COLUMN IF NOT EXISTS, hence the check.
|
|
49
|
+
const have = new Set(this.db.prepare('PRAGMA table_info(agentic_steps)').all().map((c) => c.name));
|
|
50
|
+
for (const col of ['text', 'toolCalls', 'threadId']) {
|
|
51
|
+
if (!have.has(col))
|
|
52
|
+
this.db.prepare(`ALTER TABLE agentic_steps ADD COLUMN ${col} TEXT`).run();
|
|
53
|
+
}
|
|
54
|
+
const runCols = new Set(this.db.prepare('PRAGMA table_info(agentic_runs)').all().map((c) => c.name));
|
|
55
|
+
for (const [col, type] of [['prompt', 'TEXT'], ['tokenBudget', 'INTEGER'], ['runState', 'TEXT']]) {
|
|
56
|
+
if (!runCols.has(col)) {
|
|
57
|
+
this.db.prepare(`ALTER TABLE agentic_runs ADD COLUMN ${col} ${type}`).run();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
all(sql, ...p) {
|
|
62
|
+
return this.db.prepare(sql).all(...p);
|
|
63
|
+
}
|
|
64
|
+
one(sql, ...p) {
|
|
65
|
+
return this.db.prepare(sql).all(...p)[0] ?? null;
|
|
66
|
+
}
|
|
67
|
+
write(sql, ...p) {
|
|
68
|
+
this.db.prepare(sql).run(...p);
|
|
69
|
+
}
|
|
70
|
+
toRun = (r) => ({
|
|
71
|
+
id: r.id, threadId: r.threadId, parentRunId: r.parentRunId ?? null, depth: r.depth,
|
|
72
|
+
agent: r.agent, model: r.model, state: r.state,
|
|
73
|
+
stopReason: r.stopReason ?? null, error: r.error ?? null,
|
|
74
|
+
startedAt: new Date(r.startedAt), endedAt: date(r.endedAt),
|
|
75
|
+
durationMs: r.durationMs ?? null, queuedMs: r.queuedMs ?? null,
|
|
76
|
+
attempts: r.attempts, steps: r.steps,
|
|
77
|
+
inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
|
|
78
|
+
outputTokens: r.outputTokens, totalTokens: r.totalTokens,
|
|
79
|
+
result: parse(r.result),
|
|
80
|
+
prompt: r.prompt ?? null, tokenBudget: r.tokenBudget ?? null,
|
|
81
|
+
runState: parse(r.runState),
|
|
82
|
+
});
|
|
83
|
+
threads = {
|
|
84
|
+
upsert: async (t) => {
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
// firstSeenAt survives an update; everything else is overwritten.
|
|
87
|
+
this.write(`INSERT INTO agentic_threads (id,state,model,firstSeenAt,updatedAt) VALUES (?,?,?,?,?)
|
|
88
|
+
ON CONFLICT(id) DO UPDATE SET state = excluded.state,
|
|
89
|
+
model = excluded.model, updatedAt = excluded.updatedAt`, t.id, t.state, t.model, now, now);
|
|
90
|
+
},
|
|
91
|
+
countByState: async () => Object.fromEntries(this.all('SELECT state, COUNT(*) AS n FROM agentic_threads GROUP BY state')
|
|
92
|
+
.map((r) => [r.state, r.n])),
|
|
93
|
+
list: async (f) => {
|
|
94
|
+
const where = [];
|
|
95
|
+
const vals = [];
|
|
96
|
+
if (f.state?.length) {
|
|
97
|
+
where.push(`state IN (${f.state.map(() => '?').join(',')})`);
|
|
98
|
+
vals.push(...f.state);
|
|
99
|
+
}
|
|
100
|
+
if (f.since) {
|
|
101
|
+
where.push('updatedAt >= ?');
|
|
102
|
+
vals.push(f.since.getTime());
|
|
103
|
+
}
|
|
104
|
+
return this.all(`SELECT * FROM agentic_threads${where.length ? ` WHERE ${where.join(' AND ')}` : ''}` +
|
|
105
|
+
' ORDER BY updatedAt DESC LIMIT ?', ...vals, f.limit ?? 100).map((r) => ({
|
|
106
|
+
id: r.id, state: r.state, model: r.model,
|
|
107
|
+
firstSeenAt: new Date(r.firstSeenAt), updatedAt: new Date(r.updatedAt),
|
|
108
|
+
}));
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
runs = {
|
|
112
|
+
start: async (run) => {
|
|
113
|
+
const startedAt = Date.now();
|
|
114
|
+
this.write('INSERT INTO agentic_runs (id,threadId,parentRunId,depth,agent,model,state,startedAt,prompt,tokenBudget,runState) VALUES (?,?,?,?,?,?,?,?,?,?,?)', run.id, run.threadId, run.parentRunId ?? null, run.depth ?? 0, run.agent, run.model, 'RUNNING', startedAt, run.prompt ?? null, run.tokenBudget ?? null, json(run.runState));
|
|
115
|
+
return this.toRun({
|
|
116
|
+
...run, parentRunId: run.parentRunId ?? null, depth: run.depth ?? 0,
|
|
117
|
+
state: 'RUNNING', startedAt, attempts: 0, steps: 0,
|
|
118
|
+
inputTokens: 0, cachedInputTokens: 0, outputTokens: 0, totalTokens: 0,
|
|
119
|
+
});
|
|
120
|
+
},
|
|
121
|
+
patch: async (runId, patch) => {
|
|
122
|
+
const cols = [];
|
|
123
|
+
const vals = [];
|
|
124
|
+
for (const [k, v] of Object.entries(patch)) {
|
|
125
|
+
if (v === undefined)
|
|
126
|
+
continue;
|
|
127
|
+
cols.push(`${k} = ?`);
|
|
128
|
+
vals.push(v instanceof Date ? v.getTime() : k === 'result' ? json(v) : v);
|
|
129
|
+
}
|
|
130
|
+
if (cols.length === 0)
|
|
131
|
+
return;
|
|
132
|
+
this.write(`UPDATE agentic_runs SET ${cols.join(', ')} WHERE id = ?`, ...vals, runId);
|
|
133
|
+
},
|
|
134
|
+
get: async (runId) => {
|
|
135
|
+
const r = this.one('SELECT * FROM agentic_runs WHERE id = ?', runId);
|
|
136
|
+
return r ? this.toRun(r) : null;
|
|
137
|
+
},
|
|
138
|
+
listByThread: async (threadId) => this.all('SELECT * FROM agentic_runs WHERE threadId = ? ORDER BY startedAt DESC', threadId)
|
|
139
|
+
.map(this.toRun),
|
|
140
|
+
list: async (f) => {
|
|
141
|
+
const where = [];
|
|
142
|
+
const vals = [];
|
|
143
|
+
if (f.state?.length) {
|
|
144
|
+
where.push(`state IN (${f.state.map(() => '?').join(',')})`);
|
|
145
|
+
vals.push(...f.state);
|
|
146
|
+
}
|
|
147
|
+
if (f.agent) {
|
|
148
|
+
where.push('agent = ?');
|
|
149
|
+
vals.push(f.agent);
|
|
150
|
+
}
|
|
151
|
+
if (f.threadId) {
|
|
152
|
+
where.push('threadId = ?');
|
|
153
|
+
vals.push(f.threadId);
|
|
154
|
+
}
|
|
155
|
+
if (f.since) {
|
|
156
|
+
where.push('startedAt >= ?');
|
|
157
|
+
vals.push(f.since.getTime());
|
|
158
|
+
}
|
|
159
|
+
if (f.until) {
|
|
160
|
+
where.push('startedAt <= ?');
|
|
161
|
+
vals.push(f.until.getTime());
|
|
162
|
+
}
|
|
163
|
+
return this.all(`SELECT * FROM agentic_runs${where.length ? ` WHERE ${where.join(' AND ')}` : ''}` +
|
|
164
|
+
' ORDER BY startedAt DESC LIMIT ?', ...vals, f.limit ?? 100).map(this.toRun);
|
|
165
|
+
},
|
|
166
|
+
countByState: async () => Object.fromEntries(this.all('SELECT state, COUNT(*) AS n FROM agentic_runs GROUP BY state')
|
|
167
|
+
.map((r) => [r.state, r.n])),
|
|
168
|
+
};
|
|
169
|
+
steps = {
|
|
170
|
+
record: async (s) => {
|
|
171
|
+
this.write('INSERT INTO agentic_steps (runId,threadId,agentId,"index",durationMs,finishReason,inputTokens,cachedInputTokens,outputTokens,totalTokens,tools,text,toolCalls,at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)', s.runId, s.threadId, s.agentId, s.index, s.durationMs, s.finishReason, s.inputTokens, s.cachedInputTokens, s.outputTokens, s.totalTokens, json(s.tools), s.text ?? null, json(s.toolCalls), (s.at ?? new Date()).getTime());
|
|
172
|
+
},
|
|
173
|
+
listByRun: async (runId) => this.all('SELECT * FROM agentic_steps WHERE runId = ? ORDER BY "index"', runId)
|
|
174
|
+
.map(this.toStep),
|
|
175
|
+
listByThread: async (threadId) => this.all('SELECT * FROM agentic_steps WHERE threadId = ? ORDER BY at', threadId)
|
|
176
|
+
.map(this.toStep),
|
|
177
|
+
};
|
|
178
|
+
toStep = (r) => ({
|
|
179
|
+
runId: r.runId, threadId: r.threadId ?? '', agentId: r.agentId ?? null, index: r.index,
|
|
180
|
+
durationMs: r.durationMs, finishReason: r.finishReason,
|
|
181
|
+
inputTokens: r.inputTokens, cachedInputTokens: r.cachedInputTokens,
|
|
182
|
+
outputTokens: r.outputTokens, totalTokens: r.totalTokens,
|
|
183
|
+
tools: parse(r.tools) ?? [], text: r.text ?? null,
|
|
184
|
+
toolCalls: parse(r.toolCalls) ?? [], at: new Date(r.at),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/admin/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { RuntimePorts } from '../ports/runtime.js';
|
|
2
|
+
import type { RunFilter, StepRecord } from '../ports/admin.js';
|
|
3
|
+
import type { AgentEvent, ExecutionState, RunRecord, UsageTotals } from './types.js';
|
|
4
|
+
/** One completed loop iteration, read back off the event log (§2.9). */
|
|
5
|
+
export interface Percentiles {
|
|
6
|
+
p50: number;
|
|
7
|
+
p95: number;
|
|
8
|
+
max: number;
|
|
9
|
+
}
|
|
10
|
+
export interface RunStats {
|
|
11
|
+
total: number;
|
|
12
|
+
byState: Partial<Record<ExecutionState, number>>;
|
|
13
|
+
byStopReason: Record<string, number>;
|
|
14
|
+
tokens: UsageTotals;
|
|
15
|
+
/** Wall time from enqueue to finish, over runs that ended. A parked run
|
|
16
|
+
* legitimately includes however long the human took (§2.5). */
|
|
17
|
+
duration: Percentiles | null;
|
|
18
|
+
/** Time spent waiting for a worker — the backlog signal (§2.8). */
|
|
19
|
+
queued: Percentiles | null;
|
|
20
|
+
failed: number;
|
|
21
|
+
}
|
|
22
|
+
export interface AdminOverview {
|
|
23
|
+
runs: RunStats;
|
|
24
|
+
/** Threads by state, from the platform's own view — never a read of the
|
|
25
|
+
* caller's database (§2.9). */
|
|
26
|
+
threads: Partial<Record<ExecutionState, number>>;
|
|
27
|
+
/** Every run ever, by state, unbounded by the stats window. */
|
|
28
|
+
runsByState: Partial<Record<ExecutionState, number>>;
|
|
29
|
+
/** Runs still in flight, newest first. */
|
|
30
|
+
active: RunRecord[];
|
|
31
|
+
}
|
|
32
|
+
/** A thread with its runs rolled up (§2.9) — what a listing needs to rank and
|
|
33
|
+
* compare threads without opening each one. */
|
|
34
|
+
export interface ThreadSummary {
|
|
35
|
+
id: string;
|
|
36
|
+
state: ExecutionState;
|
|
37
|
+
model: string;
|
|
38
|
+
firstSeenAt: Date;
|
|
39
|
+
updatedAt: Date;
|
|
40
|
+
/** Runs on this thread, nested ones included. */
|
|
41
|
+
runs: number;
|
|
42
|
+
steps: number;
|
|
43
|
+
tokens: UsageTotals;
|
|
44
|
+
/** Summed run durations. Not wall time: nested runs overlap their parent. */
|
|
45
|
+
durationMs: number;
|
|
46
|
+
/** What started it — the first dispatched run's prompt. */
|
|
47
|
+
prompt?: string | null;
|
|
48
|
+
}
|
|
49
|
+
/** A thread opened up: its runs, and every step across them in order. */
|
|
50
|
+
export interface ThreadDetail {
|
|
51
|
+
thread: ThreadSummary;
|
|
52
|
+
runs: RunRecord[];
|
|
53
|
+
steps: StepRecord[];
|
|
54
|
+
}
|
|
55
|
+
/** Everything about one run, assembled for a timeline view. */
|
|
56
|
+
export interface RunDetail {
|
|
57
|
+
run: RunRecord;
|
|
58
|
+
steps: StepRecord[];
|
|
59
|
+
/** Nested runs spawned beneath it (§2.7) — the same RunRecord shape. */
|
|
60
|
+
subagents: RunRecord[];
|
|
61
|
+
/** The run's events with CHUNKs stripped — the readable spine, not the
|
|
62
|
+
* token-by-token firehose. */
|
|
63
|
+
events: AgentEvent[];
|
|
64
|
+
}
|
|
65
|
+
export declare function summarise(runs: RunRecord[]): RunStats;
|
|
66
|
+
export declare function listRuns(deps: RuntimePorts, filter?: RunFilter): Promise<RunRecord[]>;
|
|
67
|
+
export declare function runStats(deps: RuntimePorts, range?: {
|
|
68
|
+
since?: Date;
|
|
69
|
+
until?: Date;
|
|
70
|
+
limit?: number;
|
|
71
|
+
}): Promise<RunStats>;
|
|
72
|
+
export declare function overview(deps: RuntimePorts, range?: {
|
|
73
|
+
since?: Date;
|
|
74
|
+
}): Promise<AdminOverview>;
|
|
75
|
+
/** A run's steps, in order (§2.9). Rows in the platform's own store rather
|
|
76
|
+
* than a scan of the caller's event log. */
|
|
77
|
+
export declare function listSteps(deps: RuntimePorts, runId: string): Promise<StepRecord[]>;
|
|
78
|
+
/** Threads with their runs rolled up, newest activity first (§2.9). One pass
|
|
79
|
+
* over the window's runs rather than a query per thread. */
|
|
80
|
+
export declare function listThreads(deps: RuntimePorts, filter?: {
|
|
81
|
+
state?: ExecutionState[];
|
|
82
|
+
since?: Date;
|
|
83
|
+
limit?: number;
|
|
84
|
+
}): Promise<ThreadSummary[]>;
|
|
85
|
+
/** One thread opened up: its runs and every step across them (§2.9). */
|
|
86
|
+
export declare function getThread(deps: RuntimePorts, threadId: string): Promise<ThreadDetail | null>;
|
|
87
|
+
export declare function getRun(deps: RuntimePorts, runId: string): Promise<RunDetail | null>;
|
|
88
|
+
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../src/core/admin.ts"],"names":[],"mappings":"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"}
|