@apart-tech/intelligence-core 1.11.4 → 1.11.6

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 (152) hide show
  1. package/dist/auth/ability.d.ts +148 -0
  2. package/dist/auth/ability.d.ts.map +1 -0
  3. package/dist/auth/ability.js +291 -0
  4. package/dist/auth/ability.js.map +1 -0
  5. package/dist/auth/ability.test.d.ts +2 -0
  6. package/dist/auth/ability.test.d.ts.map +1 -0
  7. package/dist/auth/ability.test.js +693 -0
  8. package/dist/auth/ability.test.js.map +1 -0
  9. package/dist/auth/delegation-jwt.d.ts +167 -0
  10. package/dist/auth/delegation-jwt.d.ts.map +1 -0
  11. package/dist/auth/delegation-jwt.js +237 -0
  12. package/dist/auth/delegation-jwt.js.map +1 -0
  13. package/dist/auth/delegation-jwt.test.d.ts +2 -0
  14. package/dist/auth/delegation-jwt.test.d.ts.map +1 -0
  15. package/dist/auth/delegation-jwt.test.js +283 -0
  16. package/dist/auth/delegation-jwt.test.js.map +1 -0
  17. package/dist/auth/principal.d.ts +94 -0
  18. package/dist/auth/principal.d.ts.map +1 -0
  19. package/dist/auth/principal.js +33 -0
  20. package/dist/auth/principal.js.map +1 -0
  21. package/dist/config/config.test.d.ts +2 -0
  22. package/dist/config/config.test.d.ts.map +1 -0
  23. package/dist/config/config.test.js +57 -0
  24. package/dist/config/config.test.js.map +1 -0
  25. package/dist/config/index.d.ts.map +1 -1
  26. package/dist/config/index.js +22 -1
  27. package/dist/config/index.js.map +1 -1
  28. package/dist/db/tenant.d.ts.map +1 -1
  29. package/dist/db/tenant.js +8 -0
  30. package/dist/db/tenant.js.map +1 -1
  31. package/dist/index.d.ts +19 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +10 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/__tests__/jwt.test.d.ts +2 -0
  36. package/dist/lib/__tests__/jwt.test.d.ts.map +1 -0
  37. package/dist/lib/__tests__/jwt.test.js +97 -0
  38. package/dist/lib/__tests__/jwt.test.js.map +1 -0
  39. package/dist/lib/jwt.d.ts +20 -0
  40. package/dist/lib/jwt.d.ts.map +1 -1
  41. package/dist/lib/jwt.js +56 -3
  42. package/dist/lib/jwt.js.map +1 -1
  43. package/dist/services/__tests__/chunk-service.test.d.ts +2 -0
  44. package/dist/services/__tests__/chunk-service.test.d.ts.map +1 -0
  45. package/dist/services/__tests__/chunk-service.test.js +111 -0
  46. package/dist/services/__tests__/chunk-service.test.js.map +1 -0
  47. package/dist/services/__tests__/chunker.test.d.ts +2 -0
  48. package/dist/services/__tests__/chunker.test.d.ts.map +1 -0
  49. package/dist/services/__tests__/chunker.test.js +113 -0
  50. package/dist/services/__tests__/chunker.test.js.map +1 -0
  51. package/dist/services/__tests__/delegation-cleanup-service.test.d.ts +2 -0
  52. package/dist/services/__tests__/delegation-cleanup-service.test.d.ts.map +1 -0
  53. package/dist/services/__tests__/delegation-cleanup-service.test.js +211 -0
  54. package/dist/services/__tests__/delegation-cleanup-service.test.js.map +1 -0
  55. package/dist/services/__tests__/node-service.test.d.ts +2 -0
  56. package/dist/services/__tests__/node-service.test.d.ts.map +1 -0
  57. package/dist/services/__tests__/node-service.test.js +207 -0
  58. package/dist/services/__tests__/node-service.test.js.map +1 -0
  59. package/dist/services/__tests__/pii-detector-service.test.js +51 -0
  60. package/dist/services/__tests__/pii-detector-service.test.js.map +1 -1
  61. package/dist/services/__tests__/pii-encryption-service.test.js +37 -0
  62. package/dist/services/__tests__/pii-encryption-service.test.js.map +1 -1
  63. package/dist/services/__tests__/search-service.test.d.ts +2 -0
  64. package/dist/services/__tests__/search-service.test.d.ts.map +1 -0
  65. package/dist/services/__tests__/search-service.test.js +163 -0
  66. package/dist/services/__tests__/search-service.test.js.map +1 -0
  67. package/dist/services/agent-run-service.d.ts +44 -7
  68. package/dist/services/agent-run-service.d.ts.map +1 -1
  69. package/dist/services/agent-run-service.js +14 -0
  70. package/dist/services/agent-run-service.js.map +1 -1
  71. package/dist/services/agent-schedule-service.d.ts +21 -0
  72. package/dist/services/agent-schedule-service.d.ts.map +1 -1
  73. package/dist/services/agent-schedule-service.js +12 -0
  74. package/dist/services/agent-schedule-service.js.map +1 -1
  75. package/dist/services/audit-event-service.d.ts +76 -0
  76. package/dist/services/audit-event-service.d.ts.map +1 -0
  77. package/dist/services/audit-event-service.js +48 -0
  78. package/dist/services/audit-event-service.js.map +1 -0
  79. package/dist/services/backfill-chunks.d.ts +30 -0
  80. package/dist/services/backfill-chunks.d.ts.map +1 -0
  81. package/dist/services/backfill-chunks.js +55 -0
  82. package/dist/services/backfill-chunks.js.map +1 -0
  83. package/dist/services/chunk-service.d.ts +45 -0
  84. package/dist/services/chunk-service.d.ts.map +1 -0
  85. package/dist/services/chunk-service.js +111 -0
  86. package/dist/services/chunk-service.js.map +1 -0
  87. package/dist/services/chunker.d.ts +32 -0
  88. package/dist/services/chunker.d.ts.map +1 -0
  89. package/dist/services/chunker.js +289 -0
  90. package/dist/services/chunker.js.map +1 -0
  91. package/dist/services/context-service.d.ts +3 -1
  92. package/dist/services/context-service.d.ts.map +1 -1
  93. package/dist/services/context-service.js +17 -1
  94. package/dist/services/context-service.js.map +1 -1
  95. package/dist/services/delegation-cleanup-service.d.ts +133 -0
  96. package/dist/services/delegation-cleanup-service.d.ts.map +1 -0
  97. package/dist/services/delegation-cleanup-service.js +111 -0
  98. package/dist/services/delegation-cleanup-service.js.map +1 -0
  99. package/dist/services/edge-service.d.ts.map +1 -1
  100. package/dist/services/edge-service.js +3 -0
  101. package/dist/services/edge-service.js.map +1 -1
  102. package/dist/services/node-service.d.ts +12 -1
  103. package/dist/services/node-service.d.ts.map +1 -1
  104. package/dist/services/node-service.js +54 -11
  105. package/dist/services/node-service.js.map +1 -1
  106. package/dist/services/org-agent-type-service.d.ts +15 -0
  107. package/dist/services/org-agent-type-service.d.ts.map +1 -1
  108. package/dist/services/org-agent-type-service.js +2 -0
  109. package/dist/services/org-agent-type-service.js.map +1 -1
  110. package/dist/services/pii-detector-service.d.ts +1 -0
  111. package/dist/services/pii-detector-service.d.ts.map +1 -1
  112. package/dist/services/pii-detector-service.js +95 -2
  113. package/dist/services/pii-detector-service.js.map +1 -1
  114. package/dist/services/pii-encryption-service.d.ts +10 -0
  115. package/dist/services/pii-encryption-service.d.ts.map +1 -1
  116. package/dist/services/pii-encryption-service.js +32 -0
  117. package/dist/services/pii-encryption-service.js.map +1 -1
  118. package/dist/services/search-service.d.ts +30 -1
  119. package/dist/services/search-service.d.ts.map +1 -1
  120. package/dist/services/search-service.js +262 -45
  121. package/dist/services/search-service.js.map +1 -1
  122. package/dist/services/tag-service.d.ts +78 -0
  123. package/dist/services/tag-service.d.ts.map +1 -0
  124. package/dist/services/tag-service.js +639 -0
  125. package/dist/services/tag-service.js.map +1 -0
  126. package/dist/services/tag-service.test.d.ts +2 -0
  127. package/dist/services/tag-service.test.d.ts.map +1 -0
  128. package/dist/services/tag-service.test.js +448 -0
  129. package/dist/services/tag-service.test.js.map +1 -0
  130. package/dist/services/usage-service.d.ts +48 -0
  131. package/dist/services/usage-service.d.ts.map +1 -0
  132. package/dist/services/usage-service.js +116 -0
  133. package/dist/services/usage-service.js.map +1 -0
  134. package/dist/services/user-service.d.ts.map +1 -1
  135. package/dist/services/user-service.js +24 -6
  136. package/dist/services/user-service.js.map +1 -1
  137. package/dist/services/user-service.test.d.ts +2 -0
  138. package/dist/services/user-service.test.d.ts.map +1 -0
  139. package/dist/services/user-service.test.js +86 -0
  140. package/dist/services/user-service.test.js.map +1 -0
  141. package/dist/services/workspace-service.d.ts +2 -0
  142. package/dist/services/workspace-service.d.ts.map +1 -1
  143. package/dist/services/workspace-service.js +7 -1
  144. package/dist/services/workspace-service.js.map +1 -1
  145. package/dist/types/index.d.ts +80 -2
  146. package/dist/types/index.d.ts.map +1 -1
  147. package/package.json +3 -2
  148. package/prisma/schema.prisma +335 -82
  149. package/dist/db/schema.d.ts +0 -507
  150. package/dist/db/schema.d.ts.map +0 -1
  151. package/dist/db/schema.js +0 -77
  152. package/dist/db/schema.js.map +0 -1
