spine-framework 0.3.144 → 0.4.0

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 (451) hide show
  1. package/.env.example +76 -0
  2. package/.framework/.spine-manifest.json +19 -0
  3. package/.framework/cli/commands/agents.ts +61 -33
  4. package/.framework/cli/commands/auth.ts +60 -28
  5. package/.framework/cli/commands/create-app.ts +212 -80
  6. package/.framework/cli/commands/dev.ts +184 -68
  7. package/.framework/cli/commands/doctor.ts +324 -152
  8. package/.framework/cli/commands/generate.ts +119 -68
  9. package/.framework/cli/commands/init.ts +141 -242
  10. package/.framework/cli/commands/install-app.ts +1336 -314
  11. package/.framework/cli/commands/items.ts +31 -29
  12. package/.framework/cli/commands/migrate.ts +299 -156
  13. package/.framework/cli/commands/migrations.ts +62 -30
  14. package/.framework/cli/commands/pipelines.ts +31 -29
  15. package/.framework/cli/commands/status.ts +105 -45
  16. package/.framework/cli/commands/system.ts +47 -42
  17. package/.framework/cli/commands/test.ts +161 -102
  18. package/.framework/cli/commands/upgrade.ts +260 -0
  19. package/.framework/cli/commands/validate-app.ts +517 -161
  20. package/.framework/cli/context.ts +117 -85
  21. package/.framework/cli/env-loader.ts +74 -43
  22. package/.framework/cli/index.ts +70 -46
  23. package/.framework/cli/lib/project-files.ts +404 -0
  24. package/.framework/docs/guides/testing-guide.md +1 -1
  25. package/.framework/docs/runtime-types.md +72 -72
  26. package/.framework/functions/_shared/access.ts +84 -0
  27. package/.framework/functions/_shared/agent-runner.ts +5051 -1026
  28. package/.framework/functions/_shared/app-manifest.ts +214 -94
  29. package/.framework/functions/_shared/ast.ts +214 -0
  30. package/.framework/functions/_shared/audit.ts +91 -55
  31. package/.framework/functions/_shared/cil.ts +368 -127
  32. package/.framework/functions/_shared/db.ts +337 -68
  33. package/.framework/functions/_shared/funnel.ts +228 -0
  34. package/.framework/functions/_shared/geo.ts +105 -0
  35. package/.framework/functions/_shared/hash-api-key.ts +94 -17
  36. package/.framework/functions/_shared/index.ts +22 -224
  37. package/.framework/functions/_shared/kb.ts +832 -58
  38. package/.framework/functions/_shared/llm.ts +118 -18
  39. package/.framework/functions/_shared/logging.ts +317 -19
  40. package/.framework/functions/_shared/middleware.ts +701 -131
  41. package/.framework/functions/_shared/notify.ts +70 -0
  42. package/.framework/functions/_shared/outcomes.ts +34 -19
  43. package/.framework/functions/_shared/permissions.ts +501 -315
  44. package/.framework/functions/_shared/pipeline-runner.ts +704 -155
  45. package/.framework/functions/_shared/principal.ts +436 -263
  46. package/.framework/functions/_shared/rate-limit.ts +233 -0
  47. package/.framework/functions/_shared/resolve-credentials.ts +86 -19
  48. package/.framework/functions/_shared/resolve-ids.ts +203 -139
  49. package/.framework/functions/_shared/retry-deliveries.ts +51 -16
  50. package/.framework/functions/_shared/schema-utils.ts +602 -521
  51. package/.framework/functions/_shared/security.ts +345 -0
  52. package/.framework/functions/_shared/testing.ts +197 -172
  53. package/.framework/functions/_shared/tracing.ts +351 -21
  54. package/.framework/functions/_shared/trigger-engine.ts +425 -136
  55. package/.framework/functions/_shared/webhook-registration.ts +71 -70
  56. package/.framework/functions/_shared/webhook-registry.ts +126 -83
  57. package/.framework/functions/account-nodes.ts +30 -30
  58. package/.framework/functions/adapters/generic-webhook-inbound.ts +49 -16
  59. package/.framework/functions/adapters/generic-webhook-outbound.ts +17 -17
  60. package/.framework/functions/adapters/openai-outbound.ts +15 -16
  61. package/.framework/functions/admin-data.ts +596 -173
  62. package/.framework/functions/admin-funnel.ts +64 -60
  63. package/.framework/functions/admin-install-funnel.ts +84 -66
  64. package/.framework/functions/admin-signals.ts +69 -51
  65. package/.framework/functions/ai-agents.ts +431 -106
  66. package/.framework/functions/ai-interactions.ts +186 -112
  67. package/.framework/functions/api-keys.ts +107 -107
  68. package/.framework/functions/apps.ts +154 -136
  69. package/.framework/functions/auth.ts +83 -65
  70. package/.framework/functions/cil-agent-ingest.ts +189 -232
  71. package/.framework/functions/cil-agent.ts +433 -177
  72. package/.framework/functions/cil-callmap.ts +642 -430
  73. package/.framework/functions/cil-config.ts +139 -135
  74. package/.framework/functions/cil-context.ts +214 -127
  75. package/.framework/functions/cil-doc.ts +587 -458
  76. package/.framework/functions/cil-embeddings.ts +453 -364
  77. package/.framework/functions/cil-graph.ts +427 -142
  78. package/.framework/functions/cil-ingest.ts +1418 -1154
  79. package/.framework/functions/cil-pipeline.ts +276 -21
  80. package/.framework/functions/cil-project.ts +659 -132
  81. package/.framework/functions/cil-validate.ts +198 -164
  82. package/.framework/functions/debug-auth.ts +57 -55
  83. package/.framework/functions/deliveries.ts +80 -21
  84. package/.framework/functions/embeddings.ts +1023 -318
  85. package/.framework/functions/eval-harness.ts +146 -108
  86. package/.framework/functions/integration-outbound.ts +205 -75
  87. package/.framework/functions/integration-routes.ts +128 -23
  88. package/.framework/functions/integrations.ts +125 -100
  89. package/.framework/functions/invites.ts +1095 -460
  90. package/.framework/functions/item-progress.ts +158 -102
  91. package/.framework/functions/kb.ts +34 -10
  92. package/.framework/functions/logs.ts +133 -133
  93. package/.framework/functions/observability.ts +152 -122
  94. package/.framework/functions/pipeline-executions.ts +147 -132
  95. package/.framework/functions/pipelines.ts +134 -119
  96. package/.framework/functions/prompt-configs.ts +96 -80
  97. package/.framework/functions/roles.ts +112 -82
  98. package/.framework/functions/security.ts +450 -0
  99. package/.framework/functions/system-cron.ts +117 -80
  100. package/.framework/functions/system.ts +158 -98
  101. package/.framework/functions/tests.ts +29 -29
  102. package/.framework/functions/timers.ts +94 -95
  103. package/.framework/functions/trigger-scheduler.ts +10 -0
  104. package/.framework/functions/triggers.ts +179 -149
  105. package/.framework/functions/types.ts +137 -125
  106. package/.framework/mcp/index.ts +133 -0
  107. package/.framework/mcp/load-env.ts +60 -0
  108. package/.framework/mcp/shared/app-manifest.ts +275 -0
  109. package/.framework/mcp/shared/db.ts +477 -0
  110. package/.framework/mcp/shared/kb.ts +118 -0
  111. package/.framework/mcp/tools/architect.ts +431 -0
  112. package/.framework/mcp/tools/cil/context.ts +345 -0
  113. package/.framework/mcp/tools/cil/graph.ts +242 -0
  114. package/.framework/mcp/tools/cil/ingest.ts +1217 -0
  115. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +693 -0
  116. package/.framework/mcp/tools/cil/pipeline.ts +767 -0
  117. package/.framework/mcp/tools/cil/project.ts +791 -0
  118. package/.framework/mcp/tools/cil/retrieval.ts +336 -0
  119. package/.framework/mcp/tools/cil/search-core.ts +454 -0
  120. package/.framework/mcp/tools/cil/search.ts +97 -0
  121. package/.framework/mcp/tools/cil/suggest.ts +186 -0
  122. package/.framework/mcp/tools/cil/validate.ts +1369 -0
  123. package/.framework/mcp/tools/kb/delete.ts +139 -0
  124. package/.framework/mcp/tools/kb/index.ts +52 -0
  125. package/.framework/mcp/tools/kb/ingest.ts +84 -0
  126. package/.framework/mcp/tools/kb/list-types.ts +102 -0
  127. package/.framework/mcp/tools/kb/publish.ts +100 -0
  128. package/.framework/mcp/tools/kb/reindex.ts +86 -0
  129. package/.framework/mcp/tools/kb/revoke.ts +85 -0
  130. package/.framework/mcp/tools/kb/search.ts +101 -0
  131. package/.framework/mcp/tools/kb/upsert.ts +125 -0
  132. package/.framework/mcp/tools/observability.ts +510 -0
  133. package/.framework/migrations/001_core_schema.sql +15 -0
  134. package/.framework/migrations/002_core_rls_and_functions.sql +15 -0
  135. package/.framework/migrations/003_core_system_data.sql +16 -1
  136. package/.framework/migrations/004_core_rpc_and_broker.sql +17 -1
  137. package/.framework/migrations/005_core_observability.sql +17 -1
  138. package/.framework/migrations/006_security_hardening_rls.sql +15 -0
  139. package/.framework/migrations/007_kb_article_list.sql +17 -1
  140. package/.framework/migrations/008_items_target.sql +15 -0
  141. package/.framework/migrations/009_roles_slug_unique.sql +15 -0
  142. package/.framework/migrations/010_auth_user_trigger.sql +15 -0
  143. package/.framework/migrations/011_spine_system_account.sql +16 -0
  144. package/.framework/migrations/012_service_role_grants.sql +16 -0
  145. package/.framework/migrations/013_get_account_apps_role_filter.sql +15 -0
  146. package/.framework/migrations/014_apps_required_roles.sql +16 -0
  147. package/.framework/migrations/015_types_kind_slug_unique.sql +20 -0
  148. package/.framework/migrations/016_cil_types.sql +281 -0
  149. package/.framework/migrations/017_cil_stable_ids.sql +37 -0
  150. package/.framework/migrations/018_runtime_tables.sql +129 -0
  151. package/.framework/migrations/019_agent_prompt_columns.sql +56 -0
  152. package/.framework/migrations/020_schema_reconciliation.sql +67 -0
  153. package/.framework/migrations/021_kb_embedding_lifecycle.sql +31 -0
  154. package/.framework/migrations/032_cil_status_migration.sql +73 -0
  155. package/.framework/migrations/033_cil_versioning.sql +73 -0
  156. package/.framework/migrations/034_match_embeddings_knn.sql +115 -0
  157. package/.framework/migrations/035_rate_limits.sql +55 -0
  158. package/.framework/migrations/036_demo_record_flags.sql +72 -0
  159. package/.framework/migrations/037_kb_types_canonical.sql +244 -0
  160. package/.framework/migrations/038_drop_demo_record_flags.sql +38 -0
  161. package/.framework/migrations/042_registration_hierarchy.sql +309 -0
  162. package/.framework/migrations/043_policy_actor_cleanup.sql +39 -0
  163. package/.framework/migrations/044_match_embeddings_filtered_knn.sql +151 -0
  164. package/.framework/migrations/045_security_critical_rls.sql +139 -0
  165. package/.framework/migrations/046_security_missing_rls.sql +79 -0
  166. package/.framework/migrations/047_people_updated_by.sql +27 -0
  167. package/.framework/migrations/048_watcher_last_seen_at.sql +24 -0
  168. package/.framework/migrations/049_security_blocklist.sql +148 -0
  169. package/.framework/migrations/050_notifications.sql +49 -0
  170. package/.framework/migrations/051_message_agent_fields.sql +74 -0
  171. package/.framework/migrations/052_registration_security.sql +421 -0
  172. package/.framework/migrations/053_builtin_action_seeds.sql +66 -0
  173. package/.framework/migrations/054_kb_ingest_lease.sql +157 -0
  174. package/.framework/migrations/055_type_id_drift_reconciliation.sql +33 -0
  175. package/.framework/migrations/056_slug_column_reconciliation.sql +38 -0
  176. package/.framework/migrations/057_pipelines_slug_identity.sql +14 -0
  177. package/.framework/migrations/058_account_data_field_declarations.sql +53 -0
  178. package/.framework/migrations/059_registration_placement_fixes.sql +269 -0
  179. package/.framework/migrations/060_account_person_record_permissions.sql +38 -0
  180. package/.framework/migrations/061_fk_dedup.sql +32 -0
  181. package/.framework/public/spine-logo.svg +10 -3
  182. package/.framework/scripts/app-install-cli.ts +190 -93
  183. package/.framework/scripts/assemble-frontend.sh +127 -44
  184. package/.framework/scripts/assemble-functions.sh +128 -30
  185. package/.framework/scripts/boundary-check.sh +6 -2
  186. package/.framework/scripts/build-manifest.sh +24 -68
  187. package/.framework/scripts/check-core-integrity.sh +15 -76
  188. package/.framework/scripts/checksum-manifest.mts +343 -0
  189. package/.framework/scripts/cil-migrate-markers.ts +403 -0
  190. package/.framework/scripts/fix-cil-markers.mjs +176 -0
  191. package/.framework/scripts/verify-integrity.sh +21 -57
  192. package/.framework/scripts/verify-manifest.mts +305 -0
  193. package/.framework/seeds/types/funnel_signal_use.json +74 -21
  194. package/.framework/seeds/types/spine_instance.json +73 -21
  195. package/.framework/src/App.tsx +118 -72
  196. package/.framework/src/apps/admin/index.tsx +855 -58
  197. package/.framework/src/components/AppWrapper.tsx +43 -45
  198. package/.framework/src/components/CustomAppLoader.tsx +160 -116
  199. package/.framework/src/components/admin/AdminListPage.tsx +46 -44
  200. package/.framework/src/components/admin/AdminSidebar.tsx +57 -47
  201. package/.framework/src/components/admin/AdminStatsCard.tsx +46 -44
  202. package/.framework/src/components/admin/PageInstructions.tsx +98 -2
  203. package/.framework/src/components/admin/SortableTableHeader.tsx +44 -45
  204. package/.framework/src/components/app-shell/GenericAppShell.tsx +64 -65
  205. package/.framework/src/components/app-shell/GenericDetailPage.tsx +44 -47
  206. package/.framework/src/components/app-shell/GenericListPage.tsx +45 -49
  207. package/.framework/src/components/app-sidebar.tsx +42 -45
  208. package/.framework/src/components/auth/ProtectedRoute.tsx +48 -41
  209. package/.framework/src/components/auth/TurnstileWidget.tsx +27 -0
  210. package/.framework/src/components/kb/KBArticleEditor.tsx +231 -22
  211. package/.framework/src/components/kb/KBArticleList.tsx +251 -10
  212. package/.framework/src/components/layout/AppShell.tsx +51 -45
  213. package/.framework/src/components/layout/Header.tsx +42 -43
  214. package/.framework/src/components/layout/Layout.tsx +46 -46
  215. package/.framework/src/components/layout/Sidebar.tsx +196 -96
  216. package/.framework/src/components/runtime/DataDetailHeader.tsx +55 -30
  217. package/.framework/src/components/runtime/DataDetailPage.tsx +31 -269
  218. package/.framework/src/components/runtime/DataFilters.tsx +49 -74
  219. package/.framework/src/components/runtime/DataHeader.tsx +53 -32
  220. package/.framework/src/components/runtime/DataListPage.tsx +51 -155
  221. package/.framework/src/components/runtime/DataStats.tsx +66 -44
  222. package/.framework/src/components/runtime/DataTable.tsx +49 -149
  223. package/.framework/src/components/runtime/SchemaDetailForm.tsx +45 -75
  224. package/.framework/src/components/runtime/index.ts +119 -16
  225. package/.framework/src/components/search-form.tsx +46 -29
  226. package/.framework/src/components/shared/AgentView.tsx +65 -48
  227. package/.framework/src/components/shared/FieldRenderer.tsx +144 -50
  228. package/.framework/src/components/shared/InviteManager.tsx +207 -97
  229. package/.framework/src/components/shared/MemberList.tsx +97 -0
  230. package/.framework/src/components/shared/SchemaFields.tsx +107 -86
  231. package/.framework/src/components/ui/DataTable.tsx +80 -68
  232. package/.framework/src/components/ui/Form.tsx +157 -146
  233. package/.framework/src/components/ui/ItemCard.tsx +74 -67
  234. package/.framework/src/components/ui/ItemListView.tsx +73 -68
  235. package/.framework/src/components/ui/LoadingSpinner.tsx +43 -48
  236. package/.framework/src/components/ui/Modal.tsx +78 -68
  237. package/.framework/src/components/ui/RichTextEditor.tsx +89 -69
  238. package/.framework/src/components/ui/accordion.tsx +85 -86
  239. package/.framework/src/components/ui/alert-dialog.tsx +197 -184
  240. package/.framework/src/components/ui/alert.tsx +105 -94
  241. package/.framework/src/components/ui/aspect-ratio.tsx +57 -43
  242. package/.framework/src/components/ui/avatar.tsx +122 -107
  243. package/.framework/src/components/ui/badge.tsx +60 -55
  244. package/.framework/src/components/ui/breadcrumb.tsx +127 -128
  245. package/.framework/src/components/ui/button-group.tsx +86 -72
  246. package/.framework/src/components/ui/button.tsx +71 -50
  247. package/.framework/src/components/ui/calendar.tsx +72 -57
  248. package/.framework/src/components/ui/card.tsx +136 -129
  249. package/.framework/src/components/ui/carousel.tsx +226 -107
  250. package/.framework/src/components/ui/chart.tsx +252 -147
  251. package/.framework/src/components/ui/checkbox.tsx +43 -44
  252. package/.framework/src/components/ui/collapsible.tsx +86 -71
  253. package/.framework/src/components/ui/combobox.tsx +282 -249
  254. package/.framework/src/components/ui/command.tsx +158 -146
  255. package/.framework/src/components/ui/context-menu.tsx +239 -240
  256. package/.framework/src/components/ui/dialog.tsx +174 -157
  257. package/.framework/src/components/ui/direction.tsx +72 -56
  258. package/.framework/src/components/ui/drawer.tsx +168 -169
  259. package/.framework/src/components/ui/dropdown-menu.tsx +254 -223
  260. package/.framework/src/components/ui/empty.tsx +131 -120
  261. package/.framework/src/components/ui/field.tsx +205 -173
  262. package/.framework/src/components/ui/hover-card.tsx +71 -72
  263. package/.framework/src/components/ui/input-group.tsx +148 -133
  264. package/.framework/src/components/ui/input-otp.tsx +99 -86
  265. package/.framework/src/components/ui/input.tsx +43 -41
  266. package/.framework/src/components/ui/item.tsx +207 -185
  267. package/.framework/src/components/ui/kbd.tsx +57 -56
  268. package/.framework/src/components/ui/label.tsx +45 -41
  269. package/.framework/src/components/ui/menubar.tsx +268 -236
  270. package/.framework/src/components/ui/native-select.tsx +85 -86
  271. package/.framework/src/components/ui/navigation-menu.tsx +166 -156
  272. package/.framework/src/components/ui/pagination.tsx +131 -141
  273. package/.framework/src/components/ui/popover.tsx +125 -128
  274. package/.framework/src/components/ui/progress.tsx +47 -44
  275. package/.framework/src/components/ui/radio-group.tsx +60 -55
  276. package/.framework/src/components/ui/resizable.tsx +85 -72
  277. package/.framework/src/components/ui/scroll-area.tsx +57 -58
  278. package/.framework/src/components/ui/select.tsx +182 -169
  279. package/.framework/src/components/ui/separator.tsx +42 -43
  280. package/.framework/src/components/ui/sheet.tsx +170 -159
  281. package/.framework/src/components/ui/sidebar.tsx +395 -398
  282. package/.framework/src/components/ui/skeleton.tsx +42 -43
  283. package/.framework/src/components/ui/slider.tsx +61 -44
  284. package/.framework/src/components/ui/sonner.tsx +44 -44
  285. package/.framework/src/components/ui/spinner.tsx +47 -42
  286. package/.framework/src/components/ui/switch.tsx +56 -42
  287. package/.framework/src/components/ui/table-primitives.tsx +272 -132
  288. package/.framework/src/components/ui/table.tsx +140 -142
  289. package/.framework/src/components/ui/tabs.tsx +110 -93
  290. package/.framework/src/components/ui/textarea.tsx +43 -44
  291. package/.framework/src/components/ui/toggle-group.tsx +87 -71
  292. package/.framework/src/components/ui/toggle.tsx +56 -56
  293. package/.framework/src/components/ui/tooltip.tsx +99 -85
  294. package/.framework/src/contexts/AppContext.tsx +166 -114
  295. package/.framework/src/contexts/AuthContext.tsx +232 -137
  296. package/.framework/src/hooks/use-mobile.ts +43 -44
  297. package/.framework/src/hooks/useApi.ts +185 -172
  298. package/.framework/src/hooks/useAppPath.ts +31 -29
  299. package/.framework/src/hooks/useApps.ts +77 -42
  300. package/.framework/src/hooks/useEntityList.ts +66 -29
  301. package/.framework/src/hooks/useEntityRecord.ts +76 -32
  302. package/.framework/src/hooks/useForm.ts +62 -30
  303. package/.framework/src/hooks/useListSchema.ts +60 -43
  304. package/.framework/src/hooks/useSchemaRecord.ts +115 -95
  305. package/.framework/src/lib/api.ts +258 -134
  306. package/.framework/src/lib/registration.ts +181 -0
  307. package/.framework/src/lib/supabase.ts +118 -81
  308. package/.framework/src/lib/utils.ts +266 -266
  309. package/.framework/src/main.tsx +43 -44
  310. package/.framework/src/pages/DashboardPage.tsx +44 -43
  311. package/.framework/src/pages/NoAppPage.tsx +50 -0
  312. package/.framework/src/pages/NotFoundPage.tsx +32 -29
  313. package/.framework/src/pages/SetupPage.tsx +34 -33
  314. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +69 -58
  315. package/.framework/src/pages/admin/AIAgentsPage.tsx +43 -40
  316. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +63 -55
  317. package/.framework/src/pages/admin/APIKeysPage.tsx +44 -42
  318. package/.framework/src/pages/admin/AlertsConfigPage.tsx +117 -94
  319. package/.framework/src/pages/admin/AppDetailPage.tsx +48 -42
  320. package/.framework/src/pages/admin/AppsPage.tsx +45 -42
  321. package/.framework/src/pages/admin/DeliveriesPage.tsx +49 -17
  322. package/.framework/src/pages/admin/DesignedPage.tsx +31 -30
  323. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +58 -0
  324. package/.framework/src/pages/admin/EmbeddingsPage.tsx +49 -0
  325. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +31 -29
  326. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +46 -29
  327. package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -29
  328. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +68 -55
  329. package/.framework/src/pages/admin/IntegrationsPage.tsx +45 -42
  330. package/.framework/src/pages/admin/InvitesPage.tsx +60 -44
  331. package/.framework/src/pages/admin/LogsPage.tsx +87 -137
  332. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +31 -29
  333. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +150 -89
  334. package/.framework/src/pages/admin/PipelineDetailPage.tsx +77 -104
  335. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +44 -43
  336. package/.framework/src/pages/admin/PipelinesPage.tsx +59 -145
  337. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +53 -42
  338. package/.framework/src/pages/admin/PromptConfigsPage.tsx +47 -117
  339. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +31 -44
  340. package/.framework/src/pages/admin/RoleDetailPage.tsx +49 -92
  341. package/.framework/src/pages/admin/RolesPage.tsx +47 -164
  342. package/.framework/src/pages/admin/SecurityPage.tsx +310 -0
  343. package/.framework/src/pages/admin/SelectTestPage.tsx +30 -32
  344. package/.framework/src/pages/admin/ShadcnTestPage.tsx +37 -44
  345. package/.framework/src/pages/admin/SimpleDashboard.tsx +32 -44
  346. package/.framework/src/pages/admin/TestRunDetailPage.tsx +97 -44
  347. package/.framework/src/pages/admin/TestingDashboard.tsx +126 -71
  348. package/.framework/src/pages/admin/TimerDetailPage.tsx +67 -55
  349. package/.framework/src/pages/admin/TimersPage.tsx +44 -42
  350. package/.framework/src/pages/admin/TriggerDetailPage.tsx +47 -42
  351. package/.framework/src/pages/admin/TriggersPage.tsx +58 -57
  352. package/.framework/src/pages/admin/TypeDetailPage.tsx +91 -55
  353. package/.framework/src/pages/admin/TypesPage.tsx +45 -42
  354. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +258 -128
  355. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +127 -123
  356. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +308 -235
  357. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +159 -110
  358. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +432 -0
  359. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +200 -178
  360. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +286 -239
  361. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +211 -90
  362. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +156 -143
  363. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +379 -0
  364. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +337 -0
  365. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +219 -214
  366. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
  367. package/.framework/src/pages/auth/AuthConfirmPage.tsx +135 -65
  368. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +39 -31
  369. package/.framework/src/pages/auth/LoginPage.tsx +38 -32
  370. package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -28
  371. package/.framework/src/pages/auth/RegisterPage.tsx +429 -155
  372. package/.framework/src/pages/spine-framework/APIPage.tsx +33 -30
  373. package/.framework/src/pages/spine-framework/CLIPage.tsx +32 -30
  374. package/.framework/src/types/auth.ts +101 -93
  375. package/.framework/src/types/types.ts +283 -262
  376. package/.framework/templates/project.json +87 -0
  377. package/.framework/templates/spine.config.neutral.json +7 -0
  378. package/.framework/tests/api/api-surface.test.ts +381 -0
  379. package/.framework/tests/fixtures/seed.ts +427 -0
  380. package/.framework/tests/fixtures/teardown.ts +228 -0
  381. package/.framework/tests/reporter.ts +351 -0
  382. package/.framework/tests/setup.ts +135 -0
  383. package/.framework/tests/ui/ui-sweep.ts +278 -0
  384. package/.framework/tests/unit/admin-data-logger.test.ts +310 -0
  385. package/.framework/tests/unit/agent-runner.test.ts +2389 -0
  386. package/.framework/tests/unit/ai-interactions.test.ts +81 -0
  387. package/.framework/tests/unit/app-manifest.test.ts +359 -0
  388. package/.framework/tests/unit/assembly-scripts.test.ts +172 -0
  389. package/.framework/tests/unit/cil-determinism.test.ts +85 -0
  390. package/.framework/tests/unit/core-isolation.test.ts +153 -0
  391. package/.framework/tests/unit/funnel-signals.test.ts +135 -0
  392. package/.framework/tests/unit/install-app.test.ts +1759 -0
  393. package/.framework/tests/unit/invites-security.test.ts +572 -0
  394. package/.framework/tests/unit/kb-ingest-lease.test.ts +287 -0
  395. package/.framework/tests/unit/kb-search.test.ts +119 -0
  396. package/.framework/tests/unit/migrate.test.ts +509 -0
  397. package/.framework/tests/unit/notify.test.ts +136 -0
  398. package/.framework/tests/unit/permissions.test.ts +269 -0
  399. package/.framework/tests/unit/pipeline-runner.test.ts +755 -0
  400. package/.framework/tests/unit/principal-cache.test.ts +138 -0
  401. package/.framework/tests/unit/retrieval-golden.test.ts +520 -0
  402. package/.framework/tests/unit/runtime-isolation.test.ts +642 -0
  403. package/.framework/tests/unit/schema-utils.test.ts +225 -0
  404. package/.framework/tests/unit/trigger-engine.test.ts +513 -0
  405. package/.framework/tests/unit/validate-app.test.ts +527 -0
  406. package/README.md +34 -3
  407. package/bin/spine-framework.cjs +1 -0
  408. package/config/tailwind.config.cjs +7 -0
  409. package/config/tsconfig.functions.json +42 -0
  410. package/config/tsconfig.json +37 -9
  411. package/config/vite.config.ts +31 -2
  412. package/netlify.toml +31 -3
  413. package/package.json +46 -29
  414. package/scripts/assemble-frontend.sh +127 -44
  415. package/scripts/assemble-functions.sh +127 -29
  416. package/scripts/boundary-check.sh +6 -2
  417. package/scripts/build-manifest.sh +24 -68
  418. package/scripts/checksum-manifest.mts +345 -0
  419. package/scripts/dev-clean.sh +86 -0
  420. package/scripts/dev-netlify.sh +49 -0
  421. package/scripts/netlify-dev-wrapper.sh +2 -0
  422. package/scripts/verify-install.ts +358 -0
  423. package/scripts/verify-integrity.sh +21 -57
  424. package/scripts/verify-manifest.mts +305 -0
  425. package/templates/project/gitignore +45 -0
  426. package/{config → templates/project}/package-lock.json +22335 -9366
  427. package/vitest.config.ts +46 -0
  428. package/.framework/public/spine.config.json +0 -91
  429. package/config/deno.lock +0 -108
  430. package/config/tsconfig.node.tsbuildinfo +0 -1
  431. package/config/tsconfig.tsbuildinfo +0 -1
  432. package/config/vite.config.d.ts +0 -2
  433. package/custom/.devin/AGENT.md +0 -357
  434. package/custom/.devin/skills/install-app/SKILL.md +0 -39
  435. package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +0 -39
  436. package/custom/.devin/skills/spine-workbench-idea/SKILL.md +0 -36
  437. package/custom/.devin/skills/spine-workbench-implement/SKILL.md +0 -46
  438. package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +0 -28
  439. package/custom/.devin/skills/spine-workbench-plan/SKILL.md +0 -38
  440. package/custom/.devin/workflows/app-install.yaml +0 -83
  441. package/custom/README.md +0 -79
  442. package/docs/README.md +0 -15
  443. package/scripts/app-install-cli.ts +0 -286
  444. package/scripts/check-core-integrity.sh +0 -82
  445. package/scripts/ingest-chunks.cjs +0 -202
  446. package/scripts/kb-chunk-parser.cjs +0 -312
  447. package/scripts/kb-chunk-parser.ts +0 -330
  448. package/scripts/kb-ingest-docs.ts +0 -203
  449. package/scripts/load-test-app-install.ts +0 -484
  450. package/scripts/test-login.js +0 -33
  451. package/spine.config.json +0 -91
