spine-framework 0.1.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 (385) hide show
  1. package/.framework/README.md +129 -0
  2. package/.framework/cli/bin.cjs +14 -0
  3. package/.framework/cli/commands/agents.ts +153 -0
  4. package/.framework/cli/commands/auth.ts +94 -0
  5. package/.framework/cli/commands/create-app.ts +185 -0
  6. package/.framework/cli/commands/dev.ts +295 -0
  7. package/.framework/cli/commands/doctor.ts +442 -0
  8. package/.framework/cli/commands/generate.ts +332 -0
  9. package/.framework/cli/commands/init.ts +272 -0
  10. package/.framework/cli/commands/install-app.ts +391 -0
  11. package/.framework/cli/commands/items.ts +253 -0
  12. package/.framework/cli/commands/migrations.ts +141 -0
  13. package/.framework/cli/commands/pipelines.ts +166 -0
  14. package/.framework/cli/commands/status.ts +197 -0
  15. package/.framework/cli/commands/system.ts +184 -0
  16. package/.framework/cli/commands/test.ts +227 -0
  17. package/.framework/cli/commands/uninstall-app.ts +166 -0
  18. package/.framework/cli/context.ts +268 -0
  19. package/.framework/cli/env-loader.ts +36 -0
  20. package/.framework/cli/index.ts +106 -0
  21. package/.framework/cli/welcome.cjs +45 -0
  22. package/.framework/docs/API.md +384 -0
  23. package/.framework/docs/STABILITY.md +52 -0
  24. package/.framework/docs/admin-routes.md +76 -0
  25. package/.framework/docs/api-docs-progress.md +38 -0
  26. package/.framework/docs/api-governance.md +146 -0
  27. package/.framework/docs/api-testing-results.md +212 -0
  28. package/.framework/docs/apis/admin-configs.md +567 -0
  29. package/.framework/docs/apis/admin-data.md +272 -0
  30. package/.framework/docs/apis/index.md +231 -0
  31. package/.framework/docs/apis/internal.md +295 -0
  32. package/.framework/docs/apis/runtime.md +537 -0
  33. package/.framework/docs/assembly-launch-guide.md +138 -0
  34. package/.framework/docs/audit-results.md +590 -0
  35. package/.framework/docs/authorization-model.md +170 -0
  36. package/.framework/docs/db-api-inventory.md +95 -0
  37. package/.framework/docs/examples/custom-app/README.md +77 -0
  38. package/.framework/docs/examples/custom-function/README.md +27 -0
  39. package/.framework/docs/examples/custom-function/handler.ts +48 -0
  40. package/.framework/docs/examples/custom-webhook/README.md +68 -0
  41. package/.framework/docs/gap-remediation-backlog.md +103 -0
  42. package/.framework/docs/guides/cli-guide.md +224 -0
  43. package/.framework/docs/guides/getting-started.md +103 -0
  44. package/.framework/docs/guides/import-guide.md +193 -0
  45. package/.framework/docs/guides/testing-guide.md +229 -0
  46. package/.framework/docs/permission-examples.md +326 -0
  47. package/.framework/docs/ui-adoption-verification.md +111 -0
  48. package/.framework/docs/ui-api-coverage.md +84 -0
  49. package/.framework/docs/v2-compatibility-audit.md +228 -0
  50. package/.framework/functions/.gitkeep +1 -0
  51. package/.framework/functions/_shared/agent-runner.ts +1097 -0
  52. package/.framework/functions/_shared/app-manifest.ts +184 -0
  53. package/.framework/functions/_shared/audit.ts +150 -0
  54. package/.framework/functions/_shared/db.ts +174 -0
  55. package/.framework/functions/_shared/index.ts +382 -0
  56. package/.framework/functions/_shared/middleware.ts +490 -0
  57. package/.framework/functions/_shared/permissions.ts +1325 -0
  58. package/.framework/functions/_shared/pipeline-runner.ts +731 -0
  59. package/.framework/functions/_shared/principal.ts +760 -0
  60. package/.framework/functions/_shared/schema-utils.ts +967 -0
  61. package/.framework/functions/_shared/testing.ts +258 -0
  62. package/.framework/functions/_shared/trigger-engine.ts +425 -0
  63. package/.framework/functions/_shared/webhook-registration.ts +168 -0
  64. package/.framework/functions/_shared/webhook-registry.ts +129 -0
  65. package/.framework/functions/account-nodes.ts +111 -0
  66. package/.framework/functions/admin-data.ts +606 -0
  67. package/.framework/functions/ai-agents.ts +323 -0
  68. package/.framework/functions/api-keys.ts +376 -0
  69. package/.framework/functions/apps.ts +483 -0
  70. package/.framework/functions/auth.ts +196 -0
  71. package/.framework/functions/debug-auth.ts +107 -0
  72. package/.framework/functions/embeddings.ts +556 -0
  73. package/.framework/functions/integration-routes.ts +523 -0
  74. package/.framework/functions/integrations.ts +319 -0
  75. package/.framework/functions/item-progress.ts +272 -0
  76. package/.framework/functions/logs.ts +438 -0
  77. package/.framework/functions/observability.ts +275 -0
  78. package/.framework/functions/pipeline-executions.ts +494 -0
  79. package/.framework/functions/pipelines.ts +485 -0
  80. package/.framework/functions/prompt-configs.ts +339 -0
  81. package/.framework/functions/roles.ts +387 -0
  82. package/.framework/functions/system-cron.ts +742 -0
  83. package/.framework/functions/system.ts +323 -0
  84. package/.framework/functions/tests.ts +119 -0
  85. package/.framework/functions/timers.ts +357 -0
  86. package/.framework/functions/triggers.ts +563 -0
  87. package/.framework/functions/types.ts +604 -0
  88. package/.framework/migrations/000_foundation.sql +1256 -0
  89. package/.framework/migrations/001_seed.sql +92 -0
  90. package/.framework/migrations/002_seed_constraints.sql +13 -0
  91. package/.framework/migrations/003_auth_user_trigger.sql +59 -0
  92. package/.framework/src/App.tsx +126 -0
  93. package/.framework/src/apps/admin/index.tsx +173 -0
  94. package/.framework/src/components/AppWrapper.tsx +56 -0
  95. package/.framework/src/components/CustomAppLoader.tsx +116 -0
  96. package/.framework/src/components/admin/AdminListPage.tsx +151 -0
  97. package/.framework/src/components/admin/AdminSidebar.tsx +166 -0
  98. package/.framework/src/components/admin/AdminStatsCard.tsx +62 -0
  99. package/.framework/src/components/admin/SortableTableHeader.tsx +42 -0
  100. package/.framework/src/components/app-shell/GenericAppShell.tsx +181 -0
  101. package/.framework/src/components/app-shell/GenericDetailPage.tsx +200 -0
  102. package/.framework/src/components/app-shell/GenericListPage.tsx +116 -0
  103. package/.framework/src/components/app-sidebar.tsx +228 -0
  104. package/.framework/src/components/auth/ProtectedRoute.tsx +88 -0
  105. package/.framework/src/components/layout/AppShell.tsx +91 -0
  106. package/.framework/src/components/layout/Header.tsx +88 -0
  107. package/.framework/src/components/layout/Layout.tsx +95 -0
  108. package/.framework/src/components/layout/Sidebar.tsx +329 -0
  109. package/.framework/src/components/runtime/DataDetailHeader.tsx +77 -0
  110. package/.framework/src/components/runtime/DataDetailPage.tsx +171 -0
  111. package/.framework/src/components/runtime/DataFilters.tsx +91 -0
  112. package/.framework/src/components/runtime/DataHeader.tsx +68 -0
  113. package/.framework/src/components/runtime/DataListPage.tsx +124 -0
  114. package/.framework/src/components/runtime/DataStats.tsx +70 -0
  115. package/.framework/src/components/runtime/DataTable.tsx +174 -0
  116. package/.framework/src/components/runtime/SchemaDetailForm.tsx +134 -0
  117. package/.framework/src/components/runtime/index.ts +18 -0
  118. package/.framework/src/components/search-form.tsx +29 -0
  119. package/.framework/src/components/shared/AgentView.tsx +213 -0
  120. package/.framework/src/components/shared/FieldRenderer.tsx +478 -0
  121. package/.framework/src/components/shared/SchemaFields.tsx +226 -0
  122. package/.framework/src/components/ui/DataTable.tsx +343 -0
  123. package/.framework/src/components/ui/Form.tsx +281 -0
  124. package/.framework/src/components/ui/ItemCard.tsx +296 -0
  125. package/.framework/src/components/ui/ItemListView.tsx +308 -0
  126. package/.framework/src/components/ui/LoadingSpinner.tsx +52 -0
  127. package/.framework/src/components/ui/Modal.tsx +61 -0
  128. package/.framework/src/components/ui/RichTextEditor.tsx +210 -0
  129. package/.framework/src/components/ui/accordion.tsx +82 -0
  130. package/.framework/src/components/ui/alert-dialog.tsx +197 -0
  131. package/.framework/src/components/ui/alert.tsx +76 -0
  132. package/.framework/src/components/ui/aspect-ratio.tsx +11 -0
  133. package/.framework/src/components/ui/avatar.tsx +110 -0
  134. package/.framework/src/components/ui/badge.tsx +49 -0
  135. package/.framework/src/components/ui/breadcrumb.tsx +122 -0
  136. package/.framework/src/components/ui/button-group.tsx +83 -0
  137. package/.framework/src/components/ui/button.tsx +65 -0
  138. package/.framework/src/components/ui/calendar.tsx +222 -0
  139. package/.framework/src/components/ui/card.tsx +100 -0
  140. package/.framework/src/components/ui/carousel.tsx +240 -0
  141. package/.framework/src/components/ui/chart.tsx +373 -0
  142. package/.framework/src/components/ui/checkbox.tsx +31 -0
  143. package/.framework/src/components/ui/collapsible.tsx +33 -0
  144. package/.framework/src/components/ui/combobox.tsx +299 -0
  145. package/.framework/src/components/ui/command.tsx +193 -0
  146. package/.framework/src/components/ui/context-menu.tsx +261 -0
  147. package/.framework/src/components/ui/dialog.tsx +165 -0
  148. package/.framework/src/components/ui/direction.tsx +22 -0
  149. package/.framework/src/components/ui/drawer.tsx +132 -0
  150. package/.framework/src/components/ui/dropdown-menu.tsx +269 -0
  151. package/.framework/src/components/ui/empty.tsx +104 -0
  152. package/.framework/src/components/ui/field.tsx +238 -0
  153. package/.framework/src/components/ui/hover-card.tsx +42 -0
  154. package/.framework/src/components/ui/input-group.tsx +153 -0
  155. package/.framework/src/components/ui/input-otp.tsx +87 -0
  156. package/.framework/src/components/ui/input.tsx +19 -0
  157. package/.framework/src/components/ui/item.tsx +196 -0
  158. package/.framework/src/components/ui/kbd.tsx +26 -0
  159. package/.framework/src/components/ui/label.tsx +22 -0
  160. package/.framework/src/components/ui/menubar.tsx +277 -0
  161. package/.framework/src/components/ui/native-select.tsx +61 -0
  162. package/.framework/src/components/ui/navigation-menu.tsx +164 -0
  163. package/.framework/src/components/ui/pagination.tsx +129 -0
  164. package/.framework/src/components/ui/popover.tsx +87 -0
  165. package/.framework/src/components/ui/progress.tsx +31 -0
  166. package/.framework/src/components/ui/radio-group.tsx +42 -0
  167. package/.framework/src/components/ui/resizable.tsx +50 -0
  168. package/.framework/src/components/ui/scroll-area.tsx +53 -0
  169. package/.framework/src/components/ui/select.tsx +195 -0
  170. package/.framework/src/components/ui/separator.tsx +26 -0
  171. package/.framework/src/components/ui/sheet.tsx +145 -0
  172. package/.framework/src/components/ui/sidebar.tsx +706 -0
  173. package/.framework/src/components/ui/skeleton.tsx +13 -0
  174. package/.framework/src/components/ui/slider.tsx +59 -0
  175. package/.framework/src/components/ui/sonner.tsx +47 -0
  176. package/.framework/src/components/ui/spinner.tsx +10 -0
  177. package/.framework/src/components/ui/switch.tsx +33 -0
  178. package/.framework/src/components/ui/table-primitives.tsx +141 -0
  179. package/.framework/src/components/ui/table.tsx +114 -0
  180. package/.framework/src/components/ui/tabs.tsx +90 -0
  181. package/.framework/src/components/ui/textarea.tsx +18 -0
  182. package/.framework/src/components/ui/toggle-group.tsx +89 -0
  183. package/.framework/src/components/ui/toggle.tsx +45 -0
  184. package/.framework/src/components/ui/tooltip.tsx +57 -0
  185. package/.framework/src/contexts/AppContext.tsx +133 -0
  186. package/.framework/src/contexts/AuthContext.tsx +371 -0
  187. package/.framework/src/hooks/use-mobile.ts +19 -0
  188. package/.framework/src/hooks/useApi.ts +526 -0
  189. package/.framework/src/hooks/useApps.ts +114 -0
  190. package/.framework/src/hooks/useEntityList.ts +190 -0
  191. package/.framework/src/hooks/useEntityRecord.ts +308 -0
  192. package/.framework/src/hooks/useForm.ts +307 -0
  193. package/.framework/src/hooks/useListSchema.ts +264 -0
  194. package/.framework/src/hooks/useSchemaRecord.ts +223 -0
  195. package/.framework/src/index.css +128 -0
  196. package/.framework/src/lib/api.ts +156 -0
  197. package/.framework/src/lib/supabase.ts +94 -0
  198. package/.framework/src/lib/utils.ts +317 -0
  199. package/.framework/src/main.tsx +27 -0
  200. package/.framework/src/pages/DashboardPage.tsx +181 -0
  201. package/.framework/src/pages/NotFoundPage.tsx +39 -0
  202. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +161 -0
  203. package/.framework/src/pages/admin/AIAgentsPage.tsx +318 -0
  204. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +199 -0
  205. package/.framework/src/pages/admin/APIKeysPage.tsx +303 -0
  206. package/.framework/src/pages/admin/AlertsConfigPage.tsx +523 -0
  207. package/.framework/src/pages/admin/AppDetailPage.tsx +493 -0
  208. package/.framework/src/pages/admin/AppsPage.tsx +355 -0
  209. package/.framework/src/pages/admin/DesignedPage.tsx +491 -0
  210. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +534 -0
  211. package/.framework/src/pages/admin/EmbeddingsPage.tsx +424 -0
  212. package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +176 -0
  213. package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +109 -0
  214. package/.framework/src/pages/admin/IntegratedDashboard.tsx +402 -0
  215. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +187 -0
  216. package/.framework/src/pages/admin/IntegrationsPage.tsx +301 -0
  217. package/.framework/src/pages/admin/LogsPage.tsx +283 -0
  218. package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +85 -0
  219. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +470 -0
  220. package/.framework/src/pages/admin/PipelineDetailPage.tsx +183 -0
  221. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +279 -0
  222. package/.framework/src/pages/admin/PipelinesPage.tsx +390 -0
  223. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +299 -0
  224. package/.framework/src/pages/admin/PromptConfigsPage.tsx +292 -0
  225. package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +434 -0
  226. package/.framework/src/pages/admin/RoleDetailPage.tsx +273 -0
  227. package/.framework/src/pages/admin/RolesPage.tsx +292 -0
  228. package/.framework/src/pages/admin/SelectTestPage.tsx +61 -0
  229. package/.framework/src/pages/admin/ShadcnTestPage.tsx +588 -0
  230. package/.framework/src/pages/admin/SimpleDashboard.tsx +387 -0
  231. package/.framework/src/pages/admin/TestRunDetailPage.tsx +172 -0
  232. package/.framework/src/pages/admin/TestingDashboard.tsx +257 -0
  233. package/.framework/src/pages/admin/TimerDetailPage.tsx +151 -0
  234. package/.framework/src/pages/admin/TimersPage.tsx +376 -0
  235. package/.framework/src/pages/admin/TriggerDetailPage.tsx +149 -0
  236. package/.framework/src/pages/admin/TriggersPage.tsx +381 -0
  237. package/.framework/src/pages/admin/TypeDetailPage.tsx +694 -0
  238. package/.framework/src/pages/admin/TypesPage.tsx +295 -0
  239. package/.framework/src/pages/auth/LoginPage.tsx +188 -0
  240. package/.framework/src/pages/auth/RegisterPage.tsx +163 -0
  241. package/.framework/src/pages/spine-framework/APIPage.tsx +17 -0
  242. package/.framework/src/pages/spine-framework/CLIPage.tsx +25 -0
  243. package/.framework/src/types/auth.ts +125 -0
  244. package/.framework/src/types/types.ts +407 -0
  245. package/STRUCTURE.md +150 -0
  246. package/config/components.json +25 -0
  247. package/config/deno.lock +108 -0
  248. package/config/package-lock.json +17183 -0
  249. package/config/postcss.config.cjs +10 -0
  250. package/config/tailwind.config.cjs +78 -0
  251. package/config/tsconfig.build.json +32 -0
  252. package/config/tsconfig.cli.json +18 -0
  253. package/config/tsconfig.json +41 -0
  254. package/config/tsconfig.node.json +17 -0
  255. package/config/tsconfig.node.tsbuildinfo +1 -0
  256. package/config/tsconfig.tsbuildinfo +1 -0
  257. package/config/typedoc.json +16 -0
  258. package/config/vite.config.d.ts +2 -0
  259. package/config/vite.config.ts +72 -0
  260. package/dist/cli/commands/agents.d.ts +39 -0
  261. package/dist/cli/commands/agents.d.ts.map +1 -0
  262. package/dist/cli/commands/auth.d.ts +36 -0
  263. package/dist/cli/commands/auth.d.ts.map +1 -0
  264. package/dist/cli/commands/create-app.d.ts +23 -0
  265. package/dist/cli/commands/create-app.d.ts.map +1 -0
  266. package/dist/cli/commands/dev.d.ts +39 -0
  267. package/dist/cli/commands/dev.d.ts.map +1 -0
  268. package/dist/cli/commands/doctor.d.ts +42 -0
  269. package/dist/cli/commands/doctor.d.ts.map +1 -0
  270. package/dist/cli/commands/generate.d.ts +36 -0
  271. package/dist/cli/commands/generate.d.ts.map +1 -0
  272. package/dist/cli/commands/init.d.ts +30 -0
  273. package/dist/cli/commands/init.d.ts.map +1 -0
  274. package/dist/cli/commands/install-app.d.ts +30 -0
  275. package/dist/cli/commands/install-app.d.ts.map +1 -0
  276. package/dist/cli/commands/items.d.ts +45 -0
  277. package/dist/cli/commands/items.d.ts.map +1 -0
  278. package/dist/cli/commands/migrations.d.ts +41 -0
  279. package/dist/cli/commands/migrations.d.ts.map +1 -0
  280. package/dist/cli/commands/pipelines.d.ts +40 -0
  281. package/dist/cli/commands/pipelines.d.ts.map +1 -0
  282. package/dist/cli/commands/status.d.ts +23 -0
  283. package/dist/cli/commands/status.d.ts.map +1 -0
  284. package/dist/cli/commands/system.d.ts +29 -0
  285. package/dist/cli/commands/system.d.ts.map +1 -0
  286. package/dist/cli/commands/test.d.ts +46 -0
  287. package/dist/cli/commands/test.d.ts.map +1 -0
  288. package/dist/cli/commands/uninstall-app.d.ts +23 -0
  289. package/dist/cli/commands/uninstall-app.d.ts.map +1 -0
  290. package/dist/cli/context.d.ts +88 -0
  291. package/dist/cli/context.d.ts.map +1 -0
  292. package/dist/cli/env-loader.d.ts +14 -0
  293. package/dist/cli/env-loader.d.ts.map +1 -0
  294. package/dist/cli/index.d.ts +41 -0
  295. package/dist/cli/index.d.ts.map +1 -0
  296. package/dist/functions/_shared/agent-runner.d.ts +156 -0
  297. package/dist/functions/_shared/agent-runner.d.ts.map +1 -0
  298. package/dist/functions/_shared/app-manifest.d.ts +68 -0
  299. package/dist/functions/_shared/app-manifest.d.ts.map +1 -0
  300. package/dist/functions/_shared/audit.d.ts +91 -0
  301. package/dist/functions/_shared/audit.d.ts.map +1 -0
  302. package/dist/functions/_shared/db.d.ts +125 -0
  303. package/dist/functions/_shared/db.d.ts.map +1 -0
  304. package/dist/functions/_shared/index.d.ts +298 -0
  305. package/dist/functions/_shared/index.d.ts.map +1 -0
  306. package/dist/functions/_shared/middleware.d.ts +315 -0
  307. package/dist/functions/_shared/middleware.d.ts.map +1 -0
  308. package/dist/functions/_shared/permissions.d.ts +626 -0
  309. package/dist/functions/_shared/permissions.d.ts.map +1 -0
  310. package/dist/functions/_shared/pipeline-runner.d.ts +124 -0
  311. package/dist/functions/_shared/pipeline-runner.d.ts.map +1 -0
  312. package/dist/functions/_shared/principal.d.ts +284 -0
  313. package/dist/functions/_shared/principal.d.ts.map +1 -0
  314. package/dist/functions/_shared/schema-utils.d.ts +181 -0
  315. package/dist/functions/_shared/schema-utils.d.ts.map +1 -0
  316. package/dist/functions/_shared/testing.d.ts +172 -0
  317. package/dist/functions/_shared/testing.d.ts.map +1 -0
  318. package/dist/functions/_shared/trigger-engine.d.ts +140 -0
  319. package/dist/functions/_shared/trigger-engine.d.ts.map +1 -0
  320. package/dist/functions/_shared/webhook-registration.d.ts +81 -0
  321. package/dist/functions/_shared/webhook-registration.d.ts.map +1 -0
  322. package/dist/functions/_shared/webhook-registry.d.ts +57 -0
  323. package/dist/functions/_shared/webhook-registry.d.ts.map +1 -0
  324. package/dist/functions/account-nodes.d.ts +48 -0
  325. package/dist/functions/account-nodes.d.ts.map +1 -0
  326. package/dist/functions/admin-data.d.ts +178 -0
  327. package/dist/functions/admin-data.d.ts.map +1 -0
  328. package/dist/functions/ai-agents.d.ts +125 -0
  329. package/dist/functions/ai-agents.d.ts.map +1 -0
  330. package/dist/functions/api-keys.d.ts +140 -0
  331. package/dist/functions/api-keys.d.ts.map +1 -0
  332. package/dist/functions/apps.d.ts +163 -0
  333. package/dist/functions/apps.d.ts.map +1 -0
  334. package/dist/functions/auth.d.ts +74 -0
  335. package/dist/functions/auth.d.ts.map +1 -0
  336. package/dist/functions/debug-auth.d.ts +33 -0
  337. package/dist/functions/debug-auth.d.ts.map +1 -0
  338. package/dist/functions/embeddings.d.ts +205 -0
  339. package/dist/functions/embeddings.d.ts.map +1 -0
  340. package/dist/functions/integration-routes.d.ts +45 -0
  341. package/dist/functions/integration-routes.d.ts.map +1 -0
  342. package/dist/functions/integrations.d.ts +124 -0
  343. package/dist/functions/integrations.d.ts.map +1 -0
  344. package/dist/functions/item-progress.d.ts +41 -0
  345. package/dist/functions/item-progress.d.ts.map +1 -0
  346. package/dist/functions/logs.d.ts +162 -0
  347. package/dist/functions/logs.d.ts.map +1 -0
  348. package/dist/functions/observability.d.ts +123 -0
  349. package/dist/functions/observability.d.ts.map +1 -0
  350. package/dist/functions/pipeline-executions.d.ts +190 -0
  351. package/dist/functions/pipeline-executions.d.ts.map +1 -0
  352. package/dist/functions/pipelines.d.ts +171 -0
  353. package/dist/functions/pipelines.d.ts.map +1 -0
  354. package/dist/functions/prompt-configs.d.ts +125 -0
  355. package/dist/functions/prompt-configs.d.ts.map +1 -0
  356. package/dist/functions/roles.d.ts +118 -0
  357. package/dist/functions/roles.d.ts.map +1 -0
  358. package/dist/functions/system-cron.d.ts +65 -0
  359. package/dist/functions/system-cron.d.ts.map +1 -0
  360. package/dist/functions/system.d.ts +29 -0
  361. package/dist/functions/system.d.ts.map +1 -0
  362. package/dist/functions/tests.d.ts +28 -0
  363. package/dist/functions/tests.d.ts.map +1 -0
  364. package/dist/functions/timers.d.ts +139 -0
  365. package/dist/functions/timers.d.ts.map +1 -0
  366. package/dist/functions/triggers.d.ts +203 -0
  367. package/dist/functions/triggers.d.ts.map +1 -0
  368. package/dist/functions/types.d.ts +151 -0
  369. package/dist/functions/types.d.ts.map +1 -0
  370. package/dist/src/types/types.d.ts +364 -0
  371. package/dist/src/types/types.d.ts.map +1 -0
  372. package/package.json +192 -0
  373. package/scripts/app-install-cli.ts +286 -0
  374. package/scripts/assemble-frontend.sh +79 -0
  375. package/scripts/assemble-functions.sh +62 -0
  376. package/scripts/assemble.sh +35 -0
  377. package/scripts/boundary-check.sh +106 -0
  378. package/scripts/build-manifest.sh +80 -0
  379. package/scripts/check-core-integrity.sh +82 -0
  380. package/scripts/ingest-chunks.cjs +202 -0
  381. package/scripts/kb-chunk-parser.cjs +312 -0
  382. package/scripts/kb-chunk-parser.ts +330 -0
  383. package/scripts/load-test-app-install.ts +484 -0
  384. package/scripts/netlify-dev-wrapper.sh +22 -0
  385. package/scripts/verify-integrity.sh +69 -0