@@ -8,12 +8,17 @@ datasource db {
8
8
  }
9
9
 
10
10
  model Organization {
11
- id String @id @default(uuid()) @db.Uuid
12
- name String @db.VarChar(200)
13
- slug String @unique @db.VarChar(200)
14
- metadata Json @default("{}")
15
- createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
16
- auth0OrgId String? @unique @map("auth0_org_id") @db.VarChar(100)
11
+ id String @id @default(uuid()) @db.Uuid
12
+ name String @db.VarChar(200)
13
+ slug String @unique @db.VarChar(200)
14
+ metadata Json @default("{}")
15
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
16
+ auth0OrgId String? @unique @map("auth0_org_id") @db.VarChar(100)
17
+ authorizationMode String @default("internal") @map("authorization_mode") @db.VarChar(30)
18
+ plan String @default("free") @db.VarChar(20)
19
+ stripeCustomerId String? @unique @map("stripe_customer_id") @db.VarChar(255)
20
+ stripeSubscriptionId String? @map("stripe_subscription_id") @db.VarChar(255)
21
+ currentPeriodEnd DateTime? @map("current_period_end") @db.Timestamptz
17
22
 
18
23
  nodes Node[]
19
24
  edges Edge[]
@@ -29,23 +34,31 @@ model Organization {
29
34
  invites Invite[]
30
35
  orgAgentTypes OrgAgentType[]
31
36
  orgMcpServers OrgMcpServer[]
37
+ usageRecords UsageRecord[]
38
+ tagDefinitions TagDefinition[]
39
+ nodeTags NodeTag[]
40
+ nodeChunks NodeChunk[]
41
+ piiQueryLogs PiiQueryLog[]
32
42
 
33
43
  @@map("organizations")
34
44
  }
35
45
 
36
46
  model User {
37
- id String @id @default(uuid()) @db.Uuid
38
- auth0Sub String @unique @map("auth0_sub") @db.VarChar(255)
39
- email String @db.VarChar(320)
40
- name String? @db.VarChar(200)
41
- avatarUrl String? @map("avatar_url") @db.Text
42
- createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
43
- updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
47
+ id String @id @default(uuid()) @db.Uuid
48
+ auth0Sub String @unique @map("auth0_sub") @db.VarChar(255)
49
+ email String @db.VarChar(320)
50
+ name String? @db.VarChar(200)
51
+ avatarUrl String? @map("avatar_url") @db.Text
52
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
53
+ updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
44
54
  claudeOauthTokenEncrypted String? @map("claude_oauth_token_encrypted") @db.Text
45
55
  apartRefreshTokenEncrypted String? @map("apart_refresh_token_encrypted") @db.Text
46
56
  agentSecretsEncrypted String? @map("agent_secrets_encrypted") @db.Text
47
57
 
48
- memberships Membership[]
58
+ memberships Membership[]
59
+ createdAgentTypes OrgAgentType[] @relation("OrgAgentTypeCreatedBy")
60
+ invokedAgentRuns AgentRun[] @relation("AgentRunInvokedBy")
61
+ scheduledAgents AgentSchedule[] @relation("AgentScheduleScheduledBy")
49
62
 
50
63
  @@index([email], map: "idx_users_email")
51
64
  @@map("users")
@@ -114,6 +127,22 @@ model OrgPiiConfig {
114
127
  @@map("org_pii_config")
115
128
  }
116
129
 
130
+ model PiiQueryLog {
131
+ id String @id @default(uuid()) @db.Uuid
132
+ organizationId String @map("organization_id") @db.Uuid
133
+ queryHash String @map("query_hash") @db.Text
134
+ piiTypesDetected String[] @map("pii_types_detected")
135
+ matchCount Int @map("match_count")
136
+ source String @db.VarChar(20)
137
+ principalId String? @map("principal_id") @db.Text
138
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
139
+
140
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
141
+
142
+ @@index([organizationId, createdAt], map: "idx_pii_query_logs_org_time")
143
+ @@map("pii_query_logs")
144
+ }
145
+
117
146
  model Domain {
118
147
  id String @id @default(uuid()) @db.Uuid
119
148
  name String @db.VarChar(200)
@@ -138,24 +167,27 @@ model Domain {
138
167
  }
139
168
 
140
169
  model Node {
141
- id String @id @default(uuid()) @db.Uuid
142
- type String @db.VarChar(100)
143
- title String @db.VarChar(500)
144
- content String @default("") @db.Text
170
+ id String @id @default(uuid()) @db.Uuid
171
+ type String @db.VarChar(100)
172
+ title String @db.VarChar(500)
173
+ content String @default("") @db.Text
145
174
  embedding Unsupported("vector")?
146
- searchVector Unsupported("tsvector")? @map("search_vector")
147
- metadata Json @default("{}")
148
- status String @default("draft") @db.VarChar(20)
149
- createdBy String @map("created_by") @db.VarChar(255)
150
- createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
151
- updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
152
- version Int @default(1)
153
- hasPii Boolean @default(false) @map("has_pii")
154
- domainId String? @map("domain_id") @db.Uuid
155
- organizationId String @map("organization_id") @db.Uuid
175
+ searchVector Unsupported("tsvector")? @map("search_vector")
176
+ metadata Json @default("{}")
177
+ status String @default("draft") @db.VarChar(20)
178
+ createdBy String @map("created_by") @db.VarChar(255)
179
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
180
+ updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
181
+ version Int @default(1)
182
+ hasPii Boolean @default(false) @map("has_pii")
183
+ embeddingPiiMode String? @map("embedding_pii_mode") @db.VarChar(20)
184
+ domainId String? @map("domain_id") @db.Uuid
185
+ organizationId String @map("organization_id") @db.Uuid
156
186
 
157
187
  sourceEdges Edge[] @relation("SourceNode")
158
188
  targetEdges Edge[] @relation("TargetNode")
189
+ tags NodeTag[]
190
+ chunks NodeChunk[]
159
191
  domain Domain? @relation(fields: [domainId], references: [id], onDelete: SetNull)
160
192
  organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
161
193
 
@@ -168,6 +200,30 @@ model Node {
168
200
  @@map("nodes")
169
201
  }
170
202
 
203
+ model NodeChunk {
204
+ id String @id @default(uuid()) @db.Uuid
205
+ nodeId String @map("node_id") @db.Uuid
206
+ chunkIndex Int @map("chunk_index")
207
+ content String @db.Text
208
+ tokenCount Int @map("token_count")
209
+ headingContext String? @map("heading_context") @db.VarChar(500)
210
+ startOffset Int @map("start_offset")
211
+ endOffset Int @map("end_offset")
212
+ overlapPrev Int @default(0) @map("overlap_prev")
213
+ embedding Unsupported("vector")?
214
+ embeddingPiiMode String? @map("embedding_pii_mode") @db.VarChar(20)
215
+ organizationId String @map("organization_id") @db.Uuid
216
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
217
+
218
+ node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade)
219
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
220
+
221
+ @@unique([nodeId, chunkIndex], map: "uq_node_chunks_node_idx")
222
+ @@index([nodeId], map: "idx_node_chunks_node")
223
+ @@index([organizationId], map: "idx_node_chunks_org")
224
+ @@map("node_chunks")
225
+ }
226
+
171
227
  model Edge {
172
228
  id String @id @default(uuid()) @db.Uuid
173
229
  sourceNodeId String @map("source_node_id") @db.Uuid
@@ -191,23 +247,23 @@ model Edge {
191
247
  }
192
248
 
193
249
  model Workspace {
194
- id String @id @default(uuid()) @db.Uuid
195
- name String @db.VarChar(200)
196
- slug String @db.VarChar(200)
197
- description String @default("") @db.Text
250
+ id String @id @default(uuid()) @db.Uuid
251
+ name String @db.VarChar(200)
252
+ slug String @db.VarChar(200)
253
+ description String @default("") @db.Text
198
254
 
199
255
  // Filter rules
200
- domainSlugs Json @default("[]") @map("domain_slugs")
201
- nodeTypes Json @default("[]") @map("node_types")
202
- tags Json @default("[]") @map("tags")
256
+ domainSlugs Json @default("[]") @map("domain_slugs")
257
+ nodeTypes Json @default("[]") @map("node_types")
258
+ tags Json @default("[]") @map("tags")
203
259
 
204
260
  // Context assembly overrides
205
- maxDepth Int? @map("max_depth")
206
- maxNodes Int? @map("max_nodes")
207
- includeDrafts Boolean @default(false) @map("include_drafts")
261
+ maxDepth Int? @map("max_depth")
262
+ maxNodes Int? @map("max_nodes")
263
+ includeDrafts Boolean @default(false) @map("include_drafts")
208
264
 
209
265
  // Layer 1: map description for AI
210
- systemPrompt String @default("") @map("system_prompt") @db.Text
266
+ systemPrompt String @default("") @map("system_prompt") @db.Text
211
267
 
212
268
  metadata Json @default("{}")
213
269
  createdBy String @map("created_by") @db.VarChar(255)
@@ -251,11 +307,22 @@ model OrgAgentType {
251
307
  createdBy String @map("created_by") @db.VarChar(255)
252
308
  createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
253
309
  updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
254
-
255
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
310
+ kind String @default("org_agent") @db.VarChar(30)
311
+ auth0ClientId String? @unique @map("auth0_client_id") @db.VarChar(255)
312
+ intrinsicPolicy Json @default("{}") @map("intrinsic_policy")
313
+ toolCatalogue String[] @default([]) @map("tool_catalogue")
314
+ requiresCiba Boolean @default(false) @map("requires_ciba")
315
+ createdByUserId String? @map("created_by_user_id") @db.Uuid
316
+
317
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
318
+ createdByUser User? @relation("OrgAgentTypeCreatedBy", fields: [createdByUserId], references: [id], onDelete: SetNull)
319
+ agentRuns AgentRun[] @relation("AgentRunAgent")
320
+ schedules AgentSchedule[] @relation("AgentScheduleAgent")
321
+ apiKeys ApiKey[] @relation("ApiKeyAgent")
256
322
 
257
323
  @@unique([organizationId, slug], map: "uq_org_agent_type_org_slug")
258
324
  @@index([organizationId], map: "idx_org_agent_types_organization")
325
+ @@index([createdByUserId], map: "idx_org_agent_types_created_by_user_id")
259
326
  @@map("org_agent_types")
260
327
  }
261
328
 
@@ -279,56 +346,75 @@ model OrgMcpServer {
279
346
  }
280
347
 
281
348
  model AgentRun {
282
- id String @id @default(uuid()) @db.Uuid
283
- organizationId String @map("organization_id") @db.Uuid
284
- prompt String @db.Text
285
- type String @default("researcher") @db.VarChar(30)
286
- status String @default("pending") @db.VarChar(20)
287
- result String @default("") @db.Text
288
- error String? @db.Text
289
- sandboxId String? @map("sandbox_id") @db.VarChar(100)
290
- model String @default("sonnet") @db.VarChar(50)
291
- startedAt DateTime @default(now()) @map("started_at") @db.Timestamptz
292
- completedAt DateTime? @map("completed_at") @db.Timestamptz
293
- createdBy String @map("created_by") @db.VarChar(255)
294
- scheduleId String? @map("schedule_id") @db.Uuid
295
-
296
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
297
- schedule AgentSchedule? @relation(fields: [scheduleId], references: [id], onDelete: SetNull)
349
+ id String @id @default(uuid()) @db.Uuid
350
+ organizationId String @map("organization_id") @db.Uuid
351
+ prompt String @db.Text
352
+ type String @default("researcher") @db.VarChar(30)
353
+ status String @default("pending") @db.VarChar(20)
354
+ result String @default("") @db.Text
355
+ error String? @db.Text
356
+ sandboxId String? @map("sandbox_id") @db.VarChar(100)
357
+ model String @default("sonnet") @db.VarChar(50)
358
+ startedAt DateTime @default(now()) @map("started_at") @db.Timestamptz
359
+ completedAt DateTime? @map("completed_at") @db.Timestamptz
360
+ createdBy String @map("created_by") @db.VarChar(255)
361
+ scheduleId String? @map("schedule_id") @db.Uuid
362
+ agentId String? @map("agent_id") @db.Uuid
363
+ invokedByUserId String? @map("invoked_by_user_id") @db.Uuid
364
+ parentAgentRunId String? @map("parent_agent_run_id") @db.Uuid
365
+ actClaim Json? @map("act_claim")
366
+ capturedAbility Json? @map("captured_ability")
367
+
368
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
369
+ schedule AgentSchedule? @relation(fields: [scheduleId], references: [id], onDelete: SetNull)
370
+ agent OrgAgentType? @relation("AgentRunAgent", fields: [agentId], references: [id], onDelete: SetNull)
371
+ invokedByUser User? @relation("AgentRunInvokedBy", fields: [invokedByUserId], references: [id], onDelete: SetNull)
372
+ parent AgentRun? @relation("AgentRunParent", fields: [parentAgentRunId], references: [id], onDelete: SetNull)
373
+ children AgentRun[] @relation("AgentRunParent")
298
374
 
299
375
  @@index([organizationId], map: "idx_agent_runs_organization")
300
376
  @@index([status], map: "idx_agent_runs_status")
301
377
  @@index([type], map: "idx_agent_runs_type")
302
378
  @@index([scheduleId], map: "idx_agent_runs_schedule")
379
+ @@index([agentId], map: "idx_agent_runs_agent_id")
380
+ @@index([invokedByUserId], map: "idx_agent_runs_invoked_by_user_id")
381
+ @@index([parentAgentRunId], map: "idx_agent_runs_parent_agent_run_id")
303
382
  @@map("agent_runs")
304
383
  }
305
384
 
306
385
  model AgentSchedule {
307
- id String @id @default(uuid()) @db.Uuid
308
- organizationId String @map("organization_id") @db.Uuid
309
- name String @db.VarChar(200)
310
- description String @default("") @db.Text
311
- cronExpression String @map("cron_expression") @db.VarChar(100)
312
- timezone String @default("UTC") @db.VarChar(50)
313
- agentType String @default("researcher") @map("agent_type") @db.VarChar(30)
314
- prompt String @db.Text
315
- model String @default("sonnet") @db.VarChar(50)
316
- workspace String? @db.VarChar(200)
317
- enabled Boolean @default(true)
318
- apiKeyEncrypted String @map("api_key_encrypted") @db.Text
319
- apiKeyHash String @map("api_key_hash") @db.VarChar(64)
320
- gcpJobName String? @map("gcp_job_name") @db.VarChar(500)
321
- lastTriggeredAt DateTime? @map("last_triggered_at") @db.Timestamptz
322
- lastRunId String? @map("last_run_id") @db.Uuid
323
- createdBy String @map("created_by") @db.VarChar(255)
324
- createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
325
- updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
326
-
327
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
328
- runs AgentRun[]
386
+ id String @id @default(uuid()) @db.Uuid
387
+ organizationId String @map("organization_id") @db.Uuid
388
+ name String @db.VarChar(200)
389
+ description String @default("") @db.Text
390
+ cronExpression String @map("cron_expression") @db.VarChar(100)
391
+ timezone String @default("UTC") @db.VarChar(50)
392
+ agentType String @default("researcher") @map("agent_type") @db.VarChar(30)
393
+ prompt String @db.Text
394
+ model String @default("sonnet") @db.VarChar(50)
395
+ workspace String? @db.VarChar(200)
396
+ enabled Boolean @default(true)
397
+ apiKeyEncrypted String @map("api_key_encrypted") @db.Text
398
+ apiKeyHash String @map("api_key_hash") @db.VarChar(64)
399
+ gcpJobName String? @map("gcp_job_name") @db.VarChar(500)
400
+ lastTriggeredAt DateTime? @map("last_triggered_at") @db.Timestamptz
401
+ lastRunId String? @map("last_run_id") @db.Uuid
402
+ createdBy String @map("created_by") @db.VarChar(255)
403
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
404
+ updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
405
+ agentId String? @map("agent_id") @db.Uuid
406
+ scheduledByUserId String? @map("scheduled_by_user_id") @db.Uuid
407
+ capturedAbility Json? @map("captured_ability")
408
+
409
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
410
+ runs AgentRun[]
411
+ agent OrgAgentType? @relation("AgentScheduleAgent", fields: [agentId], references: [id], onDelete: SetNull)
412
+ scheduledByUser User? @relation("AgentScheduleScheduledBy", fields: [scheduledByUserId], references: [id], onDelete: SetNull)
329
413
 
330
414
  @@index([organizationId], map: "idx_agent_schedules_organization")
331
415
  @@index([apiKeyHash], map: "idx_agent_schedules_api_key_hash")
416
+ @@index([agentId], map: "idx_agent_schedules_agent_id")
417
+ @@index([scheduledByUserId], map: "idx_agent_schedules_scheduled_by_user_id")
332
418
  @@map("agent_schedules")
333
419
  }
334
420
 
@@ -341,17 +427,184 @@ model ApiKey {
341
427
  lastUsedAt DateTime? @map("last_used_at") @db.Timestamptz
342
428
  active Int @default(1)
343
429
  organizationId String @map("organization_id") @db.Uuid
430
+ agentId String? @map("agent_id") @db.Uuid
344
431
 
345
- organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
432
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
433
+ agent OrgAgentType? @relation("ApiKeyAgent", fields: [agentId], references: [id], onDelete: SetNull)
346
434
 
347
435
  @@index([organizationId], map: "idx_api_keys_organization")
436
+ @@index([agentId], map: "idx_api_keys_agent_id")
348
437
  @@map("api_keys")
349
438
  }
350
439
 
351
440
  model EmbeddingCache {
352
- contentHash String @id @map("content_hash") @db.VarChar(64)
441
+ contentHash String @id @map("content_hash") @db.VarChar(64)
353
442
  embedding Unsupported("vector")
354
- createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
443
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
355
444
 
356
445
  @@map("embedding_cache")
357
446
  }
447
+
448
+ model AuditEvent {
449
+ id String @id @default(uuid()) @db.Uuid
450
+ agentRunId String? @map("agent_run_id") @db.Uuid
451
+ principalType String @map("principal_type") @db.VarChar(30)
452
+ principalId String @map("principal_id") @db.VarChar(255)
453
+ organizationId String @map("organization_id") @db.Uuid
454
+ action String @db.VarChar(100)
455
+ subjectType String? @map("subject_type") @db.VarChar(100)
456
+ subjectId String? @map("subject_id") @db.VarChar(255)
457
+ effectiveAbility Json @default("{}") @map("effective_ability")
458
+ result String @db.VarChar(20)
459
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
460
+
461
+ @@index([organizationId], map: "idx_audit_events_organization_id")
462
+ @@index([agentRunId], map: "idx_audit_events_agent_run_id")
463
+ @@index([createdAt], map: "idx_audit_events_created_at")
464
+ @@map("audit_events")
465
+ }
466
+
467
+ model UsageRecord {
468
+ id String @id @default(uuid()) @db.Uuid
469
+ organizationId String @map("organization_id") @db.Uuid
470
+ metric String @db.VarChar(50)
471
+ periodStart DateTime @map("period_start") @db.Date
472
+ count Int @default(0)
473
+ updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
474
+
475
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
476
+
477
+ @@unique([organizationId, metric, periodStart], map: "uq_usage_org_metric_period")
478
+ @@index([organizationId], map: "idx_usage_records_organization")
479
+ @@map("usage_records")
480
+ }
481
+
482
+ // ── Tag System ──────────────────────────────────────────────────────────────
483
+
484
+ model TagDefinition {
485
+ id String @id @default(uuid()) @db.Uuid
486
+ organizationId String? @map("organization_id") @db.Uuid
487
+ tagName String @map("tag_name") @db.VarChar(100)
488
+ tagType String @map("tag_type") @db.VarChar(20)
489
+ cardinality String @default("singleton") @db.VarChar(10)
490
+ source String @default("extracted") @db.VarChar(20)
491
+ status String @default("active") @map("status") @db.VarChar(20)
492
+ description String @default("") @db.Text
493
+ category String? @map("category") @db.VarChar(50)
494
+ labels Json? @map("labels") @db.JsonB
495
+ applicableNodeTypes Json @default("[]") @map("applicable_node_types")
496
+ requiredForNodeTypes Json @default("[]") @map("required_for_node_types")
497
+ enumValues Json? @map("enum_values")
498
+ enumVersion Int @default(1) @map("enum_version")
499
+ dependsOn Json @default("[]") @map("depends_on")
500
+ autoAcceptThreshold Float? @map("auto_accept_threshold") @db.Real
501
+ parentDefinitionId String? @map("parent_definition_id") @db.Uuid
502
+ replacedBy String? @map("replaced_by") @db.Uuid
503
+ deprecatedAt DateTime? @map("deprecated_at") @db.Timestamptz
504
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
505
+ createdBy String @map("created_by") @db.VarChar(255)
506
+
507
+ organization Organization? @relation(fields: [organizationId], references: [id], onDelete: Cascade)
508
+ parentDef TagDefinition? @relation("TagDefHierarchy", fields: [parentDefinitionId], references: [id])
509
+ childDefs TagDefinition[] @relation("TagDefHierarchy")
510
+ replacementDef TagDefinition? @relation("TagDefReplacement", fields: [replacedBy], references: [id])
511
+ replacedDefs TagDefinition[] @relation("TagDefReplacement")
512
+ tags NodeTag[]
513
+
514
+ @@unique([organizationId, tagName], map: "uq_tag_def_org_name")
515
+ @@index([organizationId], map: "idx_tag_defs_org")
516
+ @@index([parentDefinitionId], map: "idx_tag_defs_parent")
517
+ @@map("tag_definitions")
518
+ }
519
+
520
+ model NodeTag {
521
+ id String @id @default(uuid()) @db.Uuid
522
+ nodeId String @map("node_id") @db.Uuid
523
+ organizationId String @map("organization_id") @db.Uuid
524
+ tagDefinitionId String @map("tag_definition_id") @db.Uuid
525
+ tagName String @map("tag_name") @db.VarChar(100)
526
+ isSingleton Boolean @default(false) @map("is_singleton")
527
+
528
+ valueText String? @map("value_text") @db.Text
529
+ valueNum Float? @map("value_num") @db.DoublePrecision
530
+ valueCurrency String? @map("value_currency") @db.Char(3)
531
+ valueUnit String? @map("value_unit") @db.VarChar(20)
532
+ valueDate DateTime? @map("value_date") @db.Timestamptz
533
+ valueRef String? @map("value_ref") @db.Uuid
534
+
535
+ textSpan String? @map("text_span") @db.Text
536
+ offsetStart Int? @map("offset_start")
537
+ offsetEnd Int? @map("offset_end")
538
+ contentVersion Int? @map("content_version")
539
+ attrs Json @default("{}") @db.JsonB
540
+
541
+ taggedBy String @map("tagged_by") @db.VarChar(255)
542
+ modelId String? @map("model_id") @db.VarChar(100)
543
+ modelVersion String? @map("model_version") @db.VarChar(50)
544
+ confidence Float? @db.Real
545
+ verificationStatus String @default("unverified") @map("verification_status") @db.VarChar(20)
546
+ verifiedBy String? @map("verified_by") @db.VarChar(255)
547
+ verifiedAt DateTime? @map("verified_at") @db.Timestamptz
548
+ supersededBy String? @map("superseded_by") @db.Uuid
549
+ batchId String? @map("batch_id") @db.Uuid
550
+
551
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
552
+ updatedAt DateTime @default(now()) @map("updated_at") @db.Timestamptz
553
+
554
+ node Node @relation(fields: [nodeId], references: [id], onDelete: Cascade)
555
+ organization Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
556
+ tagDefinition TagDefinition @relation(fields: [tagDefinitionId], references: [id])
557
+ supersedes NodeTag? @relation("TagSupersession", fields: [supersededBy], references: [id])
558
+ supersededTags NodeTag[] @relation("TagSupersession")
559
+
560
+ @@index([nodeId], map: "idx_node_tags_node")
561
+ @@index([organizationId, tagName], map: "idx_node_tags_org_name")
562
+ @@index([valueRef], map: "idx_node_tags_ref")
563
+ @@index([batchId], map: "idx_node_tags_batch")
564
+ @@map("node_tags")
565
+ }
566
+
567
+ model NodeTagHistory {
568
+ id String @id @default(uuid()) @db.Uuid
569
+ tagId String @map("tag_id") @db.Uuid
570
+ nodeId String @map("node_id") @db.Uuid
571
+ organizationId String @map("organization_id") @db.Uuid
572
+ tagName String @map("tag_name") @db.VarChar(100)
573
+
574
+ valueText String? @map("value_text") @db.Text
575
+ valueNum Float? @map("value_num") @db.DoublePrecision
576
+ valueCurrency String? @map("value_currency") @db.Char(3)
577
+ valueUnit String? @map("value_unit") @db.VarChar(20)
578
+ valueDate DateTime? @map("value_date") @db.Timestamptz
579
+ valueRef String? @map("value_ref") @db.Uuid
580
+
581
+ validFrom DateTime @map("valid_from") @db.Timestamptz
582
+ validUntil DateTime @map("valid_until") @db.Timestamptz
583
+ systemFrom DateTime @map("system_from") @db.Timestamptz
584
+ systemTo DateTime? @map("system_to") @db.Timestamptz
585
+
586
+ replacedBy String @map("replaced_by") @db.VarChar(255)
587
+
588
+ @@index([nodeId, tagName, validFrom], map: "idx_tag_history_node_name_time")
589
+ @@index([organizationId, tagName, validFrom], map: "idx_tag_history_org_name_time")
590
+ @@index([nodeId, tagName, systemFrom], map: "idx_tag_history_node_name_system_time")
591
+ @@map("node_tag_history")
592
+ }
593
+
594
+ model NodeTagAudit {
595
+ id String @id @default(uuid()) @db.Uuid
596
+ tagId String @map("tag_id") @db.Uuid
597
+ nodeId String @map("node_id") @db.Uuid
598
+ orgId String @map("organization_id") @db.Uuid
599
+ action String @map("action") @db.VarChar(20)
600
+ oldValue Json? @map("old_value") @db.JsonB
601
+ newValue Json? @map("new_value") @db.JsonB
602
+ actorId String @map("actor_id") @db.Uuid
603
+ reason String? @db.Text
604
+ createdAt DateTime @default(now()) @map("created_at") @db.Timestamptz
605
+
606
+ @@index([tagId], map: "idx_tag_audit_tag")
607
+ @@index([nodeId], map: "idx_tag_audit_node")
608
+ @@index([orgId, createdAt], map: "idx_tag_audit_org_time")
609
+ @@map("node_tag_audit")
610
+ }