@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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/adapter.d.ts +18 -0
  4. package/dist/adapter.d.ts.map +1 -0
  5. package/dist/adapter.js +33 -0
  6. package/dist/adapter.js.map +1 -0
  7. package/dist/adapter.pg.d.ts +10 -0
  8. package/dist/adapter.pg.d.ts.map +1 -0
  9. package/dist/adapter.pg.js +18 -0
  10. package/dist/adapter.pg.js.map +1 -0
  11. package/dist/adapter.shared.d.ts +55 -0
  12. package/dist/adapter.shared.d.ts.map +1 -0
  13. package/dist/adapter.shared.js +527 -0
  14. package/dist/adapter.shared.js.map +1 -0
  15. package/dist/agent-store.d.ts +34 -0
  16. package/dist/agent-store.d.ts.map +1 -0
  17. package/dist/agent-store.js +236 -0
  18. package/dist/agent-store.js.map +1 -0
  19. package/dist/agent-store.smoke.d.ts +2 -0
  20. package/dist/agent-store.smoke.d.ts.map +1 -0
  21. package/dist/agent-store.smoke.js +77 -0
  22. package/dist/agent-store.smoke.js.map +1 -0
  23. package/dist/index.d.ts +24 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +22 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/limit-store.d.ts +5 -0
  28. package/dist/limit-store.d.ts.map +1 -0
  29. package/dist/limit-store.js +7 -0
  30. package/dist/limit-store.js.map +1 -0
  31. package/dist/limit-store.pg.d.ts +5 -0
  32. package/dist/limit-store.pg.d.ts.map +1 -0
  33. package/dist/limit-store.pg.js +7 -0
  34. package/dist/limit-store.pg.js.map +1 -0
  35. package/dist/limit-store.shared.d.ts +14 -0
  36. package/dist/limit-store.shared.d.ts.map +1 -0
  37. package/dist/limit-store.shared.js +60 -0
  38. package/dist/limit-store.shared.js.map +1 -0
  39. package/dist/limit-store.smoke.shared.d.ts +7 -0
  40. package/dist/limit-store.smoke.shared.d.ts.map +1 -0
  41. package/dist/limit-store.smoke.shared.js +33 -0
  42. package/dist/limit-store.smoke.shared.js.map +1 -0
  43. package/dist/memory-job-store.d.ts +5 -0
  44. package/dist/memory-job-store.d.ts.map +1 -0
  45. package/dist/memory-job-store.js +7 -0
  46. package/dist/memory-job-store.js.map +1 -0
  47. package/dist/memory-job-store.pg.d.ts +5 -0
  48. package/dist/memory-job-store.pg.d.ts.map +1 -0
  49. package/dist/memory-job-store.pg.js +7 -0
  50. package/dist/memory-job-store.pg.js.map +1 -0
  51. package/dist/memory-job-store.shared.d.ts +23 -0
  52. package/dist/memory-job-store.shared.d.ts.map +1 -0
  53. package/dist/memory-job-store.shared.js +294 -0
  54. package/dist/memory-job-store.shared.js.map +1 -0
  55. package/dist/memory-job-store.smoke.shared.d.ts +18 -0
  56. package/dist/memory-job-store.smoke.shared.d.ts.map +1 -0
  57. package/dist/memory-job-store.smoke.shared.js +149 -0
  58. package/dist/memory-job-store.smoke.shared.js.map +1 -0
  59. package/dist/migrate.d.ts +10 -0
  60. package/dist/migrate.d.ts.map +1 -0
  61. package/dist/migrate.js +202 -0
  62. package/dist/migrate.js.map +1 -0
  63. package/dist/migrate.pg.d.ts +3 -0
  64. package/dist/migrate.pg.d.ts.map +1 -0
  65. package/dist/migrate.pg.js +120 -0
  66. package/dist/migrate.pg.js.map +1 -0
  67. package/dist/run-lease.smoke.shared.d.ts +13 -0
  68. package/dist/run-lease.smoke.shared.d.ts.map +1 -0
  69. package/dist/run-lease.smoke.shared.js +65 -0
  70. package/dist/run-lease.smoke.shared.js.map +1 -0
  71. package/dist/schedule.smoke.shared.d.ts +16 -0
  72. package/dist/schedule.smoke.shared.d.ts.map +1 -0
  73. package/dist/schedule.smoke.shared.js +104 -0
  74. package/dist/schedule.smoke.shared.js.map +1 -0
  75. package/dist/schema.d.ts +2348 -0
  76. package/dist/schema.d.ts.map +1 -0
  77. package/dist/schema.js +225 -0
  78. package/dist/schema.js.map +1 -0
  79. package/dist/schema.pg.d.ts +2215 -0
  80. package/dist/schema.pg.d.ts.map +1 -0
  81. package/dist/schema.pg.js +197 -0
  82. package/dist/schema.pg.js.map +1 -0
  83. package/dist/secret-store.d.ts +11 -0
  84. package/dist/secret-store.d.ts.map +1 -0
  85. package/dist/secret-store.js +11 -0
  86. package/dist/secret-store.js.map +1 -0
  87. package/dist/secret-store.pg.d.ts +6 -0
  88. package/dist/secret-store.pg.d.ts.map +1 -0
  89. package/dist/secret-store.pg.js +7 -0
  90. package/dist/secret-store.pg.js.map +1 -0
  91. package/dist/secret-store.shared.d.ts +25 -0
  92. package/dist/secret-store.shared.d.ts.map +1 -0
  93. package/dist/secret-store.shared.js +67 -0
  94. package/dist/secret-store.shared.js.map +1 -0
  95. package/dist/smoke.d.ts +2 -0
  96. package/dist/smoke.d.ts.map +1 -0
  97. package/dist/smoke.js +108 -0
  98. package/dist/smoke.js.map +1 -0
  99. package/dist/smoke.pg.d.ts +2 -0
  100. package/dist/smoke.pg.d.ts.map +1 -0
  101. package/dist/smoke.pg.js +107 -0
  102. package/dist/smoke.pg.js.map +1 -0
  103. 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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"}