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