@intentface/latch-drizzle 0.9.1
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 +36 -0
- package/dist/adapter.d.ts +18 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +33 -0
- package/dist/adapter.js.map +1 -0
- package/dist/adapter.pg.d.ts +10 -0
- package/dist/adapter.pg.d.ts.map +1 -0
- package/dist/adapter.pg.js +18 -0
- package/dist/adapter.pg.js.map +1 -0
- package/dist/adapter.shared.d.ts +55 -0
- package/dist/adapter.shared.d.ts.map +1 -0
- package/dist/adapter.shared.js +527 -0
- package/dist/adapter.shared.js.map +1 -0
- package/dist/agent-store.d.ts +34 -0
- package/dist/agent-store.d.ts.map +1 -0
- package/dist/agent-store.js +236 -0
- package/dist/agent-store.js.map +1 -0
- package/dist/agent-store.smoke.d.ts +2 -0
- package/dist/agent-store.smoke.d.ts.map +1 -0
- package/dist/agent-store.smoke.js +77 -0
- package/dist/agent-store.smoke.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/limit-store.d.ts +5 -0
- package/dist/limit-store.d.ts.map +1 -0
- package/dist/limit-store.js +7 -0
- package/dist/limit-store.js.map +1 -0
- package/dist/limit-store.pg.d.ts +5 -0
- package/dist/limit-store.pg.d.ts.map +1 -0
- package/dist/limit-store.pg.js +7 -0
- package/dist/limit-store.pg.js.map +1 -0
- package/dist/limit-store.shared.d.ts +14 -0
- package/dist/limit-store.shared.d.ts.map +1 -0
- package/dist/limit-store.shared.js +60 -0
- package/dist/limit-store.shared.js.map +1 -0
- package/dist/limit-store.smoke.shared.d.ts +7 -0
- package/dist/limit-store.smoke.shared.d.ts.map +1 -0
- package/dist/limit-store.smoke.shared.js +33 -0
- package/dist/limit-store.smoke.shared.js.map +1 -0
- package/dist/memory-job-store.d.ts +5 -0
- package/dist/memory-job-store.d.ts.map +1 -0
- package/dist/memory-job-store.js +7 -0
- package/dist/memory-job-store.js.map +1 -0
- package/dist/memory-job-store.pg.d.ts +5 -0
- package/dist/memory-job-store.pg.d.ts.map +1 -0
- package/dist/memory-job-store.pg.js +7 -0
- package/dist/memory-job-store.pg.js.map +1 -0
- package/dist/memory-job-store.shared.d.ts +23 -0
- package/dist/memory-job-store.shared.d.ts.map +1 -0
- package/dist/memory-job-store.shared.js +294 -0
- package/dist/memory-job-store.shared.js.map +1 -0
- package/dist/memory-job-store.smoke.shared.d.ts +18 -0
- package/dist/memory-job-store.smoke.shared.d.ts.map +1 -0
- package/dist/memory-job-store.smoke.shared.js +149 -0
- package/dist/memory-job-store.smoke.shared.js.map +1 -0
- package/dist/migrate.d.ts +10 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +202 -0
- package/dist/migrate.js.map +1 -0
- package/dist/migrate.pg.d.ts +3 -0
- package/dist/migrate.pg.d.ts.map +1 -0
- package/dist/migrate.pg.js +120 -0
- package/dist/migrate.pg.js.map +1 -0
- package/dist/run-lease.smoke.shared.d.ts +13 -0
- package/dist/run-lease.smoke.shared.d.ts.map +1 -0
- package/dist/run-lease.smoke.shared.js +65 -0
- package/dist/run-lease.smoke.shared.js.map +1 -0
- package/dist/schedule.smoke.shared.d.ts +16 -0
- package/dist/schedule.smoke.shared.d.ts.map +1 -0
- package/dist/schedule.smoke.shared.js +104 -0
- package/dist/schedule.smoke.shared.js.map +1 -0
- package/dist/schema.d.ts +2348 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +225 -0
- package/dist/schema.js.map +1 -0
- package/dist/schema.pg.d.ts +2215 -0
- package/dist/schema.pg.d.ts.map +1 -0
- package/dist/schema.pg.js +197 -0
- package/dist/schema.pg.js.map +1 -0
- package/dist/secret-store.d.ts +11 -0
- package/dist/secret-store.d.ts.map +1 -0
- package/dist/secret-store.js +11 -0
- package/dist/secret-store.js.map +1 -0
- package/dist/secret-store.pg.d.ts +6 -0
- package/dist/secret-store.pg.d.ts.map +1 -0
- package/dist/secret-store.pg.js +7 -0
- package/dist/secret-store.pg.js.map +1 -0
- package/dist/secret-store.shared.d.ts +25 -0
- package/dist/secret-store.shared.d.ts.map +1 -0
- package/dist/secret-store.shared.js +67 -0
- package/dist/secret-store.shared.js.map +1 -0
- package/dist/smoke.d.ts +2 -0
- package/dist/smoke.d.ts.map +1 -0
- package/dist/smoke.js +108 -0
- package/dist/smoke.js.map +1 -0
- package/dist/smoke.pg.d.ts +2 -0
- package/dist/smoke.pg.d.ts.map +1 -0
- package/dist/smoke.pg.js +107 -0
- package/dist/smoke.pg.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { sql } from "drizzle-orm";
|
|
2
|
+
import { sqliteTable, text, integer, real, index, primaryKey, uniqueIndex, } from "drizzle-orm/sqlite-core";
|
|
3
|
+
/** The v1 tables. `messages` is the source of truth; parts + metadata are JSON. */
|
|
4
|
+
export const chats = sqliteTable("latch_chats", {
|
|
5
|
+
id: text("id").primaryKey(),
|
|
6
|
+
/** Opaque ownership key derived from the principal (e.g. `tenant/user`). */
|
|
7
|
+
owner: text("owner").notNull(),
|
|
8
|
+
agent: text("agent").notNull(),
|
|
9
|
+
title: text("title"),
|
|
10
|
+
/** Chat kind: 'user' (default) vs 'internal' sub-threads (ChatRecord.kind). */
|
|
11
|
+
kind: text("kind").notNull().default("user"),
|
|
12
|
+
createdAt: integer("created_at").notNull(),
|
|
13
|
+
updatedAt: integer("updated_at").notNull(),
|
|
14
|
+
}, (t) => [
|
|
15
|
+
index("latch_chats_owner_idx").on(t.owner),
|
|
16
|
+
// The memory sweep enumerates idle chats system-wide (no owner filter).
|
|
17
|
+
index("latch_chats_sweep_idx").on(t.kind, t.updatedAt),
|
|
18
|
+
]);
|
|
19
|
+
export const messages = sqliteTable("latch_messages", {
|
|
20
|
+
id: text("id").notNull(),
|
|
21
|
+
chatId: text("chat_id").notNull(),
|
|
22
|
+
runId: text("run_id"),
|
|
23
|
+
seq: integer("seq").notNull(),
|
|
24
|
+
role: text("role").notNull(),
|
|
25
|
+
/** UIMessagePart[] */
|
|
26
|
+
parts: text("parts", { mode: "json" }).notNull(),
|
|
27
|
+
/** AppMetadata */
|
|
28
|
+
metadata: text("metadata", { mode: "json" }),
|
|
29
|
+
createdAt: integer("created_at").notNull(),
|
|
30
|
+
}, (t) => [
|
|
31
|
+
// Message ids are client/stream-generated, so they're only unique WITHIN a
|
|
32
|
+
// chat — a global PK on `id` would let an upsert in one chat overwrite a
|
|
33
|
+
// same-id row in another owner's chat. Scope the identity to the chat.
|
|
34
|
+
primaryKey({ columns: [t.chatId, t.id] }),
|
|
35
|
+
// One row per (chat, seq): guards concurrent appenders computing the same
|
|
36
|
+
// next seq. Doubles as the (chat_id, seq) read-ordering index.
|
|
37
|
+
uniqueIndex("latch_messages_chat_seq_idx").on(t.chatId, t.seq),
|
|
38
|
+
]);
|
|
39
|
+
export const runs = sqliteTable("latch_runs", {
|
|
40
|
+
id: text("id").primaryKey(),
|
|
41
|
+
chatId: text("chat_id").notNull(),
|
|
42
|
+
agent: text("agent").notNull(),
|
|
43
|
+
status: text("status").notNull(),
|
|
44
|
+
/** Serialized Principal blob — rebuilt on resume/cron (no request). */
|
|
45
|
+
identity: text("identity", { mode: "json" }),
|
|
46
|
+
leaseOwner: text("lease_owner"),
|
|
47
|
+
leaseExpiresAt: integer("lease_expires_at"),
|
|
48
|
+
fencingToken: integer("fencing_token"),
|
|
49
|
+
heartbeatAt: integer("heartbeat_at"),
|
|
50
|
+
attempt: integer("attempt"),
|
|
51
|
+
usageInputTokens: integer("usage_input_tokens"),
|
|
52
|
+
usageOutputTokens: integer("usage_output_tokens"),
|
|
53
|
+
usageCacheReadTokens: integer("usage_cache_read_tokens"),
|
|
54
|
+
usageCacheWriteTokens: integer("usage_cache_write_tokens"),
|
|
55
|
+
costTotal: real("cost_total"),
|
|
56
|
+
/** Run kind: 'turn' (default) vs 'compaction' — keeps cache/hit-rate stats clean. */
|
|
57
|
+
kind: text("kind"),
|
|
58
|
+
/** Opaque fingerprint of the sorted tool names this turn sent (see
|
|
59
|
+
* `toolsetHash`) — detects toolset churn. */
|
|
60
|
+
toolsHash: text("tools_hash"),
|
|
61
|
+
error: text("error"),
|
|
62
|
+
startedAt: integer("started_at").notNull(),
|
|
63
|
+
endedAt: integer("ended_at"),
|
|
64
|
+
}, (t) => [
|
|
65
|
+
index("latch_runs_chat_idx").on(t.chatId),
|
|
66
|
+
index("latch_runs_reaper_idx").on(t.status, t.leaseExpiresAt),
|
|
67
|
+
// One ACTIVE run per chat — the concurrency invariant (see ChatBusyError).
|
|
68
|
+
uniqueIndex("latch_runs_one_active_per_chat").on(t.chatId).where(sql `status = 'active'`),
|
|
69
|
+
]);
|
|
70
|
+
/** Envelope-encrypted connection credentials. No plaintext is ever stored. */
|
|
71
|
+
export const secrets = sqliteTable("latch_secrets", {
|
|
72
|
+
/** `${ownerKey}:${key}` — stable composite id. */
|
|
73
|
+
id: text("id").primaryKey(),
|
|
74
|
+
/** Opaque ownership key derived from the principal. */
|
|
75
|
+
owner: text("owner").notNull(),
|
|
76
|
+
key: text("key").notNull(),
|
|
77
|
+
ciphertext: text("ciphertext").notNull(),
|
|
78
|
+
iv: text("iv").notNull(),
|
|
79
|
+
wrappedDek: text("wrapped_dek").notNull(),
|
|
80
|
+
dekIv: text("dek_iv").notNull(),
|
|
81
|
+
createdAt: integer("created_at").notNull(),
|
|
82
|
+
updatedAt: integer("updated_at").notNull(),
|
|
83
|
+
}, (t) => [index("latch_secrets_owner_idx").on(t.owner)]);
|
|
84
|
+
export const usage = sqliteTable("latch_usage", {
|
|
85
|
+
id: text("id").primaryKey(),
|
|
86
|
+
/** Opaque ownership key derived from the principal. */
|
|
87
|
+
owner: text("owner").notNull(),
|
|
88
|
+
runId: text("run_id").notNull(),
|
|
89
|
+
model: text("model").notNull(),
|
|
90
|
+
inputTokens: integer("input_tokens").notNull(),
|
|
91
|
+
outputTokens: integer("output_tokens").notNull(),
|
|
92
|
+
cacheReadTokens: integer("cache_read_tokens"),
|
|
93
|
+
cacheWriteTokens: integer("cache_write_tokens"),
|
|
94
|
+
cost: real("cost").notNull(),
|
|
95
|
+
createdAt: integer("created_at").notNull(),
|
|
96
|
+
}, (t) => [index("latch_usage_owner_idx").on(t.owner)]);
|
|
97
|
+
/**
|
|
98
|
+
* Builder/editor-created agents (see `@intentface/latch-agent-builder`'s
|
|
99
|
+
* `AgentRecord`). Owner-keyed for org/personal scope; config isn't secret.
|
|
100
|
+
* Same table shape latch-platform's libsql store uses, so hosts can share DBs.
|
|
101
|
+
*/
|
|
102
|
+
export const agents = sqliteTable("latch_agents", {
|
|
103
|
+
id: text("id").primaryKey(),
|
|
104
|
+
/** Opaque ownership key derived from (principal, scope). */
|
|
105
|
+
owner: text("owner").notNull(),
|
|
106
|
+
name: text("name").notNull(),
|
|
107
|
+
title: text("title"),
|
|
108
|
+
description: text("description"),
|
|
109
|
+
modelId: text("model_id").notNull(),
|
|
110
|
+
instructions: text("instructions").notNull(),
|
|
111
|
+
/** string[] — connection names. */
|
|
112
|
+
connections: text("connections", { mode: "json" }).notNull(),
|
|
113
|
+
/** AgentRecord["tools"] — per-tool selection/approval overrides. */
|
|
114
|
+
tools: text("tools", { mode: "json" }),
|
|
115
|
+
/** AgentRecord["exec"] — code-execution capabilities. */
|
|
116
|
+
exec: text("exec", { mode: "json" }),
|
|
117
|
+
/** string[] — delegate agent names. */
|
|
118
|
+
subagents: text("subagents", { mode: "json" }),
|
|
119
|
+
/** AgentRecord["attachedEvals"] — online judge rubrics (host eval feature). */
|
|
120
|
+
attachedEvals: text("attached_evals", { mode: "json" }),
|
|
121
|
+
/** NULL=default, 0=unlimited, N=cap (AgentRecord["maxSteps"]). */
|
|
122
|
+
maxSteps: integer("max_steps"),
|
|
123
|
+
scope: text("scope").notNull(),
|
|
124
|
+
createdAt: integer("created_at").notNull(),
|
|
125
|
+
updatedAt: integer("updated_at").notNull(),
|
|
126
|
+
}, (t) => [uniqueIndex("latch_agents_owner_name").on(t.owner, t.name)]);
|
|
127
|
+
/**
|
|
128
|
+
* Memory-sweep state, per chat: which messages have been extracted into
|
|
129
|
+
* episodic memory. Lease columns mirror `latch_schedules` (claim/complete,
|
|
130
|
+
* fenced by lease owner). `next_eligible_at` ALWAYS advances on completion —
|
|
131
|
+
* success or failure — so a broken chat can't hot-loop the sweep.
|
|
132
|
+
*/
|
|
133
|
+
export const memoryChatState = sqliteTable("latch_memory_chat_state", {
|
|
134
|
+
chatId: text("chat_id").primaryKey(),
|
|
135
|
+
owner: text("owner").notNull(),
|
|
136
|
+
agent: text("agent").notNull(),
|
|
137
|
+
scopeKey: text("scope_key").notNull(),
|
|
138
|
+
/** Last message seq folded into an episode (-1 = never). */
|
|
139
|
+
lastExtractedSeq: integer("last_extracted_seq").notNull().default(-1),
|
|
140
|
+
/** Idempotency key of the last COMPLETED run (content hash + prompt version). */
|
|
141
|
+
lastExtractedKey: text("last_extracted_key"),
|
|
142
|
+
nextEligibleAt: integer("next_eligible_at").notNull().default(0),
|
|
143
|
+
failures: integer("failures").notNull().default(0),
|
|
144
|
+
leaseOwner: text("lease_owner"),
|
|
145
|
+
leaseExpiresAt: integer("lease_expires_at"),
|
|
146
|
+
createdAt: integer("created_at").notNull(),
|
|
147
|
+
updatedAt: integer("updated_at").notNull(),
|
|
148
|
+
}, (t) => [index("latch_memory_chat_state_scope_idx").on(t.scopeKey)]);
|
|
149
|
+
/**
|
|
150
|
+
* Memory-sweep state, per scope: consolidation cooldown/watermark/lease plus
|
|
151
|
+
* the pending episode paths written since the last successful consolidation.
|
|
152
|
+
* `identity` is the serialized principal captured at the last episode write —
|
|
153
|
+
* consolidation runs under the scope's own reconstructed caller.
|
|
154
|
+
*/
|
|
155
|
+
export const memoryScopeState = sqliteTable("latch_memory_scope_state", {
|
|
156
|
+
/** `${connection}:${root}` (see `@intentface/latch-memory` ScopeRef). */
|
|
157
|
+
scopeKey: text("scope_key").primaryKey(),
|
|
158
|
+
owner: text("owner").notNull(),
|
|
159
|
+
agent: text("agent").notNull(),
|
|
160
|
+
connection: text("connection").notNull(),
|
|
161
|
+
identity: text("identity", { mode: "json" }),
|
|
162
|
+
hasNew: integer("has_new").notNull().default(0),
|
|
163
|
+
/** JSON string[] of episode paths awaiting consolidation (bounded). */
|
|
164
|
+
pendingEpisodes: text("pending_episodes", { mode: "json" }),
|
|
165
|
+
/** Last episode NAME folded in — names sort chronologically. */
|
|
166
|
+
consolidationWatermark: text("consolidation_watermark"),
|
|
167
|
+
lastConsolidatedAt: integer("last_consolidated_at"),
|
|
168
|
+
nextEligibleAt: integer("next_eligible_at").notNull().default(0),
|
|
169
|
+
failures: integer("failures").notNull().default(0),
|
|
170
|
+
leaseOwner: text("lease_owner"),
|
|
171
|
+
leaseExpiresAt: integer("lease_expires_at"),
|
|
172
|
+
createdAt: integer("created_at").notNull(),
|
|
173
|
+
updatedAt: integer("updated_at").notNull(),
|
|
174
|
+
}, (t) => [index("latch_memory_scope_due_idx").on(t.hasNew, t.nextEligibleAt)]);
|
|
175
|
+
/**
|
|
176
|
+
* Recall tracking: bumped whenever `memory_search` surfaces an entry/episode.
|
|
177
|
+
* Retention signal — entries unrecalled for N days become expiry candidates.
|
|
178
|
+
*/
|
|
179
|
+
export const memoryUsage = sqliteTable("latch_memory_usage", {
|
|
180
|
+
scopeKey: text("scope_key").notNull(),
|
|
181
|
+
/** `[m-…]` entry id or an episode path. */
|
|
182
|
+
memoryId: text("memory_id").notNull(),
|
|
183
|
+
usageCount: integer("usage_count").notNull().default(0),
|
|
184
|
+
lastUsedAt: integer("last_used_at"),
|
|
185
|
+
createdAt: integer("created_at").notNull(),
|
|
186
|
+
}, (t) => [primaryKey({ columns: [t.scopeKey, t.memoryId] })]);
|
|
187
|
+
/** Limit counters: one row per (key, fixed window) — see `limits.ts` in core. */
|
|
188
|
+
export const limitCounters = sqliteTable("latch_limit_counters", {
|
|
189
|
+
key: text("key").notNull(),
|
|
190
|
+
windowStart: integer("window_start").notNull(),
|
|
191
|
+
windowMs: integer("window_ms").notNull(),
|
|
192
|
+
turns: integer("turns").notNull().default(0),
|
|
193
|
+
tokens: integer("tokens").notNull().default(0),
|
|
194
|
+
cost: real("cost").notNull().default(0),
|
|
195
|
+
updatedAt: integer("updated_at").notNull(),
|
|
196
|
+
},
|
|
197
|
+
// `windowMs` is part of the identity: the same key may carry a per-minute and
|
|
198
|
+
// a per-day policy, whose aligned windows share a start on the hour.
|
|
199
|
+
(t) => [primaryKey({ columns: [t.key, t.windowStart, t.windowMs] })]);
|
|
200
|
+
/** Cron-driven agent runs. Carries the identity blob so a tick can rebuild the caller. */
|
|
201
|
+
export const schedules = sqliteTable("latch_schedules", {
|
|
202
|
+
id: text("id").primaryKey(),
|
|
203
|
+
owner: text("owner").notNull(),
|
|
204
|
+
agent: text("agent").notNull(),
|
|
205
|
+
identity: text("identity", { mode: "json" }),
|
|
206
|
+
cron: text("cron"),
|
|
207
|
+
timezone: text("timezone"),
|
|
208
|
+
prompt: text("prompt").notNull(),
|
|
209
|
+
/** Host-interpreted delivery target (e.g. a channel), opaque to core. */
|
|
210
|
+
delivery: text("delivery", { mode: "json" }),
|
|
211
|
+
nextRunAt: integer("next_run_at").notNull(),
|
|
212
|
+
lastRunAt: integer("last_run_at"),
|
|
213
|
+
/** Parked-predecessor policy ('skip' | 'fire'); null = the default ('skip'). */
|
|
214
|
+
onParked: text("on_parked"),
|
|
215
|
+
/** Chat of the last default-path fire (see StorageAdapter.noteScheduleFire). */
|
|
216
|
+
lastChatId: text("last_chat_id"),
|
|
217
|
+
enabled: integer("enabled").notNull(),
|
|
218
|
+
leaseOwner: text("lease_owner"),
|
|
219
|
+
leaseExpiresAt: integer("lease_expires_at"),
|
|
220
|
+
createdAt: integer("created_at").notNull(),
|
|
221
|
+
}, (t) => [
|
|
222
|
+
index("latch_schedules_owner_idx").on(t.owner),
|
|
223
|
+
index("latch_schedules_due_idx").on(t.enabled, t.nextRunAt),
|
|
224
|
+
]);
|
|
225
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|