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.
Files changed (283) 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/hash-api-key.ts +183 -79
  15. package/.framework/functions/_shared/logging.ts +562 -224
  16. package/.framework/functions/_shared/middleware.ts +47 -44
  17. package/.framework/functions/admin-data.ts +39 -28
  18. package/.framework/functions/ai-agents.ts +10 -6
  19. package/.framework/functions/api-keys.ts +301 -122
  20. package/.framework/functions/apps.ts +43 -26
  21. package/.framework/functions/cil-ingest.ts +48 -15
  22. package/.framework/functions/debug-auth.ts +14 -8
  23. package/.framework/functions/deliveries.ts +39 -12
  24. package/.framework/functions/embeddings.ts +145 -76
  25. package/.framework/functions/integration-outbound.ts +67 -27
  26. package/.framework/functions/integrations.ts +254 -127
  27. package/.framework/functions/logs.ts +273 -133
  28. package/.framework/functions/observability.ts +277 -147
  29. package/.framework/functions/pipeline-executions.ts +1 -1
  30. package/.framework/functions/pipelines.ts +14 -9
  31. package/.framework/functions/prompt-configs.ts +7 -4
  32. package/.framework/functions/roles.ts +8 -5
  33. package/.framework/functions/security.ts +30 -17
  34. package/.framework/functions/system-cron.ts +240 -127
  35. package/.framework/functions/tests.ts +7 -6
  36. package/.framework/functions/timers.ts +310 -107
  37. package/.framework/functions/triggers.ts +28 -13
  38. package/.framework/functions/types.ts +13 -10
  39. package/.framework/migrations/069_log_stats_window.sql +54 -0
  40. package/.framework/migrations/070_app_type_schema_rpcs.sql +166 -0
  41. package/.framework/migrations/071_timer_interval_keys.sql +96 -0
  42. package/.framework/migrations/072_slug_autofill.sql +77 -0
  43. package/.framework/migrations/073_seed_member_roles.sql +26 -0
  44. package/.framework/src/apps/admin/index.tsx +1141 -775
  45. package/.framework/src/components/ErrorBoundary.tsx +136 -0
  46. package/.framework/src/components/admin/AdminListPage.tsx +81 -73
  47. package/.framework/src/components/admin/AdminSidebar.tsx +88 -79
  48. package/.framework/src/components/admin/EntitySelect.tsx +181 -0
  49. package/.framework/src/components/admin/PageInstructions.tsx +86 -127
  50. package/.framework/src/components/app-shell/GenericDetailPage.tsx +37 -13
  51. package/.framework/src/components/app-shell/GenericListPage.tsx +28 -32
  52. package/.framework/src/components/layout/Sidebar.tsx +300 -177
  53. package/.framework/src/components/runtime/DataDetailPage.tsx +67 -35
  54. package/.framework/src/components/runtime/DataHeader.tsx +96 -48
  55. package/.framework/src/components/runtime/DataListPage.tsx +3 -26
  56. package/.framework/src/components/runtime/DataStats.tsx +10 -10
  57. package/.framework/src/components/runtime/DataTable.tsx +12 -10
  58. package/.framework/src/components/ui/sheet.tsx +24 -26
  59. package/.framework/src/components/ui/textarea.tsx +74 -48
  60. package/.framework/src/hooks/useEntityList.ts +12 -9
  61. package/.framework/src/hooks/useListSchema.ts +108 -58
  62. package/.framework/src/instructions/README.md +57 -0
  63. package/.framework/src/instructions/ai-agents.md +69 -0
  64. package/.framework/src/instructions/alerts.md +80 -0
  65. package/.framework/src/instructions/api-keys.md +87 -0
  66. package/.framework/src/instructions/apps.md +77 -0
  67. package/.framework/src/instructions/concepts/ai-and-prompts.md +150 -0
  68. package/.framework/src/instructions/concepts/apps-and-renderers.md +162 -0
  69. package/.framework/src/instructions/concepts/auth-and-api-keys.md +133 -0
  70. package/.framework/src/instructions/concepts/automation.md +186 -0
  71. package/.framework/src/instructions/concepts/concurrency-and-idempotency.md +125 -0
  72. package/.framework/src/instructions/concepts/core-vs-custom.md +124 -0
  73. package/.framework/src/instructions/concepts/design-schema.md +152 -0
  74. package/.framework/src/instructions/concepts/integrations-and-webhooks.md +127 -0
  75. package/.framework/src/instructions/concepts/observability.md +116 -0
  76. package/.framework/src/instructions/concepts/permissions.md +150 -0
  77. package/.framework/src/instructions/concepts/runtime-records.md +111 -0
  78. package/.framework/src/instructions/concepts/scope-and-accounts.md +112 -0
  79. package/.framework/src/instructions/concepts/spine-way.md +172 -0
  80. package/.framework/src/instructions/deliveries.md +59 -0
  81. package/.framework/src/instructions/guide/00-orientation.md +106 -0
  82. package/.framework/src/instructions/guide/01-install-and-first-run.md +253 -0
  83. package/.framework/src/instructions/guide/02-project-map.md +147 -0
  84. package/.framework/src/instructions/guide/03-domain-model.md +223 -0
  85. package/.framework/src/instructions/guide/04-first-app.md +227 -0
  86. package/.framework/src/instructions/guide/05-glossary.md +183 -0
  87. package/.framework/src/instructions/integrations.md +96 -0
  88. package/.framework/src/instructions/internal/cil-markers.md +83 -0
  89. package/.framework/src/instructions/invites.md +60 -0
  90. package/.framework/src/instructions/kb.md +80 -0
  91. package/.framework/src/instructions/logs.md +77 -0
  92. package/.framework/src/instructions/observability.md +61 -0
  93. package/.framework/src/instructions/operations/deployment.md +115 -0
  94. package/.framework/src/instructions/operations/migrations.md +125 -0
  95. package/.framework/src/instructions/operations/security-checklist.md +148 -0
  96. package/.framework/src/instructions/operations/troubleshooting.md +170 -0
  97. package/.framework/src/instructions/operations/upgrade.md +116 -0
  98. package/.framework/src/instructions/pipeline-executions.md +62 -0
  99. package/.framework/src/instructions/pipelines.md +78 -0
  100. package/.framework/src/instructions/prompts.md +95 -0
  101. package/.framework/src/instructions/reference/api/admin-data.md +162 -0
  102. package/.framework/src/instructions/reference/api/auth.md +113 -0
  103. package/.framework/src/instructions/reference/api/errors-and-envelopes.md +113 -0
  104. package/.framework/src/instructions/reference/app-manifest.md +150 -0
  105. package/.framework/src/instructions/reference/cli.md +124 -0
  106. package/.framework/src/instructions/reference/database.md +132 -0
  107. package/.framework/src/instructions/reference/design-schema.md +280 -0
  108. package/.framework/src/instructions/reference/env-vars.md +133 -0
  109. package/.framework/src/instructions/reference/functions/account-nodes.md +75 -0
  110. package/.framework/src/instructions/reference/functions/admin-data.md +195 -0
  111. package/.framework/src/instructions/reference/functions/admin-funnel.md +90 -0
  112. package/.framework/src/instructions/reference/functions/admin-install-funnel.md +107 -0
  113. package/.framework/src/instructions/reference/functions/admin-signals.md +102 -0
  114. package/.framework/src/instructions/reference/functions/ai-agents.md +148 -0
  115. package/.framework/src/instructions/reference/functions/ai-interactions.md +156 -0
  116. package/.framework/src/instructions/reference/functions/api-keys.md +130 -0
  117. package/.framework/src/instructions/reference/functions/apps.md +140 -0
  118. package/.framework/src/instructions/reference/functions/auth.md +99 -0
  119. package/.framework/src/instructions/reference/functions/debug-auth.md +91 -0
  120. package/.framework/src/instructions/reference/functions/deliveries.md +110 -0
  121. package/.framework/src/instructions/reference/functions/embeddings.md +166 -0
  122. package/.framework/src/instructions/reference/functions/eval-harness.md +149 -0
  123. package/.framework/src/instructions/reference/functions/index.md +103 -0
  124. package/.framework/src/instructions/reference/functions/integration-outbound.md +200 -0
  125. package/.framework/src/instructions/reference/functions/integration-routes.md +151 -0
  126. package/.framework/src/instructions/reference/functions/integrations.md +130 -0
  127. package/.framework/src/instructions/reference/functions/invites.md +182 -0
  128. package/.framework/src/instructions/reference/functions/item-progress.md +107 -0
  129. package/.framework/src/instructions/reference/functions/kb.md +166 -0
  130. package/.framework/src/instructions/reference/functions/logs.md +141 -0
  131. package/.framework/src/instructions/reference/functions/observability.md +105 -0
  132. package/.framework/src/instructions/reference/functions/pipeline-executions.md +132 -0
  133. package/.framework/src/instructions/reference/functions/pipeline-runner-background.md +121 -0
  134. package/.framework/src/instructions/reference/functions/pipelines.md +136 -0
  135. package/.framework/src/instructions/reference/functions/prompt-configs.md +121 -0
  136. package/.framework/src/instructions/reference/functions/roles.md +121 -0
  137. package/.framework/src/instructions/reference/functions/security.md +140 -0
  138. package/.framework/src/instructions/reference/functions/system-cron.md +136 -0
  139. package/.framework/src/instructions/reference/functions/system.md +106 -0
  140. package/.framework/src/instructions/reference/functions/tests.md +97 -0
  141. package/.framework/src/instructions/reference/functions/timers.md +117 -0
  142. package/.framework/src/instructions/reference/functions/trigger-scheduler.md +102 -0
  143. package/.framework/src/instructions/reference/functions/triggers.md +140 -0
  144. package/.framework/src/instructions/reference/functions/types.md +146 -0
  145. package/.framework/src/instructions/reference/seeds.md +126 -0
  146. package/.framework/src/instructions/reference/shared-modules.md +127 -0
  147. package/.framework/src/instructions/reference/spine-config.md +114 -0
  148. package/.framework/src/instructions/roles.md +80 -0
  149. package/.framework/src/instructions/runtime-detail.md +70 -0
  150. package/.framework/src/instructions/runtime-list.md +77 -0
  151. package/.framework/src/instructions/security.md +67 -0
  152. package/.framework/src/instructions/tasks/add-a-pipeline.md +110 -0
  153. package/.framework/src/instructions/tasks/add-a-role.md +96 -0
  154. package/.framework/src/instructions/tasks/add-a-timer.md +114 -0
  155. package/.framework/src/instructions/tasks/add-a-trigger.md +106 -0
  156. package/.framework/src/instructions/tasks/add-a-type.md +151 -0
  157. package/.framework/src/instructions/tasks/add-a-webhook.md +108 -0
  158. package/.framework/src/instructions/tasks/add-an-ai-agent.md +108 -0
  159. package/.framework/src/instructions/tasks/add-an-integration.md +124 -0
  160. package/.framework/src/instructions/tasks/build-a-custom-page.md +118 -0
  161. package/.framework/src/instructions/tasks/package-and-install-an-app.md +127 -0
  162. package/.framework/src/instructions/tasks/test-your-code.md +108 -0
  163. package/.framework/src/instructions/tasks/write-a-function.md +132 -0
  164. package/.framework/src/instructions/tasks/write-a-migration.md +110 -0
  165. package/.framework/src/instructions/testing.md +59 -0
  166. package/.framework/src/instructions/timers.md +82 -0
  167. package/.framework/src/instructions/triggers.md +69 -0
  168. package/.framework/src/instructions/types.md +93 -0
  169. package/.framework/src/pages/NotFoundPage.tsx +62 -31
  170. package/.framework/src/pages/admin/AIAgentDetailPage.tsx +117 -106
  171. package/.framework/src/pages/admin/AIAgentsPage.tsx +86 -48
  172. package/.framework/src/pages/admin/APIKeyDetailPage.tsx +153 -152
  173. package/.framework/src/pages/admin/APIKeysPage.tsx +91 -90
  174. package/.framework/src/pages/admin/AlertsConfigPage.tsx +29 -18
  175. package/.framework/src/pages/admin/AppDetailPage.tsx +6 -60
  176. package/.framework/src/pages/admin/AppsPage.tsx +104 -66
  177. package/.framework/src/pages/admin/DeliveriesPage.tsx +5 -5
  178. package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +5 -23
  179. package/.framework/src/pages/admin/EmbeddingsPage.tsx +5 -26
  180. package/.framework/src/pages/admin/IntegrationDetailPage.tsx +7 -7
  181. package/.framework/src/pages/admin/IntegrationsPage.tsx +85 -43
  182. package/.framework/src/pages/admin/LogsPage.tsx +144 -76
  183. package/.framework/src/pages/admin/ObservabilityDashboard.tsx +223 -140
  184. package/.framework/src/pages/admin/PipelineDetailPage.tsx +134 -113
  185. package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +108 -45
  186. package/.framework/src/pages/admin/PipelinesPage.tsx +160 -115
  187. package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +96 -98
  188. package/.framework/src/pages/admin/PromptConfigsPage.tsx +101 -59
  189. package/.framework/src/pages/admin/RoleDetailPage.tsx +90 -79
  190. package/.framework/src/pages/admin/RolesPage.tsx +86 -43
  191. package/.framework/src/pages/admin/SecurityPage.tsx +1 -1
  192. package/.framework/src/pages/admin/TestingDashboard.tsx +16 -28
  193. package/.framework/src/pages/admin/TimerDetailPage.tsx +117 -100
  194. package/.framework/src/pages/admin/TimersPage.tsx +90 -62
  195. package/.framework/src/pages/admin/TriggerDetailPage.tsx +90 -83
  196. package/.framework/src/pages/admin/TriggersPage.tsx +124 -99
  197. package/.framework/src/pages/admin/TypeDetailPage.tsx +152 -138
  198. package/.framework/src/pages/admin/TypesPage.tsx +90 -48
  199. package/.framework/src/pages/admin/cil/CILAgentPage.tsx +17 -25
  200. package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +17 -27
  201. package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +72 -40
  202. package/.framework/src/pages/admin/cil/CILFileListPage.tsx +321 -129
  203. package/.framework/src/pages/admin/cil/CILFileSelectPage.tsx +18 -29
  204. package/.framework/src/pages/admin/cil/CILGraphPage.tsx +26 -38
  205. package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +34 -46
  206. package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +189 -103
  207. package/.framework/src/pages/admin/cil/CILSearchPage.tsx +246 -136
  208. package/.framework/src/pages/admin/cil/CILSuggestionsPage.tsx +11 -22
  209. package/.framework/src/pages/admin/cil/CILVersionsPage.tsx +9 -20
  210. package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +26 -38
  211. package/.framework/src/pages/admin/kb/KBAdminPage.tsx +7 -26
  212. package/.framework/templates/agent/AGENTS.md +150 -0
  213. package/.framework/templates/agent/skills/spine-add-ai-agent/SKILL.md +58 -0
  214. package/.framework/templates/agent/skills/spine-add-automation/SKILL.md +62 -0
  215. package/.framework/templates/agent/skills/spine-add-integration/SKILL.md +63 -0
  216. package/.framework/templates/agent/skills/spine-architect/SKILL.md +86 -0
  217. package/.framework/templates/agent/skills/spine-install-app/SKILL.md +72 -0
  218. package/.framework/templates/agent/skills/spine-migration/SKILL.md +75 -0
  219. package/.framework/templates/agent/skills/spine-new-app/SKILL.md +67 -0
  220. package/.framework/templates/agent/skills/spine-new-function/SKILL.md +65 -0
  221. package/.framework/templates/agent/skills/spine-new-type/SKILL.md +65 -0
  222. package/.framework/templates/agent/skills/spine-schema/SKILL.md +77 -0
  223. package/.framework/templates/agent/skills/spine-test/SKILL.md +67 -0
  224. package/.framework/templates/agent/skills/spine-troubleshoot/SKILL.md +74 -0
  225. package/.framework/templates/agent/skills/spine-upgrade/SKILL.md +69 -0
  226. package/.framework/templates/project.json +4 -1
  227. package/.framework/tests/unit/account-scoping-gates.test.ts +392 -0
  228. package/.framework/tests/unit/agent-files.test.ts +355 -0
  229. package/.framework/tests/unit/agent-runner.test.ts +479 -44
  230. package/.framework/tests/unit/api-keys-create-scope-gate.test.ts +160 -0
  231. package/.framework/tests/unit/api-keys-omit-secret-fields.test.ts +38 -0
  232. package/.framework/tests/unit/bootstrap.test.ts +242 -0
  233. package/.framework/tests/unit/cli-context-api-key.test.ts +114 -0
  234. package/.framework/tests/unit/debug-auth.test.ts +38 -0
  235. package/.framework/tests/unit/deliveries-account-scoping.test.ts +185 -0
  236. package/.framework/tests/unit/integration-outbound-credentials.test.ts +167 -0
  237. package/.framework/tests/unit/integrations-audit-redaction.test.ts +130 -0
  238. package/.framework/tests/unit/logging-app-id.test.ts +75 -0
  239. package/.framework/tests/unit/system-context-denial.test.ts +145 -0
  240. package/.framework/tests/unit/system-cron.test.ts +240 -0
  241. package/.framework/tests/unit/timers.test.ts +159 -0
  242. package/README.md +125 -166
  243. package/config/tsconfig.cli.json +2 -2
  244. package/package.json +15 -4
  245. package/templates/project/package-lock.json +2 -2
  246. package/.framework/docs/admin-routes.md +0 -76
  247. package/.framework/docs/api-docs-progress.md +0 -38
  248. package/.framework/docs/api-governance.md +0 -146
  249. package/.framework/docs/api-testing-results.md +0 -212
  250. package/.framework/docs/assembly-launch-guide.md +0 -138
  251. package/.framework/docs/audit-results.md +0 -590
  252. package/.framework/docs/db-api-inventory.md +0 -95
  253. package/.framework/docs/gap-remediation-backlog.md +0 -103
  254. package/.framework/docs/ui-adoption-verification.md +0 -111
  255. package/.framework/docs/ui-api-coverage.md +0 -84
  256. package/.framework/docs/v2-compatibility-audit.md +0 -228
  257. package/.framework/mcp/index.ts +0 -133
  258. package/.framework/mcp/load-env.ts +0 -60
  259. package/.framework/mcp/shared/app-manifest.ts +0 -275
  260. package/.framework/mcp/shared/db.ts +0 -477
  261. package/.framework/mcp/shared/kb.ts +0 -118
  262. package/.framework/mcp/tools/architect.ts +0 -431
  263. package/.framework/mcp/tools/cil/context.ts +0 -345
  264. package/.framework/mcp/tools/cil/graph.ts +0 -242
  265. package/.framework/mcp/tools/cil/ingest.ts +0 -1217
  266. package/.framework/mcp/tools/cil/pipeline-orchestrator.ts +0 -693
  267. package/.framework/mcp/tools/cil/pipeline.ts +0 -767
  268. package/.framework/mcp/tools/cil/project.ts +0 -791
  269. package/.framework/mcp/tools/cil/retrieval.ts +0 -336
  270. package/.framework/mcp/tools/cil/search-core.ts +0 -454
  271. package/.framework/mcp/tools/cil/search.ts +0 -97
  272. package/.framework/mcp/tools/cil/suggest.ts +0 -186
  273. package/.framework/mcp/tools/cil/validate.ts +0 -1369
  274. package/.framework/mcp/tools/kb/delete.ts +0 -139
  275. package/.framework/mcp/tools/kb/index.ts +0 -52
  276. package/.framework/mcp/tools/kb/ingest.ts +0 -84
  277. package/.framework/mcp/tools/kb/list-types.ts +0 -102
  278. package/.framework/mcp/tools/kb/publish.ts +0 -100
  279. package/.framework/mcp/tools/kb/reindex.ts +0 -86
  280. package/.framework/mcp/tools/kb/revoke.ts +0 -85
  281. package/.framework/mcp/tools/kb/search.ts +0 -101
  282. package/.framework/mcp/tools/kb/upsert.ts +0 -125
  283. package/.framework/mcp/tools/observability.ts +0 -510