@@ -0,0 +1,523 @@
1
+ /**
2
+ * @module src/pages/admin/AlertsConfigPage
3
+ * @audience installer
4
+ * @layer frontend-page
5
+ * @stability stable
6
+ *
7
+ * Alert rule configuration page. Fetches configured alert rules via
8
+ * `/api/admin-data?action=alerts`, supports create / edit / delete via
9
+ * an inline modal form. Rules define thresholds (metric, operator,
10
+ * threshold value) and notification channels. Renders inside
11
+ * `AdminListPage`.
12
+ *
13
+ * @seeAlso src/pages/admin/ObservabilityDashboard.tsx
14
+ */
15
+
16
+ import React, { useState } from 'react'
17
+ import {
18
+ Bell,
19
+ Plus,
20
+ Edit,
21
+ Trash2,
22
+ TriangleAlert,
23
+ CheckCircle,
24
+ XCircle,
25
+ } from 'lucide-react'
26
+ import { LoadingSpinner } from '../../components/ui/LoadingSpinner'
27
+ import { Button } from '../../components/ui/button'
28
+ import { Modal } from '../../components/ui/Modal'
29
+ import { AdminListPage } from '../../components/admin/AdminListPage'
30
+ import { useApi } from '../../hooks/useApi'
31
+ import { apiFetch } from '../../lib/api'
32
+ import { formatDateTime } from '../../lib/utils'
33
+
34
+ interface ThresholdAlert {
35
+ id: string
36
+ title: string
37
+ description?: string
38
+ status: 'active' | 'inactive'
39
+ data: {
40
+ metric: 'error_rate' | 'latency_p95' | 'pipeline_failure_rate'
41
+ operator: 'gt' | 'lt'
42
+ value: number
43
+ window_minutes: number
44
+ pipeline_id?: string | null
45
+ is_active: boolean
46
+ }
47
+ created_at: string
48
+ updated_at: string
49
+ }
50
+
51
+ interface Pipeline {
52
+ id: string
53
+ name: string
54
+ }
55
+
56
+ const METRIC_LABELS: Record<string, string> = {
57
+ error_rate: 'Error Rate',
58
+ latency_p95: 'Latency (P95)',
59
+ pipeline_failure_rate: 'Pipeline Failure Rate',
60
+ }
61
+
62
+ const OPERATOR_LABELS: Record<string, string> = {
63
+ gt: '>',
64
+ lt: '<',
65
+ }
66
+
67
+ const UNIT_LABELS: Record<string, string> = {
68
+ error_rate: '%',
69
+ latency_p95: 'ms',
70
+ pipeline_failure_rate: '%',
71
+ }
72
+
73
+ export function AlertsConfigPage() {
74
+ const [isModalOpen, setIsModalOpen] = useState(false)
75
+ const [editingAlert, setEditingAlert] = useState<ThresholdAlert | null>(null)
76
+ const [isDeleting, setIsDeleting] = useState(false)
77
+
78
+ // Fetch threshold alerts (items with type = threshold_alert)
79
+ const { data: alerts, loading, error, refetch } = useApi<ThresholdAlert[]>(
80
+ async () => {
81
+ const response = await apiFetch('/api/admin-data?entity=items&type_slug=threshold_alert')
82
+ if (!response.ok) throw new Error('Failed to fetch alerts')
83
+ const result = await response.json()
84
+ return (result.data || result || []).filter((item: any) =>
85
+ item.data?.metric || item.title?.includes('Alert') || item.title?.includes('Rate') || item.title?.includes('Latency')
86
+ )
87
+ },
88
+ { immediate: true }
89
+ )
90
+
91
+ // Fetch available pipelines for dropdown
92
+ const { data: pipelines } = useApi<Pipeline[]>(
93
+ async () => {
94
+ const response = await apiFetch('/api/pipelines?action=list')
95
+ if (!response.ok) return []
96
+ const result = await response.json()
97
+ return result.data || result || []
98
+ },
99
+ { immediate: true }
100
+ )
101
+
102
+ const handleSave = async (formData: any) => {
103
+ try {
104
+ const payload = {
105
+ type_id: 'threshold_alert', // Will be resolved server-side
106
+ title: formData.title,
107
+ description: formData.description,
108
+ status: formData.is_active ? 'active' : 'inactive',
109
+ data: {
110
+ metric: formData.metric,
111
+ operator: formData.operator,
112
+ value: parseFloat(formData.value),
113
+ window_minutes: parseInt(formData.window_minutes),
114
+ pipeline_id: formData.pipeline_id || null,
115
+ is_active: formData.is_active,
116
+ },
117
+ }
118
+
119
+ if (editingAlert) {
120
+ // Update existing
121
+ const response = await apiFetch(`/api/admin-data?entity=items&id=${editingAlert.id}`, {
122
+ method: 'PUT',
123
+ body: JSON.stringify(payload),
124
+ })
125
+ if (!response.ok) throw new Error('Failed to update alert')
126
+ } else {
127
+ // Create new
128
+ const response = await apiFetch('/api/admin-data?entity=items', {
129
+ method: 'POST',
130
+ body: JSON.stringify(payload),
131
+ })
132
+ if (!response.ok) throw new Error('Failed to create alert')
133
+ }
134
+
135
+ setIsModalOpen(false)
136
+ setEditingAlert(null)
137
+ refetch()
138
+ } catch (err) {
139
+ alert(err instanceof Error ? err.message : 'Failed to save alert')
140
+ }
141
+ }
142
+
143
+ const handleDelete = async (id: string) => {
144
+ if (!confirm('Are you sure you want to delete this alert?')) return
145
+
146
+ try {
147
+ const response = await apiFetch(`/api/admin-data?entity=items&id=${id}`, {
148
+ method: 'DELETE',
149
+ })
150
+ if (!response.ok) throw new Error('Failed to delete alert')
151
+ refetch()
152
+ } catch (err) {
153
+ alert(err instanceof Error ? err.message : 'Failed to delete alert')
154
+ }
155
+ }
156
+
157
+ const handleToggleActive = async (alert: ThresholdAlert) => {
158
+ try {
159
+ const response = await apiFetch(`/api/admin-data?entity=items&id=${alert.id}`, {
160
+ method: 'PUT',
161
+ body: JSON.stringify({
162
+ status: alert.status === 'active' ? 'inactive' : 'active',
163
+ data: {
164
+ ...alert.data,
165
+ is_active: alert.status !== 'active',
166
+ },
167
+ }),
168
+ })
169
+ if (!response.ok) throw new Error('Failed to toggle alert')
170
+ refetch()
171
+ } catch (err) {
172
+ window.alert(err instanceof Error ? err.message : 'Failed to toggle alert')
173
+ }
174
+ }
175
+
176
+ const openCreateModal = () => {
177
+ setEditingAlert(null)
178
+ setIsModalOpen(true)
179
+ }
180
+
181
+ const openEditModal = (alert: ThresholdAlert) => {
182
+ setEditingAlert(alert)
183
+ setIsModalOpen(true)
184
+ }
185
+
186
+ const getMetricBadge = (metric: string) => {
187
+ const colors: Record<string, string> = {
188
+ error_rate: 'bg-error/10 text-error',
189
+ latency_p95: 'bg-warning/50 text-warning',
190
+ pipeline_failure_rate: 'bg-critical/50 text-critical',
191
+ }
192
+ return (
193
+ <span className={`inline-flex px-2 py-0.5 text-xs font-medium rounded-md ${colors[metric] || 'bg-muted text-muted-foreground'}`}>
194
+ {METRIC_LABELS[metric] || metric}
195
+ </span>
196
+ )
197
+ }
198
+
199
+ const statsCards = [
200
+ {
201
+ title: 'Total Alerts',
202
+ value: alerts?.length || 0,
203
+ icon: Bell,
204
+ iconColor: 'text-primary',
205
+ },
206
+ {
207
+ title: 'Active',
208
+ value: alerts?.filter(a => a.status === 'active').length || 0,
209
+ icon: CheckCircle,
210
+ iconColor: 'text-green-600',
211
+ },
212
+ {
213
+ title: 'Inactive',
214
+ value: alerts?.filter(a => a.status === 'inactive').length || 0,
215
+ icon: XCircle,
216
+ iconColor: 'text-muted-foreground',
217
+ },
218
+ {
219
+ title: 'With Pipeline',
220
+ value: alerts?.filter(a => a.data?.pipeline_id).length || 0,
221
+ icon: TriangleAlert,
222
+ iconColor: 'text-amber-600',
223
+ },
224
+ ]
225
+
226
+ return (
227
+ <AdminListPage
228
+ title="Threshold Alerts"
229
+ description="Configure alerts for system metrics and performance thresholds"
230
+ statsCards={statsCards}
231
+ loading={loading}
232
+ error={error}
233
+ emptyMessage="No alerts configured"
234
+ emptyIcon={Bell}
235
+ newButtonText="Create Alert"
236
+ onNewClick={openCreateModal}
237
+ >
238
+ {alerts && alerts.length === 0 ? (
239
+ <div className="p-8 text-center">
240
+ <Bell className="mx-auto h-12 w-12 text-muted-foreground" />
241
+ <h3 className="mt-2 text-sm font-medium text-foreground">No alerts configured</h3>
242
+ <p className="mt-1 text-sm text-muted-foreground">
243
+ Create your first threshold alert to monitor system health
244
+ </p>
245
+ </div>
246
+ ) : (
247
+ <div className="divide-y divide-border">
248
+ {alerts?.map((alert) => (
249
+ <div key={alert.id} className="px-6 py-4 hover:bg-muted/50">
250
+ <div className="flex items-start justify-between">
251
+ <div className="flex-1 min-w-0">
252
+ <div className="flex items-center gap-3">
253
+ <h3 className="text-sm font-medium text-foreground">{alert.title}</h3>
254
+ {getMetricBadge(alert.data?.metric)}
255
+ <span
256
+ className={`inline-flex px-2 py-0.5 text-xs font-medium rounded-md ${
257
+ alert.status === 'active'
258
+ ? 'bg-green-50 text-green-700'
259
+ : 'bg-muted text-muted-foreground'
260
+ }`}
261
+ >
262
+ {alert.status === 'active' ? 'Active' : 'Inactive'}
263
+ </span>
264
+ </div>
265
+ <p className="text-sm text-muted-foreground mt-1">{alert.description}</p>
266
+ <div className="flex items-center gap-4 mt-2 text-sm text-muted-foreground">
267
+ <span>
268
+ {METRIC_LABELS[alert.data?.metric]} {OPERATOR_LABELS[alert.data?.operator]} {alert.data?.value}
269
+ {UNIT_LABELS[alert.data?.metric]}
270
+ </span>
271
+ <span>·</span>
272
+ <span>Window: {alert.data?.window_minutes} min</span>
273
+ {alert.data?.pipeline_id && (
274
+ <>
275
+ <span>·</span>
276
+ <span className="text-primary">Pipeline: {alert.data.pipeline_id.slice(0, 8)}...</span>
277
+ </>
278
+ )}
279
+ </div>
280
+ </div>
281
+ <div className="flex items-center gap-2 ml-4">
282
+ <button
283
+ onClick={() => handleToggleActive(alert)}
284
+ className={`p-2 rounded-lg transition-colors ${
285
+ alert.status === 'active'
286
+ ? 'text-green-600 hover:bg-green-50'
287
+ : 'text-muted-foreground hover:bg-muted'
288
+ }`}
289
+ title={alert.status === 'active' ? 'Deactivate' : 'Activate'}
290
+ >
291
+ {alert.status === 'active' ? (
292
+ <CheckCircle className="h-5 w-5" />
293
+ ) : (
294
+ <XCircle className="h-5 w-5" />
295
+ )}
296
+ </button>
297
+ <button
298
+ onClick={() => openEditModal(alert)}
299
+ className="p-2 text-muted-foreground hover:text-primary hover:bg-primary/10 rounded-lg transition-colors"
300
+ title="Edit"
301
+ >
302
+ <Edit className="h-5 w-5" />
303
+ </button>
304
+ <button
305
+ onClick={() => handleDelete(alert.id)}
306
+ className="p-2 text-muted-foreground hover:text-destructive hover:bg-destructive/10 rounded-lg transition-colors"
307
+ title="Delete"
308
+ >
309
+ <Trash2 className="h-5 w-5" />
310
+ </button>
311
+ </div>
312
+ </div>
313
+ </div>
314
+ ))}
315
+ </div>
316
+ )}
317
+
318
+ {/* Create/Edit Modal */}
319
+ <AlertModal
320
+ isOpen={isModalOpen}
321
+ onClose={() => {
322
+ setIsModalOpen(false)
323
+ setEditingAlert(null)
324
+ }}
325
+ onSave={handleSave}
326
+ alert={editingAlert}
327
+ pipelines={pipelines || []}
328
+ />
329
+ </AdminListPage>
330
+ )
331
+ }
332
+
333
+ interface AlertModalProps {
334
+ isOpen: boolean
335
+ onClose: () => void
336
+ onSave: (data: any) => void
337
+ alert: ThresholdAlert | null
338
+ pipelines: Pipeline[]
339
+ }
340
+
341
+ function AlertModal({ isOpen, onClose, onSave, alert, pipelines }: AlertModalProps) {
342
+ const [formData, setFormData] = useState({
343
+ title: '',
344
+ description: '',
345
+ metric: 'error_rate',
346
+ operator: 'gt',
347
+ value: '5',
348
+ window_minutes: '5',
349
+ pipeline_id: '',
350
+ is_active: false,
351
+ })
352
+
353
+ React.useEffect(() => {
354
+ if (alert) {
355
+ setFormData({
356
+ title: alert.title,
357
+ description: alert.description || '',
358
+ metric: alert.data?.metric || 'error_rate',
359
+ operator: alert.data?.operator || 'gt',
360
+ value: String(alert.data?.value || '5'),
361
+ window_minutes: String(alert.data?.window_minutes || '5'),
362
+ pipeline_id: alert.data?.pipeline_id || '',
363
+ is_active: alert.status === 'active',
364
+ })
365
+ } else {
366
+ setFormData({
367
+ title: '',
368
+ description: '',
369
+ metric: 'error_rate',
370
+ operator: 'gt',
371
+ value: '5',
372
+ window_minutes: '5',
373
+ pipeline_id: '',
374
+ is_active: false,
375
+ })
376
+ }
377
+ }, [alert, isOpen])
378
+
379
+ const handleSubmit = (e: React.FormEvent) => {
380
+ e.preventDefault()
381
+ onSave(formData)
382
+ }
383
+
384
+ return (
385
+ <Modal
386
+ isOpen={isOpen}
387
+ onClose={onClose}
388
+ title={alert ? 'Edit Alert' : 'Create Alert'}
389
+ size="md"
390
+ >
391
+ <form onSubmit={handleSubmit} className="space-y-4">
392
+ <div>
393
+ <label className="block text-sm font-medium text-foreground mb-1">Name</label>
394
+ <input
395
+ type="text"
396
+ value={formData.title}
397
+ onChange={(e) => setFormData({ ...formData, title: e.target.value })}
398
+ required
399
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
400
+ placeholder="High Error Rate Alert"
401
+ />
402
+ </div>
403
+
404
+ <div>
405
+ <label className="block text-sm font-medium text-foreground mb-1">Description</label>
406
+ <textarea
407
+ value={formData.description}
408
+ onChange={(e) => setFormData({ ...formData, description: e.target.value })}
409
+ rows={2}
410
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
411
+ placeholder="Triggers when error rate exceeds threshold"
412
+ />
413
+ </div>
414
+
415
+ <div className="grid grid-cols-2 gap-4">
416
+ <div>
417
+ <label className="block text-sm font-medium text-foreground mb-1">Metric</label>
418
+ <select
419
+ value={formData.metric}
420
+ onChange={(e) => setFormData({ ...formData, metric: e.target.value })}
421
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
422
+ >
423
+ <option value="error_rate">Error Rate</option>
424
+ <option value="latency_p95">Latency (P95)</option>
425
+ <option value="pipeline_failure_rate">Pipeline Failure Rate</option>
426
+ </select>
427
+ </div>
428
+
429
+ <div>
430
+ <label className="block text-sm font-medium text-foreground mb-1">Operator</label>
431
+ <select
432
+ value={formData.operator}
433
+ onChange={(e) => setFormData({ ...formData, operator: e.target.value })}
434
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
435
+ >
436
+ <option value="gt">Greater than (&gt;)</option>
437
+ <option value="lt">Less than (&lt;)</option>
438
+ </select>
439
+ </div>
440
+ </div>
441
+
442
+ <div className="grid grid-cols-2 gap-4">
443
+ <div>
444
+ <label className="block text-sm font-medium text-foreground mb-1">
445
+ Threshold Value
446
+ <span className="text-muted-foreground font-normal ml-1">
447
+ ({formData.metric === 'latency_p95' ? 'ms' : '%'})
448
+ </span>
449
+ </label>
450
+ <input
451
+ type="number"
452
+ value={formData.value}
453
+ onChange={(e) => setFormData({ ...formData, value: e.target.value })}
454
+ required
455
+ min="0"
456
+ step={formData.metric === 'latency_p95' ? '100' : '0.1'}
457
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
458
+ />
459
+ </div>
460
+
461
+ <div>
462
+ <label className="block text-sm font-medium text-foreground mb-1">Window (minutes)</label>
463
+ <select
464
+ value={formData.window_minutes}
465
+ onChange={(e) => setFormData({ ...formData, window_minutes: e.target.value })}
466
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
467
+ >
468
+ <option value="1">1 minute</option>
469
+ <option value="5">5 minutes</option>
470
+ <option value="10">10 minutes</option>
471
+ <option value="15">15 minutes</option>
472
+ <option value="30">30 minutes</option>
473
+ <option value="60">1 hour</option>
474
+ </select>
475
+ </div>
476
+ </div>
477
+
478
+ <div>
479
+ <label className="block text-sm font-medium text-foreground mb-1">
480
+ Pipeline to Fire (optional)
481
+ </label>
482
+ <select
483
+ value={formData.pipeline_id}
484
+ onChange={(e) => setFormData({ ...formData, pipeline_id: e.target.value })}
485
+ className="w-full px-3 py-2 border border-input rounded-lg focus:ring-2 focus:ring-ring focus:border-ring"
486
+ >
487
+ <option value="">None (log only)</option>
488
+ {pipelines.map((p) => (
489
+ <option key={p.id} value={p.id}>
490
+ {p.name || p.id.slice(0, 8)}
491
+ </option>
492
+ ))}
493
+ </select>
494
+ <p className="text-xs text-muted-foreground mt-1">
495
+ When breached, this pipeline will be executed. Leave empty to log only.
496
+ </p>
497
+ </div>
498
+
499
+ <div className="flex items-center gap-3 pt-2">
500
+ <input
501
+ type="checkbox"
502
+ id="is_active"
503
+ checked={formData.is_active}
504
+ onChange={(e) => setFormData({ ...formData, is_active: e.target.checked })}
505
+ className="h-4 w-4 text-navy border-slate-300 rounded focus:ring-navy"
506
+ />
507
+ <label htmlFor="is_active" className="text-sm text-slate-700">
508
+ Activate immediately
509
+ </label>
510
+ </div>
511
+
512
+ <div className="flex justify-end gap-3 pt-4 border-t border-slate-200">
513
+ <Button type="button" variant="secondary" onClick={onClose}>
514
+ Cancel
515
+ </Button>
516
+ <Button type="submit" variant="default">
517
+ {alert ? 'Update Alert' : 'Create Alert'}
518
+ </Button>
519
+ </div>
520
+ </form>
521
+ </Modal>
522
+ )
523
+ }