spine-framework 0.4.4 → 0.5.0-rc.5

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 (305) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/install-app.ts +183 -13
  8. package/.framework/cli/commands/migrate.ts +36 -30
  9. package/.framework/cli/commands/migrations.ts +16 -56
  10. package/.framework/cli/commands/upgrade.ts +35 -0
  11. package/.framework/cli/commands/validate-app.ts +127 -1
  12. package/.framework/cli/commands/validate-schema.ts +147 -0
  13. package/.framework/cli/context.ts +223 -110
  14. package/.framework/cli/index.ts +6 -0
  15. package/.framework/cli/lib/project-files.ts +241 -1
  16. package/.framework/functions/_shared/app-manifest.ts +2 -0
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/logging.ts +562 -224
  19. package/.framework/functions/_shared/middleware.ts +47 -44
  20. package/.framework/functions/_shared/permissions.ts +4 -0
  21. package/.framework/functions/admin-data.ts +51 -28
  22. package/.framework/functions/ai-agents.ts +10 -6
  23. package/.framework/functions/api-keys.ts +301 -122
  24. package/.framework/functions/apps.ts +63 -29
  25. package/.framework/functions/cil-ingest.ts +48 -15
  26. package/.framework/functions/debug-auth.ts +14 -8
  27. package/.framework/functions/deliveries.ts +39 -12
  28. package/.framework/functions/embeddings.ts +149 -78
  29. package/.framework/functions/integration-outbound.ts +67 -27
  30. package/.framework/functions/integrations.ts +254 -127
  31. package/.framework/functions/logs.ts +273 -133
  32. package/.framework/functions/observability.ts +278 -148
  33. package/.framework/functions/pipeline-executions.ts +1 -1
  34. package/.framework/functions/pipelines.ts +14 -9
  35. package/.framework/functions/prompt-configs.ts +7 -4
  36. package/.framework/functions/roles.ts +8 -5
  37. package/.framework/functions/security.ts +30 -17
  38. package/.framework/functions/system-cron.ts +240 -127
  39. package/.framework/functions/tests.ts +7 -6
  40. package/.framework/functions/timers.ts +310 -107
  41. package/.framework/functions/triggers.ts +28 -13
  42. package/.framework/functions/types.ts +13 -10
  43. package/.framework/migrations/069_log_stats_window.sql +54 -0
  44. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  45. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  46. package/.framework/migrations/072_slug_autofill.sql +77 -0
  47. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  48. package/.framework/migrations/074_app_route_prefix_domains.sql +168 -0
  49. package/.framework/migrations/075_security_definer_grants.sql +157 -0
  50. package/.framework/src/apps/admin/index.tsx +1141 -775
  51. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  52. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  53. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  54. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  55. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  56. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  57. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  58. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  59. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  60. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  61. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  62. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  63. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  64. package/.framework/src/components/ui/sheet.tsx +24 -26
  65. package/.framework/src/components/ui/textarea.tsx +74 -48
  66. package/.framework/src/contexts/AppContext.tsx +5 -12
  67. package/.framework/src/contexts/AuthContext.tsx +17 -9
  68. package/.framework/src/hooks/useApps.ts +18 -22
  69. package/.framework/src/hooks/useEntityList.ts +12 -9
  70. package/.framework/src/hooks/useListSchema.ts +108 -58
  71. package/.framework/src/instructions/README.md +74 -0
  72. package/.framework/src/instructions/accounts.md +97 -0
  73. package/.framework/src/instructions/ai-agents.md +69 -0
  74. package/.framework/src/instructions/alerts.md +80 -0
  75. package/.framework/src/instructions/api-keys.md +87 -0
  76. package/.framework/src/instructions/apps.md +77 -0
  77. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  78. package/.framework/src/instructions/concepts/apps-and-renderers.md +228 -0
  79. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  80. package/.framework/src/instructions/concepts/automation.md +186 -0
  81. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  82. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  83. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  84. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  85. package/.framework/src/instructions/concepts/observability.md +116 -0
  86. package/.framework/src/instructions/concepts/permissions.md +150 -0
  87. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  88. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  89. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  90. package/.framework/src/instructions/deliveries.md +59 -0
  91. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  92. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  93. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  94. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  95. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  96. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  97. package/.framework/src/instructions/integrations.md +96 -0
  98. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  99. package/.framework/src/instructions/internal/docs-contract.md +158 -0
  100. package/.framework/src/instructions/invites.md +60 -0
  101. package/.framework/src/instructions/kb.md +80 -0
  102. package/.framework/src/instructions/logs.md +77 -0
  103. package/.framework/src/instructions/notifications.md +77 -0
  104. package/.framework/src/instructions/observability.md +61 -0
  105. package/.framework/src/instructions/operations/deployment.md +115 -0
  106. package/.framework/src/instructions/operations/migrations.md +125 -0
  107. package/.framework/src/instructions/operations/security-checklist.md +170 -0
  108. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  109. package/.framework/src/instructions/operations/upgrade.md +116 -0
  110. package/.framework/src/instructions/people.md +91 -0
  111. package/.framework/src/instructions/pipeline-executions.md +62 -0
  112. package/.framework/src/instructions/pipelines.md +78 -0
  113. package/.framework/src/instructions/prompts.md +95 -0
  114. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  115. package/.framework/src/instructions/reference/api/auth.md +113 -0
  116. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  117. package/.framework/src/instructions/reference/app-manifest.md +184 -0
  118. package/.framework/src/instructions/reference/cli.md +124 -0
  119. package/.framework/src/instructions/reference/database.md +132 -0
  120. package/.framework/src/instructions/reference/design-schema.md +280 -0
  121. package/.framework/src/instructions/reference/env-vars.md +133 -0
  122. package/.framework/src/instructions/reference/frontend-sdk.md +207 -0
  123. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  124. package/.framework/src/instructions/reference/functions/admin-data.md +197 -0
  125. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  126. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  127. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  128. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  129. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  130. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  131. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  132. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  133. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  134. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  135. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  136. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  137. package/.framework/src/instructions/reference/functions/index.md +103 -0
  138. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  139. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  140. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  141. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  142. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  143. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  144. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  145. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  146. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  147. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  148. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  149. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  150. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  151. package/.framework/src/instructions/reference/functions/security.md +140 -0
  152. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  153. package/.framework/src/instructions/reference/functions/system.md +106 -0
  154. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  155. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  156. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  157. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  158. package/.framework/src/instructions/reference/functions/types.md +146 -0
  159. package/.framework/src/instructions/reference/seeds.md +126 -0
  160. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  161. package/.framework/src/instructions/reference/spine-config.md +114 -0
  162. package/.framework/src/instructions/roles.md +80 -0
  163. package/.framework/src/instructions/runtime-collaboration.md +106 -0
  164. package/.framework/src/instructions/runtime-detail.md +70 -0
  165. package/.framework/src/instructions/runtime-list.md +77 -0
  166. package/.framework/src/instructions/security.md +67 -0
  167. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  168. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  169. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  170. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  171. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  172. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  173. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  174. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  175. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  176. package/.framework/src/instructions/tasks/document-your-app.md +117 -0
  177. package/.framework/src/instructions/tasks/package-and-install-an-app.md +136 -0
  178. package/.framework/src/instructions/tasks/register-an-app.md +137 -0
  179. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  180. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  181. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  182. package/.framework/src/instructions/testing.md +59 -0
  183. package/.framework/src/instructions/timers.md +84 -0
  184. package/.framework/src/instructions/triggers.md +69 -0
  185. package/.framework/src/instructions/types.md +93 -0
  186. package/.framework/src/lib/app-mount.ts +88 -0
  187. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  188. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  189. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  190. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  191. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  192. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  193. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  194. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  195. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  196. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  197. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  198. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  199. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  200. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  201. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  202. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  203. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  204. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  205. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  206. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  207. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  208. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  209. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  210. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  211. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  212. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  213. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  214. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  215. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  216. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  217. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  218. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  219. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  220. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  221. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  222. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  223. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  224. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  225. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  226. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  227. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  228. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  229. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  230. package/.framework/src/pages/auth/LoginPage.tsx +3 -2
  231. package/.framework/src/pages/auth/RegisterPage.tsx +16 -8
  232. package/.framework/templates/agent/AGENTS.md +167 -0
  233. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  234. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  235. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  236. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  237. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +79 -0
  238. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  239. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +79 -0
  240. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +71 -0
  241. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +72 -0
  242. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  243. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  244. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  245. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  246. package/.framework/templates/project.json +4 -1
  247. package/.framework/tests/unit/account-scoping-gates.test.ts +394 -0
  248. package/.framework/tests/unit/agent-files.test.ts +355 -0
  249. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  250. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  251. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  252. package/.framework/tests/unit/app-mount.test.ts +80 -0
  253. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  254. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  255. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  256. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  257. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  258. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  259. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  260. package/.framework/tests/unit/security-definer-grants.test.ts +154 -0
  261. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  262. package/.framework/tests/unit/system-cron.test.ts +240 -0
  263. package/.framework/tests/unit/timers.test.ts +159 -0
  264. package/README.md +125 -166
  265. package/config/tsconfig.cli.json +2 -2
  266. package/package.json +15 -4
  267. package/templates/project/package-lock.json +2 -2
  268. package/.framework/docs/admin-routes.md +0 -76
  269. package/.framework/docs/api-docs-progress.md +0 -38
  270. package/.framework/docs/api-governance.md +0 -146
  271. package/.framework/docs/api-testing-results.md +0 -212
  272. package/.framework/docs/assembly-launch-guide.md +0 -138
  273. package/.framework/docs/audit-results.md +0 -590
  274. package/.framework/docs/db-api-inventory.md +0 -95
  275. package/.framework/docs/gap-remediation-backlog.md +0 -103
  276. package/.framework/docs/ui-adoption-verification.md +0 -111
  277. package/.framework/docs/ui-api-coverage.md +0 -84
  278. package/.framework/docs/v2-compatibility-audit.md +0 -228
  279. package/.framework/mcp/index.ts +0 -133
  280. package/.framework/mcp/load-env.ts +0 -60
  281. package/.framework/mcp/shared/app-manifest.ts +0 -275
  282. package/.framework/mcp/shared/db.ts +0 -477
  283. package/.framework/mcp/shared/kb.ts +0 -118
  284. package/.framework/mcp/tools/architect.ts +0 -431
  285. package/.framework/mcp/tools/cil/context.ts +0 -345
  286. package/.framework/mcp/tools/cil/graph.ts +0 -242
  287. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  288. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  289. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  290. package/.framework/mcp/tools/cil/project.ts +0 -791
  291. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  292. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  293. package/.framework/mcp/tools/cil/search.ts +0 -97
  294. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  295. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  296. package/.framework/mcp/tools/kb/delete.ts +0 -139
  297. package/.framework/mcp/tools/kb/index.ts +0 -52
  298. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  299. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  300. package/.framework/mcp/tools/kb/publish.ts +0 -100
  301. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  302. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  303. package/.framework/mcp/tools/kb/search.ts +0 -101
  304. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  305. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,3 +1,4 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/admin-data.ts"]