@@ -1,767 +0,0 @@
1
- /**
2
- * @module pipeline
3
- * @audience internal
4
- * @layer app-specific
5
- * @stability stable
6
- *
7
- * This module implements the pipeline for processing MCP (Model Context Protocol) requests, utilizing various utilities for data handling and validation. It serves as a core component in the server architecture, facilitating interactions with the database and file system. INVARIANT: All requests must be properly authenticated before reaching this module.
8
- *
9
- * @seeAlso adminDb (provides database access for administrative tasks).
10
- * @seeAlso computeContentHash (used for content integrity verification).
11
- * @seeAlso McpServer (the main server interface for handling MCP requests).
12
- *
13
- * @cil-generated
14
- */
15
-
16
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:module_header:module_header" type="module_header" identity="module_header" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
17
- // CIL[DOC-MACRO purpose="This module implements the pipeline for processing MCP (Model Context Protocol) requests, utilizing various utilities..."]
18
- // CIL[DOC-RESPONSIBILITY responsibility="This module implements the pipeline for processing MCP (Model Context Protocol) requests, utilizing various utilities..."]
19
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts"]
20
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
21
- // CIL[DOC-MICRO logic_summary="This module implements the pipeline for processing MCP (Model Context Protocol) requests, utilizing various utilities..." notable_decisions="[]"]
22
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
23
- // CIL[DOC-STABILITY stability="stable"]
24
- // CIL[DOC-AUDIENCE audience="internal"]
25
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
26
- import { z } from 'zod'
27
- import { adminDb, resolveTypeRecord } from '../../shared/db.js'
28
- import * as fs from 'fs'
29
- import * as path from 'path'
30
- import * as crypto from 'node:crypto'
31
- import { toCanonicalPath, computeContentHash } from '../../../functions/_shared/cil.js'
32
- // CIL[DOC-VECTOR type="context" content="purpose='This module implements the pipeline for processing MCP (Model Context Protocol) requests, utilizing various utilities...'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.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/tools/cil/pipeline.ts:module_header:module_header"]
39
-
40
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:computeFileHash:function" type="function" identity="computeFileHash" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
41
- // CIL[DOC-MACRO purpose="Computes the SHA-256 hash of a given string content."]
42
- // CIL[DOC-RESPONSIBILITY responsibility="Computes the SHA-256 hash of a given string content."]
43
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
44
- // CIL[DOC-CONTRACT inputs="content: string (required) — the content to hash." outputs="string — the resulting SHA-256 hash in hexadecimal format." errors="none" side_effects="none"]
45
- // CIL[DOC-MICRO logic_summary="Computes the SHA-256 hash of a given string content." notable_decisions="[]"]
46
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
47
- // CIL[DOC-STABILITY stability="stable"]
48
- /**
49
- * Computes the SHA-256 hash of a given string content. This function is used for generating a unique identifier for file contents based on their content.
50
- *
51
- * @inputSpec
52
- * content: string (required) — the content to hash.
53
- * @outputSpec string — the resulting SHA-256 hash in hexadecimal format.
54
- * @sideEffects none
55
- * @stability stable
56
- * @calls crypto.createHash
57
- * @cil-generated
58
- */
59
- function computeFileHash(content: string): string {
60
- return crypto.createHash('sha256').update(content, 'utf8').digest('hex')
61
- }
62
- // CIL[DOC-VECTOR type="context" content="purpose='Computes the SHA-256 hash of a given string content.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
63
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
64
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
65
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
66
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
67
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
68
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:computeFileHash:function"]
69
-
70
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:estimateTokens:function" type="function" identity="estimateTokens" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
71
- // CIL[DOC-MACRO purpose="Estimates the number of tokens required for a given text based on its length."]
72
- // CIL[DOC-RESPONSIBILITY responsibility="Estimates the number of tokens required for a given text based on its length."]
73
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
74
- // CIL[DOC-CONTRACT inputs="text: string (required) — the input text for which to estimate tokens." outputs="number — the estimated number of tokens." errors="none" side_effects="none"]
75
- // CIL[DOC-MICRO logic_summary="Estimates the number of tokens required for a given text based on its length." notable_decisions="[]"]
76
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
77
- // CIL[DOC-STABILITY stability="stable"]
78
- /**
79
- * Estimates the number of tokens required for a given text based on its length. This function is useful for determining resource allocation in text processing tasks.
80
- *
81
- * @inputSpec
82
- * text: string (required) — the input text for which to estimate tokens.
83
- * @outputSpec number — the estimated number of tokens.
84
- * @sideEffects none
85
- * @stability stable
86
- * @cil-generated
87
- */
88
- function estimateTokens(text: string): number {
89
- return Math.ceil(text.length / 4)
90
- }
91
- // CIL[DOC-VECTOR type="context" content="purpose='Estimates the number of tokens required for a given text based on its length.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
92
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
93
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
94
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
95
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
96
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
97
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:estimateTokens:function"]
98
-
99
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentAttributes:function" type="function" identity="parseAgentAttributes" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
100
- // CIL[DOC-MACRO purpose="Parser for agent attributes in key-value format."]
101
- // CIL[DOC-RESPONSIBILITY responsibility="Uses a regular expression to match and extract key-value pairs from the input string."]
102
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
103
- // CIL[DOC-CONTRACT inputs="attrString: string (required) — a string containing agent attributes in key-value format." outputs="Record<string, string> — a record mapping attribute names to their corresponding values." errors="none" side_effects="none"]
104
- // CIL[DOC-MICRO logic_summary="Uses a regular expression to match and extract key-value pairs from the input string." notable_decisions="[]"]
105
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
106
- // CIL[DOC-STABILITY stability="stable"]
107
- /**
108
- * Parses a string of agent attributes formatted as key-value pairs and returns them as a record. This function is useful for extracting structured data from a raw attribute string.
109
- *
110
- * @macro Parser for agent attributes in key-value format.
111
- * @micro Uses a regular expression to match and extract key-value pairs from the input string.
112
- * @inputSpec
113
- * - attrString: string (required) — a string containing agent attributes in key-value format.
114
- * @outputSpec Record<string, string> — a record mapping attribute names to their corresponding values.
115
- * @sideEffects none
116
- * @stability stable
117
- * @cil-generated
118
- */
119
- function parseAgentAttributes(attrString: string): Record<string, string> {
120
- const attrs: Record<string, string> = {}
121
- const regex = /(\w+)="([^"]*)"/g
122
- let match: RegExpExecArray | null
123
- while ((match = regex.exec(attrString)) !== null) {
124
- attrs[match[1]] = match[2]
125
- }
126
- return attrs
127
- }
128
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentAttributes:function"]
129
- // CIL[DOC-VECTOR type="context" content="purpose='Parser for agent attributes in key-value format.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
130
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
131
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
132
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
133
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
134
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
135
-
136
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:AgentParsedMarker:interface" type="interface" identity="AgentParsedMarker" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
137
- // CIL[DOC-MACRO purpose="Defines AgentParsedMarker"]
138
- // CIL[DOC-RESPONSIBILITY responsibility="AgentParsedMarker implementation"]
139
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
140
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
141
- // CIL[DOC-MICRO logic_summary="" notable_decisions="[]"]
142
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
143
- // CIL[DOC-STABILITY stability="stable"]
144
- interface AgentParsedMarker {
145
- stable_id: string
146
- start_line: number
147
- end_line: number
148
- type: string
149
- identity: string
150
- parent: string
151
- attributes?: Record<string, string>
152
- }
153
- // CIL[DOC-VECTOR type="context" content="purpose='Defines AgentParsedMarker'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
154
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
155
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
156
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
157
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
158
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
159
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:AgentParsedMarker:interface"]
160
-
161
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentCilMarkers:function" type="function" identity="parseAgentCilMarkers" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
162
- // CIL[DOC-MACRO purpose="Defines parseAgentCilMarkers"]
163
- // CIL[DOC-RESPONSIBILITY responsibility="parseAgentCilMarkers implementation"]
164
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
165
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
166
- // CIL[DOC-MICRO logic_summary="" notable_decisions="[]"]
167
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
168
- // CIL[DOC-STABILITY stability="stable"]
169
- function parseAgentCilMarkers(lines: string[]): AgentParsedMarker[] {
170
- const markers: AgentParsedMarker[] = []
171
- const stack: { line: number; attrs: Record<string, string> }[] = []
172
-
173
- for (let i = 0; i < lines.length; i++) {
174
- const trimmed = lines[i].trim()
175
- const beginMatch = trimmed.match(/^(?:\/\/|--|#)\s*CIL\[BEGIN\s+(.+)\]$/) || trimmed.match(/^<!--\s*CIL\[BEGIN\s+(.+)\]\s*-->$/)
176
- const endMatch = trimmed.match(/^(?:\/\/|--|#)\s*CIL\[END\s+stable_id="([^"]+)"\]$/) || trimmed.match(/^<!--\s*CIL\[END\s+stable_id="([^"]+)"\]\s*-->$/)
177
-
178
- if (beginMatch) {
179
- const attrs = parseAgentAttributes(beginMatch[1])
180
- stack.push({ line: i + 1, attrs })
181
- } else if (endMatch && stack.length > 0) {
182
- const opened = stack.pop()!
183
- markers.push({
184
- stable_id: endMatch[1],
185
- start_line: opened.line,
186
- end_line: i + 1,
187
- type: opened.attrs.type || 'unknown',
188
- identity: opened.attrs.identity || '',
189
- parent: opened.attrs.parent || 'none',
190
- attributes: opened.attrs,
191
- })
192
- }
193
- }
194
-
195
- return markers
196
- }
197
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentCilMarkers:function"]
198
- // CIL[DOC-VECTOR type="context" content="purpose='Defines parseAgentCilMarkers'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
199
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
200
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
201
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
202
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
203
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
204
-
205
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:AgentParsedDocs:interface" type="interface" identity="AgentParsedDocs" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
206
- // CIL[DOC-MACRO purpose="The AgentParsedDocs interface defines the structure for parsed documentation related to agents, encapsulating various..."]
207
- // CIL[DOC-RESPONSIBILITY responsibility="The AgentParsedDocs interface defines the structure for parsed documentation related to agents, encapsulating various..."]
208
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
209
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
210
- // CIL[DOC-MICRO logic_summary="The AgentParsedDocs interface defines the structure for parsed documentation related to agents, encapsulating various..." notable_decisions="[]"]
211
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
212
- // CIL[DOC-STABILITY stability="stable"]
213
- /**
214
- * The AgentParsedDocs interface defines the structure for parsed documentation related to agents, encapsulating various attributes that describe their functionality and context. It serves as a schema for organizing agent-related information in a consistent manner.
215
- *
216
- * @sideEffects none
217
- * @stability stable
218
- * @cil-generated
219
- */
220
- interface AgentParsedDocs {
221
- macro?: string
222
- responsibility?: string
223
- context?: Record<string, any>
224
- contract?: Record<string, any>
225
- micro?: Record<string, any>
226
- confidence?: { pass: string; score: number; flags: string[] }
227
- stability?: string
228
- audience?: string
229
- vectors?: Record<string, { content: string; status: string }>
230
- notes?: Array<Record<string, any>>
231
- learnings?: Array<Record<string, any>>
232
- raw: Record<string, string>
233
- }
234
- // CIL[DOC-VECTOR type="context" content="purpose='The AgentParsedDocs interface defines the structure for parsed documentation related to agents, encapsulating various...'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
235
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
236
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
237
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
238
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
239
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
240
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:AgentParsedDocs:interface"]
241
-
242
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentCilDocs:function" type="function" identity="parseAgentCilDocs" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
243
- // CIL[DOC-MACRO purpose="Documentation parser for agent CIL comments."]
244
- // CIL[DOC-RESPONSIBILITY responsibility="Iterates through specified line ranges, applying regex to extract structured documentation attributes."]
245
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
246
- // CIL[DOC-CONTRACT inputs="lines: string[] (required), startLine: number (required), endLine: number (required)" outputs="AgentParsedDocs — an object containing parsed documentation attributes." errors="none" side_effects="none"]
247
- // CIL[DOC-MICRO logic_summary="Iterates through specified line ranges, applying regex to extract structured documentation attributes." notable_decisions="[]"]
248
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
249
- // CIL[DOC-STABILITY stability="stable"]
250
- /**
251
- * Parses lines of documentation comments for agent CIL and organizes them into a structured format. This function extracts specific documentation keys and their associated content for further processing.
252
- *
253
- * @macro Documentation parser for agent CIL comments.
254
- * @micro Iterates through specified line ranges, applying regex to extract structured documentation attributes.
255
- * @inputSpec
256
- * - lines: string[] (required) — array of lines containing documentation comments.
257
- * - startLine: number (required) — the starting line number for parsing.
258
- * - endLine: number (required) — the ending line number for parsing.
259
- * @outputSpec AgentParsedDocs — an object containing parsed documentation attributes.
260
- * @sideEffects none
261
- * @stability stable
262
- * @calls parseAgentAttributes
263
- * @cil-generated
264
- */
265
- function parseAgentCilDocs(lines: string[], startLine: number, endLine: number): AgentParsedDocs {
266
- const docs: AgentParsedDocs = { raw: {} }
267
- for (let i = startLine - 1; i < endLine - 1; i++) {
268
- const trimmed = lines[i].trim()
269
- const match = trimmed.match(/^(?:\/\/|--|#)\s*CIL\[DOC-(\w+)\s+(.+)\]$/) || trimmed.match(/^<!--\s*CIL\[DOC-(\w+)\s+(.+)\]\s*-->$/)
270
- if (!match) continue
271
- const key = match[1]
272
- const content = match[2]
273
- docs.raw[key] = content
274
-
275
- const attrs = parseAgentAttributes(content)
276
-
277
- switch (key) {
278
- case 'MACRO':
279
- docs.macro = attrs.purpose || content.replace(/^purpose="|"$/g, '')
280
- break
281
- case 'RESPONSIBILITY':
282
- docs.responsibility = attrs.responsibility || content.replace(/^responsibility="|"$/g, '')
283
- break
284
- case 'CONTEXT':
285
- docs.context = attrs
286
- break
287
- case 'CONTRACT':
288
- docs.contract = attrs
289
- break
290
- case 'MICRO':
291
- docs.micro = attrs
292
- break
293
- case 'CONFIDENCE':
294
- docs.confidence = {
295
- pass: attrs.pass || 'first',
296
- score: parseFloat(attrs.score || '0'),
297
- flags: attrs.flags ? attrs.flags.split(',').map((s: string) => s.trim()).filter(Boolean) : [],
298
- }
299
- break
300
- case 'VECTOR':
301
- if (attrs.type) {
302
- if (!docs.vectors) docs.vectors = {}
303
- docs.vectors[attrs.type] = {
304
- content: attrs.content || '',
305
- status: attrs.status || 'ready',
306
- }
307
- }
308
- break
309
- case 'STABILITY':
310
- docs.stability = attrs.stability || content.replace(/^stability="|"$/g, '')
311
- break
312
- case 'AUDIENCE':
313
- docs.audience = attrs.audience || content.replace(/^audience="|"$/g, '')
314
- break
315
- case 'NOTE':
316
- if (!docs.notes) docs.notes = []
317
- docs.notes.push(attrs)
318
- break
319
- case 'LEARNING':
320
- if (!docs.learnings) docs.learnings = []
321
- docs.learnings.push(attrs)
322
- break
323
- }
324
- }
325
- return docs
326
- }
327
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:parseAgentCilDocs:function"]
328
-
329
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:mapAgentDocsToChunkData:function" type="function" identity="mapAgentDocsToChunkData" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
330
- // CIL[DOC-VECTOR type="context" content="purpose='Documentation parser for agent CIL comments.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
331
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
332
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
333
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
334
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
335
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
336
- // CIL[DOC-MACRO purpose="Defines mapAgentDocsToChunkData"]
337
- // CIL[DOC-RESPONSIBILITY responsibility="mapAgentDocsToChunkData implementation"]
338
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
339
- // CIL[DOC-CONTRACT inputs="none" outputs="none" errors="none" side_effects="none"]
340
- // CIL[DOC-MICRO logic_summary="" notable_decisions="[]"]
341
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
342
- // CIL[DOC-STABILITY stability="stable"]
343
- function mapAgentDocsToChunkData(docs: AgentParsedDocs): Record<string, any> {
344
- const pendingVectors = docs.vectors
345
- ? Object.entries(docs.vectors).filter(([, v]) => v.status === 'pending_human_input').map(([k]) => k)
346
- : []
347
-
348
- return {
349
- macro: docs.macro || docs.raw.MACRO || '',
350
- micro: docs.micro?.logic_summary || docs.responsibility || '',
351
- description: docs.macro || '',
352
- input_spec: docs.contract?.inputs?.replace(/\\n/g, '\n') || '',
353
- output_spec: docs.contract?.outputs || '',
354
- side_effects: docs.contract?.side_effects || '',
355
- throws: docs.contract?.errors || '',
356
- module: docs.context?.module || '',
357
- layer: docs.context?.layer || '',
358
- doc_confidence: docs.confidence?.pass === 'second' ? 'ai_generated' : 'from_source',
359
- confidence_score: docs.confidence?.score || 0,
360
- confidence_flags: docs.confidence?.flags || [],
361
- related_files: docs.context?.related_files || '',
362
- tags: docs.micro?.notable_decisions || '',
363
- depends_on: docs.contract?.dependencies || '',
364
- stability: docs.stability || '',
365
- audience: docs.audience || '',
366
- vector_content: docs.vectors || {},
367
- vectors_pending_human_review: pendingVectors,
368
- notes: docs.notes || [],
369
- learnings: docs.learnings || [],
370
- }
371
- }
372
- // CIL[DOC-VECTOR type="context" content="purpose='Defines mapAgentDocsToChunkData'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
373
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
374
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
375
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
376
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
377
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
378
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:mapAgentDocsToChunkData:function"]
379
-
380
- /**
381
- * Registers tools for testing authentication and updating pipeline statuses in the MCP server. This module facilitates the management of file statuses within a project pipeline.
382
- *
383
- * @macro Tool registration function for MCP server.
384
- * @micro Utilizes asynchronous database operations to update project file statuses based on input parameters.
385
- * @inputSpec
386
- * - server: McpServer (required) — The MCP server instance to register tools with.
387
- * @outputSpec Promise<void> — No specific return value.
388
- * @sideEffects Database writes to update project file statuses.
389
- * @stability stable
390
- * @calls adminDb.from, adminDb.update
391
- * @cil-generated
392
- */
393
- // CIL[BEGIN stable_id="~/.framework/mcp/tools/cil/pipeline.ts:register:function" type="function" identity="register" parent="~/.framework/mcp/tools/cil/pipeline.ts"]
394
- // CIL[DOC-MACRO purpose="Tool registration function for MCP server."]
395
- // CIL[DOC-RESPONSIBILITY responsibility="Utilizes asynchronous database operations to update project file statuses based on input parameters."]
396
- // CIL[DOC-CONTEXT module="pipeline" layer="app-specific" related_files=".framework/functions/_shared/cil.ts,.framework/mcp/shared/db.ts,.framework/mcp/tools/cil/pipeline.ts"]
397
- // CIL[DOC-CONTRACT inputs="server: McpServer (required) — The MCP server instance to register tools with." outputs="Promise<void> — No specific return value." errors="none" side_effects="Database writes to update project file statuses."]
398
- // CIL[DOC-MICRO logic_summary="Utilizes asynchronous database operations to update project file statuses based on input parameters." notable_decisions="[]"]
399
- // CIL[DOC-CONFIDENCE pass="second" score="0.90" flags="none"]
400
- // CIL[DOC-STABILITY stability="stable"]
401
- export function register(server: McpServer) {
402
-
403
- server.registerTool(
404
- 'spine_cil_test_auth',
405
- {
406
- description: 'Test authentication and module loading',
407
- inputSchema: z.object({}),
408
- },
409
- async () => {
410
- return {
411
- content: [{
412
- type: 'text',
413
- text: JSON.stringify({ success: true, message: 'Pipeline tools loaded successfully' }, null, 2),
414
- }],
415
- }
416
- }
417
- )
418
-
419
- server.registerTool(
420
- 'spine_cil_update_pipeline_status',
421
- {
422
- description: 'Update a file\'s pipeline status. Call at the end of each agent-run step. Standard statuses follow the 0–8 pipeline, but custom temporary statuses are also allowed.',
423
- inputSchema: z.object({
424
- project_id: z.string().uuid().describe('The cil_project UUID'),
425
- file_path: z.string().describe('Relative file path within the repository'),
426
- status: z.string().describe('File status — standard statuses follow the 0–8 pipeline, but custom temporary statuses are allowed'),
427
- metadata: z.object({}).passthrough().optional().describe('Additional metadata to store with the status update'),
428
- }),
429
- },
430
- async ({ project_id, file_path, status, metadata = {} }) => {
431
- const [projectRes] = await Promise.allSettled([
432
- adminDb.from('items').select('id, title, data').eq('id', project_id).maybeSingle(),
433
- ])
434
-
435
- const project = projectRes.status === 'fulfilled' ? projectRes.value.data : null
436
- if (!project) {
437
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'Project not found' }, null, 2) }] }
438
- }
439
-
440
- const pipelineData = project.data || {}
441
- const fileStatuses = pipelineData.file_statuses || {}
442
-
443
- fileStatuses[file_path] = status
444
- fileStatuses[`${file_path}_updated`] = new Date().toISOString()
445
- if (Object.keys(metadata).length > 0) {
446
- Object.assign(fileStatuses, { [`${file_path}_meta`]: metadata })
447
- }
448
-
449
- const [updateRes] = await Promise.allSettled([
450
- adminDb.from('items').update({
451
- data: { ...pipelineData, file_statuses: fileStatuses },
452
- }).eq('id', project_id).select()
453
- ])
454
-
455
- if (updateRes.status === 'rejected' || !updateRes.value.data) {
456
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'Failed to update status' }, null, 2) }] }
457
- }
458
-
459
- return {
460
- content: [{
461
- type: 'text',
462
- text: JSON.stringify({
463
- success: true,
464
- project_id,
465
- file_path,
466
- new_status: status,
467
- updated_at: fileStatuses[`${file_path}_updated`],
468
- }, null, 2),
469
- }],
470
- }
471
- }
472
- )
473
-
474
- server.registerTool(
475
- 'spine_cil_store_markers',
476
- {
477
- description: `Parse CIL[BEGIN]/CIL[END] markers and DOC tags from a source file and upsert chunk records in the DB. The file must already be saved to disk before calling this.
478
-
479
- Key constraints:
480
- - file_path must be relative from repo root — never absolute
481
- - file_hash must be the SHA256 of the current file content on disk (shasum -a 256 {path} | awk '{print $1}')
482
- - start_line/end_line are the 1-based line numbers of the CIL[BEGIN]/CIL[END] lines themselves
483
- - stable_id format: {canonical_path}:{identity_lowercase}:{type}
484
- - parent: stable_id of direct parent, or "none" for top-level chunks
485
-
486
- Returns: { ok, created, updated, results[] } — verify ok: true and counts match before continuing.`,
487
- inputSchema: z.object({
488
- project_id: z.string().uuid().describe('The cil_project UUID'),
489
- file_path: z.string().describe('Relative path from repo root'),
490
- file_hash: z.string().optional().describe('SHA256 of the current file content'),
491
- markers: z.array(z.object({
492
- stable_id: z.string().describe('Stable chunk ID'),
493
- chunk_id: z.string().optional().describe('Legacy chunk ID (old format)'),
494
- start_line: z.number().int().min(1),
495
- end_line: z.number().int().min(1),
496
- type: z.string(),
497
- identity: z.string(),
498
- parent: z.string(),
499
- })).optional().describe('Chunk boundaries extracted from the annotated source — if omitted, all CIL[BEGIN/END] markers found in the file are used'),
500
- }),
501
- },
502
- async ({ project_id, file_path, file_hash, markers }) => {
503
- const { data: projectRows } = await adminDb.from('items').select('id, data, account_id')
504
- .filter('data->>kb_type', 'eq', 'cil_project')
505
- .eq('id', project_id)
506
- .eq('is_active', true)
507
- const projectItem = (projectRows || [])[0]
508
- if (!projectItem) {
509
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Project not found: ${project_id}` }) }] }
510
- }
511
-
512
- const accountId: string = projectItem.account_id || ''
513
- if (!accountId) {
514
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Project has no account_id — cannot stamp chunks' }) }] }
515
- }
516
-
517
- const repoPath: string = projectItem.data?.repo_path || ''
518
- if (!repoPath) {
519
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: 'Project has no repo_path configured' }) }] }
520
- }
521
-
522
- const absolutePath = path.join(repoPath, file_path.replace(/^\//, ''))
523
- if (!fs.existsSync(absolutePath)) {
524
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Source file not found on disk: ${absolutePath}` }) }] }
525
- }
526
-
527
- const content = fs.readFileSync(absolutePath, 'utf-8')
528
- const computedHash = computeFileHash(content)
529
- if (file_hash && computedHash !== file_hash) {
530
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Hash mismatch: provided ${file_hash} != computed ${computedHash}` }) }] }
531
- }
532
-
533
- const lines = content.split('\n')
534
- const parsed = parseAgentCilMarkers(lines)
535
- const parsedById = new Map(parsed.map(m => [m.stable_id, m]))
536
-
537
- const markersToStore = (markers && markers.length > 0) ? markers : parsed
538
- const providedIds = new Set(markersToStore.map(m => m.stable_id))
539
- const sourceIds = new Set(parsed.map(m => m.stable_id))
540
- const missingInSource = markersToStore.filter(m => !sourceIds.has(m.stable_id))
541
- const extraInSource = parsed.filter(m => !providedIds.has(m.stable_id))
542
- if (missingInSource.length > 0 || extraInSource.length > 0) {
543
- return {
544
- content: [{
545
- type: 'text',
546
- text: JSON.stringify({
547
- ok: false,
548
- error: `Marker mismatch: missing_in_source=[${missingInSource.map(m => m.stable_id).join(',')}], extra_in_source=[${extraInSource.map(m => m.stable_id).join(',')}]`,
549
- }),
550
- }],
551
- }
552
- }
553
-
554
- let chunkTypeId: string, chunkDesignSchema: Record<string, any>, chunkValidationSchema: Record<string, any>
555
- let fileTypeId: string, fileDesignSchema: Record<string, any>, fileValidationSchema: Record<string, any>
556
- try {
557
- const [chunkTypeRecord, fileTypeRecord] = await Promise.all([
558
- resolveTypeRecord('item', 'cil_chunk'),
559
- resolveTypeRecord('item', 'cil_file')
560
- ])
561
- chunkTypeId = chunkTypeRecord.id
562
- chunkDesignSchema = chunkTypeRecord.design_schema
563
- chunkValidationSchema = chunkTypeRecord.validation_schema
564
- fileTypeId = fileTypeRecord.id
565
- fileDesignSchema = fileTypeRecord.design_schema
566
- fileValidationSchema = fileTypeRecord.validation_schema
567
- } catch (e: any) {
568
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `CIL type not found — run migrations first: ${e.message}` }) }] }
569
- }
570
-
571
- const now = new Date().toISOString()
572
- const versionId = projectItem.data?.active_version_id || '0.1.0'
573
-
574
- const { data: existingFile } = await adminDb.from('items').select('id, data')
575
- .filter('data->>kb_type', 'eq', 'cil_file')
576
- .filter('data->>project_id', 'eq', project_id)
577
- .filter('data->>file_path', 'eq', file_path)
578
- .eq('is_active', true)
579
- .maybeSingle()
580
-
581
- let fileId: string
582
- if (existingFile) {
583
- fileId = existingFile.id
584
- try {
585
- const updatedFileData = {
586
- ...existingFile.data,
587
- file_hash: computedHash,
588
- version_id: versionId,
589
- updated_at: now,
590
- }
591
- await adminDb.from('items')
592
- .update({ data: updatedFileData, updated_at: now })
593
- .eq('id', fileId)
594
- } catch {
595
- // File metadata update is best-effort; continue with chunk sync
596
- }
597
- } else {
598
- const fileStableId = toCanonicalPath(repoPath, absolutePath)
599
- const fileData = {
600
- kb_type: 'cil_file',
601
- project_id,
602
- file_path,
603
- file_hash,
604
- stable_id: fileStableId,
605
- version_id: versionId,
606
- status: '2-chunked', // Files reach this status after chunking
607
- last_status_at: now,
608
- }
609
- const { data: newFile, error: fileError } = await adminDb.from('items')
610
- .insert({
611
- title: file_path,
612
- type_id: fileTypeId,
613
- account_id: accountId,
614
- design_schema: fileDesignSchema,
615
- validation_schema: fileValidationSchema,
616
- is_active: true,
617
- data: fileData,
618
- })
619
- .select('id')
620
- .maybeSingle()
621
- if (fileError || !newFile) {
622
- return { content: [{ type: 'text', text: JSON.stringify({ ok: false, error: `Failed to create cil_file item: ${fileError?.message || 'unknown'}` }) }] }
623
- }
624
- fileId = newFile.id
625
- }
626
-
627
- const { data: existingChunks } = await adminDb.from('items').select('id, data')
628
- .filter('data->>kb_type', 'eq', 'cil_chunk')
629
- .filter('data->>project_id', 'eq', project_id)
630
- .filter('data->>file_path', 'eq', file_path)
631
- .eq('is_active', true)
632
- .limit(1000)
633
- const existingByChunkId = new Map((existingChunks || []).map((c: any) => [c.data?.stable_id || c.data?.legacy_chunk_id || c.data?.chunk_id || c.id, c]))
634
- const existingIds = new Set((existingChunks || []).map((c: any) => c.id))
635
-
636
- const results: any[] = []
637
- const errors: string[] = []
638
- const usedIds = new Set<string>()
639
-
640
- for (const m of markersToStore) {
641
- const _parsed = parsedById.get(m.stable_id)!
642
- const codeContent = lines.slice(m.start_line, m.end_line - 1).join('\n')
643
- const docs = parseAgentCilDocs(lines, m.start_line, m.end_line)
644
- const docFields = mapAgentDocsToChunkData(docs)
645
- const fullContentHash = computeContentHash(codeContent)
646
- const tokenCount = estimateTokens(codeContent)
647
-
648
- const mm = m as any
649
- const parentStableId = mm.parent === 'none' ? null : mm.parent
650
- const baseData = {
651
- kb_type: 'cil_chunk',
652
- stable_id: mm.stable_id,
653
- chunk_name: m.identity,
654
- project_id,
655
- file_path,
656
- file_id: fileId, // Link to parent file item for existing embedding/mapping functions
657
- chunk_type: m.type,
658
- parent_id: parentStableId,
659
- parent_stable_id: parentStableId,
660
- version_id: versionId,
661
- line_start: m.start_line,
662
- line_end: m.end_line,
663
- stored_hash: fullContentHash,
664
- content_hash: fullContentHash,
665
- code_content: codeContent,
666
- token_count: tokenCount,
667
- is_dead_code: false,
668
- review_status: 'approved',
669
- boundary_confidence: 'high',
670
- boundary_source: 'agent_markers',
671
- ...docFields,
672
- }
673
-
674
- const existing: any = existingByChunkId.get(m.stable_id)
675
- if (existing) {
676
- try {
677
- const newData = { ...existing.data, ...baseData, updated_at: now }
678
- const { error } = await adminDb.from('items')
679
- .update({ data: newData, title: `${file_path}::${m.identity}`, updated_at: now })
680
- .eq('id', existing.id)
681
- if (error) errors.push(`${m.stable_id}: ${error.message}`)
682
- else {
683
- usedIds.add(existing.id)
684
- results.push({ stable_id: m.stable_id, action: 'updated', id: existing.id })
685
- }
686
- } catch (err: any) {
687
- errors.push(`${m.stable_id}: ${err?.message || String(err)}`)
688
- }
689
- } else {
690
- try {
691
- const { data: newChunk, error } = await adminDb.from('items')
692
- .insert({
693
- title: `${file_path}::${m.identity}`,
694
- type_id: chunkTypeId,
695
- account_id: accountId,
696
- design_schema: chunkDesignSchema,
697
- validation_schema: chunkValidationSchema,
698
- is_active: true,
699
- data: baseData,
700
- })
701
- .select('id')
702
- .maybeSingle()
703
- if (error) errors.push(`${m.stable_id}: ${error.message}`)
704
- else {
705
- if (newChunk?.id) usedIds.add(newChunk.id)
706
- results.push({ stable_id: m.stable_id, action: 'created', id: newChunk?.id })
707
- }
708
- } catch (err: any) {
709
- errors.push(`${m.stable_id}: ${err?.message || String(err)}`)
710
- }
711
- }
712
- }
713
-
714
- const idsToDeactivate = [...existingIds].filter((id: any) => !usedIds.has(id))
715
- for (const orphanId of idsToDeactivate) {
716
- try {
717
- const { error: deactError } = await adminDb.from('items')
718
- .update({ is_active: false, updated_at: now })
719
- .eq('id', orphanId)
720
- if (deactError) errors.push(`deactivate orphan ${orphanId}: ${deactError.message}`)
721
- } catch (err: any) {
722
- errors.push(`deactivate orphan ${orphanId}: ${err?.message || String(err)}`)
723
- }
724
- }
725
-
726
- const { count: liveChunkCount } = await adminDb.from('items')
727
- .select('*', { count: 'exact', head: true })
728
- .filter('data->>kb_type', 'eq', 'cil_chunk')
729
- .filter('data->>project_id', 'eq', project_id)
730
- .eq('is_active', true)
731
- if (liveChunkCount !== null) {
732
- try {
733
- await adminDb.from('items')
734
- .update({ data: { ...projectItem.data, chunk_count: liveChunkCount } })
735
- .eq('id', project_id)
736
- } catch (err: any) {
737
- errors.push(`project count update: ${err?.message || String(err)}`)
738
- }
739
- }
740
-
741
- return {
742
- content: [{
743
- type: 'text',
744
- text: JSON.stringify({
745
- ok: errors.length === 0,
746
- project_id,
747
- file_path,
748
- file_id: fileId,
749
- file_hash: computedHash,
750
- chunk_count: markersToStore.length,
751
- created: results.filter(r => r.action === 'created').length,
752
- updated: results.filter(r => r.action === 'updated').length,
753
- errors: errors.length > 0 ? errors : undefined,
754
- results,
755
- }, null, 2),
756
- }],
757
- }
758
- }
759
- )
760
- }
761
- // CIL[DOC-VECTOR type="context" content="purpose='Tool registration function for MCP server.'; No verified external callers; imports: .framework/mcp/shared/db.ts,.framework/functions/_shared/cil.ts"]
762
- // CIL[DOC-VECTOR type="blast_radius" content="No direct caller data from CIL graph; local impact only"]
763
- // CIL[DOC-VECTOR type="configuration" content="No environment or build configuration dependencies identified"]
764
- // CIL[DOC-VECTOR type="constraint" content="Standard runtime; no special invariants documented"]
765
- // CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
766
- // CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
767
- // CIL[END stable_id="~/.framework/mcp/tools/cil/pipeline.ts:register:function"]