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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="resolve_credentials_module_header_1784200002" type="module_header" identity="imports" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Resolve integration credentials from DB or environment variables"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide a single, auditable source for external API secrets"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="resolve_credentials" layer="infrastructure" related_files="[".framework/functions/integration-routes.ts",".framework/functions/integration-outbound.ts",".framework/functions/agent-runner.ts",".framework/functions/_shared/audit.ts"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="ctx, integration record, credential field name" outputs="{ value, source }" errors="missing_credential" side_effects="emits audit log"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Reads integrations.credentials[field]. If source is env_var, reads process.env. Logs the source but never the secret value." notable_decisions="["Never logs the secret value.","Throws if neither DB nor env provides the credential.","Returns source so audit trail can show where the secret came from."]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.95" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
10
|
+
// CIL[DOC-VECTOR type="context" content="Layer: infrastructure. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/integration-routes.ts, .framework/functions/integration-outbound.ts, .framework/functions/agent-runner.ts, .framework/functions/_shared/audit.ts."]
|
|
11
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
12
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
13
|
+
// CIL[DOC-VECTOR type="constraint" content="Credential field must be defined in integrations.credentials."]
|
|
14
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="Helper used by broker and core LLM callers."]
|
|
15
|
+
// CIL[DOC-VECTOR type="user_journey" content="Runtime credential resolution for outbound calls."]
|
|
16
|
+
|
|
17
|
+
import { CoreContext } from './middleware'
|
|
18
|
+
import { emitLog } from './audit'
|
|
19
|
+
|
|
20
|
+
interface CredentialEntry {
|
|
21
|
+
source: 'value' | 'env_var'
|
|
22
|
+
value: string
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface ResolvedCredential {
|
|
26
|
+
value: string
|
|
27
|
+
source: 'value' | 'env_var'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export async function resolveCredential(
|
|
31
|
+
ctx: CoreContext,
|
|
32
|
+
integration: any,
|
|
33
|
+
fieldName: string
|
|
34
|
+
): Promise<ResolvedCredential> {
|
|
35
|
+
const credentials = integration?.credentials || {}
|
|
36
|
+
const entry = credentials[fieldName] as CredentialEntry | undefined
|
|
37
|
+
|
|
38
|
+
if (!entry || !entry.source) {
|
|
39
|
+
await emitLog(ctx, 'integration.credential_missing', { type: 'integration', id: integration?.id }, undefined, {
|
|
40
|
+
field: fieldName,
|
|
41
|
+
integration_id: integration?.id,
|
|
42
|
+
account_id: ctx.accountId
|
|
43
|
+
})
|
|
44
|
+
throw new Error(`Missing credential configuration for ${fieldName} on integration ${integration?.id}`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (entry.source === 'env_var') {
|
|
48
|
+
const envValue = process.env[entry.value]
|
|
49
|
+
if (!envValue) {
|
|
50
|
+
await emitLog(ctx, 'integration.credential_env_missing', { type: 'integration', id: integration?.id }, undefined, {
|
|
51
|
+
field: fieldName,
|
|
52
|
+
env_var: entry.value,
|
|
53
|
+
integration_id: integration?.id,
|
|
54
|
+
account_id: ctx.accountId
|
|
55
|
+
})
|
|
56
|
+
throw new Error(`Environment variable ${entry.value} for ${fieldName} is not set`)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
await emitLog(ctx, 'integration.credential_resolved', { type: 'integration', id: integration?.id }, undefined, {
|
|
60
|
+
field: fieldName,
|
|
61
|
+
source: 'env_var',
|
|
62
|
+
env_var: entry.value,
|
|
63
|
+
integration_id: integration?.id,
|
|
64
|
+
account_id: ctx.accountId
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
return { value: envValue, source: 'env_var' }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!entry.value) {
|
|
71
|
+
await emitLog(ctx, 'integration.credential_empty', { type: 'integration', id: integration?.id }, undefined, {
|
|
72
|
+
field: fieldName,
|
|
73
|
+
source: 'value',
|
|
74
|
+
integration_id: integration?.id,
|
|
75
|
+
account_id: ctx.accountId
|
|
76
|
+
})
|
|
77
|
+
throw new Error(`Credential ${fieldName} on integration ${integration?.id} is empty`)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
await emitLog(ctx, 'integration.credential_resolved', { type: 'integration', id: integration?.id }, undefined, {
|
|
81
|
+
field: fieldName,
|
|
82
|
+
source: 'value',
|
|
83
|
+
integration_id: integration?.id,
|
|
84
|
+
account_id: ctx.accountId
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
return { value: entry.value, source: 'value' }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export async function resolveCredentials(
|
|
91
|
+
ctx: CoreContext,
|
|
92
|
+
integration: any,
|
|
93
|
+
fieldNames: string[]
|
|
94
|
+
): Promise<Record<string, ResolvedCredential>> {
|
|
95
|
+
const result: Record<string, ResolvedCredential> = {}
|
|
96
|
+
for (const fieldName of fieldNames) {
|
|
97
|
+
result[fieldName] = await resolveCredential(ctx, integration, fieldName)
|
|
98
|
+
}
|
|
99
|
+
return result
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// CIL[END chunk_id="resolve_credentials_module_header_1784200002"]
|
|
@@ -1,10 +1,43 @@
|
|
|
1
|
-
// Slug-based ID resolution utilities
|
|
2
|
-
// Custom app code must never hardcode UUIDs — IDs differ on every fresh install.
|
|
3
|
-
// All functions that need entity IDs must call resolveIds() at request time.
|
|
4
1
|
|
|
5
|
-
import { adminDb } from './db'
|
|
6
2
|
|
|
7
|
-
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
// CIL[BEGIN chunk_id="resolveids_imports_1784020784" type="module_header" identity="imports" parent="none"]
|
|
11
|
+
// CIL[DOC-MACRO purpose="Import database dependency for ID resolution"]
|
|
12
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Import adminDb for database queries"]
|
|
13
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
14
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="adminDb" errors="none" side_effects="none"]
|
|
15
|
+
// CIL[DOC-MICRO logic_summary="Import database connection for ID resolution utilities" notable_decisions="[]"]
|
|
16
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
17
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
18
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
19
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
20
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
21
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
22
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
23
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
24
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
25
|
+
import { adminDb } from './db'
|
|
26
|
+
// CIL[END chunk_id="resolveids_imports_1784020784"]
|
|
27
|
+
// CIL[BEGIN chunk_id="resolveids_resolvetypeids_1784020784" type="function" identity="resolveTypeIds" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Resolve multiple type IDs by kind and slug"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Batch resolve type identifiers from database"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Record<string, string>" errors="type not found" side_effects="database query"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Batch queries types table, validates all requested types exist" notable_decisions="[]"]
|
|
33
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
8
41
|
export async function resolveTypeIds(
|
|
9
42
|
pairs: Array<{ kind: string; slug: string }>
|
|
10
43
|
): Promise<Record<string, string>> {
|
|
@@ -31,14 +64,100 @@ export async function resolveTypeIds(
|
|
|
31
64
|
|
|
32
65
|
return result
|
|
33
66
|
}
|
|
34
|
-
|
|
35
|
-
//
|
|
67
|
+
// CIL[END chunk_id="resolveids_resolvetypeids_1784020784"]
|
|
68
|
+
// CIL[BEGIN chunk_id="resolveids_resolvetypeid_1784020784" type="function" identity="resolveTypeId" parent="none"]
|
|
69
|
+
// CIL[DOC-MACRO purpose="Resolve single type ID by kind and slug"]
|
|
70
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get type identifier from kind and slug"]
|
|
71
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
72
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="type ID" errors="type not found" side_effects="database query"]
|
|
73
|
+
// CIL[DOC-MICRO logic_summary="Convenience wrapper around resolveTypeIds for single type" notable_decisions="[]"]
|
|
74
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
75
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
76
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 15. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
77
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 15. Total affected: 15."]
|
|
78
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
79
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
80
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
81
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
36
82
|
export async function resolveTypeId(kind: string, slug: string): Promise<string> {
|
|
37
83
|
const ids = await resolveTypeIds([{ kind, slug }])
|
|
38
84
|
return ids[`${kind}/${slug}`]
|
|
39
85
|
}
|
|
86
|
+
// CIL[END chunk_id="resolveids_resolvetypeid_1784020784"]
|
|
87
|
+
// CIL[BEGIN chunk_id="resolveids_typerecord_1784020784" type="interface" identity="TypeRecord" parent="none"]
|
|
88
|
+
// CIL[DOC-MACRO purpose="Define type record interface with schemas"]
|
|
89
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide structure for type with design and validation schemas"]
|
|
90
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
91
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="TypeRecord interface" errors="none" side_effects="none"]
|
|
92
|
+
// CIL[DOC-MICRO logic_summary="Interface containing type metadata and schemas" notable_decisions="[]"]
|
|
93
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
94
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
95
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
96
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
97
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
98
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
99
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
100
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
101
|
+
export interface TypeRecord {
|
|
102
|
+
id: string
|
|
103
|
+
slug: string
|
|
104
|
+
kind: string
|
|
105
|
+
design_schema: Record<string, any>
|
|
106
|
+
validation_schema: Record<string, any>
|
|
107
|
+
is_active: boolean
|
|
108
|
+
}
|
|
109
|
+
// CIL[END chunk_id="resolveids_typerecord_1784020784"]
|
|
110
|
+
// CIL[BEGIN chunk_id="resolveids_resolvetyperecord_1784020784" type="function" identity="resolveTypeRecord" parent="none"]
|
|
111
|
+
// CIL[DOC-LEARNING topic="runtime-type:generic/type_resolution" content="resolveTypeRecord fetches a type row by kind and slug or by id, returning the full design_schema and validation_schema. It is used by admin-data create and pipeline.ts to stamp new records."]
|
|
112
|
+
// CIL[DOC-NOTE type="design_schema_caveat" content="If the type slug is not found or is inactive, record creation fails with a 400 error. Always seed types before creating records."]
|
|
113
|
+
// CIL[DOC-MACRO purpose="Resolve complete type record with schemas"]
|
|
114
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get type metadata and validation schemas"]
|
|
115
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
116
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="TypeRecord" errors="type not found/inactive" side_effects="database query"]
|
|
117
|
+
// CIL[DOC-MICRO logic_summary="Queries types table, validates active status, returns full record" notable_decisions="[]"]
|
|
118
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
119
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
120
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
121
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
122
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
123
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
124
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
125
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
126
|
+
export async function resolveTypeRecord(kind: string, slug: string): Promise<TypeRecord> {
|
|
127
|
+
const { data, error } = await adminDb
|
|
128
|
+
.from('types')
|
|
129
|
+
.select('id, slug, kind, design_schema, validation_schema, is_active')
|
|
130
|
+
.eq('kind', kind)
|
|
131
|
+
.eq('slug', slug)
|
|
132
|
+
.single()
|
|
133
|
+
|
|
134
|
+
if (error || !data) throw new Error(`Type not found: ${kind}/${slug}`)
|
|
135
|
+
if (!data.is_active) throw new Error(`Type is inactive: ${kind}/${slug}`)
|
|
40
136
|
|
|
41
|
-
|
|
137
|
+
return {
|
|
138
|
+
id: data.id,
|
|
139
|
+
slug: data.slug,
|
|
140
|
+
kind: data.kind,
|
|
141
|
+
design_schema: data.design_schema || {},
|
|
142
|
+
validation_schema: data.validation_schema || {},
|
|
143
|
+
is_active: data.is_active,
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// CIL[END chunk_id="resolveids_resolvetyperecord_1784020784"]
|
|
147
|
+
// CIL[BEGIN chunk_id="resolveids_resolvelinktypeids_1784020784" type="function" identity="resolveLinkTypeIds" parent="none"]
|
|
148
|
+
// CIL[DOC-MACRO purpose="Resolve multiple link type IDs by slug"]
|
|
149
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Batch resolve link type identifiers from database"]
|
|
150
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
151
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Record<string, string>" errors="link type not found" side_effects="database query"]
|
|
152
|
+
// CIL[DOC-MICRO logic_summary="Batch queries link_types table, validates all requested types exist" notable_decisions="[]"]
|
|
153
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
154
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
155
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
156
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
157
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
158
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
159
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
160
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
42
161
|
export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>> {
|
|
43
162
|
if (slugs.length === 0) return {}
|
|
44
163
|
|
|
@@ -60,14 +179,40 @@ export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string
|
|
|
60
179
|
|
|
61
180
|
return result
|
|
62
181
|
}
|
|
63
|
-
|
|
64
|
-
//
|
|
182
|
+
// CIL[END chunk_id="resolveids_resolvelinktypeids_1784020784"]
|
|
183
|
+
// CIL[BEGIN chunk_id="resolveids_resolvelinktypeid_1784020784" type="function" identity="resolveLinkTypeId" parent="none"]
|
|
184
|
+
// CIL[DOC-MACRO purpose="Resolve single link type ID by slug"]
|
|
185
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get link type identifier from slug"]
|
|
186
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
187
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="link type ID" errors="link type not found" side_effects="database query"]
|
|
188
|
+
// CIL[DOC-MICRO logic_summary="Convenience wrapper around resolveLinkTypeIds for single type" notable_decisions="[]"]
|
|
189
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
190
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
191
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
192
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
193
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
194
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
195
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
196
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
65
197
|
export async function resolveLinkTypeId(slug: string): Promise<string> {
|
|
66
198
|
const ids = await resolveLinkTypeIds([slug])
|
|
67
199
|
return ids[slug]
|
|
68
200
|
}
|
|
69
|
-
|
|
70
|
-
//
|
|
201
|
+
// CIL[END chunk_id="resolveids_resolvelinktypeid_1784020784"]
|
|
202
|
+
// CIL[BEGIN chunk_id="resolveids_resolveaccountid_1784020784" type="function" identity="resolveAccountId" parent="none"]
|
|
203
|
+
// CIL[DOC-MACRO purpose="Resolve account ID by slug"]
|
|
204
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get account identifier from slug"]
|
|
205
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
206
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="account ID" errors="account not found" side_effects="database query"]
|
|
207
|
+
// CIL[DOC-MICRO logic_summary="Queries accounts table by slug to get ID" notable_decisions="[]"]
|
|
208
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
209
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
210
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
211
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
212
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
213
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
214
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
215
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
71
216
|
export async function resolveAccountId(slug: string): Promise<string> {
|
|
72
217
|
const { data, error } = await adminDb
|
|
73
218
|
.from('accounts')
|
|
@@ -78,8 +223,21 @@ export async function resolveAccountId(slug: string): Promise<string> {
|
|
|
78
223
|
if (error || !data) throw new Error(`Account not found: ${slug}`)
|
|
79
224
|
return data.id
|
|
80
225
|
}
|
|
81
|
-
|
|
82
|
-
//
|
|
226
|
+
// CIL[END chunk_id="resolveids_resolveaccountid_1784020784"]
|
|
227
|
+
// CIL[BEGIN chunk_id="resolveids_resolveagentid_1784020784" type="function" identity="resolveAgentId" parent="none"]
|
|
228
|
+
// CIL[DOC-MACRO purpose="Resolve AI agent ID by name"]
|
|
229
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get active AI agent identifier from name"]
|
|
230
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
231
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="agent ID" errors="agent not found" side_effects="database query"]
|
|
232
|
+
// CIL[DOC-MICRO logic_summary="Queries ai_agents table by name and active status" notable_decisions="[]"]
|
|
233
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
234
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
235
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
236
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
237
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
238
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
239
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
240
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
83
241
|
export async function resolveAgentId(name: string): Promise<string> {
|
|
84
242
|
const { data, error } = await adminDb
|
|
85
243
|
.from('ai_agents')
|
|
@@ -91,8 +249,21 @@ export async function resolveAgentId(name: string): Promise<string> {
|
|
|
91
249
|
if (error || !data) throw new Error(`AI agent not found: ${name}`)
|
|
92
250
|
return data.id
|
|
93
251
|
}
|
|
94
|
-
|
|
95
|
-
//
|
|
252
|
+
// CIL[END chunk_id="resolveids_resolveagentid_1784020784"]
|
|
253
|
+
// CIL[BEGIN chunk_id="resolveids_resolvepromptconfigid_1784020784" type="function" identity="resolvePromptConfigId" parent="none"]
|
|
254
|
+
// CIL[DOC-MACRO purpose="Resolve prompt config ID by slug"]
|
|
255
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Get active prompt config identifier from slug"]
|
|
256
|
+
// CIL[DOC-CONTEXT module="resolve-ids" layer="shared" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/layout/Sidebar.tsx\",\".framework/migrations/025_retype_threads_messages.sql\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
257
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="prompt config ID" errors="prompt config not found" side_effects="database query"]
|
|
258
|
+
// CIL[DOC-MICRO logic_summary="Queries prompt_configs table by slug and active status" notable_decisions="[]"]
|
|
259
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
260
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
261
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 4. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/layout/Sidebar.tsx, .framework/migrations/025_retype_threads_messages.sql, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
262
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 4. Total affected: 4."]
|
|
263
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
264
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
265
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
266
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
96
267
|
export async function resolvePromptConfigId(slug: string): Promise<string> {
|
|
97
268
|
const { data, error } = await adminDb
|
|
98
269
|
.from('prompt_configs')
|
|
@@ -104,3 +275,4 @@ export async function resolvePromptConfigId(slug: string): Promise<string> {
|
|
|
104
275
|
if (error || !data) throw new Error(`Prompt config not found: ${slug}`)
|
|
105
276
|
return data.id
|
|
106
277
|
}
|
|
278
|
+
// CIL[END chunk_id="resolveids_resolvepromptconfigid_1784020784"]
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// CIL[BEGIN chunk_id="retry_deliveries_module_header_1784200007" type="module_header" identity="imports" parent="none"]
|
|
2
|
+
// CIL[DOC-MACRO purpose="Retry pending webhook deliveries from the shared ledger"]
|
|
3
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Poll webhook_deliveries and re-execute due outbound (and eventually inbound) records"]
|
|
4
|
+
// CIL[DOC-CONTEXT module="retry-deliveries" layer="shared" related_files="[".framework/functions/integration-outbound.ts",".framework/functions/_shared/principal.ts",".framework/migrations/051_integration_broker.sql"]"]
|
|
5
|
+
// CIL[DOC-CONTRACT inputs="ctx" outputs="{ outbound_retried, outbound_succeeded, outbound_failed, errors }" errors="none" side_effects="HTTP calls, webhook_deliveries updates"]
|
|
6
|
+
// CIL[DOC-MICRO logic_summary="Queries pending, due deliveries and calls the corresponding broker action for each." notable_decisions="["Inbound retry is left as a TODO until integration-routes supports delivery_id reuse.","Outbout retries reuse the existing delivery row by passing delivery_id to integration-outbound.execute."]"]
|
|
7
|
+
// CIL[DOC-CONFIDENCE pass="first" score="0.85" flags="none"]
|
|
8
|
+
// CIL[DOC-STABILITY stability="experimental"]
|
|
9
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
10
|
+
// CIL[DOC-VECTOR type="context" content="Layer: shared. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/integration-outbound.ts, .framework/functions/_shared/principal.ts, .framework/migrations/051_integration_broker.sql."]
|
|
11
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
12
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
13
|
+
// CIL[DOC-VECTOR type="constraint" content="Only processes outbound deliveries in this pass."]
|
|
14
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="Called by system-cron on each tick."]
|
|
15
|
+
// CIL[DOC-VECTOR type="user_journey" content="System automatically retries failed or pending outbound webhook calls."]
|
|
16
|
+
|
|
17
|
+
import { adminDb } from './db'
|
|
18
|
+
import { SYSTEM_PRINCIPAL } from './principal'
|
|
19
|
+
import { execute as executeOutbound } from '../integration-outbound'
|
|
20
|
+
|
|
21
|
+
interface RetrySummary {
|
|
22
|
+
outbound_retried: number
|
|
23
|
+
outbound_succeeded: number
|
|
24
|
+
outbound_failed: number
|
|
25
|
+
inbound_retried: number
|
|
26
|
+
inbound_succeeded: number
|
|
27
|
+
inbound_failed: number
|
|
28
|
+
errors: string[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function retryPendingDeliveries(ctx: any): Promise<RetrySummary> {
|
|
32
|
+
const summary: RetrySummary = {
|
|
33
|
+
outbound_retried: 0,
|
|
34
|
+
outbound_succeeded: 0,
|
|
35
|
+
outbound_failed: 0,
|
|
36
|
+
inbound_retried: 0,
|
|
37
|
+
inbound_succeeded: 0,
|
|
38
|
+
inbound_failed: 0,
|
|
39
|
+
errors: []
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const now = new Date().toISOString()
|
|
43
|
+
|
|
44
|
+
const { data: dueDeliveries, error } = await adminDb
|
|
45
|
+
.from('webhook_deliveries')
|
|
46
|
+
.select('*')
|
|
47
|
+
.eq('status', 'pending')
|
|
48
|
+
.lt('attempt_count', 10)
|
|
49
|
+
.or(`next_attempt_at.is.null,next_attempt_at.lte.${now}`)
|
|
50
|
+
.limit(100)
|
|
51
|
+
|
|
52
|
+
if (error) {
|
|
53
|
+
console.error('[retry-deliveries] Failed to fetch pending deliveries:', error)
|
|
54
|
+
summary.errors.push(error.message)
|
|
55
|
+
return summary
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (!dueDeliveries || dueDeliveries.length === 0) {
|
|
59
|
+
return summary
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const retryCtx = {
|
|
63
|
+
...ctx,
|
|
64
|
+
db: adminDb,
|
|
65
|
+
accountId: null,
|
|
66
|
+
appId: null,
|
|
67
|
+
principal: SYSTEM_PRINCIPAL,
|
|
68
|
+
query: {}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
for (const delivery of dueDeliveries) {
|
|
72
|
+
try {
|
|
73
|
+
if (delivery.direction === 'outbound') {
|
|
74
|
+
summary.outbound_retried++
|
|
75
|
+
|
|
76
|
+
retryCtx.accountId = delivery.account_id
|
|
77
|
+
|
|
78
|
+
await executeOutbound(retryCtx, { delivery_id: delivery.id })
|
|
79
|
+
|
|
80
|
+
summary.outbound_succeeded++
|
|
81
|
+
} else {
|
|
82
|
+
// Inbound retry: not yet implemented. Reprocessing requires the
|
|
83
|
+
// original x-api-key or an internal bypass; integration-routes
|
|
84
|
+
// must be updated to accept delivery_id.
|
|
85
|
+
summary.inbound_retried++
|
|
86
|
+
console.warn(`[retry-deliveries] Inbound delivery retry not implemented: ${delivery.id}`)
|
|
87
|
+
summary.inbound_failed++
|
|
88
|
+
}
|
|
89
|
+
} catch (err: any) {
|
|
90
|
+
console.error(`[retry-deliveries] Delivery ${delivery.id} failed:`, err)
|
|
91
|
+
summary.errors.push(`${delivery.id}: ${err.message || String(err)}`)
|
|
92
|
+
|
|
93
|
+
if (delivery.direction === 'outbound') {
|
|
94
|
+
summary.outbound_failed++
|
|
95
|
+
} else {
|
|
96
|
+
summary.inbound_failed++
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return summary
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// CIL[END chunk_id="retry_deliveries_module_header_1784200007"]
|