codetrellis 0.0.0-stage → 0.2.0

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 (449) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +27 -2
  3. package/bin/codetrellis.mjs +4 -0
  4. package/package.json +43 -4
  5. package/reader/material-reader.mjs +130346 -0
  6. package/resources/tree-sitter/README.md +150 -0
  7. package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
  8. package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
  9. package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
  10. package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
  11. package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
  12. package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
  13. package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
  14. package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
  15. package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
  16. package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
  17. package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
  18. package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
  19. package/resources/tree-sitter/tree-sitter.wasm +0 -0
  20. package/src/backend/agent/claude-code-watcher.js +270 -0
  21. package/src/backend/index.js +8 -0
  22. package/src/backend/lib/sha256-file.js +39 -0
  23. package/src/backend/lib/zip-entries.js +98 -0
  24. package/src/backend/lifecycle.js +102 -0
  25. package/src/backend/mcp/binding-headers.js +54 -0
  26. package/src/backend/mcp/client-identity.js +44 -0
  27. package/src/backend/mcp/connector/command.js +110 -0
  28. package/src/backend/mcp/connector/core.js +278 -0
  29. package/src/backend/mcp/connector/files.js +121 -0
  30. package/src/backend/mcp/connector/hook.js +284 -0
  31. package/src/backend/mcp/connector/main.js +126 -0
  32. package/src/backend/mcp/connector/sse-upstream.js +152 -0
  33. package/src/backend/mcp/helpers.js +43 -0
  34. package/src/backend/mcp/prompt-builders.js +104 -0
  35. package/src/backend/mcp/resources.js +197 -0
  36. package/src/backend/mcp/server.js +813 -0
  37. package/src/backend/mcp/skill-guide.js +1528 -0
  38. package/src/backend/mcp/tools/architecture-tools.js +273 -0
  39. package/src/backend/mcp/tools/audio-tools.js +117 -0
  40. package/src/backend/mcp/tools/awareness-tools.js +623 -0
  41. package/src/backend/mcp/tools/budget-tools.js +185 -0
  42. package/src/backend/mcp/tools/channel-tools.js +205 -0
  43. package/src/backend/mcp/tools/contribution-tools.js +181 -0
  44. package/src/backend/mcp/tools/drift-tools.js +252 -0
  45. package/src/backend/mcp/tools/git-tools.js +316 -0
  46. package/src/backend/mcp/tools/governance-tools.js +175 -0
  47. package/src/backend/mcp/tools/graph-tools.js +181 -0
  48. package/src/backend/mcp/tools/intake-tools.js +244 -0
  49. package/src/backend/mcp/tools/mobile-tools.js +118 -0
  50. package/src/backend/mcp/tools/peer-tools.js +330 -0
  51. package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
  52. package/src/backend/mcp/tools/plan-tools.js +680 -0
  53. package/src/backend/mcp/tools/presence-tools.js +185 -0
  54. package/src/backend/mcp/tools/project-config-tools.js +150 -0
  55. package/src/backend/mcp/tools/review-tools.js +172 -0
  56. package/src/backend/mcp/tools/session-tools.js +554 -0
  57. package/src/backend/mcp/tools/system-docs-tools.js +168 -0
  58. package/src/backend/mcp/tools/terminal-tools.js +186 -0
  59. package/src/backend/mcp/tools/test-tools.js +117 -0
  60. package/src/backend/mcp/tools/ui-tools.js +356 -0
  61. package/src/backend/mcp/types.js +15 -0
  62. package/src/backend/middleware/local-auth.js +116 -0
  63. package/src/backend/server.js +5951 -0
  64. package/src/backend/services/agent-event-log.js +350 -0
  65. package/src/backend/services/architecture-rule.js +584 -0
  66. package/src/backend/services/architecture-rules.js +275 -0
  67. package/src/backend/services/artefact-content-service.js +181 -0
  68. package/src/backend/services/artefact-service.js +305 -0
  69. package/src/backend/services/artefact-watcher.js +167 -0
  70. package/src/backend/services/ast-parser.js +327 -0
  71. package/src/backend/services/audio-buffer-service.js +152 -0
  72. package/src/backend/services/awareness-notices.js +139 -0
  73. package/src/backend/services/awareness-replies.js +194 -0
  74. package/src/backend/services/awareness-service.js +344 -0
  75. package/src/backend/services/awareness-signals.js +267 -0
  76. package/src/backend/services/baseline-store.js +83 -0
  77. package/src/backend/services/branch-workstreams.js +341 -0
  78. package/src/backend/services/breakpoint-service.js +584 -0
  79. package/src/backend/services/brief-service.js +299 -0
  80. package/src/backend/services/budget-service.js +528 -0
  81. package/src/backend/services/callsites/base.js +15 -0
  82. package/src/backend/services/callsites/csharp.js +148 -0
  83. package/src/backend/services/callsites/go.js +163 -0
  84. package/src/backend/services/callsites/index.js +53 -0
  85. package/src/backend/services/callsites/kotlin.js +123 -0
  86. package/src/backend/services/callsites/process-env.js +125 -0
  87. package/src/backend/services/callsites/python.js +91 -0
  88. package/src/backend/services/callsites/ruby.js +164 -0
  89. package/src/backend/services/callsites/shared.js +198 -0
  90. package/src/backend/services/callsites/swift.js +115 -0
  91. package/src/backend/services/callsites/typescript.js +87 -0
  92. package/src/backend/services/capability-token.js +108 -0
  93. package/src/backend/services/change-check.js +156 -0
  94. package/src/backend/services/channel-dispatcher-service.js +235 -0
  95. package/src/backend/services/channel-event-file-service.js +125 -0
  96. package/src/backend/services/channel-event-service.js +297 -0
  97. package/src/backend/services/check-runs.js +177 -0
  98. package/src/backend/services/checkout-identity.js +73 -0
  99. package/src/backend/services/claude-code-parallel.js +221 -0
  100. package/src/backend/services/claude-desktop-config.js +186 -0
  101. package/src/backend/services/clock.js +57 -0
  102. package/src/backend/services/cloud-files.js +191 -0
  103. package/src/backend/services/coalesce.js +50 -0
  104. package/src/backend/services/code-breakpoints.js +291 -0
  105. package/src/backend/services/comment-service.js +168 -0
  106. package/src/backend/services/commit-attribution.js +134 -0
  107. package/src/backend/services/commit-edges.js +99 -0
  108. package/src/backend/services/confined-fs.js +241 -0
  109. package/src/backend/services/conformity-gate.js +132 -0
  110. package/src/backend/services/contribution-service.js +409 -0
  111. package/src/backend/services/coverage-service.js +173 -0
  112. package/src/backend/services/criteria-service.js +721 -0
  113. package/src/backend/services/criterion-checks.js +387 -0
  114. package/src/backend/services/criterion-loop-service.js +411 -0
  115. package/src/backend/services/cross-system-service.js +231 -0
  116. package/src/backend/services/database.js +916 -0
  117. package/src/backend/services/db-schema.js +1358 -0
  118. package/src/backend/services/deviation-service.js +344 -0
  119. package/src/backend/services/diff-engine.js +168 -0
  120. package/src/backend/services/evidence.js +363 -0
  121. package/src/backend/services/external-intake-service.js +269 -0
  122. package/src/backend/services/external-pointer-service.js +195 -0
  123. package/src/backend/services/external-refs-service.js +214 -0
  124. package/src/backend/services/file-history.js +158 -0
  125. package/src/backend/services/file-watcher.js +193 -0
  126. package/src/backend/services/folder-requests.js +118 -0
  127. package/src/backend/services/freeze-service.js +189 -0
  128. package/src/backend/services/gemini-cli-hook.js +172 -0
  129. package/src/backend/services/git-activity-service.js +325 -0
  130. package/src/backend/services/git-blobs.js +70 -0
  131. package/src/backend/services/git-branches.js +357 -0
  132. package/src/backend/services/git-checkout.js +153 -0
  133. package/src/backend/services/git-commit-service.js +91 -0
  134. package/src/backend/services/git-env.js +121 -0
  135. package/src/backend/services/git-identity.js +84 -0
  136. package/src/backend/services/git-refs.js +386 -0
  137. package/src/backend/services/git-safety.js +58 -0
  138. package/src/backend/services/grant-guard.js +67 -0
  139. package/src/backend/services/html-view-policy.js +135 -0
  140. package/src/backend/services/human-decision.js +55 -0
  141. package/src/backend/services/importers.js +159 -0
  142. package/src/backend/services/intent-service.js +105 -0
  143. package/src/backend/services/ipc-dispatcher.js +164 -0
  144. package/src/backend/services/item-git-state.js +208 -0
  145. package/src/backend/services/line-changes.js +232 -0
  146. package/src/backend/services/line-history.js +174 -0
  147. package/src/backend/services/local-api-changes.js +40 -0
  148. package/src/backend/services/logger.js +217 -0
  149. package/src/backend/services/material-footprints.js +203 -0
  150. package/src/backend/services/material-place.js +82 -0
  151. package/src/backend/services/material-reader/child.js +4 -0
  152. package/src/backend/services/material-reader/docx-markdown.js +198 -0
  153. package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
  154. package/src/backend/services/material-reader/quote.js +44 -0
  155. package/src/backend/services/material-reader/read.js +430 -0
  156. package/src/backend/services/material-reader/reader-host.js +202 -0
  157. package/src/backend/services/material-signals.js +141 -0
  158. package/src/backend/services/mcp-capabilities.js +390 -0
  159. package/src/backend/services/mdns-service.js +304 -0
  160. package/src/backend/services/mobile-api-server.js +281 -0
  161. package/src/backend/services/mobile-approvals.js +306 -0
  162. package/src/backend/services/mobile-awareness.js +180 -0
  163. package/src/backend/services/mobile-breakpoints.js +115 -0
  164. package/src/backend/services/mobile-budget.js +98 -0
  165. package/src/backend/services/mobile-freeze.js +106 -0
  166. package/src/backend/services/mobile-proposals.js +100 -0
  167. package/src/backend/services/mobile-rpc-service.js +1289 -0
  168. package/src/backend/services/mobile-workstreams.js +160 -0
  169. package/src/backend/services/monorepo-detector.js +131 -0
  170. package/src/backend/services/other-work.js +45 -0
  171. package/src/backend/services/pack-seal.js +129 -0
  172. package/src/backend/services/paired-device-service.js +192 -0
  173. package/src/backend/services/pairing-server.js +323 -0
  174. package/src/backend/services/pairing-service.js +200 -0
  175. package/src/backend/services/pantry-resolution-service.js +166 -0
  176. package/src/backend/services/parsers/base.js +124 -0
  177. package/src/backend/services/parsers/csharp.js +224 -0
  178. package/src/backend/services/parsers/go.js +180 -0
  179. package/src/backend/services/parsers/index.js +101 -0
  180. package/src/backend/services/parsers/java.js +103 -0
  181. package/src/backend/services/parsers/kotlin.js +252 -0
  182. package/src/backend/services/parsers/php.js +113 -0
  183. package/src/backend/services/parsers/python.js +189 -0
  184. package/src/backend/services/parsers/ruby.js +212 -0
  185. package/src/backend/services/parsers/rust.js +97 -0
  186. package/src/backend/services/parsers/swift.js +221 -0
  187. package/src/backend/services/parsers/typescript.js +235 -0
  188. package/src/backend/services/pattern-scan.js +65 -0
  189. package/src/backend/services/patterns.js +281 -0
  190. package/src/backend/services/peer-audit-service.js +123 -0
  191. package/src/backend/services/peer-auth.js +153 -0
  192. package/src/backend/services/peer-capabilities.js +209 -0
  193. package/src/backend/services/peer-connection-service.js +450 -0
  194. package/src/backend/services/peer-grants.js +33 -0
  195. package/src/backend/services/persistence.js +116 -0
  196. package/src/backend/services/personal-sync-service.js +232 -0
  197. package/src/backend/services/pipeline-approvals.js +72 -0
  198. package/src/backend/services/pipeline.js +232 -0
  199. package/src/backend/services/plan-arrivals.js +68 -0
  200. package/src/backend/services/plan-changes-service.js +273 -0
  201. package/src/backend/services/plan-conflict-service.js +288 -0
  202. package/src/backend/services/plan-dependencies.js +91 -0
  203. package/src/backend/services/plan-doc-guard.js +90 -0
  204. package/src/backend/services/plan-documents-service.js +275 -0
  205. package/src/backend/services/plan-event-service.js +154 -0
  206. package/src/backend/services/plan-file-refs.js +106 -0
  207. package/src/backend/services/plan-file-service.js +1564 -0
  208. package/src/backend/services/plan-history-service.js +156 -0
  209. package/src/backend/services/plan-import-service.js +261 -0
  210. package/src/backend/services/plan-item-service.js +1223 -0
  211. package/src/backend/services/plan-migrate-service.js +395 -0
  212. package/src/backend/services/plan-overlay-service.js +173 -0
  213. package/src/backend/services/plan-phases-service.js +182 -0
  214. package/src/backend/services/plan-progress-service.js +134 -0
  215. package/src/backend/services/plan-review-service.js +262 -0
  216. package/src/backend/services/plan-service.js +682 -0
  217. package/src/backend/services/plan-status.js +113 -0
  218. package/src/backend/services/plan-template-publish-service.js +217 -0
  219. package/src/backend/services/plan-templates-service.js +242 -0
  220. package/src/backend/services/plan-templates.js +1164 -0
  221. package/src/backend/services/planned-overlap-actions.js +200 -0
  222. package/src/backend/services/plans-home.js +224 -0
  223. package/src/backend/services/play-forward.js +256 -0
  224. package/src/backend/services/playback-service.js +117 -0
  225. package/src/backend/services/power-service.js +167 -0
  226. package/src/backend/services/power-signals.js +81 -0
  227. package/src/backend/services/pr-draft-service.js +142 -0
  228. package/src/backend/services/presence-service.js +122 -0
  229. package/src/backend/services/pricing.js +60 -0
  230. package/src/backend/services/project-config-service.js +474 -0
  231. package/src/backend/services/project-scanner.js +184 -0
  232. package/src/backend/services/projection-service.js +69 -0
  233. package/src/backend/services/push-notification-service.js +288 -0
  234. package/src/backend/services/recent-projects-service.js +204 -0
  235. package/src/backend/services/record-chain.js +162 -0
  236. package/src/backend/services/recurrence-rule.js +63 -0
  237. package/src/backend/services/recurring-agent.js +89 -0
  238. package/src/backend/services/recurring-scheduler.js +77 -0
  239. package/src/backend/services/recurring-service.js +276 -0
  240. package/src/backend/services/reference-service.js +169 -0
  241. package/src/backend/services/release-public-key.js +30 -0
  242. package/src/backend/services/release-signature.js +64 -0
  243. package/src/backend/services/remote-audio-service.js +224 -0
  244. package/src/backend/services/remote-interaction-service.js +275 -0
  245. package/src/backend/services/remote-terminal-service.js +324 -0
  246. package/src/backend/services/rendition/child/main.js +76 -0
  247. package/src/backend/services/rendition/engine-host.js +249 -0
  248. package/src/backend/services/rendition/engine-lock.js +39 -0
  249. package/src/backend/services/rendition/engine-lock.json +14 -0
  250. package/src/backend/services/rendition/engine-manifest.js +97 -0
  251. package/src/backend/services/rendition/network-proof.js +73 -0
  252. package/src/backend/services/rendition/rendition-service.js +175 -0
  253. package/src/backend/services/replay-frames.js +387 -0
  254. package/src/backend/services/replay-state.js +201 -0
  255. package/src/backend/services/resolvers/base.js +108 -0
  256. package/src/backend/services/resolvers/csharp.js +109 -0
  257. package/src/backend/services/resolvers/go.js +105 -0
  258. package/src/backend/services/resolvers/index.js +60 -0
  259. package/src/backend/services/resolvers/java.js +63 -0
  260. package/src/backend/services/resolvers/kotlin.js +109 -0
  261. package/src/backend/services/resolvers/php.js +89 -0
  262. package/src/backend/services/resolvers/python.js +154 -0
  263. package/src/backend/services/resolvers/ruby.js +103 -0
  264. package/src/backend/services/resolvers/rust.js +77 -0
  265. package/src/backend/services/resolvers/swift.js +98 -0
  266. package/src/backend/services/resolvers/typescript.js +71 -0
  267. package/src/backend/services/retention.js +54 -0
  268. package/src/backend/services/review-architecture.js +236 -0
  269. package/src/backend/services/review-attest.js +68 -0
  270. package/src/backend/services/review-bundle.js +226 -0
  271. package/src/backend/services/review-graduation.js +93 -0
  272. package/src/backend/services/review-host/bitbucket.js +79 -0
  273. package/src/backend/services/review-host/detect.js +80 -0
  274. package/src/backend/services/review-host/github.js +97 -0
  275. package/src/backend/services/review-host/gitlab.js +77 -0
  276. package/src/backend/services/review-host/host-state.js +103 -0
  277. package/src/backend/services/review-host/http.js +58 -0
  278. package/src/backend/services/review-host/switch.js +120 -0
  279. package/src/backend/services/review-marks.js +72 -0
  280. package/src/backend/services/review-notes.js +169 -0
  281. package/src/backend/services/review-other-work.js +90 -0
  282. package/src/backend/services/review-queue-service.js +147 -0
  283. package/src/backend/services/review-risk.js +127 -0
  284. package/src/backend/services/review-task.js +121 -0
  285. package/src/backend/services/rule-approvals.js +268 -0
  286. package/src/backend/services/rule-baseline.js +134 -0
  287. package/src/backend/services/rule-changes.js +162 -0
  288. package/src/backend/services/rule-preview.js +47 -0
  289. package/src/backend/services/rule-proposals.js +104 -0
  290. package/src/backend/services/rule-scope.js +76 -0
  291. package/src/backend/services/rulebook.js +286 -0
  292. package/src/backend/services/rules-at.js +56 -0
  293. package/src/backend/services/rules-overview.js +88 -0
  294. package/src/backend/services/schema-reconciler.js +250 -0
  295. package/src/backend/services/secret-store.js +119 -0
  296. package/src/backend/services/section-workstreams.js +95 -0
  297. package/src/backend/services/self-write-tracker.js +75 -0
  298. package/src/backend/services/sensor-bridge-service.js +285 -0
  299. package/src/backend/services/session-service.js +192 -0
  300. package/src/backend/services/settings-service.js +324 -0
  301. package/src/backend/services/signal-breakpoints.js +172 -0
  302. package/src/backend/services/signed-approval-record.js +86 -0
  303. package/src/backend/services/signed-approvals.js +244 -0
  304. package/src/backend/services/signoff-pack.js +328 -0
  305. package/src/backend/services/signoff-rows.js +114 -0
  306. package/src/backend/services/skill-arrival-service.js +138 -0
  307. package/src/backend/services/skill-model.js +193 -0
  308. package/src/backend/services/skill-use-service.js +140 -0
  309. package/src/backend/services/skills-service.js +150 -0
  310. package/src/backend/services/snapshot-compare-service.js +397 -0
  311. package/src/backend/services/source-control.js +189 -0
  312. package/src/backend/services/spec-links-service.js +123 -0
  313. package/src/backend/services/spec-proposal-withdraw.js +50 -0
  314. package/src/backend/services/spec-proposals-service.js +470 -0
  315. package/src/backend/services/sql/embedded.js +95 -0
  316. package/src/backend/services/sql/index.js +63 -0
  317. package/src/backend/services/sql/refs.js +357 -0
  318. package/src/backend/services/sql/schema.js +312 -0
  319. package/src/backend/services/sql/tokenizer.js +195 -0
  320. package/src/backend/services/stack-overlaps.js +117 -0
  321. package/src/backend/services/stack-service.js +225 -0
  322. package/src/backend/services/state-sync-service.js +384 -0
  323. package/src/backend/services/stuck-sensor-service.js +200 -0
  324. package/src/backend/services/system-discovery.js +481 -0
  325. package/src/backend/services/system-docs-service.js +701 -0
  326. package/src/backend/services/task-attachments-service.js +340 -0
  327. package/src/backend/services/task-grounding.js +60 -0
  328. package/src/backend/services/task-records/check-run-record.js +146 -0
  329. package/src/backend/services/task-records/check-runs.js +115 -0
  330. package/src/backend/services/task-records/heads.js +88 -0
  331. package/src/backend/services/task-records/material-reads.js +225 -0
  332. package/src/backend/services/task-records/read-record.js +100 -0
  333. package/src/backend/services/task-records/record.js +173 -0
  334. package/src/backend/services/task-records/run-record.js +136 -0
  335. package/src/backend/services/task-records/shared-state.js +548 -0
  336. package/src/backend/services/task-records/signing.js +140 -0
  337. package/src/backend/services/task-records/split-signals.js +52 -0
  338. package/src/backend/services/task-records/test-runs.js +164 -0
  339. package/src/backend/services/task-records/trust.js +243 -0
  340. package/src/backend/services/task-rules.js +81 -0
  341. package/src/backend/services/task-workstreams.js +90 -0
  342. package/src/backend/services/terminal-history-service.js +266 -0
  343. package/src/backend/services/terminal-service.js +267 -0
  344. package/src/backend/services/test-clock.js +53 -0
  345. package/src/backend/services/tests/grounding.js +266 -0
  346. package/src/backend/services/tests/junit.js +104 -0
  347. package/src/backend/services/tests/teammate-runs.js +134 -0
  348. package/src/backend/services/tests/test-results.js +234 -0
  349. package/src/backend/services/tree-watcher.js +204 -0
  350. package/src/backend/services/trellis-service.js +204 -0
  351. package/src/backend/services/trusted-roots.js +186 -0
  352. package/src/backend/services/update-download-service.js +342 -0
  353. package/src/backend/services/update-service.js +266 -0
  354. package/src/backend/services/watch-ignore.js +76 -0
  355. package/src/backend/services/webhook-egress.js +206 -0
  356. package/src/backend/services/webrtc-service.js +413 -0
  357. package/src/backend/services/work-changes.js +59 -0
  358. package/src/backend/services/workstream-binding.js +82 -0
  359. package/src/backend/services/workstream-commits.js +116 -0
  360. package/src/backend/services/workstream-imports.js +177 -0
  361. package/src/backend/services/workstream-service.js +335 -0
  362. package/src/backend/services/workstream-symbols.js +223 -0
  363. package/src/backend/services/workstream-watch-service.js +391 -0
  364. package/src/backend/services/worktree-service.js +235 -0
  365. package/src/cli/agent.js +100 -0
  366. package/src/cli/args.js +201 -0
  367. package/src/cli/conformity.js +106 -0
  368. package/src/cli/desktop.js +91 -0
  369. package/src/cli/main.js +409 -0
  370. package/src/cli/pipeline.js +109 -0
  371. package/src/cli/plan-verbs.js +259 -0
  372. package/src/cli/review-adapters.js +218 -0
  373. package/src/cli/review-output.js +93 -0
  374. package/src/cli/review-post.js +89 -0
  375. package/src/cli/review-sink.js +183 -0
  376. package/src/cli/review-skill.js +44 -0
  377. package/src/cli/review-verify.js +104 -0
  378. package/src/cli/review.js +386 -0
  379. package/src/cli/sarif.js +148 -0
  380. package/src/cli/verbs.js +359 -0
  381. package/src/shared/build-info.js +39 -0
  382. package/src/shared/lib/agent-review.js +199 -0
  383. package/src/shared/lib/agent-turns.js +140 -0
  384. package/src/shared/lib/awareness-digest.js +120 -0
  385. package/src/shared/lib/branch-name.js +45 -0
  386. package/src/shared/lib/breakpoint-words.js +118 -0
  387. package/src/shared/lib/budget-words.js +56 -0
  388. package/src/shared/lib/burst.js +69 -0
  389. package/src/shared/lib/call-entry.js +105 -0
  390. package/src/shared/lib/check-compare.js +42 -0
  391. package/src/shared/lib/check-words.js +216 -0
  392. package/src/shared/lib/csv.js +62 -0
  393. package/src/shared/lib/folder-entry.js +87 -0
  394. package/src/shared/lib/freeze-words.js +60 -0
  395. package/src/shared/lib/fuzzy.js +84 -0
  396. package/src/shared/lib/git-state-words.js +80 -0
  397. package/src/shared/lib/grep-entry.js +86 -0
  398. package/src/shared/lib/grounding-line.js +61 -0
  399. package/src/shared/lib/import-line.js +71 -0
  400. package/src/shared/lib/item-status.js +249 -0
  401. package/src/shared/lib/line-changes.js +53 -0
  402. package/src/shared/lib/locator.js +71 -0
  403. package/src/shared/lib/matcher.js +120 -0
  404. package/src/shared/lib/merge-order.js +65 -0
  405. package/src/shared/lib/open-findings.js +68 -0
  406. package/src/shared/lib/other-work.js +108 -0
  407. package/src/shared/lib/package-entry.js +142 -0
  408. package/src/shared/lib/plan-vocab.js +40 -0
  409. package/src/shared/lib/pptx-xml.js +86 -0
  410. package/src/shared/lib/proposal-words.js +61 -0
  411. package/src/shared/lib/recurrence.js +183 -0
  412. package/src/shared/lib/references.js +72 -0
  413. package/src/shared/lib/rule-pattern.js +56 -0
  414. package/src/shared/lib/sdp-fingerprint.js +115 -0
  415. package/src/shared/lib/sdp-minimal.js +123 -0
  416. package/src/shared/lib/secret-paths.js +34 -0
  417. package/src/shared/lib/signal-words.js +172 -0
  418. package/src/shared/lib/signoff.js +56 -0
  419. package/src/shared/lib/skills-note.js +60 -0
  420. package/src/shared/lib/spec-sections.js +78 -0
  421. package/src/shared/lib/symbol-entry.js +60 -0
  422. package/src/shared/lib/tool-phrasing.js +338 -0
  423. package/src/shared/lib/turn-gap.js +27 -0
  424. package/src/shared/lib/workstream-words.js +38 -0
  425. package/src/shared/lib/xlsx-xml.js +144 -0
  426. package/src/shared/lib/zip-reader.js +99 -0
  427. package/src/shared/types/agent.js +27 -0
  428. package/src/shared/types/architecture-rules.js +30 -0
  429. package/src/shared/types/ast.js +15 -0
  430. package/src/shared/types/breakpoint.js +33 -0
  431. package/src/shared/types/channel.js +41 -0
  432. package/src/shared/types/criteria.js +15 -0
  433. package/src/shared/types/graph.js +15 -0
  434. package/src/shared/types/index.js +53 -0
  435. package/src/shared/types/peer.js +36 -0
  436. package/src/shared/types/pipeline.js +15 -0
  437. package/src/shared/types/plan.js +15 -0
  438. package/src/shared/types/play-forward.js +15 -0
  439. package/src/shared/types/power.js +15 -0
  440. package/src/shared/types/presence.js +15 -0
  441. package/src/shared/types/project-config.js +35 -0
  442. package/src/shared/types/project.js +15 -0
  443. package/src/shared/types/record.js +15 -0
  444. package/src/shared/types/recurring.js +15 -0
  445. package/src/shared/types/review.js +15 -0
  446. package/src/shared/types/settings.js +114 -0
  447. package/src/shared/types/stack.js +15 -0
  448. package/src/shared/types/system-doc.js +15 -0
  449. package/src/shared/types/system.js +15 -0
