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
@@ -13,16 +13,15 @@
13
13
  import { useState, useEffect, useCallback } from 'react'
14
14
  import { useApi } from './useApi'
15
15
  import { apiFetch } from '../lib/api'
16
+ // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:module_header:module_header"]
16
17
  // CIL[DOC-VECTOR type="context" content="purpose='Provide React and API imports for the useEntityList hook'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts"]
17
18
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
18
19
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
19
20
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
20
21
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
22
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
- // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:module_header:module_header"]
23
23
 
24
24
 
25
- // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:MinimalEntityListConfig:interface" type="interface" identity="MinimalEntityListConfig" parent="~/.framework/src/hooks/useEntityList.ts"]
26
25
  // CIL[DOC-AUDIENCE audience="internal"]
27
26
  // CIL[DOC-MACRO purpose="Define the minimal configuration shape for useEntityList"]
28
27
  // CIL[DOC-RESPONSIBILITY responsibility="Describe required and optional list configuration fields"]
@@ -31,6 +30,7 @@ import { apiFetch } from '../lib/api'
31
30
  // CIL[DOC-MICRO logic_summary="Declares entity, optional typeSlug, API endpoint/listAction, and default sort settings" notable_decisions="list.defaultSort is required"]
32
31
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
33
32
  // CIL[DOC-STABILITY stable]
33
+ // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:MinimalEntityListConfig:interface" type="interface" identity="MinimalEntityListConfig" parent="~/.framework/src/hooks/useEntityList.ts"]
34
34
  interface MinimalEntityListConfig {
35
35
  entity: string
36
36
  typeSlug?: string
@@ -42,16 +42,15 @@ interface MinimalEntityListConfig {
42
42
  defaultSort: { field: string; direction: 'asc' | 'desc' }
43
43
  }
44
44
  }
45
+ // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:MinimalEntityListConfig:interface"]
45
46
  // CIL[DOC-VECTOR type="context" content="purpose='Define the minimal configuration shape for useEntityList'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts"]
46
47
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
47
48
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
48
49
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
49
50
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
50
51
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
51
- // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:MinimalEntityListConfig:interface"]
52
52
 
53
53
 
54
- // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:UseEntityListReturn:interface" type="interface" identity="UseEntityListReturn" parent="~/.framework/src/hooks/useEntityList.ts"]
55
54
  // CIL[DOC-AUDIENCE audience="internal"]
56
55
  // CIL[DOC-MACRO purpose="Define the return shape for useEntityList"]
57
56
  // CIL[DOC-RESPONSIBILITY responsibility="Expose state and controls returned by the useEntityList hook"]
