spine-framework 0.4.4 → 0.5.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +13 -3
- package/.framework/cli/commands/bootstrap.ts +392 -0
- package/.framework/cli/commands/dev.ts +91 -218
- package/.framework/cli/commands/doctor.ts +132 -26
- package/.framework/cli/commands/generate.ts +38 -298
- package/.framework/cli/commands/init.ts +20 -1
- package/.framework/cli/commands/migrate.ts +36 -30
- package/.framework/cli/commands/migrations.ts +16 -56
- package/.framework/cli/commands/upgrade.ts +35 -0
- package/.framework/cli/commands/validate-schema.ts +147 -0
- package/.framework/cli/context.ts +223 -110
- package/.framework/cli/index.ts +6 -0
- package/.framework/cli/lib/project-files.ts +241 -1
- package/.framework/functions/_shared/hash-api-key.ts +183 -79
- package/.framework/functions/_shared/logging.ts +562 -224
- package/.framework/functions/_shared/middleware.ts +47 -44
- package/.framework/functions/admin-data.ts +39 -28
- package/.framework/functions/ai-agents.ts +10 -6
- package/.framework/functions/api-keys.ts +301 -122
- package/.framework/functions/apps.ts +43 -26
- package/.framework/functions/cil-ingest.ts +48 -15
- package/.framework/functions/debug-auth.ts +14 -8
- package/.framework/functions/deliveries.ts +39 -12
- package/.framework/functions/embeddings.ts +145 -76
- package/.framework/functions/integration-outbound.ts +67 -27
- package/.framework/functions/integrations.ts +254 -127
- package/.framework/functions/logs.ts +273 -133
- package/.framework/functions/observability.ts +277 -147
- package/.framework/functions/pipeline-executions.ts +1 -1
- package/.framework/functions/pipelines.ts +14 -9
- package/.framework/functions/prompt-configs.ts +7 -4
- package/.framework/functions/roles.ts +8 -5
- package/.framework/functions/security.ts +30 -17
- package/.framework/functions/system-cron.ts +240 -127
- package/.framework/functions/tests.ts +7 -6
- package/.framework/functions/timers.ts +310 -107
- package/.framework/functions/triggers.ts +28 -13
- package/.framework/functions/types.ts +13 -10
- package/.framework/migrations/069_log_stats_window.sql +54 -0
- package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
- package/.framework/migrations/071_timer_interval_keys.sql +96 -0
- package/.framework/migrations/072_slug_autofill.sql +77 -0
- package/.framework/migrations/073_seed_member_roles.sql +26 -0
- package/.framework/src/apps/admin/index.tsx +1141 -775
- package/.framework/src/components/ErrorBoundary.tsx +136 -0
- package/.framework/src/components/admin/AdminListPage.tsx +81 -73
- package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
- package/.framework/src/components/admin/EntitySelect.tsx +181 -0
- package/.framework/src/components/admin/PageInstructions.tsx +86 -127
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
- package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
- package/.framework/src/components/layout/Sidebar.tsx +300 -177
- package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
- package/.framework/src/components/runtime/DataHeader.tsx +96 -48
- package/.framework/src/components/runtime/DataListPage.tsx +3 -26
- package/.framework/src/components/runtime/DataStats.tsx +10 -10
- package/.framework/src/components/runtime/DataTable.tsx +12 -10
- package/.framework/src/components/ui/sheet.tsx +24 -26
- package/.framework/src/components/ui/textarea.tsx +74 -48
- package/.framework/src/hooks/useEntityList.ts +12 -9
- package/.framework/src/hooks/useListSchema.ts +108 -58
- package/.framework/src/instructions/README.md +57 -0
- package/.framework/src/instructions/ai-agents.md +69 -0
- package/.framework/src/instructions/alerts.md +80 -0
- package/.framework/src/instructions/api-keys.md +87 -0
- package/.framework/src/instructions/apps.md +77 -0
- package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
- package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
- package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
- package/.framework/src/instructions/concepts/automation.md +186 -0
- package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
- package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
- package/.framework/src/instructions/concepts/design-schema.md +152 -0
- package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
- package/.framework/src/instructions/concepts/observability.md +116 -0
- package/.framework/src/instructions/concepts/permissions.md +150 -0
- package/.framework/src/instructions/concepts/runtime-records.md +111 -0
- package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
- package/.framework/src/instructions/concepts/spine-way.md +172 -0
- package/.framework/src/instructions/deliveries.md +59 -0
- package/.framework/src/instructions/guide/00-orientation.md +106 -0
- package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
- package/.framework/src/instructions/guide/02-project-map.md +147 -0
- package/.framework/src/instructions/guide/03-domain-model.md +223 -0
- package/.framework/src/instructions/guide/04-first-app.md +227 -0
- package/.framework/src/instructions/guide/05-glossary.md +183 -0
- package/.framework/src/instructions/integrations.md +96 -0
- package/.framework/src/instructions/internal/cil-markers.md +83 -0
- package/.framework/src/instructions/invites.md +60 -0
- package/.framework/src/instructions/kb.md +80 -0
- package/.framework/src/instructions/logs.md +77 -0
- package/.framework/src/instructions/observability.md +61 -0
- package/.framework/src/instructions/operations/deployment.md +115 -0
- package/.framework/src/instructions/operations/migrations.md +125 -0
- package/.framework/src/instructions/operations/security-checklist.md +148 -0
- package/.framework/src/instructions/operations/troubleshooting.md +170 -0
- package/.framework/src/instructions/operations/upgrade.md +116 -0
- package/.framework/src/instructions/pipeline-executions.md +62 -0
- package/.framework/src/instructions/pipelines.md +78 -0
- package/.framework/src/instructions/prompts.md +95 -0
- package/.framework/src/instructions/reference/api/admin-data.md +162 -0
- package/.framework/src/instructions/reference/api/auth.md +113 -0
- package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
- package/.framework/src/instructions/reference/app-manifest.md +150 -0
- package/.framework/src/instructions/reference/cli.md +124 -0
- package/.framework/src/instructions/reference/database.md +132 -0
- package/.framework/src/instructions/reference/design-schema.md +280 -0
- package/.framework/src/instructions/reference/env-vars.md +133 -0
- package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
- package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
- package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
- package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
- package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
- package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
- package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
- package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
- package/.framework/src/instructions/reference/functions/apps.md +140 -0
- package/.framework/src/instructions/reference/functions/auth.md +99 -0
- package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
- package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
- package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
- package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
- package/.framework/src/instructions/reference/functions/index.md +103 -0
- package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
- package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
- package/.framework/src/instructions/reference/functions/integrations.md +130 -0
- package/.framework/src/instructions/reference/functions/invites.md +182 -0
- package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
- package/.framework/src/instructions/reference/functions/kb.md +166 -0
- package/.framework/src/instructions/reference/functions/logs.md +141 -0
- package/.framework/src/instructions/reference/functions/observability.md +105 -0
- package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
- package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
- package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
- package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
- package/.framework/src/instructions/reference/functions/roles.md +121 -0
- package/.framework/src/instructions/reference/functions/security.md +140 -0
- package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
- package/.framework/src/instructions/reference/functions/system.md +106 -0
- package/.framework/src/instructions/reference/functions/tests.md +97 -0
- package/.framework/src/instructions/reference/functions/timers.md +117 -0
- package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
- package/.framework/src/instructions/reference/functions/triggers.md +140 -0
- package/.framework/src/instructions/reference/functions/types.md +146 -0
- package/.framework/src/instructions/reference/seeds.md +126 -0
- package/.framework/src/instructions/reference/shared-modules.md +127 -0
- package/.framework/src/instructions/reference/spine-config.md +114 -0
- package/.framework/src/instructions/roles.md +80 -0
- package/.framework/src/instructions/runtime-detail.md +70 -0
- package/.framework/src/instructions/runtime-list.md +77 -0
- package/.framework/src/instructions/security.md +67 -0
- package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
- package/.framework/src/instructions/tasks/add-a-role.md +96 -0
- package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
- package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
- package/.framework/src/instructions/tasks/add-a-type.md +151 -0
- package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
- package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
- package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
- package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
- package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
- package/.framework/src/instructions/tasks/test-your-code.md +108 -0
- package/.framework/src/instructions/tasks/write-a-function.md +132 -0
- package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
- package/.framework/src/instructions/testing.md +59 -0
- package/.framework/src/instructions/timers.md +82 -0
- package/.framework/src/instructions/triggers.md +69 -0
- package/.framework/src/instructions/types.md +93 -0
- package/.framework/src/pages/NotFoundPage.tsx +62 -31
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
- package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
- package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
- package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
- package/.framework/src/pages/admin/AppsPage.tsx +104 -66
- package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
- package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
- package/.framework/src/pages/admin/LogsPage.tsx +144 -76
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
- package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
- package/.framework/src/pages/admin/RolesPage.tsx +86 -43
- package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
- package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
- package/.framework/src/pages/admin/TimersPage.tsx +90 -62
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
- package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
- package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
- package/.framework/src/pages/admin/TypesPage.tsx +90 -48
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
- package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
- package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
- package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
- package/.framework/templates/agent/AGENTS.md +150 -0
- package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
- package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
- package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
- package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
- package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
- package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
- package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
- package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
- package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
- package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
- package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
- package/.framework/templates/project.json +4 -1
- package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
- package/.framework/tests/unit/agent-files.test.ts +355 -0
- package/.framework/tests/unit/agent-runner.test.ts +479 -44
- package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
- package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
- package/.framework/tests/unit/bootstrap.test.ts +242 -0
- package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
- package/.framework/tests/unit/debug-auth.test.ts +38 -0
- package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
- package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
- package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
- package/.framework/tests/unit/logging-app-id.test.ts +75 -0
- package/.framework/tests/unit/system-context-denial.test.ts +145 -0
- package/.framework/tests/unit/system-cron.test.ts +240 -0
- package/.framework/tests/unit/timers.test.ts +159 -0
- package/README.md +125 -166
- package/config/tsconfig.cli.json +2 -2
- package/package.json +15 -4
- package/templates/project/package-lock.json +2 -2
- package/.framework/docs/admin-routes.md +0 -76
- package/.framework/docs/api-docs-progress.md +0 -38
- package/.framework/docs/api-governance.md +0 -146
- package/.framework/docs/api-testing-results.md +0 -212
- package/.framework/docs/assembly-launch-guide.md +0 -138
- package/.framework/docs/audit-results.md +0 -590
- package/.framework/docs/db-api-inventory.md +0 -95
- package/.framework/docs/gap-remediation-backlog.md +0 -103
- package/.framework/docs/ui-adoption-verification.md +0 -111
- package/.framework/docs/ui-api-coverage.md +0 -84
- package/.framework/docs/v2-compatibility-audit.md +0 -228
- package/.framework/mcp/index.ts +0 -133
- package/.framework/mcp/load-env.ts +0 -60
- package/.framework/mcp/shared/app-manifest.ts +0 -275
- package/.framework/mcp/shared/db.ts +0 -477
- package/.framework/mcp/shared/kb.ts +0 -118
- package/.framework/mcp/tools/architect.ts +0 -431
- package/.framework/mcp/tools/cil/context.ts +0 -345
- package/.framework/mcp/tools/cil/graph.ts +0 -242
- package/.framework/mcp/tools/cil/ingest.ts +0 -1217
- package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
- package/.framework/mcp/tools/cil/pipeline.ts +0 -767
- package/.framework/mcp/tools/cil/project.ts +0 -791
- package/.framework/mcp/tools/cil/retrieval.ts +0 -336
- package/.framework/mcp/tools/cil/search-core.ts +0 -454
- package/.framework/mcp/tools/cil/search.ts +0 -97
- package/.framework/mcp/tools/cil/suggest.ts +0 -186
- package/.framework/mcp/tools/cil/validate.ts +0 -1369
- package/.framework/mcp/tools/kb/delete.ts +0 -139
- package/.framework/mcp/tools/kb/index.ts +0 -52
- package/.framework/mcp/tools/kb/ingest.ts +0 -84
- package/.framework/mcp/tools/kb/list-types.ts +0 -102
- package/.framework/mcp/tools/kb/publish.ts +0 -100
- package/.framework/mcp/tools/kb/reindex.ts +0 -86
- package/.framework/mcp/tools/kb/revoke.ts +0 -85
- package/.framework/mcp/tools/kb/search.ts +0 -101
- package/.framework/mcp/tools/kb/upsert.ts +0 -125
- package/.framework/mcp/tools/observability.ts +0 -510
|
@@ -1,57 +1,94 @@
|
|
|
1
1
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/functions/system-cron.ts"]
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
/**
|
|
3
|
+
* @module system-cron
|
|
4
|
+
* @audience both
|
|
5
|
+
* @layer shared-core
|
|
6
|
+
* @stability stable
|
|
7
|
+
*
|
|
8
|
+
* This module handles scheduled tasks within the system, ensuring timely execution of various background processes. It utilizes a multi-step pipeline for task execution, which includes running pipelines and sweeping stale executions. INVARIANT: All scheduled tasks must be executed in a timely manner to maintain system integrity.
|
|
9
|
+
*
|
|
10
|
+
* @seeAlso middleware.ts (provides request handling capabilities).
|
|
11
|
+
* @seeAlso db.ts (manages database interactions).
|
|
12
|
+
* @seeAlso audits.ts (handles audit logging).
|
|
13
|
+
* @seeAlso pipeline-runner.ts (executes task pipelines).
|
|
14
|
+
*
|
|
15
|
+
* @cil-generated
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
10
26
|
import { createHandler, RequestContext } from './_shared/middleware'
|
|
11
27
|
import { adminDb } from './_shared/db'
|
|
12
28
|
import { emitAudit } from './_shared/audit'
|
|
13
29
|
import { runPipeline, sweepStaleExecutions } from './_shared/pipeline-runner'
|
|
14
30
|
import { retryPendingDeliveries } from './_shared/retry-deliveries'
|
|
15
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Imports shared middleware, database, audit, pipeline and retry helpers for the system-cron Netlify function.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
16
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
17
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
18
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
19
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
21
31
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:module_header:module_header"]
|
|
22
32
|
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
23
49
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:SCHEDULER_API_KEY:constant" type="constant" identity="SCHEDULER_API_KEY" parent="~/.framework/functions/system-cron.ts"]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// CIL[DOC-AUDIENCE audience="developers"]
|
|
50
|
+
/**
|
|
51
|
+
* SCHEDULER_API_KEY retrieves the API key for the scheduler from the environment variables to ensure that the application can access the necessary credentials for scheduling tasks.
|
|
52
|
+
*
|
|
53
|
+
* @sideEffects none
|
|
54
|
+
* @stability internal
|
|
55
|
+
* @cil-generated
|
|
56
|
+
*/
|
|
32
57
|
const SCHEDULER_API_KEY: string | undefined = (globalThis as any).process?.env?.SCHEDULER_API_KEY || (globalThis as any).Deno?.env?.get?.('SCHEDULER_API_KEY')
|
|
33
58
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:SCHEDULER_API_KEY:constant"]
|
|
34
59
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
41
76
|
|
|
42
77
|
|
|
43
78
|
|
|
44
79
|
|
|
45
80
|
|
|
46
81
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/system-cron.ts"]
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
82
|
+
/**
|
|
83
|
+
* The handler processes scheduled tasks by validating their execution conditions and executing them if due. It ensures proper authentication and logs unauthorized access attempts.
|
|
84
|
+
*
|
|
85
|
+
* @throws Error — if fetching due schedules or validating schedules fails.
|
|
86
|
+
* @sideEffects DB reads from 'schedules', 'actions', and 'api_keys'; emits audit logs for unauthorized access.
|
|
87
|
+
* @stability internal
|
|
88
|
+
* @calls adminDb.rpc('get_due_schedules'), adminDb.rpc('validate_schedule_creator'), adminDb.from('actions'), adminDb.from('api_keys')
|
|
89
|
+
* @errorHandling logs errors to the console without throwing them further.
|
|
90
|
+
* @cil-generated
|
|
91
|
+
*/
|
|
55
92
|
export const handler = createHandler(async (ctx: RequestContext) => {
|
|
56
93
|
const requestApiKey = ctx.query?.api_key || ctx.query?.scheduler_key
|
|
57
94
|
|
|
@@ -95,18 +132,9 @@ export const handler = createHandler(async (ctx: RequestContext) => {
|
|
|
95
132
|
throw new Error(`Failed to fetch due schedules: ${schedulesError.message}`)
|
|
96
133
|
}
|
|
97
134
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
body: JSON.stringify({
|
|
102
|
-
message: 'No schedules due for execution',
|
|
103
|
-
executed: 0,
|
|
104
|
-
results: []
|
|
105
|
-
})
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
for (const schedule of dueSchedules) {
|
|
135
|
+
// An empty schedule list must not end the tick: due timers, threshold
|
|
136
|
+
// alerts, delivery retries, and log cleanup below run every minute.
|
|
137
|
+
for (const schedule of dueSchedules || []) {
|
|
110
138
|
const startTime = Date.now()
|
|
111
139
|
|
|
112
140
|
try {
|
|
@@ -348,13 +376,19 @@ export const handler = createHandler(async (ctx: RequestContext) => {
|
|
|
348
376
|
const failedCount = results.filter(r => r.status === 'failed').length
|
|
349
377
|
const skippedCount = results.filter(r => r.status === 'skipped').length
|
|
350
378
|
|
|
351
|
-
|
|
379
|
+
let retrySummary = null
|
|
380
|
+
try {
|
|
381
|
+
retrySummary = await retryPendingDeliveries(ctx)
|
|
382
|
+
} catch (retryError) {
|
|
383
|
+
console.error('Delivery retry error:', retryError)
|
|
384
|
+
}
|
|
352
385
|
|
|
353
386
|
return {
|
|
354
387
|
statusCode: 200,
|
|
355
388
|
body: JSON.stringify({
|
|
356
389
|
message: `Executed ${results.length} total (schedules + timers)`,
|
|
357
390
|
executed: results.length,
|
|
391
|
+
schedules_due: dueSchedules?.length || 0,
|
|
358
392
|
success: successCount,
|
|
359
393
|
failed: failedCount,
|
|
360
394
|
skipped: skippedCount,
|
|
@@ -386,22 +420,41 @@ export const handler = createHandler(async (ctx: RequestContext) => {
|
|
|
386
420
|
}
|
|
387
421
|
}
|
|
388
422
|
})
|
|
389
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Netlify function entrypoint that runs scheduled actions, timers, threshold checks, retries and daily log cleanup.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
390
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
391
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
392
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
393
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
394
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
395
423
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:handler:constant"]
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Executes a specified action by delegating to the appropriate handler based on the action's module type. This function facilitates the execution of different types of actions within the system.
|
|
442
|
+
*
|
|
443
|
+
* @macro Action executor that routes to specific handler implementations.
|
|
444
|
+
* @micro Merges action-specific and provided configuration before invoking the appropriate handler function.
|
|
445
|
+
* @inputSpec
|
|
446
|
+
* - ctx: RequestContext (required) — the context for the request execution.
|
|
447
|
+
* - action: any (required) — the action object containing handler information.
|
|
448
|
+
* - config: any (required) — additional configuration to merge with the action's config.
|
|
449
|
+
* @outputSpec Promise<any> — resolves to the result of the executed action handler.
|
|
450
|
+
* @throws Error — Custom handlers not yet implemented: <handlerName>
|
|
451
|
+
Error — Unknown handler module: <handlerModule>
|
|
396
452
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:executeAction:function" type="function" identity="executeAction" parent="~/.framework/functions/system-cron.ts"]
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
403
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
404
|
-
// CIL[DOC-AUDIENCE audience="developers"]
|
|
453
|
+
* @sideEffects none
|
|
454
|
+
* @stability internal
|
|
455
|
+
* @calls executeFunctionHandler, executeIntegrationHandler
|
|
456
|
+
* @cil-generated
|
|
457
|
+
*/
|
|
405
458
|
async function executeAction(
|
|
406
459
|
ctx: RequestContext,
|
|
407
460
|
action: any,
|
|
@@ -429,22 +482,41 @@ async function executeAction(
|
|
|
429
482
|
throw new Error(`Unknown handler module: ${handlerModule}`)
|
|
430
483
|
}
|
|
431
484
|
}
|
|
432
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Dispatches an action to the appropriate handler module (functions, integrations or custom).'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
433
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
434
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
435
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
436
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
437
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
438
485
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:executeAction:function"]
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
439
502
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:executeFunctionHandler:function" type="function" identity="executeFunctionHandler" parent="~/.framework/functions/system-cron.ts"]
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
503
|
+
/**
|
|
504
|
+
* Executes a specified function handler based on the provided handler name and configuration. This module facilitates various operations such as sending emails, generating reports, notifying watchers, and running pipelines.
|
|
505
|
+
*
|
|
506
|
+
* @macro Function dispatcher for executing predefined asynchronous handlers.
|
|
507
|
+
* @micro Uses a record of handler functions indexed by name to dynamically invoke the appropriate operation.
|
|
508
|
+
* @inputSpec
|
|
509
|
+
* ctx: RequestContext (required) — the context for the request.
|
|
510
|
+
* handlerName: string (required) — the name of the handler to execute.
|
|
511
|
+
* config: any (required) — configuration object for the handler.
|
|
512
|
+
* @outputSpec Promise<any> — resolves to the result of the executed handler, which varies based on the handler type.
|
|
513
|
+
* @throws Error — Unknown function handler: handlerName
|
|
514
|
+
* @sideEffects Logs to the console for each handler execution.
|
|
515
|
+
* @stability internal
|
|
516
|
+
* @calls runPipeline
|
|
517
|
+
* @errorHandling none
|
|
518
|
+
* @cil-generated
|
|
519
|
+
*/
|
|
448
520
|
async function executeFunctionHandler(
|
|
449
521
|
ctx: RequestContext,
|
|
450
522
|
handlerName: string,
|
|
@@ -491,21 +563,35 @@ async function executeFunctionHandler(
|
|
|
491
563
|
return await handler(ctx, config)
|
|
492
564
|
}
|
|
493
565
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:executeFunctionHandler:function"]
|
|
566
|
+
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
|
|
494
582
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:executeIntegrationHandler:function" type="function" identity="executeIntegrationHandler" parent="~/.framework/functions/system-cron.ts"]
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
// CIL[DOC-STABILITY stability="experimental"]
|
|
508
|
-
// CIL[DOC-AUDIENCE audience="developers"]
|
|
583
|
+
/**
|
|
584
|
+
* Executes an integration handler based on the provided handler name and configuration. This function facilitates the execution of various integration tasks within the system.
|
|
585
|
+
*
|
|
586
|
+
* @inputSpec
|
|
587
|
+
* ctx: RequestContext (required) — the context of the request including metadata.
|
|
588
|
+
* handlerName: string (required) — the name of the integration handler to execute.
|
|
589
|
+
* config: any (required) — configuration parameters for the integration handler.
|
|
590
|
+
* @outputSpec Promise<any> — returns an object indicating execution status and the handler name.
|
|
591
|
+
* @sideEffects logs the execution details to the console
|
|
592
|
+
* @stability internal
|
|
593
|
+
* @cil-generated
|
|
594
|
+
*/
|
|
509
595
|
async function executeIntegrationHandler(
|
|
510
596
|
ctx: RequestContext,
|
|
511
597
|
handlerName: string,
|
|
@@ -514,22 +600,38 @@ async function executeIntegrationHandler(
|
|
|
514
600
|
console.log(`[${ctx.requestId}] Integration handler: ${handlerName}`, config)
|
|
515
601
|
return { executed: true, handler: handlerName }
|
|
516
602
|
}
|
|
517
|
-
// CIL[DOC-VECTOR type="context" content="purpose='Stub for integration-based action handlers.'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts,.framework/functions/_shared/audit.ts"]
|
|
518
|
-
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
519
|
-
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
520
|
-
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
521
|
-
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
522
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
523
603
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:executeIntegrationHandler:function"]
|
|
604
|
+
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
|
|
611
|
+
|
|
612
|
+
|
|
613
|
+
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
|
|
524
620
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:evaluateThresholds:function" type="function" identity="evaluateThresholds" parent="~/.framework/functions/system-cron.ts"]
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
621
|
+
/**
|
|
622
|
+
* Evaluates active thresholds for various metrics to determine if they have been breached, potentially triggering associated pipelines. This function is essential for monitoring system performance and alerting based on predefined criteria.
|
|
623
|
+
*
|
|
624
|
+
* @macro Async function responsible for evaluating threshold alerts and managing pipeline executions.
|
|
625
|
+
* @micro Iterates through active thresholds, fetching metric data via RPC calls and assessing breaches based on specified operators.
|
|
626
|
+
* @inputSpec
|
|
627
|
+
* ctx: RequestContext (required) — the context for the request containing necessary information for processing.
|
|
628
|
+
* @outputSpec Promise<Array<{thresholdId: string, breached: boolean, fired: boolean}>> — an array of objects indicating the threshold ID, breach status, and whether the associated pipeline was fired.
|
|
629
|
+
* @sideEffects DB reads from 'threshold_alerts', RPC calls to fetch metric data, potential DB writes when triggering pipelines.
|
|
630
|
+
* @stability internal
|
|
631
|
+
* @calls adminDb.from('threshold_alerts'), adminDb.rpc('get_error_rate'), adminDb.rpc('get_latency_percentiles'), adminDb.rpc('get_pipeline_stats'), runPipeline
|
|
632
|
+
* @errorHandling logs errors to the console but does not throw them.
|
|
633
|
+
* @cil-generated
|
|
634
|
+
*/
|
|
533
635
|
async function evaluateThresholds(ctx: RequestContext): Promise<Array<{thresholdId: string, breached: boolean, fired: boolean}>> {
|
|
534
636
|
const results: Array<{thresholdId: string, breached: boolean, fired: boolean}> = []
|
|
535
637
|
|
|
@@ -656,25 +758,36 @@ async function evaluateThresholds(ctx: RequestContext): Promise<Array<{threshold
|
|
|
656
758
|
}
|
|
657
759
|
}
|
|
658
760
|
// CIL[END stable_id="~/.framework/functions/system-cron.ts:evaluateThresholds:function"]
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
|
|
659
777
|
// CIL[BEGIN stable_id="~/.framework/functions/system-cron.ts:cleanupOldLogs:function" type="function" identity="cleanupOldLogs" parent="~/.framework/functions/system-cron.ts"]
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
// CIL[DOC-CONTRACT inputs="none" outputs="number of deleted records" errors="Logs cleanup errors and returns 0 on failure." side_effects="Calls the cleanup_old_logs RPC which deletes old log records."]
|
|
670
|
-
// CIL[DOC-MICRO logic_summary="Calls the cleanup_old_logs RPC with a 90-day retention and returns the deleted count, logging any errors." notable_decisions="Uses a fixed 90-day retention window; deletion count is read from the first row of the RPC result."]
|
|
671
|
-
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
672
|
-
// CIL[DOC-STABILITY stability="stable"]
|
|
673
|
-
// CIL[DOC-AUDIENCE audience="developers"]
|
|
778
|
+
/**
|
|
779
|
+
* Cleans up old log records that are older than a specified retention period to maintain the database by removing unnecessary log entries.
|
|
780
|
+
*
|
|
781
|
+
* @outputSpec Promise<number> - returns the count of deleted log records.
|
|
782
|
+
* @sideEffects Makes an RPC call to 'cleanup_old_logs' in the database.
|
|
783
|
+
* @stability internal
|
|
784
|
+
* @calls adminDb.rpc
|
|
785
|
+
* @cil-generated
|
|
786
|
+
*/
|
|
674
787
|
async function cleanupOldLogs(): Promise<number> {
|
|
675
788
|
try {
|
|
676
789
|
const { data, error } = await adminDb.rpc('cleanup_old_logs', {
|
|
677
|
-
p_retention_days:
|
|
790
|
+
p_retention_days: 30
|
|
678
791
|
})
|
|
679
792
|
|
|
680
793
|
if (error) {
|
|
@@ -693,10 +806,10 @@ async function cleanupOldLogs(): Promise<number> {
|
|
|
693
806
|
return 0
|
|
694
807
|
}
|
|
695
808
|
}
|
|
696
|
-
// CIL[
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
809
|
+
// CIL[END stable_id="~/.framework/functions/system-cron.ts:cleanupOldLogs:function"]
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
|
|
@@ -11,14 +11,13 @@
|
|
|
11
11
|
|
|
12
12
|
import { createHandler, requireSystemContextWithAudit } from './_shared/middleware'
|
|
13
13
|
import { adminDb } from './_shared/db'
|
|
14
|
+
// CIL[END stable_id="~/.framework/functions/tests.ts:module_header:module_header"]
|
|
14
15
|
// CIL[DOC-VECTOR type="context" content="purpose='Module setup and imports for tests.ts'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts"]
|
|
15
16
|
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
16
17
|
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
17
18
|
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
18
19
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
20
|
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
20
|
-
// CIL[END stable_id="~/.framework/functions/tests.ts:module_header:module_header"]
|
|
21
|
-
// CIL[BEGIN stable_id="~/.framework/functions/tests.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/tests.ts"]
|
|
22
21
|
// CIL[DOC-MACRO purpose="Define the handler constant"]
|
|
23
22
|
// CIL[DOC-RESPONSIBILITY responsibility="Expose the handler value to consumers"]
|
|
24
23
|
// CIL[DOC-CONTEXT module=".framework/functions/tests.ts" layer="functions" related_files=".framework/functions/_shared/db.ts,.framework/functions/_shared/middleware.ts,.framework/functions/tests.ts"]
|
|
@@ -26,9 +25,11 @@ import { adminDb } from './_shared/db'
|
|
|
26
25
|
// CIL[DOC-MICRO logic_summary="Binds the expression to the handler identifier" notable_decisions="[]"]
|
|
27
26
|
// CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
|
|
28
27
|
// CIL[DOC-STABILITY stability="stable"]
|
|
28
|
+
// CIL[BEGIN stable_id="~/.framework/functions/tests.ts:handler:constant" type="constant" identity="handler" parent="~/.framework/functions/tests.ts"]
|
|
29
29
|
export const handler = createHandler(async (ctx) => {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Throws a statusCode-carrying error on denial; createHandler maps it to a
|
|
31
|
+
// real HTTP 401/403 (F-051).
|
|
32
|
+
requireSystemContextWithAudit(ctx)
|
|
32
33
|
|
|
33
34
|
const q = (ctx as any).query || {}
|
|
34
35
|
const action = q.action || 'list'
|
|
@@ -114,10 +115,10 @@ export const handler = createHandler(async (ctx) => {
|
|
|
114
115
|
|
|
115
116
|
return { data: data ?? [], error: null }
|
|
116
117
|
})
|
|
118
|
+
// CIL[END stable_id="~/.framework/functions/tests.ts:handler:constant"]
|
|
117
119
|
// CIL[DOC-VECTOR type="context" content="purpose='Define the handler constant'; No verified external callers; imports: .framework/functions/_shared/middleware.ts,.framework/functions/_shared/db.ts"]
|
|
118
120
|
// CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
|
|
119
121
|
// CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
|
|
120
122
|
// CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
|
|
121
123
|
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
122
|
-
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
123
|
-
// CIL[END stable_id="~/.framework/functions/tests.ts:handler:constant"]
|
|
124
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|