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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/adapters/inline.d.ts +27 -0
  4. package/dist/adapters/inline.d.ts.map +1 -0
  5. package/dist/adapters/inline.js +41 -0
  6. package/dist/adapters/inline.js.map +1 -0
  7. package/dist/adapters/memory.d.ts +74 -0
  8. package/dist/adapters/memory.d.ts.map +1 -0
  9. package/dist/adapters/memory.js +194 -0
  10. package/dist/adapters/memory.js.map +1 -0
  11. package/dist/adapters/prisma.d.ts +176 -0
  12. package/dist/adapters/prisma.d.ts.map +1 -0
  13. package/dist/adapters/prisma.js +107 -0
  14. package/dist/adapters/prisma.js.map +1 -0
  15. package/dist/adapters/qstash.d.ts +36 -0
  16. package/dist/adapters/qstash.d.ts.map +1 -0
  17. package/dist/adapters/qstash.js +26 -0
  18. package/dist/adapters/qstash.js.map +1 -0
  19. package/dist/adapters/redis.d.ts +49 -0
  20. package/dist/adapters/redis.d.ts.map +1 -0
  21. package/dist/adapters/redis.js +60 -0
  22. package/dist/adapters/redis.js.map +1 -0
  23. package/dist/adapters/sqlite.d.ts +67 -0
  24. package/dist/adapters/sqlite.d.ts.map +1 -0
  25. package/dist/adapters/sqlite.js +199 -0
  26. package/dist/adapters/sqlite.js.map +1 -0
  27. package/dist/adapters/upstash.d.ts +48 -0
  28. package/dist/adapters/upstash.d.ts.map +1 -0
  29. package/dist/adapters/upstash.js +46 -0
  30. package/dist/adapters/upstash.js.map +1 -0
  31. package/dist/admin/default.d.ts +15 -0
  32. package/dist/admin/default.d.ts.map +1 -0
  33. package/dist/admin/default.js +22 -0
  34. package/dist/admin/default.js.map +1 -0
  35. package/dist/admin/memory.d.ts +29 -0
  36. package/dist/admin/memory.d.ts.map +1 -0
  37. package/dist/admin/memory.js +83 -0
  38. package/dist/admin/memory.js.map +1 -0
  39. package/dist/admin/postgres.d.ts +43 -0
  40. package/dist/admin/postgres.d.ts.map +1 -0
  41. package/dist/admin/postgres.js +201 -0
  42. package/dist/admin/postgres.js.map +1 -0
  43. package/dist/admin/sqlite.d.ts +35 -0
  44. package/dist/admin/sqlite.d.ts.map +1 -0
  45. package/dist/admin/sqlite.js +187 -0
  46. package/dist/admin/sqlite.js.map +1 -0
  47. package/dist/core/admin.d.ts +88 -0
  48. package/dist/core/admin.d.ts.map +1 -0
  49. package/dist/core/admin.js +147 -0
  50. package/dist/core/admin.js.map +1 -0
  51. package/dist/core/agent.d.ts +29 -0
  52. package/dist/core/agent.d.ts.map +1 -0
  53. package/dist/core/agent.js +41 -0
  54. package/dist/core/agent.js.map +1 -0
  55. package/dist/core/cache.d.ts +37 -0
  56. package/dist/core/cache.d.ts.map +1 -0
  57. package/dist/core/cache.js +68 -0
  58. package/dist/core/cache.js.map +1 -0
  59. package/dist/core/context.d.ts +13 -0
  60. package/dist/core/context.d.ts.map +1 -0
  61. package/dist/core/context.js +87 -0
  62. package/dist/core/context.js.map +1 -0
  63. package/dist/core/deleteThread.d.ts +14 -0
  64. package/dist/core/deleteThread.d.ts.map +1 -0
  65. package/dist/core/deleteThread.js +34 -0
  66. package/dist/core/deleteThread.js.map +1 -0
  67. package/dist/core/engine.d.ts +79 -0
  68. package/dist/core/engine.d.ts.map +1 -0
  69. package/dist/core/engine.js +489 -0
  70. package/dist/core/engine.js.map +1 -0
  71. package/dist/core/follow.d.ts +50 -0
  72. package/dist/core/follow.d.ts.map +1 -0
  73. package/dist/core/follow.js +153 -0
  74. package/dist/core/follow.js.map +1 -0
  75. package/dist/core/hitl.d.ts +98 -0
  76. package/dist/core/hitl.d.ts.map +1 -0
  77. package/dist/core/hitl.js +199 -0
  78. package/dist/core/hitl.js.map +1 -0
  79. package/dist/core/keys.d.ts +26 -0
  80. package/dist/core/keys.d.ts.map +1 -0
  81. package/dist/core/keys.js +32 -0
  82. package/dist/core/keys.js.map +1 -0
  83. package/dist/core/loop.d.ts +105 -0
  84. package/dist/core/loop.d.ts.map +1 -0
  85. package/dist/core/loop.js +234 -0
  86. package/dist/core/loop.js.map +1 -0
  87. package/dist/core/publish.d.ts +18 -0
  88. package/dist/core/publish.d.ts.map +1 -0
  89. package/dist/core/publish.js +34 -0
  90. package/dist/core/publish.js.map +1 -0
  91. package/dist/core/reclaim.d.ts +20 -0
  92. package/dist/core/reclaim.d.ts.map +1 -0
  93. package/dist/core/reclaim.js +56 -0
  94. package/dist/core/reclaim.js.map +1 -0
  95. package/dist/core/run.d.ts +8 -0
  96. package/dist/core/run.d.ts.map +1 -0
  97. package/dist/core/run.js +102 -0
  98. package/dist/core/run.js.map +1 -0
  99. package/dist/core/state.d.ts +50 -0
  100. package/dist/core/state.d.ts.map +1 -0
  101. package/dist/core/state.js +39 -0
  102. package/dist/core/state.js.map +1 -0
  103. package/dist/core/stop.d.ts +7 -0
  104. package/dist/core/stop.d.ts.map +1 -0
  105. package/dist/core/stop.js +15 -0
  106. package/dist/core/stop.js.map +1 -0
  107. package/dist/core/stream.d.ts +12 -0
  108. package/dist/core/stream.d.ts.map +1 -0
  109. package/dist/core/stream.js +21 -0
  110. package/dist/core/stream.js.map +1 -0
  111. package/dist/core/subagent.d.ts +77 -0
  112. package/dist/core/subagent.d.ts.map +1 -0
  113. package/dist/core/subagent.js +261 -0
  114. package/dist/core/subagent.js.map +1 -0
  115. package/dist/core/tools.d.ts +36 -0
  116. package/dist/core/tools.d.ts.map +1 -0
  117. package/dist/core/tools.js +22 -0
  118. package/dist/core/tools.js.map +1 -0
  119. package/dist/core/types.d.ts +286 -0
  120. package/dist/core/types.d.ts.map +1 -0
  121. package/dist/core/types.js +49 -0
  122. package/dist/core/types.js.map +1 -0
  123. package/dist/core/usage.d.ts +40 -0
  124. package/dist/core/usage.d.ts.map +1 -0
  125. package/dist/core/usage.js +43 -0
  126. package/dist/core/usage.js.map +1 -0
  127. package/dist/index.d.ts +25 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +23 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/ports/admin.d.ts +102 -0
  132. package/dist/ports/admin.d.ts.map +1 -0
  133. package/dist/ports/admin.js +2 -0
  134. package/dist/ports/admin.js.map +1 -0
  135. package/dist/ports/bus.d.ts +13 -0
  136. package/dist/ports/bus.d.ts.map +1 -0
  137. package/dist/ports/bus.js +2 -0
  138. package/dist/ports/bus.js.map +1 -0
  139. package/dist/ports/kv.d.ts +16 -0
  140. package/dist/ports/kv.d.ts.map +1 -0
  141. package/dist/ports/kv.js +2 -0
  142. package/dist/ports/kv.js.map +1 -0
  143. package/dist/ports/queue.d.ts +18 -0
  144. package/dist/ports/queue.d.ts.map +1 -0
  145. package/dist/ports/queue.js +2 -0
  146. package/dist/ports/queue.js.map +1 -0
  147. package/dist/ports/runtime.d.ts +260 -0
  148. package/dist/ports/runtime.d.ts.map +1 -0
  149. package/dist/ports/runtime.js +2 -0
  150. package/dist/ports/runtime.js.map +1 -0
  151. package/dist/ports/storage.d.ts +72 -0
  152. package/dist/ports/storage.d.ts.map +1 -0
  153. package/dist/ports/storage.js +2 -0
  154. package/dist/ports/storage.js.map +1 -0
  155. package/dist/runtime.d.ts +5 -0
  156. package/dist/runtime.d.ts.map +1 -0
  157. package/dist/runtime.js +177 -0
  158. package/dist/runtime.js.map +1 -0
  159. 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"}