spine-framework 0.4.3 → 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.
Files changed (320) hide show
  1. package/.env.example +13 -3
  2. package/.framework/cli/commands/bootstrap.ts +392 -0
  3. package/.framework/cli/commands/dev.ts +91 -218
  4. package/.framework/cli/commands/doctor.ts +132 -26
  5. package/.framework/cli/commands/generate.ts +38 -298
  6. package/.framework/cli/commands/init.ts +20 -1
  7. package/.framework/cli/commands/migrate.ts +36 -30
  8. package/.framework/cli/commands/migrations.ts +16 -56
  9. package/.framework/cli/commands/upgrade.ts +35 -0
  10. package/.framework/cli/commands/validate-schema.ts +147 -0
  11. package/.framework/cli/context.ts +223 -110
  12. package/.framework/cli/index.ts +6 -0
  13. package/.framework/cli/lib/project-files.ts +241 -1
  14. package/.framework/functions/_shared/agent-runner.ts +1000 -81
  15. package/.framework/functions/_shared/cil.ts +2 -1
  16. package/.framework/functions/_shared/db.ts +3 -6
  17. package/.framework/functions/_shared/hash-api-key.ts +183 -79
  18. package/.framework/functions/_shared/kb.ts +61 -7
  19. package/.framework/functions/_shared/logging.ts +562 -224
  20. package/.framework/functions/_shared/message-sequence.ts +53 -0
  21. package/.framework/functions/_shared/middleware.ts +47 -44
  22. package/.framework/functions/_shared/pipeline-runner.ts +150 -37
  23. package/.framework/functions/_shared/principal.ts +9 -6
  24. package/.framework/functions/_shared/trigger-engine.ts +149 -40
  25. package/.framework/functions/admin-data.ts +48 -31
  26. package/.framework/functions/ai-agents.ts +103 -33
  27. package/.framework/functions/api-keys.ts +301 -122
  28. package/.framework/functions/apps.ts +43 -26
  29. package/.framework/functions/cil-ingest.ts +48 -15
  30. package/.framework/functions/debug-auth.ts +14 -8
  31. package/.framework/functions/deliveries.ts +39 -12
  32. package/.framework/functions/embeddings.ts +145 -76
  33. package/.framework/functions/integration-outbound.ts +67 -27
  34. package/.framework/functions/integrations.ts +254 -127
  35. package/.framework/functions/logs.ts +273 -133
  36. package/.framework/functions/observability.ts +277 -147
  37. package/.framework/functions/pipeline-executions.ts +1 -1
  38. package/.framework/functions/pipeline-runner-background.ts +120 -0
  39. package/.framework/functions/pipelines.ts +14 -9
  40. package/.framework/functions/prompt-configs.ts +7 -4
  41. package/.framework/functions/roles.ts +8 -5
  42. package/.framework/functions/security.ts +30 -17
  43. package/.framework/functions/system-cron.ts +250 -128
  44. package/.framework/functions/tests.ts +7 -6
  45. package/.framework/functions/timers.ts +310 -107
  46. package/.framework/functions/trigger-scheduler.ts +65 -5
  47. package/.framework/functions/triggers.ts +28 -13
  48. package/.framework/functions/types.ts +13 -10
  49. package/.framework/migrations/064_episode_leases.sql +196 -0
  50. package/.framework/migrations/065_execution_tables_updated_at.sql +20 -0
  51. package/.framework/migrations/066_episode_steal_thread_merge.sql +148 -0
  52. package/.framework/migrations/067_episode_lease_stale_steal.sql +93 -0
  53. package/.framework/migrations/068_cron_schedule_timer_rpcs.sql +251 -0
  54. package/.framework/migrations/069_log_stats_window.sql +54 -0
  55. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  56. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  57. package/.framework/migrations/072_slug_autofill.sql +77 -0
  58. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  59. package/.framework/schemas/spine.config.schema.json +62 -0
  60. package/.framework/src/App.tsx +3 -1
  61. package/.framework/src/apps/admin/index.tsx +1141 -775
  62. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  63. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  64. package/.framework/src/components/admin/AdminSidebar.tsx +92 -81
  65. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  66. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  67. package/.framework/src/components/app-shell/GenericAppShell.tsx +3 -1
  68. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  69. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  70. package/.framework/src/components/auth/TurnstileWidget.tsx +9 -6
  71. package/.framework/src/components/kb/KBArticleEditor.tsx +49 -6
  72. package/.framework/src/components/layout/Layout.tsx +4 -2
  73. package/.framework/src/components/layout/Sidebar.tsx +304 -179
  74. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  75. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  76. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  77. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  78. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  79. package/.framework/src/components/ui/sheet.tsx +24 -26
  80. package/.framework/src/components/ui/textarea.tsx +74 -48
  81. package/.framework/src/hooks/useBranding.ts +47 -0
  82. package/.framework/src/hooks/useEntityList.ts +12 -9
  83. package/.framework/src/hooks/useListSchema.ts +108 -58
  84. package/.framework/src/instructions/README.md +57 -0
  85. package/.framework/src/instructions/ai-agents.md +69 -0
  86. package/.framework/src/instructions/alerts.md +80 -0
  87. package/.framework/src/instructions/api-keys.md +87 -0
  88. package/.framework/src/instructions/apps.md +77 -0
  89. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  90. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  91. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  92. package/.framework/src/instructions/concepts/automation.md +186 -0
  93. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  94. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  95. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  96. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  97. package/.framework/src/instructions/concepts/observability.md +116 -0
  98. package/.framework/src/instructions/concepts/permissions.md +150 -0
  99. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  100. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  101. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  102. package/.framework/src/instructions/deliveries.md +59 -0
  103. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  104. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  105. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  106. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  107. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  108. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  109. package/.framework/src/instructions/integrations.md +96 -0
  110. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  111. package/.framework/src/instructions/invites.md +60 -0
  112. package/.framework/src/instructions/kb.md +80 -0
  113. package/.framework/src/instructions/logs.md +77 -0
  114. package/.framework/src/instructions/observability.md +61 -0
  115. package/.framework/src/instructions/operations/deployment.md +115 -0
  116. package/.framework/src/instructions/operations/migrations.md +125 -0
  117. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  118. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  119. package/.framework/src/instructions/operations/upgrade.md +116 -0
  120. package/.framework/src/instructions/pipeline-executions.md +62 -0
  121. package/.framework/src/instructions/pipelines.md +78 -0
  122. package/.framework/src/instructions/prompts.md +95 -0
  123. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  124. package/.framework/src/instructions/reference/api/auth.md +113 -0
  125. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  126. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  127. package/.framework/src/instructions/reference/cli.md +124 -0
  128. package/.framework/src/instructions/reference/database.md +132 -0
  129. package/.framework/src/instructions/reference/design-schema.md +280 -0
  130. package/.framework/src/instructions/reference/env-vars.md +133 -0
  131. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  132. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  133. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  134. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  135. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  136. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  137. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  138. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  139. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  140. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  141. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  142. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  143. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  144. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  145. package/.framework/src/instructions/reference/functions/index.md +103 -0
  146. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  147. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  148. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  149. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  150. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  151. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  152. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  153. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  154. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  155. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  156. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  157. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  158. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  159. package/.framework/src/instructions/reference/functions/security.md +140 -0
  160. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  161. package/.framework/src/instructions/reference/functions/system.md +106 -0
  162. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  163. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  164. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  165. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  166. package/.framework/src/instructions/reference/functions/types.md +146 -0
  167. package/.framework/src/instructions/reference/seeds.md +126 -0
  168. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  169. package/.framework/src/instructions/reference/spine-config.md +114 -0
  170. package/.framework/src/instructions/roles.md +80 -0
  171. package/.framework/src/instructions/runtime-detail.md +70 -0
  172. package/.framework/src/instructions/runtime-list.md +77 -0
  173. package/.framework/src/instructions/security.md +67 -0
  174. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  175. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  176. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  177. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  178. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  179. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  180. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  181. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  182. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  183. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  184. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  185. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  186. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  187. package/.framework/src/instructions/testing.md +59 -0
  188. package/.framework/src/instructions/timers.md +82 -0
  189. package/.framework/src/instructions/triggers.md +69 -0
  190. package/.framework/src/instructions/types.md +93 -0
  191. package/.framework/src/lib/branding.ts +128 -0
  192. package/.framework/src/pages/NoAppPage.tsx +3 -1
  193. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  194. package/.framework/src/pages/SetupPage.tsx +5 -2
  195. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  196. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  197. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  198. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  199. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  200. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  201. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  202. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  203. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  204. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  205. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  206. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  207. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  208. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  209. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  210. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  211. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  212. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  213. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  214. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  215. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  216. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  217. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  218. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  219. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  220. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  221. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  222. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  223. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  224. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  225. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  226. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  227. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  228. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  229. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  230. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  231. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  232. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  233. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  234. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  235. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  236. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  237. package/.framework/src/pages/auth/AuthConfirmPage.tsx +3 -1
  238. package/.framework/src/pages/auth/ForgotPasswordPage.tsx +3 -1
  239. package/.framework/src/pages/auth/LoginPage.tsx +4 -2
  240. package/.framework/src/pages/auth/RegisterPage.tsx +3 -1
  241. package/.framework/templates/agent/AGENTS.md +150 -0
  242. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  243. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  244. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  245. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  246. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  247. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  248. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  249. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  250. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  251. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  252. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  253. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  254. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  255. package/.framework/templates/project.json +5 -1
  256. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  257. package/.framework/tests/unit/agent-files.test.ts +355 -0
  258. package/.framework/tests/unit/agent-runner.test.ts +496 -47
  259. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  260. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  261. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  262. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  263. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  264. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  265. package/.framework/tests/unit/episode-lease.test.ts +695 -0
  266. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  267. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  268. package/.framework/tests/unit/kb-ingest-lease.test.ts +19 -0
  269. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  270. package/.framework/tests/unit/pipeline-runner-background.test.ts +120 -0
  271. package/.framework/tests/unit/pipeline-runner.test.ts +153 -1
  272. package/.framework/tests/unit/principal-cache.test.ts +15 -0
  273. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  274. package/.framework/tests/unit/system-cron.test.ts +240 -0
  275. package/.framework/tests/unit/timers.test.ts +159 -0
  276. package/.framework/tests/unit/trigger-engine.test.ts +278 -91
  277. package/.framework/tests/unit/trigger-scheduler.test.ts +78 -0
  278. package/README.md +125 -166
  279. package/config/tsconfig.cli.json +2 -2
  280. package/netlify.toml +5 -0
  281. package/package.json +15 -4
  282. package/templates/project/package-lock.json +2 -2
  283. package/.framework/docs/admin-routes.md +0 -76
  284. package/.framework/docs/api-docs-progress.md +0 -38
  285. package/.framework/docs/api-governance.md +0 -146
  286. package/.framework/docs/api-testing-results.md +0 -212
  287. package/.framework/docs/assembly-launch-guide.md +0 -138
  288. package/.framework/docs/audit-results.md +0 -590
  289. package/.framework/docs/db-api-inventory.md +0 -95
  290. package/.framework/docs/gap-remediation-backlog.md +0 -103
  291. package/.framework/docs/ui-adoption-verification.md +0 -111
  292. package/.framework/docs/ui-api-coverage.md +0 -84
  293. package/.framework/docs/v2-compatibility-audit.md +0 -228
  294. package/.framework/mcp/index.ts +0 -133
  295. package/.framework/mcp/load-env.ts +0 -60
  296. package/.framework/mcp/shared/app-manifest.ts +0 -275
  297. package/.framework/mcp/shared/db.ts +0 -477
  298. package/.framework/mcp/shared/kb.ts +0 -118
  299. package/.framework/mcp/tools/architect.ts +0 -431
  300. package/.framework/mcp/tools/cil/context.ts +0 -345
  301. package/.framework/mcp/tools/cil/graph.ts +0 -242
  302. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  303. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  304. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  305. package/.framework/mcp/tools/cil/project.ts +0 -791
  306. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  307. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  308. package/.framework/mcp/tools/cil/search.ts +0 -97
  309. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  310. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  311. package/.framework/mcp/tools/kb/delete.ts +0 -139
  312. package/.framework/mcp/tools/kb/index.ts +0 -52
  313. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  314. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  315. package/.framework/mcp/tools/kb/publish.ts +0 -100
  316. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  317. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  318. package/.framework/mcp/tools/kb/search.ts +0 -101
  319. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  320. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,477 +0,0 @@
