@kindgi/agents 0.0.0-bootstrap.0 → 0.1.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 (240) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +131 -2
  3. package/dist/agent-turn-flow.d.ts +57 -0
  4. package/dist/agent-turn-flow.d.ts.map +1 -0
  5. package/dist/agent-turn-flow.js +172 -0
  6. package/dist/agent-turn-flow.js.map +1 -0
  7. package/dist/conversation-binding.d.ts +111 -0
  8. package/dist/conversation-binding.d.ts.map +1 -0
  9. package/dist/conversation-binding.js +4 -0
  10. package/dist/conversation-binding.js.map +1 -0
  11. package/dist/define.d.ts +180 -0
  12. package/dist/define.d.ts.map +1 -0
  13. package/dist/define.js +361 -0
  14. package/dist/define.js.map +1 -0
  15. package/dist/errors.d.ts +62 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +4 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/guardrails-gate.d.ts +169 -0
  20. package/dist/guardrails-gate.d.ts.map +1 -0
  21. package/dist/guardrails-gate.js +202 -0
  22. package/dist/guardrails-gate.js.map +1 -0
  23. package/dist/handlers/budget-check.d.ts +22 -0
  24. package/dist/handlers/budget-check.d.ts.map +1 -0
  25. package/dist/handlers/budget-check.js +109 -0
  26. package/dist/handlers/budget-check.js.map +1 -0
  27. package/dist/handlers/build-initial-messages.d.ts +17 -0
  28. package/dist/handlers/build-initial-messages.d.ts.map +1 -0
  29. package/dist/handlers/build-initial-messages.js +86 -0
  30. package/dist/handlers/build-initial-messages.js.map +1 -0
  31. package/dist/handlers/compose-result.d.ts +10 -0
  32. package/dist/handlers/compose-result.d.ts.map +1 -0
  33. package/dist/handlers/compose-result.js +79 -0
  34. package/dist/handlers/compose-result.js.map +1 -0
  35. package/dist/handlers/constants.d.ts +8 -0
  36. package/dist/handlers/constants.d.ts.map +1 -0
  37. package/dist/handlers/constants.js +10 -0
  38. package/dist/handlers/constants.js.map +1 -0
  39. package/dist/handlers/context.d.ts +210 -0
  40. package/dist/handlers/context.d.ts.map +1 -0
  41. package/dist/handlers/context.js +4 -0
  42. package/dist/handlers/context.js.map +1 -0
  43. package/dist/handlers/dispatch-tools.d.ts +15 -0
  44. package/dist/handlers/dispatch-tools.d.ts.map +1 -0
  45. package/dist/handlers/dispatch-tools.js +511 -0
  46. package/dist/handlers/dispatch-tools.js.map +1 -0
  47. package/dist/handlers/errors.d.ts +133 -0
  48. package/dist/handlers/errors.d.ts.map +1 -0
  49. package/dist/handlers/errors.js +134 -0
  50. package/dist/handlers/errors.js.map +1 -0
  51. package/dist/handlers/evaluate-guardrails.d.ts +14 -0
  52. package/dist/handlers/evaluate-guardrails.d.ts.map +1 -0
  53. package/dist/handlers/evaluate-guardrails.js +128 -0
  54. package/dist/handlers/evaluate-guardrails.js.map +1 -0
  55. package/dist/handlers/final-iteration.d.ts +7 -0
  56. package/dist/handlers/final-iteration.d.ts.map +1 -0
  57. package/dist/handlers/final-iteration.js +26 -0
  58. package/dist/handlers/final-iteration.js.map +1 -0
  59. package/dist/handlers/index.d.ts +5 -0
  60. package/dist/handlers/index.d.ts.map +1 -0
  61. package/dist/handlers/index.js +41 -0
  62. package/dist/handlers/index.js.map +1 -0
  63. package/dist/handlers/model-call.d.ts +13 -0
  64. package/dist/handlers/model-call.d.ts.map +1 -0
  65. package/dist/handlers/model-call.js +136 -0
  66. package/dist/handlers/model-call.js.map +1 -0
  67. package/dist/handlers/persist-final-message.d.ts +14 -0
  68. package/dist/handlers/persist-final-message.d.ts.map +1 -0
  69. package/dist/handlers/persist-final-message.js +54 -0
  70. package/dist/handlers/persist-final-message.js.map +1 -0
  71. package/dist/handlers/persist-provenance.d.ts +12 -0
  72. package/dist/handlers/persist-provenance.d.ts.map +1 -0
  73. package/dist/handlers/persist-provenance.js +34 -0
  74. package/dist/handlers/persist-provenance.js.map +1 -0
  75. package/dist/handlers/persist-user-message.d.ts +15 -0
  76. package/dist/handlers/persist-user-message.d.ts.map +1 -0
  77. package/dist/handlers/persist-user-message.js +59 -0
  78. package/dist/handlers/persist-user-message.js.map +1 -0
  79. package/dist/handlers/public-types.d.ts +201 -0
  80. package/dist/handlers/public-types.d.ts.map +1 -0
  81. package/dist/handlers/public-types.js +4 -0
  82. package/dist/handlers/public-types.js.map +1 -0
  83. package/dist/handlers/rehydrate.d.ts +8 -0
  84. package/dist/handlers/rehydrate.d.ts.map +1 -0
  85. package/dist/handlers/rehydrate.js +94 -0
  86. package/dist/handlers/rehydrate.js.map +1 -0
  87. package/dist/handlers/render-prompt.d.ts +12 -0
  88. package/dist/handlers/render-prompt.d.ts.map +1 -0
  89. package/dist/handlers/render-prompt.js +41 -0
  90. package/dist/handlers/render-prompt.js.map +1 -0
  91. package/dist/handlers/resolve-tools.d.ts +10 -0
  92. package/dist/handlers/resolve-tools.d.ts.map +1 -0
  93. package/dist/handlers/resolve-tools.js +55 -0
  94. package/dist/handlers/resolve-tools.js.map +1 -0
  95. package/dist/handlers/result-shape.d.ts +94 -0
  96. package/dist/handlers/result-shape.d.ts.map +1 -0
  97. package/dist/handlers/result-shape.js +19 -0
  98. package/dist/handlers/result-shape.js.map +1 -0
  99. package/dist/handlers/run-retrievals.d.ts +10 -0
  100. package/dist/handlers/run-retrievals.d.ts.map +1 -0
  101. package/dist/handlers/run-retrievals.js +64 -0
  102. package/dist/handlers/run-retrievals.js.map +1 -0
  103. package/dist/handlers/run-snapshot.d.ts +4 -0
  104. package/dist/handlers/run-snapshot.d.ts.map +1 -0
  105. package/dist/handlers/run-snapshot.js +26 -0
  106. package/dist/handlers/run-snapshot.js.map +1 -0
  107. package/dist/handlers/setup.d.ts +25 -0
  108. package/dist/handlers/setup.d.ts.map +1 -0
  109. package/dist/handlers/setup.js +231 -0
  110. package/dist/handlers/setup.js.map +1 -0
  111. package/dist/handlers/structured-output.d.ts +38 -0
  112. package/dist/handlers/structured-output.d.ts.map +1 -0
  113. package/dist/handlers/structured-output.js +89 -0
  114. package/dist/handlers/structured-output.js.map +1 -0
  115. package/dist/handlers/tool-errors.d.ts +56 -0
  116. package/dist/handlers/tool-errors.d.ts.map +1 -0
  117. package/dist/handlers/tool-errors.js +73 -0
  118. package/dist/handlers/tool-errors.js.map +1 -0
  119. package/dist/handlers/tool-hitl.d.ts +45 -0
  120. package/dist/handlers/tool-hitl.d.ts.map +1 -0
  121. package/dist/handlers/tool-hitl.js +81 -0
  122. package/dist/handlers/tool-hitl.js.map +1 -0
  123. package/dist/handlers/turn-environment.d.ts +26 -0
  124. package/dist/handlers/turn-environment.d.ts.map +1 -0
  125. package/dist/handlers/turn-environment.js +154 -0
  126. package/dist/handlers/turn-environment.js.map +1 -0
  127. package/dist/hitl-policy.d.ts +45 -0
  128. package/dist/hitl-policy.d.ts.map +1 -0
  129. package/dist/hitl-policy.js +74 -0
  130. package/dist/hitl-policy.js.map +1 -0
  131. package/dist/index.d.ts +31 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +19 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/invoke.d.ts +36 -0
  136. package/dist/invoke.d.ts.map +1 -0
  137. package/dist/invoke.js +228 -0
  138. package/dist/invoke.js.map +1 -0
  139. package/dist/migrations-dir.d.ts +11 -0
  140. package/dist/migrations-dir.d.ts.map +1 -0
  141. package/dist/migrations-dir.js +14 -0
  142. package/dist/migrations-dir.js.map +1 -0
  143. package/dist/project-run-result.d.ts +23 -0
  144. package/dist/project-run-result.d.ts.map +1 -0
  145. package/dist/project-run-result.js +116 -0
  146. package/dist/project-run-result.js.map +1 -0
  147. package/dist/prompt.d.ts +83 -0
  148. package/dist/prompt.d.ts.map +1 -0
  149. package/dist/prompt.js +119 -0
  150. package/dist/prompt.js.map +1 -0
  151. package/dist/provenance-emit.d.ts +44 -0
  152. package/dist/provenance-emit.d.ts.map +1 -0
  153. package/dist/provenance-emit.js +51 -0
  154. package/dist/provenance-emit.js.map +1 -0
  155. package/dist/registry.d.ts +38 -0
  156. package/dist/registry.d.ts.map +1 -0
  157. package/dist/registry.js +125 -0
  158. package/dist/registry.js.map +1 -0
  159. package/dist/retrieval.d.ts +47 -0
  160. package/dist/retrieval.d.ts.map +1 -0
  161. package/dist/retrieval.js +155 -0
  162. package/dist/retrieval.js.map +1 -0
  163. package/dist/run-snapshot-binding.d.ts +77 -0
  164. package/dist/run-snapshot-binding.d.ts.map +1 -0
  165. package/dist/run-snapshot-binding.js +4 -0
  166. package/dist/run-snapshot-binding.js.map +1 -0
  167. package/dist/schema.d.ts +497 -0
  168. package/dist/schema.d.ts.map +1 -0
  169. package/dist/schema.js +133 -0
  170. package/dist/schema.js.map +1 -0
  171. package/dist/streaming.d.ts +118 -0
  172. package/dist/streaming.d.ts.map +1 -0
  173. package/dist/streaming.js +17 -0
  174. package/dist/streaming.js.map +1 -0
  175. package/dist/tenant-policy.d.ts +16 -0
  176. package/dist/tenant-policy.d.ts.map +1 -0
  177. package/dist/tenant-policy.js +77 -0
  178. package/dist/tenant-policy.js.map +1 -0
  179. package/dist/types.d.ts +435 -0
  180. package/dist/types.d.ts.map +1 -0
  181. package/dist/types.js +4 -0
  182. package/dist/types.js.map +1 -0
  183. package/dist/versioning.d.ts +29 -0
  184. package/dist/versioning.d.ts.map +1 -0
  185. package/dist/versioning.js +58 -0
  186. package/dist/versioning.js.map +1 -0
  187. package/migrations/0000_sparkling_talkback.sql +18 -0
  188. package/migrations/0001_tired_warhawk.sql +16 -0
  189. package/migrations/0002_violet_ezekiel.sql +2 -0
  190. package/migrations/meta/0000_snapshot.json +172 -0
  191. package/migrations/meta/0001_snapshot.json +275 -0
  192. package/migrations/meta/0002_snapshot.json +287 -0
  193. package/migrations/meta/_journal.json +27 -0
  194. package/package.json +76 -4
  195. package/src/agent-turn-flow.ts +183 -0
  196. package/src/conversation-binding.ts +147 -0
  197. package/src/define.ts +572 -0
  198. package/src/errors.ts +80 -0
  199. package/src/guardrails-gate.ts +342 -0
  200. package/src/handlers/budget-check.ts +143 -0
  201. package/src/handlers/build-initial-messages.ts +103 -0
  202. package/src/handlers/compose-result.ts +90 -0
  203. package/src/handlers/constants.ts +10 -0
  204. package/src/handlers/context.ts +226 -0
  205. package/src/handlers/dispatch-tools.ts +633 -0
  206. package/src/handlers/errors.ts +282 -0
  207. package/src/handlers/evaluate-guardrails.ts +153 -0
  208. package/src/handlers/final-iteration.ts +30 -0
  209. package/src/handlers/index.ts +63 -0
  210. package/src/handlers/model-call.ts +151 -0
  211. package/src/handlers/persist-final-message.ts +67 -0
  212. package/src/handlers/persist-provenance.ts +39 -0
  213. package/src/handlers/persist-user-message.ts +70 -0
  214. package/src/handlers/public-types.ts +209 -0
  215. package/src/handlers/rehydrate.ts +161 -0
  216. package/src/handlers/render-prompt.ts +46 -0
  217. package/src/handlers/resolve-tools.ts +68 -0
  218. package/src/handlers/result-shape.ts +113 -0
  219. package/src/handlers/run-retrievals.ts +77 -0
  220. package/src/handlers/run-snapshot.ts +44 -0
  221. package/src/handlers/setup.ts +269 -0
  222. package/src/handlers/structured-output.ts +117 -0
  223. package/src/handlers/tool-errors.ts +122 -0
  224. package/src/handlers/tool-hitl.ts +126 -0
  225. package/src/handlers/turn-environment.ts +191 -0
  226. package/src/hitl-policy.ts +128 -0
  227. package/src/index.ts +154 -0
  228. package/src/invoke.ts +299 -0
  229. package/src/migrations-dir.ts +17 -0
  230. package/src/project-run-result.ts +131 -0
  231. package/src/prompt.ts +185 -0
  232. package/src/provenance-emit.ts +100 -0
  233. package/src/registry.ts +164 -0
  234. package/src/retrieval.ts +219 -0
  235. package/src/run-snapshot-binding.ts +87 -0
  236. package/src/schema.ts +154 -0
  237. package/src/streaming.ts +153 -0
  238. package/src/tenant-policy.ts +78 -0
  239. package/src/types.ts +453 -0
  240. package/src/versioning.ts +77 -0
