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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/app-mount.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/lib/app-mount.ts"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Resolve an app's effective route_prefix for the current hostname — host-keyed mount overrides"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Decide whether an app is routable on this host and at which prefix, honoring prod_domain/preview_domain gating and prod_route_prefix/preview_route_prefix mount overrides"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="framework-api" layer="lib" related_files=".framework/src/hooks/useApps.ts,.framework/src/contexts/AppContext.tsx,.framework/migrations/074_app_route_prefix_domains.sql"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="app domain/prefix fields + optional hostname/environment overrides" outputs="{routable, route_prefix}" errors="none" side_effects="reads import.meta.env.VITE_ENVIRONMENT and window.location.hostname unless overridden"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Environment selects the domain/override pair (preview vs prod); host match + override set → override mount; host match without override → default mount; no match with override → still routable at default mount; no match without override → filtered (legacy domain-lock)" notable_decisions="a route_prefix override converts the domain column from a hard visibility filter into a mount selector, preserving legacy prod_domain filter semantics for rows that set no override"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.9" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="framework developers"]
|
|
10
|
+
|
|
11
|
+
import { apiFetch } from './api'
|
|
12
|
+
|
|
13
|
+
export interface AppMountFields {
|
|
14
|
+
route_prefix: string | null
|
|
15
|
+
preview_domain?: string | null
|
|
16
|
+
prod_domain?: string | null
|
|
17
|
+
preview_route_prefix?: string | null
|
|
18
|
+
prod_route_prefix?: string | null
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface AppMountResolution {
|
|
22
|
+
routable: boolean
|
|
23
|
+
route_prefix: string | null
|
|
24
|
+
}
|
|
25
|
+
// CIL[END stable_id="~/.framework/src/lib/app-mount.ts:module_header:module_header"]
|
|
26
|
+
|
|
27
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/app-mount.ts:resolveappmount:function" type="function" identity="resolveAppMount" parent="~/.framework/src/lib/app-mount.ts"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Compute the effective route_prefix and routability for an app on the current host"]
|
|
29
|
+
// CIL[DOC-CONTRACT inputs="app: AppMountFields, opts: {hostname?, environment?} (injectable for tests)" outputs="AppMountResolution" errors="malformed domain treated as non-matching" side_effects="none — pure"]
|
|
30
|
+
// CIL[DOC-MICRO logic_summary="Picks preview_* fields when environment==='preview' else prod_*; null domain → default mount; matching host → override ?? route_prefix; non-matching host → routable at route_prefix when an override exists, unroutable when it does not" notable_decisions="opts injection keeps the function testable in the node vitest environment (no jsdom)"]
|
|
31
|
+
export function resolveAppMount(
|
|
32
|
+
app: AppMountFields,
|
|
33
|
+
opts: { hostname?: string; environment?: string } = {},
|
|
34
|
+
): AppMountResolution {
|
|
35
|
+
const environment =
|
|
36
|
+
opts.environment ?? ((import.meta.env?.VITE_ENVIRONMENT as string) || 'prod')
|
|
37
|
+
const hostname =
|
|
38
|
+
opts.hostname ??
|
|
39
|
+
(typeof window !== 'undefined' ? window.location.hostname : '')
|
|
40
|
+
|
|
41
|
+
const isPreview = environment === 'preview'
|
|
42
|
+
const domain = isPreview ? app.preview_domain : app.prod_domain
|
|
43
|
+
const override = isPreview ? app.preview_route_prefix : app.prod_route_prefix
|
|
44
|
+
|
|
45
|
+
if (!domain) {
|
|
46
|
+
return { routable: true, route_prefix: app.route_prefix }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
let domainHost = domain
|
|
50
|
+
try {
|
|
51
|
+
domainHost = domain.includes('://') ? new URL(domain).hostname : domain.split(':')[0]
|
|
52
|
+
} catch {
|
|
53
|
+
// Malformed domain config — treat as non-matching rather than crash routing.
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (hostname === domainHost) {
|
|
57
|
+
return { routable: true, route_prefix: override ?? app.route_prefix }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return override != null
|
|
61
|
+
? { routable: true, route_prefix: app.route_prefix }
|
|
62
|
+
: { routable: false, route_prefix: app.route_prefix }
|
|
63
|
+
}
|
|
64
|
+
// CIL[END stable_id="~/.framework/src/lib/app-mount.ts:resolveappmount:function"]
|
|
65
|
+
|
|
66
|
+
// CIL[BEGIN stable_id="~/.framework/src/lib/app-mount.ts:resolvepostauthpath:function" type="function" identity="resolvePostAuthPath" parent="~/.framework/src/lib/app-mount.ts"]
|
|
67
|
+
// CIL[DOC-MACRO purpose="Resolve where to land a user after login/registration — the target app's effective mount, not the static config path"]
|
|
68
|
+
// CIL[DOC-CONTRACT inputs="preferredAppSlug (app chosen by config policy), fallback path" outputs="effective route_prefix to navigate to" errors="fetch/parse failures return fallback" side_effects="authenticated GET /api/apps?action=list"]
|
|
69
|
+
// CIL[DOC-MICRO logic_summary="Fetches the apps list, resolves each record's effective mount via resolveAppMount, returns the preferred app's prefix when routable else the first routable app's prefix else the fallback" notable_decisions="spine.config.json apps.<slug>.path and default_app_by_role are per-repo hints that are wrong for single-app prod sites — the DB row's resolved mount is authoritative"]
|
|
70
|
+
export async function resolvePostAuthPath(
|
|
71
|
+
preferredAppSlug?: string | null,
|
|
72
|
+
fallback: string = '/',
|
|
73
|
+
): Promise<string> {
|
|
74
|
+
try {
|
|
75
|
+
const res = await apiFetch('/api/apps?action=list')
|
|
76
|
+
if (!res.ok) return fallback
|
|
77
|
+
const data = await res.json()
|
|
78
|
+
const list: (AppMountFields & { slug: string; renderer?: string })[] = data.data || data || []
|
|
79
|
+
const resolved = list
|
|
80
|
+
.map(a => ({ a, m: resolveAppMount(a) }))
|
|
81
|
+
.filter(r => r.m.routable && r.a.renderer !== 'none' && r.m.route_prefix != null)
|
|
82
|
+
const chosen = resolved.find(r => r.a.slug === preferredAppSlug) ?? resolved[0]
|
|
83
|
+
return chosen?.m.route_prefix ?? fallback
|
|
84
|
+
} catch {
|
|
85
|
+
return fallback
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// CIL[END stable_id="~/.framework/src/lib/app-mount.ts:resolvepostauthpath:function"]
|
|
@@ -1,35 +1,65 @@
|
|
|
1
1
|
// CIL[BEGIN stable_id="~/.framework/src/pages/NotFoundPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/NotFoundPage.tsx"]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @module NotFoundPage
|
|
4
|
+
* @audience both
|
|
5
|
+
* @layer shared-core
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module renders a Not Found page for the application, providing users with a friendly message when they navigate to an undefined route. It serves as a fallback UI component, enhancing user experience by guiding them back to the home page. INVARIANT: The Not Found page should always be accessible for any invalid routes.
|
|
9
|
+
*
|
|
10
|
+
* @seeAlso react-router-dom (provides routing capabilities).
|
|
11
|
+
* @seeAlso lucide-react (used for icons).
|
|
12
|
+
*
|
|
13
|
+
* @cil-generated
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
10
25
|
|
|
11
26
|
|
|
12
27
|
|
|
13
28
|
import React from 'react'
|
|
14
29
|
import { Link } from 'react-router-dom'
|
|
15
30
|
import { Home } from 'lucide-react';
|
|
16
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Import dependencies used by the NotFoundPage 404 component'; No verified external callers; imports: none"]
|
|
17
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
18
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
19
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
20
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
21
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
22
31
|
// CIL[END stable_id="~/.framework/src/pages/NotFoundPage.tsx:module_header:module_header"]
|
|
23
32
|
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
24
51
|
// CIL[BEGIN stable_id="~/.framework/src/pages/NotFoundPage.tsx:NotFoundPage:component" type="component" identity="NotFoundPage" parent="~/.framework/src/pages/NotFoundPage.tsx"]
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
52
|
+
/**
|
|
53
|
+
* The NotFoundPage component displays a 404 error message when a page is not found, providing a user-friendly interface to guide users back to the home page.
|
|
54
|
+
*
|
|
55
|
+
* @macro React functional component responsible for rendering a 404 error page.
|
|
56
|
+
* @micro Utilizes JSX to structure the layout and styling of the error message and navigation link.
|
|
57
|
+
* @outputSpec JSX.Element
|
|
58
|
+
* @sideEffects none
|
|
59
|
+
* @stability internal
|
|
60
|
+
* @calls Link
|
|
61
|
+
* @cil-generated
|
|
62
|
+
*/
|
|
33
63
|
export function NotFoundPage() {
|
|
34
64
|
return (
|
|
35
65
|
<div className="min-h-screen bg-slate-50 flex flex-col justify-center py-12 sm:px-6 lg:px-8">
|
|
@@ -43,11 +73,11 @@ export function NotFoundPage() {
|
|
|
43
73
|
|
|
44
74
|
<div className="mt-6">
|
|
45
75
|
<Link
|
|
46
|
-
to="/
|
|
76
|
+
to="/"
|
|
47
77
|
className="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
|
|
48
78
|
>
|
|
49
79
|
<Home className="w-4 h-4 mr-2" />
|
|
50
|
-
Go
|
|
80
|
+
Go home
|
|
51
81
|
</Link>
|
|
52
82
|
</div>
|
|
53
83
|
</div>
|
|
@@ -55,10 +85,11 @@ export function NotFoundPage() {
|
|
|
55
85
|
</div>
|
|
56
86
|
)
|
|
57
87
|
}
|
|
58
|
-
// CIL[
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
88
|
+
// CIL[END stable_id="~/.framework/src/pages/NotFoundPage.tsx:NotFoundPage:component"]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
@@ -1,12 +1,28 @@
|
|
|
1
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent=""]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
2
|
+
/**
|
|
3
|
+
* @module AIAgentDetailPage
|
|
4
|
+
* @audience internal
|
|
5
|
+
* @layer app-specific
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module represents the AIAgentDetailPage component, which is responsible for displaying and managing the details of an AI agent within the admin interface. It utilizes various UI components to facilitate user interactions and integrates with the API for data fetching and submission. INVARIANT: The component expects valid agent ID parameters to function correctly.
|
|
9
|
+
*
|
|
10
|
+
* @seeAlso useApi (provides API interaction hooks).
|
|
11
|
+
* @seeAlso apiFetch (handles API requests).
|
|
12
|
+
* @seeAlso EntitySelect (used for selecting entities related to the agent).
|
|
13
|
+
* @seeAlso PageInstructions (provides guidance on the page).
|
|
14
|
+
*
|
|
15
|
+
* @cil-generated
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
10
26
|
|
|
11
27
|
import { useState, useEffect } from 'react'
|
|
12
28
|
import { useParams, useNavigate } from 'react-router-dom'
|
|
@@ -18,30 +34,40 @@ import { Textarea } from '../../components/ui/textarea'
|
|
|
18
34
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../components/ui/select'
|
|
19
35
|
import { Checkbox } from '../../components/ui/checkbox'
|
|
20
36
|
import { Label } from '../../components/ui/label'
|
|
37
|
+
import { AppSelect } from '../../components/admin/EntitySelect'
|
|
21
38
|
import { Card, CardContent, CardHeader, CardTitle } from '../../components/ui/card'
|
|
22
39
|
import { Skeleton } from '../../components/ui/skeleton'
|
|
23
40
|
import { Alert, AlertDescription, AlertTitle } from '../../components/ui/alert'
|
|
24
41
|
import { ArrowLeft, Bot, AlertCircle } from 'lucide-react'
|
|
25
|
-
import { PageInstructions } from '../../components/admin/PageInstructions'
|
|
26
|
-
|
|
27
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Provide imports and dependencies for the AIAgentDetailPage admin view.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
|
|
28
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
29
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
30
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
31
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
32
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
33
42
|
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header"]
|
|
34
43
|
|
|
35
44
|
|
|
36
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:aiagent:interface" type="interface" identity="aiagent" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header"]
|
|
37
|
-
// CIL[DOC-MACRO purpose="Define the AIAgent data shape used by the detail page."]
|
|
38
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Provide a TypeScript interface describing an agent record and its configuration fields."]
|
|
39
|
-
// CIL[DOC-CONTEXT module="admin-ai-agent-detail" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
40
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="AIAgent interface definition" errors="none" side_effects="none"]
|
|
41
|
-
// CIL[DOC-MICRO logic_summary="Declares an AIAgent interface with optional metadata, model config, system prompt, and tool list." notable_decisions="[]"]
|
|
42
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
43
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
44
45
|
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AIAgent:interface" type="interface" identity="AIAgent" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
64
|
+
/**
|
|
65
|
+
* The AIAgent interface defines the structure for AI agents used in the application, encapsulating their properties and configurations. It serves to standardize the representation of various types of AI agents within the system.
|
|
66
|
+
*
|
|
67
|
+
* @sideEffects none
|
|
68
|
+
* @stability stable
|
|
69
|
+
* @cil-generated
|
|
70
|
+
*/
|
|
45
71
|
interface AIAgent {
|
|
46
72
|
id: string
|
|
47
73
|
name: string
|
|
@@ -58,50 +84,76 @@ interface AIAgent {
|
|
|
58
84
|
created_at: string
|
|
59
85
|
updated_at: string
|
|
60
86
|
}
|
|
87
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AIAgent:interface"]
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
61
96
|
|
|
62
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Define the AIAgent data shape used by the detail page.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
|
|
63
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
64
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
65
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
66
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
67
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
68
|
-
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:aiagent:interface"]
|
|
69
97
|
|
|
70
98
|
|
|
71
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:agent_types:constant" type="constant" identity="agent_types" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header"]
|
|
72
|
-
// CIL[DOC-MACRO purpose="Provide the selectable labels and values for the agent_type field."]
|
|
73
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Supply the list of supported AI agent type options for the select input."]
|
|
74
|
-
// CIL[DOC-CONTEXT module="admin-ai-agent-detail" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
75
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="AGENT_TYPES array constant" errors="none" side_effects="none"]
|
|
76
|
-
// CIL[DOC-MICRO logic_summary="Declares an array of agent type options with value and label pairs." notable_decisions="[]"]
|
|
77
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
78
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
79
99
|
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AGENT_TYPES:constant" type="constant" identity="AGENT_TYPES" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
110
|
+
/**
|
|
111
|
+
* AGENT_TYPES is a constant array that defines the different types of agents available in the application. It serves to standardize the agent type options throughout the module.
|
|
112
|
+
*
|
|
113
|
+
* @sideEffects none
|
|
114
|
+
* @stability stable
|
|
115
|
+
* @cil-generated
|
|
116
|
+
*/
|
|
80
117
|
const AGENT_TYPES = [
|
|
81
118
|
{ value: 'chat', label: 'Chat' },
|
|
82
119
|
{ value: 'analysis', label: 'Analysis' },
|
|
83
120
|
{ value: 'automation', label: 'Automation' },
|
|
84
121
|
{ value: 'custom', label: 'Custom' }
|
|
85
122
|
]
|
|
123
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AGENT_TYPES:constant"]
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
86
132
|
|
|
87
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Provide the selectable labels and values for the agent_type field.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
|
|
88
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
89
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
90
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
91
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
92
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
93
|
-
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:agent_types:constant"]
|
|
94
133
|
|
|
95
134
|
|
|
96
|
-
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:aiagentdetailpage:function" type="function" identity="aiagentdetailpage" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:module_header:module_header"]
|
|
97
|
-
// CIL[DOC-MACRO purpose="Render and manage the AI agent create/edit detail page."]
|
|
98
|
-
// CIL[DOC-RESPONSIBILITY responsibility="Fetch or initialize agent data, manage editing state, validate inputs, save to the API, and render the UI."]
|
|
99
|
-
// CIL[DOC-CONTEXT module="admin-ai-agent-detail" layer="ui" related_files=".framework/src/components/admin/PageInstructions.tsx,.framework/src/components/ui/alert.tsx,.framework/src/components/ui/button.tsx,.framework/src/components/ui/card.tsx,.framework/src/components/ui/checkbox.tsx,.framework/src/components/ui/input.tsx,.framework/src/components/ui/label.tsx,.framework/src/components/ui/select.tsx,.framework/src/components/ui/skeleton.tsx,.framework/src/components/ui/textarea.tsx,.framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
100
|
-
// CIL[DOC-CONTRACT inputs="route id param from useParams, apiFetch and useApi hooks" outputs="rendered create/edit form or read-only agent detail" errors="Failed to fetch or save errors logged to console" side_effects="navigates on create, calls /api/ai-agents, updates browser UI state"]
|
|
101
|
-
// CIL[DOC-MICRO logic_summary="Loads an agent or default create payload, binds form state, parses JSON fields, validates required fields, and saves the agent." notable_decisions="[]"]
|
|
102
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
103
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
104
135
|
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
// CIL[BEGIN stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AIAgentDetailPage:component" type="component" identity="AIAgentDetailPage" parent="~/.framework/src/pages/admin/AIAgentDetailPage.tsx"]
|
|
146
|
+
/**
|
|
147
|
+
* The AIAgentDetailPage component manages the creation and editing of AI agent details within the admin interface. It fetches existing agent data or initializes a new agent based on the provided ID.
|
|
148
|
+
*
|
|
149
|
+
* @outputSpec JSX.Element
|
|
150
|
+
* @throws Error — failed to fetch AI agent
|
|
151
|
+
* @sideEffects Fetches data from an external API, potentially modifies the database via POST or PATCH requests.
|
|
152
|
+
* @stability stable
|
|
153
|
+
* @calls useParams, useNavigate, useApi, apiFetch, navigate
|
|
154
|
+
* @errorHandling Logs errors to the console on save failure.
|
|
155
|
+
* @cil-generated
|
|
156
|
+
*/
|
|
105
157
|
export function AIAgentDetailPage() {
|
|
106
158
|
const { id } = useParams<{ id: string }>()
|
|
107
159
|
const navigate = useNavigate()
|
|
@@ -182,49 +234,6 @@ export function AIAgentDetailPage() {
|
|
|
182
234
|
<Button variant="ghost" onClick={() => navigate(-1)}><ArrowLeft className="h-5 w-5" /></Button>
|
|
183
235
|
<h1 className="text-2xl font-bold">{isCreateMode ? 'Create AI Agent' : agent?.name}</h1>
|
|
184
236
|
</div>
|
|
185
|
-
|
|
186
|
-
<PageInstructions
|
|
187
|
-
description="Configure an AI agent with a model, system prompt, and tools."
|
|
188
|
-
sections={[
|
|
189
|
-
{ title: 'What this AI agent controls', content: 'An AI agent is a reusable model, prompt, and tool configuration that Spine invokes from pipelines, triggers, and chat interfaces. It defines how an LLM behaves, which tools it can call, and any guardrails.' },
|
|
190
|
-
{ title: 'Fields explained', content: <ul className="list-disc pl-4 space-y-1">
|
|
191
|
-
<li><strong>Name</strong> — string. The display name used in lists and callers. Missing or empty prevents the record from being saved.</li>
|
|
192
|
-
<li><strong>Type</strong> — select. Categorizes the agent as chat, analysis, automation, or custom. Used to filter and route agents; a missing value defaults to chat.</li>
|
|
193
|
-
<li><strong>Model</strong> — string. The LLM model name stored in <code>model_config.model</code>. If blank, the API call will fail because no model is targeted.</li>
|
|
194
|
-
<li><strong>Max Tokens</strong> — number. The maximum response length. Invalid or empty parses to an empty value and may cause provider errors.</li>
|
|
195
|
-
<li><strong>Temperature</strong> — number between 0 and 2. Lower is more deterministic, higher is more random. Out of range values may be rejected by the provider.</li>
|
|
196
|
-
<li><strong>Description</strong> — string (optional). Human-readable context for other admins.</li>
|
|
197
|
-
<li><strong>System Prompt</strong> — text. Defines the agent personality, instructions, and constraints. Empty means the model receives no system message.</li>
|
|
198
|
-
<li><strong>App ID</strong> — string. Optional owning app UUID; blank means account-scoped.</li>
|
|
199
|
-
<li><strong>Tools (one per line)</strong> — newline-separated string list. Tool names the agent is allowed to invoke. Unknown or missing tools cause runtime errors.</li>
|
|
200
|
-
<li><strong>Capabilities</strong> — JSON object. Optional flags or settings the agent can use. Must be valid JSON or save fails.</li>
|
|
201
|
-
<li><strong>Constraints</strong> — JSON object. Optional guardrails. Must be valid JSON or save fails.</li>
|
|
202
|
-
<li><strong>Metadata</strong> — JSON object. Optional metadata. Must be valid JSON or save fails.</li>
|
|
203
|
-
<li><strong>Active</strong> — checkbox. Inactive agents are not available for invocation.</li>
|
|
204
|
-
</ul> },
|
|
205
|
-
{ title: 'Options and values', content: <ul className="list-disc pl-4 space-y-1">
|
|
206
|
-
<li><strong>Agent type</strong>: <em>Chat</em> for conversational assistants, <em>Analysis</em> for data reasoning, <em>Automation</em> for pipeline actions, <em>Custom</em> for anything else.</li>
|
|
207
|
-
<li><strong>Active</strong>: enabled means the agent can be called; disabled means it is hidden from callers and will not run.</li>
|
|
208
|
-
</ul> },
|
|
209
|
-
{ title: 'Downstream impact', content: <ul className="list-disc pl-4 space-y-1">
|
|
210
|
-
<li>Pipelines, triggers, and chat UIs reference agents by ID; deleting or changing the model changes their output.</li>
|
|
211
|
-
<li>Tool names listed here must match registered tool names exactly, otherwise the agent cannot call them.</li>
|
|
212
|
-
<li>Invalid JSON in Capabilities or Constraints will stop the save and leave the previous config in place.</li>
|
|
213
|
-
</ul> },
|
|
214
|
-
{ title: 'How to create, save, and validate', content: <ol className="list-decimal pl-4 space-y-1">
|
|
215
|
-
<li>In create mode, fill every required field, enter at least a model name and system prompt.</li>
|
|
216
|
-
<li>Add tools one per line; supply optional JSON in Capabilities and Constraints.</li>
|
|
217
|
-
<li>Click Create. On existing records, click Edit, change fields, then Save.</li>
|
|
218
|
-
<li>Validation checks JSON syntax, parses Max Tokens and Temperature as numbers, and rejects empty Name/Model.</li>
|
|
219
|
-
</ol> },
|
|
220
|
-
{ title: 'Common mistakes', content: <ul className="list-disc pl-4 space-y-1">
|
|
221
|
-
<li>Pasting a multiline tools string as a single comma-separated line.</li>
|
|
222
|
-
<li>Using invalid JSON in Capabilities or Constraints.</li>
|
|
223
|
-
<li>Referencing a model name that is not configured in the account, causing calls to fail.</li>
|
|
224
|
-
</ul> },
|
|
225
|
-
]}
|
|
226
|
-
/>
|
|
227
|
-
|
|
228
237
|
<div className="flex justify-end gap-2">
|
|
229
238
|
{isEditing ? (
|
|
230
239
|
<><Button variant="outline" onClick={() => isCreateMode ? navigate(-1) : setIsEditing(false)}>Cancel</Button><Button onClick={handleSave}>{isCreateMode ? 'Create' : 'Save'}</Button></>
|
|
@@ -235,7 +244,7 @@ export function AIAgentDetailPage() {
|
|
|
235
244
|
<Card><CardContent className="p-6 space-y-4">
|
|
236
245
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
237
246
|
<div className="space-y-2"><Label>Name</Label><Input value={editData.name || ''} onChange={e => setEditData({...editData, name: e.target.value})} /></div>
|
|
238
|
-
<div className="space-y-2"><Label>App
|
|
247
|
+
<div className="space-y-2"><Label>App</Label><AppSelect value={editData.app_id || ''} onChange={v => setEditData({...editData, app_id: v})} /></div>
|
|
239
248
|
<div className="space-y-2"><Label>Type</Label><Select value={editData.agent_type || 'chat'} onValueChange={v => setEditData({...editData, agent_type: v})}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent>{AGENT_TYPES.map(t => <SelectItem key={t.value} value={t.value}>{t.label}</SelectItem>)}</SelectContent></Select></div>
|
|
240
249
|
<div className="space-y-2"><Label>Model</Label><Input value={editData.model_config?.model || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, model: e.target.value}})} /></div>
|
|
241
250
|
<div className="space-y-2"><Label>Max Tokens</Label><Input type="number" value={editData.model_config?.max_tokens || ''} onChange={e => setEditData({...editData, model_config: {...editData.model_config, max_tokens: parseInt(e.target.value)}})} /></div>
|
|
@@ -271,11 +280,13 @@ export function AIAgentDetailPage() {
|
|
|
271
280
|
</div>
|
|
272
281
|
)
|
|
273
282
|
}
|
|
283
|
+
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:AIAgentDetailPage:component"]
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
274
292
|
|
|
275
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Render and manage the AI agent create/edit detail page.'; No verified external callers; imports: .framework/src/hooks/useApi.ts,.framework/src/lib/api.ts,.framework/src/components/ui/button.tsx"]
|
|
276
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
277
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
278
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
279
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
280
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
281
|
-
// CIL[END stable_id="~/.framework/src/pages/admin/AIAgentDetailPage.tsx:aiagentdetailpage:function"]
|