1
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/db.ts:mcp_db:file" type="file" identity="mcp_db" parent="~/.framework/mcp/shared/db.ts"]
2
- // CIL[DOC-MACRO purpose="MCP admin-data proxy query builder and type resolver for the Spine framework."]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Provides a fluent Query class that proxies Supabase-style requests to the admin-data Netlify function, plus helpers to resolve type and link type IDs."]
4
- // CIL[DOC-CONTEXT module="mcp" layer="shared" related_files=".framework/mcp/shared/db.ts"]
5
- // CIL[DOC-CONTRACT inputs="table names, filters, sort/limit options, insert/update/delete payloads" outputs="records or {data,error} shaped results" errors="Environment missing, network/HTTP errors, record not found" side_effects="Makes fetch calls to the Spine admin-data and function endpoints."]
6
- // CIL[DOC-MICRO logic_summary="Builds URL query parameters, applies client-side filters/sorting, handles single/maybeSingle semantics, and routes apps/embeddings tables to dedicated function endpoints." notable_decisions="admin-data does not support upsert; apps/embeddings writes are rejected; RPC only supports match_embeddings."]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
-
10
- import { randomUUID } from 'node:crypto'
11
-
12
- const SPINE_URL = process.env.SPINE_URL || process.env.URL || ''
13
-
14
- const API_KEY = process.env.SPINE_API_KEY || process.env.SPINE_FRAMEWORK_API_KEY || ''
15
-
16
- function baseUrl(): string {
17
- if (!SPINE_URL) throw new Error('SPINE_URL environment variable is required')
18
- return SPINE_URL.replace(/\/$/, '')
19
- }
20
-
21
- function headers(): Record<string, string> {
22
- if (!API_KEY) throw new Error('SPINE_API_KEY environment variable is required')
23
- return {
24
- 'Content-Type': 'application/json',
25
- 'X-Api-Key': API_KEY,
26
- 'X-Request-ID': randomUUID(),
27
- 'X-Source': 'spine-framework-mcp',
28
- }
29
- }
30
-
31
- async function handleResponse<T>(res: Response): Promise<T> {
32
- const body = await res.json().catch(() => ({}))
33
- if (!res.ok) {
34
- throw new Error(body?.error || body?.message || `request failed: ${res.status}`)
35
- }
36
- if (body && 'data' in body) {
37
- return body.data as T
38
- }
39
- return body as T
40
- }
41
-
42
- async function fetchAdminData(
43
- entity: string,
44
- action: 'list' | 'get' | 'create' | 'update' | 'remove' | 'stats',
45
- query: Record<string, any> = {},
46
- body?: Record<string, any>
47
- ): Promise<any> {
48
- const methodMap: Record<string, string> = {
49
- list: 'GET',
50
- get: 'GET',
51
- stats: 'GET',
52
- create: 'POST',
53
- update: 'PATCH',
54
- remove: 'DELETE',
55
- }
56
- const method = methodMap[action]
57
- const params: Record<string, any> = { ...query, action, entity, method }
58
- const qs = new URLSearchParams(params as Record<string, string>).toString()
59
- const init: RequestInit = { method, headers: headers() }
60
- if (body && (action === 'create' || action === 'update')) {
61
- init.body = JSON.stringify(body)
62
- }
63
- const res = await fetch(`${baseUrl()}/.netlify/functions/admin-data?${qs}`, init)
64
- const data = await handleResponse<any>(res)
65
- if (Array.isArray(data)) return data
66
- return data
67
- }
68
-
69
- export async function fetchFunction(functionName: string, action: string, query: Record<string, any> = {}, body?: Record<string, any>): Promise<any> {
70
- const method = body ? 'POST' : 'GET'
71
- const params: Record<string, any> = { ...query, action, method }
72
- const qs = new URLSearchParams(params as Record<string, string>).toString()
73
- const init: RequestInit = { method, headers: headers() }
74
- if (body) init.body = JSON.stringify(body)
75
- const res = await fetch(`${baseUrl()}/.netlify/functions/${functionName}?${qs}`, init)
76
- return handleResponse<any>(res)
77
- }
78
-
79
- type Filter = { key: string; op: string; value: any }
80
-
81
- type Sort = { field: string; ascending: boolean }
82
-
83
- class Query {
84
- private table: string
85
- private columns = '*'
86
- private count = false
87
- private head = false
88
- private _single = false
89
- private _maybeSingle = false
90
- private filters: Filter[] = []
91
- private sorts: Sort[] = []
92
- private limitN?: number
93
- private rangeFrom?: number
94
- private rangeTo?: number
95
- private insertData?: any
96
- private updateData?: any
97
- private deleteFlag = false
98
- private selectAfterInsert = false
99
-
100
- constructor(table: string) {
101
- this.table = table
102
- }
103
-
104
- select(columns?: string, opts?: { count?: 'exact'; head?: boolean }) {
105
- if (columns) this.columns = columns
106
- if (opts) {
107
- this.count = opts.count === 'exact'
108
- this.head = !!opts.head
109
- }
110
- return this
111
- }
112
-
113
- eq(key: string, value: any) {
114
- this.filters.push({ key, op: 'eq', value })
115
- return this
116
- }
117
-
118
- filter(key: string, op: string, value: any) {
119
- this.filters.push({ key, op, value })
120
- return this
121
- }
122
-
123
- in(key: string, values: any[]) {
124
- this.filters.push({ key, op: 'in', value: values })
125
- return this
126
- }
127
-
128
- order(field: string, opts?: { ascending?: boolean }) {
129
- this.sorts.push({ field, ascending: opts?.ascending !== false })
130
- return this
131
- }
132
-
133
- limit(n: number) {
134
- this.limitN = n
135
- return this
136
- }
137
-
138
- range(from: number, to: number) {
139
- this.rangeFrom = from
140
- this.rangeTo = to
141
- return this
142
- }
143
-
144
- ilike(key: string, value: any) {
145
- this.filters.push({ key, op: 'ilike', value })
146
- return this
147
- }
148
-
149
- lte(key: string, value: any) {
150
- this.filters.push({ key, op: 'lte', value })
151
- return this
152
- }
153
-
154
- gte(key: string, value: any) {
155
- this.filters.push({ key, op: 'gte', value })
156
- return this
157
- }
158
-
159
- neq(key: string, value: any) {
160
- this.filters.push({ key, op: 'neq', value })
161
- return this
162
- }
163
-
164
- maybeSingle() {
165
- this._maybeSingle = true
166
- return this
167
- }
168
-
169
- single() {
170
- this._single = true
171
- return this
172
- }
173
-
174
- insert(data: any) {
175
- this.insertData = data
176
- return this
177
- }
178
-
179
- update(data: any) {
180
- this.updateData = data
181
- return this
182
- }
183
-
184
- upsert(data: any) {
185
- // admin-data does not support upsert; treat as create
186
- this.insertData = data
187
- return this
188
- }
189
-
190
- delete() {
191
- this.deleteFlag = true
192
- return this
193
- }
194
-
195
- contains(key: string, value: any) {
196
- this.filters.push({ key, op: 'contains', value })
197
- return this
198
- }
199
-
200
- then<TResult1 = any, TResult2 = never>(
201
- onfulfilled?: ((value: any) => TResult1 | PromiseLike<TResult1>) | undefined | null,
202
- onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null
203
- ): Promise<TResult1 | TResult2> {
204
- return this.execute().then(onfulfilled, onrejected)
205
- }
206
-
207
- private async execute(): Promise<any> {
208
- if (this.table === 'apps') return this.executeApps()
209
- if (this.table === 'embeddings') return this.executeEmbeddings()
210
- return this.executeAdminData()
211
- }
212
-
213
- private async executeApps(): Promise<any> {
214
- if (this.insertData || this.updateData || this.deleteFlag) {
215
- throw new Error('apps write not supported through MCP proxy')
216
- }
217
- const idFilter = this.filters.find(f => f.key === 'id')
218
- const slugFilter = this.filters.find(f => f.key === 'slug')
219
- if (this._single || this._maybeSingle || idFilter || slugFilter) {
220
- const q: Record<string, any> = {}
221
- if (idFilter) q.id = idFilter.value
222
- else if (slugFilter) q.slug = slugFilter.value
223
- try {
224
- const record = await fetchFunction('apps', 'get', q)
225
- if (this._single && !record) throw new Error('App not found')
226
- return { data: record || null, error: null }
227
- } catch (err: any) {
228
- if (this._maybeSingle && (err?.message?.includes('not found') || err?.message?.includes('Not found') || err?.message?.includes('not_found'))) {
229
- return { data: null, error: null }
230
- }
231
- return { data: null, error: err }
232
- }
233
- }
234
- const records = await fetchFunction('apps', 'list', { include_system: 'true', include_inactive: 'true' })
235
- const filtered = this.applyClientFilters(records || [])
236
- const sorted = this.applyClientSort(filtered)
237
- return { data: sorted, error: null }
238
- }
239
-
240
- private async executeEmbeddings(): Promise<any> {
241
- if (this.insertData || this.updateData || this.deleteFlag) {
242
- throw new Error('embeddings write not supported through MCP proxy')
243
- }
244
- const q: Record<string, any> = {}
245
- const modelFilter = this.filters.find(f => f.key === 'model_id')
246
- const docFilter = this.filters.find(f => f.key === 'document_id')
247
- if (modelFilter) q.model_id = modelFilter.value
248
- if (docFilter) q.document_id = docFilter.value
249
- if (this.limitN) q.limit = this.limitN
250
- if (this.rangeFrom !== undefined) q.offset = this.rangeFrom
251
- const records = await fetchFunction('embeddings', 'list', q)
252
- return { data: records || [], error: null }
253
- }
254
-
255
- private async executeAdminData(): Promise<any> {
256
- const entity = this.table
257
- const idFilter = this.filters.find(f => f.key === 'id')
258
- const hasIdFilter = !!idFilter
259
-
260
- if (this.count && this.head) {
261
- try {
262
- const result = await fetchAdminData(entity, 'stats', {})
263
- return { data: [], count: result?.count ?? 0, error: null }
264
- } catch (err: any) {
265
- return { data: [], count: 0, error: err }
266
- }
267
- }
268
-
269
- if (this.insertData) {
270
- const record = await fetchAdminData(entity, 'create', {}, this.insertData)
271
- if (this.selectAfterInsert && this.columns === 'id') {
272
- return { data: record ? { id: record.id } : record, error: null }
273
- }
274
- return { data: record, error: null }
275
- }
276
-
277
- if (this.updateData) {
278
- if (!hasIdFilter) throw new Error('update requires id filter')
279
- const record = await fetchAdminData(entity, 'update', { id: idFilter.value }, this.updateData)
280
- return { data: record, error: null }
281
- }
282
-
283
- if (this.deleteFlag) {
284
- if (hasIdFilter) {
285
- const record = await fetchAdminData(entity, 'remove', { id: idFilter.value })
286
- return { data: record, error: null }
287
- }
288
-
289
- // list with any eq filters we can push, then client-filter the rest
290
- const params: Record<string, any> = {}
291
- for (const f of this.filters) {
292
- if (f.op === 'eq') params[f.key] = f.value
293
- }
294
- const records = await fetchAdminData(entity, 'list', { ...params, limit: 5000 })
295
- const toDelete = this.applyClientFilters(records || [], this.filters)
296
- for (const record of toDelete) {
297
- await fetchAdminData(entity, 'remove', { id: record.id })
298
- }
299
- return { data: null, error: null }
300
- }
301
-
302
- if ((this._single || this._maybeSingle) && hasIdFilter) {
303
- try {
304
- const record = await fetchAdminData(entity, 'get', { id: idFilter.value })
305
- if (this._single && !record) throw new Error('Record not found')
306
- return { data: record || null, error: null }
307
- } catch (err: any) {
308
- if (this._maybeSingle) return { data: null, error: null }
309
- return { data: null, error: err }
310
- }
311
- }
312
-
313
- const inIdFilter = this.filters.find(f => f.key === 'id' && f.op === 'in')
314
- if (inIdFilter) {
315
- const records: any[] = []
316
- for (const id of inIdFilter.value) {
317
- try {
318
- const record = await fetchAdminData(entity, 'get', { id })
319
- if (record) records.push(record)
320
- } catch {
321
- // ignore missing
322
- }
323
- }
324
- const otherFilters = this.filters.filter(f => !(f.key === 'id' && f.op === 'in'))
325
- const filtered = this.applyClientFilters(records, otherFilters)
326
- return { data: filtered, error: null }
327
- }
328
-
329
- const params: Record<string, any> = {}
330
- for (const f of this.filters) {
331
- if (f.op === 'eq') {
332
- params[f.key] = f.value
333
- } else if (f.op === 'ilike') {
334
- params.search = f.value.replace(/%/g, '')
335
- } else {
336
- // other ops are not supported by admin-data list; will client-filter later
337
- }
338
- }
339
- if (this.rangeFrom !== undefined && this.rangeTo !== undefined) {
340
- params.offset = this.rangeFrom
341
- params.limit = Math.max(0, this.rangeTo - this.rangeFrom)
342
- }
343
- if (this.limitN !== undefined) {
344
- params.limit = this.limitN
345
- }
346
- if (this.sorts.length > 0) {
347
- params.sort_field = this.sorts[0].field
348
- params.sort_direction = this.sorts[0].ascending ? 'asc' : 'desc'
349
- }
350
-
351
- const records = await fetchAdminData(entity, 'list', params)
352
- const filtered = this.applyClientFilters(records || [])
353
-
354
- if (this._single) {
355
- if (filtered.length === 0) throw new Error('Record not found')
356
- if (filtered.length > 1) throw new Error('Multiple records found')
357
- return { data: filtered[0], error: null }
358
- }
359
-
360
- if (this._maybeSingle) {
361
- return { data: filtered[0] || null, error: null }
362
- }
363
-
364
- return { data: filtered, error: null }
365
- }
366
-
367
- private applyClientFilters(records: any[], filters = this.filters): any[] {
368
- return records.filter(record => {
369
- for (const f of filters) {
370
- const value = this.getValue(record, f.key)
371
- if (f.op === 'eq' && value !== f.value) return false
372
- if (f.op === 'in' && !f.value.includes(value)) return false
373
- if (f.op === 'ilike' && typeof value === 'string' && !value.toLowerCase().includes(String(f.value).toLowerCase().replace(/%/g, ''))) return false
374
- if (f.op === 'lte' && value > f.value) return false
375
- if (f.op === 'gte' && value < f.value) return false
376
- if (f.op === 'neq' && value === f.value) return false
377
- if (f.op === 'contains') {
378
- if (Array.isArray(value) && !value.includes(f.value)) return false
379
- if (typeof value === 'string' && !value.includes(f.value)) return false
380
- }
381
- }
382
- return true
383
- })
384
- }
385
-
386
- private applyClientSort(records: any[]): any[] {
387
- if (this.sorts.length === 0) return records
388
- const s = this.sorts[0]
389
- return [...records].sort((a, b) => {
390
- const av = this.getValue(a, s.field)
391
- const bv = this.getValue(b, s.field)
392
- if (av < bv) return s.ascending ? -1 : 1
393
- if (av > bv) return s.ascending ? 1 : -1
394
- return 0
395
- })
396
- }
397
-
398
- private getValue(record: any, key: string): any {
399
- if (key === 'id') return record.id
400
- if (key in record) return record[key]
401
- if (key.startsWith('data->>')) {
402
- const field = key.slice(7)
403
- return record.data?.[field]
404
- }
405
- if (key.startsWith('data->')) {
406
- const path = key.slice(6)
407
- return record.data?.[path]
408
- }
409
- return undefined
410
- }
411
- }
412
-
413
- export const adminDb = {
414
- from(table: string) {
415
- return new Query(table)
416
- },
417
- async rpc(name: string, params: Record<string, any> = {}): Promise<any> {
418
- if (name === 'match_embeddings') {
419
- const result = await fetchFunction('embeddings', 'search-similar', {}, {
420
- query_embedding: params.query_embedding,
421
- model_id: params.model_id || 'text-embedding-3-small',
422
- limit: params.match_count || params.limit || 10,
423
- threshold: params.similarity_threshold || 0.15,
424
- filter_account_ids: params.filter_account_ids ?? null,
425
- filter_vector_type: params.filter_vector_type ?? null,
426
- filter_item_types: params.filter_item_types ?? null,
427
- filter_document_ids: params.filter_document_ids ?? null,
428
- })
429
- const rows = Array.isArray(result) ? result : (result?.results || [])
430
- return { data: rows, error: null }
431
- }
432
- throw new Error(`RPC not supported through MCP proxy: ${name}`)
433
- },
434
- }
435
-
436
- export async function resolveTypeRecord(kind: string, slug: string): Promise<any> {
437
- const rows = await fetchAdminData('types', 'list', { kind, slug, limit: 1 })
438
- const row = rows?.[0]
439
- if (!row) throw new Error(`Type not found: ${kind}/${slug}`)
440
- return {
441
- id: row.id,
442
- slug: row.slug,
443
- kind: row.kind,
444
- design_schema: row.design_schema || {},
445
- validation_schema: row.validation_schema || {},
446
- is_active: row.is_active ?? true,
447
- }
448
- }
449
-
450
- export async function resolveTypeId(kind: string, slug: string): Promise<string> {
451
- const record = await resolveTypeRecord(kind, slug)
452
- return record.id
453
- }
454
-
455
- export async function resolveLinkTypeId(slug: string): Promise<string> {
456
- const rows = await fetchAdminData('link_types', 'list', { slug, limit: 1 })
457
- const row = rows?.[0]
458
- if (!row) throw new Error(`Link type not found: ${slug}`)
459
- return row.id
460
- }
461
-
462
- export async function resolveLinkTypeIds(slugs: string[]): Promise<Record<string, string>> {
463
- const ids = await Promise.all(slugs.map(resolveLinkTypeId))
464
- const result: Record<string, string> = {}
465
- for (let i = 0; i < slugs.length; i++) {
466
- result[slugs[i]] = ids[i]
467
- }
468
- return result
469
- }
470
-
471
- // CIL[DOC-VECTOR type="context" content="purpose='MCP admin-data proxy query builder and type resolver for the Spine framework.'; No verified external callers; imports: none"]
472
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
473
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
474
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
475
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
476
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
477
- // CIL[END stable_id="~/.framework/mcp/shared/db.ts:mcp_db:file"]
@@ -1,118 +0,0 @@
1
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/shared/kb.ts"]
2
- // CIL[DOC-MACRO purpose="Shared MCP KB operation wrappers"]
3
- // CIL[DOC-RESPONSIBILITY responsibility="Provide thin async wrappers that route KB search/ingest/reindex/revoke/publish operations to the database fetch function"]
4
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts"]
5
- // CIL[DOC-CONTRACT inputs="none at module level" outputs="named KB operation exports" errors="none at module level" side_effects="none at module level"]
6
- // CIL[DOC-MICRO logic_summary="Re-exports fetchFunction-bound helpers for the kb namespace" notable_decisions="[]"]
7
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
8
- // CIL[DOC-STABILITY stability="stable"]
9
- // CIL[DOC-AUDIENCE audience="mcp"]
10
-
11
- import { fetchFunction } from './db.js'
12
- // CIL[DOC-VECTOR type="context" content="purpose='Shared MCP KB operation wrappers'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
13
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
14
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
15
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
16
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
17
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
18
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:module_header:module_header"]
19
-
20
-
21
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:kbsearch:function" type="function" identity="kbSearch" parent="~/.framework/mcp/shared/kb.ts"]
22
- // CIL[DOC-MACRO purpose="Search the knowledge base"]
23
- // CIL[DOC-RESPONSIBILITY responsibility="Delegate a KB search call to the database fetchFunction"]
24
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
25
- // CIL[DOC-CONTRACT inputs="_ctx: any, body: Record<string, any>" outputs="Promise<any>" errors="propagates fetchFunction errors" side_effects="queries the KB search index"]
26
- // CIL[DOC-MICRO logic_summary="Calls fetchFunction with the kb namespace, search action, empty static context, and the provided body" notable_decisions="[]"]
27
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
28
- // CIL[DOC-STABILITY stability="stable"]
29
- export async function kbSearch(_ctx: any, body: Record<string, any>): Promise<any> {
30
- return fetchFunction('kb', 'search', {}, body)
31
- }
32
- // CIL[DOC-VECTOR type="context" content="purpose='Search the knowledge base'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
33
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
34
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
35
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
36
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
37
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
38
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:kbsearch:function"]
39
-
40
-
41
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:kbingest:function" type="function" identity="kbIngest" parent="~/.framework/mcp/shared/kb.ts"]
42
- // CIL[DOC-MACRO purpose="Ingest content into the knowledge base"]
43
- // CIL[DOC-RESPONSIBILITY responsibility="Delegate a KB ingest call to the database fetchFunction"]
44
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
45
- // CIL[DOC-CONTRACT inputs="_ctx: any, body: Record<string, any>" outputs="Promise<any>" errors="propagates fetchFunction errors" side_effects="adds or updates KB records"]
46
- // CIL[DOC-MICRO logic_summary="Calls fetchFunction with the kb namespace, ingest action, empty static context, and the provided body" notable_decisions="[]"]
47
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
48
- // CIL[DOC-STABILITY stability="stable"]
49
- export async function kbIngest(_ctx: any, body: Record<string, any>): Promise<any> {
50
- return fetchFunction('kb', 'ingest', {}, body)
51
- }
52
- // CIL[DOC-VECTOR type="context" content="purpose='Ingest content into the knowledge base'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
53
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
54
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
55
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
56
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
57
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
58
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:kbingest:function"]
59
-
60
-
61
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:kbreindex:function" type="function" identity="kbReindex" parent="~/.framework/mcp/shared/kb.ts"]
62
- // CIL[DOC-MACRO purpose="Reindex the knowledge base"]
63
- // CIL[DOC-RESPONSIBILITY responsibility="Delegate a KB reindex call to the database fetchFunction"]
64
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
65
- // CIL[DOC-CONTRACT inputs="_ctx: any, body: Record<string, any>" outputs="Promise<any>" errors="propagates fetchFunction errors" side_effects="rebuilds the KB index"]
66
- // CIL[DOC-MICRO logic_summary="Calls fetchFunction with the kb namespace, reindex action, empty static context, and the provided body" notable_decisions="[]"]
67
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
68
- // CIL[DOC-STABILITY stability="stable"]
69
- export async function kbReindex(_ctx: any, body: Record<string, any>): Promise<any> {
70
- return fetchFunction('kb', 'reindex', {}, body)
71
- }
72
- // CIL[DOC-VECTOR type="context" content="purpose='Reindex the knowledge base'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
73
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
74
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
75
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
76
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
77
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
78
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:kbreindex:function"]
79
-
80
-
81
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:kbrevoke:function" type="function" identity="kbRevoke" parent="~/.framework/mcp/shared/kb.ts"]
82
- // CIL[DOC-MACRO purpose="Revoke a knowledge base record"]
83
- // CIL[DOC-RESPONSIBILITY responsibility="Delegate a KB revoke call to the database fetchFunction"]
84
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
85
- // CIL[DOC-CONTRACT inputs="_ctx: any, body: Record<string, any>" outputs="Promise<any>" errors="propagates fetchFunction errors" side_effects="removes or invalidates the specified KB record"]
86
- // CIL[DOC-MICRO logic_summary="Calls fetchFunction with the kb namespace, revoke action, empty static context, and the provided body" notable_decisions="[]"]
87
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
88
- // CIL[DOC-STABILITY stability="stable"]
89
- export async function kbRevoke(_ctx: any, body: Record<string, any>): Promise<any> {
90
- return fetchFunction('kb', 'revoke', {}, body)
91
- }
92
- // CIL[DOC-VECTOR type="context" content="purpose='Revoke a knowledge base record'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
93
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
94
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
95
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
96
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
97
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
98
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:kbrevoke:function"]
99
-
100
-
101
- // CIL[BEGIN stable_id="~/.framework/mcp/shared/kb.ts:kbpublish:function" type="function" identity="kbPublish" parent="~/.framework/mcp/shared/kb.ts"]
102
- // CIL[DOC-MACRO purpose="Publish a knowledge base record"]
103
- // CIL[DOC-RESPONSIBILITY responsibility="Delegate a KB publish call to the database fetchFunction"]
104
- // CIL[DOC-CONTEXT module=".framework/mcp/shared/kb.ts" layer="mcp" related_files=".framework/mcp/shared/db.ts,.framework/mcp/shared/kb.ts"]
105
- // CIL[DOC-CONTRACT inputs="_ctx: any, body: Record<string, any>" outputs="Promise<any>" errors="propagates fetchFunction errors" side_effects="publishes the specified KB record"]
106
- // CIL[DOC-MICRO logic_summary="Calls fetchFunction with the kb namespace, publish action, empty static context, and the provided body" notable_decisions="[]"]
107
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
108
- // CIL[DOC-STABILITY stability="stable"]
109
- export async function kbPublish(_ctx: any, body: Record<string, any>): Promise<any> {
110
- return fetchFunction('kb', 'publish', {}, body)
111
- }
112
- // CIL[DOC-VECTOR type="context" content="purpose='Publish a knowledge base record'; No verified external callers; imports: .framework/mcp/shared/db.ts"]
113
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
114
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
115
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
116
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
117
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
118
- // CIL[END stable_id="~/.framework/mcp/shared/kb.ts:kbpublish:function"]