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,588 @@
1
+ /**
2
+ * @module src/pages/admin/ShadcnTestPage
3
+ * @audience installer
4
+ * @layer frontend-page
5
+ * @stability testing
6
+ *
7
+ * Test page showcasing all shadcn/ui components with b1a0RuGWG preset.
8
+ * Used to verify shadcn installation and theming is working correctly.
9
+ */
10
+
11
+ import { useState } from 'react'
12
+ import {
13
+ Card,
14
+ CardContent,
15
+ CardDescription,
16
+ CardHeader,
17
+ CardTitle,
18
+ CardFooter
19
+ } from '../../components/ui/card'
20
+ import { Button } from '../../components/ui/button'
21
+ import { Input } from '../../components/ui/input'
22
+ import { Label } from '../../components/ui/label'
23
+ import {
24
+ Select,
25
+ SelectContent,
26
+ SelectItem,
27
+ SelectTrigger,
28
+ SelectValue,
29
+ } from '../../components/ui/select'
30
+ import { Checkbox } from '../../components/ui/checkbox'
31
+ import { Switch } from '../../components/ui/switch'
32
+ import { Badge } from '../../components/ui/badge'
33
+ import {
34
+ Accordion,
35
+ AccordionContent,
36
+ AccordionItem,
37
+ AccordionTrigger,
38
+ } from '../../components/ui/accordion'
39
+ import {
40
+ Dialog,
41
+ DialogContent,
42
+ DialogDescription,
43
+ DialogHeader,
44
+ DialogTitle,
45
+ DialogTrigger,
46
+ } from '../../components/ui/dialog'
47
+ import {
48
+ Alert,
49
+ AlertDescription,
50
+ AlertTitle,
51
+ } from '../../components/ui/alert'
52
+ import { Separator } from '../../components/ui/separator'
53
+ import {
54
+ Table,
55
+ TableBody,
56
+ TableCaption,
57
+ TableCell,
58
+ TableHead,
59
+ TableHeader,
60
+ TableRow,
61
+ } from '../../components/ui/table'
62
+ import {
63
+ Tabs,
64
+ TabsContent,
65
+ TabsList,
66
+ TabsTrigger,
67
+ } from '../../components/ui/tabs'
68
+ import {
69
+ Breadcrumb,
70
+ BreadcrumbItem,
71
+ BreadcrumbLink,
72
+ BreadcrumbList,
73
+ BreadcrumbPage,
74
+ BreadcrumbSeparator,
75
+ } from '../../components/ui/breadcrumb'
76
+ import { ScrollArea } from '../../components/ui/scroll-area'
77
+ import { Skeleton } from '../../components/ui/skeleton'
78
+ import { Progress } from '../../components/ui/progress'
79
+ import { Avatar, AvatarFallback, AvatarImage } from '../../components/ui/avatar'
80
+ import {
81
+ Tooltip,
82
+ TooltipContent,
83
+ TooltipProvider,
84
+ TooltipTrigger,
85
+ } from '../../components/ui/tooltip'
86
+ import {
87
+ DropdownMenu,
88
+ DropdownMenuContent,
89
+ DropdownMenuItem,
90
+ DropdownMenuLabel,
91
+ DropdownMenuSeparator,
92
+ DropdownMenuTrigger,
93
+ } from '../../components/ui/dropdown-menu'
94
+ import { Textarea } from '../../components/ui/textarea'
95
+ import { RadioGroup, RadioGroupItem } from '../../components/ui/radio-group'
96
+ import { Slider } from '../../components/ui/slider'
97
+ import { Popover, PopoverContent, PopoverTrigger } from '../../components/ui/popover'
98
+ import {
99
+ Bell,
100
+ Check,
101
+ ChevronRight,
102
+ Mail,
103
+ Settings,
104
+ User,
105
+ Plus,
106
+ Search,
107
+ MoreHorizontal,
108
+ Calendar as CalendarIcon,
109
+ AlertCircle,
110
+ Info
111
+ } from 'lucide-react'
112
+ import { cn } from '../../lib/utils'
113
+
114
+ export function ShadcnTestPage() {
115
+ const [date, setDate] = useState<Date>()
116
+ const [progress, setProgress] = useState(68)
117
+ const [sliderValue, setSliderValue] = useState([50])
118
+
119
+ // Simple date formatter since date-fns is not available
120
+ const formatDate = (date: Date | undefined) => {
121
+ if (!date) return 'Pick a date'
122
+ return date.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' })
123
+ }
124
+
125
+ return (
126
+ <TooltipProvider>
127
+ <div className="flex-1 space-y-6 p-8 pt-6">
128
+ {/* Header with Breadcrumb */}
129
+ <div className="space-y-2">
130
+ <Breadcrumb>
131
+ <BreadcrumbList>
132
+ <BreadcrumbItem>
133
+ <BreadcrumbLink href="/dashboard">Spine</BreadcrumbLink>
134
+ </BreadcrumbItem>
135
+ <BreadcrumbSeparator />
136
+ <BreadcrumbItem>
137
+ <BreadcrumbLink href="/spine-framework/admin">Admin</BreadcrumbLink>
138
+ </BreadcrumbItem>
139
+ <BreadcrumbSeparator />
140
+ <BreadcrumbItem>
141
+ <BreadcrumbPage>UI Test</BreadcrumbPage>
142
+ </BreadcrumbItem>
143
+ </BreadcrumbList>
144
+ </Breadcrumb>
145
+
146
+ <div className="flex items-center justify-between">
147
+ <div>
148
+ <h1 className="text-3xl font-bold tracking-tight">shadcn/ui Test Page</h1>
149
+ <p className="text-muted-foreground">
150
+ Verifying b1a0RuGWG preset installation and component theming
151
+ </p>
152
+ </div>
153
+ <div className="flex items-center gap-2">
154
+ <Tooltip>
155
+ <TooltipTrigger asChild>
156
+ <Button variant="outline" size="icon">
157
+ <Bell className="h-4 w-4" />
158
+ </Button>
159
+ </TooltipTrigger>
160
+ <TooltipContent>
161
+ <p>Notifications</p>
162
+ </TooltipContent>
163
+ </Tooltip>
164
+
165
+ <DropdownMenu>
166
+ <DropdownMenuTrigger asChild>
167
+ <Button variant="outline" size="icon">
168
+ <Settings className="h-4 w-4" />
169
+ </Button>
170
+ </DropdownMenuTrigger>
171
+ <DropdownMenuContent align="end">
172
+ <DropdownMenuLabel>Settings</DropdownMenuLabel>
173
+ <DropdownMenuSeparator />
174
+ <DropdownMenuItem>Profile</DropdownMenuItem>
175
+ <DropdownMenuItem>Preferences</DropdownMenuItem>
176
+ <DropdownMenuItem>Logout</DropdownMenuItem>
177
+ </DropdownMenuContent>
178
+ </DropdownMenu>
179
+
180
+ <Button>
181
+ <Plus className="mr-2 h-4 w-4" />
182
+ New Item
183
+ </Button>
184
+ </div>
185
+ </div>
186
+ </div>
187
+
188
+ <Separator />
189
+
190
+ {/* Main Content Grid */}
191
+ <div className="grid gap-6 lg:grid-cols-2">
192
+ {/* Cards Section */}
193
+ <Card>
194
+ <CardHeader>
195
+ <CardTitle>Card Components</CardTitle>
196
+ <CardDescription>Various card layouts and styles</CardDescription>
197
+ </CardHeader>
198
+ <CardContent className="space-y-4">
199
+ <div className="grid grid-cols-2 gap-4">
200
+ <Card>
201
+ <CardHeader className="p-4">
202
+ <CardTitle className="text-sm">Simple Card</CardTitle>
203
+ </CardHeader>
204
+ <CardContent className="p-4 pt-0">
205
+ <p className="text-sm text-muted-foreground">Basic card content</p>
206
+ </CardContent>
207
+ </Card>
208
+
209
+ <Card className="bg-primary text-primary-foreground">
210
+ <CardHeader className="p-4">
211
+ <CardTitle className="text-sm">Themed Card</CardTitle>
212
+ </CardHeader>
213
+ <CardContent className="p-4 pt-0">
214
+ <p className="text-sm opacity-90">Primary themed card</p>
215
+ </CardContent>
216
+ </Card>
217
+ </div>
218
+ </CardContent>
219
+ </Card>
220
+
221
+ {/* Form Components */}
222
+ <Card>
223
+ <CardHeader>
224
+ <CardTitle>Form Controls</CardTitle>
225
+ <CardDescription>Inputs, selects, and checkboxes</CardDescription>
226
+ </CardHeader>
227
+ <CardContent className="space-y-4">
228
+ <div className="grid gap-2">
229
+ <Label htmlFor="email">Email</Label>
230
+ <Input id="email" placeholder="Enter email..." />
231
+ </div>
232
+
233
+ <div className="grid gap-2">
234
+ <Label htmlFor="role">Role</Label>
235
+ <Select>
236
+ <SelectTrigger id="role">
237
+ <SelectValue placeholder="Select role" />
238
+ </SelectTrigger>
239
+ <SelectContent>
240
+ <SelectItem value="admin">Admin</SelectItem>
241
+ <SelectItem value="user">User</SelectItem>
242
+ <SelectItem value="guest">Guest</SelectItem>
243
+ </SelectContent>
244
+ </Select>
245
+ </div>
246
+
247
+ <div className="grid gap-2">
248
+ <Label htmlFor="bio">Bio</Label>
249
+ <Textarea id="bio" placeholder="Tell us about yourself..." />
250
+ </div>
251
+
252
+ <div className="flex items-center space-x-2">
253
+ <Checkbox id="terms" />
254
+ <label
255
+ htmlFor="terms"
256
+ className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
257
+ >
258
+ Accept terms and conditions
259
+ </label>
260
+ </div>
261
+
262
+ <div className="flex items-center space-x-2">
263
+ <Switch id="notifications" />
264
+ <Label htmlFor="notifications">Enable notifications</Label>
265
+ </div>
266
+ </CardContent>
267
+ </Card>
268
+
269
+ {/* Badges & Alerts */}
270
+ <Card>
271
+ <CardHeader>
272
+ <CardTitle>Badges & Alerts</CardTitle>
273
+ <CardDescription>Status indicators and messages</CardDescription>
274
+ </CardHeader>
275
+ <CardContent className="space-y-4">
276
+ <div className="flex flex-wrap gap-2">
277
+ <Badge>Default</Badge>
278
+ <Badge variant="secondary">Secondary</Badge>
279
+ <Badge variant="destructive">Destructive</Badge>
280
+ <Badge variant="outline">Outline</Badge>
281
+ </div>
282
+
283
+ <Alert>
284
+ <Info className="h-4 w-4" />
285
+ <AlertTitle>Information</AlertTitle>
286
+ <AlertDescription>
287
+ This is an informational alert with an icon.
288
+ </AlertDescription>
289
+ </Alert>
290
+
291
+ <Alert variant="destructive">
292
+ <AlertCircle className="h-4 w-4" />
293
+ <AlertTitle>Error</AlertTitle>
294
+ <AlertDescription>
295
+ Something went wrong! This is a destructive alert.
296
+ </AlertDescription>
297
+ </Alert>
298
+ </CardContent>
299
+ </Card>
300
+
301
+ {/* Progress & Slider */}
302
+ <Card>
303
+ <CardHeader>
304
+ <CardTitle>Progress & Sliders</CardTitle>
305
+ <CardDescription>Visual indicators and range inputs</CardDescription>
306
+ </CardHeader>
307
+ <CardContent className="space-y-6">
308
+ <div className="space-y-2">
309
+ <div className="flex justify-between text-sm">
310
+ <Label>Progress</Label>
311
+ <span className="text-muted-foreground">{progress}%</span>
312
+ </div>
313
+ <Progress value={progress} />
314
+ <div className="flex gap-2">
315
+ <Button size="sm" variant="outline" onClick={() => setProgress(Math.max(0, progress - 10))}>-10</Button>
316
+ <Button size="sm" variant="outline" onClick={() => setProgress(Math.min(100, progress + 10))}>+10</Button>
317
+ </div>
318
+ </div>
319
+
320
+ <div className="space-y-2">
321
+ <div className="flex justify-between text-sm">
322
+ <Label>Slider</Label>
323
+ <span className="text-muted-foreground">{sliderValue[0]}</span>
324
+ </div>
325
+ <Slider
326
+ value={sliderValue}
327
+ onValueChange={setSliderValue}
328
+ max={100}
329
+ step={1}
330
+ />
331
+ </div>
332
+ </CardContent>
333
+ </Card>
334
+
335
+ {/* Table Component */}
336
+ <Card className="lg:col-span-2">
337
+ <CardHeader>
338
+ <CardTitle>Table Component</CardTitle>
339
+ <CardDescription>Data display with shadcn table primitives</CardDescription>
340
+ </CardHeader>
341
+ <CardContent>
342
+ <Table>
343
+ <TableCaption>A list of recent test items</TableCaption>
344
+ <TableHeader>
345
+ <TableRow>
346
+ <TableHead className="w-[100px]">ID</TableHead>
347
+ <TableHead>Name</TableHead>
348
+ <TableHead>Status</TableHead>
349
+ <TableHead className="text-right">Actions</TableHead>
350
+ </TableRow>
351
+ </TableHeader>
352
+ <TableBody>
353
+ <TableRow>
354
+ <TableCell className="font-medium">001</TableCell>
355
+ <TableCell>Test Item 1</TableCell>
356
+ <TableCell><Badge variant="default">Active</Badge></TableCell>
357
+ <TableCell className="text-right">
358
+ <Button variant="ghost" size="sm">Edit</Button>
359
+ </TableCell>
360
+ </TableRow>
361
+ <TableRow>
362
+ <TableCell className="font-medium">002</TableCell>
363
+ <TableCell>Test Item 2</TableCell>
364
+ <TableCell><Badge variant="secondary">Pending</Badge></TableCell>
365
+ <TableCell className="text-right">
366
+ <Button variant="ghost" size="sm">Edit</Button>
367
+ </TableCell>
368
+ </TableRow>
369
+ <TableRow>
370
+ <TableCell className="font-medium">003</TableCell>
371
+ <TableCell>Test Item 3</TableCell>
372
+ <TableCell><Badge variant="destructive">Error</Badge></TableCell>
373
+ <TableCell className="text-right">
374
+ <Button variant="ghost" size="sm">Edit</Button>
375
+ </TableCell>
376
+ </TableRow>
377
+ </TableBody>
378
+ </Table>
379
+ </CardContent>
380
+ </Card>
381
+
382
+ {/* Tabs Component */}
383
+ <Card className="lg:col-span-2">
384
+ <CardHeader>
385
+ <CardTitle>Tabs Component</CardTitle>
386
+ <CardDescription>Content organization with tabs</CardDescription>
387
+ </CardHeader>
388
+ <CardContent>
389
+ <Tabs defaultValue="account" className="w-full">
390
+ <TabsList className="grid w-full grid-cols-3">
391
+ <TabsTrigger value="account">Account</TabsTrigger>
392
+ <TabsTrigger value="password">Password</TabsTrigger>
393
+ <TabsTrigger value="settings">Settings</TabsTrigger>
394
+ </TabsList>
395
+ <TabsContent value="account" className="space-y-4">
396
+ <div className="space-y-2">
397
+ <Label htmlFor="username">Username</Label>
398
+ <Input id="username" defaultValue="@johndoe" />
399
+ </div>
400
+ <div className="space-y-2">
401
+ <Label htmlFor="name">Name</Label>
402
+ <Input id="name" defaultValue="John Doe" />
403
+ </div>
404
+ </TabsContent>
405
+ <TabsContent value="password" className="space-y-4">
406
+ <div className="space-y-2">
407
+ <Label htmlFor="current">Current Password</Label>
408
+ <Input id="current" type="password" />
409
+ </div>
410
+ <div className="space-y-2">
411
+ <Label htmlFor="new">New Password</Label>
412
+ <Input id="new" type="password" />
413
+ </div>
414
+ </TabsContent>
415
+ <TabsContent value="settings" className="space-y-4">
416
+ <div className="space-y-4">
417
+ <div className="flex items-center justify-between">
418
+ <div className="space-y-0.5">
419
+ <Label>Email Notifications</Label>
420
+ <p className="text-sm text-muted-foreground">Receive emails about your account</p>
421
+ </div>
422
+ <Switch />
423
+ </div>
424
+ <Separator />
425
+ <div className="flex items-center justify-between">
426
+ <div className="space-y-0.5">
427
+ <Label>Marketing Emails</Label>
428
+ <p className="text-sm text-muted-foreground">Receive marketing emails</p>
429
+ </div>
430
+ <Switch />
431
+ </div>
432
+ </div>
433
+ </TabsContent>
434
+ </Tabs>
435
+ </CardContent>
436
+ </Card>
437
+
438
+ {/* Dialog & Popover */}
439
+ <Card>
440
+ <CardHeader>
441
+ <CardTitle>Dialog & Popover</CardTitle>
442
+ <CardDescription>Modal dialogs and floating content</CardDescription>
443
+ </CardHeader>
444
+ <CardContent className="space-y-4">
445
+ <Dialog>
446
+ <DialogTrigger asChild>
447
+ <Button variant="outline">Open Dialog</Button>
448
+ </DialogTrigger>
449
+ <DialogContent>
450
+ <DialogHeader>
451
+ <DialogTitle>Test Dialog</DialogTitle>
452
+ <DialogDescription>
453
+ This is a modal dialog using shadcn Dialog component.
454
+ </DialogDescription>
455
+ </DialogHeader>
456
+ <div className="space-y-4 py-4">
457
+ <p className="text-sm text-muted-foreground">
458
+ Dialogs are great for confirmations, forms, and alerts.
459
+ </p>
460
+ </div>
461
+ </DialogContent>
462
+ </Dialog>
463
+
464
+ <Button variant="outline" onClick={() => setDate(new Date())}>
465
+ <CalendarIcon className="mr-2 h-4 w-4" />
466
+ {formatDate(date)}
467
+ </Button>
468
+ </CardContent>
469
+ </Card>
470
+
471
+ {/* Accordion */}
472
+ <Card>
473
+ <CardHeader>
474
+ <CardTitle>Accordion</CardTitle>
475
+ <CardDescription>Collapsible content sections</CardDescription>
476
+ </CardHeader>
477
+ <CardContent>
478
+ <Accordion type="single" collapsible className="w-full">
479
+ <AccordionItem value="item-1">
480
+ <AccordionTrigger>Is it accessible?</AccordionTrigger>
481
+ <AccordionContent>
482
+ Yes. It adheres to the WAI-ARIA design pattern.
483
+ </AccordionContent>
484
+ </AccordionItem>
485
+ <AccordionItem value="item-2">
486
+ <AccordionTrigger>Is it styled?</AccordionTrigger>
487
+ <AccordionContent>
488
+ Yes. It comes with default styles that match the other components.
489
+ </AccordionContent>
490
+ </AccordionItem>
491
+ <AccordionItem value="item-3">
492
+ <AccordionTrigger>Is it animated?</AccordionTrigger>
493
+ <AccordionContent>
494
+ Yes. It has smooth animations powered by Radix UI.
495
+ </AccordionContent>
496
+ </AccordionItem>
497
+ </Accordion>
498
+ </CardContent>
499
+ </Card>
500
+
501
+ {/* Avatar & Skeleton */}
502
+ <Card className="lg:col-span-2">
503
+ <CardHeader>
504
+ <CardTitle>Avatars & Skeletons</CardTitle>
505
+ <CardDescription>User representations and loading states</CardDescription>
506
+ </CardHeader>
507
+ <CardContent>
508
+ <div className="flex items-center gap-6">
509
+ <div className="flex items-center gap-4">
510
+ <Avatar>
511
+ <AvatarImage src="https://github.com/shadcn.png" alt="@shadcn" />
512
+ <AvatarFallback>CN</AvatarFallback>
513
+ </Avatar>
514
+ <div className="space-y-1">
515
+ <p className="text-sm font-medium leading-none">@shadcn</p>
516
+ <p className="text-sm text-muted-foreground">shadcn@example.com</p>
517
+ </div>
518
+ </div>
519
+
520
+ <Separator orientation="vertical" className="h-12" />
521
+
522
+ <div className="flex items-center gap-4">
523
+ <div className="space-y-2">
524
+ <Skeleton className="h-4 w-[250px]" />
525
+ <Skeleton className="h-4 w-[200px]" />
526
+ </div>
527
+ </div>
528
+ </div>
529
+ </CardContent>
530
+ </Card>
531
+
532
+ {/* Radio Group */}
533
+ <Card>
534
+ <CardHeader>
535
+ <CardTitle>Radio Group</CardTitle>
536
+ <CardDescription>Single selection from multiple options</CardDescription>
537
+ </CardHeader>
538
+ <CardContent>
539
+ <RadioGroup defaultValue="comfortable" className="grid gap-4">
540
+ <div className="flex items-center space-x-2">
541
+ <RadioGroupItem value="default" id="r1" />
542
+ <Label htmlFor="r1">Default</Label>
543
+ </div>
544
+ <div className="flex items-center space-x-2">
545
+ <RadioGroupItem value="comfortable" id="r2" />
546
+ <Label htmlFor="r2">Comfortable</Label>
547
+ </div>
548
+ <div className="flex items-center space-x-2">
549
+ <RadioGroupItem value="compact" id="r3" />
550
+ <Label htmlFor="r3">Compact</Label>
551
+ </div>
552
+ </RadioGroup>
553
+ </CardContent>
554
+ </Card>
555
+
556
+ {/* Scroll Area */}
557
+ <Card>
558
+ <CardHeader>
559
+ <CardTitle>Scroll Area</CardTitle>
560
+ <CardDescription>Custom scrollable container</CardDescription>
561
+ </CardHeader>
562
+ <CardContent>
563
+ <ScrollArea className="h-48 w-full rounded-md border p-4">
564
+ <div className="space-y-4">
565
+ <p className="text-sm">This is a scrollable area with custom styling.</p>
566
+ <p className="text-sm">It can contain any content and will show a custom scrollbar.</p>
567
+ <p className="text-sm">More content...</p>
568
+ <p className="text-sm">Even more content...</p>
569
+ <p className="text-sm">And even more...</p>
570
+ <p className="text-sm">Keep scrolling...</p>
571
+ <p className="text-sm">Almost there...</p>
572
+ <p className="text-sm">You reached the end!</p>
573
+ </div>
574
+ </ScrollArea>
575
+ </CardContent>
576
+ </Card>
577
+ </div>
578
+
579
+ {/* Footer */}
580
+ <Separator />
581
+ <div className="flex items-center justify-between text-sm text-muted-foreground">
582
+ <p>shadcn/ui Test Page • b1a0RuGWG Preset</p>
583
+ <p>54 components installed</p>
584
+ </div>
585
+ </div>
586
+ </TooltipProvider>
587
+ )
588
+ }