spine-framework 0.4.3 → 0.5.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +13 -3
- package/.framework/cli/commands/bootstrap.ts +392 -0
- package/.framework/cli/commands/dev.ts +91 -218
- package/.framework/cli/commands/doctor.ts +132 -26
- package/.framework/cli/commands/generate.ts +38 -298
- package/.framework/cli/commands/init.ts +20 -1
- package/.framework/cli/commands/migrate.ts +36 -30
- package/.framework/cli/commands/migrations.ts +16 -56
- package/.framework/cli/commands/upgrade.ts +35 -0
- package/.framework/cli/commands/validate-schema.ts +147 -0
- package/.framework/cli/context.ts +223 -110
- package/.framework/cli/index.ts +6 -0
- package/.framework/cli/lib/project-files.ts +241 -1
- package/.framework/functions/_shared/agent-runner.ts +1000 -81
- package/.framework/functions/_shared/cil.ts +2 -1
- package/.framework/functions/_shared/db.ts +3 -6
- package/.framework/functions/_shared/hash-api-key.ts +183 -79
- package/.framework/functions/_shared/kb.ts +61 -7
- package/.framework/functions/_shared/logging.ts +562 -224
- package/.framework/functions/_shared/message-sequence.ts +53 -0
- package/.framework/functions/_shared/middleware.ts +47 -44
- package/.framework/functions/_shared/pipeline-runner.ts +150 -37
- package/.framework/functions/_shared/principal.ts +9 -6
- package/.framework/functions/_shared/trigger-engine.ts +149 -40
- package/.framework/functions/admin-data.ts +48 -31
- package/.framework/functions/ai-agents.ts +103 -33
- package/.framework/functions/api-keys.ts +301 -122
- package/.framework/functions/apps.ts +43 -26
- package/.framework/functions/cil-ingest.ts +48 -15
- package/.framework/functions/debug-auth.ts +14 -8
- package/.framework/functions/deliveries.ts +39 -12
- package/.framework/functions/embeddings.ts +145 -76
- package/.framework/functions/integration-outbound.ts +67 -27
- package/.framework/functions/integrations.ts +254 -127
- package/.framework/functions/logs.ts +273 -133
- package/.framework/functions/observability.ts +277 -147
- package/.framework/functions/pipeline-executions.ts +1 -1
- package/.framework/functions/pipeline-runner-background.ts +120 -0
- package/.framework/functions/pipelines.ts +14 -9
- package/.framework/functions/prompt-configs.ts +7 -4
- package/.framework/functions/roles.ts +8 -5
- package/.framework/functions/security.ts +30 -17
- package/.framework/functions/system-cron.ts +250 -128
- package/.framework/functions/tests.ts +7 -6
- package/.framework/functions/timers.ts +310 -107
- package/.framework/functions/trigger-scheduler.ts +65 -5
- package/.framework/functions/triggers.ts +28 -13
- package/.framework/functions/types.ts +13 -10
- package/.framework/migrations/064_episode_leases.sql +196 -0
- package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
- package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
- package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
- package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
- package/.framework/migrations/069_log_stats_window.sql +54 -0
- package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
- package/.framework/migrations/071_timer_interval_keys.sql +96 -0
- package/.framework/migrations/072_slug_autofill.sql +77 -0
- package/.framework/migrations/073_seed_member_roles.sql +26 -0
- package/.framework/schemas/spine.config.schema.json +62 -0
- package/.framework/src/App.tsx +3 -1
- package/.framework/src/apps/admin/index.tsx +1141 -775
- package/.framework/src/components/ErrorBoundary.tsx +136 -0
- package/.framework/src/components/admin/AdminListPage.tsx +81 -73
- package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
- package/.framework/src/components/admin/EntitySelect.tsx +181 -0
- package/.framework/src/components/admin/PageInstructions.tsx +86 -127
- package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
- package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
- package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
- package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
- package/.framework/src/components/layout/Layout.tsx +4 -2
- package/.framework/src/components/layout/Sidebar.tsx +304 -179
- package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
- package/.framework/src/components/runtime/DataHeader.tsx +96 -48
- package/.framework/src/components/runtime/DataListPage.tsx +3 -26
- package/.framework/src/components/runtime/DataStats.tsx +10 -10
- package/.framework/src/components/runtime/DataTable.tsx +12 -10
- package/.framework/src/components/ui/sheet.tsx +24 -26
- package/.framework/src/components/ui/textarea.tsx +74 -48
- package/.framework/src/hooks/useBranding.ts +47 -0
- package/.framework/src/hooks/useEntityList.ts +12 -9
- package/.framework/src/hooks/useListSchema.ts +108 -58
- package/.framework/src/instructions/README.md +57 -0
- package/.framework/src/instructions/ai-agents.md +69 -0
- package/.framework/src/instructions/alerts.md +80 -0
- package/.framework/src/instructions/api-keys.md +87 -0
- package/.framework/src/instructions/apps.md +77 -0
- package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
- package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
- package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
- package/.framework/src/instructions/concepts/automation.md +186 -0
- package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
- package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
- package/.framework/src/instructions/concepts/design-schema.md +152 -0
- package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
- package/.framework/src/instructions/concepts/observability.md +116 -0
- package/.framework/src/instructions/concepts/permissions.md +150 -0
- package/.framework/src/instructions/concepts/runtime-records.md +111 -0
- package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
- package/.framework/src/instructions/concepts/spine-way.md +172 -0
- package/.framework/src/instructions/deliveries.md +59 -0
- package/.framework/src/instructions/guide/00-orientation.md +106 -0
- package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
- package/.framework/src/instructions/guide/02-project-map.md +147 -0
- package/.framework/src/instructions/guide/03-domain-model.md +223 -0
- package/.framework/src/instructions/guide/04-first-app.md +227 -0
- package/.framework/src/instructions/guide/05-glossary.md +183 -0
- package/.framework/src/instructions/integrations.md +96 -0
- package/.framework/src/instructions/internal/cil-markers.md +83 -0
- package/.framework/src/instructions/invites.md +60 -0
- package/.framework/src/instructions/kb.md +80 -0
- package/.framework/src/instructions/logs.md +77 -0
- package/.framework/src/instructions/observability.md +61 -0
- package/.framework/src/instructions/operations/deployment.md +115 -0
- package/.framework/src/instructions/operations/migrations.md +125 -0
- package/.framework/src/instructions/operations/security-checklist.md +148 -0
- package/.framework/src/instructions/operations/troubleshooting.md +170 -0
- package/.framework/src/instructions/operations/upgrade.md +116 -0
- package/.framework/src/instructions/pipeline-executions.md +62 -0
- package/.framework/src/instructions/pipelines.md +78 -0
- package/.framework/src/instructions/prompts.md +95 -0
- package/.framework/src/instructions/reference/api/admin-data.md +162 -0
- package/.framework/src/instructions/reference/api/auth.md +113 -0
- package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
- package/.framework/src/instructions/reference/app-manifest.md +150 -0
- package/.framework/src/instructions/reference/cli.md +124 -0
- package/.framework/src/instructions/reference/database.md +132 -0
- package/.framework/src/instructions/reference/design-schema.md +280 -0
- package/.framework/src/instructions/reference/env-vars.md +133 -0
- package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
- package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
- package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
- package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
- package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
- package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
- package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
- package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
- package/.framework/src/instructions/reference/functions/apps.md +140 -0
- package/.framework/src/instructions/reference/functions/auth.md +99 -0
- package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
- package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
- package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
- package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
- package/.framework/src/instructions/reference/functions/index.md +103 -0
- package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
- package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
- package/.framework/src/instructions/reference/functions/integrations.md +130 -0
- package/.framework/src/instructions/reference/functions/invites.md +182 -0
- package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
- package/.framework/src/instructions/reference/functions/kb.md +166 -0
- package/.framework/src/instructions/reference/functions/logs.md +141 -0
- package/.framework/src/instructions/reference/functions/observability.md +105 -0
- package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
- package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
- package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
- package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
- package/.framework/src/instructions/reference/functions/roles.md +121 -0
- package/.framework/src/instructions/reference/functions/security.md +140 -0
- package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
- package/.framework/src/instructions/reference/functions/system.md +106 -0
- package/.framework/src/instructions/reference/functions/tests.md +97 -0
- package/.framework/src/instructions/reference/functions/timers.md +117 -0
- package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
- package/.framework/src/instructions/reference/functions/triggers.md +140 -0
- package/.framework/src/instructions/reference/functions/types.md +146 -0
- package/.framework/src/instructions/reference/seeds.md +126 -0
- package/.framework/src/instructions/reference/shared-modules.md +127 -0
- package/.framework/src/instructions/reference/spine-config.md +114 -0
- package/.framework/src/instructions/roles.md +80 -0
- package/.framework/src/instructions/runtime-detail.md +70 -0
- package/.framework/src/instructions/runtime-list.md +77 -0
- package/.framework/src/instructions/security.md +67 -0
- package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
- package/.framework/src/instructions/tasks/add-a-role.md +96 -0
- package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
- package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
- package/.framework/src/instructions/tasks/add-a-type.md +151 -0
- package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
- package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
- package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
- package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
- package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
- package/.framework/src/instructions/tasks/test-your-code.md +108 -0
- package/.framework/src/instructions/tasks/write-a-function.md +132 -0
- package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
- package/.framework/src/instructions/testing.md +59 -0
- package/.framework/src/instructions/timers.md +82 -0
- package/.framework/src/instructions/triggers.md +69 -0
- package/.framework/src/instructions/types.md +93 -0
- package/.framework/src/lib/branding.ts +128 -0
- package/.framework/src/pages/NoAppPage.tsx +3 -1
- package/.framework/src/pages/NotFoundPage.tsx +62 -31
- package/.framework/src/pages/SetupPage.tsx +5 -2
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
- package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
- package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
- package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
- package/.framework/src/pages/admin/AppsPage.tsx +104 -66
- package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
- package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
- package/.framework/src/pages/admin/LogsPage.tsx +144 -76
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
- package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
- package/.framework/src/pages/admin/RolesPage.tsx +86 -43
- package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
- package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
- package/.framework/src/pages/admin/TimersPage.tsx +90 -62
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
- package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
- package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
- package/.framework/src/pages/admin/TypesPage.tsx +90 -48
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
- package/.framework/src/pages/auth/LoginPage.tsx +4 -2
- package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
- package/.framework/templates/agent/AGENTS.md +150 -0
- package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
- package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
- package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
- package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
- package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
- package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
- package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
- package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
- package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
- package/.framework/templates/project.json +5 -1
- package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
- package/.framework/tests/unit/agent-files.test.ts +355 -0
- package/.framework/tests/unit/agent-runner.test.ts +496 -47
- package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
- package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
- package/.framework/tests/unit/bootstrap.test.ts +242 -0
- package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
- package/.framework/tests/unit/debug-auth.test.ts +38 -0
- package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
- package/.framework/tests/unit/episode-lease.test.ts +695 -0
- package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
- package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
- package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
- package/.framework/tests/unit/logging-app-id.test.ts +75 -0
- package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
- package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
- package/.framework/tests/unit/principal-cache.test.ts +15 -0
- package/.framework/tests/unit/system-context-denial.test.ts +145 -0
- package/.framework/tests/unit/system-cron.test.ts +240 -0
- package/.framework/tests/unit/timers.test.ts +159 -0
- package/.framework/tests/unit/trigger-engine.test.ts +278 -91
- package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
- package/README.md +125 -166
- package/config/tsconfig.cli.json +2 -2
- package/netlify.toml +5 -0
- package/package.json +15 -4
- package/templates/project/package-lock.json +2 -2
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/mcp/index.ts +0 -133
- package/.framework/mcp/load-env.ts +0 -60
- package/.framework/mcp/shared/app-manifest.ts +0 -275
- package/.framework/mcp/shared/db.ts +0 -477
- package/.framework/mcp/shared/kb.ts +0 -118
- package/.framework/mcp/tools/architect.ts +0 -431
- package/.framework/mcp/tools/cil/context.ts +0 -345
- package/.framework/mcp/tools/cil/graph.ts +0 -242
- package/.framework/mcp/tools/cil/ingest.ts +0 -1217
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
- package/.framework/mcp/tools/cil/pipeline.ts +0 -767
- package/.framework/mcp/tools/cil/project.ts +0 -791
- package/.framework/mcp/tools/cil/retrieval.ts +0 -336
- package/.framework/mcp/tools/cil/search-core.ts +0 -454
- package/.framework/mcp/tools/cil/search.ts +0 -97
- package/.framework/mcp/tools/cil/suggest.ts +0 -186
- package/.framework/mcp/tools/cil/validate.ts +0 -1369
- package/.framework/mcp/tools/kb/delete.ts +0 -139
- package/.framework/mcp/tools/kb/index.ts +0 -52
- package/.framework/mcp/tools/kb/ingest.ts +0 -84
- package/.framework/mcp/tools/kb/list-types.ts +0 -102
- package/.framework/mcp/tools/kb/publish.ts +0 -100
- package/.framework/mcp/tools/kb/reindex.ts +0 -86
- package/.framework/mcp/tools/kb/revoke.ts +0 -85
- package/.framework/mcp/tools/kb/search.ts +0 -101
- package/.framework/mcp/tools/kb/upsert.ts +0 -125
- package/.framework/mcp/tools/observability.ts +0 -510
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
-- 072_slug_autofill.sql
|
|
2
|
+
-- Fill slug from name on insert when the caller omits it.
|
|
3
|
+
-- Fresh-install schema (001) declares slug NOT NULL on these tables, but the
|
|
4
|
+
-- create handlers for triggers/timers/pipelines/ai_agents/test_runs/
|
|
5
|
+
-- item_progress/invites never write slug — inserts fail on fresh chains.
|
|
6
|
+
-- The trigger is a no-op whenever the caller supplies a slug.
|
|
7
|
+
|
|
8
|
+
CREATE OR REPLACE FUNCTION public.spine_fill_slug()
|
|
9
|
+
RETURNS trigger
|
|
10
|
+
LANGUAGE plpgsql
|
|
11
|
+
AS $$
|
|
12
|
+
DECLARE
|
|
13
|
+
base text;
|
|
14
|
+
candidate text;
|
|
15
|
+
clash boolean;
|
|
16
|
+
i int := 2;
|
|
17
|
+
BEGIN
|
|
18
|
+
IF NEW.slug IS NOT NULL AND NEW.slug <> '' THEN
|
|
19
|
+
RETURN NEW;
|
|
20
|
+
END IF;
|
|
21
|
+
|
|
22
|
+
base := trim(both '_' from regexp_replace(lower(coalesce(NEW.name, '')), '[^a-z0-9]+', '_', 'g'));
|
|
23
|
+
IF base = '' THEN
|
|
24
|
+
base := 'row';
|
|
25
|
+
END IF;
|
|
26
|
+
candidate := base;
|
|
27
|
+
|
|
28
|
+
LOOP
|
|
29
|
+
EXECUTE format(
|
|
30
|
+
'SELECT EXISTS (SELECT 1 FROM %I.%I WHERE app_id IS NOT DISTINCT FROM $1 AND slug = $2)',
|
|
31
|
+
TG_TABLE_SCHEMA, TG_TABLE_NAME
|
|
32
|
+
) INTO clash USING NEW.app_id, candidate;
|
|
33
|
+
EXIT WHEN NOT clash;
|
|
34
|
+
candidate := base || '_' || i;
|
|
35
|
+
i := i + 1;
|
|
36
|
+
IF i > 100 THEN
|
|
37
|
+
candidate := base || '_' || substr(replace(gen_random_uuid()::text, '-', ''), 1, 6);
|
|
38
|
+
EXECUTE format(
|
|
39
|
+
'SELECT EXISTS (SELECT 1 FROM %I.%I WHERE app_id IS NOT DISTINCT FROM $1 AND slug = $2)',
|
|
40
|
+
TG_TABLE_SCHEMA, TG_TABLE_NAME
|
|
41
|
+
) INTO clash USING NEW.app_id, candidate;
|
|
42
|
+
EXIT WHEN NOT clash;
|
|
43
|
+
END IF;
|
|
44
|
+
END LOOP;
|
|
45
|
+
|
|
46
|
+
NEW.slug := candidate;
|
|
47
|
+
RETURN NEW;
|
|
48
|
+
END;
|
|
49
|
+
$$;
|
|
50
|
+
|
|
51
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.triggers;
|
|
52
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.triggers
|
|
53
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
54
|
+
|
|
55
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.timers;
|
|
56
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.timers
|
|
57
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
58
|
+
|
|
59
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.pipelines;
|
|
60
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.pipelines
|
|
61
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
62
|
+
|
|
63
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.ai_agents;
|
|
64
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.ai_agents
|
|
65
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
66
|
+
|
|
67
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.test_runs;
|
|
68
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.test_runs
|
|
69
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
70
|
+
|
|
71
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.item_progress;
|
|
72
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.item_progress
|
|
73
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
74
|
+
|
|
75
|
+
DROP TRIGGER IF EXISTS spine_fill_slug_trg ON public.invites;
|
|
76
|
+
CREATE TRIGGER spine_fill_slug_trg BEFORE INSERT ON public.invites
|
|
77
|
+
FOR EACH ROW EXECUTE FUNCTION public.spine_fill_slug();
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
-- 073_seed_member_roles.sql
|
|
2
|
+
-- Seed the member and member_admin end-user roles.
|
|
3
|
+
--
|
|
4
|
+
-- F-066: 003_core_system_data.sql seeds system_admin plus the department
|
|
5
|
+
-- roles but never member/member_admin, even though the platform assumes
|
|
6
|
+
-- they exist:
|
|
7
|
+
-- * 003's own thread/message types grant record_permissions to both
|
|
8
|
+
-- * 060 grants them CRU on account/person; 051/007 grant member reads
|
|
9
|
+
-- * the registration RPCs (052/059) default join_request to 'member'
|
|
10
|
+
-- * RegisterPage falls back to 'member'; the admin UI defaults app
|
|
11
|
+
-- min_role to 'member'; create-app defaults --role member
|
|
12
|
+
-- With no roles row the slug never resolves, so every member grant was a
|
|
13
|
+
-- dead key (guaranteed-deny) and apps scaffolded with the default --role
|
|
14
|
+
-- wrote a min_role no person could satisfy.
|
|
15
|
+
--
|
|
16
|
+
-- is_system stays false: invites.ts resolveRoleId and the invite-accept
|
|
17
|
+
-- path reject is_system role slugs, and these are the self-service
|
|
18
|
+
-- end-user roles (same shape the app seed/roles.json files carry).
|
|
19
|
+
-- App installs upsert the same slugs (conflict 'slug'), so ON CONFLICT
|
|
20
|
+
-- DO NOTHING keeps this a no-op wherever an app already claimed them.
|
|
21
|
+
|
|
22
|
+
INSERT INTO public.roles (id, slug, name, description, permissions, is_system, is_active, is_protected, app_id, account_id)
|
|
23
|
+
VALUES
|
|
24
|
+
(gen_random_uuid(), 'member', 'Member', 'Standard account member — end-user access to account-scoped apps', '["*"]'::jsonb, false, true, false, NULL, NULL),
|
|
25
|
+
(gen_random_uuid(), 'member_admin', 'Member Admin', 'Member administrator — same access as member plus invite and member management', '["*"]'::jsonb, false, true, false, NULL, NULL)
|
|
26
|
+
ON CONFLICT (slug) DO NOTHING;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://spine-framework.dev/schemas/spine.config.schema.json",
|
|
4
|
+
"title": "Spine Framework instance config",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": true,
|
|
7
|
+
"properties": {
|
|
8
|
+
"branding": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"additionalProperties": false,
|
|
11
|
+
"description": "Instance branding applied to framework-owned pages (login, register, setup, sidebars) plus document.title and favicon. All keys optional; absent block falls back to Spine defaults.",
|
|
12
|
+
"properties": {
|
|
13
|
+
"app_name": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"description": "Display name used in headings and logo alt text, e.g. 'Answer Once'"
|
|
16
|
+
},
|
|
17
|
+
"title": {
|
|
18
|
+
"type": "string",
|
|
19
|
+
"description": "document.title and sidebar wordmark; defaults to app_name"
|
|
20
|
+
},
|
|
21
|
+
"logo_url": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"description": "Public asset path for the brand logo, e.g. '/answer-once-logo.svg'"
|
|
24
|
+
},
|
|
25
|
+
"favicon_url": {
|
|
26
|
+
"type": "string",
|
|
27
|
+
"description": "Public asset path swapped into link[rel=icon] at runtime"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"registration": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"additionalProperties": true,
|
|
34
|
+
"properties": {
|
|
35
|
+
"default_app": { "type": "string" },
|
|
36
|
+
"default_role": { "type": "string" },
|
|
37
|
+
"allow_url_override": { "type": "boolean" },
|
|
38
|
+
"default_app_by_role": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"additionalProperties": { "type": "string" }
|
|
41
|
+
},
|
|
42
|
+
"apps": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"additionalProperties": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"additionalProperties": true,
|
|
47
|
+
"properties": {
|
|
48
|
+
"roles": { "type": "array", "items": { "type": "string" } },
|
|
49
|
+
"default_role": { "type": "string" },
|
|
50
|
+
"path": { "type": "string" },
|
|
51
|
+
"enabled": { "type": "boolean" },
|
|
52
|
+
"account_strategy": { "type": "string", "enum": ["new", "existing"] },
|
|
53
|
+
"parent_account": { "type": "string" },
|
|
54
|
+
"target_account": { "type": "string" },
|
|
55
|
+
"allow_domain_join": { "type": "boolean" }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
package/.framework/src/App.tsx
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { Suspense, lazy, useEffect } from 'react'
|
|
15
15
|
import { Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom'
|
|
16
16
|
import { useAuth } from './contexts/AuthContext'
|
|
17
|
+
import { useBranding } from './hooks/useBranding'
|
|
17
18
|
import { LoadingSpinner } from './components/ui/LoadingSpinner'
|
|
18
19
|
import { LoginPage } from './pages/auth/LoginPage'
|
|
19
20
|
import { RegisterPage } from './pages/auth/RegisterPage'
|
|
@@ -65,13 +66,14 @@ const AdminApp = lazy(() => import('./apps/admin/index'))
|
|
|
65
66
|
// CIL[DOC-NOTE type="change" content="Batch4b: authenticated-but-unplaced users (falsy account_id, not pending) are routed to /register?resume=1 for all paths so RegisterPage can finish placement — they no longer fall through to NotFound"]
|
|
66
67
|
function App() {
|
|
67
68
|
const { user, isLoading } = useAuth()
|
|
69
|
+
const branding = useBranding()
|
|
68
70
|
|
|
69
71
|
if (isLoading) {
|
|
70
72
|
return (
|
|
71
73
|
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
72
74
|
<div className="text-center">
|
|
73
75
|
<LoadingSpinner className="w-8 h-8 mx-auto mb-4" />
|
|
74
|
-
<p className="text-slate-600">Loading
|
|
76
|
+
<p className="text-slate-600">Loading {branding.app_name}...</p>
|
|
75
77
|
</div>
|
|
76
78
|
</div>
|
|
77
79
|
)
|