1
2
  /**
2
3
  * @module admin-data
3
4
  * @audience internal
@@ -13,7 +14,6 @@
13
14
  *
14
15
  * @cil-generated
15
16
  */
16
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/admin-data.ts"]
17
17
  // CIL[DOC-MACRO purpose="This module handles administrative data operations within the system, providing essential functionalities for managing records and permissions."]
18
18
  // CIL[DOC-RESPONSIBILITY responsibility="This module handles administrative data operations within the system, providing essential functionalities for managing records and permissions. It serves as an API handler for various administrative actions, ensuring that only authorized users can perform updates and access sensitive data. INVARIANT: Only users with system admin privileges can execute these operations."]
19
19
  // CIL[DOC-CONTEXT module="admin-data" layer="app-specific" related_files="middleware.ts (provides request handling logic).,permissions.ts (manages access control and validation).,db.ts (interfaces with the database for data operations).,principal.ts (determines user roles and permissions)."]
@@ -62,7 +62,6 @@ import { checkTypeSlugRateLimit } from './_shared/security'
62
62
  * @stability stable
63
63
  * @cil-generated
64
64
  */
65
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:permissions_all:constant" type="constant" identity="PERMISSIONS_ALL" parent="~/.framework/functions/admin-data.ts"]
66
65
  // CIL[DOC-MACRO purpose="PERMISSIONS_ALL constant"]