@@ -0,0 +1,813 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var server_exports = {};
29
+ __export(server_exports, {
30
+ bindingSettled: () => bindingSettled,
31
+ enumerateRegisteredTools: () => enumerateRegisteredTools,
32
+ getMcpConfig: () => getMcpConfig,
33
+ getMcpSetup: () => getMcpSetup,
34
+ getMcpStatus: () => getMcpStatus,
35
+ listRegisteredToolArgs: () => listRegisteredToolArgs,
36
+ listRegisteredTools: () => listRegisteredTools,
37
+ setElectronScreenshotCapture: () => setElectronScreenshotCapture,
38
+ startMcpServer: () => startMcpServer,
39
+ stopMcpServer: () => stopMcpServer
40
+ });
41
+ module.exports = __toCommonJS(server_exports);
42
+ var _lazy____services_stuck_sensor_service = __toESM(require("../services/stuck-sensor-service"));
43
+ var import_capability_token = require("../services/capability-token");
44
+ var _lazy____server = __toESM(require("../server"));
45
+ var import_node_http = __toESM(require("node:http"));
46
+ var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
47
+ var import_sse = require("@modelcontextprotocol/sdk/server/sse.js");
48
+ var import_database = require("../services/database");
49
+ var import_server = require("../server");
50
+ var import_diff_engine = require("../services/diff-engine");
51
+ var planService = __toESM(require("../services/plan-service"));
52
+ var commentService = __toESM(require("../services/comment-service"));
53
+ var sessionService = __toESM(require("../services/session-service"));
54
+ var import_binding_headers = require("./binding-headers");
55
+ var import_folder_requests = require("../services/folder-requests");
56
+ var import_awareness_notices = require("../services/awareness-notices");
57
+ var import_awareness_replies = require("../services/awareness-replies");
58
+ var import_spec_proposals_service = require("../services/spec-proposals-service");
59
+ var import_planned_overlap_actions = require("../services/planned-overlap-actions");
60
+ var import_workstream_binding = require("../services/workstream-binding");
61
+ var import_workstream_service = require("../services/workstream-service");
62
+ var import_node_url = require("node:url");
63
+ var budgetService = __toESM(require("../services/budget-service"));
64
+ var taskAttachmentsService = __toESM(require("../services/task-attachments-service"));
65
+ var planItemService = __toESM(require("../services/plan-item-service"));
66
+ var import_skill_model = require("../services/skill-model");
67
+ var import_skill_arrival_service = require("../services/skill-arrival-service");
68
+ var planEventService = __toESM(require("../services/plan-event-service"));
69
+ var planChangesService = __toESM(require("../services/plan-changes-service"));
70
+ var planFileService = __toESM(require("../services/plan-file-service"));
71
+ var externalRefsService = __toESM(require("../services/external-refs-service"));
72
+ var externalPointerService = __toESM(require("../services/external-pointer-service"));
73
+ var systemDocsService = __toESM(require("../services/system-docs-service"));
74
+ var terminalService = __toESM(require("../services/terminal-service"));
75
+ var planImportService = __toESM(require("../services/plan-import-service"));
76
+ var presenceService = __toESM(require("../services/presence-service"));
77
+ var projectConfigService = __toESM(require("../services/project-config-service"));
78
+ var import_criteria_service = require("../services/criteria-service");
79
+ var import_criterion_loop_service = require("../services/criterion-loop-service");
80
+ var import_artefact_service = require("../services/artefact-service");
81
+ var import_artefact_watcher = require("../services/artefact-watcher");
82
+ var import_brief_service = require("../services/brief-service");
83
+ var import_reader_host = require("../services/material-reader/reader-host");
84
+ var import_plan_templates_service = require("../services/plan-templates-service");
85
+ var import_plan_templates = require("../services/plan-templates");
86
+ var import_plan_template_publish_service = require("../services/plan-template-publish-service");
87
+ var import_deviation_service = require("../services/deviation-service");
88
+ var import_trellis_service = require("../services/trellis-service");
89
+ var import_persistence = require("../services/persistence");
90
+ var import_settings_service = require("../services/settings-service");
91
+ var import_mcp_capabilities = require("../services/mcp-capabilities");
92
+ var import_peer_capabilities = require("../services/peer-capabilities");
93
+ var import_logger = require("../services/logger");
94
+ var import_cross_system_service = require("../services/cross-system-service");
95
+ var import_recent_projects_service = require("../services/recent-projects-service");
96
+ var import_skill_guide = require("./skill-guide");
97
+ var import_client_identity = require("./client-identity");
98
+ var import_agent_event_log = require("../services/agent-event-log");
99
+ var import_breakpoint_service = require("../services/breakpoint-service");
100
+ var import_code_breakpoints = require("../services/code-breakpoints");
101
+ var import_signal_breakpoints = require("../services/signal-breakpoints");
102
+ var import_files = require("./connector/files");
103
+ var import_command = require("./connector/command");
104
+ var import_node_fs = __toESM(require("node:fs"));
105
+ var import_reference_service = require("../services/reference-service");
106
+ var import_architecture_tools = require("./tools/architecture-tools");
107
+ var import_terminal_tools = require("./tools/terminal-tools");
108
+ var import_graph_tools = require("./tools/graph-tools");
109
+ var import_drift_tools = require("./tools/drift-tools");
110
+ var import_ui_tools = require("./tools/ui-tools");
111
+ var import_session_tools = require("./tools/session-tools");
112
+ var import_plan_tools = require("./tools/plan-tools");
113
+ var import_plan_item_tools = require("./tools/plan-item-tools");
114
+ var import_presence_tools = require("./tools/presence-tools");
115
+ var import_mobile_tools = require("./tools/mobile-tools");
116
+ var import_project_config_tools = require("./tools/project-config-tools");
117
+ var import_git_tools = require("./tools/git-tools");
118
+ var import_channel_tools = require("./tools/channel-tools");
119
+ var import_system_docs_tools = require("./tools/system-docs-tools");
120
+ var import_governance_tools = require("./tools/governance-tools");
121
+ var import_budget_tools = require("./tools/budget-tools");
122
+ var import_intake_tools = require("./tools/intake-tools");
123
+ var import_review_tools = require("./tools/review-tools");
124
+ var import_contribution_tools = require("./tools/contribution-tools");
125
+ var import_audio_tools = require("./tools/audio-tools");
126
+ var import_peer_tools = require("./tools/peer-tools");
127
+ var import_awareness_tools = require("./tools/awareness-tools");
128
+ var import_test_tools = require("./tools/test-tools");
129
+ var import_resources = require("./resources");
130
+ const DEFAULT_MCP_PORT = 19432;
131
+ const MAX_PORT_ATTEMPTS = 10;
132
+ const MAX_MCP_CONNECTIONS = 20;
133
+ const connectedServers = /* @__PURE__ */ new Map();
134
+ let httpServer = null;
135
+ let boundPort = DEFAULT_MCP_PORT;
136
+ const connectedTransports = /* @__PURE__ */ new Map();
137
+ const pendingResponses = /* @__PURE__ */ new Map();
138
+ globalThis.__screenshotResolve = (nonce, data) => {
139
+ const pending = pendingResponses.get(nonce);
140
+ if (pending) {
141
+ clearTimeout(pending.timer);
142
+ pendingResponses.delete(nonce);
143
+ pending.resolve(data);
144
+ }
145
+ };
146
+ globalThis.__presenceResolve = (nonce, data) => {
147
+ const pending = pendingResponses.get(nonce);
148
+ if (!pending) return false;
149
+ clearTimeout(pending.timer);
150
+ pendingResponses.delete(nonce);
151
+ pending.resolve(data);
152
+ return true;
153
+ };
154
+ let electronScreenshotCapture;
155
+ const pendingBindings = /* @__PURE__ */ new Map();
156
+ function bindingSettled(sessionId, maxMs = 2e3) {
157
+ const pending = pendingBindings.get(sessionId);
158
+ if (!pending) return Promise.resolve();
159
+ let timer;
160
+ const giveUp = new Promise((resolve) => {
161
+ timer = setTimeout(() => {
162
+ if (pendingBindings.get(sessionId) === pending) pendingBindings.delete(sessionId);
163
+ resolve();
164
+ }, maxMs);
165
+ });
166
+ return Promise.race([pending, giveUp]).finally(() => clearTimeout(timer));
167
+ }
168
+ function setElectronScreenshotCapture(captureFn) {
169
+ electronScreenshotCapture = captureFn;
170
+ }
171
+ function broadcastToolEvent(payload) {
172
+ let workstreamRoot;
173
+ try {
174
+ if (payload.sessionId) {
175
+ workstreamRoot = sessionService.getActiveSessions().find((s) => s.sessionId === payload.sessionId)?.workstreamRoot ?? void 0;
176
+ }
177
+ } catch {
178
+ }
179
+ (0, import_server.broadcast)("agent-event", {
180
+ id: (0, import_agent_event_log.eventId)("mcp-tool"),
181
+ timestamp: Date.now(),
182
+ source: "mcp",
183
+ type: payload.phase === "error" ? "tool_error" : "tool_call",
184
+ payload: workstreamRoot ? { ...payload, workstreamRoot } : payload
185
+ });
186
+ try {
187
+ const { recordToolCall } = _lazy____services_stuck_sensor_service;
188
+ recordToolCall({
189
+ tool: payload.tool,
190
+ args: payload.args,
191
+ phase: payload.phase,
192
+ sessionId: payload.sessionId,
193
+ error: payload.error
194
+ });
195
+ } catch {
196
+ }
197
+ try {
198
+ if (payload.sessionId) {
199
+ const session = sessionService.getActiveSessions().find((s) => s.sessionId === payload.sessionId);
200
+ budgetService.recordActivity({
201
+ sessionId: payload.sessionId,
202
+ planUid: session?.activePlanUid ?? null,
203
+ agentType: payload.agentType,
204
+ agentModel: payload.agentModel
205
+ });
206
+ }
207
+ } catch {
208
+ }
209
+ }
210
+ function summarizeArgs(args) {
211
+ if (args == null) return "";
212
+ try {
213
+ const json = JSON.stringify(args);
214
+ return json.length > 240 ? json.slice(0, 240) + "\u2026" : json;
215
+ } catch {
216
+ return "[unserializable]";
217
+ }
218
+ }
219
+ function inferAgentFromSession(sessionId) {
220
+ if (!sessionId) return { type: "mcp-agent", model: null };
221
+ const sessions = sessionService.getActiveSessions();
222
+ const match = sessions.find((s) => s.sessionId === sessionId);
223
+ if (!match) return { type: "mcp-agent", model: null };
224
+ return { type: match.agentType ?? "mcp-agent", model: match.model ?? null };
225
+ }
226
+ function buildToolDeps(sessionId) {
227
+ return {
228
+ broadcast: import_server.broadcast,
229
+ pendingResponses,
230
+ sessionId,
231
+ // Service modules
232
+ planService,
233
+ // Items as an agent reads them: a skill's `link` location is for people only (Phase 32 C1).
234
+ // …and a skill that arrived in a plan file stays out until a person accepts it (C1.4).
235
+ planItemService: (0, import_skill_model.agentView)(planItemService, (itemUid, skill) => (0, import_skill_arrival_service.pendingArrivals)(itemUid).has(skill)),
236
+ commentService,
237
+ sessionService,
238
+ taskAttachmentsService,
239
+ planEventService,
240
+ planFileService,
241
+ planChangesService,
242
+ externalRefsService,
243
+ externalPointerService,
244
+ systemDocsService,
245
+ terminalService,
246
+ planImportService,
247
+ presenceService,
248
+ projectConfigService,
249
+ // An agent's view of criteria only — see ToolDeps.criteriaService.
250
+ criteriaService: { listCriteria: import_criteria_service.listCriteria, getCriterion: import_criteria_service.getCriterion, addCriterionAsAgent: import_criteria_service.addCriterionAsAgent, CriterionError: import_criteria_service.CriterionError },
251
+ criterionLoop: { checkCriterion: import_criterion_loop_service.checkCriterion, submitChecked: import_criterion_loop_service.submitChecked, getWorklist: import_criterion_loop_service.getWorklist, runCheckRun: import_criterion_loop_service.runCheckRun, testsOlderThanCode: import_criterion_loop_service.testsOlderThanCode },
252
+ artefactService: { recordArtefact: import_artefact_service.recordArtefact, refreshArtefactHashes: import_artefact_service.refreshArtefactHashes, listArtefacts: import_artefact_service.listArtefacts, getArtefact: import_artefact_service.getArtefact, ArtefactError: import_artefact_service.ArtefactError },
253
+ startArtefactWatching: import_artefact_watcher.startArtefactWatching,
254
+ briefService: { getBrief: import_brief_service.getBrief, listMaterials: import_brief_service.listMaterials, skillsBlock: import_brief_service.skillsBlock },
255
+ readMaterial: import_reader_host.readMaterial,
256
+ // Specific functions
257
+ applyTemplate: import_plan_templates_service.applyTemplate,
258
+ listTemplates: import_plan_templates.listTemplates,
259
+ publishPlanAsTemplate: import_plan_template_publish_service.publishPlanAsTemplate,
260
+ getDeviations: import_deviation_service.getDeviations,
261
+ resolveDeviation: import_deviation_service.resolveDeviation,
262
+ reconcileDeviations: import_deviation_service.reconcileDeviations,
263
+ DeviationError: import_deviation_service.DeviationError,
264
+ detectDeviations: import_deviation_service.detectDeviations,
265
+ captureCurrentTrellis: import_trellis_service.captureCurrentTrellis,
266
+ listSnapshots: import_trellis_service.listSnapshots,
267
+ computeTrellisDiff: import_trellis_service.computeTrellisDiff,
268
+ saveNow: import_persistence.saveNow,
269
+ exportDatabase: import_database.exportDatabase,
270
+ searchSymbols: import_database.searchSymbols,
271
+ getDependencyEdges: import_database.getDependencyEdges,
272
+ getFileDependencies: import_database.getFileDependencies,
273
+ getDbStats: import_database.getDbStats,
274
+ getDb: import_database.getDb,
275
+ listCrossSystemEdges: import_cross_system_service.listCrossSystemEdges,
276
+ getCrossSystemStats: import_cross_system_service.getCrossSystemStats,
277
+ listRecentProjects: import_recent_projects_service.listRecentProjects,
278
+ removeRecentProject: import_recent_projects_service.removeRecentProject,
279
+ setRecentProjectPinned: import_recent_projects_service.setRecentProjectPinned,
280
+ setProjectAlias: import_recent_projects_service.setProjectAlias,
281
+ refreshProjectOriginUrl: import_recent_projects_service.refreshProjectOriginUrl,
282
+ getRecentProject: import_recent_projects_service.getRecentProject,
283
+ findRecentProjectByOriginUrl: import_recent_projects_service.findRecentProjectByOriginUrl,
284
+ getSettings: import_settings_service.getSettings,
285
+ updateSettings: import_settings_service.updateSettings,
286
+ tailLog: import_logger.tailLog,
287
+ getCurrentLogPath: import_logger.getCurrentLogPath,
288
+ getLogDir: import_logger.getLogDir,
289
+ getBoundBackendPort: import_server.getBoundBackendPort,
290
+ scanProject: import_server.scanProject,
291
+ getActiveProjectPath: import_server.getActiveProjectPath,
292
+ pinBaseline: import_server.pinBaseline,
293
+ BaselineError: import_server.BaselineError,
294
+ clearBaseline: import_diff_engine.clearBaseline,
295
+ buildSkillGuide: import_skill_guide.buildSkillGuide,
296
+ captureElectronScreenshot: electronScreenshotCapture
297
+ };
298
+ }
299
+ function mcpProjectScope() {
300
+ try {
301
+ return (0, import_settings_service.getSettings)().mcp?.projectScope === "anywhere" ? "anywhere" : "opened";
302
+ } catch {
303
+ return "opened";
304
+ }
305
+ }
306
+ function grantedMcpCapabilities() {
307
+ try {
308
+ const configured = (0, import_settings_service.getSettings)().mcp?.capabilities;
309
+ return Array.isArray(configured) ? configured : import_peer_capabilities.DEFAULT_GRANTS;
310
+ } catch {
311
+ return import_peer_capabilities.DEFAULT_GRANTS;
312
+ }
313
+ }
314
+ const REGISTERED_TOOLS = /* @__PURE__ */ new Set();
315
+ function listRegisteredTools() {
316
+ return [...REGISTERED_TOOLS].sort();
317
+ }
318
+ const REGISTERED_TOOL_ARGS = /* @__PURE__ */ new Map();
319
+ function listRegisteredToolArgs() {
320
+ return REGISTERED_TOOL_ARGS;
321
+ }
322
+ function setupMcpServerInstance(sessionId) {
323
+ const mcpServer = new import_mcp.McpServer(
324
+ { name: "codetrellis", version: "0.1.0" },
325
+ {
326
+ capabilities: {
327
+ tools: {},
328
+ resources: {}
329
+ },
330
+ instructions: "CodeTrellis provides codebase architecture analysis. Use these tools to understand how files connect, search for symbols, and report your plans."
331
+ }
332
+ );
333
+ const registerName = (name, schema) => {
334
+ REGISTERED_TOOLS.add(name);
335
+ REGISTERED_TOOL_ARGS.set(name, schema && typeof schema === "object" ? Object.keys(schema) : []);
336
+ };
337
+ const reached = /* @__PURE__ */ new Set();
338
+ const instrument = (name, handler) => async (args, extra) => {
339
+ const start = Date.now();
340
+ if (extra?.requestId !== void 0) reached.add(extra.requestId);
341
+ await bindingSettled(sessionId);
342
+ try {
343
+ sessionService.heartbeat(sessionId);
344
+ } catch {
345
+ }
346
+ const agentInfo = inferAgentFromSession(sessionId);
347
+ try {
348
+ (0, import_mcp_capabilities.assertMcpMayCall)(name, grantedMcpCapabilities());
349
+ args = (0, import_reference_service.resolveReferenceArgs)(args);
350
+ (0, import_mcp_capabilities.assertMcpProjectInScope)(name, args, mcpProjectScope());
351
+ } catch (err) {
352
+ if (err instanceof import_mcp_capabilities.McpAuthorizationError || err instanceof import_reference_service.AmbiguousReferenceError) {
353
+ console.warn(`[MCP]${err instanceof import_mcp_capabilities.McpAuthorizationError ? "[Authz] REFUSED" : " Ambiguous reference in"} ${name} \u2014 ${err.message}`);
354
+ broadcastToolEvent({
355
+ tool: name,
356
+ args: summarizeArgs(args),
357
+ phase: "error",
358
+ durationMs: 0,
359
+ sessionId,
360
+ agentType: agentInfo.type,
361
+ agentModel: agentInfo.model,
362
+ error: err.message
363
+ });
364
+ }
365
+ throw err;
366
+ }
367
+ try {
368
+ const result = await (0, import_agent_event_log.withEventContext)({ sessionId, agentType: agentInfo.type }, async () => {
369
+ const attempt = (0, import_signal_breakpoints.attemptOf)(name, args);
370
+ const bySignal = attempt ? (0, import_signal_breakpoints.enforceSignalsForSession)((0, import_server.getActiveProjectPath)(), sessionId, attempt) : { kind: "pass" };
371
+ if (bySignal.kind === "paused" || bySignal.kind === "stop") return (0, import_signal_breakpoints.signalHeldResult)(bySignal);
372
+ const held = (0, import_breakpoint_service.enforce)(name, args, { agent: agentInfo.type ?? "mcp-agent", sessionId });
373
+ if (held.kind === "paused") return (0, import_breakpoint_service.pausedResult)(held.hit);
374
+ if (held.kind === "stop") return (0, import_breakpoint_service.stoppedResult)(held.hit);
375
+ const out = await handler(args, extra);
376
+ const steers = [
377
+ bySignal.kind === "continue" && bySignal.steer ? (0, import_signal_breakpoints.signalSteerText)(bySignal.hit) : null,
378
+ held.kind === "continue" ? (0, import_breakpoint_service.steerText)(held.hit) : null
379
+ ].filter((x) => !!x);
380
+ if (steers.length && out && !out.isError && Array.isArray(out.content)) for (const text of steers) out.content.push({ type: "text", text });
381
+ return out;
382
+ });
383
+ if (result && !result.isError && Array.isArray(result.content)) {
384
+ const notice = (0, import_awareness_notices.noticeFor)(sessionId, name, (0, import_server.getActiveProjectPath)());
385
+ if (notice) result.content.push({ type: "text", text: notice });
386
+ const reply = (0, import_awareness_replies.replyNoticeFor)(sessionId, (0, import_server.getActiveProjectPath)());
387
+ if (reply) result.content.push({ type: "text", text: reply });
388
+ const breach = await (0, import_code_breakpoints.breachNoticeFor)(sessionId, (0, import_server.getActiveProjectPath)());
389
+ if (breach) result.content.push({ type: "text", text: breach });
390
+ const proposal = (0, import_spec_proposals_service.proposalNoticeFor)(sessionId, agentInfo.type ?? null, Date.now(), (itemUids) => (0, import_server.broadcast)("spec-proposal-told", { itemUids }));
391
+ if (proposal) result.content.push({ type: "text", text: proposal });
392
+ const planned = (0, import_planned_overlap_actions.plannedOverlapNoticeFor)(sessionId);
393
+ if (planned) result.content.push({ type: "text", text: planned });
394
+ }
395
+ const summary = result?._meta?.summary;
396
+ broadcastToolEvent({
397
+ tool: name,
398
+ args: summarizeArgs(args),
399
+ phase: "complete",
400
+ durationMs: Date.now() - start,
401
+ sessionId,
402
+ agentType: agentInfo.type,
403
+ agentModel: agentInfo.model,
404
+ ...typeof summary === "string" && !result?.isError ? { summary: summary.slice(0, 200) } : {}
405
+ });
406
+ return result;
407
+ } catch (err) {
408
+ broadcastToolEvent({
409
+ tool: name,
410
+ args: summarizeArgs(args),
411
+ phase: "error",
412
+ durationMs: Date.now() - start,
413
+ sessionId,
414
+ agentType: agentInfo.type,
415
+ agentModel: agentInfo.model,
416
+ error: err instanceof Error ? err.message : String(err)
417
+ });
418
+ throw err;
419
+ }
420
+ };
421
+ const originalSetRequestHandler = mcpServer.server.setRequestHandler.bind(mcpServer.server);
422
+ mcpServer.server.setRequestHandler = (schema, handler) => {
423
+ const method = schema?.shape?.method?.value ?? schema?.shape?.method?._def?.value;
424
+ if (method !== "tools/call") return originalSetRequestHandler(schema, handler);
425
+ return originalSetRequestHandler(schema, async (request, extra) => {
426
+ const start = Date.now();
427
+ const id = extra?.requestId;
428
+ try {
429
+ const result = await handler(request, extra);
430
+ if (result?.isError && !reached.has(id)) {
431
+ const agentInfo = inferAgentFromSession(sessionId);
432
+ const text = Array.isArray(result.content) ? result.content.map((c) => typeof c?.text === "string" ? c.text : "").join(" ") : "";
433
+ broadcastToolEvent({
434
+ tool: String(request?.params?.name ?? "unknown"),
435
+ args: summarizeArgs(request?.params?.arguments ?? {}),
436
+ phase: "error",
437
+ durationMs: Date.now() - start,
438
+ sessionId,
439
+ agentType: agentInfo.type,
440
+ agentModel: agentInfo.model,
441
+ error: text.slice(0, 1e3) || "Refused by the MCP server before the tool ran."
442
+ });
443
+ }
444
+ return result;
445
+ } finally {
446
+ reached.delete(id);
447
+ }
448
+ });
449
+ };
450
+ const originalRegisterTool = mcpServer.registerTool.bind(mcpServer);
451
+ mcpServer.registerTool = (name, config, handler) => {
452
+ registerName(name, config?.inputSchema);
453
+ return originalRegisterTool(name, config, instrument(name, handler));
454
+ };
455
+ const originalTool = mcpServer.tool.bind(mcpServer);
456
+ mcpServer.tool = (...args) => {
457
+ const name = args[0];
458
+ const last = args.length - 1;
459
+ registerName(name, args.slice(1, last).find((a) => a && typeof a === "object" && !Array.isArray(a)));
460
+ const next = [...args];
461
+ next[last] = instrument(name, args[last]);
462
+ return originalTool(...next);
463
+ };
464
+ const deps = buildToolDeps(sessionId);
465
+ (0, import_architecture_tools.register)(mcpServer, deps);
466
+ (0, import_terminal_tools.register)(mcpServer, deps);
467
+ (0, import_graph_tools.register)(mcpServer, deps);
468
+ (0, import_drift_tools.register)(mcpServer, deps);
469
+ (0, import_ui_tools.register)(mcpServer, deps);
470
+ (0, import_session_tools.register)(mcpServer, deps);
471
+ (0, import_plan_tools.register)(mcpServer, deps);
472
+ (0, import_plan_item_tools.register)(mcpServer, deps);
473
+ (0, import_presence_tools.register)(mcpServer, deps);
474
+ (0, import_mobile_tools.register)(mcpServer, deps);
475
+ (0, import_project_config_tools.register)(mcpServer, deps);
476
+ (0, import_git_tools.register)(mcpServer, deps);
477
+ (0, import_channel_tools.register)(mcpServer, deps);
478
+ (0, import_system_docs_tools.register)(mcpServer, deps);
479
+ (0, import_governance_tools.register)(mcpServer, deps);
480
+ (0, import_test_tools.register)(mcpServer, deps);
481
+ (0, import_budget_tools.register)(mcpServer, deps);
482
+ (0, import_intake_tools.register)(mcpServer, deps);
483
+ (0, import_review_tools.register)(mcpServer, deps);
484
+ (0, import_contribution_tools.registerContributionTools)(mcpServer);
485
+ (0, import_audio_tools.registerAudioTools)(mcpServer);
486
+ (0, import_peer_tools.registerPeerTools)(mcpServer, deps);
487
+ (0, import_awareness_tools.register)(mcpServer, deps);
488
+ (0, import_resources.register)(mcpServer, deps);
489
+ return mcpServer;
490
+ }
491
+ function enumerateRegisteredTools() {
492
+ setupMcpServerInstance("tool-coverage-probe");
493
+ return listRegisteredTools();
494
+ }
495
+ async function startMcpServer() {
496
+ if (httpServer) return;
497
+ const app = import_node_http.default.createServer(async (req, res) => {
498
+ const hostHeader = (req.headers.host || "").toString().replace(/:\d+$/, "").toLowerCase();
499
+ if (hostHeader && !["127.0.0.1", "localhost", "[::1]", "::1"].includes(hostHeader)) {
500
+ res.writeHead(403, { "Content-Type": "application/json" });
501
+ res.end(JSON.stringify({ error: "Host not allowed" }));
502
+ return;
503
+ }
504
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
505
+ res.setHeader("Access-Control-Allow-Headers", `Content-Type, Authorization, ${import_capability_token.TOKEN_HEADER}`);
506
+ res.setHeader("Vary", "Origin");
507
+ if (req.method === "OPTIONS") {
508
+ res.writeHead(403);
509
+ res.end();
510
+ return;
511
+ }
512
+ const presented = (0, import_capability_token.extractToken)(
513
+ req.headers,
514
+ req.url
515
+ );
516
+ if (!(0, import_capability_token.verifyCapabilityToken)(presented)) {
517
+ res.writeHead(401, { "Content-Type": "application/json" });
518
+ res.end(
519
+ JSON.stringify({
520
+ error: "Missing or invalid capability token",
521
+ hint: `Send the token from ${(0, import_capability_token.getTokenFilePath)()} as the ${import_capability_token.TOKEN_HEADER} header, an Authorization: Bearer value, or the ct_token query parameter.`
522
+ })
523
+ );
524
+ return;
525
+ }
526
+ const pathname = (() => {
527
+ try {
528
+ return new URL(req.url ?? "/", "http://127.0.0.1").pathname;
529
+ } catch {
530
+ return req.url ?? "/";
531
+ }
532
+ })();
533
+ if (pathname === "/sse" && req.method === "GET") {
534
+ if (connectedTransports.size >= MAX_MCP_CONNECTIONS) {
535
+ console.warn(`[MCP] Connection limit reached (${MAX_MCP_CONNECTIONS}), rejecting new SSE client`);
536
+ res.writeHead(503, { "Content-Type": "application/json" });
537
+ res.end(JSON.stringify({ error: "Too many MCP connections" }));
538
+ return;
539
+ }
540
+ const messagesEndpoint = `/messages?ct_token=${encodeURIComponent((0, import_capability_token.getCapabilityToken)())}`;
541
+ const transport = new import_sse.SSEServerTransport(messagesEndpoint, res);
542
+ const sessionId = transport.sessionId;
543
+ connectedTransports.set(sessionId, transport);
544
+ const mcpServer = setupMcpServerInstance(sessionId);
545
+ connectedServers.set(sessionId, mcpServer);
546
+ const inferredAgentType = req.headers["user-agent"]?.toString().split(" ")[0]?.toLowerCase().includes("claude") ? "claude-code" : "mcp-client";
547
+ sessionService.registerSession(sessionId, inferredAgentType);
548
+ const hint = (0, import_binding_headers.readBindingHeaders)(req.headers);
549
+ let bound = false;
550
+ try {
551
+ const root = (0, import_workstream_binding.matchWorkstreamRoot)(hint.cwd, (0, import_workstream_binding.candidateWorkstreamRoots)());
552
+ const terminal = hint.hostTerminal && terminalService.getTerminal(hint.hostTerminal) ? hint.hostTerminal : null;
553
+ if (root || terminal) sessionService.bindSession(sessionId, root, terminal);
554
+ bound = root !== null;
555
+ if (root) setImmediate(() => {
556
+ (0, import_workstream_service.discoverAround)(root).catch(() => {
557
+ });
558
+ });
559
+ if (!bound && hint.cwd && (0, import_server.getActiveProjectPath)()) {
560
+ (0, import_folder_requests.recordFolderRequest)({ folder: hint.cwd, sessionId, agentType: inferredAgentType });
561
+ }
562
+ } catch {
563
+ }
564
+ mcpServer.server.oninitialized = () => {
565
+ if (!bound && mcpServer.server.getClientCapabilities()?.roots) {
566
+ const lookup = mcpServer.server.listRoots().then(({ roots }) => {
567
+ const folders = roots.flatMap((r) => {
568
+ try {
569
+ return r.uri.startsWith("file:") ? [(0, import_node_url.fileURLToPath)(r.uri)] : [];
570
+ } catch {
571
+ return [];
572
+ }
573
+ });
574
+ const root = (0, import_workstream_binding.firstWorkstreamRoot)(folders);
575
+ if (!root) return;
576
+ sessionService.bindSession(sessionId, root);
577
+ (0, import_server.broadcast)("mcp-session-changed", { reason: "bound", sessionId });
578
+ setImmediate(() => {
579
+ (0, import_workstream_service.discoverAround)(root).catch(() => {
580
+ });
581
+ });
582
+ }).catch(() => {
583
+ }).finally(() => {
584
+ if (pendingBindings.get(sessionId) === lookup) pendingBindings.delete(sessionId);
585
+ });
586
+ pendingBindings.set(sessionId, lookup);
587
+ }
588
+ const claimed = (0, import_client_identity.agentTypeFromClientInfo)(mcpServer.server.getClientVersion()?.name);
589
+ if (!claimed || claimed === inferredAgentType) return;
590
+ try {
591
+ if (sessionService.retypeSession(sessionId, inferredAgentType, claimed)) {
592
+ console.log(`[MCP] Client ${sessionId} identified as ${claimed}`);
593
+ (0, import_server.broadcast)("mcp-session-changed", { reason: "identified", sessionId });
594
+ }
595
+ } catch {
596
+ }
597
+ };
598
+ const keepAlive = setInterval(() => {
599
+ try {
600
+ sessionService.heartbeat(sessionId);
601
+ } catch {
602
+ }
603
+ }, 3e4);
604
+ if (typeof keepAlive.unref === "function") keepAlive.unref();
605
+ res.on("close", () => {
606
+ clearInterval(keepAlive);
607
+ connectedTransports.delete(sessionId);
608
+ const sessionServer = connectedServers.get(sessionId);
609
+ if (sessionServer) {
610
+ sessionServer.close().catch(() => {
611
+ });
612
+ connectedServers.delete(sessionId);
613
+ }
614
+ sessionService.disconnectSession(sessionId);
615
+ console.log(`[MCP] Client disconnected: ${sessionId}`);
616
+ (0, import_server.broadcast)("agent-event", {
617
+ id: (0, import_agent_event_log.eventId)("mcp-disconnect"),
618
+ timestamp: Date.now(),
619
+ source: "mcp",
620
+ type: "session_end",
621
+ payload: { sessionId }
622
+ });
623
+ (0, import_server.broadcast)("mcp-session-changed", { reason: "disconnect" });
624
+ });
625
+ console.log(`[MCP] Client connected: ${sessionId} (${inferredAgentType})`);
626
+ (0, import_server.broadcast)("agent-event", {
627
+ id: (0, import_agent_event_log.eventId)("mcp-connect"),
628
+ timestamp: Date.now(),
629
+ source: "mcp",
630
+ type: "session_start",
631
+ payload: { sessionId, source: "mcp", agentType: inferredAgentType }
632
+ });
633
+ (0, import_server.broadcast)("mcp-session-changed", { reason: "connect" });
634
+ await mcpServer.connect(transport);
635
+ return;
636
+ }
637
+ if (pathname.startsWith("/messages") && req.method === "POST") {
638
+ const sessionId = new URL(req.url ?? "/", `http://localhost:${boundPort}`).searchParams.get("sessionId");
639
+ if (!sessionId || !connectedTransports.has(sessionId)) {
640
+ res.writeHead(404);
641
+ res.end("Session not found");
642
+ return;
643
+ }
644
+ const transport = connectedTransports.get(sessionId);
645
+ await transport.handlePostMessage(req, res);
646
+ return;
647
+ }
648
+ if (pathname === "/" || pathname === "/health") {
649
+ res.writeHead(200, { "Content-Type": "application/json" });
650
+ res.end(JSON.stringify({
651
+ name: "codetrellis-mcp",
652
+ version: "0.1.0",
653
+ connectedClients: connectedTransports.size
654
+ }));
655
+ return;
656
+ }
657
+ res.writeHead(404);
658
+ res.end("Not found");
659
+ });
660
+ httpServer = app;
661
+ const settings = (0, import_settings_service.getSettings)();
662
+ const envPort = process.env.CODETRELLIS_MCP_PORT;
663
+ const requestedPort = envPort ? Number(envPort) : settings.mcp.port ?? DEFAULT_MCP_PORT;
664
+ const autodetect = settings.mcp.autodetectOnCollision !== false && !envPort;
665
+ return new Promise((resolve, reject) => {
666
+ const tryPort = (candidate, attemptsLeft) => {
667
+ const onListening = () => {
668
+ app.removeListener("error", onError);
669
+ boundPort = candidate;
670
+ console.log(`[MCP] Server running on http://127.0.0.1:${boundPort}${candidate !== requestedPort ? ` (requested ${requestedPort}, autodetected)` : ""}`);
671
+ try {
672
+ (0, import_capability_token.getCapabilityToken)();
673
+ (0, import_files.writeEndpointFile)((0, import_persistence.getDataDir)(), {
674
+ url: `http://127.0.0.1:${boundPort}/sse`,
675
+ pid: process.pid,
676
+ startedAt: Date.now()
677
+ });
678
+ } catch (err) {
679
+ console.warn("[MCP] Could not write the endpoint file:", err);
680
+ }
681
+ try {
682
+ const { broadcast: bc } = _lazy____server;
683
+ bc("mcp-port-changed", { port: boundPort, requested: requestedPort });
684
+ } catch {
685
+ }
686
+ resolve();
687
+ };
688
+ const onError = (err) => {
689
+ app.removeListener("listening", onListening);
690
+ if (err.code === "EADDRINUSE" && autodetect && attemptsLeft > 0) {
691
+ console.warn(`[MCP] Port ${candidate} in use; trying ${candidate + 1}\u2026`);
692
+ tryPort(candidate + 1, attemptsLeft - 1);
693
+ } else {
694
+ reject(err);
695
+ }
696
+ };
697
+ app.once("listening", onListening);
698
+ app.once("error", onError);
699
+ app.listen(candidate, "127.0.0.1");
700
+ };
701
+ tryPort(requestedPort, autodetect ? MAX_PORT_ATTEMPTS : 0);
702
+ });
703
+ }
704
+ function getMcpStatus() {
705
+ return {
706
+ running: httpServer !== null,
707
+ port: boundPort,
708
+ connectedAgents: connectedTransports.size
709
+ };
710
+ }
711
+ function getMcpConfig() {
712
+ return {
713
+ codetrellis: {
714
+ type: "sse",
715
+ url: `http://127.0.0.1:${boundPort}/sse`,
716
+ headers: { [import_capability_token.TOKEN_HEADER]: (0, import_capability_token.getCapabilityToken)() }
717
+ }
718
+ };
719
+ }
720
+ function currentConnector() {
721
+ const cmd = (0, import_command.resolveConnectorCommand)({
722
+ execPath: process.execPath,
723
+ electronVersion: process.versions.electron,
724
+ resourcesPath: process.resourcesPath,
725
+ cwd: process.cwd(),
726
+ dataDir: (0, import_persistence.getDataDir)(),
727
+ exists: (p) => import_node_fs.default.existsSync(p),
728
+ env: {
729
+ APPIMAGE: process.env.APPIMAGE,
730
+ APPDIR: process.env.APPDIR,
731
+ PORTABLE_EXECUTABLE_FILE: process.env.PORTABLE_EXECUTABLE_FILE
732
+ }
733
+ });
734
+ if (!cmd) return null;
735
+ return {
736
+ ...cmd,
737
+ config: (0, import_command.connectorConfig)(cmd),
738
+ claudeCodeCommand: (0, import_command.claudeCodeConnectorCommand)(cmd)
739
+ };
740
+ }
741
+ function getMcpSetup() {
742
+ const url = `http://127.0.0.1:${boundPort}/sse`;
743
+ const tokenFile = (0, import_capability_token.getTokenFilePath)();
744
+ const token = (0, import_capability_token.getCapabilityToken)();
745
+ const connector = currentConnector();
746
+ const direct = [
747
+ `- Transport: SSE. URL: ${url}`,
748
+ `- It requires a credential. Every request must carry the header \`${import_capability_token.TOKEN_HEADER}: <token>\` (\`Authorization: Bearer <token>\` also works). If your MCP client cannot send headers, append \`?${import_capability_token.TOKEN_QUERY_PARAM}=<token>\` to the URL instead.`,
749
+ `- Read the token from the file ${tokenFile} (readable only by this user). Do not ask me to paste it.`,
750
+ '- The token changes every time CodeTrellis starts. If a request is refused with HTTP 401 "Missing or invalid capability token", re-read the file and update the config. Do not retry with the old value.',
751
+ "- Name the server `codetrellis`. In Claude Code: `claude mcp add --transport sse codetrellis " + url + ' --header "' + import_capability_token.TOKEN_HEADER + ': <token>"`.'
752
+ ];
753
+ const agentPrompt = connector ? [
754
+ "Connect yourself to the CodeTrellis MCP server running on this machine.",
755
+ "",
756
+ "Use the CodeTrellis connector, a local stdio MCP server. It reads its credential itself on every connect, so the config needs no token and keeps working when CodeTrellis restarts.",
757
+ ...connector.caveat ? ["", connector.caveat] : [],
758
+ "",
759
+ `- Name: \`codetrellis\`. Transport: stdio. Command: \`${connector.command}\``,
760
+ `- Arguments: ${connector.args.map((a) => `\`${a}\``).join(" ")}`,
761
+ ...Object.keys(connector.env).length > 0 ? [`- Environment: ${Object.entries(connector.env).map(([k, v]) => `\`${k}=${v}\``).join(" ")}`] : [],
762
+ `- In Claude Code, run: \`${connector.claudeCodeCommand}\``,
763
+ "- Replace any existing `codetrellis` entry that points at a URL: that kind stops working whenever CodeTrellis restarts.",
764
+ "",
765
+ "Only if your client cannot launch a stdio server, connect directly instead:",
766
+ ...direct,
767
+ "",
768
+ "- Once connected, call `register_session`, then `get_app_guide`."
769
+ ].join("\n") : [
770
+ "Connect yourself to the CodeTrellis MCP server running on this machine.",
771
+ "",
772
+ ...direct,
773
+ "- Once connected, call `register_session`, then `get_app_guide`."
774
+ ].join("\n");
775
+ return {
776
+ connector,
777
+ config: getMcpConfig(),
778
+ url,
779
+ header: import_capability_token.TOKEN_HEADER,
780
+ queryParam: import_capability_token.TOKEN_QUERY_PARAM,
781
+ tokenFile,
782
+ claudeCodeCommand: `claude mcp add --transport sse codetrellis ${url} --header "${import_capability_token.TOKEN_HEADER}: ${token}"`,
783
+ agentPrompt
784
+ };
785
+ }
786
+ async function stopMcpServer() {
787
+ if (httpServer) {
788
+ httpServer.close();
789
+ httpServer = null;
790
+ try {
791
+ (0, import_files.removeEndpointFile)((0, import_persistence.getDataDir)(), process.pid);
792
+ } catch {
793
+ }
794
+ }
795
+ await Promise.allSettled(
796
+ Array.from(connectedServers.values()).map((s) => s.close())
797
+ );
798
+ connectedServers.clear();
799
+ connectedTransports.clear();
800
+ }
801
+ // Annotate the CommonJS export names for ESM import in node:
802
+ 0 && (module.exports = {
803
+ bindingSettled,
804
+ enumerateRegisteredTools,
805
+ getMcpConfig,
806
+ getMcpSetup,
807
+ getMcpStatus,
808
+ listRegisteredToolArgs,
809
+ listRegisteredTools,
810
+ setElectronScreenshotCapture,
811
+ startMcpServer,
812
+ stopMcpServer
813
+ });