@@ -1,44 +1,37 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/timers.ts"]
2
+ // CIL[DOC-MACRO purpose="Import shared utilities used by timer Netlify function handlers."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Set up module-level imports for middleware, database access, audit logging, and permission helpers."]
4
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts"]
5
+ // CIL[DOC-CONTRACT inputs="None" outputs="None" errors="None" side_effects="None"]
6
+ // CIL[DOC-MICRO logic_summary="Imports createHandler, joins, adminDb, emitLog, sanitizeRecordData, and isSystemAdmin." notable_decisions="Uses shared handlers for both admin and account-scoped queries."]
7
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
+ // CIL[DOC-STABILITY stable]
9
+ // CIL[DOC-AUDIENCE audience="Spine framework internal Netlify function handlers that manage scheduled timers."]
1
10
 
2
11
 
3
12
 
4
13
 
5
14
 
6
-
7
- // CIL[BEGIN chunk_id="timers_module_header_1783931956" type="module_header" identity="module_header" parent="none"]
8
- // CIL[DOC-MACRO purpose="Import dependencies for timers CRUD API"]
9
- // CIL[DOC-RESPONSIBILITY responsibility="Provide middleware, database, audit and permissions utilities"]
10
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
11
- // CIL[DOC-CONTRACT inputs="none" outputs="imported modules" errors="none" side_effects="none"]
12
- // CIL[DOC-MICRO logic_summary="Imports all required modules for timer management operations" notable_decisions="[]"]
13
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
14
- // CIL[DOC-STABILITY stability="stable"]
15
- // CIL[DOC-AUDIENCE audience="developer"]
16
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, \."]
17
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
18
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
19
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
20
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
21
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
22
15
  import { createHandler } from './_shared/middleware'
