spine-framework 0.3.124 → 0.3.126
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/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +188 -16
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +685 -537
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +187 -144
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +195 -116
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +5 -2
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module app-manifest
|
|
3
|
-
* @audience core-contributor
|
|
4
|
-
* @layer shared-util
|
|
5
|
-
* @stability evolving
|
|
6
|
-
*
|
|
7
|
-
* Utility for loading and merging app manifests with database records.
|
|
8
|
-
* Enables file-first app configuration with database tracking installations.
|
|
9
|
-
*
|
|
10
|
-
* **Pattern:**
|
|
11
|
-
* 1. Manifest files in custom/apps/{slug}/manifest.json are source of truth
|
|
12
|
-
* 2. Database tracks which tenant has which app installed/enabled
|
|
13
|
-
* 3. This utility merges both sources for the API response
|
|
14
|
-
*
|
|
15
|
-
* @seeAlso apps.ts (uses this for manifest-driven responses)
|
|
16
|
-
* @seeAlso 015_simplify_apps_table.sql (database structure)
|
|
17
|
-
*/
|
|
18
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// CIL[BEGIN chunk_id="app-manifest_moduleheader_1784066609" type="module_header" identity="module_header" parent="none"]
|
|
7
|
+
// CIL[DOC-MACRO purpose="App manifest loading and management"]
|
|
8
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Load and merge app configuration manifests"]
|
|
9
|
+
// CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
10
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="manifest utilities" errors="none" side_effects="file system access"]
|
|
11
|
+
// CIL[DOC-MICRO logic_summary="Defines AppManifest, NavItem interfaces and manifest cache" notable_decisions="[]"]
|
|
12
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
13
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
14
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
16
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
17
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
18
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
19
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
19
21
|
import { readFileSync } from 'fs'
|
|
20
22
|
import { resolve } from 'path'
|
|
21
23
|
|
|
@@ -24,7 +26,7 @@ export interface AppManifest {
|
|
|
24
26
|
slug: string
|
|
25
27
|
description?: string
|
|
26
28
|
version?: string
|
|
27
|
-
required_roles: string[]
|
|
29
|
+
required_roles: string[]
|
|
28
30
|
route_prefix?: string
|
|
29
31
|
renderer?: 'generic' | 'custom' | 'none'
|
|
30
32
|
routes: string[]
|
|
@@ -46,41 +48,44 @@ export interface NavItem {
|
|
|
46
48
|
children?: NavItem[]
|
|
47
49
|
}
|
|
48
50
|
|
|
49
|
-
// Cache for manifest content (development mode - no caching in production)
|
|
50
51
|
const manifestCache = new Map<string, AppManifest>()
|
|
51
52
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// CIL[END chunk_id="app-manifest_moduleheader_1784066609"]
|
|
54
|
+
// CIL[BEGIN chunk_id="app-manifest_loadmanifest_1784066609" type="function" identity="loadManifest" parent="none"]
|
|
55
|
+
// CIL[DOC-MACRO purpose="Load app manifest from file"]
|
|
56
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Read and parse manifest JSON with caching"]
|
|
57
|
+
// CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
58
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="AppManifest or null" errors="file system errors" side_effects="file reads"]
|
|
59
|
+
// CIL[DOC-MICRO logic_summary="Loads manifest from disk with validation and caching" notable_decisions="[]"]
|
|
60
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
61
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
62
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
63
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
64
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
65
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
66
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
67
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
58
68
|
export function loadManifest(manifestPath: string): AppManifest | null {
|
|
59
|
-
// Check cache first (dev only)
|
|
60
69
|
if (manifestCache.has(manifestPath)) {
|
|
61
70
|
return manifestCache.get(manifestPath)!
|
|
62
71
|
}
|
|
63
72
|
|
|
64
73
|
try {
|
|
65
|
-
// Resolve from project root (functions are at .assembled/netlify/functions/)
|
|
66
74
|
const projectRoot = resolve(__dirname, '../../../..')
|
|
67
75
|
const fullPath = resolve(projectRoot, manifestPath)
|
|
68
76
|
|
|
69
77
|
const content = readFileSync(fullPath, 'utf-8')
|
|
70
78
|
const manifest: AppManifest = JSON.parse(content)
|
|
71
79
|
|
|
72
|
-
// Validate required fields
|
|
73
80
|
if (!manifest.slug || !manifest.name) {
|
|
74
81
|
console.error(`[app-manifest] Invalid manifest at ${manifestPath}: missing slug or name`)
|
|
75
82
|
return null
|
|
76
83
|
}
|
|
77
84
|
|
|
78
|
-
// Ensure required_roles is array (backward compat)
|
|
79
85
|
if (!manifest.required_roles) {
|
|
80
86
|
manifest.required_roles = []
|
|
81
87
|
}
|
|
82
88
|
|
|
83
|
-
// Cache for development (dev server restarts clear cache)
|
|
84
89
|
manifestCache.set(manifestPath, manifest)
|
|
85
90
|
|
|
86
91
|
return manifest
|
|
@@ -89,27 +94,43 @@ export function loadManifest(manifestPath: string): AppManifest | null {
|
|
|
89
94
|
return null
|
|
90
95
|
}
|
|
91
96
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
97
|
+
// CIL[END chunk_id="app-manifest_loadmanifest_1784066609"]
|
|
98
|
+
// CIL[BEGIN chunk_id="app-manifest_clearmanifestcache_1784066609" type="function" identity="clearManifestCache" parent="none"]
|
|
99
|
+
// CIL[DOC-MACRO purpose="Clear manifest cache"]
|
|
100
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Reset cached manifest data"]
|
|
101
|
+
// CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\"\\\"]"]
|
|
102
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="void" errors="none" side_effects="cache clearing"]
|
|
103
|
+
// CIL[DOC-MICRO logic_summary="Clears all cached manifest entries" notable_decisions="[]"]
|
|
104
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
105
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
106
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: \."]
|
|
107
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
108
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
109
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
110
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
111
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
96
112
|
export function clearManifestCache(): void {
|
|
97
113
|
manifestCache.clear()
|
|
98
114
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
115
|
+
// CIL[END chunk_id="app-manifest_clearmanifestcache_1784066609"]
|
|
116
|
+
// CIL[BEGIN chunk_id="app-manifest_mergewithmanifest_1784066609" type="function" identity="mergeWithManifest" parent="none"]
|
|
117
|
+
// CIL[DOC-MACRO purpose="Merge database record with manifest"]
|
|
118
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Combine DB and manifest configuration"]
|
|
119
|
+
// CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
120
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="merged record" errors="manifest load errors" side_effects="file reads"]
|
|
121
|
+
// CIL[DOC-MICRO logic_summary="Merges database record with manifest file data" notable_decisions="[]"]
|
|
122
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
123
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
124
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, .framework/functions/_shared/principal.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
125
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
126
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
127
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
128
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
129
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
107
130
|
export function mergeWithManifest(dbRecord: any): any {
|
|
108
131
|
if (!dbRecord) return null
|
|
109
132
|
|
|
110
|
-
// If no manifest path, return DB record as-is (legacy mode)
|
|
111
133
|
if (!dbRecord.manifest_path || dbRecord.config_source !== 'manifest') {
|
|
112
|
-
// Convert legacy min_role to required_roles for frontend compatibility
|
|
113
134
|
return {
|
|
114
135
|
...dbRecord,
|
|
115
136
|
required_roles: dbRecord.min_role ? [dbRecord.min_role] : [],
|
|
@@ -117,7 +138,6 @@ export function mergeWithManifest(dbRecord: any): any {
|
|
|
117
138
|
}
|
|
118
139
|
}
|
|
119
140
|
|
|
120
|
-
// Load manifest and merge
|
|
121
141
|
const manifest = loadManifest(dbRecord.manifest_path)
|
|
122
142
|
if (!manifest) {
|
|
123
143
|
console.warn(`[app-manifest] Could not load manifest for ${dbRecord.slug}, falling back to DB`)
|
|
@@ -128,54 +148,48 @@ export function mergeWithManifest(dbRecord: any): any {
|
|
|
128
148
|
}
|
|
129
149
|
}
|
|
130
150
|
|
|
131
|
-
// Merge: Manifest metadata + DB state fields
|
|
132
151
|
return {
|
|
133
152
|
id: dbRecord.id,
|
|
134
153
|
slug: manifest.slug,
|
|
135
154
|
name: manifest.name,
|
|
136
155
|
description: manifest.description || dbRecord.description,
|
|
137
|
-
|
|
138
|
-
// Role-based access (new array format)
|
|
139
156
|
required_roles: manifest.required_roles,
|
|
140
|
-
min_role: manifest.required_roles[0] || null,
|
|
141
|
-
|
|
142
|
-
// Navigation and routing
|
|
157
|
+
min_role: manifest.required_roles[0] || null,
|
|
143
158
|
routes: manifest.routes,
|
|
144
159
|
nav_items: manifest.nav_items,
|
|
145
|
-
|
|
146
|
-
// Features and metadata
|
|
147
160
|
features: manifest.features || [],
|
|
148
161
|
dependencies: manifest.dependencies || [],
|
|
149
162
|
version: manifest.version,
|
|
150
|
-
|
|
151
|
-
// Database state fields
|
|
152
163
|
is_active: dbRecord.is_active,
|
|
153
164
|
is_system: dbRecord.is_system,
|
|
154
165
|
is_public: manifest.is_public ?? false,
|
|
155
166
|
auth_required: manifest.auth_required ?? true,
|
|
156
|
-
|
|
157
|
-
// Installation tracking
|
|
158
167
|
account_id: dbRecord.account_id,
|
|
159
168
|
pack_id: dbRecord.pack_id,
|
|
160
169
|
ownership: dbRecord.ownership,
|
|
161
|
-
|
|
162
|
-
// Internal
|
|
163
170
|
_source: 'manifest',
|
|
164
171
|
_manifest_path: dbRecord.manifest_path
|
|
165
172
|
}
|
|
166
173
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
// CIL[END chunk_id="app-manifest_mergewithmanifest_1784066609"]
|
|
175
|
+
// CIL[BEGIN chunk_id="app-manifest_discovermanifests_1784066609" type="function" identity="discoverManifests" parent="none"]
|
|
176
|
+
// CIL[DOC-MACRO purpose="Discover available app manifests"]
|
|
177
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Return list of known manifest paths"]
|
|
178
|
+
// CIL[DOC-CONTEXT module="_shared/app-manifest" layer="infrastructure" related_files="[]"]
|
|
179
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="manifest list" errors="none" side_effects="none"]
|
|
180
|
+
// CIL[DOC-MICRO logic_summary="Returns hardcoded list of app manifest locations" notable_decisions="[]"]
|
|
181
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
182
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
183
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: none."]
|
|
184
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
185
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
186
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
187
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
188
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
174
189
|
export function discoverManifests(): Array<{slug: string, path: string}> {
|
|
175
|
-
// In production, this would scan the filesystem
|
|
176
|
-
// For now, return known manifests based on the plan
|
|
177
190
|
return [
|
|
178
191
|
{ slug: 'cortex', path: 'custom/apps/cortex/manifest.json' },
|
|
179
192
|
{ slug: 'customer-portal', path: 'custom/apps/customer-portal/manifest.json' }
|
|
180
193
|
]
|
|
181
194
|
}
|
|
195
|
+
// CIL[END chunk_id="app-manifest_discovermanifests_1784066609"]
|
|
@@ -1,47 +1,53 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module audit
|
|
3
|
-
* @audience both
|
|
4
|
-
* @layer shared-core
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Unified audit logging for all operations in Spine. Every state-changing
|
|
8
|
-
* operation should call `emitAudit` to write a structured row to the `logs`
|
|
9
|
-
* table with full principal provenance. Audit failures never throw — a failed
|
|
10
|
-
* log write must never break the operation that triggered it.
|
|
11
|
-
*
|
|
12
|
-
* INVARIANT: always call `emitAudit` after a successful write, not before.
|
|
13
|
-
* Pass `result: 'failure'` only when the operation itself failed.
|
|
14
|
-
* INVARIANT: never pass sensitive secrets (API keys, tokens) in metadata.
|
|
15
|
-
*
|
|
16
|
-
* @seeAlso principal.ts (formatPrincipalForAudit — shapes the principal field)
|
|
17
|
-
* @seeAlso middleware.ts (CoreContext — ctx.requestId ties logs to HTTP requests)
|
|
18
|
-
* @seeAlso logs.ts (API handler that queries the logs table)
|
|
19
|
-
* @seeAlso permissions.ts (getPrincipalPermissionSummary — used in metadata)
|
|
20
|
-
*/
|
|
21
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
// CIL[BEGIN chunk_id="audit_moduleheader_1784068075" type="module_header" identity="module_header" parent="none"]
|
|
5
|
+
// CIL[DOC-MACRO purpose="Audit logging system imports"]
|
|
6
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import dependencies for audit functionality"]
|
|
7
|
+
// CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
8
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="imports" errors="none" side_effects="module imports"]
|
|
9
|
+
// CIL[DOC-MICRO logic_summary="Imports CoreContext, database, and principal utilities" notable_decisions="[]"]
|
|
10
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
11
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
12
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
13
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
14
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
15
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
16
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
17
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
18
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
22
19
|
import { CoreContext } from './middleware'
|
|
23
20
|
import { adminDb } from './db'
|
|
24
21
|
import { Principal, formatPrincipalForAudit } from './principal'
|
|
22
|
+
import { Span, TraceContext } from './tracing'
|
|
23
|
+
// CIL[END chunk_id="audit_moduleheader_1784068075"]
|
|
24
|
+
// CIL[BEGIN chunk_id="audit_emitaudit_1784068075" type="function" identity="emitAudit" parent="none"]
|
|
25
|
+
// CIL[DOC-MACRO purpose="Emit audit log entries"]
|
|
26
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Write structured audit logs to database"]
|
|
27
|
+
// CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\"]"]
|
|
28
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="database errors" side_effects="database writes"]
|
|
29
|
+
// CIL[DOC-MICRO logic_summary="Inserts audit records with principal context and metadata" notable_decisions="[]"]
|
|
30
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
31
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
32
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql."]
|
|
33
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
34
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
35
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
36
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
37
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
38
|
+
function traceFields(ctx: CoreContext): Partial<Record<string, any>> {
|
|
39
|
+
const trace = (ctx as any).trace as TraceContext | undefined
|
|
40
|
+
if (!trace) return {}
|
|
41
|
+
return {
|
|
42
|
+
trace_id: trace.traceId,
|
|
43
|
+
span_id: trace.spanId,
|
|
44
|
+
parent_span_id: trace.parentSpanId,
|
|
45
|
+
trace_flags: trace.traceFlags,
|
|
46
|
+
tracestate: trace.traceState,
|
|
47
|
+
sampled: trace.sampled
|
|
48
|
+
}
|
|
49
|
+
}
|
|
25
50
|
|
|
26
|
-
// ─── PRIMARY AUDIT FUNCTION ───────────────────────────────────────────────────
|
|
27
|
-
|
|
28
|
-
// ─── CHUNK_START: SHARED_AUDIT_EMIT ──────────────────────────────────────────────
|
|
29
|
-
/**
|
|
30
|
-
* @chunk-id SHARED_AUDIT_EMIT_1_0_0
|
|
31
|
-
* @version 1.0.0
|
|
32
|
-
* @hash d9c3dbc103f5f2f0543dc4c154bbad256e59c885643a20bc20ca07198eabd67c
|
|
33
|
-
* @macro Audit Log Emitter
|
|
34
|
-
* @micro Writes structured audit logs to logs table with principal provenance
|
|
35
|
-
* @inputs ctx: CoreContext — Request context with principal and database
|
|
36
|
-
* @inputs action: string — Dot-namespaced action (e.g. 'items.create')
|
|
37
|
-
* @inputs target: {type, id?, account_id?} — Resource being acted upon
|
|
38
|
-
* @inputs metadata: {changes?, result?, error?, ...} — Optional context
|
|
39
|
-
* @outputs void — Always resolves, never rejects
|
|
40
|
-
* @depends-on [adminDb, formatPrincipalForAudit]
|
|
41
|
-
* @depended-by [All state-changing API functions, pipeline-runner, trigger-engine]
|
|
42
|
-
* @side-effects [DB insert to logs table, console.error on failure]
|
|
43
|
-
* @tags audit, logging, security, compliance
|
|
44
|
-
*/
|
|
45
51
|
export async function emitAudit(
|
|
46
52
|
ctx: CoreContext,
|
|
47
53
|
action: string,
|
|
@@ -54,13 +60,21 @@ export async function emitAudit(
|
|
|
54
60
|
}
|
|
55
61
|
): Promise<void> {
|
|
56
62
|
try {
|
|
57
|
-
// Use the RLS-scoped db from context, or fallback to adminDb
|
|
58
63
|
const logDb = ctx.db || adminDb
|
|
59
|
-
|
|
64
|
+
const result = metadata?.result
|
|
65
|
+
const level = result === 'failure' || result === 'denied' ? 'warning' : 'info'
|
|
66
|
+
|
|
60
67
|
await logDb.from('logs').insert({
|
|
61
|
-
level
|
|
68
|
+
level,
|
|
62
69
|
source: 'audit',
|
|
70
|
+
source_type: 'event',
|
|
63
71
|
message: `${action} by ${ctx.principal?.type || 'unknown'}:${ctx.principal?.id || 'anonymous'}`,
|
|
72
|
+
span_name: action,
|
|
73
|
+
kind: 'event',
|
|
74
|
+
outcome: result === 'failure' ? 'failure' : result === 'denied' ? 'failure' : result === 'success' ? 'success' : null,
|
|
75
|
+
event_category: result ? 'business_outcome' : 'audit',
|
|
76
|
+
started_at: new Date().toISOString(),
|
|
77
|
+
...traceFields(ctx),
|
|
64
78
|
metadata: {
|
|
65
79
|
principal: ctx.principal ? formatPrincipalForAudit(ctx.principal) : null,
|
|
66
80
|
action,
|
|
@@ -76,31 +90,73 @@ export async function emitAudit(
|
|
|
76
90
|
})
|
|
77
91
|
} catch (err) {
|
|
78
92
|
console.error('Failed to emit audit log:', err)
|
|
79
|
-
// Don't throw - audit failures shouldn't break operations
|
|
80
93
|
}
|
|
81
94
|
}
|
|
82
|
-
// ─── CHUNK_END: SHARED_AUDIT_EMIT ────────────────────────────────────────────────
|
|
83
95
|
|
|
84
|
-
|
|
96
|
+
export async function emitSpan(
|
|
97
|
+
ctx: CoreContext,
|
|
98
|
+
span: Span,
|
|
99
|
+
options?: {
|
|
100
|
+
action?: string
|
|
101
|
+
target?: { type: string; id?: string; account_id?: string }
|
|
102
|
+
level?: string
|
|
103
|
+
kind?: string
|
|
104
|
+
event_category?: string
|
|
105
|
+
metadata?: Record<string, any>
|
|
106
|
+
}
|
|
107
|
+
): Promise<void> {
|
|
108
|
+
try {
|
|
109
|
+
const logDb = ctx.db || adminDb
|
|
110
|
+
const level = options?.level || (span.status === 'error' ? 'warning' : 'info')
|
|
111
|
+
const outcome = span.status === 'error' ? 'failure' : span.status === 'ok' ? 'success' : null
|
|
85
112
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
113
|
+
await logDb.from('logs').insert({
|
|
114
|
+
level,
|
|
115
|
+
source: 'span',
|
|
116
|
+
source_type: 'span',
|
|
117
|
+
message: `${span.spanName} ${span.status === 'error' ? 'failed' : 'completed'}`,
|
|
118
|
+
trace_id: span.traceId,
|
|
119
|
+
span_id: span.spanId,
|
|
120
|
+
parent_span_id: span.parentSpanId,
|
|
121
|
+
trace_flags: span.traceFlags,
|
|
122
|
+
tracestate: span.traceState,
|
|
123
|
+
span_name: span.spanName,
|
|
124
|
+
started_at: span.startedAt,
|
|
125
|
+
ended_at: span.endedAt,
|
|
126
|
+
duration_ms: span.durationMs,
|
|
127
|
+
sampled: span.sampled,
|
|
128
|
+
kind: options?.kind || 'span',
|
|
129
|
+
outcome,
|
|
130
|
+
event_category: options?.event_category,
|
|
131
|
+
metadata: {
|
|
132
|
+
principal: ctx.principal ? formatPrincipalForAudit(ctx.principal) : null,
|
|
133
|
+
action: options?.action || span.spanName,
|
|
134
|
+
target: options?.target || { type: 'request', account_id: ctx.accountId },
|
|
135
|
+
request_id: ctx.requestId,
|
|
136
|
+
...span.attributes,
|
|
137
|
+
...(options?.metadata || {})
|
|
138
|
+
},
|
|
139
|
+
account_id: options?.target?.account_id || ctx.accountId || ctx.principal?.accountId || null
|
|
140
|
+
})
|
|
141
|
+
} catch (err) {
|
|
142
|
+
console.error('Failed to emit span log:', err)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// CIL[END chunk_id="audit_emitaudit_1784068075"]
|
|
146
|
+
// CIL[BEGIN chunk_id="audit_emitlog_1784068075" type="function" identity="emitLog" parent="none"]
|
|
147
|
+
// CIL[DOC-MACRO purpose="Emit general log entries"]
|
|
148
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Wrapper for audit logging with change tracking"]
|
|
149
|
+
// CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
|
|
150
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="audit errors" side_effects="database writes"]
|
|
151
|
+
// CIL[DOC-MICRO logic_summary="Delegates to emitAudit with structured change data" notable_decisions="[]"]
|
|
152
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
153
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
154
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
155
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
156
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
157
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
158
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
159
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
104
160
|
export async function emitLog(
|
|
105
161
|
ctx: CoreContext,
|
|
106
162
|
eventType: string,
|
|
@@ -119,27 +175,23 @@ export async function emitLog(
|
|
|
119
175
|
})
|
|
120
176
|
} catch (error) {
|
|
121
177
|
console.error('Failed to emit log:', error)
|
|
122
|
-
// Don't throw - logging failures shouldn't break operations
|
|
123
178
|
}
|
|
124
179
|
}
|
|
125
|
-
//
|
|
126
|
-
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
* @side-effects [DB insert via emitLog → emitAudit, console.error on failure]
|
|
141
|
-
* @tags audit, logging, legacy, activity, deprecated
|
|
142
|
-
*/
|
|
180
|
+
// CIL[END chunk_id="audit_emitlog_1784068075"]
|
|
181
|
+
// CIL[BEGIN chunk_id="audit_emitactivity_1784068075" type="function" identity="emitActivity" parent="none"]
|
|
182
|
+
// CIL[DOC-MACRO purpose="Emit activity log entries"]
|
|
183
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Log user activities with activity prefix"]
|
|
184
|
+
// CIL[DOC-CONTEXT module="_shared/audit" layer="infrastructure" related_files="[\".framework/src/components/ui/dialog.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\".framework/migrations/015_simplify_apps_table.sql\",\"\\\"]"]
|
|
185
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Promise<void>" errors="log errors" side_effects="database writes"]
|
|
186
|
+
// CIL[DOC-MICRO logic_summary="Wraps emitLog with activity. prefix for categorization" notable_decisions="[]"]
|
|
187
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="external_symbols_unknown"]
|
|
188
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
189
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/ui/dialog.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, .framework/migrations/015_simplify_apps_table.sql, \."]
|
|
190
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
191
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
192
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
193
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
194
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
143
195
|
export async function emitActivity(
|
|
144
196
|
ctx: CoreContext,
|
|
145
197
|
type: string,
|
|
@@ -147,4 +199,4 @@ export async function emitActivity(
|
|
|
147
199
|
): Promise<void> {
|
|
148
200
|
await emitLog(ctx, `activity.${type}`, undefined, undefined, details)
|
|
149
201
|
}
|
|
150
|
-
//
|
|
202
|
+
// CIL[END chunk_id="audit_emitactivity_1784068075"]
|