67
66
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the PERMISSIONS_ALL constant."]
68
67
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -70,11 +69,12 @@ import { checkTypeSlugRateLimit } from './_shared/security'
70
69
  // CIL[DOC-MICRO logic_summary="Implements the PERMISSIONS_ALL constant." notable_decisions="[]"]
71
70
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
72
71
  // CIL[DOC-STABILITY stability="stable"]
72
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:PERMISSIONS_ALL:constant" type="constant" identity="PERMISSIONS_ALL" parent="~/.framework/functions/admin-data.ts"]
73
73
  const PERMISSIONS_ALL = {
74
74
  record_permissions: { all: ['create', 'read', 'update', 'delete'] },
75
75
  fields: {}
76
76
  }
77
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:permissions_all:constant"]
77
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:PERMISSIONS_ALL:constant"]
78
78
  // CIL[DOC-VECTOR type="context" content="purpose='PERMISSIONS_ALL defines a comprehensive set of permissions for record management, including create, read, update, and delete actions.'; No verified external callers" status="ready"]
79
79
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
80
80
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -96,7 +96,6 @@ const PERMISSIONS_ALL = {
96
96
  * @stability stable
97
97
  * @cil-generated
98
98
  */
99
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:valid_entities:constant" type="constant" identity="VALID_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
100
99
  // CIL[DOC-MACRO purpose="VALID_ENTITIES constant"]
101
100
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the VALID_ENTITIES constant."]
102
101
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -104,8 +103,19 @@ const PERMISSIONS_ALL = {
104
103
  // CIL[DOC-MICRO logic_summary="Implements the VALID_ENTITIES constant." notable_decisions="[]"]
105
104
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
106
105
  // CIL[DOC-STABILITY stability="stable"]
106
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:VALID_ENTITIES:constant" type="constant" identity="VALID_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
107
107
  const VALID_ENTITIES = ['accounts', 'people', 'items', 'threads', 'messages', 'links', 'attachments', 'watchers', 'item_progress', 'logs', 'test_runs', 'observability', 'test_cases', 'types', 'link_types', 'ai_agents', 'prompt_configs']
108
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:valid_entities:constant"]
108
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:VALID_ENTITIES:constant"]
109
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:ENTITIES_WITHOUT_IS_ACTIVE:constant" type="constant" identity="ENTITIES_WITHOUT_IS_ACTIVE" parent="none"]
110
+ // CIL[DOC-MACRO purpose="Entities whose table has no is_active column — the default soft-delete filter must skip them"]
111
+ // CIL[DOC-RESPONSIBILITY responsibility="List VALID_ENTITIES tables lacking is_active so the list handler only applies the default is_active filter where the column exists"]
112
+ // CIL[DOC-CONTEXT module="admin-data" layer="functions" related_files=".framework/migrations/001_core_schema.sql"]
113
+ // CIL[DOC-CONTRACT inputs="none" outputs="readonly Set<string> of entity names" errors="none" side_effects="none"]
114
+ // CIL[DOC-MICRO logic_summary="links, attachments, watchers, logs, and observability have no is_active column; applying the default filter to them yields 42703 column-does-not-exist" notable_decisions="['explicit_is_active_param_still_errors_on_these_tables']"]
115
+ // CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
116
+ // CIL[DOC-STABILITY stability="stable"]
117
+ const ENTITIES_WITHOUT_IS_ACTIVE = new Set(['links', 'attachments', 'watchers', 'logs', 'observability'])
118
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:ENTITIES_WITHOUT_IS_ACTIVE:constant"]
109
119
  // CIL[DOC-MACRO purpose="VALID_ENTITIES constant"]
110
120
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the VALID_ENTITIES constant."]
111
121
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -134,7 +144,6 @@ const VALID_ENTITIES = ['accounts', 'people', 'items', 'threads', 'messages', 'l
134
144
  * @stability stable
135
145
  * @cil-generated
136
146
  */
137
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:raw_entities:constant" type="constant" identity="RAW_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
138
147
  // CIL[DOC-MACRO purpose="RAW_ENTITIES constant"]
139
148
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the RAW_ENTITIES constant."]
140
149
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -142,11 +151,14 @@ const VALID_ENTITIES = ['accounts', 'people', 'items', 'threads', 'messages', 'l
142
151
  // CIL[DOC-MICRO logic_summary="Implements the RAW_ENTITIES constant." notable_decisions="[]"]
143
152
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
144
153
  // CIL[DOC-STABILITY stability="stable"]
154
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:RAW_ENTITIES:constant" type="constant" identity="RAW_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
145
155
  const RAW_ENTITIES = ['logs', 'test_runs', 'observability', 'test_cases']
156
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:RAW_ENTITIES:constant"]
146
157
  // Entities with no created_by/updated_by columns — audit stamps must be
147
158
  // omitted or writes fail with schema-cache errors.
159
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:UNAUDITED_ENTITIES:constant" type="constant" identity="UNAUDITED_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
148
160
  const UNAUDITED_ENTITIES = ['types', 'link_types']
149
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:raw_entities:constant"]
161
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:UNAUDITED_ENTITIES:constant"]
150
162
  // CIL[DOC-MACRO purpose="RAW_ENTITIES constant"]
151
163
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the RAW_ENTITIES constant."]
152
164
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -175,7 +187,6 @@ const UNAUDITED_ENTITIES = ['types', 'link_types']
175
187
  * @stability stable
176
188
  * @cil-generated
177
189
  */
178
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:entity_to_kind:constant" type="constant" identity="ENTITY_TO_KIND" parent="~/.framework/functions/admin-data.ts"]
179
190
  // CIL[DOC-MACRO purpose="ENTITY_TO_KIND constant"]
180
191
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the ENTITY_TO_KIND constant."]
181
192
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -183,6 +194,7 @@ const UNAUDITED_ENTITIES = ['types', 'link_types']
183
194
  // CIL[DOC-MICRO logic_summary="Implements the ENTITY_TO_KIND constant." notable_decisions="[]"]
184
195
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
185
196
  // CIL[DOC-STABILITY stability="stable"]
197
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:ENTITY_TO_KIND:constant" type="constant" identity="ENTITY_TO_KIND" parent="~/.framework/functions/admin-data.ts"]
186
198
  const ENTITY_TO_KIND: Record<string, string> = {
187
199
  accounts: 'account',
188
200
  people: 'person',
@@ -194,7 +206,7 @@ const ENTITY_TO_KIND: Record<string, string> = {
194
206
  watchers: 'watcher',
195
207
  item_progress: 'item_progress'
196
208
  }
197
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:entity_to_kind:constant"]
209
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:ENTITY_TO_KIND:constant"]
198
210
  // CIL[DOC-VECTOR type="context" content="purpose='ENTITY_TO_KIND is a mapping of entity names to their corresponding kind identifiers.'; No verified external callers" status="ready"]
199
211
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
200
212
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -217,7 +229,6 @@ const ENTITY_TO_KIND: Record<string, string> = {
217
229
  * @calls withAdminLogging, resolveTypeIds, getSearchField
218
230
  * @cil-generated
219
231
  */
220
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/admin-data.ts"]
221
232
  // CIL[DOC-MACRO purpose="list constant"]
222
233
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the list constant."]
223
234
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -225,8 +236,9 @@ const ENTITY_TO_KIND: Record<string, string> = {
225
236
  // CIL[DOC-MICRO logic_summary="Implements the list constant." notable_decisions="[]"]
226
237
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
227
238
  // CIL[DOC-STABILITY stability="stable"]
239
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/admin-data.ts"]
228
240
  export const list = createHandler(async (ctx, _body) => {
229
- const { entity, action, method, search, sort_field = 'created_at', sort_direction = 'desc', limit = 50, offset = 0, type_slug, type_slugs, view: viewSlug, flag_only, exclude_flag, ...filters } = ctx.query || {}
241
+ const { entity, action, method, search, sort_field = 'created_at', sort_direction = 'desc', limit = 50, offset = 0, type_slug, type_slugs, view: viewSlug, flag_only, exclude_flag, include_inactive, ...filters } = ctx.query || {}
230
242
 
231
243
  return await withAdminLogging(
232
244
  ctx,
@@ -292,6 +304,14 @@ export const list = createHandler(async (ctx, _body) => {
292
304
  }
293
305
  })
294
306
 
307
+ // Soft-deleted rows are hidden by default — pass is_active=false or
308
+ // include_inactive=true to see them. Entities without an is_active
309
+ // column (links, attachments, watchers, logs, observability) skip the
310
+ // default filter — it would 500 with 42703 column-does-not-exist.
311
+ if (filters.is_active === undefined && include_inactive !== 'true' && !ENTITIES_WITHOUT_IS_ACTIVE.has(entity)) {
312
+ query = query.eq('is_active', true)
313
+ }
314
+
295
315
  // Generic record-flag filters on the row's data jsonb. flag_only=<field>
296
316
  // returns only rows where data->>field is 'true'; exclude_flag=<field>
297
317
  // hides them (null counts as unset). Flag fields are stamped server-side
@@ -405,7 +425,6 @@ export const list = createHandler(async (ctx, _body) => {
405
425
  * @errorHandling returns null on error during data fetching.
406
426
  * @cil-generated
407
427
  */
408
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:attachlineage:function" type="function" identity="attachLineage" parent="~/.framework/functions/admin-data.ts"]
409
428
  // CIL[DOC-MACRO purpose="attachLineage function"]
410
429
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the attachLineage function from type-declared lineage config."]
411
430
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -413,6 +432,7 @@ export const list = createHandler(async (ctx, _body) => {
413
432
  // CIL[DOC-MICRO logic_summary="Reads functionality.lineage off the record's type design_schema; parents walk declared link_type then parent_fields (5-hop, visited-set cycle guard); children resolve via reverse link_type edges plus per-child-type data field lookups." notable_decisions="['link_type queries are guarded by the declared link_type, parent scan by declared parent_fields, child field lookups by declared children — a type with no lineage block attaches empty arrays with no link/data queries']"]
414
433
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
415
434
  // CIL[DOC-STABILITY stability="stable"]
435
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:attachLineage:function" type="function" identity="attachLineage" parent="~/.framework/functions/admin-data.ts"]
416
436
  async function attachLineage(record: any, ctx: any): Promise<void> {
417
437
  // Lineage is declared per item type in design_schema.functionality.lineage:
418
438
  // { parent_fields: string[], link_type: string, children: { [childTypeSlug]: field } }
@@ -516,7 +536,7 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
516
536
  record.parents = parents
517
537
  record.children = children
518
538
  }
519
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:attachlineage:function"]
539
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:attachLineage:function"]
520
540
  // CIL[DOC-VECTOR type="context" content="purpose='The attachLineage function retrieves and attaches parent and child records to a given record based on its lineage in a hierarchical structure.'; No verified external callers" status="ready"]
521
541
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
522
542
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -540,7 +560,6 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
540
560
  * @calls withAdminLogging, ctx.db.from, sanitizeRecordData, adminDb.from, attachLineage, projectMessageForCustomer
541
561
  * @cil-generated
542
562
  */
543
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/admin-data.ts"]
544
563
  // CIL[DOC-MACRO purpose="get constant"]
545
564
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the get constant."]
546
565
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -548,6 +567,7 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
548
567
  // CIL[DOC-MICRO logic_summary="Implements the get constant." notable_decisions="[]"]
549
568
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
550
569
  // CIL[DOC-STABILITY stability="stable"]
570
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/admin-data.ts"]
551
571
  export const get = createHandler(async (ctx, _body) => {
552
572
  const { entity, id, view: viewSlug } = ctx.query || {}
553
573
  const method = ctx.query?.method || 'GET'
@@ -639,7 +659,6 @@ export const get = createHandler(async (ctx, _body) => {
639
659
  * @calls withAdminLogging, ctx.db.from, fireCreateTriggers, sanitizeRecordData
640
660
  * @cil-generated
641
661
  */
642
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/admin-data.ts"]
643
662
  // CIL[DOC-MACRO purpose="create constant"]
644
663
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the create constant."]
645
664
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -647,6 +666,7 @@ export const get = createHandler(async (ctx, _body) => {
647
666
  // CIL[DOC-MICRO logic_summary="Implements the create constant." notable_decisions="[]"]
648
667
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
649
668
  // CIL[DOC-STABILITY stability="stable"]
669
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/admin-data.ts"]
650
670
  export const create = createHandler(async (ctx, body) => {
651
671
  const entity = body?.entity || ctx.query?.entity
652
672
  const type_slug = body?.type_slug
@@ -686,7 +706,8 @@ export const create = createHandler(async (ctx, body) => {
686
706
  if (entity === 'observability' && (!raw.metric_name || raw.metric_value === undefined)) { const e: any = new Error('metric_name and metric_value are required for observability'); e.statusCode = 400; throw e }
687
707
  if (entity === 'test_cases' && (!raw.slug || !raw.name)) { const e: any = new Error('slug and name are required for test_cases'); e.statusCode = 400; throw e }
688
708
 
689
- const { data, error: err } = await ctx.db.from(entity).insert(raw).select().single()
709
+ const rawInsertDb = (ctx.principal?.isInternal || isSystemAdmin(ctx.principal)) ? adminDb : ctx.db
710
+ const { data, error: err } = await rawInsertDb.from(entity).insert(raw).select().single()
690
711
  if (err) throw err
691
712
  // Await the trigger check: the heavy work already offloads to
692
713
  // pipeline-runner-background, so this only adds eval + queue insert
@@ -802,7 +823,9 @@ export const create = createHandler(async (ctx, body) => {
802
823
  throw e
803
824
  }
804
825
 
805
- const insertDb = entity === 'accounts' ? adminDb : ctx.db
826
+ // Function-side permission check already ran — write via service role.
827
+ // ctx.db is PostgREST `authenticated` for humans, which holds SELECT only.
828
+ const insertDb = adminDb
806
829
 
807
830
  const { data, error: err } = await insertDb.from(entity)
808
831
  .insert(dataToInsert)
@@ -841,7 +864,6 @@ export const create = createHandler(async (ctx, body) => {
841
864
  * @calls withAdminLogging, validateUpdatePermissions, ctx.db.from, fireUpdateTriggers, sanitizeRecordData
842
865
  * @cil-generated
843
866
  */
844
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/admin-data.ts"]
845
867
  // CIL[DOC-MACRO purpose="update constant"]
846
868
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the update constant."]
847
869
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -849,6 +871,7 @@ export const create = createHandler(async (ctx, body) => {
849
871
  // CIL[DOC-MICRO logic_summary="Implements the update constant." notable_decisions="[]"]
850
872
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
851
873
  // CIL[DOC-STABILITY stability="stable"]
874
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/admin-data.ts"]
852
875
  export const update = createHandler(async (ctx, body) => {
853
876
  const { entity, id } = ctx.query || {}
854
877
  const method = ctx.query?.method || 'PATCH'
@@ -910,7 +933,7 @@ export const update = createHandler(async (ctx, body) => {
910
933
  updated_at: new Date().toISOString()
911
934
  }
912
935
 
913
- const { data, error: err } = await ctx.db.from(entity)
936
+ const { data, error: err } = await adminDb.from(entity)
914
937
  .update(dataToUpdate)
915
938
  .eq('id', id)
916
939
  .select()
@@ -950,7 +973,6 @@ export const update = createHandler(async (ctx, body) => {
950
973
  * @calls withAdminLogging, ctx.db.from, resolveFirstSurfacePermissions, entitySupportsSoftDelete, sanitizeRecordData
951
974
  * @cil-generated
952
975
  */
953
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/admin-data.ts"]
954
976
  // CIL[DOC-MACRO purpose="remove constant"]
955
977
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the remove constant."]
956
978
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -958,6 +980,7 @@ export const update = createHandler(async (ctx, body) => {
958
980
  // CIL[DOC-MICRO logic_summary="Implements the remove constant." notable_decisions="[]"]
959
981
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
960
982
  // CIL[DOC-STABILITY stability="stable"]
983
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/admin-data.ts"]
961
984
  export const remove = createHandler(async (ctx, _body) => {
962
985
  const { entity, id, soft = 'true' } = ctx.query || {}
963
986
  const method = ctx.query?.method || 'DELETE'
@@ -1006,7 +1029,7 @@ export const remove = createHandler(async (ctx, _body) => {
1006
1029
  const isSoftDelete = soft === 'true'
1007
1030
 
1008
1031
  if (isSoftDelete && entitySupportsSoftDelete(entity)) {
1009
- const { data, error: err } = await ctx.db.from(entity)
1032
+ const { data, error: err } = await adminDb.from(entity)
1010
1033
  .update({
1011
1034
  is_active: false,
1012
1035
  updated_by: ctx.principal?.type === 'human' ? ctx.principal.id : null,
@@ -1019,7 +1042,7 @@ export const remove = createHandler(async (ctx, _body) => {
1019
1042
  if (err) throw err
1020
1043
  return { deleted: true, soft: true, data: await sanitizeRecordData(ctx, data, entity) }
1021
1044
  } else {
1022
- const { error: err } = await ctx.db.from(entity)
1045
+ const { error: err } = await adminDb.from(entity)
1023
1046
  .delete()
1024
1047
  .eq('id', id)
1025
1048
 
@@ -1053,7 +1076,6 @@ export const remove = createHandler(async (ctx, _body) => {
1053
1076
  * @stability stable
1054
1077
  * @cil-generated
1055
1078
  */
1056
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:getsearchfield:function" type="function" identity="getSearchField" parent="~/.framework/functions/admin-data.ts"]
1057
1079
  // CIL[DOC-MACRO purpose="getSearchField function"]
1058
1080
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the getSearchField function."]
1059
1081
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1061,6 +1083,7 @@ export const remove = createHandler(async (ctx, _body) => {
1061
1083
  // CIL[DOC-MICRO logic_summary="Implements the getSearchField function." notable_decisions="[]"]
1062
1084
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1063
1085
  // CIL[DOC-STABILITY stability="stable"]
1086
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:getSearchField:function" type="function" identity="getSearchField" parent="~/.framework/functions/admin-data.ts"]
1064
1087
  function getSearchField(entity: string): string {
1065
1088
  const searchFields: Record<string, string> = {
1066
1089
  accounts: 'display_name',
@@ -1079,7 +1102,7 @@ function getSearchField(entity: string): string {
1079
1102
  }
1080
1103
  return searchFields[entity] || 'id'
1081
1104
  }
1082
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:getsearchfield:function"]
1105
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:getSearchField:function"]
1083
1106
  // CIL[DOC-VECTOR type="context" content="purpose='Retrieves the appropriate search field name for a given entity type.'; No verified external callers" status="ready"]
1084
1107
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1085
1108
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -1103,7 +1126,6 @@ function getSearchField(entity: string): string {
1103
1126
  * @stability stable
1104
1127
  * @cil-generated
1105
1128
  */
1106
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:entitysupportssoftdelete:function" type="function" identity="entitySupportsSoftDelete" parent="~/.framework/functions/admin-data.ts"]
1107
1129
  // CIL[DOC-MACRO purpose="entitySupportsSoftDelete function"]
1108
1130
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the entitySupportsSoftDelete function."]
1109
1131
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1111,11 +1133,12 @@ function getSearchField(entity: string): string {
1111
1133
  // CIL[DOC-MICRO logic_summary="Implements the entitySupportsSoftDelete function." notable_decisions="[]"]
1112
1134
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1113
1135
  // CIL[DOC-STABILITY stability="stable"]
1136
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:entitySupportsSoftDelete:function" type="function" identity="entitySupportsSoftDelete" parent="~/.framework/functions/admin-data.ts"]
1114
1137
  function entitySupportsSoftDelete(entity: string): boolean {
1115
1138
  const softDeleteEntities = ['accounts', 'people', 'items', 'threads', 'messages', 'watchers', 'item_progress', 'test_cases']
1116
1139
  return softDeleteEntities.includes(entity)
1117
1140
  }
1118
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:entitysupportssoftdelete:function"]
1141
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:entitySupportsSoftDelete:function"]
1119
1142
  // CIL[DOC-VECTOR type="context" content="purpose='Determines if a given entity supports soft deletion by checking against a predefined list of entities.'; No verified external callers" status="ready"]
1120
1143
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1121
1144
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -1138,7 +1161,6 @@ function entitySupportsSoftDelete(entity: string): boolean {
1138
1161
  * @calls withAdminLogging, ctx.db.from
1139
1162
  * @cil-generated
1140
1163
  */
1141
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:stats:constant" type="constant" identity="stats" parent="~/.framework/functions/admin-data.ts"]
1142
1164
  // CIL[DOC-MACRO purpose="stats constant"]
1143
1165
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the stats constant."]
1144
1166
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1146,6 +1168,7 @@ function entitySupportsSoftDelete(entity: string): boolean {
1146
1168
  // CIL[DOC-MICRO logic_summary="Implements the stats constant." notable_decisions="[]"]
1147
1169
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1148
1170
  // CIL[DOC-STABILITY stability="stable"]
1171
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:stats:constant" type="constant" identity="stats" parent="~/.framework/functions/admin-data.ts"]
1149
1172
  export const stats = createHandler(async (ctx, _body) => {
1150
1173
  const { entity } = ctx.query || {}
1151
1174
  const method = ctx.query?.method || 'GET'
@@ -1194,7 +1217,6 @@ export const stats = createHandler(async (ctx, _body) => {
1194
1217
  * @calls list, get, stats, create, update, remove
1195
1218
  * @cil-generated
1196
1219
  */
1197
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/admin-data.ts"]
1198
1220
  // CIL[DOC-MACRO purpose="handler constant"]
1199
1221
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the handler constant."]
1200
1222
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1202,6 +1224,7 @@ export const stats = createHandler(async (ctx, _body) => {
1202
1224
  // CIL[DOC-MICRO logic_summary="Implements the handler constant." notable_decisions="[]"]
1203
1225
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1204
1226
  // CIL[DOC-STABILITY stability="stable"]
1227
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/admin-data.ts"]
1205
1228
  export const handler = createHandler(async (ctx, body) => {
1206
1229
  const { action } = ctx.query || {}
1207
1230
  const method = ctx.query?.method || 'GET'
@@ -244,7 +244,8 @@ export const create = createHandler(async (ctx, body) => {
244
244
  throw new Error('User context (person and account) required')
245
245
  }
246
246
 
247
- const { data, error: err } = await ctx.db
247
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
248
+ const { data, error: err } = await db
248
249
  .from('ai_agents')
249
250
  .insert({
250
251
  app_id: app_id || null,
@@ -258,7 +259,7 @@ export const create = createHandler(async (ctx, body) => {
258
259
  capabilities: capabilities || [],
259
260
  constraints: constraints || {},
260
261
  metadata: metadata || {},
261
- created_by: ctx.principal.id
262
+ created_by: ctx.principal.type === 'human' ? ctx.principal.id : null
262
263
  })
263
264
  .select()
264
265
  .single()
@@ -325,7 +326,8 @@ export const update = createHandler(async (ctx, body) => {
325
326
  if (updates[key] !== undefined) updateData[key] = updates[key]
326
327
  }
327
328
 
328
- const { data, error: err } = await ctx.db
329
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
330
+ const { data, error: err } = await db
329
331
  .from('ai_agents')
330
332
  .update(updateData)
331
333
  .eq('id', id)
@@ -383,7 +385,8 @@ export const remove = createHandler(async (ctx, _body) => {
383
385
  throw new Error('Agent ID is required')
384
386
  }
385
387
 
386
- const { data: current } = await ctx.db
388
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
389
+ const { data: current } = await db
387
390
  .from('ai_agents')
388
391
  .select('id, name')
389
392
  .eq('id', id)
@@ -391,7 +394,7 @@ export const remove = createHandler(async (ctx, _body) => {
391
394
 
392
395
  if (!current) throw new Error('Agent not found')
393
396
 
394
- const { error: err } = await ctx.db
397
+ const { error: err } = await db
395
398
  .from('ai_agents')
396
399
  .delete()
397
400
  .eq('id', id)
@@ -449,7 +452,8 @@ export const run = createHandler(async (ctx, body) => {
449
452
  throw new Error('User context (person and account) required')
450
453
  }
451
454
 
452
- const { data, error: err } = await ctx.db
455
+ const db = isSystemAdmin(ctx.principal) ? adminDb : ctx.db
456
+ const { data, error: err } = await db
453
457
  .from('threads')
454
458
  .select('*, type:types(*)')
455
459
  .eq('id', thread_id)