23
16
  import { joins, adminDb } from './_shared/db'
24
17
  import { emitLog } from './_shared/audit'
25
18
  import { sanitizeRecordData } from './_shared/permissions'
26
19
  import { isSystemAdmin } from './_shared/principal'
27
- // CIL[END chunk_id="timers_module_header_1783931956"]
28
- // CIL[BEGIN chunk_id="timers_list_1783931956" type="function" identity="list" parent="none"]
29
- // CIL[DOC-MACRO purpose="List timers with filtering and sanitization"]
30
- // CIL[DOC-RESPONSIBILITY responsibility="Handle timer listing with authentication and permissions"]
31
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
32
- // CIL[DOC-CONTRACT inputs="none" outputs="sanitized timer array" errors="throws" side_effects="database queries"]
33
- // CIL[DOC-MICRO logic_summary="Filters timers by app/type/active status, sanitizes based on permissions" notable_decisions="[]"]
34
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
35
- // CIL[DOC-STABILITY stability="stable"]
36
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, \."]
37
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
38
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
39
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
20
+ // CIL[DOC-VECTOR type="context" content="purpose='Import shared utilities used by timer Netlify function handlers.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
21
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
22
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
23
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
40
24
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
41
25
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
26
+ // CIL[END stable_id="~/.framework/functions/timers.ts:module_header:module_header"]
27
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:list:constant" type="constant" identity="list" parent="~/.framework/functions/timers.ts"]
28
+ // CIL[DOC-MACRO purpose="List timers for the current account with optional filters."]
29
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a filtered, sanitized list of timer records scoped to the calling account."]
30
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
31
+ // CIL[DOC-CONTRACT inputs="ctx.query may include app_id, timer_type, and is_active." outputs="Array of sanitized timer records." errors="Account context required; database query errors." side_effects="None"]
32
+ // CIL[DOC-MICRO logic_summary="Builds a timers query, applies optional equality filters, and sanitizes each returned record." notable_decisions="Falls back to ctx.db unless the caller is a system admin."]
33
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
34
+ // CIL[DOC-STABILITY stable]
42
35
  export const list = createHandler(async (ctx, _body) => {
43
36
  const { app_id, timer_type, is_active } = ctx.query || {}
44
37
 
@@ -74,21 +67,21 @@ export const list = createHandler(async (ctx, _body) => {
74
67
 
75
68
  return sanitized
76
69
  })
77
- // CIL[END chunk_id="timers_list_1783931956"]
78
- // CIL[BEGIN chunk_id="timers_get_1783931956" type="function" identity="get" parent="none"]
79
- // CIL[DOC-MACRO purpose="Get single timer by ID with sanitization"]
80
- // CIL[DOC-RESPONSIBILITY responsibility="Retrieve and sanitize individual timer records"]
81
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
82
- // CIL[DOC-CONTRACT inputs="none" outputs="sanitized timer object" errors="throws" side_effects="database query"]
83
- // CIL[DOC-MICRO logic_summary="Queries timer by ID with app/createdBy joins, sanitizes based on permissions" notable_decisions="[]"]
84
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
85
- // CIL[DOC-STABILITY stability="stable"]
86
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
87
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
88
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
89
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
70
+ // CIL[DOC-VECTOR type="context" content="purpose='List timers for the current account with optional filters.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
71
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
72
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
73
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
90
74
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
91
75
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
76
+ // CIL[END stable_id="~/.framework/functions/timers.ts:list:constant"]
77
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:get:constant" type="constant" identity="get" parent="~/.framework/functions/timers.ts"]
78
+ // CIL[DOC-MACRO purpose="Fetch a single timer by ID."]
79
+ // CIL[DOC-RESPONSIBILITY responsibility="Return a sanitized timer record matching the requested ID."]
80
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
81
+ // CIL[DOC-CONTRACT inputs="ctx.query.id" outputs="Sanitized timer record." errors="Timer ID is required; not-found or database errors." side_effects="None"]
82
+ // CIL[DOC-MICRO logic_summary="Queries the timers table by id and returns the sanitized record." notable_decisions="Uses system admin override to select the database connection."]
83
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
84
+ // CIL[DOC-STABILITY stable]
92
85
  export const get = createHandler(async (ctx, _body) => {
93
86
  const { id } = ctx.query || {}
94
87
 
@@ -108,21 +101,21 @@ export const get = createHandler(async (ctx, _body) => {
108
101
 
109
102
  return await sanitizeRecordData(ctx, data, 'timer')
110
103
  })
111
- // CIL[END chunk_id="timers_get_1783931956"]
112
- // CIL[BEGIN chunk_id="timers_create_1783931956" type="function" identity="create" parent="none"]
113
- // CIL[DOC-MACRO purpose="Create new timer with validation and audit"]
114
- // CIL[DOC-RESPONSIBILITY responsibility="Handle timer creation with authentication and logging"]
115
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
116
- // CIL[DOC-CONTRACT inputs="none" outputs="created timer record" errors="throws" side_effects="database insert, audit log"]
117
- // CIL[DOC-MICRO logic_summary="Validates user context, creates timer with defaults, emits audit log" notable_decisions="[]"]
118
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
119
- // CIL[DOC-STABILITY stability="stable"]
120
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 1. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
121
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 1. Total affected: 1."]
122
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
123
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
104
+ // CIL[DOC-VECTOR type="context" content="purpose='Fetch a single timer by ID.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
105
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
106
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
107
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
124
108
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
125
109
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
110
+ // CIL[END stable_id="~/.framework/functions/timers.ts:get:constant"]
111
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:create:constant" type="constant" identity="create" parent="~/.framework/functions/timers.ts"]
112
+ // CIL[DOC-MACRO purpose="Create a new timer record for the current account."]
113
+ // CIL[DOC-RESPONSIBILITY responsibility="Insert a timer with the supplied fields and return the created record."]
114
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
115
+ // CIL[DOC-CONTRACT inputs="body: app_id, name, description, timer_type, config, pipeline_id, metadata." outputs="Newly created timer record." errors="name and timer_type are required; User context required; database errors." side_effects="Inserts a row into timers; writes an audit log."]
116
+ // CIL[DOC-MICRO logic_summary="Validates required fields, inserts a timer row with defaults, emits a creation audit log, and returns the row." notable_decisions="Stores undefined optional fields as null or empty objects."]
117
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
118
+ // CIL[DOC-STABILITY stable]
126
119
  export const create = createHandler(async (ctx, body) => {
127
120
  const { app_id, name, description, timer_type, config, pipeline_id, metadata } = body
128
121
 
@@ -159,21 +152,21 @@ export const create = createHandler(async (ctx, body) => {
159
152
 
160
153
  return data
161
154
  })
162
- // CIL[END chunk_id="timers_create_1783931956"]
163
- // CIL[BEGIN chunk_id="timers_update_1783931956" type="function" identity="update" parent="none"]
164
- // CIL[DOC-MACRO purpose="Update existing timer with field allowlist"]
165
- // CIL[DOC-RESPONSIBILITY responsibility="Handle timer updates with validation and audit logging"]
166
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[]"]
167
- // CIL[DOC-CONTRACT inputs="none" outputs="updated timer record" errors="throws" side_effects="database update, audit log"]
168
- // CIL[DOC-MICRO logic_summary="Updates only allowed fields, adds timestamp, emits audit log" notable_decisions="[]"]
169
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
170
- // CIL[DOC-STABILITY stability="stable"]
171
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
172
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
173
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
174
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
155
+ // CIL[DOC-VECTOR type="context" content="purpose='Create a new timer record for the current account.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
156
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
157
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
158
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
175
159
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
176
160
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
161
+ // CIL[END stable_id="~/.framework/functions/timers.ts:create:constant"]
162
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:update:constant" type="constant" identity="update" parent="~/.framework/functions/timers.ts"]
163
+ // CIL[DOC-MACRO purpose="Update an existing timer's allowed fields."]
164
+ // CIL[DOC-RESPONSIBILITY responsibility="Apply whitelisted field updates to a timer row and return the updated record."]
165
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
166
+ // CIL[DOC-CONTRACT inputs="body or ctx.query with id; optional fields from allowed list." outputs="Updated timer record." errors="Timer ID is required; database errors." side_effects="Updates a timers row; writes an audit log."]
167
+ // CIL[DOC-MICRO logic_summary="Extracts the id, builds an update payload from an allow-list, sets updated_at, and emits an update audit log." notable_decisions="Ignores id inside the body and does not re-validate allowed values beyond presence."]
168
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
169
+ // CIL[DOC-STABILITY stable]
177
170
  export const update = createHandler(async (ctx, body) => {
178
171
  const id = body?.id || ctx.query?.id
179
172
  const { id: _bodyId, ...updates } = body || {}
@@ -204,21 +197,21 @@ export const update = createHandler(async (ctx, body) => {
204
197
 
205
198
  return data
206
199
  })
207
- // CIL[END chunk_id="timers_update_1783931956"]
208
- // CIL[BEGIN chunk_id="timers_remove_1783931956" type="function" identity="remove" parent="none"]
209
- // CIL[DOC-MACRO purpose="Hard delete timer with validation and audit"]
210
- // CIL[DOC-RESPONSIBILITY responsibility="Handle timer deletion with safety checks and logging"]
211
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[]"]
212
- // CIL[DOC-CONTRACT inputs="none" outputs="success indicator" errors="throws" side_effects="database delete, audit log"]
213
- // CIL[DOC-MICRO logic_summary="Validates timer exists, hard deletes record, emits audit log" notable_decisions="[]"]
214
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
215
- // CIL[DOC-STABILITY stability="stable"]
216
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
217
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
218
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
219
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
200
+ // CIL[DOC-VECTOR type="context" content="purpose='Update an existing timer's allowed fields.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
201
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
202
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
203
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
220
204
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
221
205
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
206
+ // CIL[END stable_id="~/.framework/functions/timers.ts:update:constant"]
207
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:remove:constant" type="constant" identity="remove" parent="~/.framework/functions/timers.ts"]
208
+ // CIL[DOC-MACRO purpose="Delete a timer by ID."]
209
+ // CIL[DOC-RESPONSIBILITY responsibility="Remove a timer record from the database and confirm success."]
210
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
211
+ // CIL[DOC-CONTRACT inputs="body or ctx.query with id." outputs="{ success: true }." errors="Timer ID is required; Timer not found; database errors." side_effects="Deletes a timers row; writes an audit log."]
212
+ // CIL[DOC-MICRO logic_summary="Fetches the existing timer, deletes the row by id, and emits a deletion audit log." notable_decisions="Reads only name and timer_type before deletion for the audit payload."]
213
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
214
+ // CIL[DOC-STABILITY stable]
222
215
  export const remove = createHandler(async (ctx, body) => {
223
216
  const id = body?.id || ctx.query?.id
224
217
 
@@ -250,21 +243,21 @@ export const remove = createHandler(async (ctx, body) => {
250
243
 
251
244
  return { success: true }
252
245
  })
253
- // CIL[END chunk_id="timers_remove_1783931956"]
254
- // CIL[BEGIN chunk_id="timers_toggle_1783931956" type="function" identity="toggle" parent="none"]
255
- // CIL[DOC-MACRO purpose="Toggle timer active status with audit logging"]
256
- // CIL[DOC-RESPONSIBILITY responsibility="Handle timer activation/deactivation with validation"]
257
- // CIL[DOC-CONTEXT module="timers" layer="api-handler" related_files="[]"]
258
- // CIL[DOC-CONTRACT inputs="none" outputs="updated timer record" errors="throws" side_effects="database update, audit log"]
259
- // CIL[DOC-MICRO logic_summary="Flips is_active boolean, updates timestamp, emits audit log" notable_decisions="[]"]
260
- // CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
261
- // CIL[DOC-STABILITY stability="stable"]
262
- // CIL[DOC-VECTOR type="context" content="Layer: api-handler. Direct callers: 0. Direct calls: 0. Related files: none."]
263
- // CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
264
- // CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
265
- // CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
246
+ // CIL[DOC-VECTOR type="context" content="purpose='Delete a timer by ID.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.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"]
266
250
  // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
267
251
  // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
252
+ // CIL[END stable_id="~/.framework/functions/timers.ts:remove:constant"]
253
+ // CIL[BEGIN stable_id="~/.framework/functions/timers.ts:toggle:constant" type="constant" identity="toggle" parent="~/.framework/functions/timers.ts"]
254
+ // CIL[DOC-MACRO purpose="Toggle the active state of a timer."]
255
+ // CIL[DOC-RESPONSIBILITY responsibility="Flip a timer's is_active flag and return the updated record."]
256
+ // CIL[DOC-CONTEXT module="timers" layer=".framework/functions" related_files=".framework/functions/_shared/audit.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/_shared/permissions.ts,.framework/functions/_shared/principal.ts,.framework/functions/timers.ts"]
257
+ // CIL[DOC-CONTRACT inputs="body or ctx.query with id." outputs="Updated timer record with toggled is_active." errors="Timer ID is required; Timer not found; database errors." side_effects="Updates is_active on a timers row; writes an audit log."]
258
+ // CIL[DOC-MICRO logic_summary="Fetches the existing timer, inverts is_active, writes the new status, and emits a toggle audit log." notable_decisions="Also updates updated_at when toggling status."]
259
+ // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
260
+ // CIL[DOC-STABILITY stable]
268
261
  export const toggle = createHandler(async (ctx, body) => {
269
262
  const id = body?.id || ctx.query?.id
270
263
 
@@ -306,4 +299,10 @@ export const toggle = createHandler(async (ctx, body) => {
306
299
 
307
300
  return data
308
301
  })
309
- // CIL[END chunk_id="timers_toggle_1783931956"]
302
+ // CIL[DOC-VECTOR type="context" content="purpose='Toggle the active state of a timer.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
303
+ // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
304
+ // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
305
+ // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
306
+ // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
307
+ // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
308
+ // CIL[END stable_id="~/.framework/functions/timers.ts:toggle:constant"]
@@ -0,0 +1,10 @@
1
+ // CIL[BEGIN stable_id="~/.framework/functions/trigger-scheduler.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/trigger-scheduler.ts"]
2
+ // CIL[DOC-MACRO purpose="Scheduled entry point that invokes the shared system-cron runner so Netlify's every-minute trigger dispatches due scheduled actions."]
3
+ // CIL[DOC-RESPONSIBILITY responsibility="Re-export the system-cron handler under the function name registered in netlify.toml."]
4
+ // CIL[DOC-CONTEXT module="trigger-scheduler" layer="functions" related_files=".framework/functions/system-cron.ts, netlify.toml"]
5
+ // CIL[DOC-CONTRACT inputs="Netlify scheduled invocation" outputs="system-cron sweep result" errors="none (delegates)" side_effects="runs due schedule actions across accounts"]
6
+ // CIL[DOC-MICRO logic_summary="Thin alias: netlify.toml schedules trigger-scheduler every minute; the handler is system-cron's." notable_decisions="Separate file so the schedule name stays stable if system-cron internals change."]
7
+ // CIL[DOC-STABILITY stable]
8
+ // CIL[DOC-AUDIENCE audience="framework maintainers"]
9
+ export { handler } from './system-cron'
10
+ // CIL[END stable_id="~/.framework/functions/trigger-scheduler.ts:module_header:module_header"]