spine-framework 0.4.4 → 0.5.0-rc.4

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 (283) 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/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  15. package/.framework/functions/_shared/logging.ts +562 -224
  16. package/.framework/functions/_shared/middleware.ts +47 -44
  17. package/.framework/functions/admin-data.ts +39 -28
  18. package/.framework/functions/ai-agents.ts +10 -6
  19. package/.framework/functions/api-keys.ts +301 -122
  20. package/.framework/functions/apps.ts +43 -26
  21. package/.framework/functions/cil-ingest.ts +48 -15
  22. package/.framework/functions/debug-auth.ts +14 -8
  23. package/.framework/functions/deliveries.ts +39 -12
  24. package/.framework/functions/embeddings.ts +145 -76
  25. package/.framework/functions/integration-outbound.ts +67 -27
  26. package/.framework/functions/integrations.ts +254 -127
  27. package/.framework/functions/logs.ts +273 -133
  28. package/.framework/functions/observability.ts +277 -147
  29. package/.framework/functions/pipeline-executions.ts +1 -1
  30. package/.framework/functions/pipelines.ts +14 -9
  31. package/.framework/functions/prompt-configs.ts +7 -4
  32. package/.framework/functions/roles.ts +8 -5
  33. package/.framework/functions/security.ts +30 -17
  34. package/.framework/functions/system-cron.ts +240 -127
  35. package/.framework/functions/tests.ts +7 -6
  36. package/.framework/functions/timers.ts +310 -107
  37. package/.framework/functions/triggers.ts +28 -13
  38. package/.framework/functions/types.ts +13 -10
  39. package/.framework/migrations/069_log_stats_window.sql +54 -0
  40. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  41. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  42. package/.framework/migrations/072_slug_autofill.sql +77 -0
  43. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  44. package/.framework/src/apps/admin/index.tsx +1141 -775
  45. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  46. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  47. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  48. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  49. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  50. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  51. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  52. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  53. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  54. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  55. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  56. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  57. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  58. package/.framework/src/components/ui/sheet.tsx +24 -26
  59. package/.framework/src/components/ui/textarea.tsx +74 -48
  60. package/.framework/src/hooks/useEntityList.ts +12 -9
  61. package/.framework/src/hooks/useListSchema.ts +108 -58
  62. package/.framework/src/instructions/README.md +57 -0
  63. package/.framework/src/instructions/ai-agents.md +69 -0
  64. package/.framework/src/instructions/alerts.md +80 -0
  65. package/.framework/src/instructions/api-keys.md +87 -0
  66. package/.framework/src/instructions/apps.md +77 -0
  67. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  68. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  69. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  70. package/.framework/src/instructions/concepts/automation.md +186 -0
  71. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  72. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  73. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  74. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  75. package/.framework/src/instructions/concepts/observability.md +116 -0
  76. package/.framework/src/instructions/concepts/permissions.md +150 -0
  77. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  78. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  79. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  80. package/.framework/src/instructions/deliveries.md +59 -0
  81. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  82. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  83. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  84. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  85. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  86. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  87. package/.framework/src/instructions/integrations.md +96 -0
  88. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  89. package/.framework/src/instructions/invites.md +60 -0
  90. package/.framework/src/instructions/kb.md +80 -0
  91. package/.framework/src/instructions/logs.md +77 -0
  92. package/.framework/src/instructions/observability.md +61 -0
  93. package/.framework/src/instructions/operations/deployment.md +115 -0
  94. package/.framework/src/instructions/operations/migrations.md +125 -0
  95. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  96. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  97. package/.framework/src/instructions/operations/upgrade.md +116 -0
  98. package/.framework/src/instructions/pipeline-executions.md +62 -0
  99. package/.framework/src/instructions/pipelines.md +78 -0
  100. package/.framework/src/instructions/prompts.md +95 -0
  101. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  102. package/.framework/src/instructions/reference/api/auth.md +113 -0
  103. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  104. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  105. package/.framework/src/instructions/reference/cli.md +124 -0
  106. package/.framework/src/instructions/reference/database.md +132 -0
  107. package/.framework/src/instructions/reference/design-schema.md +280 -0
  108. package/.framework/src/instructions/reference/env-vars.md +133 -0
  109. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  110. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  111. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  112. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  113. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  114. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  115. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  116. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  117. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  118. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  119. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  120. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  121. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  122. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  123. package/.framework/src/instructions/reference/functions/index.md +103 -0
  124. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  125. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  126. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  127. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  128. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  129. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  130. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  131. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  132. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  133. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  134. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  135. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  136. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  137. package/.framework/src/instructions/reference/functions/security.md +140 -0
  138. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  139. package/.framework/src/instructions/reference/functions/system.md +106 -0
  140. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  141. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  142. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  143. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  144. package/.framework/src/instructions/reference/functions/types.md +146 -0
  145. package/.framework/src/instructions/reference/seeds.md +126 -0
  146. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  147. package/.framework/src/instructions/reference/spine-config.md +114 -0
  148. package/.framework/src/instructions/roles.md +80 -0
  149. package/.framework/src/instructions/runtime-detail.md +70 -0
  150. package/.framework/src/instructions/runtime-list.md +77 -0
  151. package/.framework/src/instructions/security.md +67 -0
  152. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  153. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  154. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  155. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  156. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  157. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  158. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  159. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  160. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  161. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  162. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  163. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  164. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  165. package/.framework/src/instructions/testing.md +59 -0
  166. package/.framework/src/instructions/timers.md +82 -0
  167. package/.framework/src/instructions/triggers.md +69 -0
  168. package/.framework/src/instructions/types.md +93 -0
  169. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  170. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  171. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  172. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  173. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  174. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  175. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  176. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  177. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  178. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  179. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  180. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  181. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  182. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  183. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  184. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  185. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  186. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  187. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  188. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  189. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  190. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  191. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  192. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  193. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  194. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  195. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  196. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  197. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  198. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  199. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  200. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  201. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  202. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  203. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  204. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  205. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  206. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  207. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  208. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  209. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  210. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  211. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  212. package/.framework/templates/agent/AGENTS.md +150 -0
  213. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  214. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  215. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  216. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  217. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  218. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  219. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  220. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  221. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  222. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  223. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  224. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  225. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  226. package/.framework/templates/project.json +4 -1
  227. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  228. package/.framework/tests/unit/agent-files.test.ts +355 -0
  229. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  230. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  231. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  232. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  233. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  234. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  235. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  236. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  237. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  238. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  239. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  240. package/.framework/tests/unit/system-cron.test.ts +240 -0
  241. package/.framework/tests/unit/timers.test.ts +159 -0
  242. package/README.md +125 -166
  243. package/config/tsconfig.cli.json +2 -2
  244. package/package.json +15 -4
  245. package/templates/project/package-lock.json +2 -2
  246. package/.framework/docs/admin-routes.md +0 -76
  247. package/.framework/docs/api-docs-progress.md +0 -38
  248. package/.framework/docs/api-governance.md +0 -146
  249. package/.framework/docs/api-testing-results.md +0 -212
  250. package/.framework/docs/assembly-launch-guide.md +0 -138
  251. package/.framework/docs/audit-results.md +0 -590
  252. package/.framework/docs/db-api-inventory.md +0 -95
  253. package/.framework/docs/gap-remediation-backlog.md +0 -103
  254. package/.framework/docs/ui-adoption-verification.md +0 -111
  255. package/.framework/docs/ui-api-coverage.md +0 -84
  256. package/.framework/docs/v2-compatibility-audit.md +0 -228
  257. package/.framework/mcp/index.ts +0 -133
  258. package/.framework/mcp/load-env.ts +0 -60
  259. package/.framework/mcp/shared/app-manifest.ts +0 -275
  260. package/.framework/mcp/shared/db.ts +0 -477
  261. package/.framework/mcp/shared/kb.ts +0 -118
  262. package/.framework/mcp/tools/architect.ts +0 -431
  263. package/.framework/mcp/tools/cil/context.ts +0 -345
  264. package/.framework/mcp/tools/cil/graph.ts +0 -242
  265. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  266. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  267. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  268. package/.framework/mcp/tools/cil/project.ts +0 -791
  269. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  270. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  271. package/.framework/mcp/tools/cil/search.ts +0 -97
  272. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  273. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  274. package/.framework/mcp/tools/kb/delete.ts +0 -139
  275. package/.framework/mcp/tools/kb/index.ts +0 -52
  276. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  277. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  278. package/.framework/mcp/tools/kb/publish.ts +0 -100
  279. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  280. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  281. package/.framework/mcp/tools/kb/search.ts +0 -101
  282. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  283. 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,9 @@ 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