@@ -0,0 +1,497 @@
1
+ /**
2
+ * Agents schema — first-class conversation primitive.
3
+ *
4
+ * A conversation is a durable thread grouping many agent invocations
5
+ * into one user-visible unit. Messages inside a conversation live as
6
+ * memory facts of type `agent-message`, scoped to
7
+ * `threadId = <conversation id>`. This split lets conversation
8
+ * lifecycle (open/close, list, cheap turn-count updates) use a real
9
+ * table while message content inherits memory's versioning +
10
+ * retention + RLS + search infrastructure.
11
+ *
12
+ * `tenant_id` on every table; implementations enable row-level
13
+ * security on `AGENTS_TENANT_SCOPED_TABLES` and run every statement in
14
+ * a tenant-scoped connection so the RLS predicate has context.
15
+ */
16
+ export declare const agentConversations: import("drizzle-orm/pg-core").PgTableWithColumns<{
17
+ name: "agent_conversations";
18
+ schema: undefined;
19
+ columns: {
20
+ id: import("drizzle-orm/pg-core").PgColumn<{
21
+ name: "id";
22
+ tableName: "agent_conversations";
23
+ dataType: "string";
24
+ columnType: "PgUUID";
25
+ data: string;
26
+ driverParam: string;
27
+ notNull: true;
28
+ hasDefault: true;
29
+ isPrimaryKey: true;
30
+ isAutoincrement: false;
31
+ hasRuntimeDefault: false;
32
+ enumValues: undefined;
33
+ baseColumn: never;
34
+ identity: undefined;
35
+ generated: undefined;
36
+ }, {}, {}>;
37
+ tenantId: import("drizzle-orm/pg-core").PgColumn<{
38
+ name: "tenant_id";
39
+ tableName: "agent_conversations";
40
+ dataType: "string";
41
+ columnType: "PgUUID";
42
+ data: string;
43
+ driverParam: string;
44
+ notNull: true;
45
+ hasDefault: false;
46
+ isPrimaryKey: false;
47
+ isAutoincrement: false;
48
+ hasRuntimeDefault: false;
49
+ enumValues: undefined;
50
+ baseColumn: never;
51
+ identity: undefined;
52
+ generated: undefined;
53
+ }, {}, {}>;
54
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
55
+ name: "agent_id";
56
+ tableName: "agent_conversations";
57
+ dataType: "string";
58
+ columnType: "PgText";
59
+ data: string;
60
+ driverParam: string;
61
+ notNull: true;
62
+ hasDefault: false;
63
+ isPrimaryKey: false;
64
+ isAutoincrement: false;
65
+ hasRuntimeDefault: false;
66
+ enumValues: [string, ...string[]];
67
+ baseColumn: never;
68
+ identity: undefined;
69
+ generated: undefined;
70
+ }, {}, {}>;
71
+ agentVersion: import("drizzle-orm/pg-core").PgColumn<{
72
+ name: "agent_version";
73
+ tableName: "agent_conversations";
74
+ dataType: "string";
75
+ columnType: "PgText";
76
+ data: string;
77
+ driverParam: string;
78
+ notNull: true;
79
+ hasDefault: false;
80
+ isPrimaryKey: false;
81
+ isAutoincrement: false;
82
+ hasRuntimeDefault: false;
83
+ enumValues: [string, ...string[]];
84
+ baseColumn: never;
85
+ identity: undefined;
86
+ generated: undefined;
87
+ }, {}, {}>;
88
+ title: import("drizzle-orm/pg-core").PgColumn<{
89
+ name: "title";
90
+ tableName: "agent_conversations";
91
+ dataType: "string";
92
+ columnType: "PgText";
93
+ data: string;
94
+ driverParam: string;
95
+ notNull: true;
96
+ hasDefault: false;
97
+ isPrimaryKey: false;
98
+ isAutoincrement: false;
99
+ hasRuntimeDefault: false;
100
+ enumValues: [string, ...string[]];
101
+ baseColumn: never;
102
+ identity: undefined;
103
+ generated: undefined;
104
+ }, {}, {}>;
105
+ participantId: import("drizzle-orm/pg-core").PgColumn<{
106
+ name: "participant_id";
107
+ tableName: "agent_conversations";
108
+ dataType: "string";
109
+ columnType: "PgText";
110
+ data: string;
111
+ driverParam: string;
112
+ notNull: false;
113
+ hasDefault: false;
114
+ isPrimaryKey: false;
115
+ isAutoincrement: false;
116
+ hasRuntimeDefault: false;
117
+ enumValues: [string, ...string[]];
118
+ baseColumn: never;
119
+ identity: undefined;
120
+ generated: undefined;
121
+ }, {}, {}>;
122
+ scope: import("drizzle-orm/pg-core").PgColumn<{
123
+ name: "scope";
124
+ tableName: "agent_conversations";
125
+ dataType: "json";
126
+ columnType: "PgJsonb";
127
+ data: unknown;
128
+ driverParam: unknown;
129
+ notNull: true;
130
+ hasDefault: false;
131
+ isPrimaryKey: false;
132
+ isAutoincrement: false;
133
+ hasRuntimeDefault: false;
134
+ enumValues: undefined;
135
+ baseColumn: never;
136
+ identity: undefined;
137
+ generated: undefined;
138
+ }, {}, {}>;
139
+ openedAt: import("drizzle-orm/pg-core").PgColumn<{
140
+ name: "opened_at";
141
+ tableName: "agent_conversations";
142
+ dataType: "date";
143
+ columnType: "PgTimestamp";
144
+ data: Date;
145
+ driverParam: string;
146
+ notNull: true;
147
+ hasDefault: true;
148
+ isPrimaryKey: false;
149
+ isAutoincrement: false;
150
+ hasRuntimeDefault: false;
151
+ enumValues: undefined;
152
+ baseColumn: never;
153
+ identity: undefined;
154
+ generated: undefined;
155
+ }, {}, {}>;
156
+ closedAt: import("drizzle-orm/pg-core").PgColumn<{
157
+ name: "closed_at";
158
+ tableName: "agent_conversations";
159
+ dataType: "date";
160
+ columnType: "PgTimestamp";
161
+ data: Date;
162
+ driverParam: string;
163
+ notNull: false;
164
+ hasDefault: false;
165
+ isPrimaryKey: false;
166
+ isAutoincrement: false;
167
+ hasRuntimeDefault: false;
168
+ enumValues: undefined;
169
+ baseColumn: never;
170
+ identity: undefined;
171
+ generated: undefined;
172
+ }, {}, {}>;
173
+ turnCount: import("drizzle-orm/pg-core").PgColumn<{
174
+ name: "turn_count";
175
+ tableName: "agent_conversations";
176
+ dataType: "number";
177
+ columnType: "PgInteger";
178
+ data: number;
179
+ driverParam: string | number;
180
+ notNull: true;
181
+ hasDefault: true;
182
+ isPrimaryKey: false;
183
+ isAutoincrement: false;
184
+ hasRuntimeDefault: false;
185
+ enumValues: undefined;
186
+ baseColumn: never;
187
+ identity: undefined;
188
+ generated: undefined;
189
+ }, {}, {}>;
190
+ lastMessageAt: import("drizzle-orm/pg-core").PgColumn<{
191
+ name: "last_message_at";
192
+ tableName: "agent_conversations";
193
+ dataType: "date";
194
+ columnType: "PgTimestamp";
195
+ data: Date;
196
+ driverParam: string;
197
+ notNull: false;
198
+ hasDefault: false;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: undefined;
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {}>;
207
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
208
+ name: "metadata";
209
+ tableName: "agent_conversations";
210
+ dataType: "json";
211
+ columnType: "PgJsonb";
212
+ data: unknown;
213
+ driverParam: unknown;
214
+ notNull: false;
215
+ hasDefault: false;
216
+ isPrimaryKey: false;
217
+ isAutoincrement: false;
218
+ hasRuntimeDefault: false;
219
+ enumValues: undefined;
220
+ baseColumn: never;
221
+ identity: undefined;
222
+ generated: undefined;
223
+ }, {}, {}>;
224
+ };
225
+ dialect: "pg";
226
+ }>;
227
+ export type AgentConversationRow = typeof agentConversations.$inferSelect;
228
+ export type NewAgentConversationRow = typeof agentConversations.$inferInsert;
229
+ /**
230
+ * `agent_run_snapshots` — reconstruction envelope for a suspended agent
231
+ * turn. Written by the setup handler on the FIRST execution of a run
232
+ * (idempotent via the runId primary key); used by
233
+ * `resumeAgentTurn(runId)` to rebuild the same `InvokeAgentInput` the
234
+ * turn was invoked with — so kernel replay after a HITL waitpoint
235
+ * resolution lands in an identical context.
236
+ *
237
+ * Owned by @kindgi/agents (not the kernel) so the kernel's
238
+ * schema stays generic — the kernel has no notion of agents,
239
+ * conversations, or participant identities.
240
+ *
241
+ * Idempotent insert: `runId` is the PK; implementations insert with
242
+ * `ON CONFLICT (id) DO NOTHING` (or equivalent) so a replay is a
243
+ * no-op. All fields are set at first execution and never modified.
244
+ */
245
+ export declare const agentRunSnapshots: import("drizzle-orm/pg-core").PgTableWithColumns<{
246
+ name: "agent_run_snapshots";
247
+ schema: undefined;
248
+ columns: {
249
+ id: import("drizzle-orm/pg-core").PgColumn<{
250
+ name: "id";
251
+ tableName: "agent_run_snapshots";
252
+ dataType: "string";
253
+ columnType: "PgUUID";
254
+ data: string;
255
+ driverParam: string;
256
+ notNull: true;
257
+ hasDefault: false;
258
+ isPrimaryKey: true;
259
+ isAutoincrement: false;
260
+ hasRuntimeDefault: false;
261
+ enumValues: undefined;
262
+ baseColumn: never;
263
+ identity: undefined;
264
+ generated: undefined;
265
+ }, {}, {}>;
266
+ tenantId: import("drizzle-orm/pg-core").PgColumn<{
267
+ name: "tenant_id";
268
+ tableName: "agent_run_snapshots";
269
+ dataType: "string";
270
+ columnType: "PgUUID";
271
+ data: string;
272
+ driverParam: string;
273
+ notNull: true;
274
+ hasDefault: false;
275
+ isPrimaryKey: false;
276
+ isAutoincrement: false;
277
+ hasRuntimeDefault: false;
278
+ enumValues: undefined;
279
+ baseColumn: never;
280
+ identity: undefined;
281
+ generated: undefined;
282
+ }, {}, {}>;
283
+ projectId: import("drizzle-orm/pg-core").PgColumn<{
284
+ name: "project_id";
285
+ tableName: "agent_run_snapshots";
286
+ dataType: "string";
287
+ columnType: "PgUUID";
288
+ data: string;
289
+ driverParam: string;
290
+ notNull: true;
291
+ hasDefault: false;
292
+ isPrimaryKey: false;
293
+ isAutoincrement: false;
294
+ hasRuntimeDefault: false;
295
+ enumValues: undefined;
296
+ baseColumn: never;
297
+ identity: undefined;
298
+ generated: undefined;
299
+ }, {}, {}>;
300
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
301
+ name: "agent_id";
302
+ tableName: "agent_run_snapshots";
303
+ dataType: "string";
304
+ columnType: "PgText";
305
+ data: string;
306
+ driverParam: string;
307
+ notNull: true;
308
+ hasDefault: false;
309
+ isPrimaryKey: false;
310
+ isAutoincrement: false;
311
+ hasRuntimeDefault: false;
312
+ enumValues: [string, ...string[]];
313
+ baseColumn: never;
314
+ identity: undefined;
315
+ generated: undefined;
316
+ }, {}, {}>;
317
+ agentVersion: import("drizzle-orm/pg-core").PgColumn<{
318
+ name: "agent_version";
319
+ tableName: "agent_run_snapshots";
320
+ dataType: "string";
321
+ columnType: "PgText";
322
+ data: string;
323
+ driverParam: string;
324
+ notNull: true;
325
+ hasDefault: false;
326
+ isPrimaryKey: false;
327
+ isAutoincrement: false;
328
+ hasRuntimeDefault: false;
329
+ enumValues: [string, ...string[]];
330
+ baseColumn: never;
331
+ identity: undefined;
332
+ generated: undefined;
333
+ }, {}, {}>;
334
+ conversationId: import("drizzle-orm/pg-core").PgColumn<{
335
+ name: "conversation_id";
336
+ tableName: "agent_run_snapshots";
337
+ dataType: "string";
338
+ columnType: "PgUUID";
339
+ data: string;
340
+ driverParam: string;
341
+ notNull: true;
342
+ hasDefault: false;
343
+ isPrimaryKey: false;
344
+ isAutoincrement: false;
345
+ hasRuntimeDefault: false;
346
+ enumValues: undefined;
347
+ baseColumn: never;
348
+ identity: undefined;
349
+ generated: undefined;
350
+ }, {}, {}>;
351
+ userMessage: import("drizzle-orm/pg-core").PgColumn<{
352
+ name: "user_message";
353
+ tableName: "agent_run_snapshots";
354
+ dataType: "string";
355
+ columnType: "PgText";
356
+ data: string;
357
+ driverParam: string;
358
+ notNull: true;
359
+ hasDefault: false;
360
+ isPrimaryKey: false;
361
+ isAutoincrement: false;
362
+ hasRuntimeDefault: false;
363
+ enumValues: [string, ...string[]];
364
+ baseColumn: never;
365
+ identity: undefined;
366
+ generated: undefined;
367
+ }, {}, {}>;
368
+ parameters: import("drizzle-orm/pg-core").PgColumn<{
369
+ name: "parameters";
370
+ tableName: "agent_run_snapshots";
371
+ dataType: "json";
372
+ columnType: "PgJsonb";
373
+ data: unknown;
374
+ driverParam: unknown;
375
+ notNull: false;
376
+ hasDefault: false;
377
+ isPrimaryKey: false;
378
+ isAutoincrement: false;
379
+ hasRuntimeDefault: false;
380
+ enumValues: undefined;
381
+ baseColumn: never;
382
+ identity: undefined;
383
+ generated: undefined;
384
+ }, {}, {}>;
385
+ input: import("drizzle-orm/pg-core").PgColumn<{
386
+ name: "input";
387
+ tableName: "agent_run_snapshots";
388
+ dataType: "json";
389
+ columnType: "PgJsonb";
390
+ data: unknown;
391
+ driverParam: unknown;
392
+ notNull: false;
393
+ hasDefault: false;
394
+ isPrimaryKey: false;
395
+ isAutoincrement: false;
396
+ hasRuntimeDefault: false;
397
+ enumValues: undefined;
398
+ baseColumn: never;
399
+ identity: undefined;
400
+ generated: undefined;
401
+ }, {}, {}>;
402
+ participantId: import("drizzle-orm/pg-core").PgColumn<{
403
+ name: "participant_id";
404
+ tableName: "agent_run_snapshots";
405
+ dataType: "string";
406
+ columnType: "PgText";
407
+ data: string;
408
+ driverParam: string;
409
+ notNull: false;
410
+ hasDefault: false;
411
+ isPrimaryKey: false;
412
+ isAutoincrement: false;
413
+ hasRuntimeDefault: false;
414
+ enumValues: [string, ...string[]];
415
+ baseColumn: never;
416
+ identity: undefined;
417
+ generated: undefined;
418
+ }, {}, {}>;
419
+ dryRun: import("drizzle-orm/pg-core").PgColumn<{
420
+ name: "dry_run";
421
+ tableName: "agent_run_snapshots";
422
+ dataType: "number";
423
+ columnType: "PgInteger";
424
+ data: number;
425
+ driverParam: string | number;
426
+ notNull: true;
427
+ hasDefault: true;
428
+ isPrimaryKey: false;
429
+ isAutoincrement: false;
430
+ hasRuntimeDefault: false;
431
+ enumValues: undefined;
432
+ baseColumn: never;
433
+ identity: undefined;
434
+ generated: undefined;
435
+ }, {}, {}>;
436
+ principal: import("drizzle-orm/pg-core").PgColumn<{
437
+ name: "principal";
438
+ tableName: "agent_run_snapshots";
439
+ dataType: "json";
440
+ columnType: "PgJsonb";
441
+ data: unknown;
442
+ driverParam: unknown;
443
+ notNull: false;
444
+ hasDefault: false;
445
+ isPrimaryKey: false;
446
+ isAutoincrement: false;
447
+ hasRuntimeDefault: false;
448
+ enumValues: undefined;
449
+ baseColumn: never;
450
+ identity: undefined;
451
+ generated: undefined;
452
+ }, {}, {}>;
453
+ authz: import("drizzle-orm/pg-core").PgColumn<{
454
+ name: "authz";
455
+ tableName: "agent_run_snapshots";
456
+ dataType: "json";
457
+ columnType: "PgJsonb";
458
+ data: unknown;
459
+ driverParam: unknown;
460
+ notNull: false;
461
+ hasDefault: false;
462
+ isPrimaryKey: false;
463
+ isAutoincrement: false;
464
+ hasRuntimeDefault: false;
465
+ enumValues: undefined;
466
+ baseColumn: never;
467
+ identity: undefined;
468
+ generated: undefined;
469
+ }, {}, {}>;
470
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
471
+ name: "created_at";
472
+ tableName: "agent_run_snapshots";
473
+ dataType: "date";
474
+ columnType: "PgTimestamp";
475
+ data: Date;
476
+ driverParam: string;
477
+ notNull: true;
478
+ hasDefault: true;
479
+ isPrimaryKey: false;
480
+ isAutoincrement: false;
481
+ hasRuntimeDefault: false;
482
+ enumValues: undefined;
483
+ baseColumn: never;
484
+ identity: undefined;
485
+ generated: undefined;
486
+ }, {}, {}>;
487
+ };
488
+ dialect: "pg";
489
+ }>;
490
+ export type AgentRunSnapshotRow = typeof agentRunSnapshots.$inferSelect;
491
+ export type NewAgentRunSnapshotRow = typeof agentRunSnapshots.$inferInsert;
492
+ /**
493
+ * Tables that carry `tenant_id`; register them with the migration
494
+ * runner so row-level security gets enabled on them.
495
+ */
496
+ export declare const AGENTS_TENANT_SCOPED_TABLES: readonly ["agent_conversations", "agent_run_snapshots"];
497
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2D9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAC;AAC1E,MAAM,MAAM,uBAAuB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAC;AAE7E;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0C7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAC;AACxE,MAAM,MAAM,sBAAsB,GAAG,OAAO,iBAAiB,CAAC,YAAY,CAAC;AAE3E;;;GAGG;AACH,eAAO,MAAM,2BAA2B,yDAA0D,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,133 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { sql } from 'drizzle-orm';
4
+ import { index, integer, jsonb, pgTable, text, timestamp, uuid } from 'drizzle-orm/pg-core';
5
+ /**
6
+ * Agents schema — first-class conversation primitive.
7
+ *
8
+ * A conversation is a durable thread grouping many agent invocations
9
+ * into one user-visible unit. Messages inside a conversation live as
10
+ * memory facts of type `agent-message`, scoped to
11
+ * `threadId = <conversation id>`. This split lets conversation
12
+ * lifecycle (open/close, list, cheap turn-count updates) use a real
13
+ * table while message content inherits memory's versioning +
14
+ * retention + RLS + search infrastructure.
15
+ *
16
+ * `tenant_id` on every table; implementations enable row-level
17
+ * security on `AGENTS_TENANT_SCOPED_TABLES` and run every statement in
18
+ * a tenant-scoped connection so the RLS predicate has context.
19
+ */
20
+ export const agentConversations = pgTable('agent_conversations', {
21
+ id: uuid('id').primaryKey().defaultRandom(),
22
+ tenantId: uuid('tenant_id').notNull(),
23
+ /**
24
+ * Agent id + version this conversation was opened with. Resuming
25
+ * with a different version is refused — the agent's semantics may
26
+ * have changed.
27
+ */
28
+ agentId: text('agent_id').notNull(),
29
+ agentVersion: text('agent_version').notNull(),
30
+ /**
31
+ * Human-facing title. Auto-generated on first turn (typically from
32
+ * the initial user message) or explicitly set. Not versioned — the
33
+ * latest string wins.
34
+ */
35
+ title: text('title').notNull(),
36
+ /**
37
+ * Optional identifier for the human participant (email, user id,
38
+ * SSO subject). Kept as text so the caller decides the shape.
39
+ */
40
+ participantId: text('participant_id'),
41
+ /**
42
+ * Structural scope — project id, matter id, etc. Persisted through
43
+ * the versioning envelope so shape evolution is migrate-on-read.
44
+ */
45
+ scope: jsonb('scope').notNull(),
46
+ openedAt: timestamp('opened_at', { withTimezone: true }).notNull().defaultNow(),
47
+ /** Set when the conversation is closed. Closed conversations are read-only. */
48
+ closedAt: timestamp('closed_at', { withTimezone: true }),
49
+ /**
50
+ * Denormalized turn counter — incremented by `appendMessage` for
51
+ * each turn's final (non-intermediate) agent message. Read by the
52
+ * session HITL gate and the UI conversation list.
53
+ */
54
+ turnCount: integer('turn_count').notNull().default(0),
55
+ /**
56
+ * Denormalized last-activity timestamp. Kept in sync by
57
+ * `appendMessage`. Enables cheap sort by recency in the UI list.
58
+ */
59
+ lastMessageAt: timestamp('last_message_at', { withTimezone: true }),
60
+ /**
61
+ * Free-form metadata (participant details, feature flags,
62
+ * conversation-level notes). Versioned envelope.
63
+ */
64
+ metadata: jsonb('metadata'),
65
+ }, (t) => ({
66
+ tenantAgentIdx: index('agent_conversations_tenant_agent_idx').on(t.tenantId, t.agentId),
67
+ tenantParticipantIdx: index('agent_conversations_tenant_participant_idx').on(t.tenantId, t.participantId),
68
+ /** Partial index: open conversations sorted by recency. Used by the UI list. */
69
+ openRecentIdx: index('agent_conversations_open_recent_idx')
70
+ .on(t.tenantId, t.lastMessageAt.desc())
71
+ .where(sql `${t.closedAt} IS NULL`),
72
+ }));
73
+ /**
74
+ * `agent_run_snapshots` — reconstruction envelope for a suspended agent
75
+ * turn. Written by the setup handler on the FIRST execution of a run
76
+ * (idempotent via the runId primary key); used by
77
+ * `resumeAgentTurn(runId)` to rebuild the same `InvokeAgentInput` the
78
+ * turn was invoked with — so kernel replay after a HITL waitpoint
79
+ * resolution lands in an identical context.
80
+ *
81
+ * Owned by @kindgi/agents (not the kernel) so the kernel's
82
+ * schema stays generic — the kernel has no notion of agents,
83
+ * conversations, or participant identities.
84
+ *
85
+ * Idempotent insert: `runId` is the PK; implementations insert with
86
+ * `ON CONFLICT (id) DO NOTHING` (or equivalent) so a replay is a
87
+ * no-op. All fields are set at first execution and never modified.
88
+ */
89
+ export const agentRunSnapshots = pgTable('agent_run_snapshots', {
90
+ /** `runId` — the kernel run this snapshot reconstructs. Primary key. */
91
+ id: uuid('id').primaryKey(),
92
+ tenantId: uuid('tenant_id').notNull(),
93
+ projectId: uuid('project_id').notNull(),
94
+ /** Agent id + version pinned at turn start. Same as agent_conversations. */
95
+ agentId: text('agent_id').notNull(),
96
+ agentVersion: text('agent_version').notNull(),
97
+ /** Conversation this turn belongs to — required for the setup handler to load state. */
98
+ conversationId: uuid('conversation_id').notNull(),
99
+ /** The user message that started this turn. */
100
+ userMessage: text('user_message').notNull(),
101
+ /**
102
+ * The turn's prompt parameters and structured input, as given to
103
+ * `invokeAgent`. A resumed turn renders its instructions with the
104
+ * same values. Versioned envelopes, like `principal`.
105
+ */
106
+ parameters: jsonb('parameters'),
107
+ input: jsonb('input'),
108
+ /** Optional participant identifier — mirrors InvokeAgentInput.participantId. */
109
+ participantId: text('participant_id'),
110
+ /** dryRun marker from the original invocation. Affects handler side-effect behavior. */
111
+ dryRun: integer('dry_run').notNull().default(0),
112
+ /**
113
+ * Optional serialized Principal (authorization) from the original
114
+ * invocation. Threaded back into the resumed TurnContext so tool
115
+ * dispatch stays enforcement-consistent. Versioned envelope so shape
116
+ * evolution is migrate-on-read.
117
+ */
118
+ principal: jsonb('principal'),
119
+ /**
120
+ * Optional authz config (`{fgaApiUrl}`) from the original invocation.
121
+ * Threaded back into the resumed TurnContext.
122
+ */
123
+ authz: jsonb('authz'),
124
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
125
+ }, (t) => ({
126
+ tenantIdx: index('agent_run_snapshots_tenant_idx').on(t.tenantId),
127
+ }));
128
+ /**
129
+ * Tables that carry `tenant_id`; register them with the migration
130
+ * runner so row-level security gets enabled on them.
131
+ */
132
+ export const AGENTS_TENANT_SCOPED_TABLES = ['agent_conversations', 'agent_run_snapshots'];
133
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE5F;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CACvC,qBAAqB,EACrB;IACE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE;IAC3C,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACrC;;;;OAIG;IACH,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACnC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAC7C;;;;OAIG;IACH,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC9B;;;OAGG;IACH,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACrC;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC/B,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IAC/E,+EAA+E;IAC/E,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACxD;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD;;;OAGG;IACH,aAAa,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACnE;;;OAGG;IACH,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;CAC5B,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACN,cAAc,EAAE,KAAK,CAAC,sCAAsC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;IACvF,oBAAoB,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC,EAAE,CAC1E,CAAC,CAAC,QAAQ,EACV,CAAC,CAAC,aAAa,CAChB;IACD,gFAAgF;IAChF,aAAa,EAAE,KAAK,CAAC,qCAAqC,CAAC;SACxD,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;SACtC,KAAK,CAAC,GAAG,CAAA,GAAG,CAAC,CAAC,QAAQ,UAAU,CAAC;CACrC,CAAC,CACH,CAAC;AAKF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CACtC,qBAAqB,EACrB;IACE,wEAAwE;IACxE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC3B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACrC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACvC,4EAA4E;IAC5E,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACnC,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAC7C,wFAAwF;IACxF,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;IACjD,+CAA+C;IAC/C,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC3C;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;IACrB,gFAAgF;IAChF,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC;IACrC,wFAAwF;IACxF,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C;;;;;OAKG;IACH,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC;IAC7B;;;OAGG;IACH,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CAClF,EACD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACN,SAAS,EAAE,KAAK,CAAC,gCAAgC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;CAClE,CAAC,CACH,CAAC;AAKF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,qBAAqB,EAAE,qBAAqB,CAAU,CAAC"}