@@ -60,6 +59,7 @@ interface MinimalEntityListConfig {
60
59
  // CIL[DOC-MICRO logic_summary="Declares data, loading, error, refetch, filters, sort, and pagination state accessors" notable_decisions=""]
61
60
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
62
61
  // CIL[DOC-STABILITY stable]
62
+ // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:UseEntityListReturn:interface" type="interface" identity="UseEntityListReturn" parent="~/.framework/src/hooks/useEntityList.ts"]
63
63
  interface UseEntityListReturn {
64
64
  data: any[]
65
65
  loading: boolean
@@ -77,15 +77,14 @@ interface UseEntityListReturn {
77
77
  total: number
78
78
  }
79
79
  }
80
+ // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:UseEntityListReturn:interface"]
80
81
  // CIL[DOC-VECTOR type="context" content="purpose='Define the return shape for useEntityList'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts"]
81
82
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
82
83
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
83
84
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
84
85
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
85
86
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
86
- // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:UseEntityListReturn:interface"]
87
87
 
88
- // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:useEntityList:hook" type="hook" identity="useEntityList" parent="~/.framework/src/hooks/useEntityList.ts"]
89
88
  // CIL[DOC-AUDIENCE audience="internal"]
90
89
  // CIL[DOC-MACRO purpose="Fetch and manage a paginated, sortable, filterable list of entities"]
91
90
  // CIL[DOC-RESPONSIBILITY responsibility="Manage list state, build API query parameters, and expose list controls"]
@@ -94,6 +93,7 @@ interface UseEntityListReturn {
94
93
  // CIL[DOC-MICRO logic_summary="Computes URL parameters from filters, sort, and pagination; fetches via apiFetch; resets page on filter changes" notable_decisions="Defaults sort to created_at descending; resets page to 1 when filters change"]
95
94
  // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
96
95
  // CIL[DOC-STABILITY stable]
96
+ // CIL[BEGIN stable_id="~/.framework/src/hooks/useEntityList.ts:useEntityList:hook" type="hook" identity="useEntityList" parent="~/.framework/src/hooks/useEntityList.ts"]
97
97
  export function useEntityList(
98
98
  entity: string,
99
99
  config: MinimalEntityListConfig | null
@@ -122,7 +122,10 @@ export function useEntityList(
122
122
 
123
123
  Object.entries(filters).forEach(([key, value]) => {
124
124
  if (value !== undefined && value !== '' && value !== 'all') {
125
- params.append(key, value.toString())
125
+ // data.<field> is the documented way to filter on non-system fields;
126
+ // PostgREST needs the ->> operator form.
127
+ const paramKey = key.startsWith('data.') ? `data->>${key.slice(5)}` : key
128
+ params.append(paramKey, value.toString())
126
129
  }
127
130
  })
128
131
 
@@ -172,10 +175,10 @@ export function useEntityList(
172
175
  }
173
176
  }
174
177
  }
178
+ // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:useEntityList:hook"]
175
179
  // CIL[DOC-VECTOR type="context" content="purpose='Fetch and manage a paginated, sortable, filterable list of entities'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts"]
176
180
  // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
177
181
  // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
178
182
  // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
179
183
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
180
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
181
- // CIL[END stable_id="~/.framework/src/hooks/useEntityList.ts:useEntityList:hook"]
184
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
@@ -1,55 +1,88 @@
1
1
  // CIL[BEGIN stable_id="~/.framework/src/hooks/useListSchema.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/hooks/useListSchema.ts"]
2
- // CIL[DOC-AUDIENCE audience="frontend"]
3
- // CIL[DOC-CONTEXT module="useListSchema" layer="hooks" related_files=".framework/src/lib/api.ts,.framework/src/types/types.ts"]
4
- // CIL[DOC-CONTRACT inputs="none" outputs="React hooks, apiFetch and DesignSchema/View imports available to the module" errors="none" side_effects="none"]
5
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
6
- // CIL[DOC-MACRO purpose="React hook module for loading entity list design schemas"]
7
- // CIL[DOC-MICRO logic_summary="Imports useState, useEffect, apiFetch and local DesignSchema/View types" notable_decisions="[]"]
8
- // CIL[DOC-RESPONSIBILITY responsibility="Provide the useListSchema hook and its option/result type definitions"]
9
- // CIL[DOC-STABILITY stability="stable"]
2
+ /**
3
+ * @module useListSchema
4
+ * @audience both
5
+ * @layer shared-core
6
+ * @stability stable
7
+ *
8
+ * This module provides hooks for managing and interacting with list schemas in the application. It utilizes React's state and effect hooks to fetch and update schema data from an API. INVARIANT: The component using this hook must be wrapped in a provider that supplies the necessary context for API calls.
9
+ *
10
+ * @seeAlso apiFetch (handles API requests).
11
+ * @seeAlso DesignSchema (defines the structure of the schema data).
12
+ * @seeAlso View (represents the UI components that utilize the schema).
13
+ *
14
+ * @cil-generated
15
+ */
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
10
25
 
11
26
  import { useState, useEffect } from 'react'
12
27
  import { apiFetch } from '../lib/api'
13
28
  import { DesignSchema, View } from '../types/types'
14
- // CIL[DOC-VECTOR type="context" content="purpose='React hook module for loading entity list design schemas'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/types/types.ts"]
15
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
16
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
17
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
18
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
19
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
20
29
  // CIL[END stable_id="~/.framework/src/hooks/useListSchema.ts:module_header:module_header"]
21
30
 
22
31
 
23
32
 
24
33
 
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
25
49
  // CIL[BEGIN stable_id="~/.framework/src/hooks/useListSchema.ts:UseListSchemaOptions:interface" type="interface" identity="UseListSchemaOptions" parent="~/.framework/src/hooks/useListSchema.ts"]
26
- // CIL[DOC-MACRO purpose="Defines the input options for the useListSchema hook"]
27
- // CIL[DOC-RESPONSIBILITY responsibility="Declare entity and optional viewSlug used to resolve the list schema"]
28
- // CIL[DOC-CONTEXT module="useListSchema" layer="hooks" related_files=".framework/src/hooks/useListSchema.ts,.framework/src/lib/api.ts,.framework/src/types/types.ts"]
29
- // CIL[DOC-CONTRACT inputs="N/A" outputs="N/A" errors="N/A" side_effects="N/A"]
30
- // CIL[DOC-MICRO logic_summary="entity: string and viewSlug?: string" notable_decisions="[]"]
31
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
32
- // CIL[DOC-STABILITY stability="stable"]
50
+ /**
51
+ * The UseListSchemaOptions interface defines the options for using a list schema in the framework, allowing for the specification of an entity and an optional view slug for enhanced flexibility in list management.
52
+ *
53
+ * @sideEffects none
54
+ * @stability internal
55
+ * @cil-generated
56
+ */
33
57
  interface UseListSchemaOptions {
34
58
  entity: string
35
59
  viewSlug?: string
36
60
  }
37
- // CIL[DOC-VECTOR type="context" content="purpose='Defines the input options for the useListSchema hook'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/types/types.ts"]
38
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
39
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
40
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
41
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
42
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
43
61
  // CIL[END stable_id="~/.framework/src/hooks/useListSchema.ts:UseListSchemaOptions:interface"]
44
62
 
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
45
78
  // CIL[BEGIN stable_id="~/.framework/src/hooks/useListSchema.ts:UseListSchemaResult:interface" type="interface" identity="UseListSchemaResult" parent="~/.framework/src/hooks/useListSchema.ts"]
46
- // CIL[DOC-MACRO purpose="Defines the return shape of the useListSchema hook"]
47
- // CIL[DOC-RESPONSIBILITY responsibility="Declare schema, view, loading state, error and refetch callback"]
48
- // CIL[DOC-CONTEXT module="useListSchema" layer="hooks" related_files=".framework/src/hooks/useListSchema.ts,.framework/src/lib/api.ts,.framework/src/types/types.ts"]
49
- // CIL[DOC-CONTRACT inputs="N/A" outputs="N/A" errors="N/A" side_effects="N/A"]
50
- // CIL[DOC-MICRO logic_summary="schema, view, loading, error and refetch fields" notable_decisions="[]"]
51
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
52
- // CIL[DOC-STABILITY stability="stable"]
79
+ /**
80
+ * The UseListSchemaResult interface defines the structure of the result returned by the useListSchema hook, which is used to manage and retrieve schema data in a React application. It provides information about the loading state, any errors, and a method to refetch the data.
81
+ *
82
+ * @sideEffects none
83
+ * @stability internal
84
+ * @cil-generated
85
+ */
53
86
  interface UseListSchemaResult {
54
87
  schema: DesignSchema | null
55
88
  view: View | null
@@ -57,22 +90,39 @@ interface UseListSchemaResult {
57
90
  error: string | null
58
91
  refetch: () => void
59
92
  }
60
- // CIL[DOC-VECTOR type="context" content="purpose='Defines the return shape of the useListSchema hook'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/types/types.ts"]
61
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
62
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
63
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
64
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
65
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
66
93
  // CIL[END stable_id="~/.framework/src/hooks/useListSchema.ts:UseListSchemaResult:interface"]
67
94
 
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
68
110
  // CIL[BEGIN stable_id="~/.framework/src/hooks/useListSchema.ts:useListSchema:hook" type="hook" identity="useListSchema" parent="~/.framework/src/hooks/useListSchema.ts"]
69
- // CIL[DOC-CONTEXT module="useListSchema" layer="hooks" related_files=".framework/src/hooks/useListSchema.ts,.framework/src/lib/api.ts,.framework/src/types/types.ts"]
70
- // CIL[DOC-CONTRACT inputs="options: UseListSchemaOptions" outputs="UseListSchemaResult" errors="Network or API errors set the error string" side_effects="Calls apiFetch on mount and when entity/viewSlug changes; updates local state"]
71
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
72
- // CIL[DOC-MACRO purpose="React hook that loads the design schema and view definition for an entity list"]
73
- // CIL[DOC-MICRO logic_summary="Fetches a sample record to read stamped design_schema; falls back to type lookup and generic fallback views; supports JWT retry" notable_decisions="[]"]
74
- // CIL[DOC-RESPONSIBILITY responsibility="Fetch and resolve the list design schema and selected view for a given entity"]
75
- // CIL[DOC-STABILITY stability="stable"]
111
+ /**
112
+ * The useListSchema hook fetches and manages the schema and view for a specified entity in a list format, handling loading states and errors while providing a fallback schema if no data is available.
113
+ *
114
+ * @macro Custom React hook for managing entity list schemas.
115
+ * @micro Utilizes asynchronous API calls to fetch data and updates state based on the response.
116
+ * @inputSpec
117
+ * - options: UseListSchemaOptions (required) — configuration options including entity and optional viewSlug.
118
+ * @outputSpec UseListSchemaResult — an object containing schema, view, loading state, and error message.
119
+ * @throws Error — failed to fetch sample record or invalid authentication.
120
+ * @sideEffects API calls to /api/admin-data and /api/types for fetching schema data.
121
+ * @stability internal
122
+ * @calls apiFetch
123
+ * @errorHandling Retries fetching schema on specific authentication errors.
124
+ * @cil-generated
125
+ */
76
126
  export function useListSchema(options: UseListSchemaOptions): UseListSchemaResult {
77
127
  const { entity, viewSlug = 'default_list' } = options
78
128
 
@@ -149,12 +199,12 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
149
199
  let resolvedSchema: DesignSchema | null = null
150
200
 
151
201
  if (kind) {
152
- const typeResp = await apiFetch(`/api/types?kind=${kind}&limit=1`)
202
+ const typeResp = await apiFetch(`/api/types?action=list&kind=${kind}`)
153
203
  if (typeResp.ok) {
154
204
  const typeData = await typeResp.json()
155
- const typeRecord = typeData.data?.[0]
156
- if (typeRecord?.design_schema) {
157
- resolvedSchema = typeRecord.design_schema as DesignSchema
205
+ const typeRecords = Array.isArray(typeData.data) ? typeData.data : []
206
+ if (typeRecords.length === 1 && typeRecords[0]?.design_schema) {
207
+ resolvedSchema = typeRecords[0].design_schema as DesignSchema
158
208
  }
159
209
  }
160
210
  }
@@ -243,10 +293,10 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
243
293
  refetch: fetchSchema
244
294
  }
245
295
  }
246
- // CIL[DOC-VECTOR type="context" content="purpose='React hook that loads the design schema and view definition for an entity list'; No verified external callers; imports: .framework/src/lib/api.ts,.framework/src/types/types.ts"]
247
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
248
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
249
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
250
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
251
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
252
- // CIL[END stable_id="~/.framework/src/hooks/useListSchema.ts:useListSchema:hook"]
296
+ // CIL[END stable_id="~/.framework/src/hooks/useListSchema.ts:useListSchema:hook"]
297
+
298
+
299
+
300
+
301
+
302
+
@@ -0,0 +1,74 @@
1
+ ---
2
+ title: Spine Instruction Book
3
+ audience: developers, agents
4
+ kind: index
5
+ verified_against: 4d9d52a
6
+ verified_on: 2026-10-29
7
+ source_files:
8
+ - .framework/src/instructions/
9
+ ---
10
+
11
+ # Spine Instruction Book
12
+
13
+ This directory is the instruction book shipped with the `spine-framework` npm
14
+ package. It is written for two readers: **developers** building on Spine, and
15
+ **agents** (human or AI) operating a Spine deployment. Every file must pass
16
+ `npm run docs:lint` — see `docs/audit/docs-spec.md` in the repo for the
17
+ authoring spec.
18
+
19
+ ## Structure
20
+
21
+ | Section | Kind | Contents |
22
+ |---|---|---|
23
+ | `guide/` | guide | End-to-end walkthroughs (install, first app, deploy). |
24
+ | `concepts/` | concept | Mental models — tenancy, permissions, types, runtime vs config. |
25
+ | `tasks/` | task | Single-goal procedures with prerequisites and verification steps. |
26
+ | `reference/` | reference | Exhaustive lookups — env vars, CLI commands, API endpoints, schema enums. |
27
+ | `operations/` | ui | Admin-UI pages and operational runbooks. |
28
+ | `internal/` | * | Repo-only/internal docs; exempt from the archived-docs and CIL-tooling reference rules. |
29
+ | *(root)* | entity | One file per Spine entity (`types`, `apps`, `roles`, …). |
30
+
31
+ ## Reading order — developers
32
+
33
+ 1. `guide/` getting-started, then `concepts/` tenancy & permissions.
34
+ 2. The `entity` files for the types you will create (`types.md` first).
35
+ 3. `tasks/` for the specific job at hand; `reference/` for exact spellings.
36
+
37
+ ## Reading order — agents
38
+
39
+ 1. `concepts/` — know what a Spine account, type, and record are.
40
+ 2. `entity` files — the 7-section template below tells you what each entity is
41
+ for, its fields, minimal/full configuration, a worked example, the core
42
+ files, and agent-specific cautions.
43
+ 3. `operations/` — how to drive the admin UI; `internal/` — repo-only notes.
44
+
45
+ ## The 7-section entity template
46
+
47
+ Every `entity` or `ui` doc uses the same seven `##` sections, in order:
48
+
49
+ 1. `## What this is for`
50
+ 2. `## Fields and settings`
51
+ 3. `## Minimal configuration`
52
+ 4. `## Full configuration`
53
+ 5. `## Example`
54
+ 6. `## Core files`
55
+ 7. `## Agent notes`
56
+
57
+ `docs-lint` enforces the heading set verbatim.
58
+
59
+ ## Key pages
60
+
61
+ - Building frontend: [Frontend SDK (`@core`)](reference/frontend-sdk.md) —
62
+ every importable module, contract-ordered by real usage.
63
+ - Registering/mounting apps:
64
+ [tasks/register-an-app](tasks/register-an-app.md) +
65
+ [Mounting](concepts/apps-and-renderers.md#mounting-directory-or-root).
66
+ - App-shipped docs/skills: [tasks/document-your-app](tasks/document-your-app.md).
67
+
68
+ ## `internal/` — the doctrine
69
+
70
+ `internal/docs-contract.md` is the editorial contract for this book — the
71
+ test rule (every miss is a doc bug), the capture contract (docs are part of
72
+ every code change, core and custom), the layer taxonomy, and the cold-agent
73
+ acceptance matrix that regression-tests the book. Read it before adding or
74
+ restructuring pages.
@@ -0,0 +1,97 @@
1
+ ---
2
+ title: Accounts
3
+ audience: both
4
+ kind: entity
5
+ verified_against: b3b3ae0
6
+ verified_on: 2026-11-01
7
+ source_files:
8
+ - .framework/migrations/001_core_schema.sql
9
+ - .framework/functions/account-nodes.ts
10
+ - .framework/src/lib/api.ts
11
+ - .framework/src/lib/registration.ts
12
+ - .framework/cli/commands/install-app.ts
13
+ ---
14
+
15
+ # Accounts
16
+
17
+ ## What this is for
18
+
19
+ An **account** is the tenant boundary — nearly every scoped row in the
20
+ database hangs off one `account_id`. Accounts form hierarchies (a parent
21
+ account plus descendants), and a person may access several accounts and
22
+ switch between them. Record `scope: "account"` in a type's `design_schema`
23
+ means "rows belong to the active account"; `scope: "platform"` means the
24
+ spine-system account.
25
+
26
+ ## Fields and settings
27
+
28
+ | Column | Notes |
29
+ |---|---|
30
+ | `slug` | UNIQUE — stable identifier (`spine-system` is the platform account). |
31
+ | `display_name` | Human name shown in the account switcher. |
32
+ | `parent_id` | FK → `accounts` — places this account in the hierarchy. |
33
+ | `type_id` | Accounts are typed records; the type's `design_schema` governs `data`. |
34
+ | `data` | jsonb — type-defined fields. |
35
+ | `logs_retention_days`, `observability_retention_days` | Per-account retention knobs. |
36
+
37
+ **Hierarchy mechanics**
38
+
39
+ - `account_paths` is the closure table (`ancestor_id`, `descendant_id`,
40
+ `depth`) — ancestors/descendants resolve via
41
+ `get_account_ancestors`/`get_accessible_accounts` RPCs, not recursive
42
+ queries you write.
43
+ - `GET /api/account-nodes?node_id=<id>` returns a node with its
44
+ `type:types(...)` join, ancestors, and children — the admin tree view's
45
+ data source.
46
+
47
+ **The active account**
48
+
49
+ - The client sends `X-Account-Id` on every `apiFetch` (set by AuthContext
50
+ via `setAccountId`). Server-side `ctx.accountId` scopes reads/writes and
51
+ `current_actor_id()`-based RLS.
52
+ - `user.accessible_accounts` lists the accounts a person may switch
53
+ between; switching is a client-side `setAccountId` change, not a
54
+ re-login.
55
+
56
+ **App-driven placement**
57
+
58
+ - A manifest `registration` block decides where new accounts/people land:
59
+ `account_strategy: 'new' | 'existing'`, `parent_account`,
60
+ `target_account`, `default_workspace_name`. The installer syncs it to
61
+ `apps.config.registration` + `spine.config.json` (see
62
+ [App manifest reference](reference/app-manifest.md)).
63
+
64
+ ## Minimal configuration
65
+
66
+ `slug`, `display_name`, `type_id`, plus `parent_id` when it isn't a root
67
+ account.
68
+
69
+ ## Full configuration
70
+
71
+ Adds `data` fields from the account type's `design_schema`, retention
72
+ settings, and hierarchy position via `parent_id`/`account_paths`.
73
+
74
+ ## Example
75
+
76
+ A white-label app registers with `account_strategy: 'new'` +
77
+ `parent_account: 'spine-system'`: each new customer signup provisions a
78
+ child account under the platform account; support staff in the parent see
79
+ all children through the account switcher while customers stay scoped.
80
+
81
+ ## Core files
82
+
83
+ - `.framework/migrations/001_core_schema.sql` — `accounts` +
84
+ `account_paths` closure table
85
+ - `.framework/functions/account-nodes.ts` — node + ancestors + children API
86
+ - `.framework/src/lib/api.ts` — `X-Account-Id` on every request
87
+ - `.framework/src/lib/registration.ts` — signup → placement
88
+ - `.framework/cli/commands/install-app.ts` — `registration` → config sync
89
+
90
+ ## Agent notes
91
+
92
+ - Scope confusion is the #1 tenancy bug: a record created under the wrong
93
+ `account_id` is invisible to the right users — always confirm which
94
+ account is active before writing.
95
+ - `spine-system` is the platform account; `scope: "platform"` types and
96
+ system roles live there. Do not put tenant data in it.
97
+ - Never hand-maintain `account_paths` — it is derived from `parent_id`.
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: AI Agents
3
+ audience: both
4
+ kind: entity
5
+ verified_against: e13127d
6
+ verified_on: 2026-10-30
7
+ source_files:
8
+ - .framework/functions/ai-agents.ts
9
+ - .framework/functions/_shared/agent-runner.ts
10
+ - .framework/src/pages/admin/AIAgentsPage.tsx
11
+ - .framework/src/pages/admin/AIAgentDetailPage.tsx
12
+ ---
13
+
14
+ ## What this is for
15
+
16
+ An **AI agent** is a reusable model + prompt + tool configuration that Spine invokes from pipelines, triggers, and chat interfaces. It defines how an LLM behaves, which tools it can call, and its guardrails.
17
+
18
+ ## Fields and settings
19
+
20
+ - **Name** — string. Display name used in lists and by callers; required.
21
+ - **Type** — select: `chat`, `analysis`, `automation`, `custom`. Categorizes and routes the agent; defaults to `chat`.
22
+ - **Model** — string. Stored in `model_config.model`. Blank falls back to `LLM_DEFAULT_MODEL` env then `gpt-4o` at inference time — set it explicitly so the behavior isn't env-dependent.
23
+ - **Max Tokens** — number. Maximum response length; empty values can cause provider errors.
24
+ - **Temperature** — number 0–2. Lower = deterministic, higher = random; out-of-range values may be rejected by the provider.
25
+ - **Description** — string, optional.
26
+ - **System Prompt** — text. The agent's personality, instructions, and constraints. Empty = no system message sent.
27
+ - **App ID** — select, optional. Owning app; blank = account-scoped.
28
+ - **Tools (one per line)** — newline-separated tool names the agent may invoke. Names must match registered tools exactly.
29
+ - **Capabilities / Constraints / Metadata (JSON)** — optional objects: feature flags, guardrails, free-form metadata. Invalid JSON blocks save.
30
+ - **Active** — checkbox. Inactive agents are hidden from callers and cannot be invoked.
31
+
32
+ **Downstream effects**
33
+
34
+ - Pipelines, triggers, and chat UIs reference agents by ID — changing the model changes their output everywhere.
35
+ - Tool names must match the tool registry exactly; unknown names produce runtime errors when invoked.
36
+ - `system_prompt` composes with the caller's prompt config — conflicting instructions between the two cause unpredictable behavior.
37
+
38
+ ## Minimal configuration
39
+
40
+ ```json
41
+ {
42
+ "name": "Triage agent",
43
+ "agent_type": "automation",
44
+ "model_config": { "model": "gpt-4o", "temperature": 0.3, "max_tokens": 2000 },
45
+ "system_prompt": "You classify inbound support tickets...",
46
+ "is_active": true
47
+ }
48
+ ```
49
+
50
+ ## Full configuration
51
+
52
+ Adds `tools` (the registered tool names the agent may call), `capabilities` (e.g. `{ "json_mode": true, "streaming": false }`), `constraints` (e.g. `{ "max_tool_calls": 5, "disallowed": ["delete"] }`), and `metadata`.
53
+
54
+ ## Example
55
+
56
+ A support app's triage agent (`agent_type: "automation"`, low temperature) classifies new tickets and calls a `set_field` tool to tag them; its companion chat agent (`agent_type: "chat"`, higher temperature, `tools: [search_kb]`) drafts replies for human review.
57
+
58
+ ## Core files
59
+
60
+ - `.framework/functions/ai-agents.ts` — API
61
+ - `.framework/functions/ai-interactions.ts` — invocation/interaction records
62
+ - `.framework/src/pages/admin/AIAgentsPage.tsx` / `AIAgentDetailPage.tsx` — admin UI
63
+ - Table: `public.ai_agents`
64
+
65
+ ## Agent notes
66
+
67
+ - The detail form stores model settings under `model_config` — a flat `model` field on the record will be ignored by callers.
68
+ - Pair agents with a `prompt_configs` entry for the prompt body; the agent record holds behavior, the prompt config holds text.
69
+ - Validate JSON fields before saving — a parse failure silently keeps the previous config.
@@ -0,0 +1,80 @@
1
+ ---
2
+ title: Threshold Alerts
3
+ audience: both
4
+ kind: entity
5
+ verified_against: e13127d
6
+ verified_on: 2026-10-30
7
+ source_files:
8
+ - .framework/src/pages/admin/AlertsConfigPage.tsx
9
+ - .framework/functions/admin-data.ts
10
+ - .framework/functions/system-cron.ts
11
+ - .framework/functions/observability.ts
12
+ ---
13
+
14
+ ## What this is for
15
+
16
+ **Threshold Alerts** (`/spine-framework/admin/observability/alerts`) manages alert rules over platform metrics. Each alert is a runtime `items` record of type `threshold_alert`, edited through the generic `admin-data` API. `system-cron` evaluates them every tick; a breach emits a `threshold.breached` log event (visible under Logs and on the Observability dashboard) and can invoke a linked pipeline.
17
+
18
+ ## Fields and settings
19
+
20
+ - **Title / Description** — record `title` and `description` shown in the list.
21
+ - **Status** — `active` or `inactive`; toggled per-row (writes both `status` and `data.is_active`).
22
+ - **Metric** (`data.metric`) — `error_rate` (%), `latency_p95` (ms), or `pipeline_failure_rate` (%).
23
+ - **Operator** (`data.operator`) — `gt` (>) or `lt` (<).
24
+ - **Value** (`data.value`) — the threshold number, in the metric's unit.
25
+ - **Window** (`data.window_minutes`) — lookback window the metric is computed over.
26
+ - **Pipeline** (`data.pipeline_id`) — optional pipeline invoked when the threshold is breached; populated from `/api/pipelines?action=list`.
27
+ - Stats cards — Total, Active, Inactive, With Pipeline.
28
+
29
+ **Downstream effects**
30
+
31
+ - Alerts are plain `items` records — create/edit/delete goes through `/api/admin-data?entity=items` with `type_id: "threshold_alert"`, so they inherit the type's `record_permissions` and validation.
32
+ - `system-cron` evaluates each active alert every tick against the observability metrics; breaching emits `threshold.breached` log events.
33
+ - An alert without a `pipeline_id` still logs breach events — the pipeline link is what turns a breach into an action.
34
+ - Deleting an alert hard-removes the record; there is no history table beyond `logs`.
35
+
36
+ ## Minimal configuration
37
+
38
+ ```
39
+ Title: High error rate
40
+ data.metric: error_rate · data.operator: gt · data.value: 5
41
+ data.window_minutes: 60 · is_active: true
42
+ ```
43
+
44
+ ## Full configuration
45
+
46
+ ```json
47
+ {
48
+ "type_id": "threshold_alert",
49
+ "title": "P95 latency above 2s",
50
+ "description": "Page on sustained slow requests",
51
+ "status": "active",
52
+ "data": {
53
+ "metric": "latency_p95",
54
+ "operator": "gt",
55
+ "value": 2000,
56
+ "window_minutes": 30,
57
+ "pipeline_id": "<pipeline uuid>",
58
+ "is_active": true
59
+ }
60
+ }
61
+ ```
62
+
63
+ ## Example
64
+
65
+ A platform team keeps three alerts: `error_rate > 5% / 60min` paging the on-call pipeline, `latency_p95 > 2000ms / 30min` opening an incident thread, and `pipeline_failure_rate > 10% / 15min` running a diagnostics pipeline that snapshots recent executions.
66
+
67
+ ## Core files
68
+
69
+ - `.framework/src/pages/admin/AlertsConfigPage.tsx` — this page (modal create/edit, toggle, delete)
70
+ - `.framework/functions/admin-data.ts` — CRUD backend (`entity=items`, `type_id=threshold_alert`)
71
+ - `.framework/functions/system-cron.ts` — per-tick threshold evaluation, emits `threshold.breached`
72
+ - `.framework/functions/observability.ts` — `error_rate`/`latency_percentiles`/`pipeline_stats` metrics the alerts compare against
73
+ - Table: `public.items` rows of type `threshold_alert`
74
+
75
+ ## Agent notes
76
+
77
+ - The type slug is `threshold_alert` and the config lives under `data.*` — do not confuse it with the `pipelines`/`triggers` config tables.
78
+ - `status` and `data.is_active` are written together by the toggle; editing the record elsewhere can desync them — the evaluator reads `data.is_active`.
79
+ - Breach events are the audit trail: filter Logs by `threshold.breached` to see when and how often an alert fired.
80
+ - There is no dedupe/cooldown field — a breached metric re-fires each tick; build any cooldown into the linked pipeline.