109
  // CIL[DOC-MACRO purpose="VALID_ENTITIES constant"]
110
110
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the VALID_ENTITIES constant."]
111
111
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -134,7 +134,6 @@ const VALID_ENTITIES = ['accounts', 'people', 'items', 'threads', 'messages', 'l
134
134
  * @stability stable
135
135
  * @cil-generated
136
136
  */
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
137
  // CIL[DOC-MACRO purpose="RAW_ENTITIES constant"]
139
138
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the RAW_ENTITIES constant."]
140
139
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -142,11 +141,14 @@ const VALID_ENTITIES = ['accounts', 'people', 'items', 'threads', 'messages', 'l
142
141
  // CIL[DOC-MICRO logic_summary="Implements the RAW_ENTITIES constant." notable_decisions="[]"]
143
142
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
144
143
  // CIL[DOC-STABILITY stability="stable"]
144
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:RAW_ENTITIES:constant" type="constant" identity="RAW_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
145
145
  const RAW_ENTITIES = ['logs', 'test_runs', 'observability', 'test_cases']
146
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:RAW_ENTITIES:constant"]
146
147
  // Entities with no created_by/updated_by columns — audit stamps must be
147
148
  // omitted or writes fail with schema-cache errors.
149
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:UNAUDITED_ENTITIES:constant" type="constant" identity="UNAUDITED_ENTITIES" parent="~/.framework/functions/admin-data.ts"]
148
150
  const UNAUDITED_ENTITIES = ['types', 'link_types']
149
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:raw_entities:constant"]
151
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:UNAUDITED_ENTITIES:constant"]
150
152
  // CIL[DOC-MACRO purpose="RAW_ENTITIES constant"]
151
153
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the RAW_ENTITIES constant."]
152
154
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -175,7 +177,6 @@ const UNAUDITED_ENTITIES = ['types', 'link_types']
175
177
  * @stability stable
176
178
  * @cil-generated
177
179
  */
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
180
  // CIL[DOC-MACRO purpose="ENTITY_TO_KIND constant"]
180
181
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the ENTITY_TO_KIND constant."]
181
182
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -183,6 +184,7 @@ const UNAUDITED_ENTITIES = ['types', 'link_types']
183
184
  // CIL[DOC-MICRO logic_summary="Implements the ENTITY_TO_KIND constant." notable_decisions="[]"]
184
185
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
185
186
  // CIL[DOC-STABILITY stability="stable"]
187
+ // 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
188
  const ENTITY_TO_KIND: Record<string, string> = {
187
189
  accounts: 'account',
188
190
  people: 'person',
@@ -194,7 +196,7 @@ const ENTITY_TO_KIND: Record<string, string> = {
194
196
  watchers: 'watcher',
195
197
  item_progress: 'item_progress'
196
198
  }
197
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:entity_to_kind:constant"]
199
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:ENTITY_TO_KIND:constant"]
198
200
  // 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
201
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
200
202
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -217,7 +219,6 @@ const ENTITY_TO_KIND: Record<string, string> = {
217
219
  * @calls withAdminLogging, resolveTypeIds, getSearchField
218
220
  * @cil-generated
219
221
  */
220
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/admin-data.ts"]
221
222
  // CIL[DOC-MACRO purpose="list constant"]
222
223
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the list constant."]
223
224
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -225,8 +226,9 @@ const ENTITY_TO_KIND: Record<string, string> = {
225
226
  // CIL[DOC-MICRO logic_summary="Implements the list constant." notable_decisions="[]"]
226
227
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
227
228
  // CIL[DOC-STABILITY stability="stable"]
229
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/admin-data.ts"]
228
230
  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 || {}
231
+ 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
232
 
231
233
  return await withAdminLogging(
232
234
  ctx,
@@ -292,6 +294,12 @@ export const list = createHandler(async (ctx, _body) => {
292
294
  }
293
295
  })
294
296
 
297
+ // Soft-deleted rows are hidden by default — pass is_active=false or
298
+ // include_inactive=true to see them.
299
+ if (filters.is_active === undefined && include_inactive !== 'true') {
300
+ query = query.eq('is_active', true)
301
+ }
302
+
295
303
  // Generic record-flag filters on the row's data jsonb. flag_only=<field>
296
304
  // returns only rows where data->>field is 'true'; exclude_flag=<field>
297
305
  // hides them (null counts as unset). Flag fields are stamped server-side
@@ -405,7 +413,6 @@ export const list = createHandler(async (ctx, _body) => {
405
413
  * @errorHandling returns null on error during data fetching.
406
414
  * @cil-generated
407
415
  */
408
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:attachlineage:function" type="function" identity="attachLineage" parent="~/.framework/functions/admin-data.ts"]
409
416
  // CIL[DOC-MACRO purpose="attachLineage function"]
410
417
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the attachLineage function from type-declared lineage config."]
411
418
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -413,6 +420,7 @@ export const list = createHandler(async (ctx, _body) => {
413
420
  // 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
421
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
415
422
  // CIL[DOC-STABILITY stability="stable"]
423
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:attachLineage:function" type="function" identity="attachLineage" parent="~/.framework/functions/admin-data.ts"]
416
424
  async function attachLineage(record: any, ctx: any): Promise<void> {
417
425
  // Lineage is declared per item type in design_schema.functionality.lineage:
418
426
  // { parent_fields: string[], link_type: string, children: { [childTypeSlug]: field } }
@@ -516,7 +524,7 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
516
524
  record.parents = parents
517
525
  record.children = children
518
526
  }
519
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:attachlineage:function"]
527
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:attachLineage:function"]
520
528
  // 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
529
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
522
530
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -540,7 +548,6 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
540
548
  * @calls withAdminLogging, ctx.db.from, sanitizeRecordData, adminDb.from, attachLineage, projectMessageForCustomer
541
549
  * @cil-generated
542
550
  */
543
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/admin-data.ts"]
544
551
  // CIL[DOC-MACRO purpose="get constant"]
545
552
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the get constant."]
546
553
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -548,6 +555,7 @@ async function attachLineage(record: any, ctx: any): Promise<void> {
548
555
  // CIL[DOC-MICRO logic_summary="Implements the get constant." notable_decisions="[]"]
549
556
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
550
557
  // CIL[DOC-STABILITY stability="stable"]
558
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/admin-data.ts"]
551
559
  export const get = createHandler(async (ctx, _body) => {
552
560
  const { entity, id, view: viewSlug } = ctx.query || {}
553
561
  const method = ctx.query?.method || 'GET'
@@ -639,7 +647,6 @@ export const get = createHandler(async (ctx, _body) => {
639
647
  * @calls withAdminLogging, ctx.db.from, fireCreateTriggers, sanitizeRecordData
640
648
  * @cil-generated
641
649
  */
642
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/admin-data.ts"]
643
650
  // CIL[DOC-MACRO purpose="create constant"]
644
651
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the create constant."]
645
652
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -647,6 +654,7 @@ export const get = createHandler(async (ctx, _body) => {
647
654
  // CIL[DOC-MICRO logic_summary="Implements the create constant." notable_decisions="[]"]
648
655
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
649
656
  // CIL[DOC-STABILITY stability="stable"]
657
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/admin-data.ts"]
650
658
  export const create = createHandler(async (ctx, body) => {
651
659
  const entity = body?.entity || ctx.query?.entity
652
660
  const type_slug = body?.type_slug
@@ -686,7 +694,8 @@ export const create = createHandler(async (ctx, body) => {
686
694
  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
695
  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
696
 
689
- const { data, error: err } = await ctx.db.from(entity).insert(raw).select().single()
697
+ const rawInsertDb = (ctx.principal?.isInternal || isSystemAdmin(ctx.principal)) ? adminDb : ctx.db
698
+ const { data, error: err } = await rawInsertDb.from(entity).insert(raw).select().single()
690
699
  if (err) throw err
691
700
  // Await the trigger check: the heavy work already offloads to
692
701
  // pipeline-runner-background, so this only adds eval + queue insert
@@ -802,7 +811,9 @@ export const create = createHandler(async (ctx, body) => {
802
811
  throw e
803
812
  }
804
813
 
805
- const insertDb = entity === 'accounts' ? adminDb : ctx.db
814
+ // Function-side permission check already ran — write via service role.
815
+ // ctx.db is PostgREST `authenticated` for humans, which holds SELECT only.
816
+ const insertDb = adminDb
806
817
 
807
818
  const { data, error: err } = await insertDb.from(entity)
808
819
  .insert(dataToInsert)
@@ -841,7 +852,6 @@ export const create = createHandler(async (ctx, body) => {
841
852
  * @calls withAdminLogging, validateUpdatePermissions, ctx.db.from, fireUpdateTriggers, sanitizeRecordData
842
853
  * @cil-generated
843
854
  */
844
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/admin-data.ts"]
845
855
  // CIL[DOC-MACRO purpose="update constant"]
846
856
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the update constant."]
847
857
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -849,6 +859,7 @@ export const create = createHandler(async (ctx, body) => {
849
859
  // CIL[DOC-MICRO logic_summary="Implements the update constant." notable_decisions="[]"]
850
860
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
851
861
  // CIL[DOC-STABILITY stability="stable"]
862
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/admin-data.ts"]
852
863
  export const update = createHandler(async (ctx, body) => {
853
864
  const { entity, id } = ctx.query || {}
854
865
  const method = ctx.query?.method || 'PATCH'
@@ -910,7 +921,7 @@ export const update = createHandler(async (ctx, body) => {
910
921
  updated_at: new Date().toISOString()
911
922
  }
912
923
 
913
- const { data, error: err } = await ctx.db.from(entity)
924
+ const { data, error: err } = await adminDb.from(entity)
914
925
  .update(dataToUpdate)
915
926
  .eq('id', id)
916
927
  .select()
@@ -950,7 +961,6 @@ export const update = createHandler(async (ctx, body) => {
950
961
  * @calls withAdminLogging, ctx.db.from, resolveFirstSurfacePermissions, entitySupportsSoftDelete, sanitizeRecordData
951
962
  * @cil-generated
952
963
  */
953
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/admin-data.ts"]
954
964
  // CIL[DOC-MACRO purpose="remove constant"]
955
965
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the remove constant."]
956
966
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -958,6 +968,7 @@ export const update = createHandler(async (ctx, body) => {
958
968
  // CIL[DOC-MICRO logic_summary="Implements the remove constant." notable_decisions="[]"]
959
969
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
960
970
  // CIL[DOC-STABILITY stability="stable"]
971
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/admin-data.ts"]
961
972
  export const remove = createHandler(async (ctx, _body) => {
962
973
  const { entity, id, soft = 'true' } = ctx.query || {}
963
974
  const method = ctx.query?.method || 'DELETE'
@@ -1006,7 +1017,7 @@ export const remove = createHandler(async (ctx, _body) => {
1006
1017
  const isSoftDelete = soft === 'true'
1007
1018
 
1008
1019
  if (isSoftDelete && entitySupportsSoftDelete(entity)) {
1009
- const { data, error: err } = await ctx.db.from(entity)
1020
+ const { data, error: err } = await adminDb.from(entity)
1010
1021
  .update({
1011
1022
  is_active: false,
1012
1023
  updated_by: ctx.principal?.type === 'human' ? ctx.principal.id : null,
@@ -1019,7 +1030,7 @@ export const remove = createHandler(async (ctx, _body) => {
1019
1030
  if (err) throw err
1020
1031
  return { deleted: true, soft: true, data: await sanitizeRecordData(ctx, data, entity) }
1021
1032
  } else {
1022
- const { error: err } = await ctx.db.from(entity)
1033
+ const { error: err } = await adminDb.from(entity)
1023
1034
  .delete()
1024
1035
  .eq('id', id)
1025
1036
 
@@ -1053,7 +1064,6 @@ export const remove = createHandler(async (ctx, _body) => {
1053
1064
  * @stability stable
1054
1065
  * @cil-generated
1055
1066
  */
1056
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:getsearchfield:function" type="function" identity="getSearchField" parent="~/.framework/functions/admin-data.ts"]
1057
1067
  // CIL[DOC-MACRO purpose="getSearchField function"]
1058
1068
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the getSearchField function."]
1059
1069
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1061,6 +1071,7 @@ export const remove = createHandler(async (ctx, _body) => {
1061
1071
  // CIL[DOC-MICRO logic_summary="Implements the getSearchField function." notable_decisions="[]"]
1062
1072
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1063
1073
  // CIL[DOC-STABILITY stability="stable"]
1074
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:getSearchField:function" type="function" identity="getSearchField" parent="~/.framework/functions/admin-data.ts"]
1064
1075
  function getSearchField(entity: string): string {
1065
1076
  const searchFields: Record<string, string> = {
1066
1077
  accounts: 'display_name',
@@ -1079,7 +1090,7 @@ function getSearchField(entity: string): string {
1079
1090
  }
1080
1091
  return searchFields[entity] || 'id'
1081
1092
  }
1082
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:getsearchfield:function"]
1093
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:getSearchField:function"]
1083
1094
  // 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
1095
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1085
1096
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -1103,7 +1114,6 @@ function getSearchField(entity: string): string {
1103
1114
  * @stability stable
1104
1115
  * @cil-generated
1105
1116
  */
1106
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:entitysupportssoftdelete:function" type="function" identity="entitySupportsSoftDelete" parent="~/.framework/functions/admin-data.ts"]
1107
1117
  // CIL[DOC-MACRO purpose="entitySupportsSoftDelete function"]
1108
1118
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the entitySupportsSoftDelete function."]
1109
1119
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1111,11 +1121,12 @@ function getSearchField(entity: string): string {
1111
1121
  // CIL[DOC-MICRO logic_summary="Implements the entitySupportsSoftDelete function." notable_decisions="[]"]
1112
1122
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1113
1123
  // CIL[DOC-STABILITY stability="stable"]
1124
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:entitySupportsSoftDelete:function" type="function" identity="entitySupportsSoftDelete" parent="~/.framework/functions/admin-data.ts"]
1114
1125
  function entitySupportsSoftDelete(entity: string): boolean {
1115
1126
  const softDeleteEntities = ['accounts', 'people', 'items', 'threads', 'messages', 'watchers', 'item_progress', 'test_cases']
1116
1127
  return softDeleteEntities.includes(entity)
1117
1128
  }
1118
- // CIL[END stable_id="~/.framework/functions/admin-data.ts:entitysupportssoftdelete:function"]
1129
+ // CIL[END stable_id="~/.framework/functions/admin-data.ts:entitySupportsSoftDelete:function"]
1119
1130
  // 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
1131
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only" status="ready"]
1121
1132
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified" status="ready"]
@@ -1138,7 +1149,6 @@ function entitySupportsSoftDelete(entity: string): boolean {
1138
1149
  * @calls withAdminLogging, ctx.db.from
1139
1150
  * @cil-generated
1140
1151
  */
1141
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:stats:constant" type="constant" identity="stats" parent="~/.framework/functions/admin-data.ts"]
1142
1152
  // CIL[DOC-MACRO purpose="stats constant"]
1143
1153
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the stats constant."]
1144
1154
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1146,6 +1156,7 @@ function entitySupportsSoftDelete(entity: string): boolean {
1146
1156
  // CIL[DOC-MICRO logic_summary="Implements the stats constant." notable_decisions="[]"]
1147
1157
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1148
1158
  // CIL[DOC-STABILITY stability="stable"]
1159
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:stats:constant" type="constant" identity="stats" parent="~/.framework/functions/admin-data.ts"]
1149
1160
  export const stats = createHandler(async (ctx, _body) => {
1150
1161
  const { entity } = ctx.query || {}
1151
1162
  const method = ctx.query?.method || 'GET'
@@ -1194,7 +1205,6 @@ export const stats = createHandler(async (ctx, _body) => {
1194
1205
  * @calls list, get, stats, create, update, remove
1195
1206
  * @cil-generated
1196
1207
  */
1197
- // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/admin-data.ts"]
1198
1208
  // CIL[DOC-MACRO purpose="handler constant"]
1199
1209
  // CIL[DOC-RESPONSIBILITY responsibility="Implements the handler constant."]
1200
1210
  // CIL[DOC-CONTEXT module=".framework/functions/admin-data.ts" layer="app-specific" related_files=""]
@@ -1202,6 +1212,7 @@ export const stats = createHandler(async (ctx, _body) => {
1202
1212
  // CIL[DOC-MICRO logic_summary="Implements the handler constant." notable_decisions="[]"]
1203
1213
  // CIL[DOC-CONFIDENCE pass="first" score="0.8" flags="none"]
1204
1214
  // CIL[DOC-STABILITY stability="stable"]
1215
+ // CIL[BEGIN stable_id="~/.framework/functions/admin-data.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/admin-data.ts"]
1205
1216
  export const handler = createHandler(async (ctx, body) => {
1206
1217
  const { action } = ctx.query || {}
1207
1218
  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)